AM335X移植linux内核

来源:互联网 发布:在线互动课堂源码 编辑:程序博客网 时间:2024/06/10 13:01

为AM335x移植Linux内核主线代码——了解dts

转载 2015年01月10日 16:05:48
  • 1047
  • 编辑
  • 删除


问题一:以前的Linux Kernel如何描述硬件,现在又如何描述呢?


在以前的内核版本中:
1)内核包含了对硬件的全部描述;
2)bootloader会加载一个二进制的内核镜像,并执行它,比如uImage或者zImage;
3)bootloader会提供一些额外的信息,成为ATAGS,它的地址会通过r2寄存器传给内核;
    ATAGS包含了内存大小和地址,kernel command line等等;
4)bootloader会告诉内核加载哪一款board,通过r1寄存器存放的machine type integer;
5)U-Boot的内核启动命令:bootm 

6)Barebox变量:bootm.image (?)



现今的内核版本使用了Device Tree:
1)内核不再包含对硬件的描述,它以二进制的形式单独存储在另外的位置:the device tree blob
2)bootloader需要加载两个二进制文件:内核镜像和DTB
    内核镜像仍然是uImage或者zImage;
    DTB文件在arch/arm/boot/dts中,每一个board对应一个dts文件;
3)bootloader通过r2寄存器来传递DTB地址,通过修改DTB可以修改内存信息,kernel command line,以及潜在的其它信息;
4)不再有machine type;
5)U-Boot的内核启动命令:bootm 

6)Barebox变量:bootm.image,bootm.oftree


有些bootloader不支持Device Tree,或者有些专门给特定设备写的版本太老了,也不包含。为了解决这个问题,CONFIG_ARM_APPENDED_DTB被引进。
    它告诉内核,在紧跟着内核的地址里查找DTB文件;
    由于没有built-in Makefile rule来产生这样的内核,因此需要手动操作:
        cat arch/arm/boot/zImage arch/arm/boot/dts/myboard.dtb > my-zImage
        mkimage … -d my-zImage my-uImage
    (cat这个命令,还能够直接合并两个mp3文件哦!so easy!)
另外,CONFIG_ARM_ATAG_DTB_COMPAT选项告诉内核去bootloader里面读取ATAGS,并使用它们升级DT。

=============================================
问题二:现在Linux Kernel使用的Device Tree到底是个什么东东?

引用the Power.org Standard for Embedded Power Architecture Platform Requirements (ePAPR)的定义:
1)ePAPR使用device tree的概念描述硬件。boot程序会加载device tree到client program’s memory中,并将device tree的指针传递给client;
2)device tree是一个树形数据结构with nodes,用来描述系统的physical devices;
3)一个ePAPR-complient device tree描述的设备信息不能被client program读取;



From Source to binary
1)在ARM系统中,所有的DTS文件放置在arch/arm/boot/dts中:
    .dts文件为板级定义
    .dtsi文件为SoC级定义
2)Device Tree Compiler工具,将源代码编译成二进制形式;
    它的源代码放置在scripts/dtc中
3)编译器会产生DTB文件,bootloader会加载这个DTB文件,内核在boot时去解析它;
4)arch/arm/boot/dts/Makefile会指定产生哪个DTB文件;



上图是pdf里面自带的例子,我再从arch/arm/boot/dts/am33xxx.dtsi中摘录了两个:


view plaincopy to clipboardprint?
  1. uart0: serial@44e09000 {  
  2.                        compatible = ”ti,omap3-uart”;  
  3.                        ti,hwmods = ”uart1”;  
  4.                        clock-frequency =;  
  5.                        reg =;  
  6.                        interrupts =;  
  7.                        status = ”disabled”;  
  8.                };  
  9.   
  10.                uart1: serial@48022000 {  
  11.                        compatible = ”ti,omap3-uart”;  
  12.                        ti,hwmods = ”uart2”;  
  13.                        clock-frequency =;  
  14.                        reg =;  
  15.                        interrupts =;  
  16.                        status = ”disabled”;  
  17.                };  

