其实已经弄完了,可以把linux内核以及基于busybox1.16.0制作的文件系统结合。从总的来看是可以用自己的工具链编译生成的u-boot作为Boot Loader,Linux2.6.32.2内核和基于busybox1.16.0的根文件系统,只是还缺少很多相关的驱动,以后要是想继续的话再补全啦!这一过程碰到很多问题,包括自己的粗心和记录不全,当然也包括别人的粗心,让自己也反反复复折腾了好久。令人高兴的是终于可以先舒口气了。
先说内核的移植,下载了 《Mini2440_Linux移植开发实战指南.pdf》,发现《第三章 Linux-2.6.32.2 内核移植详细步骤》讲得很详细,以为自己可以很轻松的照着做就可以了,没想到还是有些问题,现在稍微改些,以生成micro2440记录如下:
linux内核官方网站,下载linux内核2.6.32.2 http://www.kernel.org/pub/linux/kernel/v2.6/
yaffs源码:http://www.yaffs.net 但是必须用git下载,命令:git clone git://www.aleph1.co.uk/yaffs2
2.克隆自己的目标平台
(1)配置为交叉编译
原
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改为
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
(2)增加配置目录
在 linux-2.6.32.2/arch/arm/configs下增加defconfig配置目录,自己现在还不打算详细的去看配置选项,因此直接拷贝的mini2440的,有兴趣的可以寻找类似自己的平台,然后修改。
(3)在linux-2.6.32.2/arch/arm/mach-s3c2440下复制smdk2440.c建立micro2440.c,参考的文章已说明:linux2.6.32.2内核直接支持mini2440,防止与原有的冲突而删除。我为了有对照并没有删除match-mini2440,而是新建了 match-micro2440.c,因此,对应的修改其目录下的Makefile:
#obj-$(CONFIG_MACH_MINI2440) += mach-mini2440.o
obj-$(CONFIG_MACH_MINI2440) += mach-micro2440.o
(4)修改match-micro2440.c
a.首先对应机器码
因为我们的micro2440在linux-2.6.32.2/arch/arm/tools/mach_types 文件中是没有机器码的(比较详细理解的可以搜索下或者看参考手册),而且为了与U-boot中的一致,还是保留了mini2440,
找到MACHINE_START( S3C2440, "SMDK2440") ,
修改为MACHINE_START( MINI2440, "Micro2440 test board")
b.增加头文件
参考的手册上还是少了些东西的,我这里补上些:
#include <plat/common-smdk.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
#include <plat/nand.h>
c.替换“smdk2440”字符串
将match-micro2440.c中的smdk2440替换,就是方便自己查看,不替换也不影响(去掉#include <plat/common-smdk.h>,替换了可不去)。
d.修改时钟
static void __init micro2440_map_io(void)
{
s3c24xx_init_io(micro2440_iodesc, ARRAY_SIZE(micro2440_iodesc));
s3c24xx_init_clocks( 12000000);
s3c24xx_init_uarts(micro2440_uartcfgs, ARRAY_SIZE(micro2440_uartcfgs));
}
e.增加对nand flash的识别
自己对应着修改有区别的地方吧:
static struct platform_device *micro2440_devices[] __initdata = {
&s3c_device_usb,
先说内核的移植,下载了 《Mini2440_Linux移植开发实战指南.pdf》,发现《第三章 Linux-2.6.32.2 内核移植详细步骤》讲得很详细,以为自己可以很轻松的照着做就可以了,没想到还是有些问题,现在稍微改些,以生成micro2440记录如下:
基本的步骤可以是配置为交叉编译,克隆自己的目标平台,识别nand分区,增加识别yaffs文件系统
环境介绍:
内核版本:linux2.6.32.2
Linux平台:虚拟机下Fedora 11 自己原来编译的gcc在debian6下,因此在debian6下也顺利
交叉编译工具:fedora 11 :gcc-4.3.2 debian 6 :gcc 4.4.5
arm开发板:mini2440(CPU:S3C2440 ,SDRAM:64M,Nor Flash:2M,Nand Flash:256M,网卡:DM9000EP)
这里主要还是debian下的过程,发现有问题的时候在Fedora下测试排除编译器的问题。
1.下载源码linux内核官方网站,下载linux内核2.6.32.2 http://www.kernel.org/pub/linux/kernel/v2.6/
yaffs源码:http://www.yaffs.net 但是必须用git下载,命令:git clone git://www.aleph1.co.uk/yaffs2
2.克隆自己的目标平台
(1)配置为交叉编译
原
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改为
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
(2)增加配置目录
在 linux-2.6.32.2/arch/arm/configs下增加defconfig配置目录,自己现在还不打算详细的去看配置选项,因此直接拷贝的mini2440的,有兴趣的可以寻找类似自己的平台,然后修改。
(3)在linux-2.6.32.2/arch/arm/mach-s3c2440下复制smdk2440.c建立micro2440.c,参考的文章已说明:linux2.6.32.2内核直接支持mini2440,防止与原有的冲突而删除。我为了有对照并没有删除match-mini2440,而是新建了 match-micro2440.c,因此,对应的修改其目录下的Makefile:
#obj-$(CONFIG_MACH_MINI2440) += mach-mini2440.o
obj-$(CONFIG_MACH_MINI2440) += mach-micro2440.o
(4)修改match-micro2440.c
a.首先对应机器码
因为我们的micro2440在linux-2.6.32.2/arch/arm/tools/mach_types 文件中是没有机器码的(比较详细理解的可以搜索下或者看参考手册),而且为了与U-boot中的一致,还是保留了mini2440,
找到MACHINE_START( S3C2440, "SMDK2440") ,
修改为MACHINE_START( MINI2440, "Micro2440 test board")
b.增加头文件
参考的手册上还是少了些东西的,我这里补上些:
#include <plat/common-smdk.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
#include <plat/nand.h>
c.替换“smdk2440”字符串
将match-micro2440.c中的smdk2440替换,就是方便自己查看,不替换也不影响(去掉#include <plat/common-smdk.h>,替换了可不去)。
d.修改时钟
static void __init micro2440_map_io(void)
{
s3c24xx_init_io(micro2440_iodesc, ARRAY_SIZE(micro2440_iodesc));
s3c24xx_init_clocks( 12000000);
s3c24xx_init_uarts(micro2440_uartcfgs, ARRAY_SIZE(micro2440_uartcfgs));
}
e.增加对nand flash的识别
自己对应着修改有区别的地方吧:
static struct platform_device *micro2440_devices[] __initdata = {
&s3c_device_usb,