1

出于学习目的,我一直在研究 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, 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;
    __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");
4

0 回答 0