详细分析优龙BIOS代码

 

今天,我不求助——详细分析优龙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/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值