如何编译高通kernal设备树

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何编译高通kernal设备树相关的知识,希望对你有一定的参考价值。

参考技术A   DTS (device tree source)
  .dts文件是一种ASCII 文本格式的Device
  Tree描述,此文本格式非常人性化,适合人类的阅读习惯。基本上,在ARM
  Linux在,一个。dts文件对应一个ARM的machine,一般放置在内核的arch/arm/boot/dts/目录。由于一个SoC可能对应多个machine(一个SoC可以对应多个产品和电路板),势必这些。dts文件需包含许多共同的部分,Linux内核为了简化,把SoC公用的部分或者多个machine共同的部分一般提炼为。dtsi,类似于C语言的头文件。其他的machine对应的。dts就include这个。dtsi。譬如,对于VEXPRESS而言,vexpress-v2m.dtsi就被vexpress-v2p-ca9.dts所引用,
  vexpress-v2p-ca9.dts有如下一行:
  /include/
  “vexpress-v2m.dtsi”
  当然,和C语言的头文件类似,。dtsi也可以include其他的。dtsi,譬如几乎所有的ARM
  SoC的。dtsi都引用了skeleton.dtsi。
  .dts(或者其include的。dtsi)基本元素即为前文所述的结点和属性:
  [plain] view
  plaincopyprint?
  /
  node1
  a-string-property = “A string”;
  a-string-list-property = “first string”, “second string”;
  a-byte-data-property = [0x01 0x23 0x34 0x56];
  child-node1
  first-child-property;
  second-child-property = <1>;
  a-string-property = “Hello, world”;
  ;
  child-node2
  ;
  ;
  node2
  an-empty-property;
  a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
  child-node1
  ;
  ;
  ;
  /
  node1
  a-string-property = “A string”;
  a-string-list-property = “first string”, “second string”;
  a-byte-data-property = [0x01 0x23 0x34 0x56];
  child-node1
  first-child-property;
  second-child-property = <1>;
  a-string-property = “Hello, world”;
  ;
  child-node2
  ;
  ;
  node2
  an-empty-property;
  a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
  child-node1
  ;
  ;
  ;
  上述。dts文件并没有什么真实的用途,但它基本表征了一个Device
  Tree源文件的结构:
  1个root结点“/”;
  root结点下面含一系列子结点,本例中为“node1” 和
  “node2”;
  结点“node1”下又含有一系列子结点,本例中为“child-node1” 和
  “child-node2”;
  各结点都有一系列属性。这些属性可能为空,如“
  an-empty-property”;可能为字符串,如“a-string-property”;可能为字符串数组,如“a-string-list-property”;可能为Cells(由u32整数组成),如“second-child-property”,可能为二进制数,如“a-byte-data-property”。
  下面以一个最简单的machine为例来看如何写一个。dts文件。假设此machine的配置如下:
  1个双核ARM
  Cortex-A9 32位处理器;
  ARM的local bus上的内存映射区域分布了2个串口(分别位于0x101F1000 和
  0x101F2000)、GPIO控制器(位于0x101F3000)、SPI控制器(位于0x10170000)、中断控制器(位于0x10140000)和一个external
  bus桥;
  External bus桥上又连接了SMC SMC91111
  Ethernet(位于0x10100000)、I2C控制器(位于0x10160000)、64MB NOR
  Flash(位于0x30000000);
  External bus桥上连接的I2C控制器所对应的I2C总线上又连接了Maxim
  DS1338实时钟(I2C地址为0x58)。
  其对应的。dts文件为:
  [plain] view
  plaincopyprint?
  /
  compatible = “acme,coyotes-revenge”;
  #address-cells = <1>;
  #size-cells = <1>;
  interrupt-parent = <&intc>;
  cpus
  #address-cells = <1>;
  #size-cells = <0>;
  cpu@0
  compatible = “arm,cortex-a9”;
  reg = <0>;
  ;
  cpu@1
  compatible = “arm,cortex-a9”;
  reg = <1>;
  ;
  ;
  serial@101f0000
  compatible = “arm,pl011”;
  reg = <0x101f0000 0x1000 >;
  interrupts = < 1 0 >;
  ;
  serial@101f2000
  compatible = “arm,pl011”;
  reg = <0x101f2000 0x1000 >;
  interrupts = < 2 0 >;
  ;
  gpio@101f3000
  compatible = “arm,pl061”;
  reg = <0x101f3000 0x1000
  0x101f4000 0x0010>;
  interrupts = < 3 0 >;
  ;
  intc: interrupt-controller@10140000
  compatible = “arm,pl190”;
  reg = <0x10140000 0x1000 >;
  interrupt-controller;
  #interrupt-cells = <2>;
  ;
  spi@10115000
  compatible = “arm,pl022”;
  reg = <0x10115000 0x1000 >;
  interrupts = < 4 0 >;
  ;
  external-bus
  #address-cells = <2>
  #size-cells = <1>;
  ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet
  1 0 0x10160000 0x10000 // Chipselect 2, i2c controller
  2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash
  ethernet@0,0
  compatible = “smc,smc91c111”;
  reg = <0 0 0x1000>;
  interrupts = < 5 2 >;
  ;
  i2c@1,0
  compatible = “acme,a1234-i2c-bus”;
  #address-cells = <1>;
  #size-cells = <0>;
  reg = <1 0 0x1000>;
  interrupts = < 6 2 >;
  rtc@58
  compatible = “maxim,ds1338”;
  reg = <58>;
  interrupts = < 7 3 >;
  ;
  ;
  flash@2,0
  compatible = “samsung,k8f1315ebm”, “cfi-flash”;
  reg = <2 0 0x4000000>;
  ;
  ;
  ;
  /
  compatible = “acme,coyotes-revenge”;
  #address-cells = <1>;
  #size-cells = <1>;
  interrupt-parent = <&intc>;
  cpus
  #address-cells = <1>;
  #size-cells = <0>;
  cpu@0
  compatible = “arm,cortex-a9”;
  reg = <0>;
  ;
  cpu@1
  compatible = “arm,cortex-a9”;
  reg = <1>;
  ;
  ;
  serial@101f0000
  compatible = “arm,pl011”;
  reg = <0x101f0000 0x1000 >;
  interrupts = < 1 0 >;
  ;
  serial@101f2000
  compatible = “arm,pl011”;
  reg = <0x101f2000 0x1000 >;
  interrupts = < 2 0 >;
  ;
  gpio@101f3000
  compatible = “arm,pl061”;
  reg = <0x101f3000 0x1000
  0x101f4000 0x0010>;
  interrupts = < 3 0 >;
  ;
  intc: interrupt-controller@10140000
  compatible = “arm,pl190”;
  reg = <0x10140000 0x1000 >;
  interrupt-controller;
  #interrupt-cells = <2>;
  ;
  spi@10115000
  compatible = “arm,pl022”;
  reg = <0x10115000 0x1000 >;
  interrupts = < 4 0 >;
  ;
  external-bus
  #address-cells = <2>
  #size-cells = <1>;
  ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet
  1 0 0x10160000 0x10000 // Chipselect 2, i2c controller
  2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash
  ethernet@0,0
  compatible = “smc,smc91c111”;
  reg = <0 0 0x1000>;
  interrupts = < 5 2 >;
  ;
  i2c@1,0
  compatible = “acme,a1234-i2c-bus”;
  #address-cells = <1>;
  #size-cells = <0>;
  reg = <1 0 0x1000>;
  interrupts = < 6 2 >;
  rtc@58
  compatible = “maxim,ds1338”;
  reg = <58>;
  interrupts = < 7 3 >;
  ;
  ;
  flash@2,0
  compatible = “samsung,k8f1315ebm”, “cfi-flash”;
  reg = <2 0 0x4000000>;
  ;
  ;
  ;
  上述。dts文件中,root结点“/”的compatible 属性compatible =
  “acme,coyotes-revenge”;定义了系统的名称,它的组织形式为:<manufacturer>,<model>。Linux内核透过root结点“/”的compatible
  属性即可判断它启动的是什么machine。
  在。dts文件的每个设备,都有一个compatible
  属性,compatible属性用户驱动和设备的绑定。compatible
  属性是一个字符串的列表,列表中的第一个字符串表征了结点代表的确切设备,形式为“<manufacturer>,<model>”,其后的字符串表征可兼容的其他设备。可以说前面的是特指,后面的则涵盖更广的范围。如在arch/arm/boot/dts/vexpress-v2m.dtsi中的Flash结点:
  [plain] view
  plaincopyprint?
  flash@0,00000000
  compatible = “arm,vexpress-flash”, “cfi-flash”;
  reg = <0 0x00000000 0x04000000>,
  <1 0x00000000 0x04000000>;
  bank-width = <4>;
  ;
  flash@0,00000000
  compatible = “arm,vexpress-flash”, “cfi-flash”;
  reg = <0 0x00000000 0x04000000>,
  <1 0x00000000 0x04000000>;
  bank-width = <4>;
  ;
  compatible属性的第2个字符串“cfi-flash”明显比第1个字符串“arm,vexpress-flash”涵盖的范围更广。
  再比如,Freescale
  MPC8349 SoC含一个串口设备,它实现了国家半导体(National Semiconductor)的ns16550
  寄存器接口。则MPC8349串口设备的compatible属性为compatible = “fsl,mpc8349-uart”,
  “ns16550”。其中,fsl,mpc8349-uart指代了确切的设备, ns16550代表该设备与National Semiconductor
  的16550
  UART保持了寄存器兼容。
  接下来root结点“/”的cpus子结点下面又包含2个cpu子结点,描述了此machine上的2个CPU,并且二者的compatible
  属性为“arm,cortex-a9”。
  注意cpus和cpus的2个cpu子结点的命名,它们遵循的组织形式为:<name>[@<unit-address>],<>中的内容是必选项,[]中的则为可选项。name是一个ASCII字符串,用于描述结点对应的设备类型,如3com
  Ethernet适配器对应的结点name宜为ethernet,而不是3com509。如果一个结点描述的设备有地址,则应该给出@unit-address。多个相同类型设备结点的name可以一样,只要unit-address不同即可,如本例中含有cpu@0、cpu@1以及serial@101f0000与serial@101f2000这样的同名结点。设备的unit-address地址也经常在其对应结点的reg属性中给出。ePAPR标准给出了结点命名的规范。

Linux-设备树编译器DTC

DTC编译器:设备树源码DTS文件编译为二进制文件DTB。

DTC编译器的作用:就是对设备树的源码的文件进行语法检查,根据linux的内核要求检查各个节点以及属性,将设备树源码编译生成二进制文件,以保证内核能启动。

DTC编译器源文件所在位置:/scripts/dtc/***

编译DTS:
在linux源代码的顶层目录下执行命令:make ARCH=arm CROSS_COMPILE=arm-linux- dtbs

生成DTB所在路径:

以上是关于如何编译高通kernal设备树的主要内容,如果未能解决你的问题,请参考以下文章

Linux内核设备树DTS

linux kernel下指定要编译的设备树 设备树与内核一起编译

Linux——Linux驱动之设备树编译环境搭建实践总结(设备树uboot内核编译及镜像烧写)

Linux——Linux驱动之设备树编译环境搭建实践总结(设备树uboot内核编译及镜像烧写)

Linux-设备树设备树

Linux-设备树编译器DTC