作者| veahow
Comake社区技术问题汇总,第20231020期,本期将介绍Linux下如何配置GPIO模拟I2C使用,SSD22X/SSD21X/SSC9211 Linux适用。
1 场景描述
以SSC9211芯片为例,作为QFN68脚的芯片,客户在使用时为了硬件布线方便,且外设功能简单(只需读取数据),便考虑用GPIO来模拟I2C使用。
2 实现方法
Linux内核已经有实现GPIO模拟I2C的驱动,位于kernel/drivers/i2c/busses/i2c-gpio.c,因此只需配置内核和DTS即可支持GPIO模拟I2C通讯功能。
2.1 基础环境
以Ikayaki-ULS00V010版本的SPINAND配置为例,将提供的SDK放在同一路径下进行解压,目录结构如下:
~
boot/
kernel/
project/
sdk/
本例中以usbcam_p3_spinand.glibc-9.1.0-squashfs.s01a.64.qfn128.uvc_demo_defconfig配置为参考。首先,需要确定是使用哪一个Kernel Config,可进入project目录,使用如下的配置:
可以确定该配置使用kernel下的pioneer3_ssc020a_s01a_qfn128_spinand_demo_usbcam_uvc_defconfig配置。这时确定kernel配置使用的DTS:
可以知道DTS名称为:pioneer3-ssc020a-s01a-spinand-qfn128-dualSensor-usbcamera.dts,在kernel下通过命令:
可以确定关联的DTS文件为:
则该Kernel Config的DTS文件如下:
2.2 确认硬件定义
本例以ALS芯片,即一颗感光芯片为例,硬件定义如下:
为了将GPIO模拟I2C和普通I2C(I2C-0、I2C-1)区分开,这里定义ALS挂载在I2C-2总线上。
在板端可通过如下命令操作GPIO24控制ALS:
2.3 修改内核配置
进入到kernel中,先生效一版基础的内核配置。
进入配置菜单:
GPIO支持
不选择此项,后面将不会出现选项GPIO-based bitbanging I2C
GPIO模拟I2C支持
保存好配置后,将生成的.config文件覆盖掉原先对应的内核配置:
这样后面在project编译时就能够生效了。
2.4 修改DTS
2.4.1 修改pioneer3.dtsi
打开kernel/arch/arm/boot/dts/pioneer3.dtsi文件添加相关属性,本例中根据2.2的硬件定义,修改如下:
属性说明如下:
注意事项:
gpio节点需要指定#gpio-cells = <2>;
aliases节点取决于是否使能硬件支持的I2C驱动,IKAYAKI系列芯片支持2组I2C,那么label可以取名为i2c2,这样将在dev目录下生成i2c-2
gpio index详情参考HW Checklist,或在kernel/drivers/sstar/include/pioneer3/gpio.h中查找,flag表示引脚的初始状态,一般写0,写1会极性反转导致通讯失败。
2.4.2 修改padmux.dtsi
本例中修改kernel/arch/arm/boot/dts/pioneer3-ssc020a-s01a-qfn128-demo-usbcam-dualSensor-padmux.dtsi文件如下:
2.5 编译测试
进入project中编译生成镜像:
烧录进板端,使用i2c_read_write测试命令:
使用上是正常的,没有I2C的报错。在应用上,可以使用open接口打开/dev/i2c-2进行操作。
》》原帖地址
End.
往期回顾
iperf3工具支持及常用测试指令说明
UVC使用指南(上)
如何单独编译kernel以及替换升级kernel image?
如何针对CPU和内存进行压测,确认数据一致性
SSD21X/22X如何支持USB转Ethernet?
扫码进入论坛
原厂答疑|产品选型|官方资源
扫码咨询客服
SDK下载|芯片、开发板购买