对比图片中的注释,就能够知道对于uart0这个外设:
Node name: serial
Unit Address: 0x44e09000
compatible: 定义了设备的programming model,允许操作系统识别对应的程序驱动;
clock-frequency: 48000000,晶振频率为24MHz,这应该是PLL倍频后的输出(?);
reg: 寄存器的地址和寄存器长度,uart0的地址起始为0x44e09000,长度为0x2000;
interrupts: 中断号;
status: 状态值,初始的时候为disabled,即禁用它;

=============================================
问题三:Device Tree的编写规则是怎样的?

1)Device Tree inclusion不一定要做成monolithic,它们可以分散在不同的文件中,互相包含;
2).dtsi文件是被包含的,.dts文件才是最终的Device Trees;
3).dts文件包含了板级信息;
4)including工作主要是将including file覆盖到included file上面;
5)inclusion使用DT操作符/include/,或者在某些少量的内核发布版中,由于DTS是使用了C preprocessor,因此推荐#include。

由这张图可见,如果included file中的某项,被including file文件定义了,则会使用后者的定义,也就是使用更上层更新的定义;如果没有被定义,则添加进入。

1)bindings是device tree里面可已包含的specific types and classes of devices。
2)compatible特征描述了节点编译的specific binding;
3)当为一个设备创建新的device tree时,应该创建a binding来描述设备的全部细节。

=============================================
问题四:在哪里可以找到Device Tree的文档呢?

1)所有可被内核识别的Device Tree bindings在文档Documentation/devicetree/bindings里面;
2)每个binding文档描述了哪些properties可以被接受,可以使用哪些值,哪些特征是必须的,哪些是可选的;
3)所有新的Device Tree bindings必须让代码维护者审核,提交到devicetree@vger.kernel.org上。这用来保证它们的正确性和一致性。

=============================================
问题五:Device Tree中的常见关键字含义是什么?

Device Tree organization: top-level nodes
在设备的最顶层节点上,一般可以发现如下这些:
cpus:描述了系统的CPU
memory:定义了RAM的地址和大小
chosen:定义了boot时被系统固件选择或定义的参数;可用来传递kernel command line;
aliases:定义了certain nodes的shotcuts;
一个或多个总线定义;
一个或多个板上设备定义;

下面是am33xx.dtsi中的定义:


view plaincopy to clipboardprint?
  1. / {  
  2.         compatible = ”ti,am33xx”;  
  3.         interrupt-parent = <&intc>;  
  4.   
  5.         aliases {  
  6.                 i2c0 = &i2c0;  
  7.                 i2c1 = &i2c1;  
  8.                 i2c2 = &i2c2;  
  9.                 serial0 = &uart0;  
  10.                 serial1 = &uart1;  
  11.                 serial2 = &uart2;  
  12.                 serial3 = &uart3;  
  13.                 serial4 = &uart4;  
  14.                 serial5 = &uart5;  
  15.                 d_can0 = &dcan0;  
  16.                 d_can1 = &dcan1;  
  17.                 usb0 = &usb0;  
  18.                 usb1 = &usb1;  
  19.                 phy0 = &usb0_phy;  
  20.                 phy1 = &usb1_phy;  
  21.                 ethernet0 = &cpsw_emac0;  
  22.                 ethernet1 = &cpsw_emac1;  
  23.         };  
  24.   
  25.         cpus {  
  26.                 #address-cells =;  
  27.                 #size-cells =;  
  28.                 cpu@0 {  
  29.                         compatible = ”arm,cortex-a8”;  
  30.                         device_type = ”cpu”;  
  31.                         reg =;  
  32.                           
  33.                         /* 
  34.                          * To consider voltage drop between PMIC and SoC, 
  35.                          * tolerance value is reduced to 2% from 4% and 
  36.                          * voltage value is increased as a precaution. 
  37.                          */  
  38.                         operating-points = <  
  39.                                 /* kHz    uV */  
  40.                                 720000  1285000  
  41.                                 600000  1225000  
  42.                                 500000  1125000  
  43.                                 275000  1125000  
  44.                         >;  
  45.                         voltage-tolerance =; /* 2 percentage */  
  46.   
  47.                         clocks = <&dpll_mpu_ck>;  
  48.                         clock-names = ”cpu”;  
  49.                           
  50.                         clock-latency =; /* From omap-cpufreq driver */  
  51.                 };  
  52.         };  
  53.   
  54.         pmu {  
  55.                 compatible = ”arm,cortex-a8-pmu”;  
  56.                 interrupts =;  
  57.         };  
  58.   
  59.         /* 
  60.          * The soc node represents the soc top level view. It is used for IPs 
  61.          * that are not memory mapped in the MPU view or for the MPU itself. 
  62.          */  
  63.         soc {  
  64.                 compatible = ”ti,omap-infra”;  
  65.                 mpu {  
  66.                         compatible = ”ti,omap3-mpu”;  
  67.                         ti,hwmods = ”mpu”;  
  68.                 };  
  69.         };  
  70.   
  71.   
  72.     /* …… */  
  73.   
  74. };  





