8.pinctrl子系统:iomuxc

目录

iomuxc:input-output-multiplexer(输入输出多路复用器)

iomuxc定义

imx6ull.dtsi

imx6ull-mmc-npi.dts

定义引脚配置方式 

定义配置信息记录

设备树inmuxc节点层次

pinctl_map数组

pin group配置信息

pinctl子系统的引脚设置接口

状态查询

状态设置

pinctrl子系统实验:RGB灯引脚初始化

platform设备引脚初始化

RGB灯引脚状态初始化

iomuxc节点添加引脚配置信息

rgb_led节点添加引脚状态

继承dts_led.ko


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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值