2015-04-23 09:21:10 embedsky510 阅读数 779

 本期TQ335X技术教程,由技术博主girlkoo编写,主要使用dtb方式启动LINUX内核的过程。采用DTB方式启动LINUX内核,主要在于使用dtb可以减少linux内核版本的数量。同一份linux 内核代码可以在多个板卡上运行,每个板卡可以使用自己的dtb文件。

  老式的u-boot使用ATAGS的方式启动linux内核,本文使用新式的dtb方式启动内核。

  我使用的内核是linux-3.17.2版本,下面开始编译内核。

 

  (1) 解压内核

  1. tar jxf linux-3.17.2.tar.bz2  

  (2)配置linux内核,由于am335x在内核中都归为omap2系列,故可以使用如下命令:

  1. make ARCH=arm omap2plus_defconfig  

  (3)编译内核:

  1. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- -j8  

  我的linux工具链前缀是arm-linux-gnueabi-,这个需要根据自己的实际的工具链情况进行替换。

 

  (4)编译dtb:

  1. make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- am335x-evm.dtb  

  (5)制作启动盘:

  将SD格式化为FAT系统,将MLO、u-boot.img拷贝到根目录下。

  在根目录下创建boot目录,将编译好的zImage和am335x-evm.dtb拷贝到该目录下。

 

  (6)u-boot命令行启动Linux内核

  1. load mmc 0 0x88000000 /boot/am335x-evm.dtb  
  2. load mmc 0 0x82000000 /boot/zImage  
  3. bootz 0x82000000 - 0x88000000  

  至此,Linux内核就能启动了。

 

  (7)小结

 

  从启动Log上分析,现在内核无法挂在根文件系统,在下一篇文章中,我会制作根文件系统。

 

2014-12-07 19:59:24 xiangshimoni 阅读数 3322

九、编译设备树dts为dtb

前面的linux内核源码目录中已经包含了设备树编译器Device Tree Compiler(dtc),在目录arch/arm/boot/dts/目录下。

将前面生成的xilinx.dts文件拷贝到ubuntu下,使用如下命令进行编译

dtc -I dts -O dtb -o devicetree.dtb xilinx.dts

上面Dtc编译器有几个选项和参数:

-I是输入文件格式,在本文中是dts

-O是目标文件格式,在本文中是dtb

-o是目标文件路径

最后一个参数是输入文件路径

编译之后会在目标文件路径生成一个dtb文件,这个文件名必须按照前面uboot默认配置中的文件进行命名,本文中是devicetree.dtb

 

至此,dtb文件生成完成。


十、制作根文件系统

为了发挥linux的强大功能,必须要挂载一个文件系统到linux上,嵌入式linux只挂载一个根文件系统,并不再挂载其他的文件系统。

根文件系统可以基于busybox进行制作,过程比较繁琐,本文不再赘述,读者可以在网络上查找资料。

为了正常进行实验,本文使用ZedBoard配套SD卡中自带的ramdisk8M.image.gz

读者可以使用gzip -d ramdisk8M.image.gz解压ramdisk镜像并挂载在某个目录下,在其中添加需要的功能后,再使用gizp -9 ramdisk8M.image 压缩回来。


2017-04-09 17:38:50 qq_33160790 阅读数 4885
在以前的内核版本中:
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。


2018-09-04 10:23:30 small_a_black 阅读数 1929

dtb 反向编译生成dts

在linux 开发driver 的时候,需要check 生成的dtb 文件是否符合预期,这个时候如果可以将build 生成的dtb 文件做反编译生成对应的dts文件,对于我们check 问题,将是很有帮助的:

./dtc -I dtb -O dts *.dtb -o *.dts

这就是反编译用到的命令。至于dtc 脚本的位置,可以到如下位置去找:

kernel-verion/scripts/dtc/

再多说一句,反编译生成的dts是所有dtsi、dts文件的merge后的总文件。

2016-06-29 23:02:13 l289123557 阅读数 20903

dtb文件格式

dtb文件的格式如下图
这里写图片描述
NOTE:不同部分顺序可能不一样

文件头boot_param_header

struct boot_param_header {
        u32     magic;----------------用于标dtb文件头,等于OF_DT_HEADER=“0xd00dfeed”
        u32     totalsize;------------dtb文件大小
        u32     off_dt_struct;--------DT structure偏移
        u32     off_dt_strings;-------DT strings偏移
        u32     off_mem_rsvmap;-------memory reserve map偏移
        u32     version;--------------版本号
        u32     last_comp_version;----兼容最早版本号

        /* version 2 fields below */
        u32     boot_cpuid_phys;------physical CPU id

        /* version 3 fields below */
        u32     size_dt_strings;------size of the strings block

        /* version 17 fields below */
        u32 size_dt_struct;-----------size of the DT structure block
};

保留内存memory reserve map

这段保存的是一个保留内存映射列表,每个表由一对64位的物理地址和大小组成

device-tree structure&strings

由于某些属性(比如compatible)在大多数节点下都会存在,为了减少dtb文件大小,就需要把这些属性字符串只指定一个存储位置即可,这样每个节点的属性只需要按照位置找到属性字符串的位置就可以得到是哪个属性,所以dtb把device-tree strings单独列出来存储,下图是device-tree structure的格式,节点嵌套节点
这里写图片描述
上面的宏定义如下

#define FDT_MAGIC   0xd00dfeed  /* 4: version, 4: total size */
#define FDT_TAGSIZE sizeof(uint32_t)

#define FDT_BEGIN_NODE  0x1     /* Start node: full name */
#define FDT_END_NODE    0x2     /* End node */
#define FDT_PROP    0x3     /* Property: name off,
                       size, content */
#define FDT_NOP     0x4     /* nop */
#define FDT_END     0x9

#define FDT_V1_SIZE (7*sizeof(uint32_t))
#define FDT_V2_SIZE (FDT_V1_SIZE + sizeof(uint32_t))
#define FDT_V3_SIZE (FDT_V2_SIZE + sizeof(uint32_t))
#define FDT_V16_SIZE    FDT_V3_SIZE
#define FDT_V17_SIZE    (FDT_V16_SIZE + sizeof(uint32_t))

总图
这里写图片描述

DTB和OF

阅读数 141

dtb文件的反向编译

阅读数 1186

没有更多推荐了,返回首页