zoukankan      html  css  js  c++  java
  • 记一次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用了这个引脚,调用这个函数,就会报错。。。。

    懒惰不会让你一下子跌到 但会在不知不觉中减少你的收获; 勤奋也不会让你一夜成功 但会在不知不觉中积累你的成果 越努力,越幸运。
  • 相关阅读:
    python 多进程操作
    python 什么是全局解释器锁GIL
    cloudstack api调用python
    cloudstack模板
    微型计算器
    a++与=++a的区别
    js自调用函数的实现方式
    .net利用NPOI导入导出Excel
    linux系统下c程序分多文件实现
    线程的优先级
  • 原文地址:https://www.cnblogs.com/Rainingday/p/14980676.html
Copyright © 2011-2022 走看看