野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 6|回复: 0

[求助] 设备树点灯GPIO端口被占用

[复制链接]
发表于 昨天 18:59 | 显示全部楼层 |阅读模式

求助,各位大佬。在学习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端口被占用

image.png

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

image.png

我向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

Documentation: https://embed-linux-tutorial.readthedocs.io/zh_CN/latest/linuxx

_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

``

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2026-4-3 14:39 , Processed in 0.155113 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表