前阶段做了一次基于at91rm9200引导部分的技术分析,主要采用了u-boot,这里只面向使用at91rm9200板子的 的朋友做个简单的推敲,希望起到抛砖引玉的作用.
关键词 : u-boot: 一个开源的面向多个目标平台(ppc, mips, arm, x86)的bootloader. at91rm9200 : Atmel 公司生产的基于arm9核的Soc处理器.
以下先给出at91rm9200引导流程图
Boot program Flow Diagram
Device Setup | | Boot SPI DataFlash Boot --> Download from DataFlash --> run | | TWI EEPROM Boot --> Download from EEPROM --> run | | Parallel Boot --> Download from 8-bit Device --> | | Xmodem protocol | |---DBGU Serial Download ---------------------> run |____| | DFU protocol |-----USB download -----------------------> run
在这里我主要介绍通过片内引导和片外引导, 片内引导主要采用串口下载并引导u-boot,并完成程序被烧写到Flash上, 然后就可以通过跳线的方式从片外引导执行已经烧写到片外Flash上的引导程序(bootloader).
这里要提及的是at91rm9200内部本身有128k的片内rom,其固化了一个bootloader和uploader, 用来支持程序的 下载和引导,而且其内部固化的程序提供了很多内部服务接口(Internel Service)供我们来使用,例如Xmodem,Tempo DataFlash, CRC, Sine服务接口,这样我们就可以利用它所提供的Service interface API完成程序的下载。 这里主要介绍Xmodem接口服务。
at91rm9200内部固化的代码在设计上采用了面向对象的设计方法,如下:
typedef struct _AT91S_Service { char data; char (*MainMethod)(); char (*ChildMethod)(); }AT91S_Service, *AT91PS_Service;
char AT91F_MainMethod() {
} char AT91F_ChildMethod() {
}
/*init the Service */ AT91PS_Service AT91F_OpenDevice(AT91PS_Service pService) { pService->data = 0; pService->MainMethod = AT91F_MainMethod; pService->ChildMethod = AT91F_ChildMethod; }
file://使用方法如下 AT91S_Service service; AT91PS_Service pService = AT91F_OpenDevice(&service); pService->AT91F_MainMethmod(); .....
通过如上代码片断可以看出它采用了类似面向对象的设计方法。 其实如果各位朋友接触过的话或者看过这本书的话,应该很容易便接受它。 |