文章目錄
- 1、U_BOOT_DRIVER
- 2、DM框架
- dm_scan_platdata
- dm_extended_scan_fdt
1、U_BOOT_DRIVER
使用這個宏可以定義一個驅動實例,宏定義是
其中使用的struct driver結構體
使用的ll_entry_declare宏定義是
歸結為
2、DM框架
1、 DM框架
DM模型抽象出了以下四個概念/數據結構
其中uclass是
使用UCLASS_DRIVER定義一個uclass driver,uclass_driver是uclass的驅動,并不是具體硬件的土洞,做一些uclass通用的準備/回收工作。
udevice 是具體的硬件實例,dts中配置了兩個硬件node,會有兩個udevice,例如dts中配置了兩個timer,就會有兩個timer udevice,uboot會將udevice和它所屬的uclass以及具體的驅動driver綁定起來。
driver 是具體硬件的驅動,對應每個硬件的驅動實現。使用U_BOOT_DRIVER定義一個驅動實例。
模型的全局數據結構
在 driver/core/root.h 和 root.c 文件中有 dm_init_and_scan 函數,進行dm框架的 init和設備樹掃描。
dm_init 過程中使用的宏定義
Uboot有兩種方式描述設備:①平臺數據;②設備樹方式。這店與Linux內核也一致。在dm_scan_platdata中,會掃描所有的平臺數據并綁定驅動程序,將掃描所有可用的平臺數據為每個數據創建驅動程序。
dm_scan_platdata
使用的lists_bind_drivers 函數,會搜索并將所有驅動程序綁定到父驅動程序,在文件drivers/core/lists.c中,傳入的DM_ROOT_NON_CONST宏是dm_root,udevice設備的跟節點,作為parents:
通過ll_entry_start 方式獲取內存中某個section的數據,
此處是獲取section(“.u_boot_list_2_driver_info_1”),在for循環中,獲取到section的start位置,通過ll_entry_count 計算section中的數量,在循環中逐個識別,并bind。
section(“.u_boot_list_2_driver_info_1”)
Struct driver_info 是 實例化設備所需的信息。通過map文件查看到driver_info聲明不多,大多數通過設備樹更新。
device_bind_by_name函數在drivers/core/device.c 文件中,parent變量是dm_root,global變量的root變量,info是當前section的driver_info。
在lists_driver_lookup_name 函數中,根據name從driver段中查找
section(“.u_boot_list_2_driver_1”)
根據u-boot.map文件可以查看到
全部的段,由1開始,3結束,中間的記錄都是 .u_boot_list_2_xxx_2_xxx 的格式。
dm_extended_scan_fdt
dm_scan_fdt函數分析
這個函數是如果u-boot配置了支持設備樹綁定設備驅動,那么將會執行該函數。dm_scan_fdt函數用于掃描設備樹,綁定驅動程序。這將掃描設備樹并為每個節點創建一個驅動程序(只檢查頂級子節點)。
和kernel的方法相似,通過match 屬性compatible進行配對