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

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;

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Swift concurrency 3 — 三种异步方式(@escaping closure, Combine, async/await)
  • CAPL——定时器用法
  • Vue3:命名路由
  • 9-3 深度循环神经网络
  • 【微信小程序】全局数据共享 - MobX
  • 如何用Python调用智谱清言api进行智能问答
  • 【Java 设计模式】Business Delegate 模式:简化业务服务交互
  • 磷酸二氢钾溶液净化除杂,除重金属
  • 前端面试手撕题收集(自用)
  • 极狐GitLab 如何管理 Kubernetes 集群?
  • 监控电脑屏幕的软件叫什么?8款好用的监控电脑屏幕的软件推荐!
  • 程序员阿龙定制开发【精选】计算机毕业设计之:基于JAVA问卷调查系统
  • 数据结构(Java实现):链表与LinkedList
  • 无法验证 Anaconda 仓库证书
  • 【系统架构设计】软件架构设计(2)
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • codis proxy处理流程
  • Django 博客开发教程 16 - 统计文章阅读量
  • E-HPC支持多队列管理和自动伸缩
  • JavaScript设计模式之工厂模式
  • LintCode 31. partitionArray 数组划分
  • python3 使用 asyncio 代替线程
  • Shell编程
  • Sublime Text 2/3 绑定Eclipse快捷键
  • 计算机常识 - 收藏集 - 掘金
  • 技术发展面试
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 码农张的Bug人生 - 初来乍到
  • 如何在 Tornado 中实现 Middleware
  • 实战|智能家居行业移动应用性能分析
  • 首页查询功能的一次实现过程
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • NLPIR智能语义技术让大数据挖掘更简单
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • #Ubuntu(修改root信息)
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • $nextTick的使用场景介绍
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (二)JAVA使用POI操作excel
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (回溯) LeetCode 131. 分割回文串
  • (七)Activiti-modeler中文支持
  • (转)LINQ之路
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)socket Aio demo
  • (转)负载均衡,回话保持,cookie
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .gitignore文件忽略的内容不生效问题解决
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET 使用 XPath 来读写 XML 文件
  • .NET/C# 推荐一个我设计的缓存类型(适合缓存反射等耗性能的操作,附用法)