admin 管理员组

文章数量: 887021

这一部分内容主要要查看S5PV210的手册。

内存映射

S5PV210属于ARM Cortex-A8架构,32位CPU,CPU设计时就有32根地址线&32根数据线。 32根地址线决定了CPU的地址空间为4G,那么这4G空间如何分配使用?这个问题就是内存映射问题。比如某I/O端口的寄存器映射到内存的某个区域,这样,就可以通过给这些寄存器映射单元赋予不同的二进制,实现外设的控制。

S5PV210 datasheet中内存映射位置:

 

问题来了,这里的地址空间怎么算的?

0x0000_0000~0x1FFF_FFFF,按照1个1个地增加,之间的差距有29个1,那就是2^9 * 2^20,即2^9M,也就是512M过了两天,发现这个想法真的是错得离谱。1个1个加没错,但是不是看差距有多少个1,如果是这样,那么1000和0000,以及0100和0000,以及0010和0000,之间的内存大小不都是一模一样了嘛,显然,根据1的个数差距来算是错的。

算的时候,应该算的是有多少种组合,而不是直接地址加减结果,怎么理解呢?

比如:

就针对简单的二进制来说,00到11共有多少种组合结果?列出如下:00 01 10 11,共4种(2^2种),如果按正常的加减运算,那么就是11-00 = 11,换算成10进制就是3,这显然是不对的。

但是这两者之间是有某种关系的,加减结果和组合数之间有什么区别呢?

比如1111,从0开始,1个1个的加,可以加到15(因为是从0开始的,实际上还是16个数);不过1111的组合数是2^4=16种。

所以,组合数 = 1个1个地加再加上1。

可以推出:两个地址之间的内存大小是,尾地址 - 首地址,得到1个差距数,这个差距数有多少种组合方式呢?先把它换算成10进制数,再+1即可,因为内存是以字节为单位来编址的,所以单位是字节。

字节/1024为K

K/1024为M

M/1024为G

210的外部存储器

SoC常用外部存储器:

NorFlash

NandFlash

eMMC/iNand/moviNand,

oneNAND

SD卡/TF卡/MMC卡

eSSD

SATA硬盘

NorFlash、NandFlash、eMMC闪存三者对比 - 电子常识 - 电子发烧友网

关于iNand ,oneNand,moviNAND的区别_andylauren的博客-CSDN博客

常见闪存卡介绍MMC卡TF卡SD卡

S5PV210支持的外部存储器:

见datasheet Section2.6 booting sequence

见datasheet Section5全部,memory

见datasheet Section8.7 SD/MMC部分

X210有2个版本,Nand版和iNand版,分别使用Nandflash和iNand为外部存储器。我们使用的是iNand版本,板载4GB iNand。

S5PV210共支持4个SD/MMC通道,其中通道0和2依次用作启动。X210开发板中SD/MMC0通道用于连接板载MMC,因此外部启动时只能使用SD/MMC2通道(注意通道3不能启动)。见《S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf》中P6

总结:

1、现代SoC支持多种外部存储器

2、外部存储器主要用来存储程序(可执行代码),相当于电脑的硬盘。

3、各种不同外部存储器原理不同,大小、性价比不同,一般产品厂家根据需要选择适合自己产品的外存使用。

4、外部存储器和CPU连接一般不是通过地址&数据总线直接相连,因为地址空间不够用。一般都是通过专门的接口来连接的。

210的启动过程

210内部有iROM和iRAM,因此启动时分两个阶段:内部启动阶段和外部启动阶段。

对于内部启动阶段各种S5PV210的开发板都是相同的;

对于外部启动阶段,不同开发板会有不同。 启动过程主要参考:

《S5PV210_iROM_ApplicationNote_Preliminary_20091126.pdf》

S5PV210出厂时内置了64KB iROM和96KB iRAM。

iRAM属于SRAM(不需软件初始化,上电即可使用)。

