S3C2440 从NANDFLASH启动的设计原理与过程

发布者:liliukan最新更新时间:2022-04-02 来源: eefocus关键字:S3C2440  NANDFLASH  启动 手机看文章 扫描二维码
随时随地手机看文章

S3C2440有两种启动方式:NORFLASH启动与NANDFLASH启动;但一般都只从NANDFLASH启动,既然是从这个地方启动,那必须具备两个条件:


1 这个里面必须得有程序


2 必须得有内存去跑这段程序


第一个条件,我们必须通过JTAG下载程序到NANDFLASH,假设下载了一个LED测试程序在里面了;


第二个条件,要跑这段程序必须有内存,可这个时候SDRAM还没有初始化,不能跑,怎么办?S3C2440里面有一个4k空间的SRAM,当芯片复位的时候会通过外部引脚首先判断使用哪种启动方式,如果是NANDFLASH启动方式,S3C2440的Nand Flash控制器有一个特殊的功能,在S3C2440上电后,Nand Flash控制器会自动的把Nand Flash上的前4K数据搬移到4K内部SRAM中,(此内部RAM被称为Steppingstone)并把0X00000000设置内部RAM的起始地址,CPU从内部RAM的0X00000000位置开始启动。这个过程不需要程序干涉。芯片怎么做到没有NANDFLASH驱动就能够读取前4K代码呢?在最后会讲。


上面的两个条件都满足了,程序可以在4K SRAM里面自动跑起来了。但只能是4K的代码,大于4K怎么办?那就只能在SDRAM去跑了,这就需要满足下面条件:


1 SDRAM必须要初始化


2 有一段代码把NANDFLASH里面的程序搬到SDRAM里面去运行


上面的两个条件都需要运行程序,就只能在SRAM里面运行,所以程序的前面4k的代码必须完成这两项工作,在完成了这两项工作后从SRAM跳转到SDRAM里面执行余下的工作;这样就实现了程序从NANDFLASH启动了。但程序是如何从SRAM跳转到SDRAM接着去执行的呢?


启动代码最开始是这样的:


@*************************************************************************

@ File:head.S

@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行

@*************************************************************************

 

.equ        MEM_CTL_BASE,       0x48000000

.equ        SDRAM_BASE,         0x30000000

 

.text

.global _start

_start:

    bl  disable_watch_dog               @ 关闭WATCHDOG,否则CPU会不断重启

    bl  memsetup                        @ 设置存储控制器

    bl  copy_steppingstone_to_sdram     @ 复制代码到SDRAM中

    ldr pc, =on_sdram                   @ 跳到SDRAM中继续执行

on_sdram:

    ldr sp, =0x34000000                 @ 设置堆栈

    bl  main

halt_loop:

    b   halt_loop

首先其他的都先不管,这里只关注bl指令与ldr指令,这两个指令的区别:


bl :位置无关码 -- 跳转位置与启动代码的链接地址无关


ldr:位置相关码 --跳转位置与链接地址相关


S3C2440 的SDRAM起始地址为0x3000,0000,最开始运行启动代码,所以启动代码的连接地址为0x3000,0000,这个地址是在编译链接操作的时候指定的,在makefile里面;


当执行bl的时候,跳转地址跟SDRAM链接地址无关(当前指令在SRAM内地址),这个地址还是本来的地址范围,SRAM的范围,所以还是在SRAM里面跳转。


当执行ldr的时候,跳转地址跟SDRAM连接地址有关,这里跳转到0x3000,0000+当前指令在SRAM内地址,这个地址已经是SDRAM的地址范围了,所以完成跳转。


就这样理解吧,如果要详细的理解,需要分析启动代码的反汇编文件,理解起来更加清晰。


下面再把整个过程总结一下:


1 上电复位判断从NANDFLASH启动后,芯片自动复制NANFLASH前4K内容到SRAM,(这时候SDRAM还没初始化)。再SRAM里面从0地址开始执行PC=0X00000000

