1. 程式人生 > >u-boot 2016.7之乙太網驅動模型

u-boot 2016.7之乙太網驅動模型

        u-boot 2016.7引入了裝置樹(device tree) 和 驅動模型DM(driver model),這為裝置的驅動的定義和訪問

介面提供了統一的方法,提高了驅動之間的相容性和可移植性。具體建議參考/doc/driver-model/README.txt。

對於u-boot2016.7的乙太網絡驅動,也屬於DM應用的一個範例,此篇著重介紹u-boot2016.7的DM 模型及網路驅動

模型的細節,關於裝置樹(device tree)的相關細節,在後續篇章中進行介紹。

 1、使能DM功能

       在配置u-boot時,使能DM功能,即在/configs/xxx_defconfig中定義了:CONFIG_DM=y;

       在配置u-boot時,使能網路裝置的DM功能,即在/configs/xxx_defconfig中定義了:CONFIG_DM_NET=y;

2、DM整體框架

      DM 主要有udevice、dirver、uclass、uclass_dirver四部分組成,其中:

      udevice:是指裝置物件,類似可以理解為kernel中的device。

      dirver:是udevice的驅動,和底層硬體裝置通訊,並且為上層提供裝置操作介面。

      uclass:使用相同方式的操作集的device的組。相當於是一種抽象。uclass為使用相同介面的裝置提供了統一

                  的介面。

      uclass_dirver:對應uclass的驅動程式。主要提供uclass操作時,如bind和probe  udevice時的一些操作。

  其呼叫關係見圖1:

 

                                                   圖1

3、資料結構和dirver聲名

      DM 主要有udevice、dirver、uclass、uclass_dirver四部分組成,相應與之對應的有四個資料結構

      struct udevice、struct dirver、struct uclass、struct uclass_dirver。

      對於dirver和uclass_dirver的宣告,u-boot提供了:

  U_BOOT_DRIVER(xxx_gmac) = {
    .name    = "xxx_gmac",
    .id    = UCLASS_ETH,
    .of_match = xxx_gmac_ids,
    .ofdata_to_platdata = xxx_gmac_ofdata_to_platdata,
    .probe    = xxx_gmac_probe,
    .remove    = xxxgemac_remove,
    .ops    = &xxx_gmac_ops,
    .priv_auto_alloc_size = sizeof(struct xxx_priv),
    .platdata_auto_alloc_size = sizeof(struct eth_pdata),
  };

  和

  UCLASS_DRIVER(eth) = {
    .name        = "eth",
    .id        = UCLASS_ETH,
    .post_bind    = eth_post_bind,
    .pre_unbind    = eth_pre_unbind,
    .post_probe    = eth_post_probe,
    .pre_remove    = eth_pre_remove,
    .priv_auto_alloc_size = sizeof(struct eth_uclass_priv),
    .per_device_auto_alloc_size = sizeof(struct eth_device_priv),
    .flags        = DM_UC_FLAG_SEQ_ALIAS,
  };

4、u-boot 2016.7網路驅動模型

      一般乙太網的硬體原理框圖見圖2:

     

                               圖2

     乙太網的網路驅動模型是DM模型的具體體現,其模型框圖見圖3:

   

                           圖3

4、u-boot 2016.7網路初始化流程

      u-boot 2016.7的網路初始化流程見圖4:

     

                                                                   圖4

     其中xxx_gmac.c和xxx_phy_device.c是硬體平臺相關的檔案,xxx_gmac.c提供了gmac的對gmac的初始化和

     對gmac的操作介面及對phy晶片的配置,xxx_phy_device.c提供phy晶片的操作介面及向u-boot註冊phy裝置。

     當把u-boot移植到新平臺或新的板級平臺時,若u-boot中沒有整合相應的mac控制器驅動或phy晶片驅動時,

     需手動完成xxx_gmac.c和xxx_phy_device.c並新增。