Linux驱动开发基础(pinctrl子系统和GPIO子系统)

 所学来自百问网

目录

1. Pinctrl 子系统 

1.1 引入

1.2 概念

1.2.1 pin controller

1.2.2 client device

2. GPIO 子系统

2.1 引入

2.2 GPIO的使用

2.2.1 设备树指定引脚

2.2.2 驱动代码中调用GPIO子系统

2.2.3 sysfs 中的访问方法


1. Pinctrl 子系统 

1.1 引入

要想让pinA、B用于GPIO或I2C,需要设置IOMUX(输入/输出多路复用器)让它们连接到GPIO模块或I2C模块;

所以GPIO、I2C应该是并列的关系,它们能够使用之前,需要设置IOMUX。 有时候并不仅仅是设置IOMUX,还要配置引脚,比如上拉、下拉、开漏等等。

现在的芯片动辄几百个引脚,在使用到GPIO功能时,让你一个引脚一个引脚去找对应的寄存器,这要疯掉。所以BSP工程师已经提前做好的了,BSP工程师把引脚的复用、配置抽出来,做成Pinctrl子系统,给GPIO、I2C 等模块使用,我们只需要引用就行了

1.2 概念

pin controller:可以用它来复用引脚、配置引脚

client device:声明自己要使用哪些引脚的哪些功能,怎么配置它们

1.2.1 pin controller

是一个软件上的概念,你可以认为它对应IOMUX──用来复用引脚,还可以配置引脚(比如上下拉电阻等)

注意:pin controller和GPIO Controller不是一回事,前者控制的引脚可用于GPIO功能、I2C功能;后者只是把引脚配置为输入、输出等简单的功能。即先用pin controller把引脚配置为GPIO,再用GPIO Controler把引脚配置为输入或输出。

1.2.2 client device

Pinctrl系统的客户,那就是使用Pinctrl系统的设备,使用引脚的设备。它在设备树里会被定义为一个节点,在节点里声明要用哪些引脚。

1.pin state

pin state 对应图中的 pinctrl-names

对于一个“client device”来说,比如对于一个UART设备,它有多个“状态”:default、sleep等,那对应的引脚也有这些状态。

比如默认状态下,UART设备是工作的,那么所用的引脚就要复用为UART功能。

在休眠状态下,为了省电,可以把这些引脚复用为GPIO功能;或者直接把它们配置输出高电平。

上图中,pinctrl-names里定义了2种状态:default、sleep。

  • 第0种状态用到的引脚在pinctrl-0中定义,它是state_0_node_a, 位于pincontroller 节点中。

  • 第1种状态用到的引脚在pinctrl-1中定义,它是state_1_node_a, 位于pincontroller 节点中。

当这个设备处于 default 状态时,pinctrl 子系统会自动根据上述信息把所用引脚复用为uart0功能。

当这这个设备处于 sleep 状态时,pinctrl 子系统会自动根据上述信息把所用引脚配置为高电平。

2.groups 和 function

  • group:一个设备会用到一个或多个引脚,这些引脚就可以归为一组;

  • function:这些引脚可以复用为某个功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值