linux-2.6.30.4移植至2440开发板经验谈

 一、下载linux-2.6.30.4源码,并解压

ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.30.4.tar.gz

 

tar zxvf linux-2.6.30.4.tar.gz

 

并且下载支持ARM的补丁文件,给标准内核打上ARM补丁。

 

ftp://ftp.arm.linux.org.uk/pub/linux/arm/kernel/v2.6/patch-2.6.0-rmk2.bz2

 

二、在系统中添加对ARM的支持

 

$vim Makefile

193#ARCH           ?= $(SUBARCH)
194 #CROSS_COMPILE  ?=
195 ARCH=arm
196 CROSS_COMPILE=arm-linux-

 注意:还需将arm-linux-编译器的路径添加到PATH环境变量。否则编译时无法找到编译器。


三、修改系统时钟

 

$vim arch/arm/mach-s3c2440/mach-smdk2440.c

 

系统的外部时钟为12MHz

160 static void __init smdk2440_map_io(void)
161 {
162         s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
163         //s3c24xx_init_clocks(16934400);
164         //edit by San

165         s3c24xx_init_clocks(12000000);
166         s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
167 }

 

说明:如果系统时钟不匹配,则出现乱码。

 

四、制作或者获取内核配置单.config

 

$make menuconfig

 

说明:一个比较好的做法是先调用自带的配置清单,该配置清单在arch/arm/configs目录,文件名为:s3c2410_defconfig,该配置文件几乎S3C24XX系列CPU的配置项,可以在此基础上修改配置项。x86的配置项在arch/x86/configs目录下,文件名为:i386_defconfig(32为cpu)。

 

五、修改机器码

【linux内核源码中查看机器码相关文件:】

$vim arch/arm/mach-s3c2440/mach-smdk2440.c

 

178 MACHINE_START(S3C2440, "SMDK2440")
179         /* Maintainer: Ben Dooks <ben@fluff.org> */
180         .phys_io        = S3C2410_PA_UART,
181         .io_pg_offst    = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
182         .boot_params    = S3C2410_SDRAM_PA + 0x100,
183
184         .init_irq       = s3c24xx_init_irq,
185         .map_io         = smdk2440_map_io,
186         .init_machine   = smdk2440_machine_init,
187         .timer          = &s3c24xx_timer,
188 MACHINE_END

修改机器码,使之与bootloader的机器码相同,这里使用的是u-boot,机器码为168

 

$vim arch/arm/tools/mach-types

 

 379 s3c2440                 ARCH_S3C2440            S3C2440                 168

 

$vim arch/arm/tools/Makefile

 7 include/asm-arm/mach-types.h: $(src)/gen-mach-types $(src)/mach-types
 8         @echo '  Generating $@'
 9         @mkdir -p $(dir $@)
10         $(Q)$(AWK) -f $^ > $@ || { rm -f $@; /bin/false; }

 

$vim include/asm/mach-types.h

375 #define MACH_TYPE_S3C2440              168


【U-boot中的相关配置文件】

$vim include/asm-arm/mach-types.h

377 #define MACH_TYPE_S3C2440              168

 