从上面的代码里面可以找出四个compatible,分别是:
top: compatible = “ti,am33xx”;
cpu0: compatible = “arm,cortex-a8”;
pmu: compatible = “arm,cortex-a8-pmu”;
soc: compatible = “ti,omap-infra”;

怎样使用compatible呢?
方法一是用来匹配DT_MACHINE结构体中的dt_compat域,方法二是使用of_machine_is_compatible函数。

在总线中,一般要定义compatile、#address-cells、#size-cells、ranges,比如:

view plaincopy to clipboardprint?
  1. i2c0: i2c@44e0b000 {  
  2.                compatible = ”ti,omap4-i2c”;  
  3.                #address-cells =;  
  4.                #size-cells =;  
  5.                ti,hwmods = ”i2c1”;  
  6.                reg =;  
  7.                interrupts =;  
  8.                status = ”disabled”;  
  9.        };  

&ldo3_reg是tps65217其中的一个输出。此描述表示tps65217的LDO3输出电平范围为1.8V~3.3V,并一直打开。

&sham 表示 SHA crypto Module!
&aes 表示 AES crypto Module!
(****找了半天也不知道这俩个东东到底是神马~?内存映射里面它们的地址也是reserved!)
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

总结:
maria_am335x.dts的内容非常少,因为大部分的描述并没有放置在这里,而是在更底层;
如果在这个文件里加入从未有过的描述,则描述会被添加;
如果在这个文建立加入底层已有的描述,则描述会覆盖底层;
这样的策略保证了底层的通用代码基本不需要修改,all you have to do,就是更改和你的板子相关的两个文件xx.dts和xx-common.dts!



(文章转载自edn博客 作者:MariannaZhu )

http://forum.eepw.com.cn/thread/262788/1



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 绿萝的叶子黄了怎么办 绿萝叶子烂了怎么办 还款协议签订后一方反悔怎么办 签了协议想反悔怎么办 体温计打碎了水银找不到了怎么办 模拟城市5核电站爆炸怎么办 日本地铁票丢了怎么办 在日本地铁票丢了怎么办 首付交了没合同怎么办 工程干完不给签合同怎么办 寄存密码纸丢了怎么办 超市柜子纸丢了怎么办 楼下有污水井味道怎么办 孕妇闻到了烧垃圾怎么办 楼下9米垃圾房怎么办 在工厂上班得了职业病怎么办 自来水被农药水污染了怎么办 雾霾天头疼恶心怎么办? 夫妻住宾馆一个没有身份证怎么办 医保报销后认定工伤怎么办 结肠癌术后复查有息肉怎么办 无蒂息肉恶变要怎么办 贤者时间很长怎么办 鸡吃了酒米醉了怎么办 自填脂肪乳房脂肪液化怎么办 中国人在外国遇到危险怎么办 dnf刷图卡住了怎么办 dbf深渊怪卡住了怎么办 dnf86级没任务了怎么办 dnf二觉任务没了怎么办 脚趾甲变空向上翘怎么办 汽油车加了一点柴油怎么办 柴油车辆环保检测功率不足怎么办 加95加错一次92怎么办 新车95加错92油怎么办 加不到95号汽油怎么办 去新疆没95号油怎么办 黄龙300加了92怎么办 gla错加92号油 怎么办 95和98混加了怎么办 沥青车可以停在居民区怎么办