嵌入式基本概念

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为例,
总结:

  1. 以Nor启动时,cpu从norflash中读取指令,运行时的栈在片内RAM中,而此时norflash被映射到nGCS0片选的Bank0空间,其地址被映射为0x0000 0000;即启动地址为0x0000 0000;而片内4K RAM的地址被映射为0x4000 0000,栈底设置为0x4000 0000 + 4096;
  2. 以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。请看下图:

  1. 为什么要+4096?
    因为对于启动文件.S来说,4K的空间是足够存放,代码段、BSS…和堆栈段了,因为堆栈的SP是从高地址往低地址移动的,所以要将堆栈的起始地址放在堆栈段的高地址;
    你也可以不用设置成4096,但要保证堆栈的长度不能和下面其他段重叠,若重叠,就会出BUG,保险值是4096,因为SRAM就是4K设计的。

下面这段摘自:关于S3C2440存储器地址分配和启动流程分析

  1. 从NorFlash启动时,与nGCS0相连的NorFlash就被映射到nGCS0片选的Bank0空间,其地址被映射为0x0000 0000;
  2. 从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设备寄存器地址空间

外接设备起始地址结束地址
存储控制器0x480000000x48000030
USB Host控制器0x490000000x49000058
中断控制器0x4A0000000x4A00001C
DMA0x4B0000000x4B0000E0
时钟和电源管理0x4C0000000x4C000014
LCD控制器0x4D0000000x4D000060
NAND FLASH控制器0x4E0000000x4E000014
摄像头接口0x4F0000000x4F0000A0
UART0x500000000x50008028
脉宽调制计时器0x510000000x51000040
USB设备0x520001400x5200026F
WATCHDOG计时器0x530000000x53000008
IIC控制器0x540000000x5400000C
IIS控制器0x550000000x55000012
I/O端口0x560000000x560000B0
实时时钟RTC0x570000400x5700008B
A/D转换器0x580000000x58000010
SPI0x590000000x59000034
SD接口0x5A0000000x5A000040
AC97音频编码接口0x5B0000000x5B00001C

具体这些地址是如何映射的,可以参考《对S3C2440特殊功能寄存器地址的深入挖掘》
以上部分源自:http://www.linuxidc.com/Linux/2011-11/46479.htm

4. 程序下载一般流程
 1. 首先将u-boot程序烧写到NorFlash
 2. 开发板设置为nor启动,上电进入uboot
 3. 通过uboot接收并烧写bin文件到NandFlash
 4. 设置Nand启动

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值