x210:ARM裸机全集

注:本文是对朱老师ARM裸机全集课程的备忘引导性笔记,主要是为了能够在学完后快速回忆起相关内容。本文主要记录了一些关键易忘性知识点并包含少量理解性内容,遵循尽量精简的原则,以尽量少的篇幅概括整个课程的知识点,便于后期能够快速定位知识点。故本文不包含具体的命令及函数使用方法等,同时不要太纠结于字面表达,这些只是为了能够快速回忆起相关知识点,具体的准确描述以及用法等需参考具体的文章。

(未完待续)

ARM那些你得知道的事儿

ARM版本

1991年,ARM推出第一款嵌入式RISC处理器,即ARM6

1993年,发布ARM7

1997年,发布ARM9TDMI

1999年,发布ARM9E

2001年,发布ARMv6架构

2002年,发布ARM11微架构

2004年,发布ARMv7架构的Cortex系列处理器,同时推出Cortex-M3

2005年,发布Cortex-A8处理器

2007年,发布Cortex-M1和Cortex-A9

2009年,实现Cortex-A9、发布Cortex-M0

2010年,推出Cortex-M4、成立Linaro,推出Cortex-A15 MPcore高性能处理器

2011年,推出Cortex-A7,ARMv8发布

2012年,开始64位处理器进程

 

ARM7       44B0

ARM9  2440  2410   2416

ARM11  6410

A8  S5PV210  S5PC100

A9  4412  4418

ARM内核版本号  ARMv7 

ARM SoC版本号  Cortex-A8

芯片型号  S5PV210

二级流水线

执行-解码-取值(PC) 

寄存器(待完善) 

ARM汇编中LR(R14)寄存器的作用

lr(r14)的作用问题,这个lr一般来说有两个作用:
1.当使用bl或者blx跳转到子过程的时候,r14保存了返回地址,可以在调用过程结尾恢复。
2.异常中断发生时,这个异常模式特定的物理R14被设置成该异常模式将要返回的地址。
另外注意pc,在调试的时候显示的是当前指令地址,而用mov lr,pc的时候lr保存的是此指令向后数两条指令的地址,大家可以试一下用mov pc,pc,结果得到的是跳转两条指令,这个原因是由于arm的流水线造成的,预取两条指令的结果.

三星定义的BL2和我们使用时不同的问题

ARM版本系列及家族成员梳理 

 ARM体系结构与汇编指令

 

可见这96KB大小的内部SRAM空间并不是全部都可以供用户随意使用的,除了16字节的头信息外,External Copy Function(用来从外部设备拷贝数据的函数指针)、Signature、Global Variable、Exception Vector Table(异常向量表)都是预先被占用了的。(具体细节待确认)

分析启动过程可知;210启动后先执行内部iROM中的BL0,BL0执行完后会根据OMpin的配置选择一个外部设备来启动(有很多,我们实际使用的有2个:usb启动和SD卡启动)。在usb启动时内部BL0读取到BL1后不做校验,直接从BL1的实质内部0xd0020010开始执行,因此usb启动的景象led.bin不需要头信息,因此我们从usb启动时直接将镜像下载到0xd0020010去执行即可,不管头信息了;从SD启动时,BL0会首先读取sd卡得到完整的镜像(完整指的是led.bin和16字节的头),然后BL0会自己根据你的实际镜像(指led.bin)来计算一个校验和checksum,然后和你完整镜像的头部中的checksum来比对。如果对应则执行BL1,如果不对应则启动失败(会转入执行2st启动,即SD2启动。如果这里已经是2st启动了,这里校验通不过就死定了)。

BL1是可变大小的,它的大小就是头信息中的BL1 size所指示的大小

可见从SD卡/iNAND启动时需要校验头部的16字节的头信息,而从USB启动时不需要校验16字节头信息

思考:启动时之所以要知道我们的启动介质类型,是因为iROM中需要根据所选择的启动介质调用不同的Device Copy Function函数,以从外部存储设备中得到BLE部分,可见同一种存储设备他们的对外接口是差不多的;这里需要BL1或者BL2来负责初始化DDR的原因就是没法做到一套代码初始化所有类型的DDR,所以需要我们自己根据DDR类型进行初始化。

iROM_Application_Note这份文档中有一些地方容易引起误会

(1)其中有下面一段话

As BL1 doesn’t need header information through UART/USB boot mode, BL1’s code base address is
0xd002_0000. In other cases except UART/USB boot mode, BL1 should have header information and It’s code
base address is 0xd0020010. (refer chapter 2.9)

由于BL1通过UART/USB引导模式不需要头信息,所以BL1的代码基地址为

0 xd002_0000。在其他情况下,除了UART/USB启动模式,BL1应该有头信息和它的代码

基址是0xd0020010。(参见章节2.9)

并配有下面这张图

我的理解是代码本身前面加16字节空位的话这里的地址应该是x0d0020000,但不加的话这里的地址应该是0xd0020010,应跳过前16字节的头信息。

开发板、原理图和数据手册

