移植djyos到S3C44B0

移植其实能学到很多东西,特别是移植那些跟自己实际情况相近其实又有区别的情况。我就从移植djyos到s3c44b0学到了以前没读懂的东西。闲话不多说,还是进入正题吧。

首先得去www.djyos.com官方网站下载v0.3 for 44b0版的代码,现在还只有两个版本提供,还有一个就是2410的。说实话,既然已经说了是44B0版的,其实关于CPU的方面也就没什么可以移植的了,如果你幸运跟作者的板子(深圳远峰)有一样的配置,恭喜你,作者已经提供了移植好的release_ram.bin(程序在ram中运行行),release_flash.bin(程序在flash中运行),还附有原理图。如果不一样的话,嘿嘿,你就有必要读我下面的文章了。

一开始,我就是被以前学arm的习惯的冲昏了头脑,“拿来主义”,脑子中没有想过硬件会有什么不同,因为我接触到过的很多44B0版本都是用了网上同一张原理图,当然出来的配置也就不会不一样了。结果可想而知,djyos在我板子上根本不能运行。然后就当然得调试了,以前一直用ads,习惯了全自动写makefile的流程,这次djyos支持gcc编程,需要用winarm编译,然后用realview debug来调试,当然编译的makefile作者已经写好,只要自己改下就行了(实践证明不改也可以)。

winarm下载地址:

http://www.siwawi.arubi.uni-kl.de/avr_projects/arm_projects/#winarm

realview就得好好找找了,网上我是找不到,最后还是请田园兄传给我的。

粗略看了下源代码,发现关于cpu方面的确实跟以前44BINIT.S中配置的差不多,只是作者有了不少更新。以前我只知道bootloader就是引导系统到ram中运行,看了djyos的init配置,我才正真知道了什么叫做bootloader。

 

下面就开始修改代码吧

如果总线bank配置不一样或者晶振频率不一样的话,那就要修改initcpu.s中的相关代码:kernel/Rominit/initcpu.s

.equ   M_DIV,  72  /* Fin=10MHz Fout=40MHz */
.equ   P_DIV,  3
.equ   S_DIV,  2
@.equ   M_DIV,  120  /* Fin=10MHZ Fout=64MHZ */
@.equ   P_DIV,  8
@.equ   S_DIV,  1
@.equ   M_DIV,  56  /* Fin=8MHz Fout=64MHz */
@.equ   P_DIV,  2
@.equ   S_DIV,  1

我自己晶振是10M的,所以可以选1,2两种,我就选了第1种40M主频(因为我以前用的就是这个配置,没错误就不想改了),后来经田园证明64M那个也是可以同样运行的。

@#bank0  16bit BOOT ROM
@#bank1  8bit NandFlash
@#bank2  16bit IDE
@#bank3  8bit UDB
@#bank4  rtl8019
@#bank5  ext
@#bank6  16bit SDRAM
@#bank7  16bit SDRAM
    .long 0x11110090   @.long 0x11444440

根据自己原来的资料我改成了 .long 0x11110090,就是用来配置总线寄存器的,具体根据自己板子的44BINIT改。

这里已经没什么要改的了,唯一还有一处等会要调试的时候再拿来改。

 

还有当然就是baud的不同了,作者用的是57600的,我自己的是115200,所以串串口输出会有问题,那就得改Module/uart/uart.c文件了,在module_init_uart0和module_init_uart1函数中将baud=57600改成115200,还有就是一个计算UBRDIV的那个公式也是改成这样。

tg_uart0_CB.my_reg->UBRDIV = ((cn_mclk<<2)/115200-32)>>6;
tg_uart0_CB.baud = 115200;

作者这里的UBRDIV计算跟44B0数据手册上的不一样,据说是这样更精确点,姑且信他吧!

还有就是io口的配置了,这个应该相当简单了。就是根据自己板子的portinit那个函数来配置就行了,也可以参考44b0数据手册,这个就不说了。强调下,作者板子的io口跟一般的44b0板子有点小的区别的,后面就会知道。

 

其实写到这里如果硬件基本一样的话就不会有问题了,应该能够顺利运行了。但是我还是出现了很多问题。那几天真是要抓狂了,不断有问题出现。不错从这个调试的过程,上面说了我了解了什么叫bootloader,djyos是要先将initcpu文件生成bios.bin也就是传说中的boot,make bios的时候一定要

 b         .                  

@    bl      load_preload

注释掉下面的 bl      load_preload ,因为 bl      load_preload 是实现loader的功能的,就是copy数据到ram中运行,可以在 load_preload 函数中看到这一功能。

然后在make debug_ram的时候再

@b         .                   

bl      load_preload

当然,首先的将bios.bin下载到板子0x0位置进行上电boot,然后在用realview运行debug_ram.elf进行调试。

 

由于调试中出现了不少问题,所以我将中断配置,改成了自己原来的,比如__int_init_hard函数中的pg_int_reg->INTCON = 0x1;(我把它改成了0x5,变成了NON-VECTORED中断了,实践证明这是导致我中断一直跳转不了的原因)。

 

写了这么多,卖关子总算卖到了最后。其实我改了这么多调试了这么多,都是我自己给自己制造了很多麻烦。其实最我板子不能运行最主要的原因就是我的板子没有nand flash,只有nor flash,也就运行不了djyos高级的文件系统,所以必须得把kernel/preload/load_sys.c文件中的初始化外围硬件的函数改成这样

void os_ext_module_init(void)
{
    module_init_keyboard();
    module_init_uart0();
    module_init_uart1();
    //module_init_djyfs(); 不用文件系统
    //module_init_DFFSD();不用nand flash
    //module_init_fs_samsung_flash();
}

当初我只要改了这个,然后再将baud和主频、晶振改了就可以运行了,我却制造了这么多麻烦。

前面说了io口跟我的不一样,就是最后启动运行flash led的时候是beep在叫,不是led,所以要垓下flash_led这个函数了。还有,作者使用的是uart1,根据自己情况选择串口吧。

 

 

呵呵,现在我是挺开心的,第一个吃螃蟹的总是痛苦的(第一个写出来的)。我不希望刚玩djyos的朋友就看我这个文章,还是希望大家先自己移植看看,真的不行了再来看。这样就像我一样能学到很多东西了,哈哈。

 

最后感谢田园一直耐心的指导,在他面前我就是什么也不懂啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值