android dtb文件位置_android MSM8974 上DeviceTree简介
簡介
主要功能是不在代碼中硬編碼設(shè)備信息,而是用專門的文件來描述。整個系統(tǒng)的設(shè)備節(jié)點(diǎn)會形成一個樹,設(shè)備節(jié)點(diǎn)里可以設(shè)置屬性。官網(wǎng)在http://www.devicetree.org?。入門指南請參考http://www.devicetree.org/Device_Tree_Usage?。Linux上一些狀況請參考"kernel/Document/devicetree/",其中"bindings"子目錄描述各種設(shè)備的devicetree的描述方法,各廠商的各類設(shè)備的描述方法都可能不同。
MSM8974 上DeviceTree簡介
設(shè)備描述源文件放在"kernel/arch/arm/boot/dts/"下后綴是".dts"或".dtsi",一般".dtsi"是被其它文件包含的,只用dtc編譯".dts"文件。Build時(shí)會用"dtc"命令把需要的設(shè)備描述文件編譯成".dtb"文件,并放到到bootimage的某個地方。對設(shè)備描述的解析處理實(shí)現(xiàn)主要在"kernel/drivers/of/"目錄中,需要配置"CONFIG_OF"。啟動過程中,bootloader(默認(rèn)是bootable/bootloader/lk)會根據(jù)機(jī)器硬件信息選擇合適的devicetree裝入內(nèi)存,把地址等相關(guān)信息傳給kernel。kernel中,會根據(jù)傳入的信息創(chuàng)建設(shè)備。
版本聲明和包含其它文件
一般".dts"文件會先進(jìn)行版本申明,如下面的第一行。".dts"或".dtsi"文件也可能包含其它".dtsi"文件,如下面的3/4行。/dts-v1/;
/include/ "msm8974-v2.2.dtsi"
/include/ "msm8974-mtp.dtsi"
關(guān)于取地址符號的使用
如經(jīng)常碰到類似下面的寫法。沒找到相關(guān)文檔說明(看源碼來理解也很費(fèi)勁)。作用應(yīng)該是對之前定義過的設(shè)備(例子中是"soc")進(jìn)行補(bǔ)充描述。&soc {
android_usb@fe8050c8 {
compatible = "qcom,android-usb";
reg = <0xfe8050c8 0xc8>;
qcom,android-usb-swfi-latency = <1>;
};
......
};
哪些文件被編入二進(jìn)制映像
有兩種方式使用DT。第一種可包含多個dtb,編入dt.img,放入boot.img。第二種只包含一個dtb,直接追加到kernelimage后面,放入boot.img。
dtc編譯在kernel/AndroidKernel.mk中定義。先用定義"DTS_NAMES"變量,它的每個entry(記為"DTS_NAME"變量,下面的$$arch)中可能有arch和rev兩部分,和.config中相關(guān)配置有關(guān),用下面方法找出。while (<>) {
$$a = $$1 if /CONFIG_ARCH_((?:MSM|QSD|MPQ)[a-zA-Z0-9]+)=y/;
$$r = $$1 if /CONFIG_MSM_SOC_REV_(?!NONE)(\w+)=y/;
$$arch = $$arch.lc("$$a$$r ") if /CONFIG_ARCH_((?:MSM|QSD|MPQ)[a-zA-Z0-9]+)=y/
} print $$arch;
得到上述"DTS_NAMES"變量,用"$(DTS_NAME)*.dts"方式去"kernel/arch/arm/boot/dts/"下匹配。見下面的定義,其中"cat"命令就是生成帶DT的kernelimage。define append-dtb
mkdir -p $(KERNEL_OUT)/arch/arm/boot;\
$(foreach DTS_NAME, $(DTS_NAMES), \
$(foreach d, $(DTS_FILES), \
$(DTC) -p 1024 -O dtb -o $(call DTB_FILE,$(d)) $(d); \
cat $(KERNEL_ZIMG) $(call DTB_FILE,$(d)) > $(call ZIMG_FILE,$(d));))
endef
如,msm8974的MR2的ES1版中,"DTS_NAMES"變量的值為"msm8974 msmsamarium",會編入的文件有。msm8974pro-ab-cdp.dts msm8974pro-ac-mtp.dts msm8974-v1-mtp.dts msm8974-v2.0-1-fluid.dts msm8974-v2.2-fluid.dts msmsamarium-sim.dts
msm8974pro-ab-fluid.dts msm8974-v1-cdp.dts msm8974-v1-rumi.dts msm8974-v2.0-1-liquid.dts msm8974-v2.2-liquid.dts
msm8974pro-ab-liquid.dts msm8974-v1-fluid.dts msm8974-v1-sim.dts msm8974-v2.0-1-mtp.dts msm8974-v2.2-mtp.dts
msm8974pro-ab-mtp.dts msm8974-v1-liquid.dts msm8974-v2.0-1-cdp.dts msm8974-v2.2-cdp.dts msmsamarium-rumi.dts
第二種方式?jīng)]看到后續(xù)如何放入boot.img。對于第一種方式,會用"device/qcom/common/generate_extra_images.mk"中定義的下面規(guī)則編出"dt.img",$(INSTALLED_DTIMAGE_TARGET): $(DTBTOOL) $(INSTALLED_KERNEL_TARGET)
$(build-dtimage-target)
在"build/core/Makefile"中用下面語句使它被編入boot.img。ifeq ($(strip $(BOARD_KERNEL_SEPARATED_DT)),true)
INTERNAL_BOOTIMAGE_ARGS += --dt $(INSTALLED_DTIMAGE_TARGET)
BOOTIMAGE_EXTRA_DEPS ?:= $(INSTALLED_DTIMAGE_TARGET)
endif
lk中的處理
8974目前實(shí)際用的應(yīng)該是方式1。在下面boot_linux_from_mmc()中,調(diào)用dev_tree_get_entry_info(),里面會根據(jù)硬件(chipset和platform的id,系統(tǒng)實(shí)際跑時(shí)的信息在系統(tǒng)boot的更早階段由N側(cè)設(shè)置并傳來,而DT中的信息由根節(jié)點(diǎn)的"qcom,msm-id"屬性定義)來選擇合適的DT,后面會把該DT裝入內(nèi)存,把地址等信息傳給kernel(據(jù)說是通過CPU寄存器)。qcom,msm-id = <126 8 0x20002>,
<185 8 0x20002>,
<186 8 0x20002>;kmain()
|bootstrap2()
|arch_init()
|platform_init()
|target_init()
|apps_init()//call init() of APPs defined using APP_START macro
|aboot_init()
|boot_linux_from_mmc()
|//for device tree approach 1
|dev_tree_get_entry_info()
|__dev_tree_get_entry_info()
|memmove((void *)hdr->tags_addr, (char *)dt_table_offset + dt_entry.offset, dt_entry.size);
|//for device tree approach 2
|dev_tree_appended()
|boot_linux()
|update_device_tree()
|entry(0, machtype, (unsigned*)tags_phys);//pass control to kernel
kernel中的處理
在下面的setup_machine_fdt()中,會通過用各機(jī)器描述(machine description)的"dt_compat"屬性和傳入DT的根節(jié)點(diǎn)的"compatible"屬性進(jìn)行匹配來選擇適當(dāng)?shù)膍achine description。會在下面board_dt_populate()處理中,會根據(jù)devicetree信息創(chuàng)建設(shè)備。start_kernel()
|setup_arch()
|setup_machine_fdt()//select machine description according to DT info
customize_machine()//called because it is an arch_initcall
|msm8974_init()
|board_dt_populate()
|of_platform_bus_create()
|of_platform_device_create_pdata()
|of_device_alloc()
|dev->dev.of_node = of_node_get(np);//pointer to data of struct device_node, that is device node in DT
|of_platform_bus_create()//call it recursively to walk through the DT
上面of_device_alloc()時(shí)會在dev->dev.of_node中保存對DT中設(shè)備節(jié)點(diǎn)的引用。在驅(qū)動中,一般會增加下面用于設(shè)備和驅(qū)動匹配的".of_match_table"信息。static struct of_device_id msm_otg_dt_match[] = {
{.compatible = "qcom,hsusb-otg",
},
{}
};
static struct platform_driver msm_otg_driver = {
.remove = __devexit_p(msm_otg_remove),
.driver = {
......
.of_match_table = msm_otg_dt_match,
},
};
在kernel/drivers/base/platform.c的platform_match()中會調(diào)用下面處理來進(jìn)行設(shè)備和驅(qū)動的匹配。of_driver_match_device()中,一般會根據(jù)"compatible"屬性來匹配(如果設(shè)了name或type,則先根據(jù)name/type匹配)。if (of_driver_match_device(dev, drv))
return 1;
下面是設(shè)備節(jié)點(diǎn)操作(一般是讀取)的一些API。of_property_read_string()
of_find_property()
of_get_next_child()
of_get_parent()
總結(jié)
以上是生活随笔為你收集整理的android dtb文件位置_android MSM8974 上DeviceTree简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue 分模块打包 脚手架_vue-cl
- 下一篇: adcclk最大_STM32 ADC转换