У меня возникли проблемы с операциями записи 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 моего файла устройства?