概述
pinctrl
pinctrl 是为了解决传统的配置 pin 的方式就是直接操作相应的寄存器,但是这种配置
方式比较繁琐、而且容易出问题
pinctrl
子系统主要工作内容如下:
①、获取设备树中
pin
信息。
②、根据获取到的
pin
信息来设置
pin
的复用功能
③、根据获取到的
pin
信息来设置
pin
的电气特性,比如上
/
下拉、速度、驱动能力等。
对于我们使用者来讲,只需要在设备树里面设置好某个
pin
的相关属性即可,其他的初始
化工作均由
pinctrl
子系统来完成,
pinctrl
子系统源码目录为
drivers/pinctrl
。
找到一个叫做
iomuxc
的节点
iomuxc
:
iomuxc@020e0000
{
compatible
=
"fsl,imx6ul-iomuxc"
;
reg
= <
0x020e0000 0x4000
>;};
&
iomuxc向
iomuxc
节点追加数据
&iomuxc {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_hog_1>;
imx6ul-evk {
pinctrl_hog_1: hoggrp-1 {
fsl,pins = <
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059
MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059
MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x17059
MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID 0x13058
>;
};
..
pinctrl_flexcan1: flexcan1grp{
fsl,pins = <
MX6UL_PAD_UART3_RTS_B__FLEXCAN1_RX 0x1b020
MX6UL_PAD_UART3_CTS_B__FLEXCAN1_TX 0x1b020
>;
};
..
pinctrl_wdog: wdoggrp {
fsl,pins = <
MX6UL_PAD_LCD_RESET__WDOG1_WDOG_ANY 0x30b0
>;
};
};
};
pinctrl_hog_1
子节点就是和热插拔有关的
PIN
集合
pinctrl_flexcan1
子节点是
flexcan1
这个外设所使用的
PIN
,
pinctrl_wdog
子节点是
wdog
外设所 使用的 PIN
。
结合起来就是
示例代码 45.1.2.3 完整的 iomuxc 节点
iomuxc: iomuxc@020e0000 {
compatible = "fsl,imx6ul-iomuxc";
reg = <0x020e0000 0x4000>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_hog_1>;
imx6ul-evk {
pinctrl_hog_1: hoggrp-1 {
fsl,pins = <
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059
MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059
MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x17059
MX6UL_PAD_GPIO1_IO00__ANATOP_OTG1_ID 0x13058
>;
..
};
};
;
首先来看一下
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19
,这是一个宏定义,定义在文件
arch/arm/boot/dts/imx6ul-pinfunc.h
中,
imx6ull.dtsi
会引用
imx6ull-pinfunc.h
这个头文件
gpio
子系统
子系统顾名思义,就是用于初始化
GPIO
并且提供相应的
API
函数,比如设置
GPIO
为输入输出,读取
GPIO
的值等。
gpio
子系统的主要目的就是方便驱动开发者使用
gpio
,驱动
开发者在设备树中添加
gpio
相关信息,然后就可以在驱动程序中使用
gpio
子系统提供的
API
函数来操作
GPIO
,
Linux
内核向驱动开发者屏蔽掉了
GPIO
的设置过程,极大的方便了驱动开
发者使用
GPIO
1
pinctrl_led
:
ledgrp
{
2
fsl
,
pins
= <
3
MX6UL_PAD_GPIO1_IO03__GPIO1_IO03
0x10B0
/* LED0 */
4
>;
5
};
1
gpioled
{
2
#address
-
cells
= <
1
>;
3
#size
-
cells
= <
1
>;
4
compatible
=
"atkalpha-gpioled"
;
5
pinctrl
-
names
=
"default"
;
6
pinctrl
-
0
= <&
pinctrl_led
>;
7
led
-
gpio
= <&
gpio1
3
GPIO_ACTIVE_LOW
>;
8
status
=
"okay"
;
9
}
;
第
6
行,
pinctrl-0
属性设置
LED
灯所使用的
PIN
对应的
pinctrl
节点。
第
7
行,
led-gpio
属性指定了
LED
灯所使用的
GPIO
,在这里就是
GPIO1
的
IO03
,低电平
有效。稍后编写驱动程序的时候会获取
led-gpio
属性的内容来得到
GPIO
编号,因为
gpio
子系
统的
API
操作函数需要
GPIO
编号。
最后
以上就是清秀身影为你收集整理的arm-linux pinctrl 和 gpio 子系统的全部内容,希望文章能够帮你解决arm-linux pinctrl 和 gpio 子系统所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复