为什么i2cdetect总是在嵌入式Linux上的RTC上提供UU

时间:2013-07-23 21:04:56

标签: linux linux-device-driver embedded-linux i2c

我想用C代码而不是"hwclock" shell命令来传输来自RTC的读取。

但是,当我使用i2cdetect时,它显示0x68(这是我的RTC从属地址)的状态为"UU",这意味着“已跳过探测,因为此地址为目前由司机使用“。在我尝试i2cget之后,它的givng“可以将地址设置为0x68:设备或资源繁忙”。

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

由于

2 个答案:

答案 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,  在内核源代码中禁用该驱动程序并重新编译源代码。