下载与烧写
使用U-boot将映像文件烧写到板上的Flash,一般步骤是: (1)通过网络、串口、U盘、SD卡等方式将文件传输到SDRAM; (2)使用Nand Flash或Nor Flash相关的读写命令将SDRAM中的数据烧入Flash。
下面是烧写范例: 如果使用 SD卡和U盘形式更新U-boot,那么首先SD卡和U盘中必须有FAT32文件系统,并在里面存放了u-boot.bin 文件。 1) 通过SD卡烧入Nand Flash:

[u-boot@MINI2440]# mmc init

mmc: Probing for SDHC ...

mmc: SD 2.0 or later card found

trying to detect SD Card...

Manufacturer:       0x00, OEM "Product name:       "     ", revision 0.0

Serial number:      7864775

Manufacturing date: 11/2006

CRC:                0x4f, b0 = 1

READ_BL_LEN=6, C_SIZE_MULT=7, C_SIZE=4095

size = 0

SD Card detected RCA: 0x2 type: SD

mmc1 is available

[u-boot@MINI2440]# fatload mmc 1 0x30008000 u-boot.bin

reading u-boot.bin

256220 bytes read

[u-boot@MINI2440]# nand erase 0 0x40000

NAND erase: device 0 offset 0x0, size 0x40000

Erasing at 0x2000000000004 --   0% complete.

OK

[u-boot@MINI2440]# nand write 0x30008000 0 0x40000

NAND write: device 0 offset 0x0, size 0x40000

Writing at 0x2000000020000 -- 100% is complete. 262144 bytes written: OK

2) 通过U盘烧入Nor Flash:

[u-boot@MINI2440]# usb start

(Re)start USB...

USB:   scanning bus for devices... 2 USB Device(s) found

scanning bus for storage devices... 1 Storage Device(s) found

[u-boot@MINI2440]# usb storage

  Device 0: Vendor: Kingston Rev: PMAP Prod: DT 101 II

Type: Removable Hard Disk

Capacity: 3875.0 MB = 3.7 GB (7936000 x 512)

[u-boot@MINI2440]# usb part 0

print_part of 0

Partition Map for USB device 0  --   Partition Type: DOS

Partition     Start Sector     Num Sectors     Type

  4                     63         7935937    c

[u-boot@MINI2440]# fatload usb 0:4 0x30008000 u-boot.bin

reading u-boot.bin

........................

256220 bytes read

[u-boot@MINI2440]# protect off all

Un-Protect Flash Bank # 1

[u-boot@MINI2440]# erase 0x0 0x3ffff

Erasing sector  0 ... ok.

Erasing sector  1 ... ok.

Erasing sector  2 ... ok.

Erasing sector  3 ... ok.

Erased 4 sectors

[u-boot@MINI2440]# cp.b 0x30008000 0x0  0x3ffff

Copy to Flash... done

3) 通过TFTP服务烧入Nand Flash:

[u-boot@MINI2440]# tftpboot 30008000 192.168.1.100:u-boot.bin

dm9000 i/o: 0x20000300, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:08:11:18:12:27

operating at 100M full duplex mode

Using dm9000 device

TFTP from server 192.168.1.100; our IP address is 192.168.1.101

Filename 'u-boot.bin'.

Load address: 0x30008000

Loading: T ##################

done

Bytes transferred = 256220 (3e8dc hex)

[u-boot@MINI2440]# nand erase 0 0x40000

NAND erase: device 0 offset 0x0, size 0x40000

Erasing at 0x2000000000004 --   0% complete.

OK

[u-boot@MINI2440]# nand write 0x30008000 0 0x40000

NAND write: device 0 offset 0x0, size 0x40000

Writing at 0x2000000020000 -- 100% is complete. 262144 bytes written: OK

4) 通过NFS 服务烧入Nand Flash:

 

[u-boot@MINI2440]# nfs 30008000 192.168.1.100:/home/tekkaman/development/share/u-boot.bin

dm9000 i/o: 0x20000300, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:08:11:18:12:27

operating at 100M full duplex mode

Using dm9000 device

File transfer via NFS from server 192.168.1.100; our IP address is 192.168.1.101

Filename '/home/tekkaman/development/share/u-boot.bin'.

Load address: 0x30008000

Loading: ###################################################

done

Bytes transferred = 256220 (3e8dc hex)

[u-boot@MINI2440]# nand erase 0 0x40000

