L2. pinctrl子系统
Pinctrl子系统
1. 概念介绍
Pinctrl子系统是驱动分离分层思想下的产物,硬件属性方面放在设备树dts中,其中关于设备所使用的的管脚配置,可以集中使用pinctrl。其中设备树pinctrl节点添加可参考文档
kernel-4.14/Documentation/devicetree /bindings/pinctrl/pinctrl-mt65xx.txt
其中涉及到2个对象:pin controller、 client device。
前者提供服务:可以用它来复用引脚、配置引脚。
后者使用服务:声明自己要使用哪些引脚的哪些功能,怎么配置它们。
a. pin controller:
软件上的概念,理解为它对应的IOMUX—用来复用管脚,也可以配置管脚上下拉电阻。即将要使用管脚的每一种状态都单独列出来,等待引用。
b.client device
“客户设备”,即使用pinctrl系统的设备,使用引脚的设备。其会在设备树单独定义成设备节点,并在属性中声明要用的引脚。
eg.
pin controller:![](https://img.haomeiwen.com/i18557296/a93ec964fa576680.png)
注意:在复用管脚时,先搜索设备树此管用有没有被其他设备使用。
client device:![](https://img.haomeiwen.com/i18557296/c6f5acfac01b0399.png)
图1.1 pin controller描述了GPIO85、GPIO18的两种状态。先将GPIO85和GPIO18复用为GPIO功能,然后管脚每个状态对应一个pinctrl-num。
图1.2 leds_mt65xx客户设备节点表示MTK机器的led设备,MTK所有用到的LED都可以放到此设备节点,当然也可以重建设备节点,这个是随意的。其中不同的厂家pin controller是不同的。
2. 软件驱动
2.1 内部调用
内部调用指的是直接封装LED控制接口,供内部源码调用控制。
软件部分还是相同套路,先与设备树节点匹配成功。然后从节点属性拿数据。
![](https://img.haomeiwen.com/i18557296/6170d7c0d62a020c.png)
匹配成功以后会进入驱动probe入口函数里,这里是mt65xx_leds_probe。然后在probe中直接读取pinctrl属性,或者实现一个驱动fileoperations实例都是可以的。这里代码是初始化pinctrl管脚,然后封装出控制LED的API,驱动中需要操控LED,直接调用API即可。
(1)驱动查找pinctrl设备节点of_find_compatible_node
![](https://img.haomeiwen.com/i18557296/163b06ab84f3b024.png)
(2)从节点中查找设备device结构体 of_find_device_by_node
获取pinctrl句柄,参数为此设备的device结构体。devm_pinctrl_get
![](https://img.haomeiwen.com/i18557296/0d7152dd5d0f609d.png)
(3)获取要使用的pin对应的每一种状态pin_state。pinctrl_lookup_state()
![](https://img.haomeiwen.com/i18557296/5473402d058d7c69.png)
(4)设置pin脚状态。pinctrl_select_state
这里写成mt65xx_blue_leds_gpio_set(int )接口,若需要控制指示灯的状态只需调用此接口传入相应的状态即可。接口内部是通过系统 pinctrl管教设置库接口实现控制。
![](https://img.haomeiwen.com/i18557296/f5be003c652d8d15.png)