1. Uboot 和 BootLoader
BootLoader:引导程序,在嵌入式linux中,没有BIOS,而是直接从flash中运行,来装载内核。它可以初始化硬件设备,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统做好准备。
Uboot:是BootLoader中的一种
2. NorFlash、NandFlash和eMMC
Nor:NOR地址线和数据线分开,来了地址和控制信号,数据就出来。所以NOR芯片可以像SRAM一样连在数据线上。(s3c2440)以Nor启动时,nor flash被映射到0x00000000地址(就是nGCS0,这里就不需要片内SRAM来辅助了,所以片内SRAM的起始地址还是0x40000000). 然后cpu从0x00000000开始执行(也就是在Norfalsh中执行)。
Nand:地址线和数据线在一起,需要用程序来控制,才能出数据。cpu会自动从NAND flash中读取前4KB的数据放置在片内SRAM里(s3c2440是soc),同时把这段片内SRAM映射到nGCS0片选的空间(即0x00000000)。cpu是从0x00000000开始执行,也就是NAND flash里的前4KB内容。因为NAND FLASH连地址线都没有,不能直接把NAND映射到0x00000000,只好使用片内SRAM做一个载体。通过这个载体把nandflash中大代码复制到RAM(一般是SDRAM)中去执行。
eMMC:eMMC 相当于 NandFlash+主控IC ,对外的接口协议与SD、TF卡一样,主要是针对手机或平板电脑等产品的内嵌式存储器标准规格。eMMC的一个明显优势是在封装中集成了一个控制器,它提供标准接口并管理闪存,使得手机厂商就能专注于产品开发的其它部分,并缩短向市场推出产品的时间。这些特点对于希望通过缩小光刻尺寸和降低成本的NAND供应商来说,同样的重要。
3. 启动地址
以2440为例,
总结:
- 以Nor启动时,cpu从norflash中读取指令,运行时的栈在片内RAM中,而此时norflash被映射到nGCS0片选的Bank0空间,其地址被映射为0x0000 0000;即启动地址为0x0000 0000;而片内4K RAM的地址被映射为0x4000 0000,栈底设置为0x4000 0000 + 4096;
- 以Nand启动时,0地址线会连接到起步石(stepping stone,即片内4K RAM)上面,同时CPU会通过内部的硬件将NAND FLASH开始的4K数据复制到起步石里面,启动地址还是0x00000000,栈底设置为0x0000 0000 + 4096;
下面这段摘自:为什么nor启动要将sp设置为0x40000000+4096 ?
1.先解释0x40000000如何来?
用NOR启动时,片内的存储控制器的BANK0-BANK7这8个BANK都对应了其他用途,所以设计者在BANK7结束的地址0x40000000的地方作为
NOR FLASH的启动地址,而NAND FLASH启动的地址则是0x00000000。请看下图:
- 为什么要+4096?
因为对于启动文件.S来说,4K的空间是足够存放,代码段、BSS…和堆栈段了,因为堆栈的SP是从高地址往低地址移动的,所以要将堆栈的起始地址放在堆栈段的高地址;
你也可以不用设置成4096,但要保证堆栈的长度不能和下面其他段重叠,若重叠,就会出BUG,保险值是4096,因为SRAM就是4K设计的。
下面这段摘自:关于S3C2440存储器地址分配和启动流程分析
- 从NorFlash启动时,与nGCS0相连的NorFlash就被映射到nGCS0片选的Bank0空间,其地址被映射为0x0000 0000;
- 从NandFlash启动时,S3C2440芯片内部自带的一块容量为4K的被称为“Steppingstone”(起步石)的BootRAM被映射到nGCS0片选的Bank0空间,其地址被映射为0x0000 0000。当系统上电或复位时,程序会从0x0地址处开始执行,因此我们编写的启动代码要确保存储在0地址处。如果系统的所有程序在编译链接后的大小小于4K,那在系统的启动代码中无需考虑将程序从NandFlash搬运到SDRAM这个问题,因为所有的程序在启动时即全部由NandFlash拷贝至BootSRAM,程序在BootSRAM中运行即可;如果系统的所有程序在编译链接后的大小大于4K,那在系统的启动代码中就需要包含一段将系统的全部程序从NandFlash搬运到SDRAM的代码,因为系统启动时只将NandFlash的前4K拷贝到了BootSRAM中,还有部分程序在NandFlash中,而程序在NandFlash中是无法运行的,需要将所有程序拷贝至SDRAM并在其中运行,所以系统的启动代码中要包含这段有关程序拷贝的代码,并在所有程序拷贝完成后使程序跳转到SDRAM中运行。也就是说NandFlash启动时需要考虑到涉及的两次搬移,第一次搬运是S3C2440硬件机制自动实现的,无需干预,第二次搬运需要程序员来实现,搬运程序量大小是系统的所有程序。
下面这段摘自:S3C2440 存储器地址映射
ARM9作为32位的CPU,理论上可以使用的地址范围可以达到2的32次方等于4G,除去上述的1G地址空间,还有一部分是CPU内部寄存器的地址,剩下的地址空间没有使用。那么,0x4000 0000以后的地址是怎样映射的呢?
0x4000 0000——0x4000 0FFF 从NOR Flash启动时片内4KB SRAM映射在这个地址范围,而从NAND启动时片内4KB SRAM映射在0x0000 0000地址,则这个地址范围是保留的。
0x4000 0FFF——0x4800 0000 保留
0x4800 0000——0x6000 0000 特殊功能寄存器的地址
0x6000 0000——0xFFFF FFFF 未用
其中特殊功能寄存器的地址分布如下所示:
表2-14 S3C2440设备寄存器地址空间
外接设备 | 起始地址 | 结束地址 |
---|---|---|
存储控制器 | 0x48000000 | 0x48000030 |
USB Host控制器 | 0x49000000 | 0x49000058 |
中断控制器 | 0x4A000000 | 0x4A00001C |
DMA | 0x4B000000 | 0x4B0000E0 |
时钟和电源管理 | 0x4C000000 | 0x4C000014 |
LCD控制器 | 0x4D000000 | 0x4D000060 |
NAND FLASH控制器 | 0x4E000000 | 0x4E000014 |
摄像头接口 | 0x4F000000 | 0x4F0000A0 |
UART | 0x50000000 | 0x50008028 |
脉宽调制计时器 | 0x51000000 | 0x51000040 |
USB设备 | 0x52000140 | 0x5200026F |
WATCHDOG计时器 | 0x53000000 | 0x53000008 |
IIC控制器 | 0x54000000 | 0x5400000C |
IIS控制器 | 0x55000000 | 0x55000012 |
I/O端口 | 0x56000000 | 0x560000B0 |
实时时钟RTC | 0x57000040 | 0x5700008B |
A/D转换器 | 0x58000000 | 0x58000010 |
SPI | 0x59000000 | 0x59000034 |
SD接口 | 0x5A000000 | 0x5A000040 |
AC97音频编码接口 | 0x5B000000 | 0x5B00001C |
具体这些地址是如何映射的,可以参考《对S3C2440特殊功能寄存器地址的深入挖掘》
以上部分源自:http://www.linuxidc.com/Linux/2011-11/46479.htm
4. 程序下载一般流程
1. 首先将u-boot程序烧写到NorFlash
2. 开发板设置为nor启动,上电进入uboot
3. 通过uboot接收并烧写bin文件到NandFlash
4. 设置Nand启动