嵌入式Linux--设备树(二)设备树模板

太过爱你忘了你带给我的痛 2022-12-31 01:10 429阅读 0赞

目录

  • 1、添加cpus节点
  • 2、添加soc节点
  • 3、添加ocram节点
  • 4、添加aips1,aips2和aips3这三个子节点
  • 5、添加ecspi1,usbotg1和rngb这三个外设控制器节点

 在上面DTS 的语法做了比较详细的讲解,这里就根据前面讲解的语法,从头到尾编写一个小型的设备树文件。当然了,这个小型设备树没有实际的意义,做这个的目的是为了掌握设备树的语法。在实际产品开发中,我们是不需要完完全全的重写一个.dts 设备树文件,一般都是使用 SOC 厂商提供好的.dts 文件,我们只需要在上面根据自己的实际情况做相应的修改即可。在编写设备树之前要先定义一个设备,我们就以 I.MX6ULL 这个 SOC 为例,我们需要在设备树里面描述的内容如下:

  • ①、I.MX6ULL 这个 Cortex-A7 架构的 32 位 CPU。
  • ②、I.MX6ULL 内部 ocram,起始地址 0x00900000,大小为128KB(0x20000)。
  • ③、I.MX6ULL 内部 aips1 域下的 ecspi1 外设控制器,寄存器起始地址为 0x02008000,大小为 0x4000。
  • ④、I.MX6ULL 内部 aips2 域下的 usbotg1 外设控制器,寄存器起始地址为 0x02184000,大小为 0x4000。
  • ⑤、I.MX6ULL 内部 aips3 域下的 rngb 外设控制器,寄存器起始地址为 0x02284000,大小为 0x4000。

 为了简单起见,我们就在设备树里面就实现这些内容即可,首先,搭建一个仅含有根节点“/”的基础的框架,新建一个名为 myfirst.dts 文件,在里面输入如下所示内容:

  1. / {
  2. compatible = "fsl,imx6ull-alientek-evk", "fsl,imx6ull";
  3. }

 设备树框架很简单,就一个根节点“/”,根节点里面只有一个 compatible 属性。我们就在这个基础框架上面将上面列出的内容一点点添加进来。

1、添加cpus节点

 首先添加CPU节点,I.MX6ULL采用Cortex-A7架构,而且只有一个CPU,因此只有一个cpu0节点,完成以后如下:

  1. / {
  2. compatible = "fsl,imx6ull-alientek-evk", "fsl,imx6ull";
  3. cpus {
  4. #address-cells = <1>;
  5. #size-cells = <0>;
  6. //CPU0节点
  7. cpu0: cpu@0 {
  8. compatible = "arm,cortex-a7";
  9. device_type = "cpu";
  10. reg = <0>;
  11. };
  12. };
  13. }

 cpus节点,次节点用于描述SOC内部的所有CPU,因为I.MX6ULL只有一个CPU,因此只有一个cpu0子节点。

2、添加soc节点

 如uart,iic控制器等等这些都属于SOC内部外设,因此一般会创建一个叫做soc的父节点来管理这些SOC内部外设的子节点,添加soc节点以后的文件如:

  1. / {
  2. compatible = "fsl,imx6ull-alientek-evk", "fsl,imx6ull";
  3. cpus {
  4. #address-cells = <1>;
  5. #size-cells = <0>;
  6. //CPU0节点
  7. cpu0: cpu@0 {
  8. compatible = "arm,cortex-a7";
  9. device_type = "cpu";
  10. reg = <0>;
  11. };
  12. };
  13. // soc节点
  14. soc {
  15. #address-cells = <1>;
  16. #size-cells = <1>;
  17. compatible = "simple-bus";
  18. ranges;
  19. };
  20. }
  • soc 节点,soc 节点设置#address-cells = <1>,#size-cells = <1>,这样 soc 子节点的 reg 属性中起始地占用一个字长,地址空间长度也占用一个字长。
  • ranges 属性,ranges 属性为空,说明子空间和父空间地址范围相同。

