前言
本笔记总结使用ti 的PCA953x进行SOC的GPIO扩展时步骤,基于linux内核版本5.10.xxx;
一、PCA9536芯片介绍
【1】PCA9536是基于i2c接口的GPIO扩展芯片,最大支持到400Khz速率;
【2】PCA9536可以用于对SOC或者MCU本身IO口数量不够情况下的扩展,可以扩展4个GPIO,由于本身的i2c会占用SOC或者MCU两个pin,只用一个PCA9536的话实际会增加两个实现gpio功能的pin;
【3】PCA9536的地址为固定地址0x41,则同一路i2c上只能接一个PCA9536,如手册:
【4】封装引脚
【5】操作时的i2c协议和寄存器说明,见官网手册
二、驱动说明
内核驱动文件
内核源码/drivers/gpio/gpio-pca953x.c
实现原理
内核驱动中会将此设备注册成一个gpio控制器和 soc的gpio外设是一个道理;
pca953x_probe 调用 devm_gpiochip_add_data进行gpio外设控制器的注册;
设备树文件
内核源码/arch/arm64/boot/dts/芯片平台/xxxxx.dts
三、配置流程
硬件连接示意图
设备树配置
i2c: i2c@XXXX{
#address-cells = <1>;
#size-cells = <0>;
//其它配置
status = “okay”;
pca9536@41 {
compatible = “ti,pca9536”;
#address-cells = <1>;
#size-cells = <0>;
reg = <0x41>;
};
}
编译控制配置
查看 内核源码/drivers/gpio/Makefile文件中的CONFIG_GPIO_PCA953X在内核配置中是否设置为y或者m
编译验证
【1】当编译选项CONFIG_GPIO_PCA953X为y时,编译查看是否生成对应的输出文件gpio-pca953x.o,更新设备内核镜像、设备树dtb进行测试;
结果查看,查看 目录 /sys/class/gpio下是否多出了一组gpiochipXXX且gpiochipXXX/ngpio文件中为4表示此组包括4个gpio,对应的即为pca9536生成的gpio控制器属性文件
【2】当编译选项CONFIG_GPIO_PCA953X为m时,编译查看否生成对应的gpio-pca953x.ko文件,更新设备内核镜像、设备树dtb、加载ko文件进行测试;
结果查看,查看 目录 /sys/class/gpio下一开始为SOC内部的gpio外设控制器生成的属性文件,insmod gpio-pca953x.ko 加载模块后,会生成新的一个gpio控制器的属性文件目录gpiochipXXX,查看gpiochipXXX/ngpio 为 4,对应的即为pca9536生成的gpio控制器属性文件;
四、应用操作方式
对某个io设置为输出、高/低
查看 /sys/class/gpio/gpiochipXXX/base ,则可以操作的引脚号为 base+0、base+1、base+2、base+3,假如base为 num;
echo num > /sys/class/gpio/export:生成/sys/class/gpio/gpionum目录;
echo in > /sys/class/gpio/gpionum/direction: 设置为输出方向;
echo 1 > /sys/class/gpio/gpionum/value: 设置P0脚输出为高,用万用表测量验证;
echo 0 > /sys/class/gpio/gpionum/value: 设置P0脚输出为低,用万用表测量验证;
对某个io设置为输入
查看 /sys/class/gpio/gpiochipXXX/base ,则可以操作的引脚号为 base+0、base+1、base+2、base+3,假如base为 num;
echo num > /sys/class/gpio/export:生成/sys/class/gpio/gpionum目录;
echo out > /sys/class/gpio/gpionum/direction: 设置为输入方向;
cat /sys/class/gpio/gpionum/value: 给P0脚外部拉高,查看值是否为1;