U-Boot在44B0X开发板上的移植以及代码分析复习过程_第1页
U-Boot在44B0X开发板上的移植以及代码分析复习过程_第2页
U-Boot在44B0X开发板上的移植以及代码分析复习过程_第3页
U-Boot在44B0X开发板上的移植以及代码分析复习过程_第4页
U-Boot在44B0X开发板上的移植以及代码分析复习过程_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Good is good, but better carries it.精益求精,善益求善。U-Boot在44B0X开发板上的移植以及代码分析-U-Boot在44B0X开发板上的移植以及代码分析章永阳2003-10-301.u-boot介绍u-boot是一个opensource的bootloader,目前版本是0.4.0。u-boot是在ppcboot以及armboot的基础上发展而来,虽然宣称是0.4.0版本,却相当的成熟和稳定,已经在许多嵌入式系统开发过程中被采用。由于其开发源代码,其支持的开发板众多。唯一遗憾的是并不支持我们现在学习所用samsung44B0X的开发板。为什么我们需要u-

2、boot?显然可以将ucLinux直接烧入flash,从而不需要额外的引导装载程序(bootloader)。但是从软件升级的角度以及程序修补的来说,软件的自动更新非常重要。事实上,引导装载程序(bootloader)的用途不仅如此,但仅从软件的自动更新的需要就说明我们的开发是必要的。同时,u-boot移植的过程也是一个对嵌入式系统包括软硬件以及操作系统加深理解的一个过程。2.u-boot移植的框架移植u-boot到新的开发板上仅需要修改和硬件相关的部分。在代码结构上:在board目录下创建ev44b0ii目录,创建ev44b0ii.c以及flash.c,memsetup.S,u-boot.ld

3、s等。不需要从零开始,可选择一个相似的目录,直接复制过来,修改文件名以及内容。我在移植u-boot过程中,选择的是ep7312目录。由于u-boot已经包含基于s3c24b0的开发板目录,作为参考,也可以复制相应的目录。在cpu目录下创建arm7tdmi目录,主要包含start.S,interrupts.c以及cpu.c,serial.c几个文件。同样不需要从零开始建立文件,直接从arm720t复制,然后修改相应内容。在include/configs目录下添加ev44b0ii.h,在这里放上全局的宏定义等。找到u-boot根目录下Makefile修改加入ev44b0ii_config:unco

4、nfig./mkconfig$(:_config=)armarm7tdmiev44b0ii运行makeev44bii_config,如果没有错误就可以开始硬件相关代码移植的工作3.u-boot的体系结构1)总体结构u-boot是一个层次式结构。从上图也可以看出,做移植工作的软件人员应当提供串口驱动(UARTDriver),以太网驱动(EthernetDriver),Flash驱动(Flash驱动),USB驱动(USBDriver)。目前,通过USB口下载程序显得不是十分必要,所以暂时没有移植USB驱动。驱动层之上是u-boot的应用,command通过串口提供人机界面。我们可以使用一些命令做一

5、些常用的工作,比如内存查看命令md。Kermit应用主要用来支持使用串口通过超级终端下载应用程序。TFTP则是通过网络方式来下载应用程序,例如uclinux操作系统。2)内存分布在flashrom中内存分布图ev44b0ii的flash大小2M(8bits),现在将0-40000共256k作为u-boot的存储空间。由于u-boot中有一些环境变量,例如ip地址,引导文件名等,可在命令行通过setenv配置好,通过saveenv保存在40000-50000(共64k)这段空间里。如果存在保存好的环境变量,u-boot引导将直接使用这些环境变量。正如从代码分析中可以看到,我们会把flash引导代

6、码搬移到DRAM中运行。下图给出u-boot的代码在DRAM中的位置。引导代码u-boot将从0 x00000000处搬移到0 x0C700000处。特别注意的由于ev44b0iiuclinux中断向量程序地址在0 x0c000000处,所以不能将程序下载到0 x0c000000出,通常下载到0 x0c080000处。4.start.S代码结构1)定义入口一个可执行的Image必须有一个入口点并且只能有一个唯一的全局入口,通常这个入口放在Rom(flash)的0 x0地址。例如start.S中的.globl_start_start:值得注意的是你必须告诉编译器知道这个入口,这个工作主要是修改连

