7

私は単純なデバイス ドライバーを作成しようとしてきました。このドライバーでは、ベンダー ID と製品 ID をプログラムで取得することが想定されています。必要なヘッダー ファイルのほとんどすべてを調べた結果、 USBデバイスのベンダー ID、製品 ID、および製造元の詳細に構造体を通じてアクセスできるという結論に達しました。struct usb_device{}これには member がありstruct usb_device_descriptor{}ます。このネストされた構造にはidVendor, idProductiManufacturerおよびその他のメンバーがあります。

しかし、何らかの理由でこれらのメンバーにアクセスできないためdmesg、モジュールを挿入した後に a を実行すると、ガベージ値が出力されます。ヘルプやヒント、または応答を受け取ることができてうれしいです。これまでに書いたコードは次のとおりです。

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

必要なヘッダー ファイルのほとんどすべてを確認した結果、USB デバイスのベンダ ID、製品 ID、および製造元の詳細に構造体を通じてアクセスできることがわかりました。struct usb_device{}これには member があり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;

    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 に答える