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: 1.1 pin controller示例注意:在复用管脚时,先搜索设备树此管用有没有被其他设备使用。
client device: 1.2 client device示例图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控制接口,供内部源码调用控制。
软件部分还是相同套路,先与设备树节点匹配成功。然后从节点属性拿数据。
2.1驱动platform_driver初始化
匹配成功以后会进入驱动probe入口函数里,这里是mt65xx_leds_probe。然后在probe中直接读取pinctrl属性,或者实现一个驱动fileoperations实例都是可以的。这里代码是初始化pinctrl管脚,然后封装出控制LED的API,驱动中需要操控LED,直接调用API即可。
(1)驱动查找pinctrl设备节点of_find_compatible_node
2.2 查找pinctrl节点(2)从节点中查找设备device结构体 of_find_device_by_node
获取pinctrl句柄,参数为此设备的device结构体。devm_pinctrl_get
2.3 获取pinctrl句柄(3)获取要使用的pin对应的每一种状态pin_state。pinctrl_lookup_state()
2.4 获取pin状态(4)设置pin脚状态。pinctrl_select_state
这里写成mt65xx_blue_leds_gpio_set(int )接口,若需要控制指示灯的状态只需调用此接口传入相应的状态即可。接口内部是通过系统 pinctrl管教设置库接口实现控制。
2.5 设置pin脚状态
网友评论