本篇主要是一些原理和架構的部份,實際應用時不需要太過深入,大概了解一下就可以
活动地址:CSDN21天学习挑战赛
學習計畫
1,學習目標
1.dtb解析與架構
2,學習內容
1.dtb解析
2.dtb 轉化為 device_node 結構
3.dts 架構下 device & driver 匹配流程
4.kernel 對 dts 的處理
5.dts解析 of function
3,學習時間
週一至週五晚上八至十點
4,學習產出
一週三篇
學習筆記
DTC版本
一般由廠商sdk包拿到的 dtc工具多數都是x86平台使用,可使用 readelf -h dtc 查看,無法執行在aarch64架構的m1 mac,所以必需自行安裝dtc,安裝完後可查看 Machine 如下為 aarch64.
#Ubuntu
sudo apt-get install device-tree-compiler
#MAC
brew install dtc
DTC使用方式
#dts -> dtb
dtc –I dts –O dtb –o xxx.dtb xxx.dts
#dtb -> dts
dtc –I dtb –O dts –o xxx.dts xxx.dtb
DTB Header
使用 fdtdump 可查看 dtb 文件之 head ,此 head 依 fdt_header 結構體描述,定義在 scripts\dtc\libfdt\fdt.h文件中
struct fdt_header {
fdt32_t magic; /* magic word FDT_MAGIC */
fdt32_t totalsize; /* total size of DT block */
fdt32_t off_dt_struct; /* offset to structure */
fdt32_t off_dt_strings; /* offset to strings */
fdt32_t off_mem_rsvmap; /* offset to memory reserve map */
fdt32_t version; /* format version */
fdt32_t last_comp_version; /* last compatible version */
/* version 2 fields below */
fdt32_t boot_cpuid_phys; /* Which physical CPU id we're booting on */
/* version 3 fields below */
fdt32_t size_dt_strings; /* size of the strings block */
/* version 17 fields below */
fdt32_t size_dt_struct; /* size of the structure block */
};
Device & Driver 匹配方式
board arch: 調用platform match fun,比對board_info 與 driver的name,match 就執行 probe.
dts: 一連串的流程最後在 _of_device_is_compatible function ,將 driver->of_device_id ->compatible 與 dts->node->compatible 進行字串加分制的比較,match 後會進行 probe ,如果 probe 失敗會進行unmount .