Linux下如何配置GPIO模拟I2C使用?

Comake Online


作者| 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下载|芯片、开发板购买



X 提交 下一题

查看更多