7

我一直在尝试编写一个简单的设备驱动程序,我应该在其中以编程方式获取供应商 ID 和产品 ID。浏览了几乎所有必要的头文件后,我得出一个结论,我可以通过一个结构访问USBstruct usb_device{}设备的供应商 ID、产品 ID 和制造商详细信息:其中有一个成员struct usb_device_descriptor{}. 这个嵌套结构有idVendor, idProductandiManufacturer和一些其他成员。

但不知何故,由于某种原因,我无法访问这些成员,所以当我dmesg在插入模块后执行 a 时,它会打印一些垃圾值。我很高兴收到帮助或提示或任何回应。以下是我到目前为止编写的代码:

PS:已经制作了必要的夹杂物。

浏览了几乎所有必要的头文件后,我知道我可以通过一个结构访问 USB 设备的供应商 ID、产品 ID 和制造商详细信息:struct usb_device{}其中有一个成员struct usb_device_descriptor{}. 这个嵌套结构有idVendor, idProductandiManufacturer和一些其他成员。

//*******************************************

struct usb_device udev;

struct usb_bus *bus;
ssize_t ret;

static int __init usb_fun_init(void)
{
    int result;
    __le16 idVendor = 0;
    __le16 idProduct = 0;
    __u8 iManufacturer = 0;

    printk(KERN_INFO "\n************************************ in init\n");
    list_for_each_entry(bus, &usb_bus_list, bus_list){

    printk(KERN_INFO "***************** Begins ****************");
    printk(KERN_INFO "\nVendor ID = %d", udev.descriptor.idVendor);
    printk(KERN_INFO "\nProduct ID = %d", udev.descriptor.idProduct);
    printk(KERN_INFO "\nManufacturer = %s", udev.descriptor.iManufacturer);

    return 0;
}

static int __exit usb_fun_exit(void)
{
    printk(KERN_INFO "\n************************************ in exit\n");
}

module_init(usb_fun_init);
module_exit(usb_fun_exit);

MODULE_LICENSE("GPL");
4

2 回答 2

3

我想,以上是您的内核模块的完整代码。无论如何,您使用的是正确的结构和供应商 ID,设备 ID 将在设备描述符中可用。有关描述符的更多详细信息,请参阅

我建议你在这里参考内核代码。

更新1:


以下程序将为您提供有关系统中可用 HUB 的信息。usb_hub_for_each_child 宏在 3.2.0 内核版本中不支持,但在最新的 3.7.x 版本中支持。

usb_bus_list在中声明#include <linux/usb/hcd.h>

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/usb.h>
#include <linux/usb/hcd.h>
#include <linux/list.h>

MODULE_LICENSE("GPL");

int ourinitmodule(void)
{

int chix = 0;
struct usb_device *dev, *childdev = NULL;
struct usb_bus *bus = NULL;

list_for_each_entry(bus, &usb_bus_list, bus_list)
{
   printk("\n USB Bus : %d", bus->busnum);

   dev = bus->root_hub;

   printk("\n Vendor Id:%x, Product Id:%x\n", dev->descriptor.idVendor, dev->descriptor.idProduct);
#if 0 //usb_hub_for_each_child macro not supported in 3.2.0, so trying with 3.7.6.
   usb_hub_for_each_child(dev, chix, childdev)
   {
        if(childdev)
        {
           printk("\n Vendor Id:%x, Product Id:%x\n", childdev->descriptor.idVendor, childdev->descriptor.idProduct);
        }
   }
#endif

}    

printk(KERN_ALERT "\n Hello Jay, Welcome to sample application.... \n");

return 0;
}

void ourcleanupmodule(void)
{
printk(KERN_ALERT "\n Hello Jay, Thanks....Exiting Application. \n");
return;
}

module_init(ourinitmodule);
module_exit(ourcleanupmodule);

输出是

USB Bus :4
Vendor Id:1d6B, Product Id:3
USB Bus :3
Vendor Id:1d6B, Product Id:2
USB Bus :2
Vendor Id:1d6B, Product Id:2
USB Bus :1
Vendor Id:1d6B, Product Id:2
于 2013-02-06T05:56:24.527 回答
0

在花了一些时间探索头文件之后,我让它工作了。这很简单,只是我无法想象发生了什么以及它是如何发生的。我很想感谢所有发布/回复它的人。这是更新的示例代码,以便像我这样的新手可以参考它。虽然它根本不是一个完美的参考,但如果有人提出建议和修改,我会很高兴。谢谢你!

struct usb_device udev;  

struct usb_bus *bus;  
ssize_t ret;  
static int __init usb_fun_init (void)  
{  
    int result;  
    __le16 idVendor = 0;  
    __le16 idProduct = 0;  
    __u8 iManufacturer = 0;  
    __u8 iSerialNumber = 0;  


    printk(KERN_INFO "\n************************************ in init\n");  
    list_for_each_entry(bus, &usb_bus_list, bus_list)
    {  
        printk(KERN_INFO "***************** Begins ****************");  

        printk(KERN_INFO "Vendor ID = %x", bus->root_hub->descriptor.idVendor);  
        printk(KERN_INFO "Product ID = %x", bus->root_hub->descriptor.idProduct);  
        printk(KERN_INFO "Serial Number = %x", bus->root_hub->descriptor.iSerialNumber);  
        //printk(KERN_INFO "Manu = %s", bus->root_hub->descriptor.iManufacturer);  
        printk(KERN_INFO "Manu = %s", bus->root_hub->manufacturer);  
        printk(KERN_INFO "Product = %s", bus->root_hub->product);  
        printk(KERN_INFO "Serial Number = %s", bus->root_hub->serial);  
        printk(KERN_INFO "\nManufacturer = %s", udev.bus.iManufacturer);         
    }     
    return 0;  
}  

static void __exit usb_fun_exit (void)  
{  
    printk(KERN_INFO "\n************************************ in exit\n");  
}  

module_init(usb_fun_init);  
module_exit(usb_fun_exit);  

MODULE_LICENSE("GPL");  
于 2013-02-06T09:32:48.623 回答