简介

主要功能是不在代码中硬编码设备信息,而是用专门的文件来描述。整个系统的设备节点会形成一个树,设备节点里可以设置属性。官网在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 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()时会在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 dtb文件位置_android MSM8974 上DeviceTree简介相关推荐

  1. 【转】android MSM8974 上DeviceTree简介----不错

    原文网址:http://blog.csdn.net/dongwuming/article/details/12784213 简介 主要功能是不在代码中硬编码设备信息,而是用专门的文件来描述.整个系统的 ...

  2. android dtb文件位置_反编译andriod dtb.img 为dts

    平台:Android 7.1 使用到的工具:dtc 工具在kernel 路径下 scripts/dtc 编译完成后可有执行文件生成 dtc Usage: dtc [options] Options: ...

  3. android dtb文件位置_DTB/DTBO 分区  |  Android 开源项目  |  Android Open Source Project

    如果您的 DTB/DTBO 位于专属的分区(例如 dtb 和 dtbo 分区)中,请使用以下表格结构和头文件格式: 图 1. dtb/dtbo 分区布局示例(如需了解 AVB 签名相关信息,请参阅安全 ...

  4. MSM8974 上DeviceTree

    主要功能是不在代码中硬编码设备信息,而是用专门的文件来描述.整个系统的设备节点会形成一个树,设备节点里可以设置属性.官网在http://www.devicetree.org .入门指南请参考http: ...

  5. android MSM 上DeviceTree简介

    简介 主要功能是不在代码中硬编码设备信息,而是用专门的文件来描述.整个系统的设备节点会形成一个树,设备节点里可以设置属性.官网在http://www.devicetree.org .入门指南请参考ht ...

  6. android sdk文件位置,Android SDK文件夹位于何处?

    我通过Air for Android用Adobe Flash创建了一个.apk应用程序.现在,我想通过这款Blackberry在线打包机为黑莓App World做好准备:https://bdsc.we ...

  7. android 创建文件夹_Android 动画小记

    精简介绍Android中的动画,主要介绍用法. 动画种类 包括了:补间动画.逐帧动画.属性动画,前两者统称为视图动画. 补间动画 包括了平移.旋转.缩放和透明度四种,每种动画支持xml和代码设置.另外 ...

  8. android paint 圆角 绘制_Android系统上绘制圆角和阴影的几种姿势

    0x01 前言 在实际的开发工程中,对视图增加圆角和阴影效果的绘制是比较常见的需求,Android系统提供了一系列的方法以帮助开发者实现基础的视图圆角和阴影效果,但在面对实际的视觉需求时,想要完美达到 ...

  9. android 服务日志文件,Android系统日志文件位置

    有几种方法可以查看系统日志 – 但是查找日志文件的位置要比较困难.我将列出3个选项,允许您查看日志(在设备或计算机上),但我不知道它们保存在哪里.我可能错了,但从我收集的内容来看,Android系统并 ...

最新文章

  1. GridView 始终显示 Pager 分页行的一种方法
  2. SAP登陆界面TITLE修改方法(Method of SAP Logon GUI Title Modification)
  3. 设备选购需要注意的几个方面
  4. 图解Ubuntu中pidgin登陆IRC
  5. USACO Section 4
  6. python 3.5.2设计页面_怎么解决win10系统搭建Python 3.5.2开发环境的处理方案
  7. android_secure写权限,android.permission.WRITE_SECURE_SETTINGS权限报错
  8. 拳王虚拟项目公社:虚拟产品自动化4步走,小白自动盈利的第一桶金
  9. Nginx、Haproxy、LVS负载均衡从原理到部署(一)
  10. 幂级数 | 函数项级数、函数展开成幂级数(泰勒展开+麦克劳林展开)
  11. java调用fudannlp_利用FudanNLP进行新闻关键词提取
  12. bzoj5336: [TJOI2018]party【状压dp】
  13. HDU 5855 Less Time, More profit(最大权闭合图)
  14. specular高光贴图
  15. android开发播放声音文件
  16. adreno性能天梯图_深度学习之GPU显卡性能天梯图
  17. 用数据分析来挖掘一下大家最喜欢的抖音视频都有哪些...
  18. c++课程设计——班车管理系统
  19. libvirt调用c语言程序,libvirt库简介
  20. c语言在公共事业管理中的作用,公共事业管理专业(172页).doc

热门文章

  1. [翻译] Qt QFtp功能无法被Qt 5 Network系列模块替代的说明
  2. Ubuntu18 的日常
  3. 如何快速解决繁杂的国际化替换
  4. (转)所有iOS设备的屏幕分辨率
  5. R语言:求二维变量数学期望
  6. RedHat 关闭selinux
  7. 高性能WEB开发(6) - web性能测试工具推荐
  8. PHPROXY Encrypt 0.61
  9. AJAX开发简略 (转)
  10. 初探HTML5的本地存储