嵌入式Linux裸机开发(十)——SD卡启动

2019-07-12 16:29发布

嵌入式Linux裸机开发(十)——SD卡启动

存储设备分类:磁存储设备:软盘、硬盘、光盘、CD、磁带Flash:NandFlash、NorFlash缺点:时序复杂,无坏块处理机制,接口不统一NandFlash:MLC(可靠性差,容量大)、SLC(可靠性高、容量小)扩展卡式Flash:SD卡、MMC卡、MicroSD(TF卡)内部为NnadFlash存储颗粒,外部封装了接口,接口标准统一、通用。缺点:频繁使用导致卡槽接触不可靠iNand、MoviNand、eSSD:内部为NandFlash芯片,集成块设备存储单元,集成了扩展卡式Flash 的优点,接口标准统一(时序、物理封装、引脚定义)芯片级封装发布Flash管理模块:坏块管理等SSD:内部为NandFlash芯片,外部封装为硬盘接口

一、SD卡简介

    SD卡(Secure Digital Memory Card)是一种基于半导体闪存工艺的存储卡,1999年由日本松下主导概念,参与者东芝和美国SanDisk公司进行实质研发而完成。SD卡已成为目前消费数码设备中应用最广泛的一种存储卡。SD卡是具有大容量、高性能、安全等多种特点的多功能存储卡,它比MMC卡多了一个进行数据著作权保护的暗号认证功能(SDMI规格),读写速度比MMC卡要快4倍,达2M/秒。SD插槽支持MMC卡

二、SD卡编程接口

SD卡的引脚定义针脚4SD模式1SD模式SPI模式名称描述名称描述名称描述1CD/DAT3卡监测/数据位3CD卡监测CS芯片选择2CMD命令/回复CMD命令/回复DI数据输入3VSS1VSS1VSS14VCC电源VCC电源VCC电源5CLK时钟CLK时钟CLK时钟6VSS2VSS2VSS27DAT0数据位0DAT数据位DO数据输出8DAT1数据位1RSV保留RSV保留9DAT2数据位2RSV保留RSV保留SD卡的引脚接口支持两种通信协议:SD协议和SPI协议SPI协议是单片机中广泛使用的一种通信协议,接口时序简单,是一种低速通信协议。SD通信协议是一个统一标准的通信协议。SoC通过SD卡的九针引脚以SD/SPI协议向SD卡管理模块发送命令、时钟、数据等信息,需要按照时序处理操作SD卡。 

三、SD卡启动模式

1S5PV210读取Flash设备数据的方式

    S5PV210内部iROM内部固化了多个设备拷贝函数,这些函数支持从SD/MMCeMMCOneNandeSSD设备拷贝数据到SDRAM中。设备拷贝函数如下:    NF8_ReadPage_Adv0xD0037F90):2K4K8bit总线    NF16_ReadPage_Adv0xD0037F94):2K5 cycle 16位总线    CopySDMMCtoMem0xD0037F98):从SD/MMC设备拷贝到SDRAM    CopyMMC4_3toMem0xD0037F9C:eMMC设备拷贝到SDRAM    CopyOND_ReadMultiPages0xD0037FA0):从OneNand设备拷贝到SDRAM    CopyOND_ReadMultiPages_Adv0xD0037FA4):从OneNand设备拷贝到SDRAM    Copy_eSSDtoMem0xD0037FA8):从eSSD设备拷贝到SDRAMCPUPIO模式)    Copy_eSSDtoMem_Adv0xD0037FAC):从eSSD设备拷贝到SDRAMUDMA模式)    NF8_ReadPage_Adv128p0xD0037FB0):每块128页,每页2KNand

2、S5PV210读取SD卡数据的方式

CopySDMMCtoMem函数解读:#define CopySDMMCtoMem(z,a,b,c,e) (((bool(*)(int, unsigned int, unsigned short, unsigned int*, bool))(*((unsigned int *)0xD0037F98)))(z,a,b,c,e))    参数1SD卡通道    参数2:块起始地址(块地址)    参数3:拷贝块的数量    参数4:数据拷贝到什么地址    参数5:返回状态

3、函数指针调用设备拷贝函数

typedef unsigned int bool;typedef bool(*CopySDMMC2Mem) (int, unsigned int, unsigned short, unsigned int *, bool);CopySDMMC2Mem pFun = (CopySDMMC2Mem)0xD0037F98;(*pFun)(x,x,x,x,x);//调用方式

四、SD卡启动模式编程

S5PV210启动过程:开发板上电后,BL0执行时会从启动设备加载BL1到iRAM中执行,BL1执行时会初始化SDRAM,将BL2从启动设备拷贝到SDRAM,然后从BL1远跳转到BL2执行。BL1阶段工作:初始化SDRAM从SD卡拷贝BL2到SDRAM远跳转执行BL2说明:S5PV210规定BL1从block1开始,BL1从block1-block32,BL2从block45-block76。BL1的运行地址和链接地址为0xD0020010。BL2阶段工作:跳转到BL2执行时,点亮LED灯。说明:BL2的运行地址为SDRAM中的地址,因此链接地址需要设定为SDRAM 的地址。BL1工程代码分析:start.S:.global _start _start:// 初始化DDR SDRAM内存bl sdram_init// SD卡中读取数据到SDRAM,重定位,并跳到DRAM中运行bl CopyBL2toSdramloop:b loop sd_relocate.c:#define SD_START_BLOCK 1#define SD_BLOCK_CNT 32#define DDR_START_ADDR 0x23E00000 typedef unsigned int (*CopySDMMC2Mem) (unsigned int  channel, unsigned int  start_block, unsigned char block_size, unsigned int  *trg, unsigned int  init); void CopyBL2toSdram(void){unsigned long ch;void (*BL2)(void);ch = *(volatile unsigned int *)(0xD0037488);// 函数指针CopySDMMC2Mem copy_bl2 = (CopySDMMC2Mem) (*(unsigned int *) (0xD0037F98));unsigned int ret;// 通道0if (ch == 0xEB000000){// 0:channel 0// 49:,代码位于扇区49,1 sector = 512 bytes// 32:长度,拷贝32 sector,即16K// 0x23E00000:目的,链接地址0x23E00000ret = copy_bl2(0, 49, 32,(unsigned int *)0x23E00000, 0);}// 通道2else if (ch == 0xEB200000){ret = copy_bl2(2, 49, 32,(unsigned int *)0x23E00000, 0);}elsereturn;BL2 = (void *)0x23E00000;// 跳转到SDRAM0x23E00000执行    (*BL2)();} 
工程源码见附件,编译后烧录到smart210正常运行,LED等闪烁。
本文出自 “生命不息,奋斗不止” 博客,请务必保留此出处http://9291927.blog.51cto.com/9281927/1787655