NAND erase: device 0 offset 0x0, size 0x40000

Erasing at 0x2000000000004 --   0% complete.

OK

[u-boot@MINI2440]# nand write 0x30008000 0 0x40000

NAND write: device 0 offset 0x0, size 0x40000

Writing at 0x2000000020000 -- 100% is complete. 262144 bytes written: OK


内核引导

内核的引导步骤如下: (1)用U-boot的mkimage工具处理内核映像zImage。 (2)通过网络、串口、U盘、SD卡等方式将处理过的内核映像传输到SDRAM的一定位置(一般使用0x30008000) (3)然后使用”bootm"等内核引导命令来启动内核。

为什么要用U-boot的mkimage工具处理内核映像zImage?

因为在用bootm命令引导内核的时候,bootm需要读取一个64字节的文件头,来获取这个内核映象所针对的CPU体系结构、OS、加载到内存中的位置、在内存中入口点的位置以及映象名等等信息。这样bootm才能为OS设置好启动环境,并跳入内核映象的入口点。而mkimage就是添加这个文件头的专用工具。具体的实现请看U-boot中bootm的源码和mkimage的源码。

mkimage工具的使用:

参数说明:

-A指定CPU的体系结构,可用值有:alpha、arm 、x86、ia64、mips、mips64、ppc 、s390、sh、sparc 、sparc64、m68k等

-O指定操作系统类型,可用值有:openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos

-T指定映象类型,可用值有:standalone、kernel、ramdisk、multi、firmware、script、filesystem

-C指定映象压缩方式,可用值有:

none 不压缩(一般使用这个,因为zImage是已经被bzip2压缩过的自解压内核)

gzip 用gzip的压缩方式

bzip2 用bzip2的压缩方式

-a指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage制作映象时,这个参数所指定的地址值来下载

-e 指定映象运行的入口点地址,这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头)

-n 指定映象名

-d指定制作映象的源文件

以下是制作内核映像的命令示例:

mkimage -n 'tekkaman' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage zImage.img

 
以下是使用范例: 1) 通过SD卡引导内核: 首先SD卡中必须有FAT32文件系统,并在里面存放了处理过的内核映像文件。

[u-boot@MINI2440]# mmc init 

mmc: Probing for SDHC ...

mmc: SD 2.0 or later card found

trying to detect SD Card...

Manufacturer:       0x00, OEM "Product name:       "     ", revision 0.0

Serial number:      7864775

Manufacturing date: 11/2006

CRC:                0x4f, b0 = 1

READ_BL_LEN=6, C_SIZE_MULT=7, C_SIZE=4095

size = 0

SD Card detected RCA: 0x2 type: SD

mmc1 is available

[u-boot@MINI2440]# fatload mmc 1 30008000 zImage.img

reading zImage.img

2277540 bytes read

[u-boot@MINI2440]# bootm 30008000

## Booting kernel from Legacy Image at 30008000 ...

Image Name:   tekkaman

Created:      2010-03-29  12:59:51 UTC

Image Type:   ARM Linux Kernel Image (uncompressed)

Data Size:    2277476 Bytes =  2.2 MB

Load Address: 30008000

Entry Point:  30008040

Verifying Checksum ... OK

XIP Kernel Image ... OK

OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.

Linux version 2.6.33.1 (tekkaman@MAGI-Linux) (gcc version 4.3.2 (crosstool-NG-1.6.1-tekkaman) ) #5 Mon Mar 29 20:58:50 CST 2010

CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177

CPU: VIVT data cache, VIVT instruction cache

Machine: MINI2440

(略)

2) 通过TFTP服务引导内核:

[u-boot@MINI2440]# tftpboot 0x30008000 192.168.1.100:zImage.img

dm9000 i/o: 0x20000300, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:08:11:18:12:27

operating at 100M full duplex mode

Using dm9000 device

TFTP from server 192.168.1.100; our IP address is 192.168.1.101

Filename 'zImage.img'.

Load address: 0x30008000

Loading: T #################################################################

#################################################################

##########################

done

Bytes transferred = 2277540 (22c0a4 hex)

[u-boot@MINI2440]# bootm 30008000

## Booting kernel from Legacy Image at 30008000 ...

Image Name:   tekkaman

Created:      2010-03-29  12:59:51 UTC

Image Type:   ARM Linux Kernel Image (uncompressed)

Data Size:    2277476 Bytes =  2.2 MB

