《转》u-boot移植烧写步骤、u-boot命令和kernel烧写步骤

时间:2023-01-06 03:01:33

转自:《http://blog.sina.com.cn/s/blog_726c4bd20100unjn.html》

移植烧写步骤

 

1. 解压u-boot源文件

2. 从u-boot/include/configs里找相近的配置,复制成自已的名字

3. 改makefile文件增加目标,比如 mini2440_config: arm<体系>  <SMDK2410板型号> <文件夹名字> <公司/开发者,可以为NULL> 核心s3c24x0

4. 把相应文件改好

   例如: 硬件配置在 u-boot/include/configs/mini2440.h  <包括 启动参数,命令指示符等>

        相关指令的 u-boot/common/cmd_console.c

        相关驱动的文件,都放到相应目录里去

5. make distclean 清除垃圾(把上一级的配置全部删除)

6. 启动你改好的配置 make mini2440_config

7. 交叉编译 make CROSS_COMPILE=arm-linux-      

 

8. 在uboot/下生成了uboot.bin

9. 传输数据到内存

9.1 烧写机<工厂级,Nand中的bootload已被破坏>

9.2 USB+驱动  输入<Nand启动,并且bootloader完好>指令usbslave ,然后给计算机制定文件

                <Nand中的bootloader已被破坏,就用开发板Nor启动>

                <如果Nand中的bootloader已被破坏, 又不是开发板, 则成砖头机>

9.3 串口 输入      <Nand启动,并且bootloader完好> 指令loadx ,然后给计算机制定文件

9.4 网络 输入      <Nand启动,并且bootloader完好> 指令tftp  <遇先要在u-boot环境变量里设定好服务器和本机的IP地址,MAC地址,网关,MASK>

(注:数据传输指令后可以跟数据输入的内存目标地址, 默认是bootloader的mini2440.h里CONFIG_SYS_LOAD_ADDR指定的值)

 

10. 烧写进Nand

10.1 先擦除nand erase offset<Nand基址(起始地址)> len<数据长度>

10.2 写入nand write.jffs2 addr<内存基址> offset<Nand基址> len<数据长度>    

    

10.3 根文件系统rootfs定入要用yaffs文件系统写入

    nand wrtie.yaffs addr offset len

 

u-boot命令

u-boot新版本下载地址,

ftp://ftp.denx.de/pub/u-boot

http://sourceforge.net/projects/U-Boot/

 

= 0.常用命令

- 内存操作-

md 是显示内存信息,默认是以32位显示md.l

md.b 以2位显示

md.w 以4位

 

mm 修改内存的值 也可以.b .w .l

空格+回车 结束修改

mw内存填充

数据复制cp

cp[.b .w  .l]src_add dest_add len

例:  cp.b 31000000 50000 D0000  从31000000复制到50000 长度D0000

 

- Flash操作 -

查看FLASH型号的扇区

flinfo

第一行显示Bank所在的号码,容量bit

大小Size和扇区Sectors大小

 

按扇区块写保护FLASH,一定要按整扇区块,如果不是整扇区块,则失败

protect off all 关闭所有扇区写保护

protect on all  打开所有

protect off start end <start和end为起始地址和结束地址>

protect on start end

例: protect on 0 1FFFF

 

擦除FLASH,  Nor Flash无法写入1,所以需要用erase擦除来写入1

erase start end

例 erase 30000 1EFFFF

 

- Nand Flash命令-

nand info

nand erase

nand read[.jffs2] addr off size              .jffs代表ECC方式不同

nand read.yaffs addr off size

nand write[.jffs2] addr off size     .jffs代表ECC方式不同

nand write.yaffs addr off size

nand dump offset   打印offset开始的一个扇区的数据

 

- 设置环境变量 -

printenv      显示所有环境变量

setenv val item    添加/修改val变量,值为item

setenv val          把val的值清空了, 等效删除val

saveenv             把所有的env都保存至flash(关机后不会丢失)

 

bootdelay是开机延时的时间变量

 

从NAND启动参数

setenv bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0    <设置root的存储设备>

