hen*_*yao 7 linux i2c linux-device-driver embedded-linux
我想用C代码而不是"hwclock"shell命令从RTC传递读取信息.
但是,当我使用时i2cdetect,它显示0x68(这是我的RTC从站地址)具有状态"UU",这意味着"跳过了探测,因为该地址当前正由驱动程序使用".在我尝试之后i2cget,它的givng"可能会将地址设置为0x68:设备或资源忙".
所以我在想我的Linux内核是否存在一些问题,它会一直强制从我的RTC读取,或者其他一些原因.
谢谢
我假设您使用的是DS-1307 RTC或其变体之一(因为0x68从地址).检查其驱动程序是否已加载:
$ lsmod | grep rtc
Run Code Online (Sandbox Code Playgroud)
如果你rtc_ds1307 17394 0在上面命令的输出中看到了rtc_ds1307的条目(比如this - > ),那么这个驱动程序可能会保留该地址.
如果驱动程序已加载到系统中,则使用它卸载它
$ rmmod rtc-ds1307
Run Code Online (Sandbox Code Playgroud)
编辑:
(根据OP的反馈,)请执行以下操作
1)cat /sys/bus/i2c/devices/3-0068/modalias.这将为您提供保持此设备忙碌的内核驱动程序的名称.冒号后复制驱动程序名称::) OP的命令输出告诉我们它的ds1337
2)使用,检查ds1337是否是驱动程序的别名
grep ds1337 /lib/modules/`uname -r`/modules.alias
Run Code Online (Sandbox Code Playgroud)
希望你会得到以下输出
alias i2c:ds1337 rtc_ds1307
Run Code Online (Sandbox Code Playgroud)
这证实了我们的假设,即rtc_ds1307实际上是保持I2C地址0x68的驱动程序.
3)rmmod rtc_ds1307用来卸载驱动程序.注意:这仅在驱动程序是可加载内核模块时才有效,否则您将看到以下错误:
ERROR: Module rtc_ds1307 does not exist in /proc/modules
Run Code Online (Sandbox Code Playgroud)
在这种情况下,您必须使用禁用/模块化的驱动程序再次重新编译内核.