嵌入式 嵌入式设备
回帖(1)
2021-12-23 15:39:02
导读:本文将以主流学习芯片为例,梳理以下典型的嵌入式Linux设备的启动流程,目前比较流行的学习型芯片有S5PV210、S3C2440、AM335x、IMX6ULL、STM32MP157。
0、基础概念
BL0:SOC内置在iROM里的代码,是芯片厂商事先烧好的代码,这部分代码会根据指定的引脚电平决定从什么设备启动。BL0就是Nand Flash,NorFlash,iNand等设备的复制函数(因为要读Flash,所以要简单初始化以下Flash),他的主要工作是把BL1从Flash中拷贝到iRAM或NorFlash上运行。(BL0是SOC出厂前设置的,芯片厂商也不知道板子上将来接的是什么样的DRAM,因此配置和初始化内存和Flash就交给BL1做)
BL1:是开发人员编写的代码,可以是自己写的裸机程序,也可以是uboot或其他。BL0只做了存储器的部分初始化,BL1需要关看门狗,设置时钟,设置异常中断向量表等工作。
iRAM:Internal SRAM 芯片内置的内存,可以直接运行程序。
SOC:System on Chip系统级别芯片,芯片内部集成cpu,内存,Flash等控制器,cache等
注:系统刚上电时,内存和Flash都没有被初始化而无法使用,只有iRAM(一般十几K)可以使用,而正真的代码在Flash里,Flash(Nor除外)不能直接运行程序。硬件相关介绍参考:ARM嵌入式硬件介绍
1、S3C2440
- 介绍
S3C2440三星公司研发的一款基于ARM920T内核的32位CMOS微控制器,主频最高400MHZ,结构相对简单,总体性能比S3C6410差。无iROM,4K iRAM。
- S3C2440内存地址表
- 如上图右侧所示,当外接了NandFlash并设置OM引脚为Nand启动,由于程序不能在nand上运行程序,所以片内4K内存(iRAM)的0地址就是整个内存的0地址;
- 当外接了NorFlash并设置OM引脚为Nor启动时,NorFlash的0地址就是内存的0地址,片内RAM基地址为0x4000_0000。
- S3C2440上电后从0地址开始运行,如果是nand启动则从iRAM上开始运行,如果时Nor启动就从NorFlash上开始运行。
- 外接Nand Flash时启动流程
此时iRAM(片内内存)基地址为内存0地址。
- 第一步:Reset复位后,Nand Flash控制器将Nand前4K代码复制到stepping stone中运行。
- 第二步:这部分代码负责配置内存和Flash,然后将uboot代码复制到内存中,然后跳转到内存中运行。
- 第三步:最后uboot启动Linux内核(OS),然后内核去挂载根文件系统,进入命令行启动应用程序。
- 外接Nor Flash时启动流程
此时NorFlash的0地址为内存0地址。
- 第一步:Reset复位后,程序直接从NorFlash开始运行,初始化内存,将uboot拷贝到内存中
- 第二步:跳转到内存中运行,然后启动内核。
补充:NorFlash参与内存统一编址,即通过指针指向NorFlash内存地址直接操作Nor,而nand不参与,需要操作nand控制器来读写nand。
2、S3C6410
- 介绍
S3C6410是三星推出的基于ARM11架构的应用级SOC,主频最高667MHz
IROM(0x0800 0000)64M 只用了32K作为BL0, 0地址映射到IROM
IRAM(0x0C00 0000)64M 只用了8K,加载BL1,作为steppingstone
- 启动流程
- 第一步:Reset复位后,从iROM中读取BL0执行,BL0将BL1复制到iRAM中运行
- 第二步:BL1初始化配置内存和Flash,然后将BL2(uboot主体代码)复制到内存中,然后跳转到内存中运行(uboot会判断自己是在iRAM中运行还是内存中运行,如果是iRAM则跳转到内存中运行;如果是在内存中则直接跳转到主体代码运行)。可以参考S3C6410启动流程。
- 第三步:BL2负责启动Linux内核(OS),然后内核去挂载根文件系统,进入命令行启动应用程序。
3、S5PV210
- 介绍
S5PV210是三星推出的一款适用于智能手机和平板电脑等多媒体设备的应用处理器,采用了ARM Cortex-A8内核,32K一级缓存、512K二级缓存,工作频率高达1GHz,支持2D/3D图形加速,支持全高清、多标准的视频编码。
IROM(0XD000 0000) ,大小为64KB,对于0地址处,是启动区域,也是采用的映射方式,与6410一样;
IRAM(,0xD002 0000),大小96KB,加载 BL1+BL2,steppingstone;
- 启动流程
- 第一步:CPU上电后运行BL0,BL0会从相应的外部存储器去读取第一部分启动代码(BL1,大小为16KB)到iRAM运行。
- 第二步:BL1负责初始化Flash,然后将BL2读取到iRAM(剩余的80KB)运行
- 第三步:BL2负责初始化内存,将内核(OS)读取到内存中,然后启动内核。
- uboot启动流程
由于uboot一般远大于96K,实际上uboot并没有按照上述流程启动,uboot编译后会生成uboot-spl.bin(BL1)和uboot.bin,启动步骤如下:
- 第一步:上电后BL0开始运行,将uboot-spl.bin(BL1)加载到iRAM中运行
- 第二步:uboot-spl.bin直接去初始化内存和Flash,直接将uboot.bin复制到内存中,然后跳转到内存中运行,绕开了BL2。
- 第三步:uboot.bin运行,启动内核。
- S5PV210二次启动
BL0加载BL1后会计算BL1的校验和,如果不通过则启动失败,进行第二次启动,则从第二个设备读取BL1,如果校验还是不通过则通过串口启动,如果失败则通过USB启动,如果还是失败则整个启动过程失败,只要有一个成功就执行BL1。
4、AM335x和IMX6ULL
- 介绍
AM335X是TI(德州仪器)推出的基于 ARM Cortex-A8内核的微处理器,最高主频可以达600M/800M/1GHz,带NEON协处理器,二级高速缓存,24位LCD控制器和触摸屏控制器,分辨率高达2048*2048。
IMX6ULL是NXP(恩智浦)推出的基于ARM Cortex-A7内核的微处理器,最高主频800MHz,
- 启动过程
- AM335x
启动流程和S5PV210类似,支持多种设备启动,SOC内部会保存一份启动设备的列表,然后按照这个列表的顺序去读取BL1,读取成功就执行BL1,失败就去找下一个启动设备,如果这是最后一个启动设备,就进入死循环。BL1就负责初始化Flash和内存,然后运行uboot主体代码,再启动Linux内核。
- IMX6ULL
IMX6ULL启动流程和AM335x一样,第一次启动失败就会判断是不是第一个镜像,如果是就设置SW引脚,指定下一次启动为第二个启动设备,然后复位重启。
4、总结
这些芯片启动流程都比较相似,上电后运行BL0,BL0去启动BL1,BL1初始化内存和Flash,然后将代码复制到内存,再跳转到内存中运行。
导读:本文将以主流学习芯片为例,梳理以下典型的嵌入式Linux设备的启动流程,目前比较流行的学习型芯片有S5PV210、S3C2440、AM335x、IMX6ULL、STM32MP157。
0、基础概念
BL0:SOC内置在iROM里的代码,是芯片厂商事先烧好的代码,这部分代码会根据指定的引脚电平决定从什么设备启动。BL0就是Nand Flash,NorFlash,iNand等设备的复制函数(因为要读Flash,所以要简单初始化以下Flash),他的主要工作是把BL1从Flash中拷贝到iRAM或NorFlash上运行。(BL0是SOC出厂前设置的,芯片厂商也不知道板子上将来接的是什么样的DRAM,因此配置和初始化内存和Flash就交给BL1做)
BL1:是开发人员编写的代码,可以是自己写的裸机程序,也可以是uboot或其他。BL0只做了存储器的部分初始化,BL1需要关看门狗,设置时钟,设置异常中断向量表等工作。
iRAM:Internal SRAM 芯片内置的内存,可以直接运行程序。
SOC:System on Chip系统级别芯片,芯片内部集成cpu,内存,Flash等控制器,cache等
注:系统刚上电时,内存和Flash都没有被初始化而无法使用,只有iRAM(一般十几K)可以使用,而正真的代码在Flash里,Flash(Nor除外)不能直接运行程序。硬件相关介绍参考:ARM嵌入式硬件介绍
1、S3C2440
- 介绍
S3C2440三星公司研发的一款基于ARM920T内核的32位CMOS微控制器,主频最高400MHZ,结构相对简单,总体性能比S3C6410差。无iROM,4K iRAM。
- S3C2440内存地址表
- 如上图右侧所示,当外接了NandFlash并设置OM引脚为Nand启动,由于程序不能在nand上运行程序,所以片内4K内存(iRAM)的0地址就是整个内存的0地址;
- 当外接了NorFlash并设置OM引脚为Nor启动时,NorFlash的0地址就是内存的0地址,片内RAM基地址为0x4000_0000。
- S3C2440上电后从0地址开始运行,如果是nand启动则从iRAM上开始运行,如果时Nor启动就从NorFlash上开始运行。
- 外接Nand Flash时启动流程
此时iRAM(片内内存)基地址为内存0地址。
- 第一步:Reset复位后,Nand Flash控制器将Nand前4K代码复制到stepping stone中运行。
- 第二步:这部分代码负责配置内存和Flash,然后将uboot代码复制到内存中,然后跳转到内存中运行。
- 第三步:最后uboot启动Linux内核(OS),然后内核去挂载根文件系统,进入命令行启动应用程序。
- 外接Nor Flash时启动流程
此时NorFlash的0地址为内存0地址。
- 第一步:Reset复位后,程序直接从NorFlash开始运行,初始化内存,将uboot拷贝到内存中
- 第二步:跳转到内存中运行,然后启动内核。
补充:NorFlash参与内存统一编址,即通过指针指向NorFlash内存地址直接操作Nor,而nand不参与,需要操作nand控制器来读写nand。
2、S3C6410
- 介绍
S3C6410是三星推出的基于ARM11架构的应用级SOC,主频最高667MHz
IROM(0x0800 0000)64M 只用了32K作为BL0, 0地址映射到IROM
IRAM(0x0C00 0000)64M 只用了8K,加载BL1,作为steppingstone
- 启动流程
- 第一步:Reset复位后,从iROM中读取BL0执行,BL0将BL1复制到iRAM中运行
- 第二步:BL1初始化配置内存和Flash,然后将BL2(uboot主体代码)复制到内存中,然后跳转到内存中运行(uboot会判断自己是在iRAM中运行还是内存中运行,如果是iRAM则跳转到内存中运行;如果是在内存中则直接跳转到主体代码运行)。可以参考S3C6410启动流程。
- 第三步:BL2负责启动Linux内核(OS),然后内核去挂载根文件系统,进入命令行启动应用程序。
3、S5PV210
- 介绍
S5PV210是三星推出的一款适用于智能手机和平板电脑等多媒体设备的应用处理器,采用了ARM Cortex-A8内核,32K一级缓存、512K二级缓存,工作频率高达1GHz,支持2D/3D图形加速,支持全高清、多标准的视频编码。
IROM(0XD000 0000) ,大小为64KB,对于0地址处,是启动区域,也是采用的映射方式,与6410一样;
IRAM(,0xD002 0000),大小96KB,加载 BL1+BL2,steppingstone;
- 启动流程
- 第一步:CPU上电后运行BL0,BL0会从相应的外部存储器去读取第一部分启动代码(BL1,大小为16KB)到iRAM运行。
- 第二步:BL1负责初始化Flash,然后将BL2读取到iRAM(剩余的80KB)运行
- 第三步:BL2负责初始化内存,将内核(OS)读取到内存中,然后启动内核。
- uboot启动流程
由于uboot一般远大于96K,实际上uboot并没有按照上述流程启动,uboot编译后会生成uboot-spl.bin(BL1)和uboot.bin,启动步骤如下:
- 第一步:上电后BL0开始运行,将uboot-spl.bin(BL1)加载到iRAM中运行
- 第二步:uboot-spl.bin直接去初始化内存和Flash,直接将uboot.bin复制到内存中,然后跳转到内存中运行,绕开了BL2。
- 第三步:uboot.bin运行,启动内核。
- S5PV210二次启动
BL0加载BL1后会计算BL1的校验和,如果不通过则启动失败,进行第二次启动,则从第二个设备读取BL1,如果校验还是不通过则通过串口启动,如果失败则通过USB启动,如果还是失败则整个启动过程失败,只要有一个成功就执行BL1。
4、AM335x和IMX6ULL
- 介绍
AM335X是TI(德州仪器)推出的基于 ARM Cortex-A8内核的微处理器,最高主频可以达600M/800M/1GHz,带NEON协处理器,二级高速缓存,24位LCD控制器和触摸屏控制器,分辨率高达2048*2048。
IMX6ULL是NXP(恩智浦)推出的基于ARM Cortex-A7内核的微处理器,最高主频800MHz,
- 启动过程
- AM335x
启动流程和S5PV210类似,支持多种设备启动,SOC内部会保存一份启动设备的列表,然后按照这个列表的顺序去读取BL1,读取成功就执行BL1,失败就去找下一个启动设备,如果这是最后一个启动设备,就进入死循环。BL1就负责初始化Flash和内存,然后运行uboot主体代码,再启动Linux内核。
- IMX6ULL
IMX6ULL启动流程和AM335x一样,第一次启动失败就会判断是不是第一个镜像,如果是就设置SW引脚,指定下一次启动为第二个启动设备,然后复位重启。
4、总结
这些芯片启动流程都比较相似,上电后运行BL0,BL0去启动BL1,BL1初始化内存和Flash,然后将代码复制到内存,再跳转到内存中运行。
举报
更多回帖