自动识别启动模式Nand Or Nor

发布者:自在堂最新更新时间:2016-03-03 来源: eefocus关键字:自动识别  启动模式  Nand  Nor 手机看文章 扫描二维码
随时随地手机看文章

UBOOT-2010-03在S3C2440上的移植<二>------------硬件初始化

http://www.linuxidc.com/Linux/2011-11/46993p2.htm

 

Notes:2)下面代码段红色部分为删除部分

Notes:3)下面代码段绿色部分为添加部分

4.1)Notes:以下资源来自大神Tekkaman Ninja博客点击查看原文

移植之前还是请大家先看S3C2440数据手册<第五章存储器控制器>中的(也就是那个映射图),从理论上来讲,对于0x40000000以后的内存,只有在Nor boot的时候才存在;而在nand

boot 的时候他被映射到了0x00000000,在0x40000000以后不存在内存。如果我们在启动的时候,将一些特定的数据写入0x40000000~0x40001000之间,那么按照数据手册上的说法,如果回读的结果和写入的一致说明是nor boot,否则就是nand boot!<写这个文章的时候我又看了一次。。。。。。。。。>

从上图我们可以看出,无论是Nor boot还是nand boot ,这4K的内部SRAM都被映射到了0x40000000,而在nand boot的时候,这块内存同时还被映射到了0x00000000。那么一开始提出的办法就不可行了,而且在nand boot 的时候,写入0x40000000~0x40001000还会破坏自身的程序。

但是通过上面的图,我想到了解决的办法:
在启动的时候,用程序将0x40000000~0x40001000中的某些位置清零,如果回读0x00000000~0x00001000中的相应位置后为零,说明是Nand boot,如果是原来的数据(一定要选非零的位置)就是Nor boot。判断完后如果是nand boot,还要恢复被改动的数据,再进入自拷贝阶段。
   只要检测的位置合理,这方法是可行的。现在的关键是选什么位置的数据最好呢?经过查看源码,我选择了在start.S文件开头,全局中断向量之后的:


 

.balignl 16,0xdeadbeef


选这个数据作为检测位置的理由如下:
(1)他是非零数,而且数据是确定的:0xdeadbeef;
(2)他的位置是固定的:0x0000003c(0x4000003c);
(3)他在检测程序之前,不会影响程序的向下运行;
(4)他不属于程序,他是一个程序中的魔数(Magic Number),用魔数来检测也比较合理。

所以我最后的检测步骤是:
在启动的时候,将0x4000003c位置开始的四个字节清零,然后读取0x0000003c位置开始的四个字节。如果回读的结果为零,说明是nand boot,否则就是Nor boot(为了保险还可以判断是否为0xdeadbeef,不是的话就说明有未知错误,死循环!)。但是最后有一点很重要:如果是Nand boot,必须要复原清零的数据。原因是:在nand boot过后,会核对内部SRAM中的4K程序,和从Nand中拷贝到SDRAM的前4K程序是否一致,如果不一致会进入死循环。

 


.globl bBootFrmNORFlash 
bBootFrmNORFlash: 
 .word 0 
4.1.2)判断当前代码位置,如果在内存,直接跳到stack_setup 

 
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
    bl    cpu_init_crit
#endif 


    adr    r0, _start        
    ldr    r1, _TEXT_BASE        
    cmp    r0, r1            
    beq    stack_setup

4.1.3)如果代码当前位置不在内存中,就判断启动方式为Nand Flash或者Nor Flash 

Notes:没有说明就默认在以上代码的后面添加


    ldr    r1, =( (4<<28)|(3<<4)|(3<<2) )        
    mov    r0, #0        
    str    r0, [r1]


    mov    r1, #0x3c        
    ldr    r0, [r1]
    cmp    r0, #0
    bne    relocate

    
    ldr    r0, =(0xdeadbeef)
    ldr    r1, =( (4<<28)|(3<<4)|(3<<2) )
    str    r0, [r1]