iROM中预先内置烧录了一些代码(称为iROM代码),210启动时首先在内部运行iROM代码,然后由iROM代码开启外部启动流程。

为什么需要设计iROM和iRAM?答案是为了支持多种外部设备启动。

二次启动支持:

When 1 st boot mode fails, SD/MMC boot will be tried through SD/MMC channel 2 with 4-bit data

当第一启动模式失败时,SD/MMC卡启动模式下将会从SD/MMC2通道尝试再次启动。 这种二级启动是一种冗余设计。SoC中第一启动介质故障而导致不能启动时,可以从备用启动介质启动。我们做裸机实验时从SD2启动就是利用了这一设计特性。

使用iROM启动的好处:

1、降低BOM成本。因为iROM可以使SOC从各种外设启动,因此可以省下一块boot rom(专门用来启动的rom,一般是norflash)

2、支持各种校验类型的nand

3、可以在不使用编程器的情况下使用一种外部存储器运行程序来给另一种外部存储器编程烧录。这样生产时就不用额外购买专用编程器了,降低了量产成本。

 

 

 

210的启动过程:

210内置了一块96KB大小的SRAM(叫iRAM),同时还有一块内置的64KB大小的NorFlash(叫iROM)。210的启动过程大致是:
第一步:CPU上电后先从内部IROM中读取预先设置的代码(BL0),执行。这一段IROM代码首先做了一些基本的初始化(CPU时钟、关看门狗···)(这一段IROM代码是三星出厂前设置的,三星也不知道我们板子上将来接的是什么样的DRAM,因此这一段IROM是不能负责初始化外接的DRAM的,因此这一段代码只能初始化SoC内部的东西);然后这一段代码会判断我们选择的启动模式(我们通过硬件跳线可以更改板子的启动模式),然后从相应的外部存储器去读取第一部分启动代码(BL1,大小为16KB)到内部SRAM。
第二步:从IRAM去运行刚上一步读取来的BL1(16KB),然后执行。BL1负责初始化NandFlash,然后将BL2读取到IRAM(剩余的80KB)然后运行
第三步:从IRAM运行BL2,BL2初始化DRAM,然后将OS读取到DRAM中,然后启动OS,启动过程结束。


思路:因为启动代码的大小是不定的,有些公司可能96kb就够了,有些公司可能1MB都不够。所以刚才说的2步的启动方式不合适。三星的解决方案是:把启动代码分为2半(BL1和BL2),这两部分协同工作来完成启动。

BL0做了什么?

关看门狗

初始化指令cache

初始化栈

初始化堆

初始化块设备复制函数device copy function

设置SoC时钟系统

复制BL1到内部IRAM(16KB)

检查BL1的校验和

跳转到BL1去执行

S5PV210的所有启动:

先1st启动,通过OMpin选择启动介质

再2nd启动,从SD2

再Uart启动

再USB启动

SD启动

可以使用外置SD卡从SD2通道启动,但这需要先破坏板载的eMMC中的android镜像。破坏方法见九鼎官方的裸机教程文档《x210v3开发板裸机教程.pdf》中2.5.2节(P19),OMpin设置和SD0启动一样。

这种方式比较麻烦,需要不断地插拔,实际中,常用在USB驱动无法安装,或者批量出厂的时候使用这种方式。

uboot 属于bootloader(引导加载程序)的一种,是用来引导启动内核的,它的最终目的就是,从flash中读出内核,放到内存中,启动内核。它刚开始被放到flash上,然后上电以后先执行它,它会完成硬件初始化,设置处理器模式,关闭看门狗,屏蔽中断,初始化sdram,设置栈,设置时钟,从flash引导内核到内存,就好像我们PC上的BIOS一样。uboot有自己的Shell。

开发板优先使用默认的方式来启动,只有默认启动方式失败,才会使用SD卡进行二次启动。

注意,要把SD卡插入SD2,这是硬件设计所决定的。