2 此时PC执行到memsetup,初始化SDRAM

3 SDRAM初始化完成后,再执行


bl  copy_steppingstone_to_sdram

完成将NANDFLASH里面的代码复制到SDRAM里面(这里是复制的SRAM里面的代码到SDRAM,因为程序小于4K,SRAM里面就是所有的代码了;大于4K必须从NANDFLASH里面复制)


4 复制完成以后执行


ldr pc, =on_sdram

这时候的跳转地址就跟链接地址有关了,本来是0x0000,0010,而SDRAM的连接地址是 0x3000,0000 ,所以跳转到 0x3000,0000+0x0000,0010 =0x3000,0010 。这样就完成了SRAM到SDRAM的跳转。


——————————————————————————————————————————————



前面说到那4K代码在系统复位后芯片自动复制带SRAM,这时候NANDFLASH驱动都没有,怎么实现读操作的呢?S3C2440的芯片手册是这样说的:

在系统复位期间,NANDFLASH控制器会去读取硬件PIN脚的电平来获取NANDFLASH信息从而对其进行对应的控制。


系统复位期间内部完成步骤:


1 读取OM【0:1】脚判断从哪里启动。


2 如果从NAND启动,读取 NCON, GPG[13-15] PIN脚信息


3 NAND控制器自动产生时序读取4K信息到SRAM



NANDFLASH启动的PIN脚设置说明如下:

关键字:S3C2440  NANDFLASH  启动 引用地址:S3C2440 从NANDFLASH启动的设计原理与过程

上一篇:入门 | S3C2440启动过程分析
下一篇:学习笔记--- S3C2440 内存类设备接口接线与访问原理

推荐阅读最新更新时间:2024-11-13 06:10

