【整理】嵌入式系统中的多重启动是需要对应的CPU/SoC/MCU支持的

最后更新: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 support multiple boot bootloader startup options

 

对应的开发板上,会有对应的拨号开关的:

比如,我之前弄过的AS3536评估板:

as353x application board eye view

上面就有那个Boot Selector:

as353x boot select detail view

你可以根据自己的需要,拨到对应的启动模式上。

 

 

以Freescale的P2040举例说明多重启动

比如在:

p2040 booting from spi flash | Freescale Community

中看到的:

P2040: QorIQ P2040/P2041 Low-End Quad-Core Communications Processors with Data Path

即Freescale的P2040:

P2040 block diagram overview

其也是支持多种启动,至少有:

  • 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 card layout for boot from sd

其规定了:

需要烧录到SD的末尾的位置。

而对应的位置是:

0x7C000=496KB

即:

在496KB往前,烧录你的Uboot

如此之后:

系统上电后,自动会从496KB往前,读取对应的数据

此处即为uboot

然后加载到内存中,

运行Uboot

接着就可以正常运行kernel和rootfs

正常的嵌入式Linux就可以跑起来了。

总结

总之:

嵌入式的多重启动,是需要对应的:

硬件的CPU:SoC支持的,并(一般是拨号开关等)设置成对应的启动模式;

然后加上软件的配合:烧录合适的程序到合适的位置;

如此,软硬件结合,才可以实现,从某种特定的介质,启动系统。



发表评论

电子邮件地址不会被公开。 必填项已用*标注

无觅相关文章插件,快速提升流量