platform_device的註冊過程分析

來源:互聯網
上載者:User

《Linux裝置驅動程式》的linux裝置模型章中說到裝置模型中,所有裝置都通過匯流排相連。添加裝置devA,必須指定其device結構體的bus_type域,初始化其他域,然後調用device_register(&devA),將裝置devA註冊到指定匯流排。

  添加該裝置驅動driverA,也必須指定其device_driver結構體的bus_type域,初始化其他域,然後調用driver_register(&driverA),將該驅動註冊到匯流排上。

  如果驅動driverA和裝置devA匹配成功,即調用probe函數成功,則建立他們之間的符號連結,即將裝置與驅動捆綁起來。

  從2.6版本開始引入了platform這個概念,在開發底層驅動程式時,首先要確認的就是裝置的資源資訊,例如裝置的地址,在2.6核心中將每個裝置的資源用結構platform_device來描述,該結構體定義在kernel/include/linux/platform_device.h中,

  struct platform_device {
         const char * name;
          int id;
         struct device dev;
         u32 num_resources;
         struct resource * resource;
         struct platform_device_id *id_entry; };

    該結構一個重要的元素是resource,該元素存入了最為重要的裝置資源資訊,定義在kernel/include/linux/ioport.h中,

  struct resource {

  resource_size_t start;

  resource_size_t end;

  const char *name;

  unsigned long flags;

  struct resource *parent, *sibling, *child;

  };

  下面舉個例子來說明一下:

  在kernel/arch/arm/mach-mmp/Devices.c定義了

  static struct resource pxa-xxx_u2h_resources[] = {

  /* regbase */

  [0] = {

  .start = PXA-xxx_U2H_REGBASE,

  .end= PXA-xxx_U2H_REGBASE + USB_REG_RANGE,

  .flags = IORESOURCE_MEM,

  .name = "u2h",

  },

  /* phybase */

  [1] = {

  .start = PXA-xxx_U2H_PHYBASE,

  .end= PXA-xxx_U2H_PHYBASE + USB_PHY_RANGE,

  .flags = IORESOURCE_MEM,

  .name = "u2hphy",

  },

  [2] = {

  .start = IRQ_PXA-xxx_USB2,

  .end= IRQ_PXA-xxx_USB2,

  .flags = IORESOURCE_IRQ,

  },

  };

  這裡定義了三組resource,它描述了一個usb host裝置的資源,第1組描述了這個usb host寄存器設定,第二組描述了usb host物理地址設定,IORESOURCE_MEM表示第1組描述的是記憶體類型的資源資訊,第3組描述了這個usb host裝置的中斷號,IORESOURCE_IRQ表示第2組描述的是中斷資源資訊。裝置驅動會根據flags來擷取相應的資源資訊。

  有了resource資訊,就可以定義platform_device了:

  struct platform_device pxa-xxx_device_u2h = {

  .name = "pxau2h-ehci",

  .id = -1,

  .dev = {

  .dma_mask = &ehci_hcd_pxa_dmamask,

  .coherent_dma_mask = DMA_BIT_MASK(32),

  .release = ehci_hcd_pxa_device_release,

  },

  .num_resources = ARRAY_SIZE(pxa-xxx_u2h_resources),

  .resource = pxa-xxx_u2h_resources,

  };

  有了platform_device就可以調用函數platform_add_devices向系統中添加該裝置了,這裡的實現是

  static inline int pxa-xxx_add_u2h(struct pxa_usb_plat_info *info)

  {

  pxa-xxx_device_u2h.dev.platform_data = info;

  return platform_device_register(&pxa-xxx_device_u2h);

  }

  這裡的pxa-xxx_init必須在裝置驅動載入之前被調用,可以把它放到

  static void __init pxa-xxx_init(void)

  驅動程式需要實現結構體struct platform_driver,參考kernel/driver/usb/host/ehci-pxau2h.c,

  static struct platform_driver pxau2h_ehci_driver = {

  .probe = pxau2h_ehci_probe,

  .remove = pxau2h_ehci_remove,

  .shutdown = usb_hcd_platform_shutdown,

   .driver = {

        .name = "pxau2h-ehci",

       .bus = &platform_bus_type },

#ifdef CONFIG_PM

       .suspend = pxau2h_driver_suspend,

      .resume = pxau2h_driver_resume,

#endif };

   在驅動初始化函數中調用函數platform_driver_register()註冊platform_driver,需要注意的是ehci_device結構中name元素和pxau2h_ehci_driver結構中driver.name必須是相同的,這樣在platform_driver_register()註冊時會對所有登入的所platform_device中的name和當前註冊的platform_driver的driver.name進行比較,只有找到相同的名稱的platfomr_device才能註冊成功,當註冊成功時會調用platform_driver結構元素probe函數指標,這裡就是pxau2h_ehci_probe。

  當進入probe函數後,需要擷取裝置的資源資訊,擷取資源的函數有:

  struct resource * platform_get_resource(struct platform_device *dev, unsigned int type, unsigned int num);

  根據參數type所指定類型,例如IORESOURCE_MEM,來擷取指定的資源。

  struct int platform_get_irq(struct platform_device *dev, unsigned int num);

  擷取資源中的中斷號。

  struct resource * platform_get_resource_byname(struct platform_device *dev, unsigned int type, char *name);

  根據參數name所指定的名稱,來擷取指定的資源。

  int platform_get_irq_byname(structplatform_device *dev, char *name);

  根據參數name所指定的名稱,來擷取資源中的中斷號。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.