转”使用UBOOT烧写根文件系统和内核的方法
“转”使用UBOOT烧写根文件系统和内核的方法 2012-08-13 20:39:28
分类:
原文地址:“转”使用UBOOT烧写根文件系统和内核的方法 作者:xubin4858
- 使用nor的supervivi烧写uboot到nand:
- 进入supervivi,选择a,absolute user application
- /**************uboot下用命令下载uboot,内核和文件系统********************/
- /*
- 先将内核zImage用mkp_w_picpath转换成uImage(叫zIMage.img)
- mkp_w_picpath 工具是uboot提供,在uboot源码的tools/
- 在内核源码的arch/arm/boot/下执行如下命令
- */
- mkp_w_picpath -n 'tekkaman' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img
- /*
- Usage: mkp_w_picpath -l p_w_picpath
- -l ==> list p_w_picpath header information
- mkp_w_picpath [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] p_w_picpath
- -A ==> set architecture to 'arch'
- -O ==> set operating system to 'os'
- -T ==> set p_w_picpath type to 'type'
- -C ==> set compression type 'comp'
- -a ==> set load address to 'addr' (hex)
- -e ==> set entry point to 'ep' (hex)
- -n ==> set p_w_picpath name to 'name'
- -d ==> use p_w_picpath data from 'datafile'
- -x ==> set XIP (execute in place)
- */
- //或者在制作内核时用
- make uImage //这样生成的uImage和用mkp_w_picpath工具将zImage转换成的uImage的格式一样,均可被uboot引导。
- mv uImage zImage.img //为了和下面的命令统一,将uImage改名叫zImga.img
- //但在试验中发现这样制作的uImage有时uboot引导不起来
- /***********************参数修改************************************/
- mini2440
- setenv ipaddr 192.168.1.230
- setenv serverip 192.168.1.103
- setenv gatewayip 192.168.1.1
- /*bootargs uboot传递给内核de*/
- setenv bootargs console=ttySAC0 noinitrd root=/dev/mtdblock3 init=/linuxrc
- /*bootcmd uboot自动启动时要执行的任务*/
- setenv bootcmd tftp 0x30008000 zImage.img\;bootm 0x30008000 /*从tftp服务器下载内核到sdram,然后启动*/
- setenv bootcmd nboot 30008000 0 0x60000\;bootm 0x30008000 /*从nand读取内核到sdram,然后启动*/
- setenv bootcmd nand read 30008000 0x60000 0x500000\;bootm 0x30008000 /*从nand读取内核到sdram,然后启动*/
- saveenv
- /**********************从服务器烧写文件到nand*************************************/
- //download uboot
- tftp 0x30008000 u-boot.bin //从ftp服务器将u-boot.bin文件读到内存0x30008000处
- nand erase 0 0x40000 //清除nandflash的0-0x40000的数据
- nand write 0x30008000 0 0x40000 //从内存0x30008000写入nandflash的0开始处,大小0x40000
- /*nand的0x40000--0x60000是参数区
- 从板子启动现象判断参数区和kernel去有没重叠的方法:上电按空格进入nand的uboot,如果没有提示using default param并且
- 执行命令nboot 30008000 0 0x60000\;bootm 0x30008000可以成功进入内核,说明ok
- 在saveenv时,会显示at 0x4000000如下,tekkman的源码中CONFIG_ENV_OFFSET=0x60000,需要改成0x40000否则参数区和kernel区会重合
- [u-boot@Song]# saveenv
- Saving Environment to NAND...
- Erasing Nand...
- Erasing at 0x4000000000002 -- 0% complete.
- Writing to Nand... done
- */
- //dowload kernel
- tftp 0x30008000 zImage.img //从ftp服务器将zImage.img文件读到内存0x30008000处
- nand erase 0x60000 500000 //清除nandflash的0x60000-0x560000的数据
- nand write 0x30008000 0x060000 0x500000 //从内存0x30008000写入nandflash的0x60000开始处,大小0x500000
- //dowload rootfs,可以是友善提供的文件系统。比如root_qtopia-128M.img,不要超过63MB.因为mini2440的sdram才64MB.如果大于63MB,可以使用supvivi下载之。见下
- tftp 0x30008000 root //从ftp服务器将ysffs文件读到内存0x30008000处
- nand erase 0x560000 //清除nandflash的0x560000到结尾的数据
- //nand write 0x30008000 0x560000 0x6000000 直接写在nand上不行,需专门的命令向nand写yaffs文件,因为读写的时候还要有其他动作
- //nand read 0x30008000 0x560000 0x6000000 直接从nand读不行,需专门的命令从nand读yaffs文件
- nand write.yaffs 0x30008000 0x560000 0x3b36dc0 //从内存0x30008000写入nandflash的0x560000开始处,大小0x3b36dc0
- /*在只有64MB的sdram系统上,用tftp 0x30008000 root 加载的yaffs文件不得大于33f80000-30008000=3F7 8000=63.46875MB,否则会覆盖掉处于33f80000的uboot
- 在试验中发现只能指定size为0x3b36dc0,否则出错,现还不知原因
- 可参考http://bbs.huiwen.com/thread-426-1-1.html
- */
- /***********************************************************/
上面将
uboot 下载到nand的起始位置为0 (--0x40000) 256KB
kernel下载到nand的起始位置为0x60000 (--0x560000) 5MB
root 下载到nand的起始位置为0x560000 (--0x10560000) 250+MB
而nand上0x40000--0x60000是保存着nand的一些参数(128KB),起始地址0x40000由CONFIG_ENV_OFFSET指定,在mini2440.h中定义。所以用uboot写内核到nand时不要写到0x400000的位置而把参数给覆盖掉
既然uboot已经将这些root 下载到nand的0x560000位置上了,内核怎么知道yaffs文件系统处于nand的0x5600000上呢?当然是uboot传递给内核的参数,如下
console=ttySAC0 noinitrd root=/dev/mtdblock3 init=/linuxrc,
uboot没有直接告诉内核 文件系统在0x560000,而是指定了mtdblock3
内核怎么知道mtdblock3在哪呢?恩,mtdblock3本来就是内核里的名词,内核当然知道了,内核可以查看nandflsh的分区表,定义在kernel/arch/arm/mach-s3c2440/mach-mini2440.c,如下,内核会得知nand的mtdblock3起始位置是0x560000,然后去这个位置加载yaffs文件系统,而这个位置处刚好放着yaffs文件系统,即前面的命令
nand write.yaffs 0x30008000 0x560000 0x3b36dc0 (实际试验中我将yaffs下载到nand的0x580000处,内核也能顺利加载yaffs)
相反,uboot并不知道mtdblcok3为何东东,对uboot来讲它只是一个字符串,
所以一般先在内核的nand分区表中划分一个开始于a位置的分区p,在uboot中若将文件系统下载到nand的a位置,然后uboot传递参数p给内核以使内核顺利找到位置a来加载yaffs(内核的分区表先定,用uboot命令参照内核分区表去下载内核和文件系统到nand正确的位置。uboot本来就是用来引导内核的,内核怎么表现,它就跟着怎么变就行了)
- static struct mtd_partition friendly_arm_default_nand_part[] = {
- [0] = {
- .name = "supervivi",
- .size = 0x00040000,
- .offset = 0,
- },
- [1] = {
- .name = "param",
- .offset = 0x00040000,
- .size = 0x00020000,
- },
- [2] = {
- .name = "Kernel",
- .offset = 0x00060000,
- .size = 0x00500000,
- },
- [3] = {
- .name = "root",
- .offset = 0x00560000,
- .size = 1024 * 1024 * 1024, //
- },
- [4] = {
- .name = "nand",
- .offset = 0x00000000,
- .size = 1024 * 1024 * 1024, //
- }
- };
下面是nand的布局
uboot在启动之后加载内核之前的sdram空间处于如下布局
①此处param区存放着uboot传递给kernel的标记列表,(是uboot传递给内核的,内核去读取),和nandflash上的param存储区(是uboot自己的)的内容不一样
nandflash的param存储区存放的是如
bootargs=console=ttySAC0 noinitrd root=/dev/mtdblock3 init=/linuxrc
bootcmd=tftp zImage.img;bootm
bootdelay=1
baudrate=115200
ethaddr=08:08:11:18:12:27
ipaddr=192.168.1.2
serverip=192.168.1.103
gatewayip=192.168.1.1
netmask=255.255.255.0
tekkaman=bmp d 70000
stdin=serial
stdout=serial
stderr=serial
ethact=dm9000
这样的东东
sdram中param存储区是下面形式的东东
params->hdr.tag = ATAG_MEM;//标记类型:内存标记,hdr是struct tag_header类型结构体,为tag一成员
params->hdr.size = tag_size (tag_mem32);//标记大小
params->u.mem.start = bd->bi_dram[i].start;//内存起始地址,u是union类型,为tag一成员
params->u.mem.size = bd->bi_dram[i].size;//内存结束地址
params = tag_next (params);
params->hdr.tag = ATAG_CMDLINE;//标记类型:命令字符串 //这个tag的内容是使用nand上param区的bootcmd=tftp zImage.img;bootm填充的
params->hdr.size =
(sizeof (struct tag_header) + strlen (p) + 1 + 4) >> 2;
strcpy (params->u.cmdline.cmdline, p);
params = tag_next (params);
而内核在启动时,会使用和uboot存储tag时所用的一样的数据类型即struct tag去读这些tag
②uboot代码段前面有malloc内存区和堆栈,从uboot/cpu/arm920t/start.S的设置堆栈的代码中可以看出
转载于:https://blog.51cto.com/5815084/1172783
转”使用UBOOT烧写根文件系统和内核的方法相关推荐
- 移植U-BOOT之支持烧写YAFFS文件系统以及制作U-BOOT补丁
今天,我们来移植U-BOOT让其支持YAFFS文件系统映像的烧写,以及最后的终极目标,制作Uboot补丁,因为我们信心苦苦移植好了Uboot,如果换一个地方的或者换一台电脑之类的,我们也不想再浪费时间 ...
- u-boot-2012.04.01移植到TQ2440(八):支持烧写yaffs文件系统
一.支持yaffs烧写文件系统 先直接烧写试一下 TQ2440 # nand write.yaffs32000000 rootfs $filesize NAND write: device 0 off ...
- 【Linux】制作U-Boot烧写镜像到SD卡的过程(上篇)
在嵌入式Linux操作系统中,需要将三样东西(BootLoader.内核kernel.根文件系统)传输到目标板中.一般而言,U-Boot烧写到SD卡中,而内核.根文件系统都采用TFTP的方式传输到目标 ...
- 【Tiny4412】烧写Qt文件系统到EMMC
00. 目录 文章目录 00. 目录 01. 烧写内核 02. 启动文件系统 03. 烧写Qt文件系统到EMMC 04. 问题讨论 05. 参考 01. 烧写内核 1.1 在minicom中输入如下命 ...
- 【Tiny4412】烧写Qt文件系统到SD卡
00. 目录 文章目录 00. 目录 01. 烧写内核 02. 启动文件系统 03. 烧写Qt文件系统到SD卡 04. 问题讨论 05. 参考 01. 烧写内核 1.1 在minicom中输入如下命令 ...
- 在Linux下使用dnw和u-boot烧写系统
启动u-boot,按住空格进入u-boot菜单后:(mincom) Linux会识别到一个新的USB设备,执行lsusb可以看到如下信息: azheng@ubuntu:~$ lsusb Bus 001 ...
- 使用 u-boot 烧写内核——韦东山嵌入式Linux学习笔记10
本文实验环境: 1. windows 7(64bit) 2. JZ2440(V2) 使用 u-boot 烧写内核,一般有两种方法. 1. 通过USB下载功能 2. 通过TFTP功能 通过USB下载功能 ...
- sd_fusing.sh将uboot烧写到SD卡
以前只知道使用"./sd_fusing.sh /dev/sdb"命令来烧写uboot.bin到SD卡中,对其中的细节并不了解. 心存忐忑,于是乎花了些功夫,去了解sd_fusin ...
- 【Linux】制作U-Boot烧写镜像到SD卡的过程(下篇:Makefile文件)
上文讲到,如果需求仅略微修改,整个从编译到仅保留二进制文件到添加HeaderInfo到烧写到SD卡的一系列命令都需要重新再输入一遍,这很繁琐. 如何解决这个问题呢? 制作一个bash脚本文件 制作一个 ...
最新文章
- Person Re-Identification by Multi-Channel Parts-Based CNN with Improved Triplet Loss Function
- Android Studio:missing feature Watch
- qt checkbox 选中事件_丽声事件 | 十堰市第五届全国青少儿播音主持等级考试圆满落幕...
- eve模拟器_《Re:从零开始的新伊甸征程》一步到位教你下载EVE手游
- Oracl数据库中大数据的备份-1
- 数据可视化 信息可视化_可视化数据以帮助清理数据
- sql 排除 sum为0的_一文为你详解Unique SQL原理和应用
- 使用Object.prototype.toString判断数据类型
- 安装axios时报错
- 个人微信api接口调用-转账发红包
- kotlin入门教程
- spa文件转换html,spa.html
- 取地址符和指针*的认识
- 2020年复旦电子信息专硕复试经验分享
- 在linux上删除文件夹,在Linux系统下删除文件夹
- NOIWC2018滚粗记
- 电脑连WIFI网速慢,手机却很快
- leetcode495. 提莫攻击
- P9065 [yLOI2023] 云梦谣 题解
- ubuntu下使用github安装R Packages[已解决]