软硬件环境:
开发板:FL2440
交叉编译器:arm-linux-gcc-3.4.1
移植内核:linux-2.6.24
文件系统: yaffs2
清理工作
清理以前的配置并删除配置文件,在linux-2.6.24内核压缩包解压后的顶层目录下执行:
#make distclean
可能会出错,解决方法如下:
make报错:
Makefile:1503: *** 混和的隐含和普通规则。 停止。
解决方案:
这个原因可能是Make工具对低版本内核的Makefile一些旧的规则兼容不好,我们只需要修改对应的Makefile。
当前使用的Make工具对Makefile里面的有些规则不兼容造成了这个错误,要修改Makefile中不兼容的部分。
大概在 1503行,把:
/ %/: prepare scripts FORCE
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)
$(build)=$(build-dir)
修改为:
<pre name="code" class="plain">/: prepare scripts FORCE
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)
$(build)=$(build-dir)
%/: prepare scripts FORCE
$(Q)$(MAKE) KBUILD_MODULES=$(if $(CONFIG_MODULES),1)
$(build)=$(build-dir)
大概在 435行,把:
config %config: scripts_basic outputmakefile FORCE $(Q)mkdir -p include/linux include/config $(Q)$(MAKE) $(build)=scripts/kconfig $@
修改为:
<span style="font-size:14px;">config: scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@
%config:scripts_basic outputmakefile FORCE
$(Q)mkdir -p include/linux include/config
$(Q)$(MAKE) $(build)=scripts/kconfig $@</span></span>
指定编译环境
在顶层Makefile中修改:
第193行改为:
ARCH = arm
CROSS_COMPILE = /usr/local/arm/3.4.1/bin/arm-linux-
其中,ARCH指定了要编译的CPU架构在arm目录下面,CROSS_COMPILE则指定了交叉编译器所在的目录,可以是arm-linux-,此时交叉编译器为系统环境变量中指定的交叉编译器。
NAND_FLASH分区
这里分区要跟bootloader对NAND_FLASH的分区一致!
修改文件:arch/arm/plat-s3c24xx/common-smdk.c
修改结构体:static struct mtd_partitionsmdk_default_nand_part[]
<span style="font-size:14px;">/* NAND parititon from 2.4.18-swl5 */
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "Boot",
.size = 0x00100000,
.offset = 0
},
[1] = {
.name = "MyApp",
.size = 0x003c0000,
.offset = 0x00140000,
},
[2] = {
.name = "Kernel",
.size = 0x00300000,
.offset = 0x00500000,
},
[3] = {
.name = "fs_yaffs",
.size = 0x03c00000, //30M
.offset = 0x00800000,
},
[4] = {
.name = "WINCE",
.size = 0x03c00000,
.offset = 0x04400000,
}
};
</span>
修改结构体:smdk_nand_info
<span style="font-size:14px;">static struct s3c2410_platform_nand smdk_nand_info = {
.tacls = 0,
.twrph0 = 30,
.twrph1 = 0,
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};
</span>
时钟修改
修改文件:arch/arm/mach-s3c2440/mach-smdk2440.c
<span style="font-size:14px;">static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(12000000);//外部的晶振的频率是12MHz,打印信息乱码可能是这里的问题
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
</span>
修改机器码
1.如果使用FL2440默认的bootloader引导,则:
修改文件:arch/arm/tools/mach-types删除:
<span style="font-size:14px;">s3c2410 ARCH_S3C2410 S3C2410 182</span></span>
把:<span style="font-size:14px;">s3c2440 ARCH_S3C2440 S3C2440 362</span></span>
修改为:<span style="font-size:14px;">s3c2440 ARCH_S3C2440 S3C2440 193</span>
2.如果使用uboot引导,则:
(1)首先确认arch/arm/tools/mach-types有:
<span style="font-size:14px;">smdk2440 MACH_SMDK2440 SMDK2440 1008</span>
如果没有则添加。
然后,
(2)修改文件:arch/arm/mach-s3c2440/mach-smdk2440.c
把:
<span style="font-size:14px;">MACHINE_START(s3c2440, "SMDK2440")</span>
改为: <span style="font-size:14px;">MACHINE_START(SMDK2440, "SMDK2440")</span>
(3)修改文件:arch/arm/kernel/head.S
在:
ENTRY(stext)
后面添加:
<span style="font-size:14px;">mov r0,#0
mov r1,#0x3f0
ldr r2,=0x30000100
</span>
去掉Nand_Flash的ECC校验
修改文件:drivers/mtd/nand/s3c2410.c
在drivers/mtd/nand/s3c2410.c的第669行
在第669行
将:
chip->ecc.mode= NAND_ECC_SOFT;
修改为:
<span style="font-size:14px;">chip->ecc.mode = NAND_ECC_NONE;</span>
支持devfs文件管理器
修改文件:fs/Kconfig
找到:menu "Pseudo filesystems"
在这一行行后面增加:
<span style="font-size:14px;">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
</span>
支持开发板上K9F1G08的nandflash
修改文件:drivers/mtd/nand/nand_bbt.c
修改下面两个结构体:<span style="font-size:14px;">static struct nand_bbt_descr largepage_memorybased = {
.options = 0,
.offs = 0,
.len = 1, // 2表示256M,K9F1G08为128M修改为1
.pattern = scan_ff_pattern
};
static struct nand_bbt_descr largepage_flashbased = {
.options = NAND_BBT_SCAN2NDPAGE,
.offs = 0,
.len = 1, //原始值为2,支持128M的K9F1G08修改为1
.pattern = scan_ff_pattern
};
</span>
建立配置文件
因为s3c2410跟s3c2440有诸多相似点,所以把arch/arm/configs/s3c2410_defconfig拷贝到顶层目录,并改名为.config。再进行make menuconfig的时候就会在这个配置文件基础上修改。
支持Yaffs2文件系统
Yaffs2下载: http://download.csdn.net/detail/u013752202/9463804
解压cvs-root.tar.gz,并执行下面操作给内核打上补丁。
<span style="font-size:14px;">cd yaffs2
./patch-ker.sh c /home/zhw123/linux_source/linux-2.6.24
./patch-ker.sh c /home/zhw123/linux_source/linux-2.6.24
</span>
上面命令完成下面三件事情:
(1)修改内核fs/Kconfig
增加一行:source"fs/yaffs2/Kconfig"
(2)修改内核fs/Makefile
增加一行:ojb-$(CONFIG_YAFFS_FS)+=yaffs2/
(3)在内核fs/目录下创建yaffs2目录
将yaffs2源码目录下面的Makefile.kernel文件复制为内核fs/yaffs2/Makefie;
将yaffs2源码目录的Kconfig文件复制到内核fs/yaffs2目录下;
将yaffs2源码目录下的*.c *.h文件复制到内核fs/yaffs2目录下.
内核配置
执行make menuconfig
1. System Type配置
# make menuconfig ARCH=arm
[*] Enable loadable modulesupport --->
[*] Module unloading
[*] Automatic kernelmodule loading
选择这两个,剩下的可以去掉
System Type ---->
[*] S3C2410 DMA support
[*] Support ARM920T processor
S3C2410 Machines --->
[*] SMDK2410/A9M2410
S3C2440 Machines --->
[*] SMDK2440
[*] SMDK2440 with S3C2440 CPUmodule
System Type这部分,只选这些,其他可以全部去掉。 (经过测试,必须SMDK2410的选项)
2. Boot option配置
Boot option ----->
修改启动参数为:
noinitrd root=/dev/mtdblock5init=/linuxrc console=ttySAC0,115200
这里要根据开发板来设置,这里设置为从Nand_Flash加载系统,问价系统存放在mtdblock5分区。当bootloader引导内核的时候给内核传递了参数,那么优先bootloader传进来的参数,这个参数失效。
3.Userspacebinary formats配置
Userspace binary formats --->
< > Kernel support for a.out andECOFF binaries (去除该选项,a.out和ECOFF是两种可执行文件的格式,在ARM-Linux下一般都用ELF,所以这两种基本用不上。)
Device Drivers --->
<*> Memory Technology Device(MTD) support --->
[*] MTD partitioning support
<*> NAND Device Support --->
<*> NAND Flash support for S3C2410/S3C2440SoC
[ ] S3C2410 NAND Hardware ECC //去掉
[*] Network devicesupport --->
[*] Ethernet (10 or 100Mbit) --->
<*> DM9000 support
<*> Real TimeClock --->
[ ] Set system time from RTC onstartup and resume//去掉
其余默认不改。
4. File systems配置
File systems -->
< > Second extended fs support #去除对ext2的支持
< > Ext3 journalling file systemsupport #去除对ext3的支持
<*> Kernel automounter support
<*> Kernel automounter version 4support (also supports v3)
<*> Filesystem in Userspace support
Pseudo filesystems -->
[*] Virtual memory filesystem support (former shm fs)
<*>Userspace-driven configuration filesystem (EXPERIMENTAL)
Miscellaneous filesystems-->
<*> YAFFS2file system support
“N”掉[ ]Autoselect yaffs2 format 和
[ ]Cache short names in RAM ,因为这是给每页大于1024B的NAND Flash设计的
<*> Journalling Flash File System v2 (JFFS2)support
(0) JFFS2 debuggingverbosity (0 = quiet, 2 = noisy)
[*] JFFS2 write-bufferingsupport
[ ] JFFS2 summary support(EXPERIMENTAL)
[ ] JFFS2 XATTR support(EXPERIMENTAL)
[*] Advanced compressionoptions for JFFS2
[*] JFFS2 ZLIB compressionsupport
[*] JFFS2 RTIMEcompression support
[*] JFFS2 RUBINcompression support
JFFS2 default compression mode(priority) --->
Network File Systems -->
<*> NFS file system support
--下面全部选上,否则挂载NFS时可能出现protocol不支持--
[*]Provide NFSv3 client support
[*]Provide client support for the NFSv3 ACL protocol extension
[*]Provide NFSv4 client support (EXPERIMENTAL)
[*]Allow direct I/O on NFS files
<*> NFS serversupport
[*]Provide NFSv3server support
[*]Provide serversupport for the NFSv3 ACL protocol extension
[*]Provide NFSv4server support (EXPERIMENTAL)
--- Provide NFSserver over TCPsupport
[*] Root file systemon NFS
编译
1.执行make clean
每次内核配置或改动后都要执行清理步骤,从而保证改正生效。
2.make
这里也可以指定目标文件名称、CPU架构和交叉编译器,如make zImage ARCH=armCROSS_COMPILE=arm-linux-
编译生完成后目标文件zImage存放在arch/arm/boot/。
运行
下面是制作成uImage后由uboot引导运行的过程,文件系统为nfs
后续
以上移植是最简单的linux系统,还有很多驱动模块没有选择。为了调试方便,内核一般会挂载NFS文件系统,最后确定后在写进Nand_Flash,另外为了能够开启的ftp和telnet服务,开发板还需要支持网卡,FL2440开发板为支持DM9000网卡,……