uboot处理dtb
目录
- 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相关推荐
- 修改MfgTool 工具并通过 USB OTG 口来烧写自己制作的uboot\rootfs\.dtb\zImage文件
一.改造烧写环境 MfgTool 是通过 USB OTG 接口将系统烧写进 EMMC 中,用usb连接电脑和USB OTG 接口 把拨码开关拨到 USB 下载模式,需要弹出tf或sd卡 打开" ...
- U-Boot 之一 零基础编译 U-Boot 过程详解、Image 镜像介绍及使用说明、DTB 文件使用说明
最近,工作重心要从裸机开发转移到嵌入式 Linux 系统开发,在之前的博文 Linux 之八 完整嵌入式 Linux 环境.(交叉)编译工具链.CPU 体系架构.嵌入式系统构建工具 中详细介绍了嵌 ...
- 奇小葩讲设备树(3/5)-- Linux设备树详解(三)u-boot设备树的传递
前面两节介绍了设备的基本概念.编译.结构的组成,本章讨论的主要内容为 dtb如何通过Bootloader引导程序加载到内核 bootloader如何解析dbt bootloader支持哪些dtb的操作 ...
- Exynos4412 Uboot 的使用与烧写
Uboot版本:u-boot-2013.01 开发板:Exynos4412 本文主要是熟悉U-boot 的使用以及如何将Uboot 烧入Exynos4412.当然在这之前首先必须保证开发板上已经有了U ...
- 移植u-boot.2012.04.01
/*************************************************** *u-boot版本:u-boot2012.04.01 *gcc版本:arm-linux-gcc ...
- MT7621_移植篇(3) uboot编译+配置项分析
U-Boot("通用引导加载程序",通常简称为U-Boot)是一种开源的主引导加载程序,用于嵌入式设备中打包引导设备操作系统内核的指令.它可用于多种计算机架构,包括68k.ARM. ...
- U-Boot 之零 源码文件、启动阶段(TPL、SPL)、FALCON、设备树
最近,工作重心要从裸机开发转移到嵌入式 Linux 系统开发,在之前的博文 Linux 之八 完整嵌入式 Linux 环境.(交叉)编译工具链.CPU 体系架构.嵌入式系统构建工具 中详细介绍了嵌 ...
- v3S编译大全(uboot 主线linux buildroot)
文章目录 一.github代理下载 二.Uboot 1.uboot下载 2.uboot的基本结构 3.uboot配置屏幕 4.修改可以从tf卡启动 5.配置 6.编译 6.烧录测试 1.进入 fel ...
- lichee pi zero 荔枝派zero uboot编译 烧录
ubuntu 18.04 1.准备uboot源码和交叉编译工具链 交叉编译工具链网盘地址:http://pan.baidu.com/s/1hsf22fq tar xvf gcc-linaro-6.3. ...
最新文章
- 你要的2019最全目标检测都在这里啦!
- 竞赛 | 我们标注了34G真实线下门店数据,等你pick!
- MCS-51系列特殊功能寄存器(摘抄)
- 用户被忽悠 微软黑屏计划推至21日0点实施
- 批处理命令 / cd
- LeetCode 250. Count Univalue Subtrees
- 综合布线工作组2009年工作简报
- sqlserver tds协议学习_数据安全交换协议来了,或将推动AI大步迈向3.0时代
- Js 模拟鼠标点击事件
- Pipelines - .NET中的新IO API指引(二)
- python 定义数组
- oracle中的(+)
- java gridout_GridBagLayout 布局 的行列概念以及gridx,gridy失效?
- (转)Arcgis for JS之Cluster聚类分析的实现
- Spring配置文件总结-applicationContext.xml
- python--过滤top命令--之--时间_系统CPU_进程CPU_内存
- android模拟器参数设置,模拟器设置界面详解 - 新手引导 - 逍遥安卓论坛 - Powered by Discuz!...
- icmp源代码 tcp/ip协议栈 c语言实现,ICMP处理《LwIP协议栈源码详解——TCP/IP协议的实现》...
- 【毕业设计】图像识别-人脸识别与疲劳检测 - python opencv
- python可视化窗口制作一个摇骰子游戏_通过构建一个简单的掷骰子游戏去学习怎么用 Python 编程...