搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
从前慢现在也慢
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
基于Cisco Packet Tracer的基础命令操作及组网实验
2
如何用大模型做出一款属于自己的 AI 应用?_做一个只属于自己使用的ai软件 取消掉所有的上线之后
3
用navicat导出数据库后再用DBeaver打开导出脚本显示乱码问题_navicat 迁移 dbeaver
4
【Python】Windows如何在cmd中切换python版本_cmd切换python版本
5
iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)
6
【机器学习】机器学习与物流科技在智能配送中的融合应用与性能优化新探索
7
langchain包下载安装以及基本使用的注意事项_langchain下载
8
python-中文闲聊的GPT2模型首次使用笔记_github gpt2怎么用
9
【c++】基类派生类多态虚函数?_设计人员基类,由其派生学生类 人员基类中用虚函数(或纯虚函数)来统一标识
10
毕业设计:基于python的网易云数据分析可视化系统_基于python音乐数据可视化分析毕业设计
当前位置:
article
> 正文
SD卡加载和引导WinCE内核映像的实现_sd wince
作者:从前慢现在也慢 | 2024-06-17 11:06:03
赞
踩
sd wince
传统的嵌入式系统大部分使用NOR Flash或者NAND Flash等非易失闪存来存储数据和引导系统启动,但是由于读写Flash存储设备需要专用接口,使得传统方法有很多不便之处。本文提出了一种使用SD卡(Secure Digital Memory Card)加载和引导内核WinCE内核映像的方法,可以通过嵌入式系统的SD卡接口方便地实现内核的引导和更新。
当一款基于WinCE操作系统的嵌入式设备投入使用后,如果在使用的过程中对设备产生了新的需求,把固件系统返回生产厂家进行升级是一件极其麻烦的事情,但是从厂家拷贝符合需求的新内核到SD卡中,使用SD卡更新WinCE系统却是一件轻而易举的事情。因此,SD卡加载和引导WinCE内核有着很好的应用前景。
1 系统架构
本文采用的硬件核心芯片为Samsung公司的S3C6410处理器,S3C6410是一个16/32位RISC微处理器,含丰富的外设接口,支持高速SD/MMC卡,SD卡通过读卡器在PC机上进行读写。
软件平台包括内核引导代码Bootloader、嵌入式操作系统软件开发平台。由于WinCE 6.0良好的用户界面和丰富的Windows API函数的支持,大量的车载终端设备和工控设备使用了Windows CE作为内部的操作系统。平台开发工具为Platform Builder,在Visual Studio 2005中把Platform Builder作为一个插件集成在了套件中,可以实现WinCE系统设计、配置、构建、测试和调试等所需的所有功能。
2 IROM启动方式原理
为了支持MCU从无法执行程序的非易失性存储设备(例如NAND Flash或者SD/MCC卡)执行启动程序,三星公司设计了一种“Stepping Stone”技术,也就是IROM启动方式。IROM方式的系统引导框图如图1所示。
图1 系统引导框图
2.1 BL1的加载
从什么类型的设备拷贝BL1到Stepping Stone中,是系统通过引脚GPN[15:13]来判断的。若GPN[15:13]设置为111,就从SD/MMC(CH1)卡中拷贝程序BL1到地址Stepping Stone中。
对于SD/MMC卡,SD卡的最后一个块(即block,每个block为512 B)要预留下来,倒数第二个block指定用于SD卡的标签(Signature),从[LAST18]到[LAST3]这16块一共8 KB,用于保存BL1代码;而对于SDHC卡,SD卡的最后1025个块(512.5 KB)要预留下来,倒数第1026个块指定用于SD卡的标签(Signature),从[LAST1042]到[LAST1027]这16块一共8 KB,用于保存BL1代码,代码分布结构如表1所列。
表1 SD/SDHC卡引导代码分布结构
拷贝BL1程序代码的过程,是由S3C6410芯片中IROM的代码执行的,无法更改,因此要根据卡的种类把BL1代码放到卡的合适的位置。
2.2 BL2的加载
BL1的代码功能首先执行启动文件start.s,start.s的主要任务是对系统进行初始化,为处理器建立良好的运行环境。start.s执行完毕后,跳转到main.c中执行。main.c的主要任务是执行函数CopyMovitoMem(HSMMC_CHANNEL,MOVI_BL2_POS,MOVI_BL2_BLKCNT,(uint*)BL2_BASE,MOVI_INIT_REQUIRED)指令。
CopyMovitoMem是IROM启动后为用户提供使用的一个函数,函数的指针位于地址0x0C004008中。为了确定BL2代码的起始位置,IROM提供了一个记录SD/MMC卡总扇区的参数globalBlockSizeHide,存放在地址0x0C003FFC中。参数HSMMC_CHANNEL由SD卡插入哪个卡槽决定。参数MOVI_BL2_POS是说明要从SD/MMC中拷贝的第几个扇区开始,对于SD/MMC卡其值为globalBlockSizeHide18BL2,对于SDHC卡其值为globalBlockSizeHide1042BL2。参数MOVI_BL2_BLKCNT为拷贝扇区的数目,这是由BL2代码大小决定的,比如若BL2为512 KB,则提前定义#define MOVI_BL2_BLKCNT (0x80000/0x200)。参数BL2_BASE为拷贝到什么位置上,为内存中代码存储的地址。参数MOVI_INIT_REQUIRED决定是否对SD卡进行初始化操作,通常赋值为1。
代码拷贝完成后,指针是如何跳到BL2中运行的呢?在main.c文件的最后,执行((PFN_IMAGE_LAUNCH)(LOAD_ADDRESS_PHYSICAL))(),处理器就跳到BL2中运行。
3 SD卡加载和引导WinCE内核的实现
3.1 BL2的加载的实现
为了实现SD卡加载和引导内核映像的功能,首先要使WinCE 6.0的Bootloader支持SD卡启动。为了实现这一目的,把Bootloader分成两块:一块称为Stepldr,大小为8 KB,编译链接后产生的就是代码BL1;另一块称为EBOOT,除了通常的利用网口和串口下载更新内核的代码外,添加利用SD卡下载和更新内核代码,以及FAT32文件系统代码,构成新的EBOOT代码,编译链接后就是代码BL2。
当执行完IROM代码后,系统指针跳转到BL1首地址。处理器首先执行startup.s代码,为CPU准备一个合适的运行环境。然后,跳转到main.c函数。在这里,主要调用CopyMovitoMem函数实现BL2下载并跳转到相应位置执行。所以main.c主函数为:
void main(void){
CopyMovitoMem(1,globalBlockSizeHide18EBOOT_NB0_SIZE, EBOOT_NB0_SIZE, (unsigned int *)LOAD_ADDRESS_PHYSICAL, 1);
((PFN_IMAGE_LAUNCH)(LOAD_ADDRESS_PHYSICAL))();
}
3.2 内核加载和更新的实现
BL2是由EBOOT编译产生的,为了实现从SD卡加载和引导内核的功能,需要完成以下3步工作:
① 把SD卡驱动移植进EBOOT;
② 把FAT文件系统移植进EBOOT;
③ 在EBOOT中下载内核镜像部分,添加通过SD卡下载镜像功能。
SD卡驱动部分可参考WinCE 6.0的BSP包的关于SD卡驱动源码。在SDInterface.c文件中暴露SD卡读写函数接口供OEM函数OEMPreDownload调用。FAT文件系统使用网络上的开源DLL库,把库的函数接口放在fat.h文件中供SD卡操作函数调用[5]。为了实现SD卡下载镜像,首先在PC机上把相应内核的bin类型文件拷贝到SD卡中,当Bootloader执行到OEMPreDownload函数时,调用SDInterface.c对SD/MMC卡接口进行初始化,然后下载镜像到SDRAM中,实现WinCE内核的加载。接着就可以把Bootloader和NK存储到系统的Flash中以便下次使用,实现WinCE内核的更新[6]。
3.3 程序写入SD卡的方法
为了识别SD卡,首先要把SD卡格式化成FAT32文件系统。有两种方法可以把代码写入SD卡。
方法一:Samsung公司设计了在PC机运行的应用程序IROM_Fusing_Tool.exe和IROM_Fusing_Tool_SDHC.exe,分别适合于把代码写到SD/MMC卡和SDHC卡中,修改EBOOT下的makefile.c文件,可以把代码BL2和BL1编译成一个文件EBOOT_SD.nb0,然后通过上述工具就可以把EBOOT_SD.nb0写到SD卡的相应位置。
方法二:使用WinHex软件直接读写SD卡数据,该软件可以方便地把相关代码写到SD卡的合适位置。
结语
使用SD/MMC卡在Samsung公司的S3C6410处理器上加载和引导WinCE内核,已经成功实现。与传统的NAND Flash引导系统启动的方式相比,使用SD卡更加方便简单,为WinCE嵌入式系统加载和引导内核提供了一种很好的解决方案。
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/730899
推荐阅读
article
Hadoop
最
基本
的
wordcount
(统计词频)...
Hadoop
最基础
的
例子
Hadoop
最
基本
的
wordcount
(统计词频) packag...
赞
踩
article
Java
-
Swing
内嵌网页
判断
网址
类型_dj-
native
-
swing
...
** 最近开发了一个项目,用
Swing
窗口界面内嵌网页,然后从记事本中获取到
网址
,页面显示
网址
内容,然后人工点击单选按钮...
赞
踩
article
Arrays
_如何定义
arrays
...
Arrays
类常用方法解析1.
Arrays
类的定义
Arrays
类位于 java.util 包中,主要包含了操纵数组的...
赞
踩
article
mac
查看IP地址_
mac
查看
ipv4
...
ifconfig | grep "inet " | grep -v 127.0.0.1_
mac
查看
ipv4
mac
查看...
赞
踩
article
Python
文件
读取
方法:
read
()、
read
line()和
read
lines()的区别_pyth...
根据需求和
文件
的大小,选择适合的
文件
读取
方法是很重要的。如果需要一次性
读取
整个
文件
的内容并进行处理,可以使用
read
()...
赞
踩
article
【
JAVA
SE】
类
和
对象
...
在我们之前的学习过程中,在写代码的时候都需要去考虑一步一步的逻辑过程,也就是面向过程去编写代码。而
JAVA
的主要思想是面...
赞
踩
article
为
zynq
格式化
SD
引导卡_
boot
.bin
boot
.
scr
image
.ub...
为
zynq
Linux 创建
SD
引导卡_
boot
.bin
boot
.
scr
image
.ub
boot
.bin boo...
赞
踩
article
llama
factory
参数
体系EvaluationArguments、DataArgument...
类是一个Python数据类,用于存储和管理与PPO(Proximal Policy Optimization)和DPO(...
赞
踩
article
我的
高
拍仪
自动
阅卷
系统
...
我是一名图形图像方向的
高
校老师,主要讲授《计算机图形学》和其它一些课程,每学期末课程结课后都有一定的
阅卷
工作量。
阅卷
是课...
赞
踩
article
IT
入门
知识
第一部分《
IT
基础
知识
》
(
1
/
1
0)...
网络拓扑是描述网络中设备如何物理和逻辑上连接的一种方式。它决定了数据如何在网络中流动。
(
1
)星型拓扑:
1
、所有设备连接到...
赞
踩
article
astype
函数
的使用
_
astype
函数
的作用...
转换结果为:[1.0,2.0,3.0,4.0]
_
astype
函数
的作用
astype
函数
的作用 ...
赞
踩
article
202306
1
0
1
+X
中级
实操
考试
(
id
:3759)_202306
1
0
1
+x
中级
实操
考试
(i...
【代码】202306
1
0
1
+X
中级
实操
考试
(
id
:3759)_202306
1
0
1
+x
中级
实操
考试
(
id
:3759...
赞
踩
article
黑马
程序
员
微信
小
程序
学习总结9.插槽(
slot
)、父子
组件
中
的
通信
的
3种方式和
自定义
组件
behavi...
简单来说就是
组件
调用页面可以通过插槽向
组件
的
slot
节点
中
填充标签可能有点抽象看下面例子:新建test4
组件
:添加到全局...
赞
踩
article
基于
FPGA
的
数字
时钟
设计
与实现(含源码)_
fpga
数字
时钟
课程
设计
...
在本
设计
中,我们将使用
FPGA
来实现一个基本的
数字
时钟
系统。该系统将包括一个
时钟
模块,用于产生
时钟
信号;计数器模块,用于...
赞
踩
article
vue3.0使用
van
-
pull
-
refresh
,与页面
滚动
事件
冲突
,
滚动
数据,会触发
刷新
_
van
t...
遇到的问题:vue3.0使用
van
-
pull
-
refresh
,与页面
滚动
事件
冲突
,
滚动
数据,会触发
刷新
。1.
van
-pu...
赞
踩
article
HarmonyOS
未来
五年的
市场
展望...
随着科技的不断进步和消费者对于智能化设备需求的日益增长,操作系统作为连接硬件与软件的核心平台,其重要性愈发凸显。Harm...
赞
踩
article
ECC
椭圆曲线
加密算法
原理...
比特币使用椭圆曲线算法生成公钥和私钥,选择的是secp256k1曲...
赞
踩
article
基于
FPGA
的带
闹钟
功能的
数字钟
设计
VHDL
代码Quartus仿真_基于
fpga
的定时
闹钟
...
数字钟
1、可以调节小时、分钟2、可以调整
闹钟
时间3、到设置的时间闹铃响4、整点报时_基于
fpga
的定时
闹钟
基于
fpga
的...
赞
踩
article
jupyter
notebook
的
hinterland
插件 改造,使
代码
提示第一个不被选中_n...
进入到 自己开发环境 Python 或者 Anaocnda
的
安装目录,然后进入如下文件夹 Lib\site-packa...
赞
踩
article
ECC
算法
介绍...
ECC
(Elliptic Curves Cryptography)加密
算法
是一种公钥加密
算法
,与主流的RSA
算法
相比,E...
赞
踩
相关标签
swing
java
eclipse
开发工具
python
开发语言
idea
intellij idea
linux
debian
服务器
llama
人工智能
IT基础知识
信息技术
IT
numpy
机器学习
微信小程序
学习
小程序
fpga开发