1

私は、学習目的で K-space USB ドライバーに取り組んできました。

announce_devices()USB ドライバーがルーチンを実行している間に含まれるカーネル空間ソース ファイルを調査した限り、バスに接続されているすべての USB デバイスの情報を出力する機能があることがわかりました。

USB デバイス ( BeagleBoard-xM、製品 ID とベンダー ID およびその他の記述子を設定し、それらはすべてlibusbコードを使用してユーザー空間で検証されます) を接続し、コンピューターを起動しました。を実行したときdmesg、自分のデバイスが表示されることを期待していました。しかし、それは現れませんでした。次に、作成したlibusbコードを実行すると、デバイスが表示されます。このため、デバイスが正常に列挙されていると想定しています。

質問 #1: libusb コードが完全に正常に動作している場合、挿入したモジュールで問題が発生しているはずですよね? コードは以下で共有されます。(このコードは、スタック オーバーフローの質問の回答として採用されています。1月に書いた Linux プラットフォーム上の USB デバイスのベンダー ID、製品 ID をプログラムで取得したところ、問題なく動作しました)。私のドライバーは正常に動作していますか?上記のコードを実装した後、(多数の動的モジュールに対して) カーネルを何度も再構築しました。

質問 #2: Kernel-Space 関数を変更announce_devices()して、自分のマシンでカーネルを再構築して検証することはできますか?

PS: 必要な組み込みが行われました。

必要なヘッダー ファイルのほとんどすべてを確認したので、 USBstruct usb_device{}デバイスのベンダ ID、製品 ID、および製造元の詳細に、メンバを持つ構造体を通じてアクセスできるはずであることがわかりましたstruct usb_device_descriptor{}。このネストされた構造にはidVendor, idProductiManufacturerおよびその他のメンバーがあります。//********************************************

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