DJYOS

移植djyos到mini2440的过程分享

0
阅读(5837)

本来想先把djyos移植到lpc上的,应广大网友的要求,还是先移植到mini2440上,为此,买了一块mini2440板。从2410到2440,本应很简单很快,但由于情敌麻痹,还是费了不少周章,写出来,大家共勉之,技术是实实在在的,再简单的东西,也切不可大意,否则你会受到惩罚的。

收到板子已经两天了,很小巧的一个板子,但麻雀虽小五脏俱全,还带一个3.5寸的真彩屏,才500多,超值啊。我一直做工业产品,成本控制方面不在行,真佩服友善之臂的成本控制。美中不足的是,该板子太紧凑了,但液晶屏架在元件面的上面,导致按钮、跳线等都无法操作,更甭说用示波器、万用表测量器件上的信号了。嘻嘻,俺做硬件,比较关注这个。想把液晶换到焊接面安装,但元件面紧凑的连拧螺丝的位置都没有。
因为已经有了2410版,而2410和2440又极为相似,移植还不是小菜一碟,情敌麻痹的思想就这样蔓延开来了。把initcpu.s文件中跟时钟相关的寄存器一改,就想看看能不能转起来,一边哼着小调,一边轻快地连号先,ok,上电,运行JflashARM,打开run_inram.bin,点F7开始烧录,本以为能看到那个熟悉的进度条,但实际得到的是:找不到flash芯片。难道配置错了,仔细检查,再对照友善的原理图,拆下液晶核对芯片型号,修改配置后,还是不对。最后才发现,是选择nandflash启动还是norflash启动的开关被拨到了nand一边,怪不得不能烧写norflash了。把开关拨到norflash一边后,再试,只见进程条欢快地闪了几下,完成了。
flash烧录成功了,总该可以看到运行结果了吧,事实证明,我这种想法是相当的愚蠢的。连上超级终端后,上电,看,屏幕纹丝不动,我一下子就蔫了。赶紧烧录boot_rom.bin,连接仿真器,加载debug.elf,先run一下,停下来一看,程序没停在djy_service函数:
void __djy_service(struct event_script. *my_event)
{
while(1);
}
的while(1);处,而是在0x00000028处,即发生了取址异常。然后单步调试,发现程序总是很神经,执行结果经常是毫无道理的,也时不时会发生异常,未定义指令、取址、数据异常均可能发生,傻了!
汇编级单步调试之,发现经常有一些指令的执行结果是不对的,比如一条
mov r1,r2指令,执行完后发现r1不变倒是SP变了,这样程序不乱飞才怪呢?
为什么呢?难道用仿真器看到的内容和CPU执行时取址得到的内容不一致吗?灵感闪现了,思路进行到这里,问题已经解决大半了,仿真器可能是通过jtag口直接访问内存,而cpu可能是通过完整的总线控制器访问内存,读到的内容可能真的不一样。这时才想起,改initcpu.s时,只修改了时钟控制寄存器,没有修改总线控制寄存器,2440的速度比2410高,总线速度可能跟不上。找到问题了就好,赶紧按友善提供的example中的配置,把总线配置改了过来。再试,好了,程序终于停在while(1)上了,小小地开心了一把,但超级终端还是没有输出。这个问题,现在说来像侃故事,其实在程序乱飞毫无头绪的时候,瞧自己抓耳挠腮那个猴样,很痛苦的,也花了很多时间,正印证了一句古话:心急是吃不着热粥的!
仔细对比2410和2440的uart功能和寄存器配置,发现其除了fifo深度以外,都是相同的,2410的fifo是16字节,而2440则扩充到64字节,体现在寄存器上,就是fifo状态寄存器UFSTAT中控制位的定义不同。按2440的UFSTAT修改代码后,这下总应该可以了吧!遗憾的是,超级终端还是没有响应,还得单步调试,把断点放在直接往fifo写数据的地方,发现程序确实正常发送数据,就是接收不到,先怀疑时钟配合问题,看是不是baud不对,也找不出纰漏。有了前面的经验,这次不慌了,仔细看mini2440板子的说明,终于发现了问题所在:原来mini2440的串口与计算机相连要用直连线!而我由于懒得拔原来的串口线,就用了原来交叉线了。
把线一换,再run,终于,超级终端有了反应,看到久违的“欢迎使用都江堰操作系统”了。
接下来的闪灯,nandflash、键盘驱动都比较顺利,按数据手册修改了代码就行,没废太多周折。