您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 项目/工程管理 > 基于OK6410的u-boot2010.03移植过程
很久了,我也不知道具体多久了,大概、或许、应该有一个月了吧。曾经想过放弃,但是想到未来,我坚持住了。今天终于迈出了u-boot的第一步,一小步,但是很兴奋,因为我走过了最为艰辛的第一步,我相信,接下来的事情会更顺利。我会不断在此更新移植u-boot的步骤,我是一只菜鸟,真的菜鸟,肯定有很多地方解释得不到位,甚至乎是错的,我希望大家谅解,因为我不是大师,我只是菜鸟。我写下移植u-boot的过程只是想供给用得着的linux学习者参考。回想大一开始接触单片机,到现在大三2年了,现在也还是初次接触linux,实在惭愧啊。我的解释有错误或者讨论linux,可以发送邮件到我邮箱:jxlgzzq@163.com。在此很感谢网易中一位九尾狐仙的博客好友对我的指教。第二版本的修改参考了江西理工大学09级“3+1”创新教育实验班谢贤斌同学的u-boot-2010.03移植版本。在此感谢这位亦师亦友的室友&队友。江西理工大学09级“3+1”创新教育实验班朱兆祺2012-4-10在中下载u-boot-2010.03,其实我之前用的是u-boot-2010.06,坑爹很久才发现,u-boot-2010.06是一个分界点,u-boot-2010.03是最后一个版本类似u-boot1.1.6.而u-boot-2010.06是一个新起点版本。我承认我是一个菜鸟,一个刚买OK6410不久的菜鸟,一个刚刚接触linux的菜鸟,既然是菜鸟,我就要从模仿开始,于是,我拖出u-boot-1.1.6开始研究,开始移植u-boot-2010.03。下载好u-boot-2010.03之后,解压缩,这里的一切我都是在XP系统下完成的。1.进入u-boot-2010.03/board,把除samsung以外的文件夹删除。2.进入u-boot-2010.03/cpu,把除arm1176以外的文件夹删除。3.进入u-boot-2010.03\include,把asm-*(注意,仅仅是asm-开头的文件夹)中的,除了asm-arm和asm-generic以外的文件夹删除。4.进入u-boot-2010.03\include\configs,只要留下smdk6400.h,其他的东西删除。5.在u-boot-2010.03,把lib_*开头的文件夹,除了lib_arm和lib_generic以外的文件夹删除。6.现在把u-boot-2010.03放入到ubuntu中,先配置:makesmdk6400_config,接着make。编译完成之后应该生成了u-boot.bin,其实现在什么都没有完成,我只是尝试了下原版u-boot2010.03能不能行。编译完成之后应该是这个样子:好戏还在后头。我们先来看下删减之后的u-boot-2010.03的构架:这里交大家一个指令:tree,怎么用呢?我也忘了,没关系,mantree。它会告诉你一切,我们找到我们需要的那条:呵呵,那就是使用tree-L深度我们来尝试下:其中白色的是文件,蓝色的是目录,绿色的是可执行文件。现在进入u-boot-2010.03\board\samsung,把除了smdk6400之外的文件夹删除,同时建立一个文件夹smdk6410,把smdk6400文件夹里面的东西复制到smdk6410文件夹中。进入smdk6410文件夹,把smdk6400.c改成smdk6410.c。进入u-boot-2010.03\include\asm-arm,把除了arch-s3c64xx和proc-armv之外的文件夹删除。进入arch-s3c64xx,建立s3c6410.h,将s3c6400.h文件里面的程序原原本本复制到s3c6410.h。进入根目录下的Makefile,这个我就不加详细分析,我想我也可能分析不过来。找到:smdk6400_noUSB_config\smdk6400_config:unconfig@mkdir-p$(obj)include$(obj)board/samsung/smdk6400@mkdir-p$(obj)nand_spl/board/samsung/smdk6400@echo#defineCONFIG_NAND_U_BOOT$(obj)include/config.h@if[-z$(findstringsmdk6400_noUSB_config,$@)];then\echoRAM_TEXT=0x57e00000$(obj)board/samsung/smdk6400/config.tmp;\$(MKCONFIG)$(@:_config=)armarm1176smdk6400samsungs3c64xx;\else\echoRAM_TEXT=0xc7e00000$(obj)board/samsung/smdk6400/config.tmp;\$(MKCONFIG)$(@:_noUSB_config=)armarm1176smdk6400samsungs3c64xx;\fi@echoCONFIG_NAND_U_BOOT=y$(obj)include/config.mk这个是smdk6400的配置,现在将它改成smdk6410的配置:smdk6410_noUSB_config\smdk6410_config:unconfig@mkdir-p$(obj)include$(obj)board/samsung/smdk6410@mkdir-p$(obj)nand_spl/board/samsung/smdk6410@echo#defineCONFIG_NAND_U_BOOT$(obj)include/config.h@if[-z$(findstringsmdk6410_noUSB_config,$@)];then\echoRAM_TEXT=0x57e00000$(obj)board/samsung/smdk6410/config.tmp;\$(MKCONFIG)$(@:_config=)armarm1176smdk6410samsungs3c64xx;\else\echoRAM_TEXT=0xc7e00000$(obj)board/samsung/smdk6410/config.tmp;\$(MKCONFIG)$(@:_noUSB_config=)armarm1176smdk6410samsungs3c64xx;\fi@echoCONFIG_NAND_U_BOOT=y$(obj)include/config.mk进入u-boot-2010.03\board\samsung\smdk6410,打开smdk6410.c,把#includeasm/arch/s3c6400.h改成#includeasm/arch/s3c6410.h。把u-boot-2010.03中所有的*6400改成*6410。这是第二版修改,我把下面这段代码做了适当修改:#ifndefCONFIG_NAND_SPL/**flushv4I/Dcaches*/movr0,#0mcrp15,0,r0,c7,c7,0/*flushv3/v4cache*/mcrp15,0,r0,c8,c7,0/*flushv4TLB*//**disableMMUstuffandcaches*/mrcp15,0,r0,c1,c0,0bicr0,r0,#0x00002300@clearbits13,9:8(--V---RS)bicr0,r0,#0x00000087@clearbits7,2:0(B----CAM)orrr0,r0,#0x00000002@setbit2(A)Alignorrr0,r0,#0x00001000@setbit12(I)I-Cachemcrp15,0,r0,c1,c0,0#endif在start.S中,bllowlevel_init之前的代码都无需更改,直到这句话之后需要添加下面代码:/*whenwealreadyruninram,wedon'tneedtorelocateU-Boot.*andactually,memorycontrollermustbeconfiguredbeforeU-Boot*isrunninginram.*/ldrr0,=0xff000fffbicr1,pc,r0/*r0-currentbaseaddrofcode*/ldrr2,_TEXT_BASE/*r1-originalbaseaddrinram*/bicr2,r2,r0/*r0-currentbaseaddrofcode*/cmpr1,r2/*comparer0,r1*/beqafter_copy/*r0==r1thenskipflashcopy*/这段代码是判断到底是从nandflash中启动还是从ram中启动。1.如果是从nandflash中启动,那么PC的值一定在4K之内。那么执行完bicr1,pc,r0之后,r1为0。_TEXT_BASE要么等于0x57e00000,要么等于0xC7e00000.那么执行完bicr2,r2,r0之后,r2为0x00e00000,那么不相等,则不跳转,下面应该就是copy_from_nand。2.如果是从ram中启动,那么PC的值为0xx7e00000。那么执行完bicr1,pc,r0之后,r1为0x00e00000。_TEXT_BASE要么等于0x57e00000,要么等于0xC7e00000.那么执行完bicr2,r2,r0之后,r2为0x00e00000,那么相等,跳转到after_copy,也就是不需要copy。承接上面分析,如果没有完成copy,则接下来就是copy_from_nand。那么在beqafter_copy后面添加:#ifdefCONFIG_BOOT_NANDmovr0,#0x1000blcopy_from_nand#endif如果完成则会跳过这段代码,直接进入after_copy。OK,在u-boot-2010.03\cpu\arm1176下面新建一个nand_cp.c文件:#includecommon.h#ifdefCONFIG_S3C64XX#includeasm/io.h#includelinux/mtd/nand.h#includeasm/arch/s3c6410.hstaticintnandll_read_page(uchar*buf,ulongaddr,intlarge_block){inti;intpage_size=512;/*2K*/if(large_block==1)page_size=2048;/*4K*/if(large_block==2)page_size=4096;NAND_ENABLE_CE();NFCMD_REG=NAND_CMD_READ0;/*WriteAddress*/NFADDR_REG=0;if(large_block)NFADDR_REG=0;NFADDR_REG=(addr)&0xff;NFADDR_REG=(addr8)&0xff;NFADDR_REG=(addr16)&0xff;/*#defineNFCMD_REG__REG(ELFIN_NAND_BASE+NFCMMD_OFFSET)#defineELFIN_NAND_BASE0x70200000#defineNFCMMD_OFFSET0x08NFCMD_REG=(*((volatileu32*)(0x70200008)))NFCMMD0x70200008NANDFlash命令设置寄存器0#defineNAND_CMD_READSTART0x30*/if(large_block)NFCMD_REG=NAND_CMD_READSTART;/*defineNF_TRANSRnB()do{while(!(NFSTAT_REG&(10)));}while(0)#defineNFSTAT
本文标题:基于OK6410的u-boot2010.03移植过程
链接地址:https://www.777doc.com/doc-4725575 .html