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