setenv bootcmd "nand read 0x30000000 0x60000 0x2300000; bootm 0x30000000" <设置kernel的起始地址>

 

设置YAFFS启动,引导参数:

setenv bootargs noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0

 

设置NFS启动,引导参数:

setenv bootargs console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.201:/home/root/root_fs/fs_mini ip=192.168.1.227:192.168.1.201:192.168.1.201:255.255.255.0:sbc2440.arm9.net:eth0:off

 

- 启动命令 -

go 执行内存中的二进制代码<不带头的程序,比如 zImage>

go addr[arg...]

 

bootm 执行内存中的二进制代码<有固定格式的头,比如系统,格式,压缩,等头信息等,如uImage>

bootm[addr[arg...]]

如果addr省略,则存放到配置文件中定义的宏CFG_LOAD_ADDR

 

nboot 执行NandFlash中的代码

nboot[[[addr]dev]offset]从dev偏移offset处的映像复制到内存的addr处,如果环境变量autostart的值是yes,就启动这个映像

如果addr省略,则存放到配置文件中定义的宏CFG_LOAD_ADDR

如果dev省略,则取环境变量bootdevice的值

如果offset省略,默认为0

 

bootp 从网络中启动

= 2. 下载文件到开发板

下载固件有3种模式(串口,USB,网络)

 

- USB下载 -  <开发板常用/手机常用, 需要USB驱动>

usbslave

nand erase 0x100000 0x300000

            起始地址  大小

nand write 0x30000000 0x100000 0x300000       <目标地址必须是设置kernel的起始地址>

             源地址    目标地址  大小

 

usbslave   从USB下载 rootfs

nand erase 0x560000 0x305700

nand write.yaffs 0x30000000 0x560000 0x305700 0

<yaffs大小必须是528的倍数,所以0x305700必须要改大成是528的倍数>

 

- 串口下载 -  <任何设备维修时用,万能,但速度慢,115.2Kbps>

在超级终端下

loadb

loady

loadz

loadx 0x32000000      loadb跟上地址

然后点发送文件

 

- 网络通过tftp来下载  -  <网络设备专用, 速度快>

主机先 打开TFTP Server软件,将u-boot.bin拷贝至C:\Program Files\TftpdWin\

setenv ethaddr 12:34:56:78:xx:xx //开发板MAC地址

setenv ipaddr 192.168.0.x     //本开发板IP地址

setenv serverip 192.168.0.x         //服务器IP地址

下载指令tftp 0x32000000 uImage   //下载uImage到内存0x3200000地址的地方3

 

= 3. 烧入FLASH

假设FLASH地址分段

bootloader      0x0  ~0x40000

parameter       0x40000  ~0x50000

kernel             0x50000  ~0x250000

(空)

rootfs             0x270000~

 

- 烧U-BOOT - nand命令后面的地址 有0x和没有,都认为是16进制

下载u-boot.bin至Nand Flash 地址0x0处

1)借助DNW

跳线从Nor Flash启动,进入SuperViVi菜单界面,输入“n”,借助DNW,通过USB下载刚编译生成的u-boot.bin;

2)更新自已

SMDK2440A>tftp 0x30000000 u-boot.bin   // 通过tftp server下载u-boot.bin至开发板内存0x30000000 地址处

SMDK2440A>nand erase 0x0 0x40000       //首先擦除Nand Flash从0x0 开始,大小为0x40000 ,来存放u-boot.bin

SMDK2440A>nand write.jffs2 30000000 0 0x40000 //烧写u-boot.bin至0x0 开始的Nand Flash

 

- 烧kernel-

先从zImage转到uImage

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

Image Name:   linux-2.6.14

Created:      Fri Jan 12 17:14:50 2007

Image Type:   ARM Linux Kernel Image (uncompressed)

Data Size:    1262504 Bytes = 1232.91 kB = 1.20 MB

Load Address: 0x30008000

