初步认识IROM和IRAM

S5PV210含有一个内64K的IROM和96K的IRAM,系统启动时主要依靠它们,IROM和IRAM所处的存储空间见下图:

S5PV210有IROM,且只能从IROM启动,不再支持原来的直接从外部介质启动方式。
IROM代码(BL0)运行完毕后,根据OM[5:0]确定外部启动介质(BL1和BL2)完成启动。S5PV210支持的外部启动介质包括:NAND Flash、OneNAND、SD/MMC、eMMC、eSSD、UART/USB。

完整的启动序列
系统刚启动时,会运行IROM中的固化代码,进行一些通用的初始化,具体步骤包括:
第一步 关闭看门狗;
第二步 初始化icache;
第三步 初始化堆栈;
第四步 设置时钟;
第五步 判断启动设备(nand/sd/onenand等),检查校验和,然后从启动设备中拷贝前16K的代码到IRAM的0xD0020000处;
第六步 若是安全模式启动,则进行完整性检查;
第七步 跳转到IRAM的0xD0020010地址上继续运行;

UART /USB启动模式
OM[5:4] = 0b10即可选择UART/USB启动模式此时IROM代码运行完毕后,会先尝试从UART 启动,若失败则会尝试从USB启动。若失败则会根据OM[3:0]选择相应的启动介质再次尝试启动。
UART启动时,必须在S5PV210上电前将串口连接好,上位机使用dnw工具来发送启动代码可执行文件。本教材中使用USB启动方式作为调试,因此不详细探讨UART启动方式。
1、USB启动方式必须借助dnw工具,教材中使用dnw v0.60c。
2、打开dnw软件,将dnw中USB下载地址设置为0xd0020010。
3、复位开发板。
4、若是初次使用则Windows会弹出发现新硬件图标,索引安装开发板dnw USB驱动即可。若已经安装驱动,则dnw会显示USB:OK,表示USB连接已经成功。
5、dnw菜单中USB Port->Transmit,选择编译好的bin文件即可。USB download完成后S5PV210会即刻跳转到0xd0020010处执行。

1、// 关闭看门狗
ldr    r0, =0xE2700000
mov    r1, #0
str    r1, [r0]

2、控制icache
// 打开icache可提高运行速度
#ifdef CONFIG_SYS_ICACHE_OFF
// clear bit 12 (I) I-cache  
    bic     r0, r0, #0x00001000
#else  
// set bit 12 (I) I-cache   
    orr     r0, r0, #0x00001000
#endif
    mcr     p15, 0, r0, c1, c0, 0

3、// 设置栈
栈的整体作用
1) 保存现场;
2) 传递参数:汇编代码调用C函数时,需传递参数;
3) 保存临时变量:包括函数的非静态局部变量以及编译器自动生成的其他临时变量;

4、重定位代码到IRAM+0x4000
重定位:对于程序而言,我们需要理解两个概念,一是程序当前所处的地址,即程序在运行时,所处的当前地址;二是程序的链接地址,即程序运行时应该位于的运行地址。编译程序时,可以指定程序的链接地址。 
对于S5PV210而言,启动时只会从NAND Flash/sd等启动设备中拷贝前16K的代码到IRAM中,那么当我们的程序超过16K怎么办?那就需要我们在前16K的代码中将整个程序完完整整地拷贝到DRAM等其他更大存储空间,然后再跳转到DRAM中继续运行我们的代码,这个拷贝然后跳转的过程就叫重定位。本章中我们主要学习如何重定位,但是并不会涉如何使用到DRAM,而是简单地将代码从IRAM的0xD0020010处拷贝到IRAM的0xD0024000处,然后跳转到0xD0024000处继续运行我们的代码。
链接脚本:链接脚本就是程序链接时的参考文件,其主要目的是描述如何把输入文件中的段(SECTION)映射到输出文件中,并控制输出文件的存储布局。链接脚本的基本命令式SECTIONS命令,一个SECTIONS命令内部包含一个或多个段,段(SECTION)是链接脚本的基本单元,它表示输入文件中的某个段是如何放置的。
链接脚本的标准格式如下: 
SECTIONS 
{
     sections-command
     sections-command 
}
/*link.lds*/
SECTIONS
{
    . = 0xD0024000;
    .text : {
        start.o
        * (.text)
    }    
    .data : {
        * (.data)
    }
    bss_start = .; 
    .bss : {
        * (.bss)
    }
    bss_end  = .;    
}
1) 在链接脚本中,单独的点号(.)代表了当前位置,. = 0xD0024000; 表示程序的链接地址是0xD0024000;
2) link.lds中的.text 、 .data 、 .bss分别是text段、data段、bss段的段名(这些段名并不是固定的,是可以随便起的)。.text段包含的内容是start.o和其余代码中所有的text段;.data段包含的内容是代码中所有的data段;.bss段包含的内容是代码中所有的bss段。
3) bss_start和bss_end保存的是bss段的起始地址和结束地址,在start.S中会被用到。

