一、下载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
$vim Makefile
193#ARCH ?= $(SUBARCH)
194#CROSS_COMPILE ?=
195 ARCH=arm
196 CROSS_COMPILE=arm-linux-
$vim arch/arm/mach-s3c2440/mach-smdk2440.c
系统的外部时钟为12MHz
160static void __init smdk2440_map_io(void)
161{
162s3c24xx_init_io(smdk2440_iodesc,ARRAY_SIZE(smdk2440_iodesc));
163//s3c24xx_init_clocks(16934400);
164//edit by
165 s3c24xx_init_clocks(12000000);
166s3c24xx_init_uarts(smdk2440_uartcfgs,ARRAY_SIZE(smdk2440_uartcfgs));
167}
说明:如果系统时钟不匹配,则出现乱码。
$make menuconfig
说明:一个比较好的做法是先调用自带的配置清单,该配置清单在arch/arm/configs目录,文件名为:s3c2410_defconfig,该配置文件几乎S3C24XX系列CPU的配置项,可以在此基础上修改配置项。x86的配置项在arch/x86/configs目录下,文件名为:i386_defconfig(32为cpu)。
cp arch/arm/configs/s3c2410_defconfig .config
【linux内核源码中查看机器码相关文件:】
$vim arch/arm/mach-s3c2440/mach-smdk2440.c
178 MACHINE_START(S3C2440 , "SMDK2440")
179/* Maintainer: Ben Dooks <[email protected]> */
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,
188MACHINE_END
修改机器码,使之与bootloader的机器码相同,这里使用的是u-boot,机器码为168
$vim arch/arm/tools/mach-types
379 s3c2440 ARCH_S3C2440 S3C2440168
$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_S3C2440168 //这个没有找见
【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 )修改内核机器码。流程如下:
内核:
$vimarch/arm/mach-s3c2440/mach-smdk2440.c
U-boot:
$viminclude/asm-arm/mach-types.h
内核:
$vimarch/arm/tools/mach-types
说明:如果机器码错误,则系统提示选取平台,死机。
$make zImage
使用DNW工具将内核镜像烧写至开发板中
问题:
Kernel panic - not syncing: Attempted to killinit!
解决办法:
$make menuconfig
选择以下两项:
Kernel Features --->
[*] Use the ARM EABI to compile the kernel
[*] Allow old ABI binaries to run with thiskernel (EXPERIMENTAL)
linux里面已经包含NandFlash驱动,只需对源码进行修改即可。
1、$vim arch/arm/plat-s3c24xx/common-smdk.c
107 /* NAND parititon from 2.4.18-swl5*/
108
109 static struct mtd_partitionsmdk_default_nand_part[] = {
110#if defined(CONFIG_64MB_NAND )
111 [0] = {
112.name = "Board_uboot",
113.size = 0x00040000,
114.offset = 0x00000000,
115},
116[1] = {
117.name = "Board_kernel",
118.size = 0x00200000,
119.offset= 0x00200000,
120},
121[2] = {
122.name = "Board_yaffs2",
123.size = 0x03BF8000,
124.offset = 0x00400000,
125}
126#elif defined(CONFIG_128MB_NAND)
127 [0]={
128.name ="Board_uboot",
129.offset =0x00000000,
130.size =0x00040000,
131},
132[1]={
133.name ="Board_kernel",
134.offset =0x00200000,
135.size =0x00200000,
136},
137[2]={
138.name ="Board_yaffs2"
139.offset =0x00400000,
140.size =0x07BA0000,
141}
142 #elif defined(CONFIG_more_than_256MB_NAND)
143 [0]={
144.name ="Board_uboot",
145.offset =0x00000000,
146.size =0x00040000,
147},
148[1]={
149.name ="Board_kernel",
150.offset =0x00200000,
151.size =0x00200000,
152},
153[2]={
154.name ="Board_yaffs2",
155.offset =0x00400000,
156.size =0x0FB80000,
157}
158#endif
159};
2、$vimdrivers/mtd/nand/Kconfig
166 choice
167prompt "Nand Flash Capacity select"
168depends on MTD
169help
170Board Nand Flash Capacity select
171
172 config 64MB_NAND
173 boolean "64MB Nand for Board"
174depends on MTD
175help
176Set 64MB Nand parts
177
178 config 128MB_NAND
179boolean "128MB Nand for Board"
180depends on MTD
181help
182Set 128MB Nand parts
183
184 config more_than_256MB_NAND
185boolean "256MB~1GB Nand for Board"
186depends on MTD
187help
188Set 256MB~1GB Nand parts
189
190 endchoice
注:如果在make menuconfig中选中64MB_NAND,则在.config表现形式如下:
CONFIG _64MB_NAND=y
这实际是给C源文件提供预编译变量,如#if defined(CONFIG_64MB_NAND).......
这个过程就是实现了内核的定制,比如新增Nand驱动、或者去除wireless驱动。。。
http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/
www.aleph1.co.uk/home/aleph1/git/yaffs2
在刚下载的yaffs2源码中,执行:
./patch-ker.sh c ../linux-2.6.30.4(两个文件夹放一起)
此时在内核fs目录下,新增“yaffs2”目录,同时fs/目录下面的Makefile文件和Kconfig文件也添加了yaffs2的配置和编译条件。
$make menuconfig
File systems --->
[*]Miscellaneous filesystems --->
<*> YAFFS2 file system support
注意:假如在内核中没有添加对yaffs2的支持,则出现找不到或者挂载文件系统是失败的提示:
Listof all partitions:
01004096 ram0 (driver?)
01014096 ram1 (driver?)
01024096 ram2 (driver?)
01034096 ram3 (driver?)
01044096 ram4 (driver?)
01054096 ram5 (driver?)
01064096 ram6 (driver?)
01074096 ram7 (driver?)
01084096 ram8 (driver?)
01094096 ram9 (driver?)
010a 4096 ram10 (driver?)
010b4096 ram11 (driver?)
010c 4096 ram12 (driver?)
010d4096 ram13 (driver?)
010e4096 ram14 (driver?)
010f 4096 ram15 (driver?)
1f00 256 mtdblock0 (driver?)
1f01 2048 mtdblock1 (driver?)
1f02 63168 mtdblock2 (driver?)
Nofilesystem could mount root, tried: ext3 ext2 cramfs msdos vfat romfs
Kernel panic - not syncing: VFS: Unable tomount root fs on unknown-block(31,2)
4、yaffs2移植完成,重新编译内核
如果不添加tmpfs支持,那么将会出现那/tmp挂载失败的提示。关于tmpfs的作用待研究。
mount: mounting tmpfs on /tmp failed: Invalidargume
文件系统配置:
[root@ /]#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
drivers/rtc/hctosys.c:unable to open rtc device (rtc0)
1. 内核配置选项
--- Real TimeClock
[*] Set system time from RTC on startup andresume
(rtc0) RTC used to set the systemtime
[ ] RTC debugsupport
*** RTC interfaces***
[*] /sys/class/rtc/rtcN(sysfs)
[*] /dev/rtcN (characterdevices)
[ ] RTC UIE emulation on devinterface
*** on-CPU RTC drivers***
<*> Samsung S3Cseries SoC RTC
2. linux kernel 中 已经支持S3C2410的RTC,但是并没有添加到平台设备初始化数组中,所以系统启动时并不会初始化这一部分,需要修改文件mach-smdk.c
static struct platform_device*smdk2410_devices[] __initdata = {
&s3c_device_ohci,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&s3c_device_rtc, //新增代码
};
3. 创建设备节点,在文件系统/dev目录下执行:
sudo mknod rtc c 10 135
4. 重新编译内核,查看启动信息
s3c2410-rtcs3c2410-rtc: rtc disabled,re-enabling
s3c2410-rtcs3c2410-rtc: rtc core:registered s3c asrtc0
这里说明rtc驱动起来可以正常工作了
uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 2
EXT3-fs: unable to readsuperblock
uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 2
EXT2-fs: unable to readsuperblock
uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 0
Buffer I/O error ondevice mtdblock2, logical block 0
uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 0
Buffer I/O error ondevice mtdblock2, logical block 0
uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 8
Buffer I/O error ondevice mtdblock2, logical block 1
uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 8
Buffer I/O error ondevice mtdblock2, logical block 1
uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 16
Buffer I/O error ondevice mtdblock2, logical block 2
uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 16
Buffer I/O error ondevice mtdblock2, logical block 2
uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 24
Buffer I/O error ondevice mtdblock2, logical block 3
uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 24
Buffer I/O error ondevice mtdblock2, logical block 3
uncorrectable error :<3>end_request: I/O error, dev mtdblock2, sector 0
FAT: unable to read bootsector
VFS: Cannot open rootdevice "mtdblock2" or unknown-block(31,2)
Please append a correct"root=" boot option; here are the available partitions:
1f00 256 mtdblock0 (driver?)
1f01 2048 mtdblock1 (driver?)
1f02 257536 mtdblock2 (driver?)
Kernel panic - notsyncing: VFS: Unable to mount root fs on unknown-block(31,2)
MTD分区与bootloader不匹配
#elif defined(CONFIG_more_than_256MB_NAND)
[0]= {
.name = "Board_uboot",
.offset = 0x00000000,
.size = 0x00080000,
},
[1]= {
.name = "Board_kernel",
.offset= 0x00240000,
.size = 0x00200000,
},
[2]= {
.name = "Board_yaffs2",
.offset= 0x00440000,
.size = 0x0FB40000,
}
**************************************************************************************************************************************************************
[0]和[1]分区不连贯的表面原因 中间的部分存放uboot的参数以及开机画面??? 环境变量
uboot分区信息:
0x0 到0x40000 为uboot的分区,256K,
0x40000 到0x4c000 为parameters分区,48K,
0x50000 到0x70000 为eboot分区,128K,
0x70000 到0x1F0000 为logo分区,1536K,
0x1F0000 到0x3F0000 为kernel分区,2M,
0x3F0000 到0x3FF8000 为root分区,60.03125M
nand分区信息:
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "TQ2440_uboot",
.size = 0x00040000,
.offset = 0x00000000,
},
[1] = {
.name = "TQ2440_kernel",
.offset = 0x0004C000,
.size = 0x00200000,
},
[2] = {
.name = "TQ2440_yaffs2",
.offset = 0x0024C000,
.size = 0x03DB0000,
}
};
uboot的分区和文件系统的分区,没有联系的。唯一的联系就是uboot引导启动的时候,命令要根据文件系统的分区信息来引导。比如要从mtdblock2启动,那么bootcmd中的命令bootm0xXXXXXXX就要和mtdblock2的首地址一样。。。。