具体步骤为:

1、先破坏iNand中的bootloader,使得默认启动失败

往uboot中,即SecureCRT界面中,输入下面两条命令:

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


解释:这句话的意思就是说把板载的iNand的第一个扇区用全0来填充,其实就是擦除它,这样我们板载的iNand的bootloader的开始第1个扇区就被破坏了。将来启动时iROM还是会先从iNand中读取前16KB,然后计算校验和。这时候因为有1个扇区被擦掉了,所以校验和不通过,所以启动失败(会从SD2去执行2nd启动)。

或者直接输入:movi write u-boot 0x30000000
注意:破坏板载iNand的bootloader后,不插外部SD卡,启动时串口得到:SD checksum Error

2、制作启动SD卡

其实就是烧录uboot到SD卡中。有2种烧写方法:一种是在windows中用刷卡工具去制作启动SD卡;另一种是在linux中用dd命令。
第一种(比较简单)

刷卡工具在光盘:A盘\tools\x210_Fusing_Tool.rar
制作完SD后将SD卡插入开发板SD2通道(注意不是SD3),然后开机后就会从SD2启动。

第二种(相对复杂)

首先得搞清楚:一个USB设备插到电脑后,要么可以在Windows中识别,此时不能在虚拟机linux中识别;要么能在linux中识别,但是在windows中又不见了。默认的一般都是连在Windows中的,所以linux是找不到的。
如果你需要将该设备连接到linux中,需要在VMware软件的菜单“虚拟机 -> 可移动设备”中点选该设备,选择连接,连接进linux中,在命令行中:ls /dev/sd*查看,和之前对比,就知道我们的SD卡在linux中的设备编号了。一般是/dev/sdb,也有可能是sdc或者其他。我们后面的实验是基于这个设备号是/dev/sdb的,如果不是,后面的实验要相应做修改。
之后将启动文件nand_fusing.sh放入共享文件夹,执行 ./nand_fusing.sh /dev/sdb,即可完成启动SD卡的制作。

一般情况下,用USB来启动、刷机以及调试比较方便,不过在USB无法使用时,可以用SD来作为其备用方案。

开发板的串口监视

usb既不是串口也不是并口,是一种独立的接口技术,usb基于串口通信,但不是串口,usb是通用串行总线的意思,一个是狭义的,一个是广义的,电脑的串口是9针的,USB是平口的。

串口是一种硬件通信口,很多年前的时候串口是CPU之间进行通信的主要接口。但是现在因为串口通信的速度很低,所以现在串口主要是用来做程序输出监控、调试。


桌面电脑可以打开一个虚拟控制台,嵌入式系统一般是用串口来做控制台的。一般是用一根串口线连接开发板的串口和我们笔记本电脑的串口,然后在电脑上打开一个串口监视,这样开发板上的串口输出内容就可以在电脑上看到。还可以通过监视终端向开发板输入一些控制命令由开发板执行。常用的串口监视软件有:超级终端、SecureCRT、minicom。

本来电脑都是有串口的(DM9接口),但是现在大家都用笔记本没有串口了,所以这种串口连接线用不了。办法是使用USB转串口线,这种线传入电脑后需要安装驱动,安装驱动后在电脑上会形成一个串口(叫usb转串口),这样就相当于你电脑有了一个串口,可以通过这个串口来监视开发板的串口输出。


注意

1:windows对USB设备的管理是和USB口有关的,你每次把usb转串口线插到1个口中,这样得到的COM口号码是不变的,方便我们后期使用。如果每次胡乱更换插口,可能得到的COM口会变。
2:COM口号码是可以改的,还可以强制占用显示“已使用”的COM号,一般改成COM4以内的就可以了。


使用SecureCRT
从网盘下载SecureCRT.rar,解压后直接使用。注册时参考解压包中的《说明.txt》。
打开SecureCRT.exe后,建立一个Serial连接,开始监视串口。设置参考视频中,注意流控一定要去掉。

