目录

拓展阅读


SD

内存(RAM)与外存(ROM)的区别:

RAM:random access memory.随机访问存储器.特点是任意字节读写(随机访问),掉电丢失.

ROM:read only memory.只读存储器.用于存储东西. 用来存储东西,掉电不丢失,不能随机地址访问,只能以块为单位来访问)叫外存.

5类外存:

原理工作方式

典型应用

速度

可靠性

价格

应用方面

电磁

磁存储.物理运动,摩擦,有损耗

磁带,软盘,CD,光盘,机械硬盘

便宜

PC机

flash

闪存设备:利用电学原理来存储,无损耗

nandflash,norflash

SD卡,MMC卡,MicroSD卡,TF卡

inand,movinand,TF卡,ESSD

SSD

SD卡相关分区内容设置

注:

1个block为512个byte.

2048block 为 1M

SD卡存储规则

第一个block(block0) 不能使用.

BL1必须从block1开始写起.长度为16kb(32个block)

BL2,KERNEL长度自己定.

BL1与BL2,BL2与kernel之间最好留有一定的空白区域(隔离安全带).

SD卡相关功能代码

Device Copy Function

iROM中事先内置了一些代码去初始化外部SD卡/NandFlash,并且内置了读取各种SD卡/NandFlash的代码在iROM中。BL0执行时就是通过调用这些device copy function来读取外部SD卡/NandFlash中的BL1的。这些函数代码我们是不知道具体的源码,只知道这些函数的首地址存储在IROM中的特定位置:

IROM里面有一些连续区域,存放着相关Device Copy Function相关类型启动介质函数的首地址.

Device Copy Function使用方法:

由于每种启动介质的函数类型不同,故在使用时候要注意:

1.定义的函数指针类型(输入参数类型及个数,返回值类型)不同.

2.以上图里面存放的仅仅是函数的首地址,类型为uint型,正确的使用方法是先定义一个正确的符合要求的函数指针变量p,

如:

1.*(uint *)0xd0037f98 //按照uint类型读取读取内存地址为0xd0037f98里面的值,.这个值是CopySDMMCtoMem函数代码地址的首地址

2.定义一个函数指针类型pF,其类型是CopySDMMCtoMem函数类型.用以指向CopySDMMCtoMem函数.

3.定义一个函数指针变量p1,并指向CopySDMMCtoMem函数

pF p1=(pF)( *(uint*)0xd0037f98) 将内存里面的值强制转化为pF型

4.调用p1

*p1;或p1;

宏定义方法:

#define CopySDMMCtoMem(z,a,b,c,e)(((bool(*)(int, unsigned int, unsigned short, unsigned int*,bool))(*((unsigned int *)0xD0037F98)))(z,a,b,c,e))

函数指针调用方法:

( ( bool(*)(int, unsigned int, unsigned short, unsigned int*, bool))(*((unsigned int *)0xD0037F98)) )

makefile  调用子文件夹下的makefile

第一种方式:

cd lib; make; cd...

进入lib文件夹,执行make命令,再cd出来.

第二种方式:

make –C ./BL1 :表示进入到BL1文件夹里执行里面的makefile命令

make clean –C ./BL2 :表示进入到BL2文件夹里执行里面的make clean命令

ubuntu在目标文件夹中中输入 write2sd命令,执行write2sd这个脚本.

write2sd脚本内容:

#!/bin/sh

sudo dd iflag=dsync oflag=dsync if=./BL1/BL1.bin of=/dev/sdb seek=1

sudo dd iflag=dsync oflag=dsync if=./BL2/BL2.bin of=/dev/sdb seek=45

烧录SD卡命令

dd:linux烧录,读写磁盘命令

if:in file

of:out file

seek:第几个扇区开始.

以上语句表明要烧录2次.

SD卡在ubuntu中烧录的方法:

SD卡通过读卡器连接到PC上,此时进入ubuntu,

点击”断开连接”.如果可移动设备中没有SD卡出现,则需要在XP中开启VMware USB Arbitration Service服务.

XP中开启VMware USB Arbitration Service服务

注:如果ubuntu中没有SD选项,则需要开启此项服务.

开启方法:

XP系统>控制面板>管理工具,开启VMware USB Arbitration Service服务

如何确定有SD卡插入:

