您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 我的arm_linux移植笔记
1一、uboot1.2.0移植移植环境:VMware5.5.2+redhat9开发板:SKY_2440B_V5.0或者V3.0编译器:cross3.2(下载地址)Uboot:u-boot-1.2.0(下载地址:)先说明一下,移植过程按照tekkaman的blog移植的。博客地址。其中uboot的移植参照=397315做的。所下面写的移植过程,很多都是从blog上copy过来的,有不同的地方,我会另外指出。1.用dk登录linux主机,在dk下创建一个myboard文件夹2.解压cross3.2:解压到/usr/local/arm/文件夹下最好在/usr/local/arm/下创建一个3.2文件夹,把解压在arm文件夹下的文件(夹)全部移到3.2下,因为后面可能还会用到3.4.1的交叉编译器。3.解压uboot:将uboot解压到myboard文件夹下tarxzvfu-boot-1.2.0.tar.bz2–C/home/dk/myboard/4.进入uboot目录,修改Makefilecdu-boot-1.2.0viMakefile(1)新建我的编译项在1923行,即smdk2410_config编译项之后增加我的编译项tekkaman2440_config:unconfig@$(MKCONFIG)$(@:_config=)armarm920ttekkaman2440tekkamans3c24x0各项的意思如下:arm:CPU的架构(ARCH)arm920t:CPU的类型(CPU),其对应于cpu/arm920t子目录。tekkaman2440:开发板的型号(BOARD),对应于board/tekkaman/tekkaman2440目录。tekkaman:开发者/或经销商(vender)。s3c24x0:片上系统(SOC)。(2)修改交叉编译器路径,我用的cross3.2是在/usr/local/arm/修改128行CROSS_COMPILE=/usr/local/arm/3.2/bin/arm-linux-5.在/board子目录中建立自己的开发板tekkaman2440目录由于我在上一步板子的开发者/或经销商(vender)中填了tekkaman,所以开发板tekkaman2440目录一定要建在/board子目录中的tekkaman目录下,否则编译会出错。$cdboard$mkdirtekkamantekkaman/tekkaman2440$cp-arfsbc2410x/*tekkaman/tekkaman2440/$cdtekkaman/tekkaman2440$mvsbc2410x.ctekkaman2440.c还要记得修改自己的开发板tekkaman2440目录下的Makefile文件,不然编译时会出错:$viMakefile2COBJS:=tekkaman2440.oflash.o6.在include/configs/中建立配置头文件$cpinclude/configs/sbc2410x.hinclude/configs/tekkaman2440.h7.测试编译能否成功$maketekkaman2440_configConfiguringfortekkaman2440board...(如果出现:$maketekkaman2440_configMakefile:1927:***遗漏分隔符。停止。请在U-boot的根目录下的Makefile的@$(MKCONFIG)$(@:_config=)armarm920ttekkaman2440tekkaman)前加上“Tab”键)$make到这一步应该能编译成功,但是我的并没有编译成功,提示/common/cmd_bootm.c文件的464行的U_BOOT_CMD有错误,我是把其中的从#ifdefCONFIG_OF_FLAT_TREE到#endif都屏蔽掉,这样就可以编译过去了。可能还会出现类似的问题,用同样的方法可以解决。下面修改Uboot中的文件,以匹配开发板8.修改/cpu/arm920t/start.S这个函数是arm920t系列的共有启动的汇编代码,UBOOT执行的第一个程序(0)修改寄存器地址定义/*turnoffthewatchdog*/#ifdefined(CONFIG_S3C2400)#definepWTCON0x15300000#defineINTMSK0x14400008/*Interupt-Controllerbaseaddresses*/#defineCLKDIVN0x14800014/*clockdivisorregister*/#elifdefined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)#definepWTCON0x53000000这个定义了看门狗的寄存器地址#defineINTMSK0x4A000008/*Interupt-Controllerbaseaddresses*/中断掩码的寄存器地址#defineINTSUBMSK0x4A00001C中断掩码的寄存器地址#defineCLKDIVN0x4C000014/*clockdivisorregister*/完成时钟分份的寄存器#endif(1)修改中断禁止部分#ifdefined(CONFIG_S3C2400)||defined(CONFIG_S3C2410)||defined(CONFIG_S3C2440)ldrr0,=pWTCON把看门狗寄存器地址给了r0movr1,#0x0r1等于0strr1,[r0]看门狗寄存器等于0因为在启动时要关闭看门狗,不能让他产生中断影响启动,此时也根本不需要任何中断/**maskallIRQsbysettingallbitsintheINTMR-default*/3movr1,#0xffffffff关闭所有中断ldrr0,=INTMSKstrr1,[r0]#ifdefined(CONFIG_S3C2410)ldrr1,=0x7ff//根据2410芯片手册,INTSUBMSK有11位可用,//vivi也是0x7ff,不知为什么U-Boot一直没改过来。ldrr0,=INTSUBMSKstrr1,[r0]#endif#ifdefined(CONFIG_S3C2440)ldrr1,=0x7fff//根据2440芯片手册,INTSUBMSK有15位可用ldrr0,=INTSUBMSKstrr1,[r0]#endif(2)修改时钟设置(2440的主频可达533MHz,但是我设到533MHz时系统很不稳定,不知是不是SDRAM和总线配置的影响,所以现在先设到405MHz,以后在改进。)ldrr0,=CLKDIVN这个值决定了FCLKHCLKPCLK的频率FCLK是供给CPU的是主频HCLK是供给AHB总线(主要用于高性能模块(如CPU、DMA和DSP等)之间的连接,作为SoC的片上系统总线)上的外围设备PCLK是供给APB总线(APB主要用于低带宽的周边外设之间的连接,例如UART、1284等)上的外围设备UCLK是两路PLL中一路供给USB的频率ARM总线技术在这里我不多介绍了,对硬件感兴趣的同学建议多多了解,我有一回面试人家就问我这个了,405MHZ已经很高了,基本都够了,2410的200MHZ就能播放Mplayer视频,据说很流畅。movr1,#5/*FCLK:HCLK:PCLK=1:4:8*/strr1,[r0]mrcp15,0,r1,c1,c0,0/*readctrlregistertekkaman*/orrr1,r1,#0xc0000000/*Asynchronoustekkaman*/mcrp15,0,r1,c1,c0,0/*writectrlregistertekkaman*/他是用到了协处理器P15,此处理器主要设置mmu,时钟模式,caches,保护模式的。先把C0C1的值读出到r1,设置后再写回。FCLK:HCLK:PCLK的比例由CLKDIVN决定的,CLKDIVN寄存器的HDIVN和PDIVN决定比例的大小。因为此时的HDIVH不为0,将快速总线模式改为异步总线模式,操作协处理器P15改变模式即可,如果HDIVH不为0,而且是快速总线模式的话,那么CPU的主频由hclk控制,这样可以实现不改变HCLK和PCLCK的同时就能使CPU的主频减半或更多。网上的大虾说没有以上几句主频会是12MHZ,我的观点不同。这是数据手册原文IfHDIVNisnot0andtheCPUbusmodeisthefastbusmode,theCPUwilloperatebytheHCLK.ThisfeaturecanbeusedtochangetheCPUfrequencyasahalformorewithoutaffectingtheHCLKandPCLK#ifdefined(CONFIG_S3C2440)4/*now,CPUclockis405.00Mhztekkaman*/movr1,#CLK_CTL_BASE/*tekkaman*/这是时钟寄存器的基地址movr2,#MDIV_405/*mpll_405mhztekkaman*/addr2,r2,#PSDIV_405/*mpll_405mhztekkaman*/strr2,[r1,#0x04]/*MPLLCONtekkaman*/设置MPLLCON#endif#ifdefined(CONFIG_S3C2410)/*now,CPUclockis202.8Mhztekkaman*/movr1,#CLK_CTL_BASE/*tekkaman*/movr2,#MDIV_200/*mpll_200mhztekkaman*/addr2,r2,#PSDIV_200/*mpll_200mhztekkaman*/strr2,[r1,#0x04]/*MPLLCONtekkaman*/#endif#endif/*CONFIG_S3C2400||CONFIG_S3C2410||CONFIG_S3C2440*/红色部分是我添加的,利用vivi的代码,将其设为405.00MHz并在前面加上:#elifdefined(CONFIG_S3C2410)#definepWTCON0x53000000#defineINTMSK0x4A000008/*Interupt-Controllerbaseaddresses*/#defineINTSUBMSK0x4A00001C#defineCLKDIVN0x4C000014/*clockdivisorregister*/#defineCLK_CTL_BASE0x4C000000/*tekkaman*/#ifdefined(CONFIG_S3C2440)#defineMDIV_4050x7f12/*tekkaman*/#definePSDIV_4050x21/*tekkaman*/#endif#ifdefined(CONFIG_S3C2410)#defineMDIV_2000xa112/*tekkaman*/#definePSDIV_2000x31/*tekkaman*/#endif#endif〕(3)将从Flash启动改成从NANDFlash启动。(特别注意:这和2410的程序有不同,不可混用!!!是拷贝vivi的代码。)将以下U-Boot的重定向语句段:这段代码将uboot搬运到ram中,这个是没有存放在nand的情况,下面咱们来看一下不在nand启动和在nand启动时此
本文标题:我的arm_linux移植笔记
链接地址:https://www.777doc.com/doc-6329484 .html