关于s3c2410从NAND Flash启动的问题--bootrom 4KB限制

发布者:DazzlingSpirit最新更新时间:2016-07-26 来源: eefocus关键字:s3c2410  NAND  Flash  启动 手机看文章 扫描二维码
随时随地手机看文章
用的是S3C2410.见附件start.s 其中关于nand flash启动的那一段一直百思不得其解,按说从NAND FLASH启动时, 应该是前4KB映射到NGCS0,其中的代码将NAND中存放的程序拷贝到RAM中,但该文件提供的程序好象是先从NAND拷贝 128K的代码到ResetEntry开始的地方,即地址为0的地方,然后再从ResetEntry处拷到RAM中,但此时NGCS0好象只有4KB的 RAM区,怎么能存储128K的代码,一直没想通.望高手指点,谢谢!

搞明白了,是两条指令的差别

LDR r0,=_entry和ADR r0,_entry

前者是在编译的时候按照load address生成的绝对地址,后者反汇编后是相对当前PC寻址,例如在ADS中设置RO地址为0X30000000,那么前者传给r0的值是 0x30000000,而后者传给r0的值要视当前PC而定,一般从NGCS0中启动时,传给r0的值就是0。

 

amsung S3C2410支持Nor Flash和Nand Flash启动,在SBC-2410X上可以通过BOOTSEL跳线设置启动方式:
    |------|
    | 。。 |      boot from nand flash
    |------|

------。。        boot from nor flash

注: 
(1) BOOTSEL跳线在"串口"和"usb slave接口"之间
(2) 两个引脚用"跳线卡"连接,则表示从nand flash启动。拔下"跳线卡"表示从nor flash启动。

 

椐了解 NOR FLASH 是容量小,速度快,稳定性好,适合做程序存储器。

NAND FLASH 总容量大,适合做数据存储器
是不能从NAND FLASH启动的,NAND FLASH是的读写时序是不能直接有ARM硬件产生的,要读写NAND FLASH是要通过程序来实现的,很明显能看出来的就是NAND FLASH只有8个数据、地址复用的数据地址接口
2410/2440可以直接从NAND FLASH启动的,因为它把NAND前面的4K映射到了RAM的空间

首先应该先了解Flash ROM的种类

NOR FLASH地址线和数据线分开,来了地址和控制信号,数据就出来。

NAND Flash地址线和数据线在一起,需要用程序来控制,才能出数据。

通俗的说,就是光给地址不行,要先命令,再给地址,才能读到NAND的数据。

而且都是在一个总线完成的。

结论是:ARM无法从NAND直接启动。除非装载完程序,才能使用NAND Flash.

装载程序只能从mask rom 或者Nor flash.

 

三星的2410可以从NF启动程序,它会把第一块的前4KB复制到内部SRAM中然后从SRAM执行,也就是说,你需要编写一个长度小于4K的引导程序,作用是将主程序拷贝到SDRAM中运行(NF地址不是线性的,程序不能直接运行,必须拷贝到线性RAM中)

从Nand Flash启动U-BOOT的基本原理
-------------------------------------------
前4K的问题
    如果S3C2410被配置成从Nand Flash启动(配置由硬件工程师在电路板设置), S3C2410的Nand Flash控制器有一个特殊的功能,在S3C2410上电后,Nand Flash控制器会自动的把Nand Flash上的前4K数据搬移到4K内部RAM中,并把0x00000000设置内部RAM的起始地址,CPU从内部RAM的0x00000000位置开始启动。这个过程不需要程序干涉。
    程序员需要完成的工作,是把最核心的启动程序放在Nand Flash的前4K中。
启动程序的安排
    由于Nand Flash控制器从Nand Flash中搬移到内部RAM的代码是有限的,所以在启动代码的前4K里,我们必须完成S3C2410的核心配置以及把启动代码(U-BOOT)剩余部分搬到RAM中运行。


    u-boot源码不支持从nand flash启动,可是s3c2410支持从nand flash启动,开发板(sbc-2410x)加电后s3c2410将nand flash的前4k(保存有u-boot的部分功能--拷贝功能--把nand flash中的内容拷贝到SDRAM)拷贝到sram(s3c2410芯片内的sram)。这就需要修改u-boot源码,增加u-boot的功能: 使u-boot在得到执行权后能够将其自身拷贝到开发板上SDRAM中,以便处理器能够执行u-boot

 

