2013-09-27 83 views
2

我需要一個設備驅動程序,我正在編寫/修改以便能夠訪問系統中的其他設備。我知道一些關於驅動程序的信息,例如名稱和/或地址,以便查找它,但我無法找到如何實際查找。在這種特殊情況下,我需要一個GPIO設備(將會有5個加載,並且有2個不同類型的設備),但是我通常也需要知道,因爲我有一個不同的任務,其中幾個驅動程序共享一個他們將不得不仰視的共同的一個,我以類似的方式推測。我已經找到了如何從用戶空間查找設備,但沒有關於如何從另一個內核驅動程序執行它。此外,系統中沒有模塊,所有設備都從devicetree信息加載。獲取另一個驅動程序內的設備列表

讓我感到困惑的是我看不到特定的gpio init函數如何在任何地方註冊設備。我使用Xilinx特定的AXI GPIO器件,該器件使用drivers/gpio/gpio-xilinx.c中的代碼,我可以看到它是如何從devicetree獲取所有信息的,但是我沒有看到任何東西傳回到任何內核列表中以供稍後使用。

如果有幫助,這是在Xilinx Zynq芯片上運行。

回答

1

我使用的最終解決方案是這樣的:

static int custom_match_dev(struct device *dev, void *data) 
{ 
// this function implements the comaparison logic. Return not zero if found. 
    const char *name = data; 

    return sysfs_streq(name, dev->of_node->name); 
} 

static struct device *find_dev(const char * name) 
{ 
    struct device *dev = bus_find_device(&platform_bus_type, NULL, name, custom_match_dev); 

    return dev; 
} 

要記住的唯一的事情是,在設備樹中的設備的名稱必須是唯一的。

1

如果您知道驅動程序所屬的名稱和bus_type,請使用driver_find()API查找驅動程序。如果知道模塊名稱,也可以使用find_module()API獲取模塊。示例...

int __init initialization_routine(void) 
{ 
     struct module *mod; 
     struct device_driver *drv; 

     mod = find_module("e1000"); // e1000 is Intel ethernet module 
     if (mod == NULL) { 
       printk("Module e1000 not found\n"); 
       return 1; 
     } 

     printk("Module name : %s\n", mod->name); 

     /* 
     * Module e1000 belongs to pci_bus_type 
     */ 
     drv = driver_find("e1000", &pci_bus_type); 
     if (drv == NULL) { 
       printk("Cannot find driver for module e1000\n"); 
       return 1; 
     } 

     return 0; 
} 

在系統上註冊了各種總線。你可以找到他們列出/ sys/bus下的所有目錄。每個目錄都是一個總線類型。總線類型結構名稱可以通過在內核中搜索bus_type結構定義來找到。

+0

好吧,這將使我得到設備驅動程序,但將有2個物理設備實例化,我需要得到其中之一。我將如何獲得使用此驅動程序的設備列表? – JonS