Blob在S3C44B0上的移植
在我们使用的开发板上,kernel选用uClinux。由于Flash的存储空间有限,所以存放在Flash中的uClinux内核是经过压缩的。Blob将压缩的uClinux内核加载到SDRAM地址0x0C300000。如果选择启动uClinux,那么压缩的uClinux内核将自解压.Text段到0x0c00800(见uClinux/arch/armnommu/Makefile),然后再跳转到核处,开始运行uClinux。具体的uClinux移植
在此就不详细讨论了。
在SDRAM的存储器空间分配图中,可以看到有blob_base和blob_abs_base两部分。blob_abs_base大家已经知道了,是Blob将自身的第二阶段代码复制到SDRAM所在的区域,而blob_base则是从Blob进行自升级或调试的区域。举例说明,假如Blob已经能正常运行了,但是对于Flash的擦写还不能支持得很好,就可以使用已经运行的Blob通过串口将所新编译好的Blob下载到SDRAM中该区域进行运行调试。调试通过后,可以通过Blob烧写进Flash,覆盖原来的Blob进行升级。这样就不必因为对Blob做了一点小的改动就重新烧写Flash,从而减少了烧写Flash的次数。
3 Blob的移植
对Blob的运行有了一定了解后,就可以进行Blob的具体移植了。首先要修改的start.s文件,具体工作如下:
*屏蔽掉看门狗WTCON;
*配置寄存器SYSCFG暂时关闭缓存,等Blob运行稳定后再开启提高性能;
*初始化I/O寄存器;
*屏蔽中断;
*配置PLLCON寄存器,决定系统的主频;
*调用ledasm.s,在串口未初始化时led状态对于程序是否正常运行很重要;
*调用memsetup-s3c44b0.s中的memsetup进行初始化存储器空间,初始化SDRAM刷新速率等;
*将第二阶段复制到SDRAM,并且跳转到第二阶段。
在ledasm.s中,提供了led的汇编的语言驱动程序。在Blob还有个led.c文件,它和ledasm.s原理一样,只不过是在C语言中调用的。修改led是为了方便初期阶段的调试。在这里根据自己的开发板进行修改。
在memsetup-s3c44b0.s中,修改MEMORY_CONFIG中设置存储器相关的配置,并设定SDRAM刷新速度,相关源码如下所示:
MEMORY_CONFIG:
.long 0x11101002 /*进行存储器的配置,SDRAM刷新速度配置等*/
… /*这里需要根据不同情况进行修改*/
.long 0x20
.globl memsetup /*定义全局标号,以便能被start.s调用*/
memsetup:
ldr r0,=MEMORY_CONFIG /*进行配置*/
ldmia r0,{r1-r13}
ldr r0,=0x01c80000
stmia r0,{r1-r13}
《Blob在S3C44B0上的移植(第2页)》