.Nand Flash的命令、地址、数据都通过I/O口发送,管脚复用,这样做做的好处是,可以明显减少NAND FLASH的管脚数目,将来如果设计者想将NAND FLASH更换为更高密度、更大容量的,也不必改动电路板。

 NAND FLASH不能够执行程序,本人总结其原因如下 :

1. NAND FLASH本身是连接到了控制器上而不是系统总线上。CPU启动后是要取指令执行的,如果是SROM、NOR FLASH 等之类的,CPU 发个地址就可以取得指令并执行,NAND FLASH不行,因为NAND FLASH 是管脚复用,它有自己的一套时序,这样CPU无法取得可以执行的代码,也就不能初始化系统了。

 2. NAND FLASH是顺序存取设备,不能够被随机访问,程序就不能够分支或跳转,这样你如何去设计程序。

U-BOOT 支持ARM、 PowerPC等多种架构的处理器,也支持Linux、NetBSD和VxWorks等多种操作系统,主要用来开发嵌入式系统初始化代码 bootloader。bootloader是芯片复位后进入操作系统之前执行的一段代码,完成由硬件启动到操作系统启动的过渡,为运行操作系统提供基本的运行环境,如初始化CPU、堆栈、初始化存储器系统等,其功能类似于PC机的BIOS.


NAND闪存工作原理

       S3C2410开发板的NAND闪存由NAND闪存控制器(集成在S3C2410 CPU中)和NAND闪存芯片(K9F1208U0A)两大部分组成。当要访问NAND闪存芯片中的数据时,必须通过NAND闪存控制器发送命令才能完成。所以, NAND闪存相当于S3C2410的一个外设,而不位于它的内存地址区。

       NAND闪存(K9F1208U0A)的数据存储结构分层为:1设备(Device) = 4096 块(Block);1块= 32页/行(Page/row);1页= 528B = 数据块 (512B) + OOB块 (16B)
在每一页中,最后16个字节(又称OOB)在NAND闪存命令执行完毕后设置状态,剩余512个字节又分为前半部分和后半部分。可以通过NAND闪存命令00h/01h/50h分别对前半部、后半部、OOB进行定位,通过NAND闪存内置的指针指向各自的首地址。
NAND 闪存的操作特点为:擦除操作的最小单位是块;NAND闪存芯片每一位只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前一定要将相应块擦 除;OOB部分的第6字节为坏快标志,即如果不是坏块该值为FF,否则为坏块;除OOB第6字节外,通常用OOB的前3个字节存放NAND闪存的硬件 ECC(校验寄存器)码;
   
从NAND闪存启动U-BOOT的设计思路

       如果S3C2410被配置成从NAND闪存启动,上电后,S3C2410的NAND闪存控制器会自动把NAND闪存中的前4K数据搬移到内部RAM中, 并把0x00000000设置为内部RAM的起始地址, CPU从内部RAM的0x00000000位置开始启动。因此要把最核心的启动程序放在NAND闪存的前4K中。

       由于NAND闪存控制器从NAND闪存中搬移到内部RAM的代码是有限的,所以, 在启动代码的前4K里,必须完成S3C2410的核心配置,并把启动代码的剩余部分搬到RAM中运行。在U-BOOT中, 前4K完成的主要工作就是U-BOOT启动的第一个阶段(stage1)。 
根据U-BOOT的执行流程图,可知要实现从NAND闪存中启动U-BOOT,首先需要初始化NAND闪存,并从NAND闪存中把U-BOOT搬移到RAM中,最后需要让U-BOOT支持NAND闪存的命令操作。
  
开发环境

       本设计中目标板硬件环境如下:CPU为S3C2410,SDRAM为HY57V561620,NAND闪存为64MB的K9F1208U0A。

       主机软件环境为Redhat9.0、 u-boot-1.1.3、gcc 2.95.3。修改U-BOOT的Makefile,加入:
