这里仅仅是移植成功内核,可以挂载文件系统运行,至于驱动会陆续添加。
第一步:到内核官网上下载最新的内核,我下载的是linux-3.3-rc3.tar.bz2。
第二步:解压内核,进入arch/arm/mach-s3c64xx目录下,看到不少6410的板级文件,我们这里选择mini6410开开展工作,在目录下将mach-mini6410.c文件复制一份,命名为:mach-jfj6410.c。这里我们将文件里面关于mini6410的字样都修改为jfj6410.但是这里要注意,MACHINE_START(JFJ6410, "JFJ6410")这里的JFJ6410要使用大写,稍候说明为什么。大家都知道在一个目录下添加了文件后,都应该修改当前目录下的Kconfig和Makefile两个文件,这是Linux系统编译的要求。至于怎么修改,仔细看一下文件内容我相信大家都知道。
Kconfig文件是进行make menuconfig时出现的配置选项,这里我们添加了自己的板级文件肯定要添加配置选项。内容可以复制MINI6410的。如下:
[plain]
config MACH_JFJ6410 bool "JFJ6410" select CPU_S3C6410 select S3C_DEV_HSMMC select S3C_DEV_HSMMC1 select S3C64XX_SETUP_SDHCI select S3C_DEV_USB_HOST select S3C_DEV_NAND select S3C_DEV_FB select S3C64XX_SETUP_FB_24BPP select SAMSUNG_DEV_ADC select SAMSUNG_DEV_TS help Machine support for the JFJKJ JFJ6410 这里你应该能够看出之前为什么要在那个地方单独使用大写了吧,就是为了保持一致。Makefile文件就是说明要编译的文件,以及编译的规则,这里显然就是要编译我们自己的板级文件mach-jfj6410.c,具体如下:
[plain]
obj-$(CONFIG_MACH_JFJ6410) += mach-jfj6410.o 第三步:配置内核,make menuconfig。这里我是使用内核自带的s3c6400_defconfig文件进行修改的,这样比较简单,呵呵。基本去掉了大部分的驱动,留下了串口驱动和NAND驱动。第四步:编译make zImage。呵呵,这样就生成了我们需要的内核。
第五步:烧写,测试内核。因为我们是测试内核,所以U-Boot以及根文件系统都是使用之前的,这里没有移植yaffs,所以我目前使用cramfs格式的文件系统。
启动开发板后出现了如下的错误:
[html]
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) 后来上网查了很久才发现是驱动的问题。U-boot使用软件ECC,我们在配置NAND驱动的时候提示是否选择使用NAND硬件ECC,我试了一下,无论你选不选都出现这个问题,我才发现,它的配置包含三重含义,选中--->使用硬件ECC;不选--->使用NAND的软件ECC(和U-Boot的软件ECC不是一回事);而我们这里需要的是不使用NAND的ECC,也就是禁止,不然就会和U-Boot冲突,出现上面的错误。要禁止NAND的ECC,我们修改drivers/mtd/nand/s3c2410.c这个文件,在845行的地方。源代码为: