3867|10

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

今天,我不求助——详细分析优龙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/
========================================完!希望高人指点不懂的问题





最新回复

向gooogleman学习!!!  详情 回复 发表于 2010-4-22 15:22
点赞 关注

回复
举报

58

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
在博客里面,讲了扩展内存的方法,nand flash扩展
--------------------------------------------
等下开始重新弄OAL了,让改造过的板子跑起wince
有几个驱动大牛人怎么不来了,天天等他们啊,
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
mark
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

4
 
学习了!
楼主好人!鉴定完毕!
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

5
 
我觉得,有时间可以看看ucos的启动代码,很规范
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

6
 
MARK。好人有好报。。。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 4 楼 linuxmta 的回复:
我觉得,有时间可以看看ucos的启动代码,很规范


-------------迟早的事情,现在忙的要死
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

8
 
UCOS是操作系统,操作系统的启动代码和硬件有关系吗?
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 wangwader2 的回复:
UCOS是操作系统,操作系统的启动代码和硬件有关系吗?

操作系统都是要启动代码的啊。
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

10
 

操作系统的启动,跟硬件厂商提供的bios一样吗?
引用 8 楼 gooogleman 的回复:
引用 7 楼 wangwader2 的回复:
UCOS是操作系统,操作系统的启动代码和硬件有关系吗?

操作系统都是要启动代码的啊。
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

11
 
向gooogleman学习!!!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表