wch2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t wch2410 NULL s3c24x0

       即将开发板起名为wch2410,接下来依次进行如下操作:
mkdir board/wch2410
cp board/smdk2410 board/wch2410
mv smdk2410.c wch2410.c
cp include/configs/smdk2410.h include/configs/wch2410.h
export PATH=/usr/local/arm/2.95.3/bin:$PATH

       最后执行:
make wch2410_config
make all ARCH=arm
生成u-boot.bin,即通过了测试编译。 
具体设计

支持NAND闪存的启动程序设计
       因为U-BOOT的入口程序是/cpu/arm920t/start.S,故需在该程序中添加NAND闪存的复位程序,以及实现从NAND闪存中把U-BOOT搬移到RAM中的功能程序。

       首先在/include/configs/wch2410.h中加入CONFIG_S3C2410_NAND_BOOT, 如下:
#define CONFIG_S3C2410_NAND_BOOT 1      @支持从NAND 闪存中启动
然后在/cpu/arm920t/start.S中添加
#ifdef CONFIG_S3C2410_NAND_BOOT
copy_myself:
mov r10, lr
ldr sp, DW_STACK_START         @安装栈的起始地址
mov fp, #0                     @初始化帧指针寄存器
bl nand_reset                  @跳到复位C函数去执行,执行NAND闪存复位
.......
/*从NAND闪存中把U-BOOT拷贝到RAM*/
ldr r0, =UBOOT_RAM_BASE        @ 设置第1个参数: UBOOT在RAM中的起始地址
mov r1, #0x0                   @ 设置第2个参数:NAND闪存的起始地址
mov r2, #0x20000               @ 设置第3个参数: U-BOOT的长度(128KB)
bl nand_read_whole             @ 调用nand_read_whole(),把NAND闪存中的数据读入到RAM中
tst r0, #0x0                   @ 如果函数的返回值为0,表示执行成功
beq ok_nand_read                @ 执行内存比较,把RAM中的前4K内容与NAND闪存中的前4K内容进行比较, 如果完全相同, 则表示搬移成功

       其中,nand_reset (),nand_read_whole()被加在/board/wch2410/wch2410.c中。

支持U-BOOT命令设计
       在U-BOOT下 对nand闪存的支持主要是在命令行下实现对nand闪存的操作。对nand闪存实现的命令为:nand info(打印nand Flash信息)、nand device(显示某个nand闪存设备)、nand read(读取nand闪存)、nand write(写nand闪存)、nand erease(擦除nand闪存)、nand bad(显示坏块)等。

       用到的主要数据结构有:struct nand_flash_dev、struct nand_chip。前者包括主要的芯片型号、存储容量、设备ID、I/O总线宽度等信息;后者是具体对NAND闪存进行操作时用到的信息。

a. 设置配置选项
       修改/include/configs/wch2410.h,主要是在CONFIG_COMMANDS中打开CFG_CMD_NAND选项。定义NAND闪存控制器在SFR区中的起始寄存器地址、页面大小,定义NAND闪存命令层的底层接口函数等。

b. 加入NAND闪存芯片型号
       在/include/linux/mtd/ nand_ids.h中对如下结构体赋值进行修改:
static struct nand_flash_dev nand_flash_ids[] = {
......
{"Samsung K9F1208U0A", NAND_MFR_SAMSUNG, 0x76, 26, 0, 3, 0x4000, 0},
.......
                                                 }
这样对于该款NAND闪存芯片的操作才能正确执行。
c. 编写NAND闪存初始化函数
在/board/wch2410/wch2410.c中加入nand_init()函数。
void nand_init(void)
{
/* 初始化NAND闪存控制器, 以及NAND闪存芯片 */
nand_reset();
/* 调用nand_probe()来检测芯片类型 */
printf ("%4lu MB\n", nand_probe(CFG_NAND_BASE) >> 20);
}

该函数在启动时被start_armboot()调用。
    
       最后重新编译U-BOOT并将生成的u-boot.bin烧入NAND闪存中,目标板上电后从串口输出如下信息:
