【问题标题】:Device or resource busy while configuring gpio as a char device将 gpio 配置为 char 设备时设备或资源繁忙
【发布时间】:2020-11-04 01:54:22
【问题描述】:

我正在尝试将 GPIO 引脚配置为输出,但由于设备或资源繁忙而失败。该引脚配置为输出、漏极开路,属于gpiochip24 偏移量3 的组。在从线info IOCTL 读取信息时,我可以看到标志为3 (OPEN_DRAIN) 并分配了一个消费者。但是当我尝试使用GPIO_GET_LINEHANDLE_IOCTL 将引脚配置为具​​有默认值的输出时,IOCTL 失败。

    int gpioFd = open("/dev/gpiochip24", 0);
    if (gpioFd < 0) {
       printf("ERROR: GPIO chip fail\n");
       return -1;
    }

    struct gpiohandle_request req;
    req.flags |= GPIOHANDLE_REQUEST_OUTPUT;
    req.lineoffsets[0] = 3;    
    req.lines = 1;
    req.default_values[0] = 0;
    strcpy(req.consumer_label, "P_EN");
    int lhfd = ioctl(gpioFd, GPIO_GET_LINEHANDLE_IOCTL, &req);
    if(lhfd < 0)
    {
       int err = errno; 
       printf("Error No: %d\n", err); 
       printf("ERROR: Gpio Line handle\n");
       return -1;
    }

输出:

Error No: 16
ERROR: Gpio Line handle

我查看了 /sys/kernel/debug/gpio 以了解谁在使用该资源,但得到以下响应:

gpiochip24: GPIOs 99-106, parent: platform/139b0000.pinctrl, gpg2

如何解决设备忙的错误?

【问题讨论】:

  • 提示:使用perror 或至少strerror 来获取错误消息。例如perror("GPIO line handle"); -> 输出:GPIO line handle: Device or resource busy

标签: c embedded linux-device-driver embedded-linux gpio


【解决方案1】:

因为req 是本地的,它在分配时有垃圾,而且看起来代码没有正确初始化它,特别是flags 值可能有垃圾。

req.flags |= GPIOHANDLE_REQUEST_OUTPUT;  // no
req.flags  = GPIOHANDLE_REQUEST_OUTPUT;  // yes

可以解决这个特定问题,但请确保此结构中的所有其他字段不依赖于垃圾。

【讨论】:

  • 感谢您指出错误。我清除了局部变量 req 并直接分配了标志而不是修改它的位,但响应仍然相同,即设备或资源正忙。
  • 嗯。你在运行什么硬件/操作系统?
  • 这是一个嵌入在 exynos 芯片上的安卓应用程序。
  • @Cherbo,用gpioinfo gpiochip24 的输出更新你的Q。
  • @0andriy 系统没有支持命令gpioinfo的libgpiod库。还有其他方法可以提取信息吗?
猜你喜欢
  • 2017-09-02
  • 1970-01-01
  • 2016-08-29
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2022-12-03
相关资源
最近更新 更多