Как я могу использовать ioctl для связи между пользовательской программой и драйвером? - PullRequest
3 голосов
/ 06 марта 2012

Я пишу драйвер в Linux.Как я могу использовать ioctl для связи между пользовательской программой и драйвером?В моем драйвере структура выглядит следующим образом:

struct file_operations fops = {.read = device_read,.write = device_write,.unlocked_ioctl = device_ioctl,.open = device_open,.release=device_release };

В моем понимании, здесь device_ioctl - это функция, которая обрабатывает вызов ioctl из пользовательской программы.И вызов возможен с переменным количеством параметров.

Но я не уверен в том, как использовать ioctl.Также полностью смущен и готов узнать, как я могу написать device_ioctl?

Кто-нибудь может мне помочь?

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 27 марта 2012

Полагаю, LDD3 глава 6.1 может ответить на ваш вопрос хорошими примерами.

1 голос
/ 06 марта 2012
  1. Используйте register_chrdev, чтобы получить старший номер для файла ядра. В качестве параметра укажите fops.
  2. Возвращается главный номер (его также можно найти в /proc/devices). Используйте этот номер с командой mknod для создания /dev/yourdevice.
  3. В своем коде пользовательского пространства откройте /dev/yourdevice и используйте функцию ioctl с дескриптором файла.
0 голосов
/ 27 марта 2012

Вы можете использовать любой файл proc вместо устройства таким образом:

static long my_proc_ioctl(struct file * file, unsigned int cmd, unsigned long arg)
{
    printk("%s() cmd=%.08x arg=%pK\n", __func__, cmd, (void *)arg);
    return 0;
}

static const struct file_operations my_ioctl_fops = {
    .owner = THIS_MODULE,
    .unlocked_ioctl = my_proc_ioctl,
};

[...]
proc_create("my_ioctl_file", 0600, NULL, &my_ioctl_fops);
[...]
...