Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在用户写入的设备驱动程序中添加所有usb设备_Linux_Linux Device Driver_Device Driver - Fatal编程技术网

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/

我试图在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/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