目录

  • uboot处理dtb

    • 传递参数给内核
    • dtb 地址选择
    • dtb修改
    • 移植fdt


title: uboot处理dtb
date: 2019/4/28 17:18:19
toc: true
---

uboot处理dtb

传递参数给内核

之前在分析内核启动参数的时候,可以看到内核处理的dtb的地址是原来atag的地址也就是R2,所以就是在转入kernel参数为的第3个为dtb地址即可

我们的uboot是这么启动的

  bootm <uImage_addr>                            // 无设备树,bootm 0x30007FC0bootm <uImage_addr> <initrd_addr> <dtb_addr>   // 有设备树 

所以就是讲第4个参数读取并转换即可

/* 100ask for device tree, no initrd image used */
if (argc == 4) {//第三个参数0x32000000就是设备树地址of_flat_tree = (char *) simple_strtoul(argv[3], NULL, 16);if  (be32_to_cpu(*(ulong *)of_flat_tree) == OF_DT_HEADER) {printf ("\nStarting kernel with device tree at 0x%x...\n\n", of_flat_tree);cleanup_before_linux ();//把dtb的地址传到r2寄存器里           theKernel (0, bd->bi_arch_number, of_flat_tree);} else {printf("Bad magic of device tree at 0x%x!\n\n", of_flat_tree);}}

最终的启动流程如下

  nand read.jffs2 0x30007FC0 kernel;     // 读内核uImage到内存0x30007FC0nand read.jffs2 32000000 device_tree;  // 读dtb到内存32000000bootm 0x30007FC0 - 0x32000000          // 启动, 没有initrd时对应参数写为"-"

dtb 地址选择

使用mkimage -l arch/arm/boot/uImage来查看内核的加载地址,然后放置到正确的位置

  • 不要破坏u-boot本身
  • 内核本身的空间不能占用, 内核要用到的内存区域也不能占用
  • 内核启动时一般会在它所处位置的下边放置页表, 这块空间(一般是0x4000即16K字节)不能被占用
                    ------------------------------0x33f80000       ->|    u-boot                  | 分析lds链接文件------------------------------|    u-boot所使用的内存(栈等)|------------------------------|                            ||                            ||        空闲区域            ||                            ||                            ||                            ||                            |------------------------------0x30008000       ->|      zImage                |------------------------------  uImage = 64字节的头部+zImage0x30007FC0       ->|      uImage头部            |------------------------------0x30004000       ->|      内核创建的页表        |  head.S------------------------------|                            ||                            |-----> ------------------------------||--- (内存基址 0x30000000)

正确操作

nand read.jffs2 30000000 device_tree
nand read.jffs2 0x30007FC0 kernel
bootm 0x30007FC0 - 30000000    

破坏页表不能启动哦

nand read.jffs2 30004000 device_tree
nand read.jffs2 0x30007FC0 kernel
bootm 0x30007FC0 - 30004000

dtb修改

dtb的二进制文件还算简单,可以直接来修改即可,具体的修改就是要注意一些字节长度和偏移

具体的步骤简述一下,我觉得没必要搞,还是dts文件方便

例子1. 修改属性的值,
假设 老值: len新值: newlen (假设newlen > len)a. 把原属性val所占空间从len字节扩展为newlen字节:把老值之后的所有内容向后移动(newlen - len)字节
b. 把新值写入val所占的newlen字节空间
c. 修改dtb头部信息中structure block的长度: size_dt_struct
d. 修改dtb头部信息中string block的偏移值: off_dt_strings
e. 修改dtb头部信息中的总长度: totalsize例子2. 添加一个全新的属性
a. 如果在string block中没有这个属性的名字,就在string block尾部添加一个新字符串: 属性的名并且修改dtb头部信息中string block的长度: size_dt_strings修改dtb头部信息中的总长度: totalsize
b. 找到属性所在节点, 在节点尾部扩展一块空间, 内容及长度为: TAG      // 4字节, 对应0x00000003len      // 4字节, 表示属性的val的长度nameoff  // 4字节, 表示属性名的offsetval      // len字节, 用来存放val
c. 修改dtb头部信息中structure block的长度: size_dt_struct
d. 修改dtb头部信息中string block的偏移值: off_dt_strings
e. 修改dtb头部信息中的总长度: totalsize

移植fdt

uboot也有现成的源代码,需要移植,具体错误可以参考

cmd/fdt.c
在编译文件时可以用"-I"选项指定头文件目录
比如: arm-linux-gcc -I <dir> -c -o ....,对于u-boot来说, 一般就是源码的include目录。

常用命令如下

nand read.jffs2 32000000 device_tree  // 从flash读出dtb文件到内存(0x32000000)
fdt addr 32000000                     // 告诉fdt, dtb文件在哪
fdt print /led pin                    // 打印/led节点的pin属性
fdt get value XXX /led pin            // 读取/led节点的pin属性, 并且赋给环境变量XXX
print XXX                             // 打印环境变量XXX的值
fdt set /led pin <0x00050005>         // 设置/led节点的pin属性
fdt print /led pin                    // 打印/led节点的pin属性
nand erase device_tree                // 擦除flash分区
nand write.jffs2 32000000 device_tree // 把修改后的dtb文件写入flash分区

转载于:https://www.cnblogs.com/zongzi10010/p/10793084.html

uboot处理dtb相关推荐

  1. 修改MfgTool 工具并通过 USB OTG 口来烧写自己制作的uboot\rootfs\.dtb\zImage文件

    一.改造烧写环境 MfgTool 是通过 USB OTG 接口将系统烧写进 EMMC 中,用usb连接电脑和USB OTG 接口 把拨码开关拨到 USB 下载模式,需要弹出tf或sd卡 打开" ...

  2. U-Boot 之一 零基础编译 U-Boot 过程详解、Image 镜像介绍及使用说明、DTB 文件使用说明

      最近,工作重心要从裸机开发转移到嵌入式 Linux 系统开发,在之前的博文 Linux 之八 完整嵌入式 Linux 环境.(交叉)编译工具链.CPU 体系架构.嵌入式系统构建工具 中详细介绍了嵌 ...

  3. 奇小葩讲设备树(3/5)-- Linux设备树详解(三)u-boot设备树的传递

    前面两节介绍了设备的基本概念.编译.结构的组成,本章讨论的主要内容为 dtb如何通过Bootloader引导程序加载到内核 bootloader如何解析dbt bootloader支持哪些dtb的操作 ...

  4. Exynos4412 Uboot 的使用与烧写

    Uboot版本:u-boot-2013.01 开发板:Exynos4412 本文主要是熟悉U-boot 的使用以及如何将Uboot 烧入Exynos4412.当然在这之前首先必须保证开发板上已经有了U ...

  5. 移植u-boot.2012.04.01

    /*************************************************** *u-boot版本:u-boot2012.04.01 *gcc版本:arm-linux-gcc ...

  6. MT7621_移植篇(3) uboot编译+配置项分析

    U-Boot("通用引导加载程序",通常简称为U-Boot)是一种开源的主引导加载程序,用于嵌入式设备中打包引导设备操作系统内核的指令.它可用于多种计算机架构,包括68k.ARM. ...

  7. U-Boot 之零 源码文件、启动阶段(TPL、SPL)、FALCON、设备树

      最近,工作重心要从裸机开发转移到嵌入式 Linux 系统开发,在之前的博文 Linux 之八 完整嵌入式 Linux 环境.(交叉)编译工具链.CPU 体系架构.嵌入式系统构建工具 中详细介绍了嵌 ...

  8. v3S编译大全(uboot 主线linux buildroot)

    文章目录 一.github代理下载 二.Uboot 1.uboot下载 2.uboot的基本结构 3.uboot配置屏幕 4.修改可以从tf卡启动 5.配置 6.编译 6.烧录测试 1.进入 fel ...

  9. lichee pi zero 荔枝派zero uboot编译 烧录

    ubuntu 18.04 1.准备uboot源码和交叉编译工具链 交叉编译工具链网盘地址:http://pan.baidu.com/s/1hsf22fq tar xvf gcc-linaro-6.3. ...

最新文章

  1. 你要的2019最全目标检测都在这里啦!
  2. 竞赛 | 我们标注了34G真实线下门店数据,等你pick!
  3. MCS-51系列特殊功能寄存器(摘抄)
  4. 用户被忽悠 微软黑屏计划推至21日0点实施
  5. 批处理命令 / cd
  6. LeetCode 250. Count Univalue Subtrees
  7. 综合布线工作组2009年工作简报
  8. sqlserver tds协议学习_数据安全交换协议来了,或将推动AI大步迈向3.0时代
  9. Js 模拟鼠标点击事件
  10. Pipelines - .NET中的新IO API指引(二)
  11. python 定义数组
  12. oracle中的(+)
  13. java gridout_GridBagLayout 布局 的行列概念以及gridx,gridy失效?
  14. (转)Arcgis for JS之Cluster聚类分析的实现
  15. Spring配置文件总结-applicationContext.xml
  16. python--过滤top命令--之--时间_系统CPU_进程CPU_内存
  17. android模拟器参数设置,模拟器设置界面详解 - 新手引导 - 逍遥安卓论坛 - Powered by Discuz!...
  18. icmp源代码 tcp/ip协议栈 c语言实现,ICMP处理《LwIP协议栈源码详解——TCP/IP协议的实现》...
  19. 【毕业设计】图像识别-人脸识别与疲劳检测 - python opencv
  20. python可视化窗口制作一个摇骰子游戏_通过构建一个简单的掷骰子游戏去学习怎么用 Python 编程...

热门文章

  1. Siamese Networks 介绍
  2. SAM和BAM格式详解
  3. mustache 的使用
  4. Netbeans连接数据库
  5. 安卓内核UAF漏洞利用探秘
  6. no permission 这种问题的解决方法
  7. ftp服务器搭建并通过外网访问
  8. 国内银行接连爆出数据泄露事件,金融行业如何在源头处建立防线
  9. 1万多中草药中药材大全ACCESS数据库
  10. 支持移动端裁剪图片插件Jcrop(结合WebUploader上传)