版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33487044/article/details/86372575
平台 | 内核版本 | 安卓版本 |
---|---|---|
RK3399 | Linux4.4 | Android7.1 |
1、需求:
若不知道设备I2C
的地址怎么办?
若想知道I2C
总线上有哪些I2C
设备?
若想快速知道I2C
总线上设备是否传输正常?
2、方法:
使用rk
在驱动层做了一个通用i2c
测试代码,但默认是没有没有开启的。
3、修改代码:
3.1、配置文件修改
文件目录:arch/arm64/configs/nanopi4_nougat_defconfig
CONFIG_I2C_ROCKCHIP=y
3.2、Kconfig 文件修改
文件目录:kernel/drivers/i2c/busses/Kconfig
3.3、Makefile修改
文件目录:kernel/drivers/i2c/busses/Makefile
obj-$(CONFIG_I2C_ROCKCHIP) += i2c-rockchip.o
然后编译会时出错,还需修改源码:
3.4、修改源文件
打开:kernel/drivers/i2c/busses/i2c-rockchip.c
注释头文件
后接着编译:
再注释文件rockchip_i2c_probe
函数中的
扫描二维码关注公众号,回复:
5000614 查看本文章
还有:
rockchip_i2c_xfer
函数中:
4、开始探测I2C设备:
首先看下我们的新产生的节点:
我的RK3399
板子I2C2
下面接了一个热成像传感器,其地址是0X33
开始使用RK
的探测工具探测I2C2
:
echo 2 > /dev/i2c_detect
输出如下:
5、驱动程序分析
首先看一下:
重点看一下i2c_detect_write函数:
可以看出是从设备地址0x01
到0x80
地址区间的探测
第一步:设置地址detect_set_client(&client, addr, nr);
第二步:尝试读取一个字节ret = detect_read(&client, val, 1);
若设备地址不正确那么返回-6
若设备地址正确返回1
第三步:若返回1
后把地址存起来
ret = detect_read(&client, val, 1);
if (ret > 0)
sprintf(buf, "%s 0x%02x", buf, addr);