Драйверы Linux.Работают только чтение IOCTL команд - PullRequest
0 голосов
/ 25 февраля 2019

У меня возникли проблемы с операциями записи IOCTL на моем Raspberry Pi.

Мой драйвер:

static struct file_operations st7735_syahniuk_device_fops =
{
    .owner          = THIS_MODULE,
    .open           = st7735_syahniuk_device_open,
    .release        = st7735_syahniuk_device_release,
    .unlocked_ioctl = st7735_syahniuk_device_ioctl,
    .read           = st7735_syahniuk_device_read,
    .write          = st7735_syahniuk_device_write
};

static long st7735_syahniuk_device_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
{
...
    case ST7735_SYAHNIUK_IOCTL_READ_DISPLAY_DELAY_MS:
        printk(KERN_INFO "ST7735 IOCTL: Reading display delay\n");
        uldata = g_display.display_thread_sleep_ms;
        err = copy_to_user((void *)arg, &uldata, sizeof(uldata));
        if(err) {
            printk(KERN_ERR "ST7735 IOCTL: Error\n");
            err = -EIO;
        }
        break;

    case ST7735_SYAHNIUK_IOCTL_WRITE_DISPLAY_DELAY_MS:
        printk(KERN_INFO "ST7735 IOCTL: Writing display delay\n");
        err = copy_from_user(&uldata, (void *)arg, sizeof(uldata));
        if(err) {
            printk(KERN_ERR "ST7735 IOCTL: Error\n");
            err = -EIO;
            break;
        }
        g_display.display_thread_sleep_ms = uldata;
        break;
}

...
}

Существуют определения команд IOCTL:

#define MAJIC_NUM 'k'
#define ST7735_SYAHNIUK_IOCTL_READ_DISPLAY_DELAY_MS  _IOR(MAJIC_NUM, 10, unsigned long)
#define ST7735_SYAHNIUK_IOCTL_WRITE_DISPLAY_DELAY_MS _IOW(MAJIC_NUM, 11, unsigned long)

Тамэто тестовое пользовательское приложение:

...
    if(ioctl(fd, ST7735_SYAHNIUK_IOCTL_READ_DISPLAY_DELAY_MS, &display_delay_ms) < 0) {
        perror("Failed to read Display Delay (ms) register");
        goto finish;
    }
...
if(ioctl(fd, ST7735_SYAHNIUK_IOCTL_WRITE_DISPLAY_DELAY_MS, &display_delay_ms) < 0) {
        perror("Failed to write Display Delay (ms) register");
        goto finish;
    }

Когда я запускаю, команда чтения работает хорошо, но команда записи выдает ошибку ENOTTY - Неправильный ioctl для устройства.

Я уже пробовал разные магические числа, но все прочиталиКоманды работают хорошо, а команды записи - нет.

Добавление

Я проверил приложение пользовательского интерфейса с помощью strace и заметил что-то странное.Когда я открываю файл моего устройства, он возвращает мне номер дескриптора файла (например, «3»).Когда я вызываю ioctl с командой read, strace показывает мне, что функция вызывается с fd = 3.Но по какой-то причине fd = 1 передается с командой записи.Почему он вызывается с 1 (stdout) вместо fd моего файла устройства?

1 Ответ

0 голосов
/ 26 февраля 2019

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

...