移植內(nèi)核:2.6.30.4
內(nèi)核根目錄下的.config為當(dāng)前配置內(nèi)核的且已經(jīng)配置好的內(nèi)核配置。make zImage以此為依據(jù)
配置內(nèi)核的過程:
cd linux-2.6.30.4(進(jìn)入Linux根目錄)
cp arch/arm/configs/s3c2410_defconfig /linux-2.6.30.4(作為配置參考,考到根目錄下)
mv s3c2410_defconfig .config(改名為.config)
make menuconfig ARCH=arm(ARCH=arm不能少)
配置過程
退出時(shí)記得選yes保存為.config(確保該配置是你已經(jīng)配置且保存的配置,就算不改動(dòng)也要保存。否則不能生成.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 即可生成壓縮內(nèi)核印象
uboot引導(dǎo)內(nèi)核,入口點(diǎn)必須為0x30008000
zImage:go 0x30008000
uImage:bootm 0x30008000
busybox下載地址:
http://busybox.net/
linux快速修改文件夾及文件下所有文件與文件夾權(quán)限
chmod 777 * -R
uboot的tftp下載出現(xiàn)如下錯(cuò)誤:
TFTP error: 'Permission denied' (0)
改正方法就是給待下載的文件加上可執(zhí)行(chmod 777 文件)權(quán)限
uboot的使用:tftp下載內(nèi)核,直接用交叉網(wǎng)線連接PC(實(shí)際上為虛擬機(jī))和開發(fā)板即可
uboot啟動(dòng)之后,輸入:printenv 查看
serverip是不是你的虛擬機(jī)的ip(終端ifconfig即可查看)
ipaddr要和serverip在同一個(gè)網(wǎng)段,即ip的前三段必須相同
ethaddr:開發(fā)板dm9000的MAC物理地址
netmast:子網(wǎng)掩碼:255.255.255.0
serverip,ipaddr,ethaddr,netmast不符合要求的話,可以使用命令設(shè)置:(示例)
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 //設(shè)置完畢記得保存環(huán)境變量
uboot啟動(dòng)內(nèi)核:uboot版本(2009.08)
條件:uboot的機(jī)器碼和內(nèi)核的機(jī)器碼要一樣
uboot部分修改:
機(jī)器碼:
#gedit board/samsung/my2440/my2440.c
gd->bd->bi_arch_number = MACH_TYPE_SMDK2440
內(nèi)核部分:內(nèi)核版本(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換成十六進(jìn)制就是0x3f0
ldr r2, =0x30008000
內(nèi)核中的nand分區(qū)一定要和bootloader中的一致:
#gedit arch/arm/plat-s3c24xx/common-smdk.c
offsize size
uboot : 0x00000000 0x00030000 //192kb
param : 0x00030000 0x00040000 //這個(gè)環(huán)境變量的地址范圍配置的CONFIG_ENV_OFFSET一致
kernel: 0x00080000 0x00500000 //5mb
root : 0x00580000 0x0c800000 //200mb
#gedit uboot/include/cofings/mini2440.h
查看:MTDPART_DEFAULT = " " //默認(rèn)分區(qū)
編譯得到內(nèi)核zImage
uImage的制作:
先將u-boot下的tools中的mkimage復(fù)制到主機(jī)的/usr/local/bin目錄下,執(zhí)行以下命令:
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命令下載,開關(guān)撥到nand啟動(dòng)
uImage和根文件系統(tǒng),考到tftp的收發(fā)文件夾,使用tftp服務(wù)傳送
在u-boot命令行下輸入:(自啟動(dòng)的將內(nèi)核讀入內(nèi)存)
set bootcmd 'nand read 0x30008000 內(nèi)核偏移地址 內(nèi)核區(qū)大小;bootm 0x30008000'
saveenv
把uImage.img用tftp下載到內(nèi)存中,然后再固化到Nand Flash中,操作和執(zhí)行圖如下:
tftp 0x30008000 uImage.img //將uImage.img下載到內(nèi)存0x30008000處
nand erase 0x80000 0x500000 //擦除nand的kernel分區(qū)(officesize ,size)
nand write 0x30008000 0x80000 0x500000 //將內(nèi)存0x30008000處的內(nèi)容寫入到nand的kernel分區(qū)
重啟開發(fā)板(reset命令),完成內(nèi)核自啟動(dòng)
第一個(gè)分區(qū)(bootloader)對應(yīng)mtdblock0
第二個(gè)分區(qū)(param參數(shù))對應(yīng)mtdblock1
第三個(gè)分區(qū)(kernel)對應(yīng)mtdblock2
第四個(gè)分區(qū)(root根文件系統(tǒng))對應(yīng)mtdblock3
此處的命令參數(shù)取代內(nèi)核配置的boot命令參數(shù),不輸入則默認(rèn)內(nèi)核的boot參數(shù)
內(nèi)核自啟動(dòng)yaffs2文件系統(tǒng):
uboot命令行下輸入:
set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0,115200 mem=64M
saveenv
把root-2.6.30.4.bin用tftp下載到內(nèi)存中,然后再固化到Nand Flash中,操作和執(zhí)行圖如下:
tftp 0x30008000 root-2.6.30.4.bin //將root-2.6.30.4.bin下載到內(nèi)存0x30008000處
nand erase 0x00580000 0x0c800000 //擦除nand處0x00380000大小0x0c800000的內(nèi)容(文件系統(tǒng)分區(qū))
nand write.yaffs2 0x30008000 0x00580000 rootfs的大小 //將內(nèi)存0x30008000處的內(nèi)容寫入到nand的0x00380000處
重啟開發(fā)板(reset命令),完成內(nèi)核自啟動(dòng)yaffs2文件系統(tǒng)
yaffs2文件系統(tǒng)制作注意:
制作好的文件系統(tǒng)要是2112的整數(shù)倍(128MB及以上的flash用mkyaffs2image-128M工具),
【528的整數(shù)倍(64M的flash用mkyaffs2image工具)】
否則tftp下載到nand的話,會(huì)提示attempt to write error length data的錯(cuò)誤
[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
}
Wrong Image Format for bootm command 出錯(cuò)原因:
1) 未使用uboot中mkimage 工具制作uImage,卻使用bootm 啟動(dòng)
2) tftp 傳送地址錯(cuò)誤
3) nand write 格式和地址錯(cuò)誤
4) nand read 格式和地址錯(cuò)誤