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用了这个引脚,调用这个函数,就会报错。。。。