详细分析优龙BIOS代码

来源:互联网 发布:微邦软件 编辑:程序博客网 时间:2024/05/18 00:08
 

今天,我不求助——详细分析优龙BIOS代码(ADS编写)

看了一段时间BIOS。从周立功BSP下的eboot到优龙的BIOS,问过不少弱智问题(通常是我自己没有找到就说XXX很奇怪就来问),幸好有eeworld前辈指点,我才慢慢积累经验。优龙的BIOS我已经了解大概,在功成身退之时拿出来分享,免得以后有人走弯路。
==============
首先是汇编部分2440init.s,因为第一个运行的代码,所以很重要,里面涉及一些SDRAM初始化,代码搬运。我只讲最难理解的部分
----------
;===========================================================
;bl Led_Test

ldr r0, =BWSCON
ldr r0, [r0]
ands r0, r0, #6 ;OM[1:0] != 0, NOR FLash boot
bne copy_proc_beg ;don't read nand flash
adr r0, ResetEntry ;OM[1:0] == 0, NAND FLash boot---------决定程序跳转到哪里
cmp r0, #0 ;if use Multi-ice,
bne copy_proc_beg ;don't read nand flash for boot
;nop
;===========================================================
nand_boot_beg
-----------------
首先要注意的是LDR和ADR的区别,LDR只和RO base有关系,ADR和代码所运行的位置有关:所以adr r0, ResetEntry决定跳转到哪里。如果是第一次上电,那么代码是在内部4K SRAM运行的,ResetEntry地址肯定是0x0,所以就会执行代码搬运过程nand_boot_beg(把代码从nand flash搬运到内存),如果是使用仿真器,那么代码在内存执行,ResetEntry就是内存的首地址,所以就会执行copy_proc_beg这个过程
在nand_boot_beg程序段里面有
ldr r9, =ResetEntry-------------根据前面提示,这个是等于 RO base的
所以后面的代码就拷贝到了内存
-----------------------汇编关键部分完结,有疑问的跟帖子吧。
=====================================C语言部分=======================================
C语言比较容易看懂的
刚开始自然是Main函数
while(1)
{
if(menuUsed==1)Menu();
WaitDownload();
}--------------其他地方都暂时不看,就看这里。这两个函数调用了大量函数,在这里我也不说了。高手一看便知道
不怕笑话,我在这里把自己犯的愚蠢笑话发出来
---------------------------------------------
if(download_run==1)
{

register void(*run)(void); //hzh,使用寄存器变量以防止禁止DCACHE后数据不一致!!!


rINTMSK=BIT_ALLMSK;

run=(void (*)(void))downloadAddress; //使用DCACHE且RW区也在CACHE区间downloadAddress会在cache中
{ //hzh
MMU_DisableDCache(); //download program must be in
MMU_DisableICache(); //non-cache area
MMU_InvalidateDCache(); //使所有DCACHE失效,本程序的MMU_Init中将会刷新DCACHE到存储器,
//为使应用此MMU_Init方式的程序能被正确运行必须先使DCACHE失效!!!
MMU_DisableMMU();
}

printf("run...\n");

run();===直接从这个地址运行

========这个写法奇特,放了烟雾弹。不过对于下面是个定义,我认识不到绝对是丢人的事情

register void(*run)(void); //hzh,使用寄存器变量以防止禁止DCACHE后数据不一致!!!
==========================================================================================
文件是通过USB端点3传过来,是通过中断传输的
由于USB比较复杂,我也说不清楚,很希望高人出来说说2440的USB
我只找到USB中断处理函数,看到文件是怎么读进来的。
-----------------------------------------
对如下问题不清楚
downloadFileSize是在usbout.c中void Ep3Handler(void)赋值的
--------------到底是怎么传到u2440mon.c的还是个迷,并且为什么要这么计算呢

downloadFileSize=
*((U8 *)(downPt+4))+
(*((U8 *)(downPt+5))<<8)+
(*((U8 *)(downPt+6))<<16)+
(*((U8 *)(downPt+7))<<24);
还有,就是裸奔ARM9的时候,到底该如何设置MMU以及cache
在我的博客,有更详细的内容
http://wogoyixikexie.blog.163.com/blog/edit/