Устройство или ресурс занят при настройке gpio как символьного устройства - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь настроить вывод GPIO в качестве вывода, но он не работает по причине занятости устройства или ресурса. Вывод сконфигурирован как выход с открытым стоком и принадлежит группе gpiochip24 со смещением 3. При чтении информации из строчной информации 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

Как мне устранить эту ошибку о занятости устройства?

1 Ответ

2 голосов
/ 14 июля 2020

Поскольку req является локальным, при выделении он содержит мусор, и не похоже, что код инициализирует его должным образом, и, в частности, значение flags, вероятно, содержит мусор.

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

может обойти эту конкретную проблему, но убедитесь, что все остальные поля в этой структуре не зависят от нежелательной почты.

...