S3c2410 平台的移植(经典)

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

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

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

资源描述

S3c2410平台的移植学习文档――如何使kernel支持全新的ARM开发板Author:BobZhangMail:bob_zhang2004@163.com定义:假设我们以后的板子叫smdk-mxic0015,与smdk-s3c2410是并列的内容简介:重点讲讲kernel移植方面的,围绕这几个问题,来讨论:为什么要移植?什么时候,可以不作移植,就可以直接把kernelrun到板子上?怎么移植?我们mxic要做移植是作哪个层次的移植?移植的时候,代码要改动多少?也就是移植的难度和工作量?移植的时候要改或者添加哪些文件?也就是工作的内容白手起家?还是可以抄袭s3c2410?当然要踩s3c2410的肩膀!并以s3c2410为例,那个BenDooksben@simtec.co.uk是如何使kernel支持s3c2410开发板的?他都干了些什么?我们应该怎么样抄写s3c2410代码的架构来实现portingkernel到mxic0015kernel移植完后,u-boot如何配合?bootargs怎么写?kernel移植完后,如何作rootfs,怎么作rootfs(当然用busybox),大概讲讲流程和方法。Index:1.移植kernel2.smdk2410开发板的启动代码分析(不同于一般的kernel初始化代码,比如start_kernel())3.U-boot的参数设置4.制作根文件系统5.appendix:jk2410启动信息简单注释引言:虽然2.6.x的内核已经对s3c2410的平台提供了足够的支持,但是从学习的角度,我们仍然要对2.6.x是如何对s3c2410提供支持的代码和框架进行学习和分析。只有深刻搞清楚了整个2410的框架,我们今后才有能力把一个干净的kernelporting到mxic自己的板子上去。分析的kernel代码:2.6.18.8分析工具:sourceinsight以下会有我自己的一些移植启示,我假设我们的目标板子名称是MXIC0015第一部分s3c2410的框架部分及移植启示1.1总体分析:-Æarch\arm\mach-s3c2410smdk2410开发板的支持代码重要的文件:mach-smdk2410.cdevs.c都是重点分析的代码另外,一些代码都是根s3c2410相关的比如:clock..cs3c2410-gpio.c,time.c这些在我们mxic自己的板子上都要实现,所以代码也要看懂,以后都要在自己平台支持目录实现这些代码。arch\arm\boot启动代码,对ARM平台通用的部分,当然也要在arch/arm/mach-mxic0015/Makefile.boot中定义kernel的zreladdr的值(定义kernel的入口地址)重点掌握zImage的生成过程,以及kernel自引导的部分(在另一份文档会有介绍)-Æinclude\asm-arm\arch-s3c2410一些重要的头文件,比如一些CPU内部寄存器的地址定义等等。比如regs-rtc.h就详细定义了RTC的地址定义的部分。在比如irqs.h定义了smdk2410上面的中断号。还有其他的一些driver程序,散步在driver的各个子目录里面。比如drivers/char/s3c2410-rtc.c移植启示:当我们portingkernel到mxic板子上的时候,可以完全遵循这个组织框架。可以先把整个目录copy过来,然后改名成mxic0015,就可以针对自己的板子修改里面的.h和.c文件了。至于driver方面,也要完全使用对于driver我们mxic0015也要提供一些,比如driver/char/mxic0015-rtc.cdrivers/char/mxic0015-wdt.c等等――――1.2kernel支持s3c2410平台的框架是怎么搭建起来的呢?也就是kernel如何实现支持多种平台结构的呢?总的来说,上面提到kernel目录结构:比如对于arm平台,一般对于每种机制或者设备,都会有一个通用.h或者.c,在这些文件定义或者实现一些通用的函数,在通用的函数里面再去调用具体的platform的同名的.h或者.c里面的函数。举个例子,kernel如何实现通用的代码和具体的平台的联系的。举个内存相关的例子,memory.hÎ存在一个通用的memory.h(include/asm/asm-arm/memory.h)很多平台的memory.h,比如s3c2410平台,include/asm-arm/arch-s3c2410/memory.h且看通用memory.h最开始:#includelinux/compiler.h#includeasm/arch/memory.h//对于s3c2410平台,就是asm/arch-s3c2410/memory.h#includeasm/sizes.h通用的memory.h都会在开头引用具体平台的memory.hNote:怎么实现的呢?因为只要我们makemenuconfig选中arm和s3c2410平台,这里的asm-asm-armArch-arch-s3c2410通过这种链接的方式,我们编译的时候,才能够链接到正确的.c里面的函数。再看通用的memory.h和具体的memory.h是如何相互补充的:只要是涉及到具体平台的,通用的memory.h就不定义,直接用就可以了(因为已经include了具体的memory.h),但是如果具体的memory.h没有定义,通用的memory.h就会定义一个默认值。类似这样:#ifndefPAGE_OFFSET//如果具体的平台没有这个宏,arm平台就使用一个默认值#definePAGE_OFFSET(PHYS_OFFSET)//对于我们的s3c2410平台,PHYS_OFFSET就应该定义自己的物理偏移值:0x30000000#endif而且,通用的memory.h也会调用具体的memory.h实现一些函数:类似:staticinlinevoid*phys_to_virt(unsignedlongx){return(void*)(__phys_to_virt((unsignedlong)(x)));//这个函数就是具体的平台应该实现的了。}移植启示:当kernel要支持一种新的平台的时候,我们的任务就是添加新的平台相关的.h文件或者添加针对新的平台的实现函数。―――1.3为了提供对s3c2410的支持,kernel都做了哪些工作呢?首先在include/asm-arm/mach-s3c2410目录下面,看到的最多的就是以regs-*开头的头文件,显然这里都是对CPUinternalregister的地址,以及相应的bit的定义。为了为driver提供支持,s3c2410必须提供以下这些头文件:Regs-rtc.h,regs-gpio.hregs-lcd.hregs-power.hregs-watchdog.h….等等CPU片上寄存器的地址相关信息的定义文件。然后是提供一些通用的定义的一些头文件:irqs.hio.hhardware.hfb.hIrqs.h提供了整个CPU的中断号的定义。Io.h需要注意:尽管arm平台代码已经提供了一些通用的io操作函数,比如inb,inw这样的函数的重新实现。再比如实现对开发板的描述:map.h对于kernel来说支持一个新的平台,必然要把这个平台的memorymap描述出来,这个可以从datasheet里面查出来。比如对于s3c2410平台,必须定义以下地址。比如SDRAM就是CS6连接的,要定义出来,S3C2410_CS6/*physicaladdressesofallthechip-selectareas*/include/asm-arm/mach-s3c2410.h#defineS3C2410_CS0(0x00000000)#defineS3C2410_CS1(0x08000000)#defineS3C2410_CS2(0x10000000)#defineS3C2410_CS3(0x18000000)#defineS3C2410_CS4(0x20000000)#defineS3C2410_CS5(0x28000000)#defineS3C2410_CS6(0x30000000)#defineS3C2410_CS7(0x38000000)然后是各种register的baseaddr的定义:#defineS3C2400_PA_GPIO(0x15600000)#defineS3C2410_PA_GPIO(0x56000000)#defineS3C24XX_VA_GPIO((S3C2410_PA_GPIO-S3C24XX_PA_UART)+S3C24XX_VA_UART)#defineS3C24XX_SZ_GPIOSZ_1M/*RTC*/#defineS3C24XX_VA_RTCS3C2410_ADDR(0x00F00000)#defineS3C2400_PA_RTC(0x15700040)#defineS3C2410_PA_RTC(0x57000000)#defineS3C24XX_SZ_RTCSZ_1M移植启示:对于我们新的板子也提供一个文件mxic0015_map.h文件来描述memorymap的地址,当然要参考mxic开发板的datasheet。添加系统平台号:系统平台号很重要!对于s3c2410平台arch\arm\tools\mach-types是这样定义的:smdk2410ARCH_SMDK2410SMDK2410193移植启示:对于mxic的板子:假如名称为MXIC_0015Mxic0015ARCH_MXIC0015MXIC00151083(目前最后一个是1082)第二部分s3c2410具体的代码分析:2.1CPU和board的部分:重点看include/asm-arm/system.h定义了CPU的型号:比如:#ifdef__KERNEL__#defineCPU_ARCH_UNKNOWN0#defineCPU_ARCH_ARMv31#defineCPU_ARCH_ARMv42#defineCPU_ARCH_ARMv4T3//jk2410是armv4t#defineCPU_ARCH_ARMv54#defineCPU_ARCH_ARMv5T5//这个是jk2410的打印信息:CPU:ARM920T[41129200]revision0(ARMv4T),cr=00007177,这样看起来,用montavista的toolchain编译kernel里面的s3c2410平台代码是不对的!#defineCPU_ARCH_ARMv5TE6#defineCPU_ARCH_ARMv5TEJ7//我们的0015cpu是v5TEJ/**TheARM926EJ-S.processorisamemberoftheARM9.familyofgeneral-purposemicroprocessors.*TheARM926EJ-SimplementsARMarchitectureversion5TEJandistargetedatmultitasking*applicationswherefullmemorymanagement,highperformance,lowdiesizeandlow*powerareallimportantfeatures.*ËùÒÔÐͺžÍÊÇCPU_ARCH_ARMv5TEJ*/#defineCPU_ARCH_ARMv68下面是描述板子的结构体:这个结构体很重要,setup_arch()要用的这个结构体-Æinclude/asm-arm/mach/arch.hstructmachine_desc{//目标板的描述/**Note!Thefirstfourelementsareused*byassemblercodeinhead-armv.S*/unsignedin

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

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

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

×
保存成功