U-Boot 1.1.3 (Nov 14 2006 - 11:29:50)
U-Boot code: 33F80000 -> 33F9C9E4     BSS: -> 33FA0B28
RAM Configuration:
Bank #0: 30000000 64 MB
## Unknown Flash on Bank 0: ID 0xffff, Size = 0x00000000 = 0 MB
Flash:     0 kB
NAND:     64 MB
In:       serial
Out:      serial
Err:      serial
Hit any key to stop autoboot:     0
wch2410 #

结语

       以往将U-BOOT移植到ARM9平台中的解决方案主要针对的是ARM9中的NOR闪存,因为NOR闪存的结构特点致使应用程序可以直接在其内部运行,不用把代码读到RAM中,移植过程相对简单。从NAND闪存中启动U-BOOT的设计难点在于NAND闪存需要把U-BOOT的代码搬移到RAM中,并要让 U-BOOT支持NAND闪存的命令操作。本文介绍了实现这一设计的思路及具体程序。移植后,U-BOOT在嵌入式系统中运行良好。

参考文献

1 杜春雷 . ARM 体系结构与编程 [M]. 北京 : 清华大学出版社, 2003 
2 S3C2410 User''''''''s Mannual[Z].Samsung

关键字:s3c2410  NAND  Flash  启动 引用地址:关于s3c2410从NAND Flash启动的问题--bootrom 4KB限制

上一篇:ARM-Linux模块编译与加载
下一篇:u-boot 启动过程 —— 基于S3C2410

推荐阅读最新更新时间:2024-03-16 15:01

