“转”使用UBOOT烧写根文件系统和内核的方法 2012-08-13 20:39:28

分类:

原文地址:“转”使用UBOOT烧写根文件系统和内核的方法 作者:xubin4858

[cpp] view plaincopy
  1. 使用nor的supervivi烧写uboot到nand:
  2. 进入supervivi,选择a,absolute user application
  3. /**************uboot下用命令下载uboot,内核和文件系统********************/
  4. /*
  5. 先将内核zImage用mkp_w_picpath转换成uImage(叫zIMage.img)
  6. mkp_w_picpath 工具是uboot提供,在uboot源码的tools/
  7. 在内核源码的arch/arm/boot/下执行如下命令
  8. */
  9. mkp_w_picpath -n 'tekkaman' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img
  10. /*
  11. Usage: mkp_w_picpath -l p_w_picpath
  12. -l ==> list p_w_picpath header information
  13. 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
  14. -A ==> set architecture to 'arch'
  15. -O ==> set operating system to 'os'
  16. -T ==> set p_w_picpath type to 'type'
  17. -C ==> set compression type 'comp'
  18. -a ==> set load address to 'addr' (hex)
  19. -e ==> set entry point to 'ep' (hex)
  20. -n ==> set p_w_picpath name to 'name'
  21. -d ==> use p_w_picpath data from 'datafile'
  22. -x ==> set XIP (execute in place)
  23. */
  24. //或者在制作内核时用
  25. make uImage //这样生成的uImage和用mkp_w_picpath工具将zImage转换成的uImage的格式一样,均可被uboot引导。
  26. mv uImage zImage.img //为了和下面的命令统一,将uImage改名叫zImga.img
  27. //但在试验中发现这样制作的uImage有时uboot引导不起来
  28. /***********************参数修改************************************/
  29. mini2440
  30. setenv ipaddr 192.168.1.230
  31. setenv serverip 192.168.1.103
  32. setenv gatewayip 192.168.1.1
  33. /*bootargs  uboot传递给内核de*/
  34. setenv bootargs  console=ttySAC0 noinitrd root=/dev/mtdblock3 init=/linuxrc
  35. /*bootcmd  uboot自动启动时要执行的任务*/
  36. setenv bootcmd tftp 0x30008000 zImage.img\;bootm 0x30008000     /*从tftp服务器下载内核到sdram,然后启动*/
  37. setenv bootcmd nboot 30008000 0 0x60000\;bootm 0x30008000   /*从nand读取内核到sdram,然后启动*/
  38. setenv bootcmd nand read 30008000 0x60000 0x500000\;bootm 0x30008000  /*从nand读取内核到sdram,然后启动*/
  39. saveenv
  40. /**********************从服务器烧写文件到nand*************************************/
  41. //download uboot
  42. tftp 0x30008000 u-boot.bin      //从ftp服务器将u-boot.bin文件读到内存0x30008000处
  43. nand erase 0 0x40000            //清除nandflash的0-0x40000的数据
  44. nand write 0x30008000  0  0x40000   //从内存0x30008000写入nandflash的0开始处,大小0x40000
  45. /*nand的0x40000--0x60000是参数区
  46. 从板子启动现象判断参数区和kernel去有没重叠的方法:上电按空格进入nand的uboot,如果没有提示using default param并且
  47. 执行命令nboot 30008000 0 0x60000\;bootm 0x30008000可以成功进入内核,说明ok
  48. 在saveenv时,会显示at 0x4000000如下,tekkman的源码中CONFIG_ENV_OFFSET=0x60000,需要改成0x40000否则参数区和kernel区会重合
  49. [u-boot@Song]# saveenv
  50. Saving Environment to NAND...
  51. Erasing Nand...
  52. Erasing at 0x4000000000002 --   0% complete.
  53. Writing to Nand... done
  54. */
  55. //dowload kernel
  56. tftp 0x30008000 zImage.img      //从ftp服务器将zImage.img文件读到内存0x30008000处
  57. nand erase 0x60000 500000       //清除nandflash的0x60000-0x560000的数据
  58. nand write 0x30008000 0x060000 0x500000 //从内存0x30008000写入nandflash的0x60000开始处,大小0x500000
  59. //dowload rootfs,可以是友善提供的文件系统。比如root_qtopia-128M.img,不要超过63MB.因为mini2440的sdram才64MB.如果大于63MB,可以使用supvivi下载之。见下
  60. tftp 0x30008000 root            //从ftp服务器将ysffs文件读到内存0x30008000处
  61. nand erase 0x560000             //清除nandflash的0x560000到结尾的数据
  62. //nand write 0x30008000 0x560000 0x6000000    直接写在nand上不行,需专门的命令向nand写yaffs文件,因为读写的时候还要有其他动作
  63. //nand read 0x30008000 0x560000 0x6000000     直接从nand读不行,需专门的命令从nand读yaffs文件
  64. nand write.yaffs 0x30008000 0x560000 0x3b36dc0  //从内存0x30008000写入nandflash的0x560000开始处,大小0x3b36dc0
  65. /*在只有64MB的sdram系统上,用tftp 0x30008000 root 加载的yaffs文件不得大于33f80000-30008000=3F7 8000=63.46875MB,否则会覆盖掉处于33f80000的uboot
  66. 在试验中发现只能指定size为0x3b36dc0,否则出错,现还不知原因
  67. 可参考http://bbs.huiwen.com/thread-426-1-1.html
  68. */
  69. /***********************************************************/

上面将
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本来就是用来引导内核的,内核怎么表现,它就跟着怎么变就行了)

