Linux USB 驱动程序调试 -- 008:完善驱动:增加..
时间:2010-12-01 来源:purple_river
需要设计一下:控制传输的代码通过用户调用函数 ioctl() 传过来【命令字和参数一起传到内核】,根据不同的控制命令字,作出不同的动作。 驱动中增加如下代码:
【1】结构体中增加一个初始化项目
static const struct file_operations skel_fops = {
.owner = THIS_MODULE,
.read = skel_read,
.write = skel_write,
.open = skel_open,
.release = skel_release,
.flush = skel_flush,
.ioctl = skel_ioctrl, //这是增加的。
};
注意: 我发现在 usb_driver 结构中也有个 ioctrl 方法,但是没有被调用!我开始就 加到那里,死活不被回调。
【2】实现函数 skel_ioctrl()
//参考函数中如何使用: usb_get_descriptor()
static unsigned char SetupPacket[8];
static int skel_ioctrl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
struct usb_skel *dev;
int retval;
unsigned char *user_buffer;
user_buffer=(unsigned char *)arg;
dev = (struct usb_skel *)file->private_data;
printk("\n\nskel_ioctrl: cmd=%8.8X arg=%8.8X\n",cmd,arg);
copy_from_user(SetupPacket, user_buffer, 8);
retval = usb_control_msg(
dev->udev,
usb_sndctrlpipe(dev->udev, 0),
SetupPacket[1],
SetupPacket[0],
SetupPacket[2]+ (SetupPacket[3])*256 ,
SetupPacket[4]+ (SetupPacket[5])*256 ,
0,
SetupPacket[6]+ (SetupPacket[7])*256, USB_CTRL_GET_TIMEOUT
);
return retval;
}
注意:函数中参数 cmd 和 arg 就是从用户态函数 ioctl() 传来的。
好,现在驱动完全准备好了。可以写测试APP啦。
【1】结构体中增加一个初始化项目
static const struct file_operations skel_fops = {
.owner = THIS_MODULE,
.read = skel_read,
.write = skel_write,
.open = skel_open,
.release = skel_release,
.flush = skel_flush,
.ioctl = skel_ioctrl, //这是增加的。
};
注意: 我发现在 usb_driver 结构中也有个 ioctrl 方法,但是没有被调用!我开始就 加到那里,死活不被回调。
【2】实现函数 skel_ioctrl()
//参考函数中如何使用: usb_get_descriptor()
static unsigned char SetupPacket[8];
static int skel_ioctrl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
{
struct usb_skel *dev;
int retval;
unsigned char *user_buffer;
user_buffer=(unsigned char *)arg;
dev = (struct usb_skel *)file->private_data;
printk("\n\nskel_ioctrl: cmd=%8.8X arg=%8.8X\n",cmd,arg);
copy_from_user(SetupPacket, user_buffer, 8);
retval = usb_control_msg(
dev->udev,
usb_sndctrlpipe(dev->udev, 0),
SetupPacket[1],
SetupPacket[0],
SetupPacket[2]+ (SetupPacket[3])*256 ,
SetupPacket[4]+ (SetupPacket[5])*256 ,
0,
SetupPacket[6]+ (SetupPacket[7])*256, USB_CTRL_GET_TIMEOUT
);
return retval;
}
注意:函数中参数 cmd 和 arg 就是从用户态函数 ioctl() 传来的。
好,现在驱动完全准备好了。可以写测试APP啦。
相关阅读 更多 +