Linux 在用户写入的设备驱动程序中添加所有usb设备
我试图在Linux中学习设备驱动程序。我偶然发现了检测usb设备的代码。但它只检测那些在Linux 在用户写入的设备驱动程序中添加所有usb设备,linux,linux-device-driver,device-driver,Linux,Linux Device Driver,Device Driver,我试图在Linux中学习设备驱动程序。我偶然发现了检测usb设备的代码。但它只检测那些在usb\u device\u id\u pen\u table[]中有条目的设备。如何使其更通用,以便检测所有usb设备 #include <linux/module.h> #include <linux/kernel.h> #include <linux/usb.h> #include <linux/usb/hcd.h> #include <linux/
usb\u device\u id\u pen\u table[]中有条目的设备。如何使其更通用,以便检测所有usb设备
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/usb.h>
#include <linux/usb/hcd.h>
#include <linux/list.h>
static int pen_probe(struct usb_interface *interface, const struct
usb_device_id *id)
{
printk(KERN_INFO "MY Pen drive (%04X:%04X) plugged\n",id->idVendor, id->idProduct);
return 0;
}
static void pen_disconnect(struct usb_interface *interface)
{
printk(KERN_INFO "MY Pen drive removed\n");
}
static struct usb_device_id pen_table[] =
{
{ USB_DEVICE(0x03F0, 0xBF07) },
{ USB_DEVICE(0x0781, 0x5567) },
{} /* Terminating entry */
};
MODULE_DEVICE_TABLE (usb, pen_table);
static struct usb_driver pen_driver =
{
.name = "pen_driver",
.id_table = pen_table,
.probe = pen_probe,
.disconnect = pen_disconnect,
};
static int __init pen_init(void)
{
return usb_register(&pen_driver);
}
static void __exit pen_exit(void)
{
usb_deregister(&pen_driver);
}
module_init(pen_init);
module_exit(pen_exit);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("USB Pen Registration Driver");
#包括
#包括
#包括
#包括
#包括
静态int笔探头(结构usb接口*接口,常数结构
usb_设备_id*id)
{
printk(KERN_INFO“我的笔驱动器(%04X:%04X)已插入\n”,id->idVendor,id->idProduct);
返回0;
}
静态无效笔断开连接(结构usb接口*接口)
{
printk(KERN_INFO“我的笔驱动器已删除”\n);
}
静态结构usb_设备_id笔_表[]=
{
{USB_设备(0x03F0,0xBF07)},
{USB_设备(0x0781,0x5567)},
{}/*终止项*/
};
模块设备桌(usb、笔桌);
静态结构usb_驱动程序笔_驱动程序=
{
.name=“笔驱动程序”,
.id_table=笔_table,
.probe=笔式探头,
.disconnect=笔\断开连接,
};
静态整数初始化钢笔初始化(无效)
{
返回usb_寄存器(&pen_驱动程序);
}
静态无效uu退出笔u退出(无效)
{
usb_注销器(&pen_驱动程序);
}
模块初始化(笔初始化);
模块出口(笔出口);
模块许可证(“GPL”);
模块描述(“USB笔注册驱动程序”);
首先,您应该了解匹配的含义。当您插入新的USB设备时,内核从中获取信息(供应商ID、产品ID等),并尝试查找支持此设备的某些驱动程序(即指定相同供应商ID、产品ID等的驱动程序)。此过程调用匹配
注意:通常(在您的驱动程序中)匹配具有与您的设备不同的vendorID/productID的设备是个坏主意。所以也许你真的不想这么做(实际上我不明白你为什么要这么做)。无论如何,答案如下
USB设备匹配发生在USB\u match\u device()
函数(中)。从这里您可以看到.id\u表中的条目必须使用一种可用的匹配策略(请参见下面的匹配标志)
在usb\u match\u device()
函数中需要注意的一点是,如果设备成功匹配,它将返回1
(而不是0
,在内核中通常代表“success”)。因此,此函数基本上会逐个检查指定的所有匹配标志,并检查结构中的相应数据是否等于来自测试USB设备的数据在中指定的所有
匹配字段。匹配标志
对于您的设备和正在检查的设备表条目必须相同,以usb\u match\u device()
函数返回成功结果
您可以在以下位置找到匹配的标志:
/*一些用于创建结构usb\u设备\u id的有用宏*/
#定义USB\u设备\u ID\u匹配\u供应商0x0001
#定义USB_设备_ID_匹配_产品0x0002
#定义USB\u设备\u ID\u匹配\u开发\u LO 0x0004
#定义USB\u设备\u ID\u匹配\u开发\u HI 0x0008
#定义USB_设备_ID_匹配_开发_类0x0010
#定义USB_设备_ID_匹配_开发_子类0x0020
#定义USB_设备_ID_匹配_开发_协议0x0040
这些标志用于填充。在struct usb\u device\u id
中的match\u flags
字段。为方便起见,有一些宏可以使用所选策略创建整个struct usb\u device\u id
(如您正在使用的usb\u device()
宏)。这些宏在中定义:
因此,看起来您需要使用USB\u设备\u信息()
而不是USB\u设备()
:
/**
*USB_设备_信息-用于描述一类USB设备的宏
*@cl:bDeviceClass值
*@sc:bDeviceSubClass值
*@pr:bDeviceProtocol值
*
*此宏用于创建与
*特定类别的设备。
*/
#定义USB设备信息(cl、sc、pr)\
.match\u flags=USB\u设备\u ID\u匹配\u开发信息\
.bDeviceClass=(cl)\
.bDeviceSubClass=(sc)\
.bDeviceProtocol=(pr)
USB_DEVICE - macro used to describe a specific usb device
USB_DEVICE_VER - describe a specific usb device with a version range
USB_DEVICE_INTERFACE_CLASS - describe a usb device with a specific interface class
USB_DEVICE_INTERFACE_PROTOCOL - describe a usb device with a specific interface protocol
USB_DEVICE_INTERFACE_NUMBER - describe a usb device with a specific interface number
USB_DEVICE_INFO - macro used to describe a class of usb devices