天天看点

6_client端使用pinctrl过程的情景分析_基于IMX6ULL

参考资料:

Linux 5.x内核

Documentation\devicetree\bindings\pinctrl\pinctrl-bindings.txt

arch/arm/boot/dts/stm32mp151.dtsi

arch/arm/boot/dts/stm32mp157-100ask-pinctrl.dtsi

arch/arm/boot/dts/stm32mp15xx-100ask.dtsi

drivers\pinctrl\stm32\pinctrl-stm32mp157.c

drivers\pinctrl\stm32\pinctrl-stm32.c

Linux 4.x内核

Documentation\pinctrl.txt

arch/arm/boot/dts/imx6ull-14x14-evk.dts

arch/arm/boot/dts/100ask_imx6ull-14x14.dts

drivers\pinctrl\freescale\pinctrl-imx6ul.c

drivers\pinctrl\freescale\pinctrl-imx.c

在设备树中,使用pinctrl时格式如下:

6_client端使用pinctrl过程的情景分析_基于IMX6ULL

设备节点要么被转换为platform_device,或者其他结构体(比如i2c_client),但是里面都会有一个device结构体,比如:

6_client端使用pinctrl过程的情景分析_基于IMX6ULL

每个device结构体里都有一个dev_pin_info结构体,用来保存设备的pinctrl信息:

6_client端使用pinctrl过程的情景分析_基于IMX6ULL

假设芯片上有多个pin controller,那么这个设备使用哪个pin controller?

这需要通过设备树来确定:

分析设备树,找到pin controller

对于每个状态,比如default、init,去分析pin controller中的设备树节点

使用pin controller的pinctrl_ops.dt_node_to_map来处理设备树的pinctrl节点信息,得到一系列的pinctrl_map

这些pinctrl_map放在pinctrl.dt_maps链表中

每个pinctrl_map都被转换为pinctrl_setting,放在对应的pinctrl_state.settings链表中

6_client端使用pinctrl过程的情景分析_基于IMX6ULL

设备引用pin controller中的某个节点时,这个节点会被转换为一些列的pinctrl_map:

转换为多少个pinctrl_map,完全由具体的驱动决定

每个pinctrl_map,又被转换为一个pinctrl_setting

举例,设备节点里有:<code>pinctrl-0 = &amp;lt;&amp;state_0_node_a&amp;gt;</code>

pinctrl-0对应一个状态,会得到一个pinctrl_state

state_0_node_a节点被解析为一系列的pinctrl_map

这一系列的pinctrl_map被转换为一系列的pinctrl_setting

这些pinctrl_setting被放入pinctrl_state的settings链表

6_client端使用pinctrl过程的情景分析_基于IMX6ULL

涉及pinctrl子系统的其他2个作用:引脚复用、引脚配置

继续阅读