linux驱动-引入pinctrl子系统
pinctrl(pin controller)可以管理系统中所有的 pin,也可以设置管教的复用关系,
电器属性(内部上拉,或者下拉)等。
在一个SOC芯片上面,大多数GPIO管脚都是功能复用的,在不同的场景下可以设置为不同的功能模式,所以 pinctrl在内核钟使用的频率非常高。
打开rk3568.dtsi,这个文件都是些一下通用的的东西,所以pinctrl这个节点是由厂家的bsp工程师写的。pinctrl也符合设备模型结构,所以,也可以从设备和驱动,总线。
pinctrl节点,就相当于设备模型里面的设备这个概念,通过设备树学校和平台总线学习,这些节点如果返回要求,都会被转换成设备
打开开发板的内核源码树我的是rk356x-lubancat-rk series.dts这个,这部分代码往pinctrl节点中添加了很多东西,添加的这些东西,就是引脚的描述。
比如下面图片的圈起来的地方,意思是第三组、c5的管脚设置成了gpio功能,并且电气属性是上拉,这部分就是驱动工程师要写的,根据这些工作要求,设置引脚功能。所以会有就可以了,理论不懂问题不大
pinctrl节点设备树,只是描述,具体如何配置得看驱动代码。如何确定 pinctd节点驱动的位置呢?
通过设备树我们知道节点中compatible属性值为:"rockchip,rk3568-pinctrl",所以我们在内核源码目录下 grep 查找rockchip,rk3568-pinctrl可以找到 pinctrl 的驱动文件为drivers/pinctrl/pinctrl-rockchip.c 这部分的工作是厂家的 BSP 攻城狮来编写
然后打开这个驱动文件,拉到最后面,看驱动入口的位置,圈者哪里,这里不是用module_init(),而是用这个postcore_initcall(rockchip_pinctrl_drv_register);,目的是要控制驱动加载的顺序,为什么要控制,因为这样加载会更快一些控制加载顺序,因为有时候加载驱动A,需要先加载b,加载完b了才能加在a.....,一个子系统的复杂度是很高的,要被拆成很多模块的。
再看驱动入口,使用平台总线因为之前学到的,linux所有的设备都要挂载到总线上面,pinctrl也不例外,这样驱动、设备、总线都在知道了,
设备和驱动匹配成功之后就要调用probe函数了,所以现在要找到probe。下面这些只是一部分
比如说我现在的板块上有一个led灯,现在要把连接到led灯的管家设置成gpio管脚。
抛出疑问:
pinctrl驱区动是在加载 pinctrl,驱动时设置的引脚,还是在加载模块时设置的引脚复用呢?还是
说会设置成俩次呢?
猜想:
猜想 1.是在加载模块时设置的引脚复用。
猜想 2.加载 pinctrl,驱动的时候也会设置,因为也会调用 probe 函数。