Uboot启动内核/yaffs2文件系统方法

2,231次阅读
没有评论
uboot 移植中注意的问题:
移植内核:2.6.30.4
内核根目录下的.config 为当前配置内核的且已经配置好的内核配置。make zImage 以此为依据
配置内核的过程:
cd linux-2.6.30.4(进入 Linux 根目录)
cp arch/arm/configs/s3c2410_defconfig /linux-2.6.30.4(作为配置参考,考到根目录下)
mv s3c2410_defconfig .config(改名为.config)
make menuconfig ARCH=arm(ARCH=arm 不能少)
配置过程
退出时记得选 yes 保存为.config(确保该配置是你已经配置且保存的配置,就算不改动也要保存。否则不能生成.config)
make zImage ARCH=arm CROSS_COMPILE=arm-linux-(ARCH=arm 不可少)
或者
Makefile 中定于 ARCH=arm CROSS_COMPILE=arm-linux-
1,make s3c2410_defconfig(生成.config)
2,make zImage 即可生成压缩内核印象
uboot 引导内核,入口点必须为 0x30008000
zImage:go 0x30008000
uImage:bootm 0x30008000
busybox 下载地址:
http://busybox.net/
linux 快速修改文件夹及文件下所有文件与文件夹权限
chmod 777 * -R
uboot 的 tftp 下载出现如下错误:
TFTP error: ‘Permission denied’ (0)
改正方法就是给待下载的文件加上可执行(chmod 777 文件)权限
uboot 的使用:tftp 下载内核,直接用交叉网线连接 PC(实际上为虚拟机)和开发板即可
uboot 启动之后,输入:printenv 查看
serverip 是不是你的虚拟机的 ip(终端 ifconfig 即可查看)
ipaddr 要和 serverip 在同一个网段,即 ip 的前三段必须相同
ethaddr:开发板 dm9000 的 MAC 物理地址
netmast:子网掩码:255.255.255.0
serverip,ipaddr,ethaddr,netmast 不符合要求的话,可以使用命令设置:(示例)
setenv serverip 169.254.209.223
setenv ipaddr 169.254.209.113
setenv netmast 255.255.255.0
setenv ethaddr 00:01:02:03:04:05
saveenv // 设置完毕记得保存环境变量
uboot 启动内核:uboot 版本(2009.08)
条件:uboot 的机器码和内核的机器码要一样
uboot 部分修改:
机器码:
#gedit board/samsung/my2440/my2440.c
gd->bd->bi_arch_number = MACH_TYPE_SMDK2440
内核部分:内核版本(2.6.30.4)
#gedit arch/arm/mach-s3c2440/mach-smdk2440.c
MACHINE_START(SMDK2440, “SMDK2440”)
#gedit arch/arm/kernel/head.S  // 在 ENTRY(stext) 下添加如下代码
ENTRY(stext)
    mov    r0, #0
    mov    r1, #0x3f0   // 上面的 MACH_TYPE 值 1008 换成十六进制就是 0x3f0
    ldr    r2, =0x30008000
内核中的 nand 分区一定要和 bootloader 中的一致:
#gedit arch/arm/plat-s3c24xx/common-smdk.c
         offsize       size
uboot : 0x00000000    0x00030000 //192kb
param : 0x00030000    0x00040000 // 这个环境变量的地址范围配置的 CONFIG_ENV_OFFSET 一致
kernel: 0x00080000    0x00500000 //5mb
root  : 0x00580000    0x0c800000  //200mb
编译得到内核 zImage
uImage 的制作:
先将 u -boot 下的 tools 中的 mkimage 复制到主机的 /usr/local/bin 目录下,执行以下命令:
mkimage -n ‘linux-2.6.30.4’ -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d zImage uImage.img
uboot.bin 拷贝到 XP,用 supervivi 的 a 命令下载,开关拨到 nand 启动
uImage 和根文件系统,考到 tftp 的收发文件夹,使用 tftp 服务传送
在 u -boot 命令行下输入:(自启动的将内核读入内存)
set bootcmd ‘nand read 0x30008000 内核偏移地址 内核区大小;bootm 0x30008000’
saveenv
把 uImage.img 用 tftp 下载到内存中,然后再固化到 Nand Flash 中,操作和执行图如下:
tftp 0x30008000 uImage.img  // 将 uImage.img 下载到内存 0x30008000 处
nand erase 0x80000 0x500000 // 擦除 nand 的 kernel 分区(officesize ,size)
nand write 0x30008000 0x80000 0x500000 // 将内存 0x30008000 处的内容写入到 nand 的 kernel 分区
重启开发板(reset 命令),完成内核自启动
第一个分区(bootloader)对应 mtdblock0
第二个分区(param 参数)对应 mtdblock1
第三个分区(kernel)对应 mtdblock2
第四个分区(root 根文件系统)对应 mtdblock3
此处的命令参数取代内核配置的 boot 命令参数,不输入则默认内核的 boot 参数
内核自启动 yaffs2 文件系统:
uboot 命令行下输入:
set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 mem=64M
saveenv
把 root-2.6.30.4.bin 用 tftp 下载到内存中,然后再固化到 Nand Flash 中,操作和执行图如下:
tftp 0x30008000 root-2.6.30.4.bin  // 将 root-2.6.30.4.bin 下载到内存 0x30008000 处
nand erase 0x00580000  0x0c800000 // 擦除 nand 处 0x00380000 大小 0x0c800000 的内容 (文件系统分区)
nand write.yaffs2 0x30008000 0x00580000 rootfs 的大小 // 将内存 0x30008000 处的内容写入到 nand 的 0x00380000 处
重启开发板(reset 命令),完成内核自启动 yaffs2 文件系统
yaffs2 文件系统制作注意:
制作好的文件系统要是 2112 的整数倍(128MB 及以上的 flash 用 mkyaffs2image-128M 工具),
【528 的整数倍(64M 的 flash 用 mkyaffs2image 工具)】
否则 tftp 下载到 nand 的话,会提示 attempt to write error length data 的错误
[MY2440] # tftp 0x30008000 root-2.6.30.4.bin
dm9000 i/o: 0x20000300, id: 0x90000a46
DM9000: running in 16 bit mode
MAC: 08:00:3e:26:0a:5b
operating at unknown: 0 mode
Using dm9000 device
TFTP from server 169.254.209.223; our IP address is 169.254.209.113
Filename ‘root-2.6.30.4.bin’.
Load address: 0x30008000
Loading: T T ###################################T #############T #################
         ######################################T ###########################
         #################################################################
         #########################T T ########################################
         #################################################################
         #################################################################
         ###################T #########################
done
Bytes transferred = 6359232 (6108c0 hex)
[MY2440] # nand erase 0x380000 0xc800000
NAND erase: device 0 offset 0x380000, size 0xc800000
Erasing at 0xc800000 — 213254144% complete.
OK
[MY2440] # nand write.yaffs2 0x30008000 0x380000 0x6108c0
NAND write: device 0 offset 0x380000, size 0x6108c0
Skip the first good block 20000
Writing at 0x20000 —  6166528 bytes written: OK
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name= “uboot”,
.size  = 0x00000000,
.offset= 0x00030000,//192KB
},
[1] = {
.name= “param”,
.offset = 0x00030000,
.size= 0x00040000,//256KB
},
[2] = {
.name= “kernel”,
.offset = 0x00080000,
.size= 0x00500000,//5MB
},
[3] = {
.name= “root”,
.offset= 0x00580000,
.size= 0x0c800000,//200MB
}
正文完
 0
评论(没有评论)
验证码