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並新增。