这里给的软件只能安装在32位系统上,我是win10的系统,所以得去网上重新找一个。

注意,官方出厂默认的烧录镜像都是使用串口2的。所以我们需要把线接到串口2上(UART2)。因为出厂刷的系统QT默认使用串口2输出。

简单使用:

建立连接

开发板端的动作,在终端有显示:

 

注意:串口监视对拨码开关拨在哪没有要求,我是在默认EMMC下操作的。

刷系统

刷系统就是利用刷机工具,向开发板中烧录预先编译好的系统镜像(也就是系统文件),使之在开发板上运行起来。

如果你不想启动原有程序,而是想要启动一个新的程序,就需要刷机。

系统启动时会有一个3秒的倒计时,在启动的3秒内按下回车键(不按就会启动原来的程序),在SecureCRT上的命令行就会从#变成了210#,这时候就可以使用fastboot将程序下载进入开发板。(这类似于win开机前几秒可以进入Bios)

fastboot是uboot中用来快速下载镜像的一个命令,fastboot同时还是一个windows上的软件。


fastboot下载时要注意

1:fastboot是使用USB线进行数据传输的,所以fastboot执行之前要先连接开发板和主机之间的usb线。(电脑端是大口,开发板端是小口)此时没有任何反应;

2、在SCRT端的3秒之内按下回车后,输入fastboot,此时在电脑端的设备管理器中能看到多了个其它设备;

3:需要安装驱动。驱动位置:A盘\tools\USB驱动\x210_android_driver

禁用强制驱动程序签名

win10系统安装这类驱动有个坑,就是驱动无数字签名,在WIN10中是不安全的驱动,所以显示哈希值不在范围内不能安装。朱老师在qq群里提供了解决办法,即“禁用强制驱动程序签名”。后面安装dnw工具的驱动的时候也会提示同样的错误,解决办法也是一样的。可以参考

https://jingyan.baidu/article/624e74594dbc8d34e8ba5aa6.html

1.找到WIN10的设置,点击“设置”
2.点击最后一个“更新和安全”,然后点击“恢复”
3.点击“恢复”之后,在右边点击高级启动下面的“重新启动”,此时电脑会重新启动,如果有其
他重要程序在跑,请慎重
4.重启之后会出现几个选项,点击选项“疑难解答”
5.然后点击“高级”,
启动设置,重启
6.这会重启之后就跳出一个列表,其中有安全模式等选项,也包括这里我们关心的
“禁止强制驱动程序签名”
7.选择“禁用强制驱动程序签名”,对应哪个数字就按那个数字,之后
电脑会重新启动
8.重启之后,驱动就可以成功安装。若有提示点击继续安装即可。

安装好驱动之后,接着使用window上的fastboot软件来找到设备。

这个软件不是双击使用的,而是要在cmd中使用。

cmd中进入到软件路径,接着执行命令。

这里在板上执行fastboot以及使用window上的fastboot,类似于很多软件在电脑端和手机端同时安装,以实现更好的通信。

学习三个命令:

fastboot devices        命令用来查看当前连接的设备。(我们开发板看到的是:SMDKC110-01)
fastboot flash xxx        命令用来烧录的
fastboot reboot            命令用来重启系统

在cmd下使用以下三个命令来完成开发板的镜像下载:

往这三个分区中刷入对应的文件:(在SecureCRT上输入fastboot)


fastboot flash bootloader android4.0/uboot.bin        烧uboot
fastboot flash kernel android4.0/zImage-android        烧linux kernel
fastboot flash system android4.0/x210.img            烧android rom

下载和烧录过程中,SecureCRT界面也会同步显示相关信息。

 

烧录完成后,fastboot reboot重启即可。

其实,刷机或者烧录程序,就是将程序写入iNAND中,之后正常启动即可。

注意:刷机对拨码开关拨在哪没有要求,我是在默认EMMC下操作的。

