龙芯软件开发(19)-- C函数入口

[复制链接]
 楼主| xumin21ic 发表于 2007-1-9 20:00 | 显示全部楼层 |阅读模式
经历了漫长的汇编之路,最终走到光明的C世界了,进入高级语言环境,会让开发更方便,写更少的语句就可以实现更多的功能。从这里开始,就初始化PCI局部线所有设备,初始化南桥所有的功能,初始化IDE硬盘,初始化网络,初始化显示卡,并进入响应命令阶段。&nbsp;<br />下面就来分析C函数部份功能,当然它还有时需要调用汇编子函数才能实现特殊的功能。&nbsp;<br />从上次分析移动代码里,就知道代码已经移到0x8000&nbsp;0000开始运行了。&nbsp;<br />void&nbsp;<br />initmips(unsigned&nbsp;int&nbsp;memsz)&nbsp;<br />{&nbsp;<br />&nbsp;&nbsp;&nbsp;/*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Set&nbsp;up&nbsp;memory&nbsp;address&nbsp;decoders&nbsp;to&nbsp;map&nbsp;entire&nbsp;memory.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;But&nbsp;first&nbsp;move&nbsp;away&nbsp;bootrom&nbsp;map&nbsp;to&nbsp;high&nbsp;memory.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<br />#if&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;GT_WRITE(BOOTCS_LOW_DECODE_ADDRESS,&nbsp;BOOT_BASE&nbsp;&gt&gt&nbsp;20);&nbsp;<br />&nbsp;&nbsp;&nbsp;GT_WRITE(BOOTCS_HIGH_DECODE_ADDRESS,&nbsp;(BOOT_BASE&nbsp;-&nbsp;1&nbsp;+&nbsp;BOOT_SIZE)&nbsp;&gt&gt&nbsp;20);&nbsp;<br />#endif&nbsp;<br />&nbsp;&nbsp;&nbsp;memorysize&nbsp;=&nbsp;memsz&nbsp;&gt&nbsp;256&nbsp;?&nbsp;256&nbsp;&lt&lt&nbsp;20&nbsp;:&nbsp;memsz&nbsp;&lt&lt&nbsp;20;&nbsp;<br />&nbsp;&nbsp;&nbsp;memorysize_high&nbsp;=&nbsp;memsz&nbsp;&gt&nbsp;256&nbsp;?&nbsp;(memsz&nbsp;-&nbsp;256)&nbsp;&lt&lt&nbsp;20&nbsp;:&nbsp;0;&nbsp;<br />上面代码,由于在汇编里就已经设置好三个参数,第一个参数为内存的大小,并且单位是字节。汇编代码如下:&nbsp;<br />move&nbsp;&nbsp;&nbsp;a0,msize&nbsp;<br />&nbsp;&nbsp;&nbsp;srl&nbsp;a0,20&nbsp;<br />memorysize就保存低端内存的大小,小于或等256M。memorysize_high保存高于256M的内存大小。这样就知道系统内存的大小了。&nbsp;<br /><br />#if&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;start&nbsp;=&nbsp;0x80000000;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;end&nbsp;=&nbsp;0x80000000&nbsp;+&nbsp;16384;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(start&nbsp;&lt&nbsp;end)&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;__asm__&nbsp;volatile&nbsp;(&quot;&nbsp;cache&nbsp;1,0(%0)
&quot;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&nbsp;cache&nbsp;1,1(%0)
&quot;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&nbsp;cache&nbsp;1,2(%0)
&quot;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&nbsp;cache&nbsp;1,3(%0)
&quot;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&nbsp;cache&nbsp;0,0(%0)
&quot;::&quot;r&quot;(start));&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start&nbsp;+=&nbsp;32;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;__asm__&nbsp;volatile&nbsp;(&nbsp;&quot;&nbsp;mfc0&nbsp;$2,$16
&quot;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&nbsp;and&nbsp;$2,&nbsp;$2,&nbsp;0xfffffff8
&quot;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&nbsp;or&nbsp;&nbsp;&nbsp;$2,&nbsp;$2,&nbsp;2
&quot;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;&nbsp;mtc0&nbsp;$2,&nbsp;$16
&quot;&nbsp;:::&quot;$2&quot;);&nbsp;<br />&nbsp;&nbsp;&nbsp;}&nbsp;<br />#endif&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Probe&nbsp;clock&nbsp;frequencys&nbsp;so&nbsp;delays&nbsp;will&nbsp;work&nbsp;properly.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<br />&nbsp;&nbsp;&nbsp;tgt_cpufreq();&nbsp;<br />这里实现CPU频率的设置和检测。&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;SBD_DISPLAY(&quot;DONE&quot;,0);&nbsp;<br />&nbsp;&nbsp;&nbsp;/*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Init&nbsp;PMON&nbsp;and&nbsp;debug&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<br />&nbsp;&nbsp;&nbsp;cpuinfotab[0]&nbsp;=&nbsp;&DBGREG;&nbsp;<br />&nbsp;&nbsp;&nbsp;dbginit(NULL);&nbsp;<br />上面函数实现调试和大部份的功能初始化。&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Set&nbsp;up&nbsp;exception&nbsp;vectors.&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<br />&nbsp;&nbsp;&nbsp;SBD_DISPLAY(&quot;BEV1&quot;,0);&nbsp;<br />&nbsp;&nbsp;&nbsp;bcopy(MipsException,&nbsp;(char&nbsp;*)TLB_MISS_EXC_VEC,&nbsp;MipsExceptionEnd&nbsp;-&nbsp;MipsException);&nbsp;<br />&nbsp;&nbsp;&nbsp;bcopy(MipsException,&nbsp;(char&nbsp;*)GEN_EXC_VEC,&nbsp;MipsExceptionEnd&nbsp;-&nbsp;MipsException);&nbsp;<br />上面代码实现异常向量的设置。&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;CPU_FlushCache();&nbsp;<br />上面代码重新初始化缓存。&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;CPU_SetSR(0,&nbsp;SR_BOOT_EXC_VEC);&nbsp;<br />上面代码设置状态寄存器,可以执行异常处理了,启动模式已经结束,进入正常模式运行。&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;SBD_DISPLAY(&quot;BEV0&quot;,0);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;printf(&quot;BEV&nbsp;in&nbsp;SR&nbsp;set&nbsp;to&nbsp;zero.
&quot;);&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<br />#if&nbsp;0&nbsp;<br />&nbsp;&nbsp;&nbsp;/*&nbsp;memtest&nbsp;*/&nbsp;<br />&nbsp;&nbsp;&nbsp;addr_tst1();&nbsp;<br />&nbsp;&nbsp;&nbsp;addr_tst2();&nbsp;<br />&nbsp;&nbsp;&nbsp;movinv1(2,0,~0);&nbsp;<br />&nbsp;&nbsp;&nbsp;movinv1(2,0xaa5555aa,~0xaa5555aa);&nbsp;<br />&nbsp;&nbsp;&nbsp;printf(&quot;memtest&nbsp;done
&quot;);&nbsp;<br />#endif&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;/*&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Launch!&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;*/&nbsp;<br />&nbsp;&nbsp;&nbsp;main();&nbsp;<br />上面就进入命令交换阶段。&nbsp;<br /><br />}&nbsp;<br />/*蔡军生&nbsp;2007-1-5&nbsp;于深圳*/&nbsp;<br />看C的代码,就是比看汇编简单多了,到这里,就已经看完了整个流程了。不过,在那些调用的函数里,还是实现非常复杂的功能的。比如显示卡,就是最复杂的部份,由于它的BIOS代码是为X86的CPU执行的,不能直接在龙芯2E里运行,这样就变得非常复杂了,因此龙芯2E里就要实现一个模拟X86的CPU功能才能运行显示卡的BIOS程序。不知道那天有了我们自己的显示卡厂商,才可能开发适用龙芯2E的显示卡BIOS,这样才会变得非常简单了。&nbsp;<br /><br /><br />
NE5532 发表于 2007-1-10 09:20 | 显示全部楼层

呵呵,真的是屠龙术啊

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

本版积分规则

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

1

主题

1

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部