这个星期移植2.6.32内核到TE2410弄了三天,今天终于成功了,。接下来把自己移植过程做个小笔记,以便日后自己遇到同样的问题时能花更少的时间去解决。
先修改源码目录中的Makefile文件
找到ARCH和CROSS_COMPILE,修改
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
然后设置你的PATH环境变量,使其可以找到你的交叉编译工具链
[arm@localhost ]# echo $PATH
/opt/FriendlyARM/toolschain/4.4.3/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
如果/opt/FriendlyARM/toolschain/4.4.3/bin/不在搜索路径, 加入下面语句在~/.bashrc中
[arm@localhost ]# vi ~/.bashrc
export PATH=/opt/FriendlyARM/toolschain/4.4.3/bin:$PATH
再重新登陆.
[arm@localhost]#su arm
1.在arch/arm/kernel/head.S增加如下内容
movr0,#0
movr1,#0xc1
ldrr2,=0x30000100
增加后内容如下(只复制了head.S内容的一小部分)
.section ".text.head", "ax"
ENTRY(stext)
movr0,#0
movr1,#0xc1
ldrr2,=0x30000100
setmodePSR_F_BIT | PSR_I_BIT | SVC_MODE, r9 @ ensure svc mode
@ and irqs disabled
mrcp15, 0, r9, c0, c0@ get processor id
bl__lookup_processor_type@ r5=procinfo r9=cpuid
movsr10, r5@ invalid processor (r5=0)?
beq__error_p@ yes, error 'p'
bl__lookup_machine_type@ r5=machinfo
movsr8, r5@ invalid machine (r5=0)?
beq__error_a@ yes, error 'a'
bl__vet_atags
bl__create_page_tables
加这三个汇编语句,是linux内核启动时需要bootloader传递给它的参数,可能因我的bootloader有点问题,所以r1传递错误,所以我就强制在内核引导前面加了这三条语句。
2.make s3c2410_defconfig 使用缺省内核配置文件,s3c2410_defconfig 是TE2410 的缺省配置文件
3.在linux-2.6.32.2/arch/arm/tools/mach_types文件中增加一个TE2410的机器码,以下是自己实际在此文件添加的内容
smdk2410 ARCH_TE2410 TE2410 193
4.将linux-2.6.32.2/arch/arm/mach-s3c2410/目录下的mach-smdk2410.c 复制一份。命名为
mach-te2410.c , 找到MACHINE_START(S3C2410, "SMDK2410") , 修改为
MACHINE_START(MINI2440, "zhjixi495 TE2410")。
5.在linux-2.6.32.2/arch/arm/mach-s3c2410/mach-te2410.c中的
static void __init smdk2440_map_io(void)函数中,
把s3c24xx_init_clocks(0);改为TE2410开发板上实际用的晶振频率 s3c24xx_init_clocks(12000000)
因为我们要制作自己的te2410 平台体系,因此把mach-te2440.c 中所有的
smdk2410 字样改为te2440,可以使用批处理命令修改,在vim 的命令模式下输入:
%s/smdk2410/te2410/g
上面这句的意思是:把所有和“smdk2440”匹配的字符串全部替换为“te2440”,前
面的“%s“代表字符串匹配,最后的“g”代表global,是全局的意思
实际使用的12000000
在static void __init te2410_init(void)函数中的smdk_machine_init()函数注解掉
在te2410_devices中添加&s3c_device_nand一行
static struct platform_device *te2410_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_nand,//把nand flash 设备添加到开发板的设备列表结构
};
6.在linux-2.6.32.2/arch/arm/mach-s3c2410/Kconfig文件中添加
config MACH_TE2410
bool "TE2410"
default y
select CPU_S3C2410
select S3C_DEV_USB_HOST
select S3C_DEV_NAND
help
Say Y here if you are using the Armzone TE2410 ADD BY ZHENGJIXIAN G
7.在linux-2.6.32.2/arch/arm/mach-s3c2410/Makefile文件中添加
obj-$(CONFIG_MACH_TE2410) += mach-te2410.o
这样增加后,在make menuconfig中在选择TE2410时,就会在内核中添加te2410模块,当然也可以不在Kconfig中添加任何内容,只在Makefile中强制把mach-te2410.o也行,但这样做不好,因为这样做就变化te2410是不可配置的了。
8.修改Nand Flash 分区表
打开/arch/arm/plat-s3c24xx/common-smdk.c可以看到static struct mtd_partition smdk_default_nand_part 结构体,
把这个结构体内的各分区情况跟bootloader里的分区表设置成一致。
我的vivi中的Nand Flash 分区表内容如下:
vivi> part show
mtdpart info. (5 partitions)
name offset size flag
------------------------------------------------
vivi : 0x00000000 0x00020000 0 128k
param : 0x00020000 0x00010000 0 64k
kernel : 0x00030000 0x00300000 0 3M
root : 0x00330000 0x00a00000 0 10M
usr : 0x00d30000 0x03000000 0 48M
所以在smdk_default_nand_part结构体内容如下:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name= "vivi",
.size= 0x20000,
.offset= 0,
},
[1] = {
.name= "param",
.offset = 0x20000,
.size= 0x10000,
},
[2] = {
.name= "kernel",
.offset = 0x30000,
.size= 0x300000,
},
[3] = {
.name= "root",
.offset= 0x330000,
.size= 0xa00000,
},
[4] = {
.name= "usr",
.offset = 0xd30000,
.size= 0x3000000,
},
};
在smdk_devs结构中,若没有&s3c_device_nand这句,则添加此一行
/* devices we initialise */
static struct platform_device __initdata *smdk_devs[] = {
&s3c_device_nand,
&smdk_led4,
&smdk_led1,
&smdk_led2,
&smdk_led3,
};
9.把vivi中的linux_cmd_linux设置为:Linux command line: noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
注意root=/dev/mtdblock3 而不是 root=/dev/mtdblock/3
10.解决ECC错误问题
修改 drivers/mtd/nand/s3c2410.c 文件:
vi drivers/mtd/nand/s3c2410.c
找到 s3c2410_nand_init_chip()函数,在该函数体最后加上一条语句:
chip->eccmode = NAND_ECC_NONE;
保存,退出。
11.在make menuconfig中的
Boot options中也添加如下一行
noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
make s3c2410_defconfig
启动时出大错:warning:unable to open an initial console.
-->
缺少 /dev/console 和 /dev/null
在建立他們之前UDEV就先使用到他們了
cd /dev
mknod -m 660 console c 5 1
mknod -m 660 null c 1 3