博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
S3C2440—9.复制程序到SDRAM中执行
阅读量:3951 次
发布时间:2019-05-24

本文共 3192 字,大约阅读时间需要 10 分钟。

文章目录

一.S3C2440的启动方式

S3C2440的MMU有一种“steppingstone”.技术,是协助MCU从无法执行程序的NAND FLASH执行启动程序的一种方法,其启动步骤如下:

  • 1、系统上电后,首先自动判断是否是autoboot模式,如果使用 s3c2440是带有nandflash的,并且被设置成autoboot,从nandflash开始启动.
  • 2、在判断是autoboot模式后,mcu内置的nandflash控制器自动将nandflash的最前面的4k区域(这4k区域存放着 bootloader的最前面4k代码)拷贝到samsung所谓的"steppingstone"里面(steppingstone是在S3C2440 中,实际上是一块4k大小的SRAM,).
  • 3、在拷贝完前4k代码后,nandflash控制器自动将"steppingstone"映射到arm地址空间0x00000000开始的前4k区域.
  • 4、在映射过程完成后.nandflash控制器将pc指针直接指向arm地址空间的0x00000000位置,准备开始执行"steppingstone"上的代码.
  • 5、而"steppingstone"上从nandflash拷贝过来的4k代码,是程序员写的bootloader的前4k代码.这个 bootloader在之前写好,并已经被烧写到nandflash的0x00000000开始的最前面区域…而这"steppingstone"上的 4k代码就是bootloader的前4k代码.
  • 6、在pc指向arm地址空间的0x00000000后,系统就开始执行指令代码.这4k代码的任务是:初始化硬件,设置中断向量表,设置堆栈,然后一个很重要的任务是,将nandflash的最前面区域的bootloader(包含4k启动代码)拷贝到SDRAM中去,bootloader代码的大小是写好bootloader就确定的.然后只需要确定bootloader想映射到SDRAM的起始位置就ok.
  • 7、在完成对nandflash上的bootloader搬移后,找到4k代码的搬移代码最后一个指令的下一个指令在SDRAM的bootloader的地址,然后跳转到该位置,继续执行bootloader的剩余代码(引导系统).

二.代码

汇编代码:

/* 相当于宏定义,定义存储控制器和SDRAM的基地址 */.equ MEM_CTL_BASE,        0x48000000.equ SDRAM_BASE,          0x30000000.text.global _start_start:    /* 采用调用函数的形式 */        bl watch_dog_close              @关闭看门狗    bl memsetup                     @设置存储控制器的13个寄存器    bl copy_steppingstone_to_sdram  @将Steppingstone的4KB复制到SDRAM    ldr pc, =on_sdram               @当前程序跳转到SDRAM中去执行on_sdram:    ldr sp, =0x34000000             @设置栈    bl main                         @跳转去执行main函数halt_loop:    b halt_loopwatch_dog_close:    /* 关闭看门狗,否则会一直重启,地址0x53000000,[0]位写0关闭 */    ldr r0, =0x53000000    ldr r1, =0    str r1, [r0]    mov pc, lrmemsetup:    /* 存储控制器的寄存器配置,配置存储控制器以使用SDRAM */    mov r1, #MEM_CTL_BASE    adrl r2, mem_cfg_val   @将13个寄存器的值伪读取取到r2中    add  r3, r1, #52     @r3=r1+52  52:13*4(13个4Byte寄存器)1:    ldr r4, [r2], #4     @将r2中的值读取到r4中,然后r2+4    str r4, [r1], #4     @将r4的内容写到r1中存储的地址后,r1中地址+4(初次r1地址为MEM_CTL_BASE)    cmp r1, r3           @比较r1中现在的地址,看看是否完成13个寄存器的相应配置(13*4Byte)    bne 1b               @如果未完成,继续    mov pc, lr           @完成后,返回_start继续执行.align 4mem_cfg_val:    /* 存储控制器的13个寄存器的设置值 */    .long 0x22011110 @BWSCON    .long 0x00000700 @BANKCON0    .long 0x00000700 @BANKCON1    .long 0x00000700 @BANKCON2    .long 0x00000700 @BANKCON3    .long 0x00000700 @BANKCON4    .long 0x00000700 @BANKCON5    .long 0x00018005 @BANKCON6    .long 0x00018005 @BANKCON7    .long 0x008c07a3 @REFRESH    .long 0x000000b1 @BANKSIZE    .long 0x00000030 @MRSRB6    .long 0x00000030 @MRSRB7copy_steppingstone_to_sdram:    /* 将Steppingstone的4KB数据复制到SDRAM中      * Steppingstone的基地址为:0x00000000     * SDRAM的基地址为:0x30000000     */    mov r1, #0           @Steppingstone基地址    ldr r2, =SDRAM_BASE    mov r3, #4*1024     1:    ldr r4, [r1], #4    @从源地址读取4Byte数据    str r4, [r2], #4    @将源地址的4Byte数据写入目标地址    cmp r1,r3           @对比是否复制完毕    bne 1b    mov pc, lr          @完成后,返回_start继续执行

Makefile:

all:	arm-linux-gcc -c -o main.o main.c	arm-linux-gcc -c -o head.o head.S	arm-linux-ld  -Ttext 0x30000000 head.o main.o  -o sdram.elf	arm-linux-objcopy -O binary -S sdram.elf sdram.bin	arm-linux-objdump -D sdram.elf > sdram.disclean:	rm *.o *.elf *.dis

Makefile中:arm-linux-ld -Ttext 0x30000000 head.o main.o -o sdram.elf连接到了SDRAM的基地址0x30000000

转载地址:http://gpwzi.baihongyu.com/

你可能感兴趣的文章
调试代码的宏定义
查看>>
创建、重命名文件
查看>>
文件大小保护
查看>>
删除指定目录下所有文件及目录
查看>>
XDR-从文件空间解码整数
查看>>
XDR-.x文件的简单使用
查看>>
XDR-枚举的试用
查看>>
使用CppSQLite3访问SQLite数据库
查看>>
第一个boost程序---timer的使用
查看>>
使用boost asio库实现字节数可控的CS通信
查看>>
linux下串口编程
查看>>
boot asio 非阻塞同步编程---非阻塞的accept和receive。
查看>>
利用ADOX、ADO操纵MDB文件(ACCESS)
查看>>
使用ADO操作MDB,关注数据类型
查看>>
使用windows自带Zip命令压缩文件
查看>>
windows获得文件大小
查看>>
Host 'ETCV3' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'
查看>>
OCILIB在VS2008中的使用
查看>>
OCILIB VC2008 效率测试
查看>>
PL/SQL设置NUMBER显示为字符串
查看>>