ubuntu在目标文件夹中中输入 dev/sd*命令:

dev/sd*:一切设备都是文件,此目录下存放着sd卡的文件描述符.

sdb1:

b位为a,b,c,d,e,,f,代表存储设备的编号.一般SD卡为b,硬盘为a .

1代表第几个分区.

注意:烧录脚本中的sd*要和实际中的一致.

如果里面的/dev/sdb 文件类型不对(看颜色),则需要删除它(rm –f /dev/sdb),再重新插入SD卡后即可.

烧录:直接在目录中执行  ./write2sd,直到出现以下信息表明烧录完成

注意:有些生成的镜像文件很大,(如LCD显示图片等程序),大于16kb,这时候就必须要进行代码重定位,实现分步加载.BL1仅仅做一些初始化工作,BL2则是真正运行的主程序代码.分步加载的时候还要注意SD卡烧写的扇区个数要达到整个程序的文件大小.

SD卡重定位

SD卡重定位copy到DDR中的代码(BL2)必须放在已经初始化过的DDR中

S5PV210DDR内存地址范围:

DRAM0:0x20000000~0x3FFFFFFF(512MB),对应引脚是Xm1xxxx

DRAM1:0x40000000~0x7FFFFFFF(1024MB),对应引脚是Xm2xxxx

X210DDR内存地址范围:

DRAM0:0x20000000~0x2FFFFFFF(256MB)

DRAM1:0x40000000~0x4FFFFFFF(256MB)

DDR初始化

SDRAM(DDR)初始化使用一个函数sdram_asm_init,函数在sdram_init.S文件中实现,是一个汇编函数。

分散加载SD

文件结构

BL1:包含

link.lds 链接脚本.链接到0xd0020010

start.S:汇编文件.主要功能是

关看门狗,

设置SVC栈,设置完成后就可以调用C函数了

开关icache

初始化DDR(bl sdram_asm_init函数),初始化DDR后就可以把代码拷贝至DDR中运行了.

重定位: bl copy_bl2_2_ddr  将SD卡中的BL2拷贝至DDR某处.并跳转到此处运行

makefile:设置编译规则,其中

bootloader1.bin:可以用USB烧录.

BL1.bin:是复制到SD卡中用SD卡烧录. BL1.bin是bootloader1.bin经过mkv210加工转化增加头文字校验信息得到的专门用于SD卡烧录的镜像文件.

mkv210_image.c:加工文件.

s5pv210.h: s5pv210头文件.

sd_relocate.c:SD卡复制及跳转函数

其中

p1(2, SD_START_BLOCK, SD_BLOCK_CNT, (unsigned int *)DDR_START_ADDR, 0);              // 读取SD卡相关内容到DDR指定位置中

//2:代表SD卡通道号.

//SD_START_BLOCK:SD卡复制的起始扇区号.

//SD_BLOCK_CNT:SD卡要复制扇区的个数.

//DDR_START_ADDR:0x23E00000 //为长跳转的地址,与重定位的链接脚本地址要一致

pBL2Type p2 = (pBL2Type)DDR_START_ADDR;//实现强制长跳转.

BL2:包含

start.S:汇编文件,实现长跳转ldr pc, =main

link.lds 链接脚本.链接到长跳转的地址0x23E00000并从此处开始运行

makefile:设置编译规则,此makefile已经不需要将生成的bin文件再通过mkv210加工转化增加头文字校验信息得到的专门用于SD卡烧录的镜像文件.

开机,IROM自动将SD卡中的block1-block32扇区的内容(BL1)加载至iram中运行,当DDR初始化完毕的时候,就可以将SD卡其他内容复制到DDR中.

复制完毕后,用一长跳转指令,跳转到DDR中去执行BL2.

拓展阅读

1.SD卡编程接口

2.SD卡

3.想学习SD卡的编程

4.Cortex A8 | ARM裸机编程学习