data、text、bss段:
1) data段:数据段(datasegment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。
2) text段:代码段通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读,某些架构也允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。
3) bss段:指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文BlockStarted by Symbol的简称。当我们的程序有全局变量是,它是放在bss段的,由于全局变量默认初始值都是0,所有我们需要手动清bss段。
/*start.S*/
.global _start
_start:  
    // 关闭看门狗   
    ldr    r0, =0xE2700000               
    mov    r1, #0   
    str    r1, [r0]   
    // 设置栈,以便调用c函数   
    ldr    sp, =0xD0037D80    
    // 重定位                            
    // _start当前所位于的地址:0xd0022000   
    adr r0, _start             
    // _start的链接地址:0xd0024000  
    ldr r1, =_start       
    // bss段的起始地址  
    ldr r2, =bss_start   
    cmp r0, r1
    beq clean_bss
copy_loop:   
    ldr r3, [r0], #4    // 源   
    str r3, [r1], #4    // 目的   
    cmp r1, r2   
    bne copy_loop   
// 清bss段
clean_bss:    
    ldr r0, =bss_start                       
    ldr r1, =bss_end   
    cmp r0, r1   
    beq run_on_dram   
    mov r2, #0
    clear_loop:   
    str r2, [r0], #4   
    cmp r0, r1   
    bne clear_loop  
// 跳转
run_on_dram:                
    ldr pc, =main

/*main.c*/
#define     GPJ2CON     (*(volatile unsigned long *) 0xE0200280)
#define     GPJ2DAT        (*(volatile unsigned long *) 0xE0200284)
// 延时函数
void delay(unsigned long count)
{
    volatile unsigned long i = count;
    while (i--);        
}
void main()                
//LED 闪烁
{
    GPJ2CON = 0x00001111;
    // 配置引脚
    while(1)                    
    // 闪烁
    {
        GPJ2DAT = 0;
        // LED on
        delay(0x100000);
        GPJ2DAT = 0xf;
        // LED off
        delay(0x100000);
    }
}

5、重定位代码到DRAM
DRAM0对应的地址是0x2000_0000~0x3FFF_FFF共512M,DRAM1对应的地址是0x4000_000~0x7FFF_FFFF共1G。

代码下载链接:http://download.csdn.net/detail/klcf0220/5508253