STM32之FLASH操作
说到STM32的FLSAH,我们的第一反应是用来装程序的,实际上,STM32的片内FLASH不仅用来装程序,还用来装 芯片 配置、 芯片 ID、自举程序等等。当然, FLASH还可以用来装数据。 自己收集了一些资料,现将这些资料总结了一下,不想看的可以直接调到后面看怎么操作就可以了。 FLASH分类 根据用途,STM32片内的FLASH分成两部分:主存储块、信息块。 主存储块用于存储程序,我们写的程序一般存储在这里。 信息块又分成两部分:系统存储器、选项字节。 系统存储器存储用于存放在系统存储器自举模式下的启动程序(BootLoader),当使用ISP方式加载程序时,就是由这个程序执行。这个区域由芯片厂写入BootLoa
[单片机]
J-Flash ARM的配置
一般说来file-- open project里面会找到一些*.jflash的配置文件,加载他们就行了,但是没找到适合S3C2440的。所以自己建了一个MINI2440.jflash,手动进行配置: j-link设置 1. 打开J-Flash ARM,并进入菜单:Options-- Project settings 2.主要设置CPU选项和Flash选项 CPU : Core -- ARM9, Little endian Use target RAM(faster)-- Addr:40000000 4KB(不选很慢;从Nor flash启动时内部Boot SRAM的地址和大小,参考S3C2440A的芯片手册) 初始化序列(Init
[单片机]
STM32 USB NAND FLASH 模拟U盘
这次是做一个SD卡的USB读卡器的功能,我们就在上次NAND Flash模拟出的U盘的工程上修改了,这样的话只要修改一小部分了。 工程的绝大部分不需要修改,只要将fsmc_nand.c文件移除工程,添加上官方的关于SDIO的SD卡的驱动代码文件stm32_eval_sdio_sd.c,我讨厌出现eval,所以将该文件直接改为sdio_sdcard.c。同时,既然我们使用SDIO来驱动SD卡,所以在外设库文件组里要添加stm32_sdio.c文件,否则会出现很多未定错误。 我们接下去修改的就只有mass_mal.c这个文件了。更NAND Flash工程一样,我们改成简洁点: uint32_t Mass_Memory_Size ;
[单片机]
STM32 USB <font color='red'>NAND</font> <font color='red'>FLASH</font> 模拟U盘
供不应求格局不变,第三季 NOR Flash 价格将继续上涨
电子网消息,集邦咨询半导体研究中心(DRAMeXchange)最新研究指出,受到智能手机 AMOLED 的新增需求、触控 IC 以及驱动 IC 整合单芯片带动的 NOR Flash 需求的影响,再加上全球 NOR Flash 的每月投片仅约 8.8 万片,高度客制化与产能不易扩张,供不应求的格局将持续,预估第三季 NOR Flash 价格将上涨两成。 DRAMeXchange 研究协理吴雅婷指出,观察全球 NOR Flash 供给状况,如赛普拉斯半导体等国际大厂已经确定逐步淡出 NOR Flash 市场,将专注车用和工规市场,另外,国际大厂出售8寸厂的动作也将影响整体 NOR Flash 市场的供应。另一方面,属于中资的兆易创
[半导体设计/制造]
安全启动 - STM32安全启动架构
安全需要一个起点。 现在我们理解,没有安全启动,设备平台的安全难以得到保证。安全启动要求启动的位置一定是固定在某个地方。那么固定启动位置靠什么保证? 必须靠硬件 。软件本身的特点,决定了它很容易被修改,即使做了加密和加扰,破解的难度依然比硬件低很多。所以,安全启动一定是靠 STM32 硬件来保证。 脱离硬件谈安全启动基本上是不可能的 。 实现 Root of Trust(信任根)通用的做法是什么呢?一般是, 芯片有一个 Bootrom 启动只读存储区 。硬件的设计保证,芯片加电启动一定是从这个只读的甚至不可见的 Bootrom 里执行。 事实上,保持安全启动的原则不变,但是实现的方式可以不一样。 对于这个 Bootrom,
[单片机]
寻找ICT中国样本—ICT中国2020年度评选案例申报启动
远程办公、直播购物、在线教育,数字化、网络化、智能化的工作和生活已变成中国人的常态。从党中央密集部署到资本市场追捧,“新基建”成为各行业及城市的新一轮竞争的发力点,以及驱动各行业数字化升级的加速器。 2020年突如其来的新冠疫情,给人们生产生活带来不变的同时,我们也看到无接触式配送、大数据监控、远程医疗、远程教育、人工智能、智能机器人、无人机、在线购物、视频娱乐等新一代信息通信技术在彻底改变和影响着我们的生活。 为了全面贯彻党的十九大及中央政治局“加强新一代信息基础设施建设”要求,2020年中国国际信息通信展览会(PT展/PTEXPO)组委会联合中国通信企业协会一起,为城市和行业ICT深度应用寻找“中国样本”。通过“
[网络通信]
寻找ICT中国样本—ICT中国2020年度评选案例申报<font color='red'>启动</font>
基于WISHBONE总线的FLASH闪存接口设计
   引言   随着半导体工艺技术的发展,IC设计者已能将微处理器、模拟IP核、数字IP核和存储器(或片外存储控制接口)集成在单一芯片上,即SoC芯片。对片上系统(SoC)数据记录需要低功耗、大容量、可快速重复擦写的存储器。常用的介质主要有:动态存储器(DRAM)、静态存储器(SRAM)和闪速存储器(FLASH MEMORY)。DRAM容量大,但需要不断刷新才能保持数据,会占用微处理器时间,同时增加了功耗;SRAM虽然不需要动态刷新,但价格太贵,并且断电后跟DRAM一样数据都无法保存。FLASH MEMORY是一种兼有紫外线擦除EPROM和电可擦除可编程只读存储器(EEPROM)两者优点的新型非易失存储器。由于它可在线进行电可擦
[应用]
美国国际贸易委员会对半导体启动337调查
  2008年1月4日,应美国加州Tessera Inc. of San Jose的申请,美国国际贸易委员会对拥有最小集成电路封装尺寸的半导体集成电路及其同类产品启动337调查。涉案产品主要用于动态随机存储器、动态随机存储器模块以及包含动态随机存储器和/或动态随机存储器模块的计算机系统。    申请方在申请书中指出,美国所进口的拥有最小集成电路封装尺寸的半导体集成电路及其同类产品侵犯了美国Tessera公司的专利,并要求美国国际贸易委员会发布排除令、停止以及禁止令。     在本案中,美国国际贸易委员会确定了18家涉案企业,其中包括6家中国台湾企业,1家中国内地企业。
[模拟电子]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved