当前位置: 首页 > article >正文

linux内核驱动:pca953xIO扩展芯片驱动总结

目录

    • 前言
    • 一、PCA9536芯片介绍
    • 二、驱动说明
    • 三、配置流程
    • 四、应用操作方式

前言

本笔记总结使用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;


http://www.kler.cn/a/285826.html

相关文章:

  • Java-数据结构-包装类和认识泛型 !!!∑(゚Д゚ノ)ノ
  • 基于UniApp+Springboot花店微信小程序
  • 基于STM32开发的智能宠物喂食系统
  • QT实现MP4播放器
  • Java Socket tcp udp 使用
  • vue2的el-select虚拟下拉
  • 【Android自定义控件】Kotlin实现滚动效果的数字加减控件
  • 【困难】 猿人学web第一届 第14题 备而后动-勿使有变
  • 前端Vue使用AES的GCM模式加密
  • RK3568 Android 11 蓝牙BluetoothA2dpSink 获取用于生成频谱的PCM
  • ASP.NET Core 入门教学五 集成日志
  • 数据库系统 第30节 数据库监控
  • Golang学习总结
  • 网络安全自学入门:(超详细)从入门到精通学习路线规划,学完即可就业
  • 数学建模--K-Means聚类分析
  • 《数字信号处理》学习01-离散时间信号与序列的卷积和运算
  • RPC框架开发——前言
  • os模块中的函数及其参数介绍和示例
  • 第二代骁龙8平台手机nubia Z5拆解
  • Git常用操作命令