[cpp] view plaincopy
  1. static struct mtd_partition friendly_arm_default_nand_part[] = {
  2. [0] = {
  3. .name   = "supervivi",
  4. .size   = 0x00040000,
  5. .offset = 0,
  6. },
  7. [1] = {
  8. .name   = "param",
  9. .offset = 0x00040000,
  10. .size   = 0x00020000,
  11. },
  12. [2] = {
  13. .name   = "Kernel",
  14. .offset = 0x00060000,
  15. .size   = 0x00500000,
  16. },
  17. [3] = {
  18. .name   = "root",
  19. .offset = 0x00560000,
  20. .size   = 1024 * 1024 * 1024, //
  21. },
  22. [4] = {
  23. .name   = "nand",
  24. .offset = 0x00000000,
  25. .size   = 1024 * 1024 * 1024, //
  26. }
  27. };

下面是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烧写根文件系统和内核的方法相关推荐

  1. 移植U-BOOT之支持烧写YAFFS文件系统以及制作U-BOOT补丁

    今天,我们来移植U-BOOT让其支持YAFFS文件系统映像的烧写,以及最后的终极目标,制作Uboot补丁,因为我们信心苦苦移植好了Uboot,如果换一个地方的或者换一台电脑之类的,我们也不想再浪费时间 ...

  2. u-boot-2012.04.01移植到TQ2440(八):支持烧写yaffs文件系统

    一.支持yaffs烧写文件系统 先直接烧写试一下 TQ2440 # nand write.yaffs32000000 rootfs $filesize NAND write: device 0 off ...

  3. 【Linux】制作U-Boot烧写镜像到SD卡的过程(上篇)

    在嵌入式Linux操作系统中,需要将三样东西(BootLoader.内核kernel.根文件系统)传输到目标板中.一般而言,U-Boot烧写到SD卡中,而内核.根文件系统都采用TFTP的方式传输到目标 ...

  4. 【Tiny4412】烧写Qt文件系统到EMMC

    00. 目录 文章目录 00. 目录 01. 烧写内核 02. 启动文件系统 03. 烧写Qt文件系统到EMMC 04. 问题讨论 05. 参考 01. 烧写内核 1.1 在minicom中输入如下命 ...

  5. 【Tiny4412】烧写Qt文件系统到SD卡

    00. 目录 文章目录 00. 目录 01. 烧写内核 02. 启动文件系统 03. 烧写Qt文件系统到SD卡 04. 问题讨论 05. 参考 01. 烧写内核 1.1 在minicom中输入如下命令 ...

  6. 在Linux下使用dnw和u-boot烧写系统

    启动u-boot,按住空格进入u-boot菜单后:(mincom) Linux会识别到一个新的USB设备,执行lsusb可以看到如下信息: azheng@ubuntu:~$ lsusb Bus 001 ...

  7. 使用 u-boot 烧写内核——韦东山嵌入式Linux学习笔记10

    本文实验环境: 1. windows 7(64bit) 2. JZ2440(V2) 使用 u-boot 烧写内核,一般有两种方法. 1. 通过USB下载功能 2. 通过TFTP功能 通过USB下载功能 ...

  8. sd_fusing.sh将uboot烧写到SD卡

    以前只知道使用"./sd_fusing.sh  /dev/sdb"命令来烧写uboot.bin到SD卡中,对其中的细节并不了解. 心存忐忑,于是乎花了些功夫,去了解sd_fusin ...

  9. 【Linux】制作U-Boot烧写镜像到SD卡的过程(下篇:Makefile文件)

    上文讲到,如果需求仅略微修改,整个从编译到仅保留二进制文件到添加HeaderInfo到烧写到SD卡的一系列命令都需要重新再输入一遍,这很繁琐. 如何解决这个问题呢? 制作一个bash脚本文件 制作一个 ...

最新文章

  1. Person Re-Identification by Multi-Channel Parts-Based CNN with Improved Triplet Loss Function
  2. Android Studio:missing feature Watch
  3. qt checkbox 选中事件_丽声事件 | 十堰市第五届全国青少儿播音主持等级考试圆满落幕...
  4. eve模拟器_《Re:从零开始的新伊甸征程》一步到位教你下载EVE手游
  5. Oracl数据库中大数据的备份-1
  6. 数据可视化 信息可视化_可视化数据以帮助清理数据
  7. sql 排除 sum为0的_一文为你详解Unique SQL原理和应用
  8. 使用Object.prototype.toString判断数据类型
  9. 安装axios时报错
  10. 个人微信api接口调用-转账发红包
  11. kotlin入门教程
  12. spa文件转换html,spa.html
  13. 取地址符和指针*的认识
  14. 2020年复旦电子信息专硕复试经验分享
  15. 在linux上删除文件夹,在Linux系统下删除文件夹
  16. NOIWC2018滚粗记
  17. 电脑连WIFI网速慢,手机却很快
  18. leetcode495. 提莫攻击
  19. P9065 [yLOI2023] 云梦谣 题解
  20. ubuntu下使用github安装R Packages[已解决]

热门文章

  1. Java:批量插入、修改数据到数据库中的用法
  2. 【PHP设计模式 08_CeLue.php】策略模式
  3. OpenStack(1)
  4. An unknown error occurred.
  5. 如何使用 volatile, synchronized, final 进行线程间通信
  6. Oracle 11g新特性密码大小写敏感问题
  7. 黄聪:C#索引器详解、示例
  8. 欢迎转载中国网站排名
  9. docker-compose RabbitMQ与Nodejs接收端同时运行时的错误
  10. eclipse进行远程调试教程,轻松搞定生产环境问题