美文网首页Linux驱动
L2. pinctrl子系统

L2. pinctrl子系统

作者: 开源519 | 来源:发表于2020-06-18 17:30 被阅读0次

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脚状态

相关文章

网友评论

    本文标题:L2. pinctrl子系统

    本文链接:https://www.haomeiwen.com/subject/lqouxktx.html