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

news2024/11/15 12:46:07

目录

    • 前言
    • 一、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.coloradmin.cn/o/2094574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java学习】多线程JUC万字超详解

所属专栏&#xff1a;Java学习 1. 多线程的概念 线程&#xff1a;线程是操作系统能够进行运算调度的最小单位&#xff0c;它被包含在进程之中&#xff0c;是进程的实际运作单位 下面这些每一个能够运行的软件就是一个进程 并发&#xff1a;在同一时刻&#xff0c;有多个…

网络编程学习:TCP/IP协议

TCP/IP协议简介 TCP/IP协议包含了一系列的协议&#xff0c;也叫TCP/IP协议族&#xff08;TCP/IP Protocol Suite&#xff0c;或TCP/IP Protocols&#xff09;&#xff0c;简称TCP/IP。 分层结构 为了能够实现不同类型的计算机和不同类型的操作系统之间进行通信&#xff0c;引…

Java中的锁(四)利用读写锁实现高性能网页缓存

文章目录 背景Ehcache2源码解析-如何实现缓存网页读写锁ReentrantReadWriteLock解析读写锁的特性读写锁是如何实现的&#xff1f; 如何将Ehcach2-web的源码迁移到Ehcach3中&#xff1f;/ 如何自定义Filter实现高性能网页缓存&#xff1f; 背景 在我们的销售页面&#xff0c;有…

Django+Vue酒店推荐系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 需要的环境3.2 Django接口层3.3 实体类3.4 config.ini3.5 启动类3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作者&…

Linux文件操作(二)

Linux文件操作&#xff08;二&#xff09; 导语文件和目录维护chmodchownlink及其变体dir及其变体chdir和getcwd 扫描目录opendirreaddirtelldirseekdirclosedir示例程序 错误处理strerrorperror /procfcntlmmap相关mmapmsyncmunmap 总结参考文献 导语 文件操作的第二部分&…

juzige/Monitoring-System-基于Java语言的光伏监控系统

Photovoltaic-Monitoring-System-Based-on-Java-Language 基于Java语言的光伏监控系统光伏发电系统光伏软件系统光伏监控系统源码光伏发电系统源码-智电云 一、 介绍 光伏光伏发电预测逆变器监控逆变器数据采集光伏运维光伏电站光伏功率预测光伏监控系统光伏发电系统光伏软件…

【CSS in Depth 2 精译_022】3.6 一招搞定容器内元素间距的问题 + 3.7 本章小结

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第一章 层叠、优先级与继承&#xff08;已完结&#xff09; 1.1 层叠1.2 继承1.3 特殊值1.4 简写属性1.5 CSS 渐进式增强技术1.6 本章小结 第二章 相对单位&#xff08;已完结&#xff09; 2.1 相对…

jQuery入门(六)jQuery实现瀑布流分页案例

一、瀑布流分页案例分析 1.1) 功能分析&#xff1a; 鼠标下拉&#xff0c;加载分页数据(10条) &#xff0c;如下图&#xff1a; 案例分析&#xff1a; 1.2) 如何确定当前显示的数据已经浏览完毕&#xff1f; 公式&#xff1a;(滚动条距底部的距离 滚动条上下滚动的距离 当…

【Python篇】Python 类和对象:详细讲解(下篇)

文章目录 Python 类和对象&#xff1a;详细讲解&#xff08;下篇&#xff09;15. 接口和协议&#xff08;Interfaces and Protocols&#xff09;15.1 什么是接口&#xff1f;15.2 协议的基本概念例子&#xff1a;定义飞行协议详细解释输出示例 16. 装饰器模式&#xff08;Decor…

A02、Java编程性能调优(02)

1、Stream如何提高遍历集合效率 1.1、什么是Stream 现在很多大数据量系统中都存在分表分库的情况。例如&#xff0c;电商系统中的订单表&#xff0c;常常使用用户 ID 的 Hash 值来实现分表分库&#xff0c;这样是为了减少单个表的数据量&#xff0c;优化用户查询订单的速度。 …

ZYNQ-Utlscale-RFSOC看门狗

