您的位置:首页 > 其它

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

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