移植烧写步骤
1. 解压 u-boot 源文件
2. 从 u-boot/include/configs 里找相近的配置,复制成自已的名字
3. 改 makefile 文件增加目标,比如 mini2440_config: arm<体系> <文
件夹名字> <公司/开发者,可以为 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-
/* CROSS_COMPILE= 后面可以跟工具链名称, 也可以跟 路径的绝对地址 */
8. 在 uboot/下生成了 uboot.bin
9. 传输数据到内存
9.1 烧写机<工厂级,Nand 中的 bootload 已被破坏>
9.2 USB+驱动 输入指令 usbslave ,然后给计算机制定文件
<如果 Nand 中的 bootloader 已被破坏, 又不是开发板, 则成砖头机>
9.3 串口 输入 指令 loadx ,然后给计算机制定文件
9.4 网络 输入 指令 tftp <遇先要在 u-boot 环境变量
里设定好服务器和本机的 IP 地址,MAC 地址,网关,MASK>
(注:数据传输指令后可以跟数据输入的内存目标地址, 默认是 bootloader 的 mini2440.h 里
CONFIG_SYS_LOAD_ADDR 指定的值)
10. 烧写进 Nand
10.1 先擦除 nand erase offset len<数据长度>
10.2 写入 nand write.jffs2 addr<内存基址> offset len<数据长度>
/*
bootloader 和 kernel 用 jffs2 的 ECC 方式写入 , 不可用 yaffs 文件系统格式 */
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
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
nand read.yaffs addr off size
nand write[.jffs2] addr off size
nand write.yaffs addr off size
nand dump offset 打印 offset 开始的一个扇区的数据
.jffs 代表 ECC 方式不同
.jffs 代表 ECC 方式不同
- 设置环境变量 -
printenv
setenv val item
setenv val
saveenv
显示所有环境变量
添加/修改 val 变量,值为 item
把 val 的值清空了, 等效删除 val
把所有的 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
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
console=ttySAC0
root=/dev/nfs
- 启动命令 -
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
- 串口下载 - <任何设备维修时用,万能,但速度慢,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
setenv serverip 192.168.0.x
下载指令 tftp 0x32000000 uImage
//本开发板 IP 地址
//下载 uImage 到内存 0x3200000 地址的地方 3
//服务器 IP 地址
= 3. 烧入 FLASH
假设 FLASH 地址分段
bootloader
0x0 ~0x40000
parameter0x40000 ~0x50000
kernel
(空)
rootfs
0x270000~
0x50000 ~0x250000
- 烧 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
0x40000 ,来存放 u-boot.bin
SMDK2440A>nand write.jffs2 30000000 0 0x40000 //烧写 u-boot.bin 至 0x0 开始的 Nand Flash
// 首 先 擦 除 Nand Flash 从 0x0 开 始 , 大 小 为
- 烧 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:
Created:
Image Type:
Data Size:
Load Address: 0x30008000
Entry Point:
0x30008000
linux-2.6.14
Fri Jan 12 17:14:50 2007
ARM Linux Kernel Image (uncompressed)
1262504 Bytes = 1232.91 kB = 1.20 MB
-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
0x32000000 地址处
SMDK2440A>nand erase 0x50000 0x200000
为 0x200000 的空间,来存放 uImage
SMDK2440A>nand write.jffs2 0x32000000 0x50000 0x200000 //烧写 uImage 至 0x30000
// 通 过 tftp server 下 载 uImage 至 开 发 板 内 存
//首先擦除 Nand Flash 从 0x50000 开始,大小
想开发板上电后自动启动 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 400000<大小> 清除 kernel 区
nand write.jffs2 30000000<内存中的地址> 60000 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 内容为当前内核版本
====