usb 分析(1)
2011-7-5 22:03:14
usb驱动要做的第一件事就是向usb系统进行注册
在框架代码中是如下描述的
static int __init usb_skel_init(void)
{
int result;
/* register this driver with the USB subsystem */
result = usb_register(&skel_driver);
if (result)
err("usb_register failed. Error number %d", result);
return result;
}
调用core中的方法进行注册了这样一个驱动
static struct usb_driver skel_driver = {
.name = "skeleton",
.probe = skel_probe,
.disconnect = skel_disconnect,
.id_table = skel_table,
};
需要注意
为了使用热插拔功能
需要使用这样一个id表
/* table of devices that work with this driver */
static struct usb_device_id skel_table [] = {
{ USB_DEVICE(USB_SKEL_VENDOR_ID, USB_SKEL_PRODUCT_ID) },
{ } /* Terminating entry */
};
MODULE_DEVICE_TABLE(usb, skel_table);
skel_write
确定写入的大小
if (down_interruptible(&dev->limit_sem)) {
retval = -ERESTARTSYS;
goto exit;
}
限制urb的数目
分配一个urb
usb_alloc_urb
使用usb_fill_bulk_urb 将回调函数关联起来
接着 提交这个urb
usb_submit_urb
usb_hcd_submit_urb