S3C6410移植日志之二
0赞
上篇说道,用16M的SD卡启动可以,但用2G的卡却不行,反复试过,实在不知道怎么回事,也没有IROM中的加载程序的进一步资料,问题也就无从查起了,暂且先放一边,把后续的移植工作做完再说吧。
移植操作系统,跟开发裸奔程序是不一样的,裸奔程序可以从main开始写程序,在执行main之前,编译器产生了大量的代码用于初始化cpu、内存清零、初始化堆和栈、直到建立main的执行环境。而操作系统往往有自己的运行环境要求,C编译器完成的这些环境往往不能符合要求,需要自己写初始化文件,即initcpu.s文件。
初始化文件主要完成以下工作:
1、从复位地址跳转到启动地址。
2、设置cpu为特权模式,禁止看门狗和中断,禁止cache。
3、设置时钟,有些cpu的时钟设置很复杂的,尤其是高速cpu,因为涉及到内核和外设匹配的问题,设置起来比较麻烦。
4、设置内存总线,设置内存访问速度,要跟上一步的时钟设计配合,使cpu能正确读写内存和内存映射的外设。
5、配置cache和mmu,然后使能cache和mmu。
6、初始化栈,跳转到C代码。
根据拿来主义的原则,写cpu初始化代码千万不能自己从0开始写,而是要找一个现成的来参考,因为各个系统的cpu初始化工作是大同小异的。而且,许多cpu厂商都会出example,会带一个文件名类似startup.s的文件,参考该文件来写即可。但是,三星不知从何年何月开始不公开其cpu的文档了,甚至连datasheet都要申请才给。当我千辛万苦找到三星提供的“6410_Test_Rev01”源代码包时,心都凉了,该代码包中虽然有start.s文件,但文件中只有几条指令,初始化过程都在"__rt_entry“函数中,而该函数在库中。对芯片应用资料的保密工作做得如此周密,不知三星所谋何事。
没办法,继续找,实在不行再自己一行行写。好在天无绝人之路,终于在友坚提供的wince的eboot代码中,找到了eboot的start.s文件,打开一看,果然是一个详细的启动文件,心中不禁狂喜!
接下来的工作,就是对照datasheet,看懂这个start.s,然后改造成适合djyos的。别看说的轻巧,这里面工作量还是很大的,6410的datasheet有1300多页,光时钟和总线配置相关的部分就有100多页,E文的,晕死。而且第一次用arm11,其mmu和cache配置和arm9有多大差别,还不可知。今天先写到这里,下回分解吧。