Load Address: 30008000

Entry Point:  30008040

Verifying Checksum ... OK

XIP Kernel Image ... OK

OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.

Linux version 2.6.33.1 (tekkaman@MAGI-Linux) (gcc version 4.3.2 (crosstool-NG-1.6.1-tekkaman) ) #5 Mon Mar 29 20:58:50 CST 2010

CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177

CPU: VIVT data cache, VIVT instruction cache

Machine: MINI2440

(略)

 
3) 通过NFS服务引导内核:

[u-boot@MINI2440]# nfs 30008000 192.168.1.100:/home/tekkaman/development/share/zImage.img

dm9000 i/o: 0x20000300, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:08:11:18:12:27

operating at 100M full duplex mode

Using dm9000 device

File transfer via NFS from server 192.168.1.100; our IP address is 192.168.1.101

Filename '/home/tekkaman/development/share/zImage.img'.

Load address: 0x30008000

Loading: #################################################################

#################################################################

#################################################################

#################################################################

#################################################################

#################################################################

#######################################################

done

Bytes transferred = 2277540 (22c0a4 hex)

[u-boot@MINI2440]# bootm 30008000

## Booting kernel from Legacy Image at 30008000 ...

Image Name:   tekkaman

Created:      2010-03-29  12:59:51 UTC

Image Type:   ARM Linux Kernel Image (uncompressed)

Data Size:    2277476 Bytes =  2.2 MB

Load Address: 30008000

Entry Point:  30008040

Verifying Checksum ... OK

XIP Kernel Image ... OK

OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.

Linux version 2.6.33.1 (tekkaman@MAGI-Linux) (gcc version 4.3.2 (crosstool-NG-1.6.1-tekkaman) ) #5 Mon Mar 29 20:58:50 CST 2010

CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177

CPU: VIVT data cache, VIVT instruction cache

Machine: MINI2440

(略)

4) 通过Nand Flash引导内核:    首先要将处理过的内核映像文件烧入Nand Flash的一定位置(由内核分区表决定)。以后每次启动时用Nand Flash的读取命令先将这个内核映像文件读到内存的一定位置(由制作内核映像时的-a参数决定),再使用bootm命令引导内核。
内核映像文件的烧入:

[u-boot@MINI2440]# nfs 30008000 192.168.1.100:/home/tekkaman/development/share/zImage.img

dm9000 i/o: 0x20000300, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 08:08:11:18:12:27

operating at 100M full duplex mode

Using dm9000 device

File transfer via NFS from server 192.168.1.100; our IP address is 192.168.1.101

Filename '/home/tekkaman/development/share/zImage.img'.

Load address: 0x30008000

Loading: #################################################################

#################################################################

#################################################################

#################################################################

#################################################################

#################################################################

#######################################################

done

Bytes transferred = 2277540 (22c0a4 hex)

[u-boot@MINI2440]# nand erase 0x80000 0x300000

NAND erase: device 0 offset 0x80000, size 0x300000

Erasing at 0x36000001800000 --   0% complete.

OK

[u-boot@MINI2440]#  nand write 30008000 0x80000 300000

NAND write: device 0 offset 0x80000, size 0x300000

Writing at 0x36000000020000 -- 100% is complete. 3145728 bytes written: OK

内核引导:

[u-boot@MINI2440]#  nand read 30008000 0x80000 300000

NAND read: device 0 offset 0x80000, size 0x300000

3145728 bytes read: OK

[u-boot@MINI2440]# bootm 30008000

## Booting kernel from Legacy Image at 30008000 ...

Image Name:   tekkaman

Created:      2010-03-29  12:59:51 UTC

Image Type:   ARM Linux Kernel Image (uncompressed)

Data Size:    2277476 Bytes =  2.2 MB

Load Address: 30008000

Entry Point:  30008040

Verifying Checksum ... OK

XIP Kernel Image ... OK

OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.

Linux version 2.6.33.1 (tekkaman@MAGI-Linux) (gcc version 4.3.2 (crosstool-NG-1.6.1-tekkaman) ) #5 Mon Mar 29 20:58:50 CST 2010

CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177

CPU: VIVT data cache, VIVT instruction cache

Machine: MINI2440

(略)

