1.1 获取Linux内核源代码
有很多方式可以获取Linux内核源代码,如果你的linux平台可以上互联网,可以直接在命令行输入以下命令获取到Linux-2.6.32.2:
#wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.32.2.tar.gz
当然你也可以先在Windows系统下使用迅雷等工具下载完,再复制到linux中。
1.2 解压内核源代码
假定我们刚才把内核源代码下载到了/root/mini2440目录,执行以下解压命
令:
#cd /opt/FriendlyARM/mini2440
#tar xvzf linux-2.6.32.2.tar.gz
1.3 指定交叉编译变量
我们移植目的是让Linux-2.6.32.2可以在mini2440上运行。
首先,我们要使得Linux-2.6.32.2的缺省目标平台成为ARM的平台。
修改总目录下的Makefile
原
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= $(SUBARCH)
CROSS_COMPILE ?=
改为
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-
其中,ARCH是指定目标平台为arm,CROSS_COMPILE是指定交叉编译器,这里指定的是系统默认的交叉编译器,如要使用其它的,则要把编译器的全路径在这里写出。
接下来,要测试一下linux的编译是否能正常通过。
执行:
#make s3c2410_defconfig ;使用缺省内核配置文件,s3c2410_defconfig是SMDK2440的缺省配置文件,我的s3c2410_defconfig文件位于/arch/arm/configs/s3c2410_defconfig
#make ;编译时间较长
编译通过,在此我们先不必烧写到开发板验证它的正确性。
1.4 克隆建立自己的目标平台
1.4.1关于机器码
以上编译是用的Linux内核本身支持的目标平台配置,它对应于SMDK2440。现在我们要参考SMDK2440加入自已的开发板平台,我们使用的是mini2440,因此取名为MINI2440。需要说明的是,Linux-2.6.32.2本身已经包含了mini2440的支持,这样就出现了重名。那怎么办呢?在此我们依然使用MINI2440这个名称,只不过在后面的移植步骤中,把原始内核自带的mini2440代码部分直接删除就可以了,以免和我们自己移植的混淆了。首先,很关键的一点,内核在启动时,是通过bootloader传入的机器码(MACH_TYPE)确定应启动哪种目标平台的,友善之臂已经为mini2440申请了自己的机器码为1999,它位于linux-2.6.32.2/arch/arm/tools/mach_types文件中.
如果内核的机器码和bootloader传入的不匹配,就会经常出现下面的错误:
Uncompressing Linux.................................................................................................................................. done, booting
the kernel.
运行到这不就停住了
提示:在U-boot/include/asm-arm/mach-types.h中可以看到mini2440的机器码定义
接下来,我们注意到linux-2.6.32.2/arch/arm/mach-s3c2440目录下有个
mach-mini2440.c文件,它其实就是国外爱好者为mini2440移植添加的主要内容了,但我们不用它,把它直接删除。将linux-2.6.32.2/arch/arm/mach-s3c2440/目录下的mach-smdk2440.c复制一份。命名为mach-mini2440.c,
找到MACHINE_START(S3C2440, "SMDK2440"),修改为
MACHINE_START(MINI2440, "FriendlyARM Mini2440 development board")。
提示:开发板运行后,在命令行终端输入:cat /proc/cpuinfo 可以看到我们添加的开发板信息
1.4.2 修改时钟源频率
现在再来修改系统时钟源,在mach-mini2440.c(就是我们刚刚通过复制
mach-smdk2440.c得到的)的第160行static void __init smdk2440_map_io(void)函数中,把其中的16934400(代表原SMDK2440目标板上的晶振是16.9344MHz)改为mini2440开发板上实际使用的12,000,000(代表mini2440开发板上的晶振12MHz,元器件标号为X2)
1.4.3 从SMDK2440到MINI2440
因为我们要制作自己的mini2440平台体系,因此把mach-mini2440.c中所有的
smdk2440字样改为mini2440,可以使用批处理命令修改,在vim的命令模式下输入:
%s/smdk2440/mini2440/g
上面这句的意思是:把所有和“smdk2440”匹配的字符串全部替换为“mini2440”,前面的“%s“代表字符串匹配,最后的“g”代表global,是全局的意思,
除此之外,还有一个地方需要改动,在mini2440_machine_init(void)函数中,把
smdk_machine_init()函数调用注释掉,因为我们后面会编写自己的初始化函数,不需要调用smdk2440原来的.
1.4.4 编译测试
在Linux源代码根目录下执行
#make mini2440_defconfig ;使用Linux官方自带的mini2440配置
#make zImage ;编译内核,时间较长,最后会生成zImage
我的s3c2410_defconfig文件位于/arch/arm/configs/mini2440_defconfig
重新编译并把生成的内核文件zImage(位于arch/arm/boot目录)下到板子中,可以看到内核已经可以正常启动了,但此时大部分硬件驱动还没加,并且也没有文件系统,因此还无法登陆。
注意:
(1)如果你先前已经编译过内核了,请先清理一下,不然会提示编译的文件过时了。
(2)注意在先前关于机器码一项时修改的MACHINE_START(S3C2440, "SMDK2440"),修改为
MACHINE_START(MINI2440, "FriendlyARM Mini2440 development board")。
这里的MINI2440必须要大写,我自己的理解是跟机器码里面的类型一致。
1.5 关于内核配置菜单中的mini2440选项
在开始移植其他驱动之前,我们再了解一些看起来比较“神秘”的常识,那就是运行make menuconfig时,内核配置菜单中的mini2440选项是如何出现的。
在命令行执行:
#make menuconfig ;前面已经执行了make mini2440_defconfig加载了缺省配置,因此这里可以直接执行该命令
按上下键移动到System Type,按回车进入该子菜单,再找到S3C2440 Machines,按回车进入该子菜单
在此就可以看到Linux天生内核对mini2440开发板的支持选项了,那么它们是从哪里来的呢?
打开Linux-2.6.32.2/arch/arm/mach-s3c2440/Kconfig文件可以找到相关信息。
现在明白了吧,“MINI2440 development board”正是在这个Kconfig文件中定义说明的,
当然你可以根据自己的喜好改为其他显示信息。
这里的显示信息只是在内核配置菜单中出现的,要让选择的配置实际起效,还需要根据此配置在Makefile中添加相应的代码文件,请看该目录下的Makefile。
这样,配置文件就跟实际的代码文件通过配置定义联系在一起了,这里的配置定义是“CONFIG_MACH_MINI2440”,内核中还有很多类似的配置定义,并且有的配置定义还存在依赖关系,我们在此就不对它们详细说明了,随着对内核代码结构的不断熟悉,你就会逐渐学会分析和查找你所需要的各种配置和定义等。
1.6 移植Nand驱动并更改分区信息
1.6.1 Linux-2.6.32.2内核所支持的Nand Flash类型
Linux2.6.32.2已经自带了大部分Nand Flash驱动,在
linux-2.6.32.2/drivers/mtd/nand/nand_ids.c文件中,定义了所支持的各种Nand Flash类型。
1.6.2 修改Nand Flash分区表
但是系统默认的分区不是我们所需的,所以要自已修改,除此之外,还有Nand Flash的结构信息需要增加填写,以便能够适合系统自带的Nand Flash驱动接口,这可以参考SMDK2440中关于Nand Flash设备注册的一些信息。
打开/arch/arm/plat-s3c24xx/common-smdk.c,可以看到这样一个结构体:
注意这里是参考这个文件夹的内容,改动还是在mach-mini2440.c
static struct mtd_partition smdk_default_nand_part[] = {
[0] = {
.name = "Boot Agent",
.size = SZ_16K,
.offset = 0,
},
[1] = {
.name = "S3C2410 flash partition 1",
.offset = 0,
.size = SZ_2M,
},
[2] = {
.name = "S3C2410 flash partition 2",
.offset = SZ_4M,
.size = SZ_4M,
},
[3] = {
.name = "S3C2410 flash partition 3",
.offset = SZ_8M,
.size = SZ_2M,
},
[4] = {
.name = "S3C2410 flash partition 4",
.offset = SZ_1M * 10,
.size = SZ_4M,
},
[5] = {
.name = "S3C2410 flash partition 5",
.offset = SZ_1M * 14,
.size = SZ_1M * 10,
},
[6] = {
.name = "S3C2410 flash partition 6",
.offset = SZ_1M * 24,
.size = SZ_1M * 24,
},
[7] = {
.name = "S3C2410 flash partition 7",
.offset = SZ_1M * 48,
.size = SZ_16M,
}
};
这其实就是Nand Flash的分区表,在Linux-2.6.32.2中,nand驱动是被注册为平台设备的,这同样可在/arch/arm/plat-24xx/common-smdk.c文件中看出,如下:
static struct s3c2410_platform_nand smdk_nand_info = {
.tacls = 20,
.twrph0 = 60,
.twrph1 = 20,
.nr_sets = ARRAY_SIZE(smdk_nand_sets),
.sets = smdk_nand_sets,
};
/* devices we initialise */
static struct platform_device __initdata *smdk_devs[] = {
&s3c_device_nand,
&smdk_led4,
&smdk_led5,
&smdk_led6,
&smdk_led7,
};
参考以上结构信息,我们也在自己的mach-mini2440.c中照此添加实现,同时需要参考友善之臂原厂内核中的Nand分区表
因此,在mach-mini2440.c中加入以下代码:
首先添加几个头文件:
#include #include #include #include #include 然后加入以下代码: static struct mtd_partition mini2440_default_nand_part[] = { [0] = { .name = "supervivi", //这里是bootloader所在的分区,可以放置u-boot, supervivi等内容,对应/dev/mtdblock0 .size = 0x00040000, .offset = 0, }, [1] = { .name = "param", //这里是supervivi的参数区,其实也属于bootloader的一部分,如果u-boot比较大,可以把此区域覆盖掉,不会影响系统启动,对应/dev/mtdblock1 .offset = 0x00040000, .size = 0x00020000, }, [2] = { .name = "Kernel", //内核所在的分区,大小为5M,足够放下大部分自己定制的巨型内核了,比如内核使用了更大的Linux Logo图片等,对应/dev/mtdblock2 .offset = 0x00060000, .size = 0x00500000, }, [3] = { .name = "root", //文件系统分区,友善之臂主要用来存放yaffs2文件系统内容,对应/dev/mtdblock3 .offset = 0x00560000, .size = 1024 * 1024 * 1024, // }, [4] = { .name = "nand", //此区域代表了整片的nand flash,主要是预留使用,比如以后可以通过应用程序访问读取/dev/mtdblock4就能实现备份整片nand flash了。 .offset = 0x00000000, .size = 1024 * 1024 * 1024, // } }; //这里是开发板的nand flash设置表,因为板子上只有一片,因此也就只有一个表 static struct s3c2410_nand_set mini2440_nand_sets[] = {
上一篇:linux2.6.32.2 mini2440平台移植--移植DM9000网卡驱动
下一篇:linux2.6.32.2 mini2440平台移植-- 串口驱动移植、I2C-EEPROM 驱动移植、看门狗驱动移植
推荐阅读最新更新时间:2024-11-05 22:01
设计资源 培训 开发板 精华推荐
- AM3G-0512DZ ±12V 3 瓦 DC-DC 转换器的典型应用
- I/O 扩展器MCP23S08T-E/SS 芯片的验证板
- 4463-915-PDK,用于 Si4463 915-MHz 射频收发器的 EZRadio-PRO 无线开发套件
- LT1377CS8 具有直接反馈的正负转换器的典型应用
- EVAL-AD608EBZ,用于 AD608 3V 低功率混频器接收器 IF 子系统的评估板
- LTC3622EMSE-2 5V/3.3V Vout 突发模式操作应用同步降压稳压器的典型应用电路
- 使用 ATmega16/32U4 通过 USB 为锂离子电池充电
- 使用 ROHM Semiconductor 的 BD45241 的参考设计
- AN098 用于电视调谐器应用的宽带放大器 MMIC
- 【航顺训练营】Mao宠物饮水器