我正在为x86定制板实现Linux USB驱动程序。我已经实现了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;
}
}
下一行代码失败,无法处理分页请求。
retval = copy_to_user(((struct piclet_port_data *)arg)->data,
port_data.data,
(port_data.num_bytes));
请问我能否以这种方式访问ioctl中的读写功能。.谢谢您的时间。
答案 0 :(得分:0)
创建ioctl编号的方式-例如在创建该ioctl编号时设置的方向参数。
如果您是使用_IOWR()创建的,则读写应该可以。
#define GEN_IOCTL_PORT_READ _IOW(type,nr,size)
我想您已经用IOR()创建了它,所以只有read对您有用。