【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:

640-16869077021702500.png

1.1 pin controller示例

注意:在复用管脚时,先搜索设备树此管用有没有被其他设备使用。

client device:

640-16869077021702501.png

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控制接口,供内部源码调用控制。

软件部分还是相同套路,先与设备树节点匹配成功。然后从节点属性拿数据。

640-16869077021702502.png

2.1驱动platform_driver初始化

匹配成功以后会进入驱动probe入口函数里,这里是mt65xx_leds_probe。然后在probe中直接读取pinctrl属性,或者实现一个驱动fileoperations实例都是可以的。这里代码是初始化pinctrl管脚,然后封装出控制LED的API,驱动中需要操控LED,直接调用API即可。

(1)驱动查找pinctrl设备节点of_find_compatible_node

640-16869077021702503.png

2.2 查找pinctrl节点

(2)从节点中查找设备device结构体 of_find_device_by_node

获取pinctrl句柄,参数为此设备的device结构体。devm_pinctrl_get

640-16869077021702504.png

2.3 获取pinctrl句柄

(3)获取要使用的pin对应的每一种状态pin_state。pinctrl_lookup_state()

640-16869077021702505.png

2.4 获取pin状态

(4)设置pin脚状态。pinctrl_select_state

这里写成mt65xx_blue_leds_gpio_set(int )接口,若需要控制指示灯的状态只需调用此接口传入相应的状态即可。接口内部是通过系统 pinctrl管教设置库接口实现控制。

640-16869077021702506.png

2.5 设置pin脚状态
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值