ZYNQ-Utlscale-RFSOC看门狗复位 ZYNQ-Utlscale-RFSOC 看门狗的程序网上里程很少&#xff0c;开源资料也是几乎没有&#xff0c;最近需要用到这个功能&#xff0c;来来回回搞了一周才搞定。刚开始参考ZYNQ7000的资源&#xff0c;发现MPSOC不适用。很感谢下面的几篇文章&#xf…

探索TinyDB:轻量级数据库的优雅之旅

文章目录 探索TinyDB&#xff1a;轻量级数据库的优雅之旅背景&#xff1a;为何选择TinyDB&#xff1f;TinyDB是什么&#xff1f;如何安装TinyDB&#xff1f;简单库函数使用方法场景应用常见Bug及解决方案总结 探索TinyDB&#xff1a;轻量级数据库的优雅之旅 背景&#xff1a;为…

【电子通识】电子元器件可靠性基本概念

什么是电子元器件 电子元器件是电子产品的基本组成单元&#xff0c; 是电子元件和电子器件的总称。 通常电子元件指的是无源元件&#xff0c; 电子器件指的是有源器件。无源元件是对所供给的电能执行被动操作&#xff08;如耗散、储蓄或释放等&#xff09;的元件&#xff0c; 如…

《普通人学AI指南PDF》免费下载破10万。。。

你好&#xff0c;我是郭震 普通人如何开始AI&#xff0c;用好AI&#xff1f; 我在今年制作的《普通人学AI指南》PDF&#xff0c;从中或许能帮你找到答案&#xff1a; 1 PDF背景介绍 此PDF我是今年开始着手制作&#xff0c;到6月8日终版&#xff0c;中间历经反复多次修改&#x…

LabVIEW布尔值比较与信号状态上升沿下降沿检测

在 LabVIEW 编程中&#xff0c;布尔值的比较不仅是逻辑运算的重要组成部分&#xff0c;还广泛应用于信号的上升沿和下降沿检测。通过理解 True > False 这样的基本表达式&#xff0c;以及如何在程序中检测信号的状态变化&#xff0c;开发者可以有效地控制系统行为&#xff0…

内存管理篇-17解开页表的神秘面纱-上

--好像并没有解开。。 1.遗留的一些问题 &#xff08;1&#xff09;页表存储在内存的什么地方&#xff1f;页表服用的对象就是MMU&#xff0c;主要就为了MMU单元翻译的时候提供作用&#xff0c;因此能存放在MMU中的TLB缓存中&#xff0c;也可能存放在内存中。但是在内存中的什…

【MATLAB】matlab生成的图像如何导出(三种方法教会你)

我们经常使用matlab生成各类的图&#xff0c;如何将其导出&#xff0c;导出为何种类型。 方法一&#xff1a;选择 matlab 生成的图形界面 " Figure 1 " 的菜单栏 " 编辑 " — " 复制图窗 " , 就可以将图像拷贝到 Word 文档中 打开 Word 文档 ,…

远程调用以及注册中心Nacos

小编目前大一&#xff0c;刚开始着手学习微服务的相关知识&#xff0c;小编会把它们整理成知识点发布出来。我认为同为初学者&#xff0c;我把我对知识点的理解以这种代码加观点的方式分享出来不仅加深了我的理解&#xff0c;或许在某个时候对你也有所帮助&#xff0c;同时也欢…

YOLOv5课堂行为识别系统+GUI界面

课堂行为检测 gui/课堂行为识别系统/YOLOv5课堂行为识别/ yolov5/opencv/计算机视觉/python程序/深度学习/pytorch 数据集标注/配置好环境程序可直接运行/带UI界面/代码数据集/代码数据集 &#xff3b;功能&#xff3d;图片识别/视频识别/摄像头识别 损失/准确率等数据可在ten…

Golang 教程3——包

Golang 教程3——包 注意&#xff0c;该文档只适合有编程基础的同学&#xff0c;这里的go教程只给出有区别的知识点 文件结构 前置工作 在文件testproject01目录下执行 ‘go mod init gocode/testproject01’ (base) PS E:\Goproject\src\gocode\testproject01> go mo…