深入学习Linux Device Tree

这个世界需要的是全力以赴,战胜他人先战胜子自己!!

Linux Device Tree可描述的信息包括:

  1. cpu的数量和类型
  2. 内存基地址和大小
  3. 总线
  4. 外设
  5. 中断控制器
  6. GPIO控制器
  7. Clock控制器

bootloader会将这颗树传递给内核,内核根据它展开出linux内核中的platform_device,input_device,spi_device等设备,设备用到内存、GPIO、IRQ   等资源,也被传递到内核,内核将这些资源绑定给相应的设备。

学习的5个步骤,

  1. dts/dtsi
  2. device tree compiler工具,该工具将文本格式编译为二进制格式。
  3. bootloader 如何将指定的二进制格式写入指定的内存位置。
  4. 内核如何展开二进制文件,获取硬件设备信息。
  5. 驱动和设备如何注册。

描述文件存放路径: kernel/arch/arm/boot/dts

Device tree结构约定

Device tree 常用节点类型

所有device tree节点必须有1个根节点/, 还必须在根节点下有如下2个节点:

1、Cpu节点

2、memory节点  ---ePAPR规范指定了memory是必须的节点,名称也必须是memory。内存节点描述了系统物理内存的信息,如果系统中有多个内存范围,device tree中可能会创建多个内存节点,或者在一个单独的内存节点中通过reg属性指定内存的范围、

3、Chosen节点不代表一个真正的节点,只是传到参数的作用,chosen里的数据也不代表硬件。

4、Cpus节点

必须的节点,不代表真实设备,存放cpu节点的一个容器

5、cpu节点描述具体的硬件执行单元

6、soc节点表示一个系统级的芯片

文档  documentation/devicetree/bindings

DTC (compiler) 

源码位于scripts/dtc

scripts/dtc/Makefile--hostprogs-y:=dtc  //使能编译

Device Tree Blob (.dtb)

.dtb是.dts被DTC编译后的二进制格式的Device Tree描述,可由Linux内核解析。通常在为电路板制作NAND、SD启动image时,会为.dtb文件单独留下一个很小的区域以存放之,之后bootloader在引导kernel的过程中,会先读取该.dtb到内存。

初始化platform_device

如msm为例:

\arch\arm\mach-msm\board-8940.c

static const char *msm8940_dt_match[] __initconst = {

"qcom,msm8940",

NULL

};

static void __init msm8940_init(void)

{

board_dt_populate(NULL);

}

DT_MACHINE_START(MSM8940_DT,

"Qualcomm Technologies, Inc. MSM 8940 (Flattened Device Tree)")

.init_machine = msm8940_init,

.dt_compat = msm8940_dt_match,

MACHINE_END

\arch\arm\mach-msm\board-8940.c:

#include <linux/kernel.h>

#include <linux/of.h>

#include <linux/of_fdt.h>

#include "board-dt.h"

void __init board_dt_populate(struct of_dev_auxdata *adata)

{

of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);

/* Explicitly parent the /soc devices to the root node to preserve

* the kernel ABI (sysfs structure, etc) until userspace is updated

*/

of_platform_populate(of_find_node_by_path("/soc"),

of_default_bus_match_table, adata, NULL);

}

of_platform_populate 函数从device tree data中获取数据填充platform_device.

对驱动的影响  http://www.wowotech.net/linux_kenrel/dt-code-analysis.html

驱动中需要增加一个OF匹配表。驱动需要与.dts中描述的设备节点进行匹配,引发probe函数执行。

不采用DTS的驱动:

需要驱动注册平台设备和驱动,当match后执行probe。

使用DTS的驱动:

平台驱动注册过程中,会检查of_match_table中的设备是否和dts中解析出来的设备匹配,如果匹配则触发probe函数。

对BSP影响

以前ARM Linux针对不同的电路板会建立由MACHINE_START和MACHINE_END包围起来的针对这个machine的一系列callback,  如:kernel\arch\arm\mach-msm\board-msm8x60.c

MACHINE_START与MACHINE_END http://blog.csdn.net/cxw3506/article/details/8475965

使用DTS后,MACHINE_START变为DT_MACHINE_START, 其中含有.dt_compat成员,用于表明相关的machine与.dts中的root节点的compatible属性兼容关系。 如果Bootloader传递给内核的Device Tree中的root结点的compatible属性出现在某machine的.dt_compat表中,相关的machine就与对应的Device Tree匹配,从而引发这一machine的一系列初始化函数执行。

如:  kernel\arch\arm\mach-msm\board-8974.c

static const char *msm8974_dt_match[]  __initconst = {

"qcom,msm8974",

"qcom,apq8074",

NULL

};

DT_MACHINE_START(MSM8974_DT, "Qualcomm MSM 8974 (Flattened Device Tree)")

.map_io = msm8974_map_io,

.init_irq = msm_dt_init_irq,

.init_machine = msm8974_init,

.handle_irq = gic_handle_irq,

.timer = &msm_dt_timer,

.dt_compat = msm8974_dt_match,

.reserve = msm_8974_reserve,

.init_very_early = msm8974_init_very_early,

.restart = msm_restart,

.smp = &msm8974_smp_ops,

MACHINE_END

arch\arm\boot\dts\msm8974-v1-sim.dts

/dts-v1/;

/include/ "msm8974-v1.dtsi"

