linux2.6.32 移植到s3c2410平臺上
這個星期移植2.6.32核心到TE2410弄了三天,今天終於成功了,。接下來把自己移植過程做個小筆記,以便日後自己遇到同樣的問題時能花更少的時間去解決。
先修改原始碼目錄中的Makefile檔案
找到ARCH和CROSS_COMPILE,修改
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
然後設定你的PATH環境變數,使其可以找到你的交叉編譯工具鏈
[[email protected] ]# 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中
[[email protected] ]# vi ~/.bashrc
export PATH=/opt/FriendlyARM/toolschain/4.4.3/bin:$PATH
再重新登陸.
[
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, [email protected] get processor id
[email protected] r5=procinfo r9=cpuid
movsr10, [email protected] invalid processor (r5=0)?
[email protected] yes, error 'p'
[email protected] r5=machinfo
movsr8, [email protected] invalid machine (r5=0)?
[email protected] 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