最后更新:2013-11-28
什么是多重启动
在折腾嵌入式开发期间,
你会发现,很多开发板,有的支持多种启动模式。
比如,既可以从Nor Flash中启动,也可以从SD中启动,甚至也支持直接从Nand Flash启动。
即,支持了多种方式去启动的,就叫做多重启动。
什么是从某种介质中启动?
所谓的,支持从哪种介质中启动,意味着:
你只要按照其所规定的数据的格式,将对应的程序,比如Bootloader(Uboot)烧录到对应的位置
然后设置好从该中介质中启动,
然后系统上电后,就可以直接从该种介质中读取对应的数据
加载到内存中,然后就可以正常执行了
系统就可以正常运行了
开发板就跑起来了。
多重启动是需要对应的CPU支持的
此处总结一下,关于嵌入式系统中,常见的,多重启动,即可以从多种不同的介质中启动系统,
方面的事情。
其是需要对应的SoC支持的。
以AMS的AS3536解释多重启动的具体含义
(1)AMS的AS3536这个SoC,其就支持多种启动模式:
简单说,就有:
Nand Flash
SLC NAND flash memory
MLC NAND flash memory
LBA NAND flash memory
Nor Flash
ST Microelectronics NOR flash
Atmel NOR flash
IDE:IDE drive
SD卡:SD cards / iNand
SPI:SPI slave device
串口:CLI modes (UART1)
等等。
对应的,可以从AS3536的datasheet中看到对应的启动模式的定义:
对应的开发板上,会有对应的拨号开关的:
比如,我之前弄过的AS3536评估板:
上面就有那个Boot Selector:
你可以根据自己的需要,拨到对应的启动模式上。
以Freescale的P2040举例说明多重启动
比如在:
p2040 booting from spi flash | Freescale Community
中看到的:
P2040: QorIQ P2040/P2041 Low-End Quad-Core Communications Processors with Data Path
即Freescale的P2040:
其也是支持多种启动,至少有:
- eSPI
- SD
- NAND Flash
而想要实现从某种介质中启动。
在硬件满足条件的前提下,即该SoC支持对应的启动方式的前提下,再去把对应的启动程序
(嵌入式一般是对应的bootloader,最常见的bootloader是uboot)
烧录(写入)到对应的介质上(的对应的位置)
然后再把拨码开关/dip开关/jumper,设置/跳到对应的位置。
如此,开发板上电后,才可以从对应的介质种启动。
关于软件上的uboot如何写入对应介质,以及硬件如何设置开关,详见:
p2040 booting from spi flash | Freescale Community
相对比较常见的启动模式
Nor Flash:目前市面上,多数的嵌入式CPU都是从Nor Flash上启动的
Nand Flash:好像市面上多数CPU都不支持从Nand Flash上启动。目前个人所知道的,就只有个别的三星的SoC,支持直接从Nand Flash上启动。
对应的是烧录uboot到前4K的空间,然后就可以正常启动了。
SD卡:好像,只有部分的开发板才支持从SD卡上启动。
举例说明如何实现从某种介质中启动
此处,以SD卡来举例,说明如何实现,从SD启动。
需要做哪些事情。
首先,正常的,准备好的你系统的程序。
对于典型的嵌入式Linux系统就是:
uboot+kernel+rootfs
对应的,此处,打算:
不仅要从SD卡启动,还要实现:
整个系统的kernel数据和rootfs数据,都放在SD上
可以实现:
整个系统,存储介质,无需Nand Flash
只要SD卡,即可,正常让Linux跑起来了。
对于这样的需求,
此处,先要从SD启动。
需要去做的事情是:
搞清楚,对于SoC中规定的,从SD启动,
除了开发板上,拨了对应的启动开关设置从SD卡启动之外
软件上,需要去:
1.准备好对应的uboot等数据供烧写到SD上。
2.一般是从Uboot中,下载数据到内存,然后再烧写到SD上。
具体过程,详见:
3.对于将uboot烧录到SD卡的何处,是需要找到对应的SoC相关的资料才知道的。
此处,我这里,给出对应的截图,供参考:
其规定了:
需要烧录到SD的末尾的位置。
而对应的位置是:
0x7C000=496KB
即:
在496KB往前,烧录你的Uboot
如此之后:
系统上电后,自动会从496KB往前,读取对应的数据
此处即为uboot
然后加载到内存中,
运行Uboot
接着就可以正常运行kernel和rootfs
正常的嵌入式Linux就可以跑起来了。
总结
总之:
嵌入式的多重启动,是需要对应的:
硬件的CPU:SoC支持的,并(一般是拨号开关等)设置成对应的启动模式;
然后加上软件的配合:烧录合适的程序到合适的位置;
如此,软硬件结合,才可以实现,从某种特定的介质,启动系统。