/include/ "msm8974-sim.dtsi"

/ {

model = "Qualcomm MSM 8974 Simulator";

compatible = "qcom,msm8974-sim", "qcom,msm8974", "qcom,sim";

qcom,msm-id = <126 16 0>,

<185 16 0>,

<186 16 0>;

};

Device tree 常用api

api 通常以of_为前缀,用于获取Device tree中的关键信息。实现位于:drivers/of目录。

DTS 例子如 :

drivers\pinctrl\qcom\pinctrl-msm8937.c  ==>>

\chips\msm8940\devices\msm8940_64\msm8937-pinctrl.dtsi

Android 驱动开发(14)---深入学习Linux Device Tree相关推荐

  1. 如何学习Android驱动开发

    如何成为一名优秀的Android驱动程序员?(参考之前看过的一篇文章总结出来的,不记得原文链接了)要求如下: 一.Android驱动的基础知识 1.Android驱动是基于Linux驱动,强烈推荐阅读 ...

  2. 对国产板子有阴影这些软硬件开源的ARM开发板可以学习Linux驱动

    对国产板子有阴影?这些软硬件开源的ARM开发板可以学习Linux驱动开发 为了点亮一块MIPI屏幕,我们除了要了解MIPI DSI的工作原理之外,大前提要了解整个MIPI DSI图显系统的组成,更需要 ...

  3. Android驱动开发全过程

    Android驱动开发全过程(有图有真相) 前言 意外在网上发现了这扁文章,看后感觉很有必要分享,所以整理并上传,希望大家喜欢. Android 硬件抽象层(HAL)概要介绍和学习计划 Android ...

  4. 初入android驱动开发之字符设备(一)

    大学毕业,初入公司,招进去的是android驱动开发工程师的岗位,那时候刚进去,首先学到的就是如何搭建kernel.android的编译环境,然后就是了解如何刷设备以及一些最基本的工具.如adb.fa ...

  5. Android 驱动(3)---Android驱动开发知识储备

    Android驱动开发知识储备 Android软件层次结构 (1)操作系统层 显示驱动(Frame Buffer),Flash内存驱动,照相机驱动,音频驱动,WiFi驱动,键盘驱动,蓝牙驱动,Bind ...

  6. Android驱动开发之陀螺仪(一)

    Android驱动开发之陀螺仪 开发平台:君正M200S 安卓系统:Android5.1 一.前言 很不容易,经过几天加班加点的调试,终于成功将MPU9250移植到这块板子上,在此记录下这个兴奋的时刻 ...

  7. STM32驱动开发(二)--USB Device RNDIS虚拟网卡(USB2.0 基础概念讲解)

    STM32驱动开发(二)–USB Device RNDIS虚拟网卡(USB2.0基础概念讲解) 一.简介   本文基于stm32 Rndis实例,github开源, 使用STM32F407单板.结合协 ...

  8. android驱动开发工程师,android驱动开发工程师

    android驱动开发工程师 任职资格: 1.精通android基础知识,熟悉android底层,了解frameworks层: 2.熟悉MTK.高通等手机或平板电脑平台,有调试MTK6735.MTK6 ...

  9. Android驱动开发之陀螺仪(三)

    Android驱动开发之陀螺仪(二) 五.安卓hal层驱动数据读取 使能陀螺仪后,由于我配置的是原始数据准备中断,所以陀螺仪数据一旦准备好,就会发送中断信号,之前在第二章已经分析过中断的注册流程,这里 ...

最新文章

  1. ubuntu服务器版编辑文件,Ubuntu 服务器版 18.04.4 固定 IP 设置
  2. 【通知】3月第二周直播预告,模型优化,人脸识别,图像增强核心技术与难题...
  3. 轻松为Windows系统快速配置多个网关
  4. HDU - 6769-In Search of Gold-二分+树形dp
  5. 伽利略板子串口驱动安装问题
  6. retinex算法原理
  7. 软件测试之软件测试方法
  8. linux alsa 不创建声卡能否创建pcm设备,Linux ALSA声卡驱动之一:声卡的创建
  9. java扩展类库_Java 类库和常用类库
  10. 摄像头黑屏等问题及解决方案汇总
  11. 几个不错的VC编程学习网站
  12. OpenStreetMap开放街道图(OSM)
  13. JAVA-GetDay
  14. 检测昵称是否含有敏感词汇
  15. 计算机组成原理的复习提纲,计算机组成原理复习提纲.doc
  16. vivado中设置多核编译
  17. 使用Excel计算财务NPV和内部收益率IRR
  18. 解决新安装的 Arch Linux 在 GNOME 中搜狗输入法不显示候选词和输入延迟的问题
  19. pr cpu100%_pr是什么意思 pr的意思是什么
  20. continue / break 跳出指定层循环

热门文章

  1. Linux根文件组织架构
  2. ILI9341液晶LCD彩色显示原理
  3. WordPress的MySQL宕_wordpress数据库mysql使用phpmyadmin打开数据表,提示table “xxx” doesn`t exist...
  4. 力扣453.最小操作次数使数组元素相等
  5. 微信小程序|开发实战篇之十二---order页面
  6. Maven项目中使用本地JAR包
  7. cx_Oracle模块
  8. 禁止ASP.NET MVC模型绑定时将空字符串绑定为null
  9. select、poll和epoll
  10. windows server 2012安装