S5PV210的启动过程相关推荐

  1. ARM S5PV210的启动过程

    一.内存 SRAM 静态内存 特点就是容量小.价格高,优点是不需要软件初始化直接上电就能用. DRAM 动态内存 特点就是容量大.价格低,缺点就是上电后不能直接使用,需要软件初始化后才可以使用. 单片 ...

  2. S5PV210的启动过程:三星推荐的启动方式和uboot的实现方式不同

    三星推荐的启动方式中: (1)bootloader必须小于96KB并大于16KB,假定bootloader为80KB: (2)开机上电后BL0运行,BL0会加载外部启动设备中的bootloader的前 ...

  3. 朱老师ARM裸机学习笔记(四):S5PV210启动过程详解

    常用器件特性 内存: SRAM 静态内存 特点就是容量小.价格高,优点是不需要软件初始化直接上电就能用 DRAM 动态内存 特点就是容量大.价格低,缺点就是上电后不能直接使用,需要软件初始化后才可以使 ...

  4. S5PV210开发 -- 启动流程

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78433564 讲完启动模式.烧写更新,接下来我们看一下启动流程. 参看:S5 ...

  5. TQ210——S5PV210启动过程

    TQ210--S5PV210启动过程 1.S5PV210内存地址映射 S5PV210 含有一个大小为64KB的IROM,起始地址为0xD0000000,结束地址为0xD000FFFF:含有一个大小为9 ...

  6. S5PV210启动过程

    常用器件特性 内存: SRAM 静态内存 特点就是容量小.价格高,优点是不需要软件初始化直接上电就能用 DRAM 动态内存 特点就是容量大.价格低,缺点就是上电后不能直接使用,需要软件初始化后才可以使 ...

  7. S5PV210启动过程详解

    一.S5PV210启动分几步折腾目的: 1.为了产品选择上省钱. 2.为了支持多种外部设备启动,灵活性设计. 所以要想明白启动过程先得了解这些器件的特性(如存储器有的可以作为启动介质,有的就不行) 二 ...

  8. S5PV210之UBOOT-2011.06启动过程解析-基于u-boot for tiny210 ver3.1 (by liukun321咕唧咕唧)

    //主题:S5PV210之UBOOT-2011.06启动过程解析 //作者:kevinjz2010@gmail.com //版权:kevinjz原创 //平台:S5PV210 ARMV7 TINY21 ...

  9. u-boot2013.01.01 for s5pv210: u-boot启动流程

    转载请注明地址:http://blog.csdn.net/zsy2020314/article/details/9824035 1.关于启动流程 1.1 启动阶段分为3个,bl0,bl1,bl2.下面 ...

最新文章

  1. 654. Maximum Binary Tree最大二叉树
  2. 攻击NLP模型:通用对抗触发器入门
  3. 较高人工智能的人机博弈程序实现(多个算法结合)含C++源码
  4. EntLib.com Forum/YAF 开源论坛系统!可免费下载!
  5. 网络营销常用工具与资源
  6. kettle 内存设置_Kettle性能调优汇总
  7. U盘安装Ubuntu14.04 server版 提示无法挂载cd-rom数据的解决办法
  8. 快捷操作之争【原创】
  9. Windows Mina 2.0.7 环境搭建
  10. 中琛源携手台江县积极践行山区青少年体育公益
  11. ES6学习之Promise
  12. 乘法逆元(ex_gcd和同余定理)
  13. 【生信进阶练习1000days】day9-BSgenome和AnnotationHub
  14. 深圳javascript培训:名师精品文章--JS有哪些变态语法系列
  15. 学习matlab(十七)——信号处理
  16. 侧边悬浮在线客服咨询按钮-在线客服按钮代码实现
  17. DDD领域建模基本流程
  18. Vcc(电源)和GND(地)之间接电容的作用
  19. XSS跨站脚本攻击详解以及复现gallerycms字符长度限制短域名绕过
  20. 【技术推荐】正向角度看Go逆向

热门文章

  1. android虚拟机加载机制,Android虚拟机与类加载机制
  2. mpc 安全多方计算协议_BNC公链 | 不看到数据却能进行计算?一文了解安全多方计算...
  3. R语言多层桑基图_桑基图的绘制核心微生物组分类学及丰度展示
  4. linux中original_如何在 Linux 中整理磁盘碎片
  5. pyqt 把控制台信息显示到_内网渗透初识—信息收集
  6. python 英语分词_Python英文文本分词(无空格)模块wordninja的使用实例
  7. mac地址扫描源码_iNet Network Scanner扫描网络,及时反馈WiFi信号强度!
  8. 深入理解javascript原型和闭包(3)——prototype原型
  9. launch mysql_Mac Pro 开机自启动 PHP-FPM,Nginx,MySql 等软件
  10. mysql 工具_最全Mysql运维工具Percona Toolkit使用案例