S5PV210开发之1.0.10------SD卡启动详解

2023-12-12 10:08

本文主要是介绍S5PV210开发之1.0.10------SD卡启动详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.外存设备
2.SD卡启动详解
3.SD卡启动实战

一、外存设备

1 :Flash:NandFlash、NorFlash
(1)NAND Flash一般地址线和数据线共用;而NOR Flash闪存数据线和地址线分开。
(2)大多数情况下闪存只是用来存储少量的代码,这时NOR闪存更适合一些。而NAND则是高数据存储密度的理想解决方案。
2 :SD卡、MMC卡、MicroSD、TF卡
(1)MMC在SD卡之前
(2)MicroSD = TF卡
3 :iNand、MoviNand、eSSD
4 :SSD(固态硬盘)
(1)固态硬盘体积小、读写速度快
(2)机械硬盘体积大、读写速度慢

二、SD卡介绍

(1)物理接口:SD卡由9个针脚与外界进行物理连接,这9个脚中有2个地,1个电源,6个信号线。
(2)SD协议与SPI协议(不同访问SD卡的时序)
(3)SD卡支持SPI协议:就是为了单片机方便使用。
(4)SD协议要求SoC中有SD控制器,运行在高速率下,要求SoC的主频不能太低。

三、SD卡启动详解

(1)启动过程:
210启动首先执行内部的iROM(也就是BL0),BL0会判断OMpin来决定从哪个设备启动,如果启动设备是SD卡,则BL0会从SD卡读取前16KB(不一定是16,反正16是工作的)到SRAM中去启动执行(这部分就是BL1,这就是steppingstone技术),

BL0执行时就是通过调用这些device copy function来读取外部SD卡/NandFlash中的BL1的。

(2)启动的第一种情况是整个镜像大小小于16KB。这时候相当于我的整个镜像作为BL1被steppingstone直接硬件加载执行了而已。
(3)启动的第二种情况就是整个镜像大小大于16KB。(只要大于16KB,哪怕是17KB,或者是700MB都是一样的)这时候就要把整个镜像分为2部分:第一部分16KB大小,第二部分是剩下的大小。然后第一部分作为BL1启动,负责去初始化DRAM并且将第二部分加载到DRAM中去执行(uboot就是这样做的)。
在这里插入图片描述

(4)Device Copy Function: CopySDMMCtoMem
这个内部函数可以将任何数据从 SD/MMC 设备复制到
内存。用户可以在 IROM 启动过程后使用此功能
完全。
在这里插入图片描述

外部源时钟参数用于适配 20MHz 的 EPLL 源时钟。
/**

  • 此功能将 MMC(MoviNAND/iNand) 卡数据复制到内存中。
  • 始终使用 EPLL 源时钟。
  • 此功能工作在 20Mhz。
  • @param u32 StartBlkAddress : 源卡(MoviNAND/iNand MMC)) 地址。(必须是块地址。)
  • @param u16 blockSize :要复制的块数。
  • @param u32* memoryPtr :要从中复制的缓冲区。
  • @param bool with_init : 确定卡初始化。
  • @return bool(u8) - 成功或失败。

四、SD卡启动实战

在这里插入图片描述
1.文件
在这里插入图片描述
BL1:
在这里插入图片描述
BL2:
在这里插入图片描述
从BL1开始分析:
start.S:


#define WTCON		0xE2700000
#define SVC_STACK	0xd0037d80.global _start					// 把_start链接属性改为外部,这样其他文件就可以看见_start了
_start:// 第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]// 写法3ldr r0, =0xE010E81Cldr r1, [r0]ldr r2, =0x301orr r1, r1, r2str r1, [r0]// 第1步:关看门狗(向WTCON的bit5写入0即可)// 第2步:设置SVC栈// 第3步:开/关icache		//前三步代码省略// 第4步:初始化ddrbl sdram_asm_init	// 第5步:重定位,从SD卡第45扇区开始,复制32个扇区内容到DDR的0x23E00000bl copy_bl2_2_ddr
// 汇编最后的这个死循环不能丢b .

在这里插入图片描述
BL1是16KB,从BLOCK1~BLOCK32,共32个扇区
BL2假设是16KB,BLOCK45-BLOCK76,共32个扇区

copy_bl2_2_ddr

//在SRAM中执行,用的是iROM里面的Device Copy Function的CopySDMMCtoMem#define SD_START_BLOCK	45
#define SD_BLOCK_CNT	32
#define DDR_START_ADDR	0x23E00000typedef unsigned int bool;
typedef bool(*pCopySDMMC2Mem)(int, unsigned int, unsigned short, unsigned int*, bool);
typedef void (*pBL2Type)(void);// 从SD卡第45扇区开始,复制32个扇区内容到DDR的0x23E00000,然后跳转到23E00000去执行
void copy_bl2_2_ddr(void)
{// 第一步,读取SD卡扇区到DDR中pCopySDMMC2Mem p1 = (pCopySDMMC2Mem)(*(unsigned int *)0xD0037F98);//pCopySDMMC2Mem p1 = (pCopySDMMC2Mem)0xD0037F98);
// 通道号:0,或者2
// 开始扇区号:45
// 读取扇区个数:32
// 读取后放入内存地址:0x23E00000
// with_init:0p1(2, SD_START_BLOCK, SD_BLOCK_CNT, (unsigned int *)DDR_START_ADDR, 0);		// 读取SD卡到DDR中// 第二步,跳转到DDR中的BL2去执行pBL2Type p2 = (pBL2Type)DDR_START_ADDR;p2();
}

BL2:

//重定位:
SECTIONS
{. = 0x23E00000;.text : {start.o* (.text)}.data : {* (.data)}bss_start = .; .bss : {* (.bss)}bss_end  = .;	
}//start.S

五、函数指针复习

1.定义函数指针,指向改函数

void func(void)
{  printf("666\n");
}void (*pfunc)(void);
pfunc = func;

2.通过typedef

某函数:
char *(func)(char *a, char *b)
{printf("xxx\n");
}
则对应的函数指针为:
char *(*pfunc)(char *a, char *b)则,这个函数指针类型为:
char *(*)(char *, char *);	使用typedf改变类型:
typedef char *(*pFunc)(char *, char *);	
其中pFunc是自定义的类型名下次定义函数指针时,只需要pFunc p1;  //代替了char *(*p1)(char *, char *);pFunc p2;  //代替了char *(*p2)(char *, char *);	 pFunc p3;  //代替了char *(*p3)(char *, char *);

总结:
写函数指针时:
1.先在函数名称改为*pfunc
2.typedef直接添加在前面,则生成pfunc的类型名
调用函数指针时:
1.pfunc(参数/无参数);
2.(*pfunc)();

这篇关于S5PV210开发之1.0.10------SD卡启动详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/484223

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

springboot3打包成war包,用tomcat8启动

1、在pom中,将打包类型改为war <packaging>war</packaging> 2、pom中排除SpringBoot内置的Tomcat容器并添加Tomcat依赖,用于编译和测试,         *依赖时一定设置 scope 为 provided (相当于 tomcat 依赖只在本地运行和测试的时候有效,         打包的时候会排除这个依赖)<scope>provided

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)