7、接器脚本文件(lds)。2)设置异常向量(ExceptionVector)异常向量表,也可称为中断向量表,必须是从0地址开始,连续的存放。如下面的就包括了复位(reset),未定义处理(undef),软件中断(SWI),预去指令错误(Pabort),数据错误(Dabort),保留,以及IRQ,FIQ等。注意这里的值必须与uclinux的vector_base一致。这就是说如果uclinux中vector_base(在include/armnommu/proc-armv/system.h)定义为0 x0c000000,则HandleUndef应该在0 x0c000004。breset/forde

8、bugldrpc,=HandleUndefldrpc,=HandleSWIldrpc,=HandlePabortldrpc,=HandleDabortb.ldrpc,=HandleIRQldrpc,=HandleFIQldrpc,=HandleEINT0/*mGAH/Winterruptvectortable*/ldrpc,=HandleEINT1ldrpc,=HandleEINT2ldrpc,=HandleEINT3ldrpc,=HandleEINT4567ldrpc,=HandleTICK/*mGA*/b.b.ldrpc,=HandleZDMA0/*mGB*/ldrpc,=HandleZD

9、MA1ldrpc,=HandleBDMA0ldrpc,=HandleBDMA1ldrpc,=HandleWDTldrpc,=HandleUERR01/*mGB*/b.b.ldrpc,=HandleTIMER0/*mGC*/ldrpc,=HandleTIMER1ldrpc,=HandleTIMER2ldrpc,=HandleTIMER3ldrpc,=HandleTIMER4ldrpc,=HandleTIMER5/*mGC*/b.b.ldrpc,=HandleURXD0/*mGD*/ldrpc,=HandleURXD1ldrpc,=HandleIICldrpc,=HandleSIOldrpc,=H

10、andleUTXD0ldrpc,=HandleUTXD1/*mGD*/b.b.ldrpc,=HandleRTC/*mGKA*/b.b.b.b.b./*mGKA*/b.b.ldrpc,=HandleADC/*mGKB*/b.b.b.b.b./*mGKB*/b.b.ldrpc,=EnterPWDN作为对照:请看以上标记的值:.equHandleReset,0 xc000000.equHandleUndef,0 xc000004.equHandleSWI,0 xc000008.equHandlePabort,0 xc00000c.equHandleDabort,0 xc000010.equHandl

11、eReserved,0 xc000014.equHandleIRQ,0 xc000018.equHandleFIQ,0 xc00001c/*thevalueisdifferentwithanaddressyouthinkitmaybe.*IntVectorTable*/.equHandleADC,0 xc000020.equHandleRTC,0 xc000024.equHandleUTXD1,0 xc000028.equHandleUTXD0,0 xc00002c.equHandleSIO,0 xc000030.equHandleIIC,0 xc000034.equHandleURXD1,0

12、 xc000038.equHandleURXD0,0 xc00003c.equHandleTIMER5,0 xc000040.equHandleTIMER4,0 xc000044.equHandleTIMER3,0 xc000048.equHandleTIMER2,0 xc00004c.equHandleTIMER1,0 xc000050.equHandleTIMER0,0 xc000054.equHandleUERR01,0 xc000058.equHandleWDT,0 xc00005c.equHandleBDMA1,0 xc000060.equHandleBDMA0,0 xc000064

13、.equHandleZDMA1,0 xc000068.equHandleZDMA0,0 xc00006c.equHandleTICK,0 xc000070.equHandleEINT4567,0 xc000074.equHandleEINT3,0 xc000078.equHandleEINT2,0 xc00007c.equHandleEINT1,0 xc000080.equHandleEINT0,0 xc0000843)初始化CPU相关的pll,clock,中断控制寄存器依次为关闭watchdogtimer,关闭中断,设置LockTime,PLL(phaselockloop),以及时钟。这些值

14、(除了LOCKTIME)都可从Samsung44b0的手册中查到。ldrr0,WTCON/watchdogdisableldrr1,=0 x0strr1,r0ldrr0,INTMSKldrr1,MASKALL/allinterruptdisablestrr1,r0/*Setclockcontrolregisters*/ldrr0,LOCKTIMEldrr1,=800/count=t_lock*Fin(t_lock=200us,Fin=4MHz)=800strr1,r0ldrr0,PLLCON/*temporarysettingofPLL*/ldrr1,PLLCON_DAT/*Fin=10MHz

15、,Fout=40MHzor60MHz*/strr1,r0ldrr0,CLKCONldrr1,=0 x7ff8/AllunitblockCLKenablestrr1,r04)初始化内存控制器内存控制器,主要通过设置13个从1c80000开始的寄存器来设置,包括总线宽度,8个内存bank,bank大小,sclk,以及两个bankmode。/*Setmemorycontrolregisters*/memsetup:adrr0,SMRDATAldmiar0,r1-r13ldrr0,=0 x01c80000/BWSCONAddressstmiar0,r1-r135)将rom中的程序复制到RAM中首先利用