总结:首先从linux内核源码中找出机器类型(如S3C2440),其次,根据u-boot中给出的对应机器类型的机器码(如377 #define MACH_TYPE_S3C2440 168)修改内核机器码。流程如下:

内核:

$vim arch/arm/mach-s3c2440/mach-smdk2440.c

U-boot:

$vim include/asm-arm/mach-types.h

内核:

$vim arch/arm/tools/mach-types

 

说明:如果机器码错误,则系统提示选取平台,死机。

 

六、编译镜像

 

$make zImage

 

七、板子烧写

 

使用DNW工具将内核镜像烧写至开发板中

 

 八、遇到的问题

 

问题:

  Kernel panic - not syncing: Attempted to kill init!

 

解决办法:

  $make menuconfig

选择以下两项:

 Kernel Features  --->

 [*] Use the ARM EABI to compile the kernel                               
 [*]   Allow old ABI binaries to run with this kernel (EXPERIMENTAL)

 

九、NandFlash驱动移植

 

linux里面已经包含NandFlash驱动,只需对源码进行修改即可。

 

1、$vim arch/arm/plat-s3c24xx/common-smdk.c

 

107 /* NAND parititon from 2.4.18-swl5 */
108
109 static struct mtd_partition smdk_default_nand_part[] = {
110 #if defined(CONFIG_San_64MB_NAND)
111         [0] = {
112                 .name   = "San_Board_uboot",
113                 .size   = 0x00040000,
114                 .offset = 0x00000000,
115         },
116         [1] = {
117                 .name   = "San_Board_kernel",
118                 .size  = 0x00200000,
119                 .offset= 0x00200000,
120         },
121         [2] = {
122                 .name   = "San_Board_yaffs2",
123                 .size   =  0x03BF8000,

124                 .offset = 0x00400000,
125         }
126 #elif defined(CONFIG_San_128MB_NAND)
127         [0]={
128                 .name   ="San_Board_uboot",
129                 .offset =0x00000000,
130                 .size   =0x00040000,
131         },
132         [1]={
133                 .name   ="San_Board_kernel",
134                 .offset =0x00200000,
135                 .size   =0x00200000,
136         },
137         [2]={
138                 .name   ="San_Board_yaffs2"
139                 .offset =0x00400000,
140                 .size   =0x07BA0000,
141         }
142 #elif defined(CONFIG_San_more_than_256MB_NAND)

143         [0]={
144                 .name   ="San_Board_uboot",
145                 .offset =0x00000000,
146                 .size   =0x00040000,
147          },
148          [1]={
149                  .name   ="San_Board_kernel",
150                  .offset =0x00200000,
151                  .size   =0x00200000,
152          },
153          [2]={
154                  .name   ="San_Board_yaffs2",
155                  .offset =0x00400000,
156                  .size   =0x0FB80000,
157          }
158 #endif
159 };

 

2、$vimdrivers/mtd/nand/Kconfig

 

166 choice
167         prompt "Nand Flash Capacity select"
168         depends on MTD
169         help
170           SanBoard Nand Flash Capacity select
171
172 config San_64MB_NAND
173         boolean "64MB Nand for SanBoard"
174         depends on MTD
175         help
176           Set 64MB Nand parts
177
178 config San_128MB_NAND
179         boolean "128MB Nand for SanBoard"
180         depends on MTD
181         help
182           Set 128MB Nand parts
183
184 config San_more_than_256MB_NAND
185         boolean "256MB~1GB Nand for SanBoard"
186         depends on MTD
187         help
188           Set 256MB~1GB Nand parts
189
190 endchoice

注:如果在make menuconfig中选中San_64MB_NAND,则在.config表现形式如下:

CONFIG_San_64MB_NAND=y

这实际是给C源文件提供预编译变量,如#if defined(CONFIG_San_64MB_NAND).......

这个过程就是实现了内核的定制,比如新增Nand驱动、或者去除wireless驱动。。。

 

十、移植yaffs2文件系统

 

1、获取yaffs2源码

http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/

 

2、在内核中添加对yaffs2的支持

在刚下载的yaffs2源码中,执行:

./patch-ker.sh c ../linux-2.6.30.4

此时在内核fs目录下,新增“yaffs2”目录,同时fs/目录下面的Makefile文件和Kconfig文件也添加了yaffs2的配置和编译条件。

 

3、在配置单中添加对yaffs2的支持


$make menuconfig

 

File systems  --->

                [*] Miscellaneous filesystems  --->

                                     <*>   YAFFS2 file system support

注意:假如在内核中没有添加对yaffs2的支持,则出现找不到或者挂载文件系统是失败的提示:

List of all partitions:
0100       4096 ram0 (driver?)
0101       4096 ram1 (driver?)
0102       4096 ram2 (driver?)
0103       4096 ram3 (driver?)
0104       4096 ram4 (driver?)
0105       4096 ram5 (driver?)
0106       4096 ram6 (driver?)
0107       4096 ram7 (driver?)
0108       4096 ram8 (driver?)
0109       4096 ram9 (driver?)
010a       4096 ram10 (driver?)
010b       4096 ram11 (driver?)
010c       4096 ram12 (driver?)
010d       4096 ram13 (driver?)
010e       4096 ram14 (driver?)
010f       4096 ram15 (driver?)
1f00        256 mtdblock0 (driver?)
1f01       2048 mtdblock1 (driver?)
1f02      63168 mtdblock2 (driver?)
No filesystem could mount root, tried:  ext3 ext2 cramfs msdos vfat romfs
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)

 

4、yaffs2移植完成,重新编译内核

 

十一、在内核中添加tmpfs支持

如果不添加tmpfs支持,那么将会出现那/tmp挂载失败的提示。关于tmpfs的作用待研究。

mount: mounting tmpfs on /tmp failed: Invalid argume

文件系统配置:

[root@san /]#cat /etc/fstab
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
var /dev tmpfs defaults 0 0

 

File systems  --->

                      Pseudo filesystems  --->

                                      [*] Virtual memory file system support (former shm fs)

 

                                      [*]   Tmpfs POSIX Access Control Lists

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值