4.1.4)在Nand Flash中启动的话,那么Nand Flash搬移代码如下:

Notes:定义u-boot在Nand flash中存放的长度为#define LENGTH_UBOOT 0x100000<1M>,可以方便修改u-boot因为裁剪和增添大小的改变而占的长度。



#define LENGTH_UBOOT 0x100000
#define NAND_CTL_BASE 0x4E000000

#ifdef CONFIG_S3C2440

#define oNFCONF 0x00
#define oNFCONT 0x04
#define oNFCMD 0x08
#define oNFSTAT 0x20

    @ reset NAND
    mov    r1, #NAND_CTL_BASE
    ldr    r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
    str    r2, [r1, #oNFCONF]
    ldr    r2, [r1, #oNFCONF]
    
    ldr    r2, =( (1<<4)|(0<<1)|(1<<0) )    @ Active low CE Control 
    str    r2, [r1, #oNFCONT]
    ldr    r2, [r1, #oNFCONT]
    
    ldr    r2, =(0x6)    @ RnB Clear
    str    r2, [r1, #oNFSTAT]
    ldr    r2, [r1, #oNFSTAT]
    
    mov    r2, #0xff    @ RESET command
    strb    r2, [r1, #oNFCMD]
    
    mov    r3, #0    @ wait
nand1: 
    add    r3, r3, #0x1
    cmp    r3, #0xa
    blt    nand1

nand2:
    ldr    r2, [r1, #oNFSTAT]    @ wait ready
    tst    r2, #0x4
    beq    nand2
    
    
    ldr    r2, [r1, #oNFCONT]
    orr    r2, r2, #0x2    @ Flash Memory Chip Disable
    str    r2, [r1, #oNFCONT]
    
    @ get read to call C functions (for nand_read())
    ldr    sp, DW_STACK_START    @ setup stack pointer
    mov    fp, #0    @ no previous frame, so fp=0

    @ copy U-Boot to RAM
    ldr    r0, =TEXT_BASE
    mov    r1, #0x0
    mov    r2, #LENGTH_UBOOT
    bl    nand_read_ll
    tst    r0, #0x0
    beq    ok_nand_read

bad_nand_read:
loop2:
       loop2    @ infinite loop
ok_nand_read:
    @ verify
    mov    r0, #0
    ldr    r1, =TEXT_BASE
    mov    r2, #0x400    @ 4 bytes * 1024 = 4K-bytes
go_next:
    ldr    r3, [r0], #4
    ldr    r4, [r1], #4
    teq    r3, r4
    bne    notmatch
    subs    r2, r2, #4
    beq    stack_setup
    bne    go_next

notmatch:
loop3:
       loop3    @ infinite loop
#endif
 

4.1.5)在Nor Flash中启动的话,那么Nor Flash搬移代码如下:


relocate:                      
     
    ldr    r1, =(0xdeadbeef)
    cmp    r0, r1
    bne    loop3
     
    adr    r0, _start        
    ldr    r1, _TEXT_BASE        
    ldr    r2, _armboot_start
    ldr    r3, _bss_start
    sub    r2, r3, r2        
    add    r2, r0, r2        

copy_loop:
    ldmia    r0!, {r3-r10}        
    stmia    r1!, {r3-r10}        
    cmp    r0, r2            
    ble    copy_loop

SetBootFlag:
    ldr r0, =bBootFrmNORFlash
    mov r1, #1
    str r1, [r0]

4.1.6)删除下面这段代码

//#ifndef CONFIG_SKIP_RELOCATE_UBOOT
//relocate:                
//    adr    r0, _start        
//    ldr    r1, _TEXT_BASE        
//    cmp    r0, r1            
//    beq    stack_setup

//    ldr    r2, _armboot_start
//    ldr    r3, _bss_start
//    sub    r2, r3, r2        
//    add    r2, r0, r2        

//copy_loop:
//    ldmia    r0!, {r3-r10}        
//    stmia    r1!, {r3-r10}        
//    cmp    r0, r2            
//    ble    copy_loop
//#endif    

4.2.1)在_start_armboot: .word start_armboot 后面添加:

#define STACK_BASE 0x33f00000
#define STACK_SIZE 0x10000 
 .align 2 
DW_STACK_START: .word STACK_BASE+STACK_SIZE-4 
 

Notes1):如果你不是第一次移植UBOOT那么建议好好的理解一下上面这些代码<当然加入你还是第一次的话那么好了直接COPY吧很管用的>

Notes2):上面用到了一个nand_read_ll函数,该函数用来读NANDFLASH的<下一篇就是实现这个UBOOT对NAND的支持了先休息一下吧>

关键字:自动识别  启动模式  Nand  Nor 引用地址:自动识别启动模式Nand Or Nor

上一篇: 对I2C总线协议的一些理解
下一篇:声明转文字: 编写程序将C语言的声明转换为文字描述

推荐阅读最新更新时间:2024-03-16 14:46

ARM发布Cortex-A73和Mali-G71,为手机VR/AR作预备
     ARM执行副总裁纪首席行销业务长Rene Haas,他表示非常看好智慧型手机市场的未来长长,因为还有多项领域的应用,例如4K影像、AR、VR等都有很高的成长潜力。(图/黄慧雯摄) 全球IP矽智财授权厂商ARM于Computex 2016展期发表高阶行动处理器技术,包含ARM Cortex-A73处理器以及ARM Mali-G71绘图处理器,两者均大幅提升运算效能并降低功耗,搭载这些最新架构的行动装置预计将在2017年推出。 ARM执行副总裁纪首席行销业务长Rene Haas在Computex 2016展前记者会表示,目前搭载ARM处理器的行动装置在全球已达到30亿个。就智慧型手机市场而言,不少观察都预测智慧型手机市场
[手机便携]
MathWorks在SimMechanics中添加多体仿真功能
中国北京 –(2012 年 6 月 27 日)– MathWorks 日前宣布推出 SimMechanics 的新版本,可以让用户利用 MATLAB 创建真实的部件和几何结构。SimMechanics 在仿真过程中自动创建三维动画,无需重新运行仿真即可重放。工程师可以在新设计中重复利用自定义部件和机制,从而缩短建模过程。 使用 SimMechanics,航空及国防、汽车、工业自动化和机械行业的工程师可以利用刚体、结点、约束和力元素在 Simulink 块图中构建三维机械系统模型。SimMechanics 模型可以连接 Simscape 和其他 Simulink 产品以进行物理建模,例如 SimElectronics 和 SimH
[嵌入式]
Nordic Semiconductor为大众市场无线设备带来蓝牙5功能
Nordic Semiconductor宣布为全球客户批量提供nRF52810 低功耗蓝牙(Bluetooth® Low Energy / Bluetooth LE)系统级芯片(SoC),为nRF52行业领先的高性能蓝牙5认证SoC器件系列增加了优化储存器的版本。nRF52810完善了Nordic Semiconductor nRF52系列芯片,这个系列包括成熟的nRF52832 (与nRF52810引脚兼容)和高端nRF52840 SoC器件。 Nordic宣布全面批量生产nRF52810 SoC器件之际,同时推出S112协议栈(Nordic最新RF 蓝牙5协议软件或“协议栈”),以及Nordic全新版本nRF5软件开发工
[网络通信]
<font color='red'>Nor</font>dic Semiconduct<font color='red'>or</font>为大众市场无线设备带来蓝牙5功能
苹果开发者遭遇App Store无法验证或分发应用程序错误Bug
据 Apple Insider 报道,苹果开发人员显然遇到了阻止他们在 App Store 上验证或分发应用程序的问题或错误 Bug。   周二早上,当一名开发人员发布关于在尝试分发他们的应用程序时出现“错误分析应用程序版本”弹出窗口时,有关该问题的报告首次浮出水面。   在第一次发帖后的 9 小时内,开发者论坛的帖子已经积累了超过 15 页来自遇到相同问题的其他开发者的评论。   苹果承认其开发者状态页面上的 AMP - 开发者内容交付系统存在问题。但是,尚不清楚这是否与分发和验证错误有关。   该错误 Bug 似乎仍在持续,反馈帖子还在更新出现。   一些开发人员指出,删除以前使用相同应用版本生成的派生数据和存档可以解决此
[手机便携]
苹果开发者遭遇App St<font color='red'>or</font>e无法验证或分发应用程序错误Bug
QORVO多款射频模块用于 NB-IoT 无线通讯模块
电子网消息,实现互联世界的创新 RF 解决方案提供商 Qorvo 宣布,其功率放大器模块 RF3628、QM52015 和 SP4T 开关 RF1648B 被 SIMCom (芯讯通)最新推出的、业内首款基于高通 MDM9206 平台研发的 LTE CAT-M1/NB-IoT/EDGE 无线通讯模块 SIM7000C 所采用。 据悉,芯讯通的 SIM7000C 是世界首款基于高通 MDM9206 平台研发的支持 CAT-M1(eMTC)/NB-IoT/EGDE 模块,采用 SMT 封装,集性能稳定、外观小巧、性价比高、极低功耗等特性于一体,能满足用户的多种需求。在该款模块中,Qorvo 提供的单芯片组支持多种模式和频段,通过单
[半导体设计/制造]
Escort激光雷达探测器 添加指向箭头功能
对于那些非常看重雷达测速仪和激光探测仪性能的用户来说,他们往往仅会从两个品牌中进行选择,那就是Escort和Valentine One。多年以来Escort为其探测仪装备添加了很多先进技术,例如可最小化错误警报概率的卫星导航系统定位装置,以及闯红灯摄像头位置数据库。与此同时,Valentine One不断改善自己的软件应用,产品尺寸略微缩减,赖以生存的指向箭头定位系统更是越来越精进。   近日Escort发布了最新的Max 360雷达和激光探测器,也增加了指向箭头功能。也许你会惊叹Escort是怎么做到的,其实Valentine One研发的指向箭头专利在2012年就到期了。多年之前就有谣传说Escort将使用指向箭头功
[嵌入式]
消息称三星 NAND 拟进一步涨价,明年一、二季度将逐季调涨 20%
11 月 2 日消息,据台湾地区《经济日报》今日报道,存储芯片巨头三星计划加大 NAND Flash 的涨价力度,预计明年前二季度逐季调涨 20%。 这一消息是由韩国半导体产业多名消息人士透露的。据称,三星在本季调升 NAND 报价 10-20% 之后,已决定明年第一、第二季度逐季调涨 20%,此举是三星为了努力稳定 NAND 价格、且达成明年上半年逆转市场等目标的一系列行动。 报道称,三星执行副总裁金在俊于当地时间 10 月 31 日的财报会议上宣布,公司接下来的减产行动,将比目前 DRAM 缩减产出的规模更大。目前,三星在积极提高报价的同时,也通过持续减产来控制市场供给量。 据 TrendForce 集邦咨询 9 月公布的报告
[半导体设计/制造]
Actel推出新款低成本CorePWM组件
Actel宣布推出低成本CorePWM组件,新产品是针对数模转换所设计的PWM IP,可搭配该公司的Fusion可编程系统芯片(PSC)等FPGA产品,实现单芯片死循环控制系统的设计,取代现有的分立PWM组件、ASSP或ASIC;适用于各种嵌入式混合信号应用,包括工业、医疗设备、军用/航天、通信、消费性电子和汽车领域等。 Actel表示,CorePWM IP占用的逻辑门数很少,仅是3万个逻辑门ProASIC3的11%,或9万个逻辑门Fusion器件的4%。该IP具有一个基于缓存器的接口,可与具微控制器或不具微控制器的内核,如Actel的Core8051或CoreMP7一起使用。该组件具有8个8位PWM输出信道和一个8位预标器(p
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
热门活动
换一批
更多
设计资源 培训 开发板 精华推荐

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

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

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