转自:《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内容为当前内核版本
====