Неожиданный IOCTL отправлен на мои драйверы uclinux (ARM) - PullRequest
0 голосов
/ 07 ноября 2019

Написав драйверы персонажей для использования .unlocked_ioctl и приложения из пользовательского пространства для их тестирования, я получаю неожиданный вызов функции ioctl, когда устройства открываются из пространства пользователя.

Драйвер иоба приложения используют один и тот же заголовочный файл, где я определяю «мой» идентификационный символ как «8». Выходное сообщение dev-err от драйвера показывает, что неожиданным идентификатором ioctl является 'T' (см. Ниже).

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

Я задавался вопросом о «отладочной» конфигурации ядра для ioctl, но не смог найти такую ​​настройку.

Заголовочный файл имеет следующее:

#define RLY_IOCTL_BASE  '8'
#define IOC_RLY_GETLAST _IOR(RLY_IOCTL_BASE, 0, u8)
#define IOC_RLY_SETRELAYS _IOW(RLY_IOCTL_BASE, 1, u8)

Источник драйвера имеет это в своих соответствующих функциях обратного вызова ioctl:

if (_IOC_TYPE(cmd) != RLY_IOCTL_BASE) {
    dev_err(&RLYspi->dev,
        "IOCTL: cmd is not for us! (Ty=%c, num=%d, size=%d, dir=%d)\n",
            _IOC_TYPE(cmd), _IOC_NR(cmd), _IOC_SIZE(cmd), _IOC_DIR(cmd));
    return -EINVAL;
}
dev_info(&RLYspi->dev, "IOCTL: cmd num-%d, size=%d, dir=%x\n",
                            _IOC_NR(cmd), _IOC_SIZE(cmd), _IOC_DIR(cmd));

switch (cmd)

И тестовое приложение пользовательского пространства имеет это для открытия драйверов / dev / x, чтобы получитьдескрипторы файлов и дескрипторы:

afe_fp = fopen(AFE_DEVICE_NAME, "r");
if (NULL == afe_fp) {
    printf ("Could not open device %s!\n", AFE_DEVICE_NAME);
    return 1;
}

afe_fd = fileno (afe_fp);       /* Gets the file descriptor from fp */

/* Open dev/ame_sq_rly */
rly_fp = fopen(RLY_DEVICE_NAME, "r");
if (NULL == rly_fp) {
    printf ("Could not open device %s!\n", RLY_DEVICE_NAME);
    return 1;
}

rly_fd = fileno (rly_fp);       /* Gets the file descriptor from fp */

Вызовы выполняются так из тестового приложения на основе аргументов командной строки (показана одна команда):

if (IOBase == 8) {
    /* driverapp r b (read_command) */
    else if ((argc == 3) && ((argv[1][0] == 'r') || (argv[1][0] == 'R'))){
        ret = ioctl(rly_fd, IOC_RLY_GETLAST, &RlyVal);
        if (ret < 0) {
            perror("ioctl('IOC_RLY_GETLAST')");
            exit (EXIT_FAILURE);
        }

        printf ("Relay shifter last value: 0x%02X\n", RlyVal);
        return 0;
    }
}

Я ожидаю получить тольковывод принятой команды от драйвера (dev_info), а затем вывод printf в тестовом приложении.

Когда запускается driverapp (тестовое приложение), я получаю следующий вывод консоли:

# driverapp r 8
<device A info>: IOCTL: cmd is not for us! (Ty=T, num=1, size=0, dir=0)
<device B info>: IOCTL: cmd is not for us! (Ty=T, num=1, size=0, dir=0)
<device B info>: IOCTL: cmd num-0, size=1, dir=2
Relay shifter last value: 0x00
#

Оба драйвера (показанные как «устройство A» и «устройство B» выше) вызываются с помощьюнеожиданный вызов ioctl на устройстве открыт. Я проверил это, просто открыв одно из устройств вместо обоих, и я получил только один неожиданный вызов ioctl для открывшегося драйвера.

Откуда поступают две неожиданные команды 'T' ioctl?

Большое спасибо за любую информацию.

...