我想用 C 代码而不是"hwclock"
shell 命令从我的 RTC 读取数据。
但是,当我使用 时i2cdetect
,它显示0x68
(这是我的 RTC 从地址)处于状态"UU"
,这意味着“已跳过探测,因为驱动程序当前正在使用此地址”。在我尝试之后i2cget
,它给出的“可以机器人将地址设置为0x68
:设备或资源繁忙”。
所以我在想我的 Linux 内核中是否有一些问题会一直强制从我的 RTC 读取,或者其他原因。
谢谢
我想用 C 代码而不是"hwclock"
shell 命令从我的 RTC 读取数据。
但是,当我使用 时i2cdetect
,它显示0x68
(这是我的 RTC 从地址)处于状态"UU"
,这意味着“已跳过探测,因为驱动程序当前正在使用此地址”。在我尝试之后i2cget
,它给出的“可以机器人将地址设置为0x68
:设备或资源繁忙”。
所以我在想我的 Linux 内核中是否有一些问题会一直强制从我的 RTC 读取,或者其他原因。
谢谢
我假设您使用的是 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
在这种情况下,您将不得不在禁用/模块化驱动程序的情况下再次重新编译内核。
0x68 正在被某些驱动程序使用,在内核源代码中禁用该驱动程序并重新编译源代码。