开发板配置信息

CPU:三星S5PV210

内存:512M DDR2 SDRAM

Flash:4GB iNand

LCD:7寸 分辨率1024*600

触摸屏:电容触摸屏

软开关按键

开发板板载了一个稳压器件MP1482,MP1482芯片有一个EN(Enable)引脚,这个引脚可以让稳压芯片输出或关闭输出。EN为高电平时有输出电压,EN引脚为低电平时稳压芯片无输出。

两个因素可以影响EN引脚的电平:第一个是POWER按键(SW1),POWER按键按下时EN为高电平,POWER按键弹起时EN为低电平;第二个是POWER_LOCK(EINT0)引脚,这个引脚为POWER_LOCK模式下高电平,则EN为高;若这个引脚为EINT0模式或者为POWER_LOCK模式但输出为低电平,则EN为低。 

图中还有EINT1引脚,这个引脚的作用是用来做中断,提供给CPU用来唤醒的。

开发板供电置锁原理和分析
(1)软开关在设计时有一个置锁电路,用EINT0(也就是GPH0_2)引脚来控制的。
(2)EINT0这个引脚是有复用设计(两个完全不相干的功能挤在同一个引脚上,同时我们只能让这个引脚用于其中一种功能,这就叫复用)的,一个是GPIO(也就是GPH0_2引脚)、一个是PS_HOLD_CONTROL。(注意:EINT0功能算是GPIO下的一个子功能)
(3)PS_HOLD在Section2.4 Power Management章节下的4.10.5.8节下。
(4)PS_HOLD_CONTROL寄存器(0xE010E81C),共有3个位有用。
    bit0, 0表示这个引脚为GPIO功能,1表示这个引脚为PS_HOLD功能
    bit9,0表示这个引脚方向为输入,1表示这个引脚方向为输出
    bit8,0表示这个引脚输出为低电平,1表示输出为高电平。
分析:我们要使用软启动置锁,则需要将bit0、8、9都置为1即可。

    // 第0步:开发板置锁
    // 写法1
    //ldr r0, =0xE010E81C
    //ldr r1, =0x301
    //str r1, [r0]
    // 写法2
    //ldr r0, =0xE010E81C
    //ldr r1, [r0]
    //orr r1, r1, #0x300
    //orr r1, r1, #0x01
    //str r1, [r0]
    // 写法3
    ldr r0, =0xE010E81C
    ldr r1, [r0]
    ldr r2, =0x301
    orr r1, r1, r2
    str r1, [r0]

PS_HOLD和普通GPIO有什么差别目前不知道

SD卡刷机

(1)设置拨码开关使开发版从SD/iNAND启动

(2)破坏iNand中的bootloader以从SD2启动。

  • Android平台

    (1)busybox dd if=/dev/zero of=/dev/block/mmcblk0 bs=512 seek=1 count=1 conv=sync
             解释:将if所代表的文件(全0设备)拷贝到of所代表的文件(iNand设备文件)中,bs设置读写块的大小为512bytes,seek从输出文件开头跳过1个块后再开始复制(原因见下图),count仅拷贝1个块
             
    (2)sync

  • Linux平台

        (1)busybox dd if=/dev/zero of=/dev/mmcblk0 bs=512 seek=1 count=1 conv=sync
        (2)sync

  • bootloader下

        (1)mw 0x30000000 0x0 0x100000
                 解释:将数据写入0x30000000,数据内容为长度0x100000大小的0x0数据
        (2)movi write u-boot 0x30000000
                 解释:把0x30000000起始的位置处(DDR)的数据写入到iNand中的u-boot(这里的u-boot只是用来匹配的,不是分区)对应的地址(这里对BL1和BL2都进行了写入操作)

      破坏成功后再次开机串口会显示SD checksum Error

(3)制作启动SD卡(其实就是烧录uboot到SD卡中)

  • windows平台

      使用A盘\tools\x210_Fusing_Tool.rar解压后的x210_Fusing_Tool.exe

  • linux平台

      这里使用了一个三星提供的脚本来进行SD卡的烧录,该脚本在uboot源码的sd_fusing目录下,使用时要进行少许修改。(如何解读并修改待补充) 

     (1)将sd卡通过读卡器插入电脑(笔记本上自带的SD卡卡槽好像在vmware中识别不到)并连接到虚拟机ubuntu中,可通过ls /dev/sd*来对比查看是否正确接入了SD卡

     (2)如果SD卡设备被识别为sdb,在脚本所在目录下执行./xxx.sh /dev/sdb

     (3)最好在使用该脚本前进去查看一下一些配置参数是否正确,另外最好先make clean一下重新make再烧录

(4)fastboot

      在uboot和windows下有各自的fastboot

  • uboot

      (1)fastboot是uboot中用来快速下载镜像并写入到存储设备(我们的uboot中是iNand)的一个命令

      (2)有时需要先执行fdisk -c 0进行分区(0表示外部对iNand进行分区,1表示对SD卡进行分区,参考:x210&

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值