3、添加ocram节点

 添加 ocram 节点,ocram 是 I.MX6ULL 内部 RAM,因此 ocram 节点应该是 soc 节点的子节点。ocram 起始地址为 0x00900000,大小为 128KB(0x20000),添加 ocram节点以后文件内容如下所示:

  1. / {
  2. compatible = "fsl,imx6ull-alientek-evk", "fsl,imx6ull";
  3. cpus {
  4. #address-cells = <1>;
  5. #size-cells = <0>;
  6. //CPU0节点
  7. cpu0: cpu@0 {
  8. compatible = "arm,cortex-a7";
  9. device_type = "cpu";
  10. reg = <0>;
  11. };
  12. };
  13. // soc节点
  14. soc {
  15. #address-cells = <1>;
  16. #size-cells = <1>;
  17. compatible = "simple-bus";
  18. ranges;
  19. // ocram 节点
  20. ocram: sram@00900000 {
  21. compatible = "fsl,lpm-sram";
  22. reg = <0x00900000 0x20000>;
  23. };
  24. };
  25. }
  • ocram 节点,第 24 行节点名字@后面的 0x00900000 就是 ocram 的起始地址。
  • reg 属性也指明了 ocram 内存的起始地址为 0x00900000,大小为 0x20000。

4、添加aips1,aips2和aips3这三个子节点

 I.MX6ULL 内部分为三个域:aips13,这三个域分管不同的外设控制器,aips13 这三个域对应的内存范围如下所示:


























起始地址 大小(hex)
AIPS1 0x02000000 0x100000
AIPS2 0x02100000 0x100000
AIPS3 0x02200000 0x100000

 我们先在设备树中添加这三个域对应的子节点。aips1~3这三个域都属于soc节点的子节点,完成以后的文件内容如下所示:

  1. / {
  2. compatible = "fsl,imx6ull-alientek-evk", "fsl,imx6ull";
  3. cpus {
  4. #address-cells = <1>;
  5. #size-cells = <0>;
  6. //CPU0节点
  7. cpu0: cpu@0 {
  8. compatible = "arm,cortex-a7";
  9. device_type = "cpu";
  10. reg = <0>;
  11. };
  12. };
  13. // soc节点
  14. soc {
  15. #address-cells = <1>;
  16. #size-cells = <1>;
  17. compatible = "simple-bus";
  18. ranges;
  19. // ocram 节点
  20. ocram: sram@00900000 {
  21. compatible = "fsl,lpm-sram";
  22. reg = <0x00900000 0x20000>;
  23. };
  24. // aips1 节点
  25. aips1: aips-bus@02000000 {
  26. compatible = "fsl,aips-bus","simple-bus";
  27. #address-cells = <1>;
  28. #size-cells = <1>;
  29. reg = <0x2000000 0x100000>;
  30. ranges;
  31. };
  32. // aips2 节点
  33. aips2: aips-bus@02100000 {
  34. compatible = "fsl,aips-bus","simple-bus";
  35. #address-cells = <1>;
  36. #size-cells = <1>;
  37. reg = <0x2100000 0x100000>;
  38. ranges;
  39. };
  40. // aips3 节点
  41. aips3: aips-bus@02200000 {
  42. compatible = "fsl,aips-bus","simple-bus";
  43. #address-cells = <1>;
  44. #size-cells = <1>;
  45. reg = <0x2200000 0x100000>;
  46. ranges;
  47. };
  48. };
  49. }