16、PC取得bootloader在flash的起始地址,再通过标号之差计算出这个程序代码的大小。这些标号,编译器会在连接(link)的时候生成正确的分布的值。取得正确信息后,通过寄存器(r3到r10)做为复制的中间媒介,将代码复制到RAM中。relocate:/*relocatearmboottoRAM*/adrr0,_start/*r0-currentpositionofcode*/ldrr2,_armboot_startldrr3,_armboot_endsubr2,r3,r2/*r2-sizeofarmboot*/ldrr1,_TEXT_BASE/*r1-destinationaddress

17、*/addr2,r0,r2/*r2baudrate)+0.5)-1)计算得出。这可以在手册中查到。其他的函数包括发送,接收。这个时候没有中断,是通过循环等待来判断是否动作完成。例如,接收函数:while(!(rUTRSTAT0&0 x1);/ReceivedatareadreturnRdURXH0();2.时钟部分实现了延时函数udelay。这里的get_timer由于没有使用中断,是使用全局变量来累加的。3.flash部分flash作为内存的一部分,读肯定没有问题,关键是flash的写部分。Flash的写必须先擦除,然后再写。unsignedlongflash_init(void)inti;

18、u16manId,devId;/firstweinititasunknown,evenifyouforgetassignitbelow,itsnotaproblemfor(i=0;iCFG_MAX_FLASH_BANKS;+i)flash_infoi.flash_id=FLASH_UNKNOWN;flash_infoi.sector_count=CFG_MAX_FLASH_SECT;/*checkmanId,devId*/_RESET();_WR(0 x555,0 xaa);_WR(0 x2aa,0 x55);_WR(0 x555,0 x90);manId=_RD(0 x0);_WR(0 x5

19、55,0 xaa);_WR(0 x2aa,0 x55);_WR(0 x555,0 x90);devId=_RD(0 x1);_RESET();printf(flashn);printf(ManufactureID=%4x(0 x0004),DeviceID(0 x22c4)=%4xn,manId,devId);if(manId!=0 x0004&devId!=0 x22c4)printf(flashcheckfaliluren);return0;elsefor(i=0;i=CFG_FLASH_BASE/onitorprotectionONbydefaultflash_protect(FLAG_

20、PROTECT_SET,CFG_MONITOR_BASE,CFG_MONITOR_BASE+monitor_flash_len-1,&flash_info0);#endif*/flash_info0.size=PHYS_FLASH_SIZE;return(PHYS_FLASH_SIZE);flash_init完成初始化部分,这里的主要目的是检验flash的型号是否正确。intflash_erase(flash_info_t*info,ints_first,ints_last)volatileunsignedchar*addr=(volatileunsignedchar*)(info-start

21、0);intflag,prot,sect,l_sect;/ulongstart,now,last;u32targetAddr;u32targetSize;/*zyynote:Itisrequiredandcantbeomitted*/rNCACHBE0=(0 x200000012)12);/flasharea(Bank0)mustbenon-cachablearea.rSYSCFG=rSYSCFG&(0 x8);/writebufferhastobeoffforpropertiming.if(s_firsts_last)if(info-flash_id=FLASH_UNKNOWN)printf

22、(-missingn);elseprintf(-nosectorstoerasen);return1;if(info-flash_id=FLASH_UNKNOWN)|(info-flash_idFLASH_AMD_COMP)printf(Canteraseunknownflashtype-abortedn);return1;prot=0;for(sect=s_first;sectprotectsect)prot+;if(prot)printf(-Warning:%dprotectedsectorswillnotbeerased!n,prot);elseprintf(n);l_sect=-1;/*Disableinterruptswhichmightcauseatimeouthere*/flag=disable_interrupts();/*Starteraseonunprotectedsectors*/for(sect=s_first;sectprotectsect=0)/*notprotected*/targetAddr=0 x10000*sect;if(targetAddr0 x1F0000)targetSize=0 x10000;elseif(targetA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论