Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1334732
  • 博文数量: 177
  • 博客积分: 3640
  • 博客等级: 中校
  • 技术积分: 1778
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-27 16:51
文章分类

全部博文(177)

文章存档

2014年(1)

2013年(10)

2012年(3)

2011年(163)

分类: LINUX

2011-05-07 15:57:02

移植环境:
主机:Red.Hat.Enterprise.Linux.AS.V4
交叉编译器:arm-linux-gcc-3.4.1
开发板平台:S3C2440(GEC-2440开发板)
--------------------------------------------------------------------------------------------
准备工作:
下载Linux内核源代码: 交叉编译工具包:从光盘一般都带,没有到网上找找也有。
解压源码:tar -jxvf linux-2.6.24.4.tar.bz2
安装交叉编译工具:tar -jxvf arm-linux-gcc-3.4.1.tar.bz2 -C /
会将工具安装在/usr/local/arm/3.4.1/中,视各人的环境可能不同,自己修改Makefile中的路径即可。
--------------------------------------------------------------------------------------------------------------------
修改配置文件:
1.修改Makefile,匹配交叉编译器。
在内核代码根目录下:vim Makefile
在193行找到ARCH
修改为
ARCH = arm
CROSS_COMPILE ?= /usr/local/arm/3.4.1/bin/arm-linux-
CORSS_COMPILE视自己的环境定
2. 为了内核支持devfs 以及在启动时并在/sbin/init 运行之前能自动挂载/dev为devfs 文件系统。编辑fs/Kconfig:
在906 行menu "Pseudo filesystems"下面添加如下代码:
config DEVFS_FS
bool "/dev file system support (OBSOLETE)"
default y
config DEVFS_MOUNT
bool "Automatically mount at boot"
default y
depends on DEVFS_FS
--------------------------------------------------------------------------------------------------------------------
修改源代码:
1. 修改对nand的分区信息。要让内核知道nand flash的分区信息,设置成跟bootloader一致。
在arch/arm/plat-s3c24xx/common-smdk.c中修改smdk_default_nand_part[],注意这个一定要跟bootloader的一致。在我的板子中修改如下:
static struct mtd_partition smdk_default_nand_part[] = {
[0]={
.name = "boot",
.size = SZ_128K + SZ_64K, //192k 0x00300000
.offset = 0,
},
[1]={
.name = "kernel",
.size = SZ_16K * 116, //2M - 192K 0x01e00000
.offset = SZ_16K *12, //192K
},
[2]={
.name = "rootfs",
.offset = SZ_2M,
.size = SZ_2M * 15, //30M
},
[3]={
.name = "User",
.offset = SZ_32M,
.size = SZ_32M,
}
};
另外这个文件还要修改smdk_nand_info如下:
static struct s3c2410_platform_nand smdk_nand_info = {
.tacls = 0, //default is 20
.twrph0 = 30, //default is 60
.twrph1 = 0, //defualt is 20 changed by yangdk
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};
2. 修改时钟
在arch/arm/mach-s3c2440/mach-smdk2440.c中修改smdk2440_map_io如下
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000); //default is 16934400, changed by yangdk
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
3.修改nand Flash的校验方式,去掉ECC校验。
在drivers/mtd/nand/s3c2410.c 第669行
将chip->ecc.mode = NAND_ECC_SOFT;
改为 chip->ecc.mode = NAND_ECC_NONE;
注意:这个去掉ECC校验的问题,在内核中明确说明是不建议这样做的,因为这样就等于忽略了对NAND FLASH坏块的检测。而我一开始也是编译的时候就去掉了ECC校验的选项,原以为在编译选项中去掉就可以了,结果一直报这样的错:
end_request: I/O error, dev mtdblock2, sector 0
FAT: unable to read boot sector
VFS: Cannot open root device "mtdblock2" or unknown-block(31,2)
Please append a correct "root=" boot option; here are the available partitions:
1f00 192 mtdblock0 (driver?)
1f01 1856 mtdblock1 (driver?)
1f02 30720 mtdblock2 (driver?)
1f03 32768 mtdblock3 (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)
郁闷了一个整天。后来发现配置中去掉的这个选项在代码中并没有完全去掉,只是去掉了硬件校验的方式,换成了软件校验。只有在代码中给改成NAND_ECC_NONE,才不会校验,但是这样是不提倡的。可是这有这样最后我的系统才起来,阿弥陀佛!
配置及编译内核
先把默认配置文件拷贝过来
cp arch/arm/configs/s3c2410_defconfig .config
配置
Make menuconfig
[*] Enable loadable module support --->
[*] Module unloading
[*] Automatic kernel module loading
选择这两个,剩下的可以去掉
System Type ---->
[*] S3C2410 DMA support
[*] Support ARM920T processor
S3C2410 Machines --->
[*] SMDK2410/A9M2410
S3C2440 Machines --->
[*] SMDK2440
[*] SMDK2440 with S3C2440 CPU module
System Type这部分,只选这些,其他可以全部去掉,我的这个还选上了队Thumb的支持。另外,网上一些帖子都说只选上SMDK2440就可以了,其他的都去掉,事实上是不行的,我试了多次,都在编译时
到arch/arm/plat-s3c24xx/s3c24xx.o时,报错:
arch/arm/plat-s3c24xx/s3c244x.c: In function `s3c244x_init_clocks':
arch/arm/plat-s3c24xx/s3c244x.c:121: error: implicit declaration of function `s3c2410_baseclk_add'
make[1]: *** [arch/arm/plat-s3c24xx/s3c244x.o] 错误 1
make: *** [arch/arm/plat-s3c24xx] 错误 2
我再选上SMDK2410/A9M2410,问题解决。
Boot option ----->
修改启动参数为:
noinitrd root=/dev/mtdblock2 init=/linuxrc console=ttySAC0,115200
可能根据个人板子的设置会不一样,我的是从Nand Flash中加载文件系统,其中mtdblock2是存放我的Linux文件系统的分区。不过,在bootloader可以传递内核参数的情况下这个设置是无效的。
Device Drivers --->
<*> Memory Technology Device (MTD) support --->
[*] MTD partitioning support
<*> NAND Device Support --->
<*> NAND Flash support for S3C2410/S3C2440 SoC
[ ] S3C2410 NAND Hardware ECC //这个要去掉
[*] Network device support --->
[*] Ethernet (10 or 100Mbit) --->
<*> DM9000 support
< > Real Time Clock ---> //这个去掉
去掉红字的两个部分,黑子部分选上,其他的选择默认就可以了。
File systems --->
<*> ROM file system support
因为我的文件系统用cramfs,选择这个,其他用默认。
到此为止,基本完成。下面正式编译
make zImage
……
上个厕所,洗把脸,吃个苹果,20分钟后陆续出现这个
SYSMAP System.map
SYSMAP .tmp_System.map
OBJCOPY arch/arm/boot/Image
Kernel: arch/arm/boot/Image is ready
AS arch/arm/boot/compressed/head.o
GZIP arch/arm/boot/compressed/piggy.gz
AS arch/arm/boot/compressed/piggy.o
CC arch/arm/boot/compressed/misc.o
LD arch/arm/boot/compressed/vmlinux
OBJCOPY arch/arm/boot/zImage
Kernel: arch/arm/boot/zImage is ready
小高兴一下,编译成功!

但此时下载内核还未能运行,还欠系统文件~~~

阅读(618) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~