Чтение и запись в драйвере устройства ioctl linux - PullRequest
0 голосов
/ 05 октября 2018

Я использую драйвер USB для Linux, настроенный на плате x86.Я реализовал ioctl для связи с пространством пользователя.

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

struct piclet_port_data
{
    unsigned int  num_bytes;
    unsigned char *data;
}__attribute__((packed));

Пользователь заполняет значение num_bytes, запрашивая количество байтовдля чтения, и драйвер ядра помещает данные в буфер, переданный в структуре.

Код IOCTL ядра:

case GEN_IOCTL_PORT_READ:
        {
            struct piclet_port_data port_data;
            retval = copy_from_user(&port_data.num_bytes,
                        &((struct piclet_port_data *)arg)->num_bytes,
                        sizeof(port_data.num_bytes));
            if (!retval) {
                dev_info(&dev->interface->dev, "%s: Requested:%d"
                        "bytes\n", __func__, port_data.num_bytes);
                port_data.data =
                        kzalloc(port_data.num_bytes, GFP_KERNEL);
                if (!port_data.data) {
                    dev_err(&dev->interface->dev, "%s: Failed to allocate memory\n",
                            __func__);
                    retval = -ENOMEM;
                }
                else {
                    retval = read_port(dev, &port_data);
                    dev_info(&dev->interface->dev, "%s: read_port ret:%d\n",
                                 __func__, retval);
                    if (!retval) {
                        retval = copy_to_user(((struct piclet_port_data *)arg)->data,
                                                port_data.data,
                                               (port_data.num_bytes));
                        dev_info(&dev->interface->dev, "%s: data[0]:%c\n",
                                    __func__, ((struct piclet_port_data *)arg)->data[0]);

                    }
                }
                kfree(port_data.data);
            }
            else {
                retval = -EFAULT;
            }
        }

Код в следующей строке завершается с Unable для обработки запроса подкачки.

 retval = copy_to_user(((struct piclet_port_data *)arg)->data,
                                                port_data.data,
                                               (port_data.num_bytes));

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

1 Ответ

0 голосов
/ 05 октября 2018

как вы создали номер ioctl - например, какие параметры направления вы задали при создании этого номера ioctl.

Если вы создали это с помощью _IOWR (), тогда чтение и запись должны работать.

 #define GEN_IOCTL_PORT_READ _IOW(type,nr,size)

Полагаю, вы создали его с помощью IOR (), поэтому для вас работает только чтение.

...