5、添加ecspi1,usbotg1和rngb这三个外设控制器节点

 最后我们在 myfirst.dts 文件中加入 ecspi1,usbotg1 和 rngb 这三个外设控制器对应的节点,其中 ecspi1 属于 aips1 的子节点,usbotg1 属于 aips2 的子节点,rngb 属于 aips3 的子节点。最终的文件内容如下:

  1. / {
  2. compatible = "fsl,imx6ull-alientek-evk", "fsl,imx6ull";
  3. cpus {
  4. #address-cells = <1>;
  5. #size-cells = <0>;
  6. //CPU0节点
  7. cpu0: cpu@0 {
  8. compatible = "arm,cortex-a7";
  9. device_type = "cpu";
  10. reg = <0>;
  11. };
  12. };
  13. // soc节点
  14. soc {
  15. #address-cells = <1>;
  16. #size-cells = <1>;
  17. compatible = "simple-bus";
  18. ranges;
  19. // ocram 节点
  20. ocram: sram@00900000 {
  21. compatible = "fsl,lpm-sram";
  22. reg = <0x00900000 0x20000>;
  23. };
  24. // aips1 节点
  25. aips1: aips-bus@02000000 {
  26. compatible = "fsl,aips-bus","simple-bus";
  27. #address-cells = <1>;
  28. #size-cells = <1>;
  29. reg = <0x2000000 0x100000>;
  30. ranges;
  31. // ecspi1 节点
  32. ecspi1: ecspi@02008000 {
  33. #address-cells = <1>;
  34. #size-cells = <1>;
  35. compatible = "fsl,imx6ul-ecspi", "fsl,imx51-ecspi";
  36. reg = <0x02008000 0x4000>;
  37. status = "disabled";
  38. };
  39. };
  40. // aips2 节点
  41. aips2: aips-bus@02100000 {
  42. compatible = "fsl,aips-bus","simple-bus";
  43. #address-cells = <1>;
  44. #size-cells = <1>;
  45. reg = <0x2100000 0x100000>;
  46. ranges;
  47. // usbotg1 节点
  48. usbotg1: usb@02184000 {
  49. compatible = "fsl,imx6ul-usb","fsl,imx27-usb";
  50. reg = <0x02184000 0x200>;
  51. status = "disabled";
  52. };
  53. };
  54. // aips3 节点
  55. aips3: aips-bus@02200000 {
  56. compatible = "fsl,aips-bus","simple-bus";
  57. #address-cells = <1>;
  58. #size-cells = <1>;
  59. reg = <0x2200000 0x100000>;
  60. ranges;
  61. // rngb 节点
  62. rngb: rngb@02284000 {
  63. compatible = "fsl,imx6sl-rng","fsl,imx-rng","imx-rng";
  64. reg = <0x02284000 0x4000>;
  65. };
  66. };
  67. };
  68. }
  • ecspi1 外设控制器节点(SPI外设)。
  • usbotg1 外设控制器节点(OTG外设)。
  • rngb 外设控制器节点(RNGB屏外设)。

 至此,这个小型的模板设备树就编写好了,基本和 imx6ull.dtsi 很像,可以看做是 imx6ull.dtsi 的缩小版。在上面我们仅仅是编写了 I.MX6ULL 的外设控制器节点,像 IIC 接口,SPI 接口下所连接的具体设备我们并没有写,因为具体的设备其设备树属性内容不同,这个等到具体的实验在详细讲解。

发表评论

表情:
评论列表 (有 0 条评论,429人围观)

还没有评论,来说两句吧...

相关阅读

    相关 设备

    本文将介绍如何为一个新机器编写设备树。我们准备提供一个有关设备树概念的概述和如何使用这些设备树来描述一个机器。完整的设备树数据格式的技术说明书请参考ePAPR规范。ePA

    相关 Linux设备详解

    ARM Linux社区为什么要引入设备树 Linux之父Linus Torvalds闲来无事,在翻看ARM Linux代码的时候,有一天终于忍不住了。他在2011年3月17日

    相关 Linux 设备介绍

    > 设备树的历史 > > 1、kernel最早加入设备树的历史得追溯到v2.6.23,从这个版本开始,在driver目录下多了一个of目录。当然,此时只是引入一些新想法而已。