USB裸机程序调试

上面说的刷机,涉及到启动程序和操作系统。我们可以通过刷机来看测试程序效果。

当我们写裸机程序时,不涉及操作系统,此时,我们同样可以通过USB将裸机程序下载到板中去执行。

回顾S5PV210的启动方式,必须将pin打到USB端,才能从USB启动。(我一开始没有拨,还总是以为咋在设备管理器中没有正确显示串口)

S5PV210的启动过程:开机时先执行内部的iROM中的BL0,然后BL0做了一系列的初始化后,再读取外部OMpin的设置来确定用户选择了从哪里启动。当检测到我们设置的是USB启动时,S5PV210就会从USB OTG接口试图连接主机进行下载启动。


dnw工具介绍
dnw是一个软件,是三星公司编写的,这个软件的功能是通过USB线连接开发板和电脑主机,然后从主机下载文件镜像到开发板中去烧录系统。
dnw软件使用注意

1:dnw是需要装usb驱动的,驱动在“X210光盘资料\A盘\tools\USB驱动”目录中
2:dnw使用时通过usb线下载,所以一定要插USB线。
3:dnw下载时需要设置dnw下载内存地址。在dnw软件的菜单“Configuration”中设置Download Address为0xd0020010,确认即可。

之前安装fastboot驱动时,是在终端输入了一个fastboot命令后才激活数据线的,现在怎么激活呢?

1、数据线已连接;

2、拨码开关在USB端;

3、一直按着开机键(因为是裸机程序);

dnw驱动安装
X210开发板使用了软开关,但是我们这里还没到操作系统去处理开关,所以在整个裸机实验中必须手工按下POWER键才能保持开机,只要手一抬起来就关机了····
dnw驱动装好的标志是:开发板开机从usb启动后,设备管理器中显示已经安装的设备,并且关键是dnw工具中USB:OK

要一直按着就OK,一松手就没了。

裸机程序下载地址设置
从usb启动做裸机实验时,因为不需要16字节的校验头,所以直接下载到0xd0020010,端口默认即可。

下载裸机程序


usb启动裸机实验总结
usb启动方式主要是用来调试程序的,其实分析S5PV210即可知道,我们这里是把裸机程序当作BL1来使用了。

扩充知识:Win7 X64版本驱动安装非常麻烦,因为微软启用了USB设备驱动签名政策。

参考上方fastboot驱动的许可证解决方法。

SD卡调试 

一般情况下,用USB下载来调试裸机程序比较方便;但是有时候电脑使用dnw会频繁蓝屏,这时候用SD卡下载调试是不错选择。
把pin打到EMMC,以从SD通道启动。
从SD启动时会先从iNand(SD0)启动执行,当iNand启动做校验和时失败才会转为启动SD2。而我们做裸机实验时是通过SD2来提供裸机程序镜像的,因此需要先破坏内部iNand的uboot才可以强迫开发板从SD2启动去执行我们的裸机程序。 擦除操作和制作SD卡的过程参考前面开发版启动的内容。

总结:如果你的电脑本身支持usb启动下载而且不蓝屏,建议以后做实验用usb下载调试。

调试和刷机都是用的同一根数据线,二者有何区别?

刷机是永久性的,而调试是临时的。

怎么理解呢?

刷机就是把相关程序直接烧录到iNand中,启动时按照默认方式从iNand中读取系统即可。

调试时相当于BL0直接从电脑端读取程序去运行,这时候电脑端等同于一个iNand介质。 

问题总结

在用USB调试时,遇到一个问题,即上一次连接是可用的,到了第二天再连接时设备管理器那里没有任何反应,可是激活的条件都是有的,问题出在哪了?

搞了半天,才发现原来我打开了虚拟机,此时会让你选择是连在主机上还是连接在虚拟机上,关键这个信息是在虚拟机里显示的,找了半天才找到原因。

本文标签: 嵌入式 基础知识