记一次pinctrl的引脚初始化失败的问题

led实验中的led_init,

static int __init led_init(void)
{
    int ret = 0;
    /* 设置LED所使用的GPIO */
	/* 1、获取设备节点:gpioled */ 
	gpioled.nd = of_find_node_by_path("/gpioled");
    /* 2、 获取设备树中的gpio属性,得到LED所使用的LED编号 */
    gpioled.led_gpio = of_get_named_gpio(gpioled.nd,"rgb_led_red",0);
    /*2.1 申请IO
    ret = gpio_request(gpioled.led_gpio,"rgb_led_r");
    if(ret)
    {
        printk("Failed to request the led gpio
");
        return -EINVAL;
    }
    /* 3、设置GPIO1_IO03为输出,并且输出高电平,默认关闭LED灯 */
    ret = gpio_direction_output(gpioled.led_gpio,1);
    
    /* 注册字符设备驱动 */
	/* 1、获取设备号 */
    alloc_chrdev_region(&gpioled.devid,0,GPIOLED_CNT,GPIOLED_NAME);
    /*2、初始化cdev-关联字符设备结构体cdev与文件操作结构体file_operations*/
    gpioled.cdev.owner = THIS_MODULE;
    cdev_init(&gpioled.cdev,&gpioled_fops);
    /*3、添加设备至cdev_map散列表中*/
    cdev_add(&gpioled.cdev,gpioled.devid,GPIOLED_CNT);
    /*4、创建类*/
    gpioled.class = class_create(THIS_MODULE,GPIOLED_NAME);
    /*5、创建设备*/
    gpioled.device = device_create(gpioled.class,NULL,gpioled.devid,NULL,GPIOLED_NAME); 
}

设备树中这这么写的

	gpioled{
		#addresses-cells = <1>;
		#size-cells = <1>;
		compatible = "rgb-leds";
		pinctrl-names = "default";
		pinctrl-0 = <&pinctrl_rgb_leds>;
		rgb_led_red  = <&gpio1 4 GPIO_ACTIVE_LOW>;
		rgb_led_green  = <&gpio4 20 GPIO_ACTIVE_LOW>;
		rgb_led_blue  = <&gpio4 19 GPIO_ACTIVE_LOW>;
		status = "okay";
	};
	
&iomuxc {
	pinctrl-names = "default";
	imx6ul-evk {
		pinctrl_rgb_leds: rgb_leds{
			fsl,pins = <
			MX6UL_PAD_GPIO1_IO04__GPIO1_IO04 		   0x000010B0
			MX6UL_PAD_CSI_HSYNC__GPIO4_IO20            0x000010B0
            MX6UL_PAD_CSI_VSYNC__GPIO4_IO19            0x000010B0
			>;
		};
		...
	}
}

看起来是没有问题的,但是当时自动弄也不行。后来经过查找"GPIO1_IO04",发现设备树中有,

&iomuxc {
	pinctrl-names = "default";
	imx6ul-evk {
		pinctrl_rgb_leds: rgb_leds{
			fsl,pins = <
			MX6UL_PAD_GPIO1_IO04__GPIO1_IO04 		   0x000010B0
			MX6UL_PAD_CSI_HSYNC__GPIO4_IO20            0x000010B0
            MX6UL_PAD_CSI_VSYNC__GPIO4_IO19            0x000010B0
			>;
		};
		...
		pinctrl_pwm3: pwm3grp {
			fsl,pins = <
				MX6UL_PAD_GPIO1_IO04__PWM3_OUT   0x000010B1
			>;
		};
	}
}

&pwm3 {
	pinctrl-names = "default";
	pinctrl-0 = <&pinctrl_pwm3>;
	status = "okay";
};

pwm_leds{
		compatible = "pwm-leds";
		status = "disable";

		red {
			label = "red";
			active-low;
			pwms = <&pwm3 0 5000>;
			max-brightness = <255>;
		};

		blue {
			label =  "blue";
			active-low;
			pwms = <&pwm7 0 5000>;
			max-brightness = <255>;
		};

		green {
			label = "green";
			active-low;
			pwms = <&pwm8 0 5000>;
			max-brightness = <255>;
		};
	};

发现&pwm3的状态是okay,GPIO1_IO04就初始化位pwm模式。只是把pwm_leds的status设置为disable,还不行。

申请IO gpio_request如果之前已有device用了这个引脚,调用这个函数,就会报错。。。。

懒惰不会让你一下子跌到 但会在不知不觉中减少你的收获; 勤奋也不会让你一夜成功 但会在不知不觉中积累你的成果 越努力,越幸运。
原文地址:https://www.cnblogs.com/Rainingday/p/14980676.html