目录
iomuxc:input-output-multiplexer(输入输出多路复用器)
pinctrl子系统预存iomux节点信息。预先确定引脚的数量和名字,为每个引脚的配置信息分配内存,管理每个引脚的使用状态。
pinctrl子系统的平台设备驱动文件:内核/drivers/pinctrl/freescale/pinctrl-imx6ul.c
iomuxc:input-output-multiplexer(输入输出多路复用器)
iomuxc汇总了所需引脚的配置信息。
iomuxc定义
imx6ull.dtsi
iomuxc定义存放在内核/arch/arm/boot/dts/imx6ull.dtsi文件中。
iomuxc: iomuxc@20e0000 {
compatible = "fsl,imx6ul-iomuxc";
reg = <0x20e0000 0x4000>;
};
compatible:与pinctrl子系统的平台驱动做匹配。
reg:引脚配置寄存器的基地址以及长度。后面的mux reg、conf reg、input reg都是相对于基地址来说。
imx6ull-mmc-npi.dts
imx6ull.dtsi又被内核/arch/arm/boot/dts/imx6ull-mmc-npi.dts包含。
#include "imx6ull.dtsi"
/* &节点标签 追加属性 */
&iomuxc {
/* 表示使用的引脚具有哪些状态 */
pinctrl-names = "default","init","sleep";
/* 引用了其它的节点,见下 */
pinctrl-0 = <&pinctrl_hog_1>; //当设置为default状态使用 pinctrl-0 引脚组
pinctrl-1 =<&xxx>; //代表init状态
pinctrl-2 =<&yyy>; //代表sleep状态
/* 引脚组节点,包含若干个引脚的配置信息 */
pinctrl_hog_1: hoggrp-1 {
/* imx6ull的pinctrl子系统用此属性名(fsl,pins)来记录引脚的配置信息,其它开发板同类节点可能不叫 fsl,pins */
fsl,pins = <
MX6UL_PAD_UART1_RTS_B__GPIO1_IO19 0x17059 /* SD1 CD */
MX6UL_PAD_GPIO1_IO05__USDHC1_VSELECT 0x17059 /* SD1 VSELECT */
MX6UL_PAD_GPIO1_IO09__GPIO1_IO09 0x17059 /* SD1 RESET */
>;
};
...
pinctrl_uart1: uart1grp {
fsl,pins = <
MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX 0x1b0b1
MX6UL_PAD_UART1_RX_DATA__UART1_DCE_RX 0x1b0b1
>;
};
...
}
定义引脚配置方式
pinctrl-names:定义引脚状态。
pinctrl-0:定义第0种状态需要使用的引脚(可引用其它节点标签)
pinctrl-1:定义第1种状态需要使用的引脚(依次类推)
定义配置信息记录
fsl,pins:以该属性来标识引脚的配置信息,结合imx6ull的pinctrl子系统驱动使用。
fsl,pins属性值:宏 + 十六进制数(conf_reg的具体值)。
宏的原型存在于imx6ul-pinfunc.h ← imx6ull-pinfunc.h ← imx6ull.dtsi。
比如:#define MX6UL_PAD_UART1_TX_DATA__UART1_DCE_TX 0x0084 0x0310 0x0000 0 0
宏值含义:
mux_reg(引脚复用设备寄存器):0x0084(偏移地址)
conf_reg(引脚属性设置寄存器):0x0310(偏移地址)
input_reg(引脚输入设置寄存器):0x0000(引脚需要输入功能时设置。此时是Tx输出,无需设置输入)
mux_mode(复用寄存器设置值):0x0(设置引脚复用)
input_val(输入寄存器设置值):0x0
设备树inmuxc节点层次
iomuxc
function
group
fsl,pins = <
xxx
>;
group
function
iomuxc:pinctrl子系统的设备树节点
function:芯片具有外设功能,一个功能对应一个或多个IO组配置信息。
group:IO组中每个IO的配置信息。
fsl,pins:imx6ull中,功能和IO组的标识属性。
pinctl_map数组
pin group配置信息
pinctl_map[0]:配置pin group的所有引脚复用。
pinctl_map[1~n]:配置pin group的每个引脚的属性。
pinctl_map保存了所有pin state所需要的pin group引脚组信息,pinctl_setting把pin froup信息按pin state分类保存。
pinctl子系统的引脚设置接口
状态查询
pinctl_lookup_state
状态设置
pinctl_select_state
pinctrl子系统实验:RGB灯引脚初始化
platform设备引脚初始化
注册平台设备或平台驱动。
really_probe() -> pinctrl_bind_pins()。
RGB灯引脚状态初始化
iomuxc节点添加引脚配置信息
打开内核/arch/arm/boot/dts/imx6ull-mmc-npi.dts,在&iomuxc{}内加入内容。
pinctrl_rgb_led:rgb_led{
fsl,pins = <
MX6UL_PAD_GPIO1_IO04__GPIO1_IO04 0x000010b1
MX6UL_PAD_CSI_HSYNC__GPIO4_IO20 0x000010b1
MX6UL_PAD_CSI_VSYNC__GPIO4_IO19 0x000010b1
>;
};
rgb_led节点添加引脚状态
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_rgb_led>;
即
rgb_led{
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_rgb_led>;
#address-cells = <1>;
#size-cells = <1>;
compatible = "fire,rgb_led";
/*红灯节点*/
ranges;
rgb_led_red@0x020C406C{
reg = <0x020C406C 0x00000004
0x020E006C 0x00000004
0x020E02F8 0x00000004
0x0209C000 0x00000004
0x0209C004 0x00000004>;
status = "okay";
};
/*绿灯节点*/
rgb_led_green@0x020C4074{
reg = <0x020C4074 0x00000004
0x020E01E0 0x00000004
0x020E046C 0x00000004
0x020A8000 0x00000004
0x020A8004 0x00000004>;
status = "okay";
};
/*蓝灯节点*/
rgb_led_blue@0x020C4074{
reg = <0x020C4074 0x00000004
0x020E01DC 0x00000004
0x020E0468 0x00000004
0x020A8000 0x00000004
0x020A8004 0x00000004>;
status = "okay";
};
};
虚拟机:
重新编译设备树:make ARCH=arm -j4 CROSS_COMPILE=arm-linux-gnueabihf- dtbs
然后拷贝到共享文件夹:sudo cp 内核/arch/arm/boot/dts/imx6ull-mmc-npi.dtb /home/couvrir/桌面/sharedir
开发板:
替代旧的二进制设备树:sudo cp /mnt/imx6ull-mmc-npi.dtb /usr/lib/linux-image-4.19.35-imx6/imx6ull-mmc-npi.dtb
同步缓冲区:sync
重启设备:sudo reboot
继承dts_led.ko
sudo insmod dts_led.ko
ls /dev/rgb_led
sudo sh -c "echo 1 > /dev/rgb_led"
sudo sh -c "echo 2 > /dev/rgb_led"
sudo sh -c "echo 4 > /dev/rgb_led"
sudo sh -c "echo 7 > /dev/rgb_led"
sudo sh -c "echo 0 > /dev/rgb_led"
sudo rmmod dts_led.ko