Entry Point:  0x30008000

 

        -A ==> set architecture to 'arch'

        -O ==> set operating system to 'os'

        -T ==> set image type to 'type'

        -C ==> set compression type 'comp'

        -a ==> set load address to 'addr' (hex)

        -e ==> set entry point to 'ep' (hex)

        -n ==> set image name to 'name'

        -d ==> use image data from 'datafile'

        -x ==> set XIP (execute in place)

 

 

SMDK2440A>tftp 0x32000000 uImage       // 通过tftp server下载uImage至开发板内存0x32000000 地址处

SMDK2440A>nand erase 0x50000 0x200000      //首先擦除Nand Flash从0x50000 开始,大小为0x200000 的空间,来存放uImage

SMDK2440A>nand write.jffs2 0x32000000 0x50000 0x200000 //烧写uImage至0x30000

 

想开发板上电后自动启动kernel则要设置bootcmd环境变量

set bootcmd 'nand read 32000000 50000 2000000; bootm 32000000'

saveenv

 

- 烧rootfs-

SMDK2440A>tftp 0x30000000 root_qtopia.img// 通过tftp server下载root_qtopia.img至开发板内存0x30000000 地址处

SMDK2440A>nand erase 0x270000 $(filesize) //首先擦除Nand Flash从0x270000 开始,大小为$(filesize)

(可用echo $(filesize)来查看root_qtopia.img的大小),来存放root_qtopia.img

SMDK2440A>nand write.yaffs 30000000 270000 $(filesize) //烧写root_qtopia.img至0x270000 开始的Nand Flash

SMDK2440A>boot

 

注明: $(filesize) 为系统环境变量, 可以用printenv查看, 调用tftp后,系统自动会更新$(filesize) 的值,

直接调用即可,不必查看后再输入

 

kernel烧写步骤

 

1. 从内核源文件kernel/arch/arm/configs/里找一个config样本

2. 把样本复制到kernel/目录复制成 .config

   例:  指令 cp xxx_config .config

3. make distclean清除垃圾

4. make menuconfig 打开配置介面

5. 修改配置 , 最后选save保存配置

6. make zImage CROSS_COMPILE=arm-linux-

7. 把生成的/arch/arm/boot/zImage 放到当初u-boot源代码中/tools里去,

   <有一个写好的mkz2uimage脚本>使用mkimage生成uImage

8. 用nand启动u-boot

9. 用DNW软件用usbslave用USB传输uImage到内存中

   注意u-boot默认下载的地址

10. bootm 地址 , 从内存中启动内核,验证内核是否正常<启动了kernel,不能再回到u-boot>

===========

    关机,开机,从nand启动u-boot重下载kernel

11. nand erase 60000<nand偏移量> 400000<大小>  清除kernel区

    nand write.jffs2 30000000<内存中的地址> 60000<nand偏移量> 400000<大小>

 

12.

=============

2.X86平台  make bzImage

                     但要肥编好的zImage复制到/boot 并改名为vmlinuz-版本号

                     修改/boot/grub/grub.conf内容为当前内核版本

 

                     ==== 驱动模块的编译, 和存放

                     编译内核时,编译选译M的模块, make modules

                     然后安装M模块, make modules_install

                     (安装实际是将编译好的*.ko代码,复制到/lib/modules/<$version>/kernel/arch/x86/kernel/下)

                     <2.4内核,都叫*.o, 2.6之后的动态驱动都改成*.ko, 是由*.mod.o+*.o构成>

                     单个编译时,自已写个makefile,用make编译,然后自已复制到/lib/modules下面

                     对于ARM平台,因为系统的根目录还没有生成,所以*.ko将延后到rootfs根文件系统中存放

 

                     = ramdisk

                     X86需要 还需要把内核中M的模块,制作成ramdisk,

                     "用mkinitrd initrd-版本号 版本号目录名"

                     "版本号目录名"为刚刚安装的M模块/lib/modules下

                     命令类似mkinitrd initrd-2.6.32.2 2.6.32.2

                     mkinitrd initrd-2.6.18-8.el5xen 2.6.18-8.el5xen

                     也复制到/boot 并改名为initrd-版本号.img

                     修改/boot/grub/grub.conf内容为当前内核版本

                     ====