我一直在尝试编写一个简单的设备驱动程序,我希望以编程方式获取供应商ID和产品ID。经过几乎所有必要的头文件后,我得出结论,我可以通过以下结构访问USB设备的供应商ID,产品ID和制造商详细信息:struct usb_device{}
成员struct usb_device_descriptor{}
。此嵌套结构包含idVendor, idProduct
和iManufacturer
以及其他一些成员。
但不知何故,由于某种原因,我无法访问这些成员,因此当我插入模块后执行dmesg
时,它会输出一些垃圾值。我很乐意收到帮助或提示或任何回复。以下是我到目前为止编写的代码:
P.S。:已经制作了必要的内容。
经过几乎所有必要的头文件后,我知道我可以通过以下结构访问USB设备的供应商ID,产品ID和制造商详细信息:struct usb_device{}
其成员{{1} }。此嵌套结构包含struct usb_device_descriptor{}
和idVendor, idProduct
以及其他一些成员。
iManufacturer
答案 0 :(得分:3)
我想,上面是你的内核模块的完整代码。无论如何,您使用的是正确的结构和供应商ID,设备描述符中将提供设备ID。 Refer了解有关描述符的更多详细信息。
我建议你引用内核代码here。
更新1:
以下程序将为您提供有关系统中可用HUB的信息。 3.2.0内核版本不支持usb_hub_for_each_child宏,但最新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
答案 1 :(得分: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");