s5pv210开发与学习:1.3之SD卡学习相关推荐

  1. BeagleBone学习(一) SD卡的烧录与扩容

    BeagleBone学习(一) SD卡的烧录与扩容 烧录 (1) 下载烧写工具 http://sourceforge.net/projects/win32diskimager (2) 下载镜像文件 h ...

  2. SD卡学习(SDIO和SPI模式)

    SD卡学习(SDIO和SPI模式) ** SD卡的操作模式:SD卡模式(SDIO).SPI模式(默认为SD模式). 其中SD卡模式的信号线有:CLK.CMD.DAT0-DAT3,6根线. SPI模式的 ...

  3. S5PV210体系结构与接口11:NandFlash SD卡编程

    目录 1. Flash ROM简介 1.1 概述 1.2 Nor & Nand Flash比较 1.2.1 接口对比 1.2.2 容量和成本对比 1.2.3 可靠性对比 1.2.4 使用寿命对 ...

  4. 使用vscode + gcc进行 STM32 单片机开发(三)DMA读写SD卡,移植FATFS文件系统

    背景 在本系列的前两篇文章( 使用vscode + gcc进行 STM32 单片机开发(一)编译及调试 使用vscode + gcc进行 STM32 单片机开发(二)gcc环境 移植rtthread) ...

  5. stm32cubeMX学习十八、SD卡虚拟U盘实验

    本程序编写基于秉火霸道STM32F103ZET6运行环境. 跑这个实验之前吃了一些亏,让我一一道来! 1.软件写好了,却发现插入USB线连接到电脑后USB居然没有枚举 解决方法: 野火的这款开发板上做 ...

  6. android学习笔记之——获取SD卡及手机ROM容量

    继续android学习之旅,今天通过一个小例子,来获取SD卡的容量和手机ROM的容量,具体代码如下: package com.urovo.sdcardspace;import java.io.File ...

  7. 【单片机开发】stm32f429在线IAP 实现SD卡烧写程序

    (一)背景介绍 最近做了一个工程需要用到IAP在线升级这个功能,当时在学的时候,了解到IAP的功能当时就觉得很鸡肋,明明有烧写器干嘛那么费事,现在觉得当时确实浅薄了,IAP功能在工程中确实是非常有用的 ...

  8. stm32 SD(SDSC)卡的学习SDIO 模式连接SD卡

    本次的SD卡连接使用的是SDIO模式与之前的SPI模式相对应,都是对stm32 使用SD卡的介绍也为了和后面的FATFS文件系统使用铺垫.就直接上源码,也有看不明白的抢先看上一节的stm32 SD(S ...

  9. 开发板(Linux)挂载SD卡

    步骤一:查看SD卡是否读取成功 fdisk -l 注意:mmcblk0是节点名字,mmcblk0p1才是我们要挂载的分区 步骤二:挂载SD卡到开发板 挂载前先在/mnt目录下创建ko目录用来挂载 mo ...

最新文章

  1. WiredTiger引擎编译 及 LT_PREREQ(2.2.6)问题解决
  2. Iterator迭代器原理
  3. String_boot热部署学习
  4. 三元表达式 列表递推 生成器表达式
  5. 联想服务器支持esxi版本,联想中国(Lenovo China)_服务频道_服务政策
  6. 通过django 执行命令或者脚本
  7. ps人像精修照片步骤_15天零基础自学PS!送你整套PS教程297集+视频+素材+源文件模板6...
  8. mysql 按字段排序
  9. C++中的namespace(using namespace)的理解
  10. 【文摘】《创新者》-沃尔特·艾萨克森
  11. matlab中数组的创建
  12. 启发式搜索解决八数码问题
  13. 设置和取消Word文档打开密码的三种方法
  14. 一般家用路由器买多大的合适_家用路由器多少兆合适
  15. windows10网络共享及重启后失效的解决办法
  16. 服务器开机显示f1 f2,开机提示按F1/F2才能进入系统的解决方法
  17. 团队里不能留的三种人
  18. 抖音==1/2个微信?抖音会是下一个巨头吗?
  19. 账本App的制作教程
  20. 华为设备配置VRRP与NQA联动监视上行链路

热门文章

  1. 如何快速搭建线上电商商城网站?
  2. shell脚本基础知识-什么是shell、环境变量
  3. 「java」重载重写多态
  4. webstorm背景颜色修改为护眼豆沙绿
  5. RabbitMQ系列随笔
  6. Ionic+cordova+angularJS 项目实现IPhone 下拉框滚动效果
  7. 读《IBM蓝色基因百年智慧》
  8. java设计模式用组合模式实现树形结构
  9. python个人所得税怎么写分录_个人所得税的凭证分录怎么写
  10. Java中file.delete()删除文件失败