出于学习目的,我一直在研究 K-space USB 驱动程序。
据我研究了在 USB 驱动程序执行其例程期间包含的内核空间源文件,我发现announce_devices()
该函数可以打印通过总线连接的所有 USB 设备的信息。
我插入了一个 USB 设备(一个BeagleBoard-xM,我在其中设置了产品 ID 和供应商 ID 以及其他描述符,并且所有这些都使用libusb代码在用户空间中进行了验证),启动了计算机。当我做 admesg
时,我期待看到我的设备。但它没有出现。然后我运行libusb
我编写的代码,它显示了设备。因此,我假设我的设备正在正常枚举。
问题 #1:如果 libusb 代码运行良好,那一定是我插入的模块出了问题,对吧?代码在下面共享。(这段代码被作为 Stack Overflow 问题的答案Programmatically getting the vendor ID, product ID of a USB device on a Linux platform I had back to write back to 1 月份,当时它运行良好)。那么我的司机工作正常吗?在实现上述代码后,我已经多次重建内核(对于许多动态模块)。
问题 #2:我可以修改 Kernel-Space 函数announce_devices()
并在我的机器上重建内核并进行验证吗?
PS:已经制作了必要的夹杂物。
浏览了几乎所有必要的头文件后,我知道我应该(我上次也是)能够通过一个结构访问USBstruct usb_device{}
设备的供应商 ID、产品 ID 和制造商详细信息:它有一个 member struct usb_device_descriptor{}
。这个嵌套结构有idVendor, idProduct
andiManufacturer
和一些其他成员。//************************************************
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");