求助,各位大佬。在学习pinctrl和gpio子系统设备树点灯的时候,发现点灯所需要的GPIO端口被normal_led驱动占用.
在写led驱动init函数的时候,我在获取GPIO端口后,用gpio_request()函数加了个GPIO申请判断该端口是否被占用
static int __init led_init(void){
int ret;
//1.获取设备树节点
gpioled.nd = of_find_node_by_path("/rgb_led");
if(!gpioled.nd){
pr_err("%s: failed to find device node /rgb_led\n", LED_NAME);
return -ENODEV;
}
//2.获取GPIO
gpioled.ledpin.led_red = of_get_named_gpio(gpioled.nd, "rgb_led_red", 0);
if(gpioled.ledpin.led_red<0){
pr_err("%s: failed to get rgb_led_red\n", LED_NAME);
ret = gpioled.ledpin.led_red;
goto err_put_node;
}
gpioled.ledpin.led_blue = of_get_named_gpio(gpioled.nd, "rgb_led_blue", 0);
if (gpioled.ledpin.led_blue < 0) {
pr_err("%s: failed to get rgb_led_blue\n", LED_NAME);
ret = gpioled.ledpin.led_blue;
goto err_put_node;
}
gpioled.ledpin.led_green = of_get_named_gpio(gpioled.nd, "rgb_led_green", 0);
if(gpioled.ledpin.led_green<0){
pr_err("%s: failed to get rgb_led_green\n", LED_NAME);
ret = gpioled.ledpin.led_green;
goto err_put_node;
}
//3.申请GPIO
ret = gpio_request(gpioled.ledpin.led_red, "rgb_led_red");
if (ret) {
pr_err("%s: gpio_request red failed, ret=%d\n", LED_NAME, ret);
goto err_put_node;
}
ret = gpio_request(gpioled.ledpin.led_green, "rgb_led_green");
if (ret) {
pr_err("%s: gpio_request green failed, ret=%d\n", LED_NAME, ret);
goto err_free_red;
}
ret = gpio_request(gpioled.ledpin.led_blue, "rgb_led_blue");
if (ret) {
pr_err("%s: gpio_request blue failed, ret=%d\n", LED_NAME, ret);
goto err_free_green;
}
// 4.设置默认输入状态为灭灯
ret = gpio_direction_output(gpioled.ledpin.led_red, LED_OFF);
if (ret) {
pr_err("%s: set red gpio output failed, ret=%d\n", LED_NAME, ret);
goto err_free_blue;
}
ret = gpio_direction_output(gpioled.ledpin.led_green, LED_OFF);
if (ret) {
pr_err("%s: set green gpio output failed, ret=%d\n", LED_NAME, ret);
goto err_free_blue;
}
ret = gpio_direction_output(gpioled.ledpin.led_blue, LED_OFF);
if (ret) {
pr_err("%s: set blue gpio output failed, ret=%d\n", LED_NAME, ret);
goto err_free_blue;
}
然后在安装该驱动的时候发现,led灯所需要的GPIO端口被占用

一番查找后发现应该是系统原本的normal_led驱动占用了这几个GPIO端口

我向imx6ull-mmc-npi-dts里追加
&{/normal_led} {
status = "disabled";
};
但发现设备树里并没有这个节点,在imx6ull-mmc-npi-dts里并不存在normal_led这个节点。想问下normal_led节点是在什么地方被加载进设备树节点的。
以及我查看用户手册,发现确实提到过"在板卡上的部分 GPIO 可能会被系统占用,在使用前请根据需要修改 /boot/uEnv.txt 文件,可注释 掉某些设备树插件的加载,重启系统,释放相应的 GPIO 引脚。"。但我打开/boot/uEnv.txt不清楚改哪个地方来注销掉normal_led
``
uname_r=4.19.35-imx6
uuid=
mmc_dtb=imx6ull-mmc-npi.dtb
nand_dtb=imx6ull-nand-npi.dtb
U-Boot Overlays
_driver/device_tree_rgb_led.html
Master Enable
enable_uboot_overlays=1
overlay_start
dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-i2c1.dtbo
dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-i2c2.dtbo
dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-74hc595.dtbo
dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-485r1.dtbo
dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-485r2.dtbo
dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-adc1.dtbo
dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-hdmi.dtbo
dtoverlay=/usr/lib/linux-image-4.19.35-imx6/overlays/imx-fire-cam.dtbo
"/boot/uEnv.txt" 54 lines, -16777216 characters written
``