arm-linux之为开发板写上电自启动程序之方法
开发环境 开发板:AM335 虚拟机:ubuntu 14.04 编译器:gcc-linaro-5.3-2016.02-x86_64_arm-linux-gnueabihf 开发板内核:linux 4.4.12 首先开发板的文件使用的是systemd 并没有/etc/rc.local文件 所以要想修改rc.local这一简单的操作已经不存在 但是也是可以用systemd和initd两种方式解决这个问题 1.systemd 我这里是修改自带的service root@am335x-evm:/etc/rc5.d# ls /lib/systemd/system/rc-local.service /lib/systemd/sy
[单片机]
S3C2440之UART操作(FIFO中断模式)
关于串口的知识 3个独立的串口,每一个都可以利用DMA 和中断方式操作。每个包含2个64字节FIFO,一个接,一个发。 非FIFO模式相当于FIFO模式的一个寄存器缓冲模式。 每一个UART有7种状态,overrun错误,校验错误,帧错误,断点,接收缓冲区准备好,发送缓冲区为空,发送移位寄存器为空。 当接收移位寄存器中的数据传给FIFO的时候,且接收的数据触发了Rx FIFO的阀值,Rx中断产生了。 发送器中FIFO的还未发得数据到达Tx FIFO阀值的时候,Tx中断产生了。(我觉得应该理解为:发送器中FIFO发送结束,即为空的时候产生中断。) 功能:在串口上输入16字节,包括回车,然后会把输入的字符回
[单片机]
STM32 启动过程简述
根据启动模式分析的结论: 1、 通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x02000000,同时复位后PC指针位于0x02000000处; 2、 通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x08000000,同时复位后PC指针位于0x08000000处; 3、 通过boot引脚设置可以将中断向量表定位于内置Bootloader区,本文不对这种情况做论述; STM32 将0x8000000 映射到 0x00000000,即如果从内部FLASH启动,会从 0x08000004 处进行取指令 (CM3定义的 0x08000000 用于存放SP指针),故,0x000000
[单片机]
STM32 <font color='red'>启动</font>过程简述
自耦降压启动柜常见故障有哪些
自耦降压启动柜是一种用于电机启动的电气设备,它通过降低电机启动时的电压来减小启动电流,从而保护电机和电网。然而,自耦降压启动柜在使用过程中也可能出现一些故障。以下是一些常见的自耦降压启动柜故障及其原因和解决方法的详细分析。 启动失败 启动失败是自耦降压启动柜最常见的故障之一。可能的原因包括: 1.1 电源电压不稳定:如果电源电压波动过大,可能导致启动柜无法正常工作。解决方法是检查电源线路,确保电压稳定。 1.2 启动柜内部接触器故障:接触器是启动柜的核心部件,如果接触器损坏或接触不良,可能导致启动失败。解决方法是检查接触器,必要时更换新的接触器。 1.3 电机故障:如果电机本身存在问题,如绕组短路、断路等,也可能导致启动失
[嵌入式]
第13章 STM32F429启动过程详解
13.1 初学者重要提示 1、如果觉得学习本章节吃力的话,推荐看我们早期做的入门视频教程第8章。 http://www.armbbs.cn/forum.php?mod=viewthread&tid=15408 。 13.2 各个版本的启动文件介绍 这里各个版本的意思是指不同的编译器、不同的F4系列对应的启动文件。 13.2.1 不同编译器对应的启动文件 打开我们为本教程提供的工程文件,路径如下: LibrariesCMSISDeviceSTSTM32F4xxSourceTemplates 在这个文件里面有ST官方为各个编译器提供的启动文件。 看了上面的截图,大家会问怎么没有KEIL MDK呢?其实已经被放在了文
[单片机]
第13章 STM32F429<font color='red'>启动</font>过程详解
Everyday Robot项目启动 意在开发通用学习机器人
今天,Alphabet的X moonshot部门(以前称为Google X)启动了Everyday Robot项目,该项目的目的是开发“通用学习机器人”。该想法是,其机器人可以使用相机和复杂的算法来观察和观察。向周围的世界学习,而无需为每个动作编码。 该团队正在可以在工作场所环境中提供帮助的机器人,尽管现在,这些早期的机器人专注于学习如何分类垃圾。 最近几个月,Alphabet的X团队的Moonshot项目团队一直在使用机器人对X公司办公室初次使用的堆肥,回收利用和垃圾掩埋场进行分类。装有轮子的机器人可以开车到加利福尼亚山景城办公室的垃圾站点,并结合视觉和机械臂对回收和垃圾分类。 今天的消息是Alphabet推出
[机器人]
2440中nandflash学习小结
硬件连线参考: 根据我的开发板直接测量信息得The configuration pin NCON, GPG 对应位为1,011 1: Advance NAND flash(1KWords/2KBytes page size, 4/5 address cycle) 0: 8-bit bus width 1: 5 address cycle(NCON = 1) 1: Page=2KBytes(NCON = 1) 打开K9F2G08U0的规格书进行信息的验证。如下图。验证结果说明硬件图3不正确,实际电路板NR5是不焊的。 注意:1 Device=2112Mbits。单位为bits即 =264Mbyte 哦!
[单片机]
cortex-a8 uboot系列:第六章 uboot源码分析2-启动第二阶段
第一阶段结束后,调用了start_armboot函数。开始第二阶段。 start_armboot函数在lib_arm/board.c文件里。 一、uboot第二阶段 uboot第一阶段主要就是初始化了soc内部的部件(如看门狗,时钟),然后初始化DDR并且完成重定位,建立MMU映射表,启动MMU。 Uboot第二阶段就是要初始化剩下的还没有被初始化的硬件。主要是soc外部的硬件(如iNand,网卡芯片……),uboot本身的一些东西(uboot命令,环境变量……)。然后最终初始化完必要的东西后进入uboot的命令行准备接收命令。 1.uboot的完结 uboot启动后自动运行打印很多信息(这些信息就是uboot在第
[单片机]
cortex-a8 uboot系列:第六章 uboot源码分析2-<font color='red'>启动</font>第二阶段
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved