历史上的今天
返回首页

历史上的今天

今天是:2024年09月01日(星期日)

正在发生

2021年09月01日 | S3C2440—9.复制程序到SDRAM中执行

2021-09-01 来源:eefocus

一.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_loop


watch_dog_close:

    /* 关闭看门狗,否则会一直重启,地址0x53000000,[0]位写0关闭 */

    ldr r0, =0x53000000

    ldr r1, =0

    str r1, [r0]

    mov pc, lr


memsetup:

    /* 存储控制器的寄存器配置,配置存储控制器以使用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 4

mem_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 @MRSRB7



copy_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.dis


clean:

rm *.o *.elf *.dis


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

推荐阅读

史海拾趣

AR RF/Microwave Instrumentation公司的发展小趣事

品质是公司发展的生命线。AR RF/Microwave Instrumentation一直注重品质管理,从原材料采购到生产过程的每一个环节都进行严格把控。同时,公司还建立了完善的售后服务体系,确保客户在使用过程中能够得到及时、专业的支持。此外,公司还不断进行持续改进,通过引入新的生产技术和设备,提高生产效率和产品质量。

艾为(AWINIC)公司的发展小趣事

2008年,孙洪军牵头创办了上海艾为电子技术股份有限公司。创立之初,艾为就明确了其使命:专注于混合信号、模拟、射频等IC设计,聚焦在手机、可穿戴、智能硬件、IOT等消费电子领域。公司秉持着“客户需求是艾为存在的唯一理由,高素质的团队是艾为的最大财富”的理念,致力于为消费电子市场提供高性能的集成电路解决方案。

Headland Technology Product Group公司的发展小趣事

近年来,随着环保意识的日益增强,HBControls积极响应国家号召,致力于绿色环保产品的研发和生产。公司投入大量资金引进环保设备和技术,对生产流程进行改造升级,以减少对环境的影响。同时,HBControls还积极推广绿色供应链理念,与供应商共同构建绿色、低碳的供应链体系。这些举措不仅提升了公司的社会形象,也为企业的可持续发展奠定了坚实的基础。

BESTECH公司的发展小趣事

HBControls的创立可以追溯到上世纪90年代初,当时电子工业正处于快速发展阶段。创始人李明(化名)凭借在电子行业多年的工作经验,敏锐地察觉到继电器市场的巨大潜力。然而,初创时期资金短缺、技术瓶颈和市场认可度低成为了摆在他面前的三座大山。李明带领团队夜以继日地研发产品,不断优化性能,同时积极寻找合作伙伴,逐步打开了市场。经过数年的不懈努力,HBControls终于在继电器领域站稳了脚跟。

Analogic Corporation公司的发展小趣事

HBControls的创立可以追溯到上世纪90年代初,当时电子工业正处于快速发展阶段。创始人李明(化名)凭借在电子行业多年的工作经验,敏锐地察觉到继电器市场的巨大潜力。然而,初创时期资金短缺、技术瓶颈和市场认可度低成为了摆在他面前的三座大山。李明带领团队夜以继日地研发产品,不断优化性能,同时积极寻找合作伙伴,逐步打开了市场。经过数年的不懈努力,HBControls终于在继电器领域站稳了脚跟。

AVX公司的发展小趣事

AVX公司的历史可以追溯到XXXX年,当时它由一群热衷于电子技术的工程师创立。在创立初期,AVX主要专注于电容器的研发与生产,凭借其独特的技术和卓越的品质,很快在市场中脱颖而出。随着业务的扩展,AVX逐渐在电感器、电阻器等领域也取得了显著进展,为公司的后续发展奠定了坚实的基础。

问答坊 | AI 解惑

算术运算指令

Arithmetic Operations ABS r3 = abs r1 ; a1 = abs a1, a0=abs a0 ; Add/Subtract r5 = r2 + r1(s) ; r0.l = r2.h + r4.l(ns) ; r1.l = r6-r7(rnd20) ; r1.l = r6-r7(rnd12) ; r0 += 40 ; MAX /MIN r5 = max (r2, r3) ; r5 = min ( ...…

查看全部问答>

FPGA小工具整理——32位小数计数器

32位小数计数器 用于仿真,实现任意分频。…

查看全部问答>

linux hid设备通信,如何实现阻塞接收?

用libusb库搞了一个通信程序,usb_interrupt_read进行接收,但是这个函数是非阻塞的,写死循环太占CPU。 我试了select,监视/dev/bus/usb下设备打开句柄,也试了监视设备的输入端点管道句柄,都不好用。有谁搞过这方面的东西,提提建议。貌似win版 ...…

查看全部问答>

优龙bootloader的一些奇怪得问题

mov        r5, #NFCONF                        ;DsNandFlash         ldr        r0, [r5, #4]     &nb ...…

查看全部问答>

编译错误 command line error D8004 '/I' requires an argument

各位达人, 编译时出现如上错误,究竟怎么回事? 谢谢解答!…

查看全部问答>

俺的TIMER捕获中断咋进不去(1114)

本人也是刚接触1114,编写了段程序可是进入不了中断,特请教各位同道中人。我是想用定时器捕获功能,如能赐教不胜感激。 调试中发现在捕获脚上输入脉冲信号,程序就进入DefualtVectorHandle();函数中。可是关闭了中断注册函数zyIsrSet(NVIC_TIMER32 ...…

查看全部问答>

急,FPGA编程求助

我想编一个数码管动态显示的程序,但是下到板子(epm240t100c5)里一直跑不起来,也不知道是什么问题,求高手指导,谢谢。     module dig_show(clk,rst,csm_1,csm_2,db);input clk;         ...…

查看全部问答>

【MSP430共享】MSP430经典讲解

初学单片机的时候就是看的这个资料  很详细  很适合新手入门让你学习的  但若干配上一个开发板  学习起来效果更好  …

查看全部问答>

易电源试用报告3.2:LMZ12010初试大电流输出:纹波较大,滤波用电感烧毁(芯片外)

从同学那儿弄来的500W 20Ω瓷盘变阻器派上用场了,但是要让LMZ12010输出吓人的10A电流的话,这个电阻值还是有点大,滑动端转到边缘上达到几欧姆,再小就要碰到另一端了。由于时间匆忙,今晚只粗略观察了一下,并没有正式测量数据。使用的最小电阻是 ...…

查看全部问答>

对TI官方MBUS主机端发送电路的疑问

本帖最后由 yushengjiexy 于 2014-10-9 08:29 编辑 芯片IC202是如何检测总线电流变化,从而通过TIP117扩流的?为什么手册上说“The starting point for such regulation is the charged state of the capacitor C202. Voltage changes on the bus ...…

查看全部问答>