1. 程式人生 > >linux2.6.32 移植到s3c2410平臺上

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

再重新登陸.

[

[email protected]]#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, [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