9

我想用 C 代码而不是"hwclock"shell 命令从我的 RTC 读取数据。

但是,当我使用 时i2cdetect,它显示0x68(这是我的 RTC 从地址)处于状态"UU",这意味着“已跳过探测,因为驱动程序当前正在使用此地址”。在我尝试之后i2cget,它给出的“可以机器人将地址设置为0x68:设备或资源繁忙”。

所以我在想我的 Linux 内核中是否有一些问题会一直强制从我的 RTC 读取,或者其他原因。

谢谢

4

2 回答 2

10

我假设您使用的是 DS-1307 RTC,或其变体之一(因为 0x68 从地址)。检查其驱动程序是否通过以下方式加载:

$ lsmod | grep rtc

如果您在上述命令的输出中看到 rtc_ds1307 条目(如 -> rtc_ds1307 17394 0),则该驱动程序可能保留了该地址。

如果驱动程序已加载到系统中,则使用卸载它

$ rmmod rtc-ds1307

编辑:

(根据OP的反馈,)请执行以下操作

1) cat /sys/bus/i2c/devices/3-0068/modalias。这将为您提供使该设备保持忙碌的内核驱动程序的名称。在冒号(:) OP 的命令输出后复制驱动程序名称告诉我们它的ds1337

2) 检查 ds1337 是否是驱动程序的别名,使用

grep ds1337 /lib/modules/`uname -r`/modules.alias

希望你会得到以下输出

alias i2c:ds1337 rtc_ds1307

这证实了我们的假设,即 rtc_ds1307 实际上是持有 I2C 地址 0x68 的驱动程序。

3) 用于rmmod rtc_ds1307卸载驱动程序。注意:这仅在驱动程序是可加载内核模块时才有效,否则您将看到以下错误:

ERROR: Module rtc_ds1307 does not exist in /proc/modules

在这种情况下,您将不得不在禁用/模块化驱动程序的情况下再次重新编译内核。

于 2013-07-24T14:17:56.363 回答
0

0x68 正在被某些驱动程序使用,在内核源代码中禁用该驱动程序并重新编译源代码。

于 2016-10-17T12:15:06.917 回答