编写USB驱动程序TOC
struct usb_device_id结构体提供了一系列不同类型的该驱动程序支持的USB设备,USB核心使用该列表判断对于对于一个设备该使用哪个驱动程序,热插拔脚本使用它来确定当一个特定设备插入到系统时该自动装载哪个驱动?
对于PCI设备,有许多用来初始化该结构体的宏:
USB_DEVICE(vend,prod) //创建一个struct usb_device_id结构体,仅和制定的制
造商和产品ID值匹配,该宏常用于需要一个特定驱动程序
USB设备
USB_DEVICE_VER(vend,prod,lo,hi) //创建一个struct usb_device_id结构体,仅
和某版本范围内指定制造商和产品ID值相匹配
USB_DEVICE_INFO(cl,sc,pr) //创建一个struct usb_device_id结构体,仅和USB
设备的指定类型相匹配
USB_INTERFACE_INFO(cl,sc,pr) //创建一个struct usb_device_id结构体,仅和
USB接口的指定类型相匹配
对于一个只控制来自单一制造商单一USB设备简单USB设备驱动程序:
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); //允许用户空间的工具判断出该
驱动程序可以控制什么设备
所有USB驱动程序都必须创建主要结构体是struct usb_driver,该结构体必须由
USB驱动来填写,包括许多回掉函数和变量,它们向USB内核描述了USB驱动程序。
创建struct usb_driver结构体初始化五个字段:
static struct usb_driver skel_driver = {
.name = "skeleton",
.probe = skel_probe,
.disconnect = skel_disconnect,
.id_table = skel_table,
.supports_autosuspend = 1,
};
usb_register将struct usb_driver指针作为参数,把struct usb_driver注册到USB核心。一般,将此注册函数放在USB驱动程序的初始化代码中,如下:
static int __init usb_skel_init(void)
{
int result;
result = usb_register(&skel_driver); //注册
if (result)
err("usb_register failed. Error number %d", result);
return result;
}
USB驱动程序将被卸载时,需要注销struct usb_driver结构体,一般放入断开函数中:
static void __exit usb_skel_exit(void)
{
/* deregister this driver with the USB subsystem */
usb_deregister(&skel_driver);
}