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

L2. pinctrl子系统

作者: 拂去尘世尘 | 来源:发表于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