android MSM 上DeviceTree简介
简介
主要功能是不在代码中硬编码设备信息,而是用专门的文件来描述。整个系统的设备节点会形成一个树,设备节点里可以设置属性。官网在http://www.devicetree.org 。入门指南请参考http://www.devicetree.org/Device_Tree_Usage 。Linux上一些状况请参考"kernel/Document/devicetree/",其中"bindings"子目录描述各种设备的devicetree的描述方法,各厂商的各类设备的描述方法都可能不同。
MSM8974 上DeviceTree简介
设备描述源文件放在"kernel/arch/arm/boot/dts/"下后缀是".dts"或".dtsi",一般".dtsi"是被其它文件包含的,只用dtc编译".dts"文件。Build时会用"dtc"命令把需要的设备描述文件编译成".dtb"文件,并放到到bootimage的某个地方。对设备描述的解析处理实现主要在"kernel/drivers/of/"目录中,需要配置"CONFIG_OF"。启动过程中,bootloader(默认是bootable/bootloader/lk)会根据机器硬件信息选择合适的devicetree装入内存,把地址等相关信息传给kernel。kernel中,会根据传入的信息创建设备。
版本声明和包含其它文件
一般".dts"文件会先进行版本申明,如下面的第一行。".dts"或".dtsi"文件也可能包含其它".dtsi"文件,如下面的3/4行。
/dts-v1/;/include/ "msm8974-v2.2.dtsi" /include/ "msm8974-mtp.dtsi"
关于取地址符号的使用
如经常碰到类似下面的写法。没找到相关文档说明(看源码来理解也很费劲)。作用应该是对之前定义过的设备(例子中是"soc")进行补充描述。
&soc {android_usb@fe8050c8 {compatible = "qcom,android-usb";reg = <0xfe8050c8 0xc8>;qcom,android-usb-swfi-latency = <1>;};...... };
哪些文件被编入二进制映像
有两种方式使用DT。第一种可包含多个dtb,编入dt.img,放入boot.img。第二种只包含一个dtb,直接追加到kernelimage后面,放入boot.img。
dtc编译在kernel/AndroidKernel.mk中定义。先用定义"DTS_NAMES"变量,它的每个entry(记为"DTS_NAME"变量,下面的$$arch)中可能有arch和rev两部分,和.config中相关配置有关,用下面方法找出。
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
第二种方式没看到后续如何放入boot.img。对于第一种方式,会用"device/qcom/common/generate_extra_images.mk"中定义的下面规则编出"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目前实际用的应该是方式1。在下面boot_linux_from_mmc()中,调用dev_tree_get_entry_info(),里面会根据硬件(chipset和platform的id,系统实际跑时的信息在系统boot的更早阶段由N侧设置并传来,而DT中的信息由根节点的"qcom,msm-id"属性定义)来选择合适的DT,后面会把该DT装入内存,把地址等信息传给kernel(据说是通过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()中,会通过用各机器描述(machine description)的"dt_compat"属性和传入DT的根节点的"compatible"属性进行匹配来选择适当的machine description。会在下面board_dt_populate()处理中,会根据devicetree信息创建设备。
start_kernel()|setup_arch()|setup_machine_fdt()//select machine description according to DT infocustomize_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()时会在dev->dev.of_node中保存对DT中设备节点的引用。在驱动中,一般会增加下面用于设备和驱动匹配的".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()中会调用下面处理来进行设备和驱动的匹配。of_driver_match_device()中,一般会根据"compatible"属性来匹配(如果设了name或type,则先根据name/type匹配)。
if (of_driver_match_device(dev, drv))return 1;
下面是设备节点操作(一般是读取)的一些API。
of_property_read_string() of_find_property() of_get_next_child() of_get_parent()
android MSM 上DeviceTree简介相关推荐
- 【转】android MSM8974 上DeviceTree简介----不错
原文网址:http://blog.csdn.net/dongwuming/article/details/12784213 简介 主要功能是不在代码中硬编码设备信息,而是用专门的文件来描述.整个系统的 ...
- android dtb文件位置_android MSM8974 上DeviceTree简介
简介 主要功能是不在代码中硬编码设备信息,而是用专门的文件来描述.整个系统的设备节点会形成一个树,设备节点里可以设置属性.官网在http://www.devicetree.org .入门指南请参考ht ...
- MSM8974 上DeviceTree
主要功能是不在代码中硬编码设备信息,而是用专门的文件来描述.整个系统的设备节点会形成一个树,设备节点里可以设置属性.官网在http://www.devicetree.org .入门指南请参考http: ...
- 【Android 命令行工具】Android 命令行工具简介 ( 官方文档 | SDK 命令行工具 | SDK 构建工具 | SDK 平台工具 | 模拟器工具 | Jetifier 工具 )
文章目录 一.官方文档 二.Android 命令行工具简介 1.SDK 命令行工具 2.SDK 构建工具 3.SDK 平台工具 4.模拟器工具 5.Jetifier 工具 一.官方文档 Android ...
- java图像分类源码_在Android设备上使用NCNN图像分类的demo
[实例简介] 在Android设备上使用NCNN图像分类的demo,是一个Android项目 [实例截图] [核心代码] NCNN1 └── NCNN1 ├── app │ ├── app.iml ...
- Android Activity动画属性简介
Android Activity动画属性简介 在Android当中 设置activity的动画 需要复写 android:windowAnimationStyle这个属性 我们自定义一个动画样式来继承 ...
- 红橙Darren视频笔记 热更新 bsdiff bspatch 在Android设备上的应用 架构篇1完结篇
概述 当时红橙的视频讲解就差不多90分钟,但是真正自己做出来热更新的demo还是花了八九个晚上,期间遇到各种各样的问题,什么叫台上一分钟 台下十年功是深有体会了. 本节会涉及一部分NDK的知识 推荐阅 ...
- Android 12上焕然一新的小组件
/ 今日科技快讯 / 近日,电动汽车制造商特斯拉公布了2021年第三季度财报.财报显示,特斯拉第三季度营收137.6亿美元,同比增长57%:净利润16.2亿美元,同比增长389%:每股收益1. ...
- android初学者_初学者:如何在Android设备上的打开的应用程序之间切换
android初学者 When you run an app on your Android device, you can minimize it and return to the home sc ...
最新文章
- 常见JavaScript基础面试题上(附答案)
- PKI/CA (3)CA功能细分
- [转]数据库分库分表
- 财经计算机财务函数,会计财务最常用的15个公式函数
- 20145309 《网络对抗技术》信息搜集与漏洞扫描
- 拼多多:永远不会对孵化品牌“二选一” 扶持千家工厂触达4.4亿消费者
- Linux搭建虚拟专用,Ubuntu的发行版如何搭建虚拟专用网
- 海运业务常用缩略语 一
- servlet原理+流程图+简单实现案例(javaweb)
- linux xp双系统引导修复工具,双系统xp和linux xp重装后修复linux引导光盘修复方法...
- java数据结构源码_java 数据结构. 源代码阅读
- Oacle删除后注删表及其残留删除
- 哈啰单车JAVA面经
- 文件名的命名规则是什么
- java调用腾讯企业邮箱给谷歌(gmail)邮箱发送邮件丢失或进入垃圾邮箱
- 5、设备树操作reg
- 浏览器设置代理服务器插件SwitchyOmega配置
- mug网络用语_日常聊天常见网络用语(Daily chat common Internet slang).doc
- SNARK Design
- 如何躲避红蜘蛛的控制
热门文章
- 小羊手把手教你gcc gdb makefile
- C++ 异常机制深剖
- php 课文的 单词,英语课文生词的重点处理
- 华为畅享二十Android是,华为畅享8是什么系统_华为畅享8系统更新-太平洋IT百科...
- 【Halcon知识】select_contours_xld算子的环境
- Openwrt 搭建 PPTP 服务器
- webhook php 安全 权限,WebHook
- 那些争议最大的编程观点(转)
- Latex:entry type for “123“ isn‘t style-file defined及参考文献显示[?]的解决办法
- TP-LINK交换机安全配置的设置方法