linux2.6.32 移植到s3c2410平台上

    这个星期移植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

扫描二维码关注公众号,回复: 4052249 查看本文章

再重新登陆.

[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

猜你喜欢

转载自blog.csdn.net/zhjixi495/article/details/8087844
今日推荐