linux-26322内核在mini2440上基于supervivi的移植

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

linux2.6.32.2mini2440平台移植--内核移植、yaffs2文件系统移植1.1获取Linux内核源代码有很多方式可以获取Linux内核源代码,如果你的linux平台可以上互联网,可以直接在命令行输入以下命令获取到Linux-2.6.32.2:#wget当然你也可以先在Windows系统下使用迅雷等工具下载完,再复制到linux中。1.2解压内核源代码假定我们刚才把内核源代码下载到了/root/mini2440目录,执行以下解压命令:#cd/opt/FriendlyARM/mini2440#tarxvzflinux-2.6.32.2.tar.gz1.3指定交叉编译变量我们移植目的是让Linux-2.6.32.2可以在mini2440上运行。首先,我们要使得Linux-2.6.32.2的缺省目标平台成为ARM的平台。修改总目录下的Makefile原exportKBUILD_BUILDHOST:=$(SUBARCH)ARCH?=$(SUBARCH)CROSS_COMPILE?=改为exportKBUILD_BUILDHOST:=$(SUBARCH)ARCH?=armCROSS_COMPILE?=arm-linux-其中,ARCH是指定目标平台为arm,CROSS_COMPILE是指定交叉编译器,这里指定的是系统默认的交叉编译器,如要使用其它的,则要把编译器的全路径在这里写出。接下来,要测试一下linux的编译是否能正常通过。执行:#makes3c2410_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传入的不匹配,就会经常出现下面的错误:UncompressingLinux..................................................................................................................................done,bootingthekernel.运行到这不就停住了提示:在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,FriendlyARMMini2440developmentboard)。提示:开发板运行后,在命令行终端输入:cat/proc/cpuinfo可以看到我们添加的开发板信息1.4.2修改时钟源频率现在再来修改系统时钟源,在mach-mini2440.c(就是我们刚刚通过复制mach-smdk2440.c得到的)的第160行staticvoid__initsmdk2440_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源代码根目录下执行#makemini2440_defconfig;使用Linux官方自带的mini2440配置#makezImage;编译内核,时间较长,最后会生成zImage我的s3c2410_defconfig文件位于/arch/arm/configs/mini2440_defconfig重新编译并把生成的内核文件zImage(位于arch/arm/boot目录)下到板子中,可以看到内核已经可以正常启动了,但此时大部分硬件驱动还没加,并且也没有文件系统,因此还无法登陆。注意:(1)如果你先前已经编译过内核了,请先清理一下,不然会提示编译的文件过时了。(2)注意在先前关于机器码一项时修改的MACHINE_START(S3C2440,SMDK2440),修改为MACHINE_START(MINI2440,FriendlyARMMini2440developmentboard)。这里的MINI2440必须要大写,我自己的理解是跟机器码里面的类型一致。1.5关于内核配置菜单中的mini2440选项在开始移植其他驱动之前,我们再了解一些看起来比较“神秘”的常识,那就是运行makemenuconfig时,内核配置菜单中的mini2440选项是如何出现的。在命令行执行:#makemenuconfig;前面已经执行了makemini2440_defconfig加载了缺省配置,因此这里可以直接执行该命令按上下键移动到SystemType,按回车进入该子菜单,再找到S3C2440Machines,按回车进入该子菜单在此就可以看到Linux天生内核对mini2440开发板的支持选项了,那么它们是从哪里来的呢?打开Linux-2.6.32.2/arch/arm/mach-s3c2440/Kconfig文件可以找到相关信息。现在明白了吧,“MINI2440developmentboard”正是在这个Kconfig文件中定义说明的,当然你可以根据自己的喜好改为其他显示信息。这里的显示信息只是在内核配置菜单中出现的,要让选择的配置实际起效,还需要根据此配置在Makefile中添加相应的代码文件,请看该目录下的Makefile。这样,配置文件就跟实际的代码文件通过配置定义联系在一起了,这里的配置定义是“CONFIG_MACH_MINI2440”,内核中还有很多类似的配置定义,并且有的配置定义还存在依赖关系,我们在此就不对它们详细说明了,随着对内核代码结构的不断熟悉,你就会逐渐学会分析和查找你所需要的各种配置和定义等。1.6移植Nand驱动并更改分区信息1.6.1Linux-2.6.32.2内核所支持的NandFlash类型Linux2.6.32.2已经自带了大部分NandFlash驱动,在linux-2.6.32.2/drivers/mtd/nand/nand_ids.c文件中,定义了所支持的各种NandFlash类型。1.6.2修改NandFlash分区表但是系统默认的分区不是我们所需的,所以要自已修改,除此之外,还有NandFlash的结构信息需要增加填写,以便能够适合系统自带的NandFlash驱动接口,这可以参考SMDK2440中关于NandFlash设备注册的一些信息。打开/arch/arm/plat-s3c24xx/common-smdk.c,可以看到这样一个结构体:注意这里是参考这个文件夹的内容,改动还是在mach-mini2440.cstaticstructmtd_partitionsmdk_default_nand_part[]={[0]={.name=BootAgent,.size=SZ_16K,.offset=0,},[1]={.name=S3C2410flashpartition1,.offset=0,.size=SZ_2M,},[2]={.name=S3C2410flashpartition2,.offset=SZ_4M,.size=SZ_4M,},[3]={.name=S3C2410flashpartition3,.offset=SZ_8M,.size=SZ_2M,},[4]={.name=S3C2410flashpartition4,.offset=SZ_1M*10,.size=SZ_4M,},[5]={.name=S3C2410flashpartition5,.offset=SZ_1M*14,.size=SZ_1M*10,},[6]={.name=S3C2410flashpartition6,.offset=SZ_1M*24,.size=SZ_1M*24,},[7]={.name=S3C2410flashpartition7,.offset=SZ_1M*48,.size=SZ_16M,}};这其实就是NandFlash的分区表,在Linux-2.6.32.2中,nand驱动是被注册为平台设备的,这同样可在/arch/arm/plat-24xx/common-smdk.c文件中看出,如下:staticstructs3c2410_platform_nandsmdk_nand_info={.tacls=20,.twrph0=60,.twrph1=20,.nr_sets=ARRAY_SIZE(smdk_nand_sets),.sets=smdk_nand_sets,};/*devicesweinitialise*/staticstructplatform_device__initdata*smdk_devs[]={&s3c_device_nand,&smdk_led4,&smdk_led5,&smdk_led6,&smdk_led7,};参考以上结构信息,我们也在自己的mach-mini2440.c中照此添加实现,同时需要参考友善之臂原厂内核中的Nand分区表因此,在mach-mini2440.c中加入以下代码:首先添加几个头文件:#includelinux/mtd/mtd.h#includelinux/mtd/nand.h#includelinux/mtd/nand_ecc.h#includelinux/mtd/partitions.h#

1 / 86
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功