u-boot使用的更多相关文章

  1. 玩转spring boot——快速开始

    开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...

  2. 【微框架】之一:从零开始,轻松搞定SpringCloud微框架系列--开山篇(spring boot 小demo)

    Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...

  3. 玩转spring boot——开篇

    很久没写博客了,而这一转眼就是7年.这段时间并不是我没学习东西,而是园友们的技术提高的非常快,这反而让我不知道该写些什么.我做程序已经有十几年之久了,可以说是彻彻底底的“程序老炮”,至于技术怎么样?我 ...

  4. 玩转spring boot——结合redis

    一.准备工作 下载redis的windows版zip包:https://github.com/MSOpenTech/redis/releases 运行redis-server.exe程序 出现黑色窗口 ...

  5. 玩转spring boot——AOP与表单验证

    AOP在大多数的情况下的应用场景是:日志和验证.至于AOP的理论知识我就不做赘述.而AOP的通知类型有好几种,今天的例子我只选一个有代表意义的“环绕通知”来演示. 一.AOP入门 修改“pom.xml ...

  6. 玩转spring boot——结合JPA入门

    参考官方例子:https://spring.io/guides/gs/accessing-data-jpa/ 接着上篇内容 一.小试牛刀 创建maven项目后,修改pom.xml文件 <proj ...

  7. 玩转spring boot——结合JPA事务

    接着上篇 一.准备工作 修改pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  8. 玩转spring boot——结合AngularJs和JDBC

    参考官方例子:http://spring.io/guides/gs/relational-data-access/ 一.项目准备 在建立mysql数据库后新建表“t_order” ; -- ----- ...

  9. 玩转spring boot——结合jQuery和AngularJs

    在上篇的基础上 准备工作: 修改pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi=&q ...

  10. 玩转spring boot——MVC应用

    如何快速搭建一个MCV程序? 参照spring官方例子:https://spring.io/guides/gs/serving-web-content/ 一.spring mvc结合thymeleaf ...

随机推荐

  1. kettle中通过 时间戳(timestamp)方式 来实现数据库的增量同步操作(一)

    这个实验主要思想是在创建数据库表的时候, 通过增加一个额外的字段,也就是时间戳字段, 例如在同步表 tt1 和表 tt2 的时候, 通过检查那个表是最新更新的,那个表就作为新表,而另外的表最为旧表被新 ...

  2. dbms_job和dbmsi_job

    工作中可能遇到这样的情况,在A用户下有一个不用的job,但是dba不知道A用户的密码,怎么删除这个job呢.   相信大部分人都会尝试在sys用户下用dbms_job.remove()命令去删除它,但 ...

  3. java swing窗口放置屏幕中央问题思考

    java swing窗口放置屏幕中央问题思考 以前总是尝试各种方法都没有能把组件放到屏幕中央,只能用死办法,设置绝对坐标,但这样就失去了可移植性,而且繁琐.今天仔细思考了一番,终于被我找出问题所在. ...

  4. 什么是NSTimer

    本文主要是介绍什么是NSTimer,具体使用请参考上一篇博客. 1.什么是NSTimer? NSTimer就是timer就是一个能在从现在开始的后面的某一个时刻或者周期性的执行我们指定的方法的对象. ...

  5. ios专题 - 委托模式实现

    在ios中,委托模式非常常见,那委托模式是什么? 委托模式是把一个对象把请求给另一个对象处理. 下面见例子: #import <UIKit/UIKit.h> @protocol LQIPe ...

  6. PHP学习笔记(七)

    <wordpress 50个过滤钩子> 11-20 11.gettext: 过滤wordpress的翻译数据. 在wordpress中,使用__(), _e(), _x(), _ex(), ...

  7. 【C++】类型转换

    引言 C++风格的四种类型转换方法:static_cast.dynamic_cast.reinterpret_cast.const_cast. 欢迎来到 lovickie 的博客 http://www ...

  8. php 文件路径设置 set_include_path(); get_include_path();

    <?php set_include_path($string); //设置路径 get_include_path(); // 获取当前的路径 //例如:文件路径为: //D:/phpweb/de ...

  9. IE6背景图片闪动问题

    在IE6中,当JS触发事件时或者hover的时候,如果网速过慢 IE6背景图片重新加载会闪一下. 好的一个解决方案是 <!--[if IE 6]><script> try{do ...

  10. 使用css3实现文章新闻列表排行榜(数字)

    列举几个简单的文章排行榜数字效果 一:使用list-style来显示数字.圆点.字母或者图片 <style> li{width:300px; border-bottom: 1px dott ...