u-boot-2011.03在mini2440/micro2440上的移植 支持Nand Flash启动

发布者:MysticGarden最新更新时间:2024-07-01 来源: elecfans关键字:u-boot  mini2440  micro2440  移植  Nand  Flash启动 手机看文章 扫描二维码
随时随地手机看文章

7.1 创建nand_read.c

【注意】
程序只能用于读取2K/页的Nand。本人的Micro2440上的Nand Flash为256M,型号为K9F2G08
 

[www.linuxidc.com@linuxidc u-boot-2011.06]$ touch board/samsung/micro2440/nand_read.c
[www.linuxidc.com@linuxidc u-boot-2011.06]$ cat> board/samsung/micro2440/nand_read.c

 

#define rNFCONF  (*(volatile unsigned *)0x4E000000)
#define rNFCONT  (*(volatile unsigned *)0x4E000004)
#define rNFCMD  (*(volatile unsigned *)0x4E000008)
#define rNFADDR  (*(volatile unsigned *)0x4E00000C)
#define rNFDATA8 (*(volatile unsigned char*)0x4E000010)
#define rNFSTAT  (*(volatile unsigned *)0x4E000020)

#define CMD_READ1   0x00            /* 页读命令周期1 */
#define CMD_READ2   0x30            /* 页读命令周期2 */
#define CMD_RESET   0xFF          /* 复位    */

#define NF_CMD(cmd)   {rNFCMD=(cmd);}     /* 写命令   */
#define NF_ADDR(addr)  {rNFADDR=(addr);}    /* 写地址   */
#define NF_RDDATA8()  (rNFDATA8)         /* 读8位数据  */
#define NF_nFCE_L()   {rNFCONT&=~(1<<1);}    /* 片选使能   */
#define NF_nFCE_H()   {rNFCONT|=(1<<1);}    /* 片选禁用   */
#define NF_WAITRB()      {while(!(rNFSTAT&(1<<1)));}  /* 等待就绪   */
#define NF_CLEAR_RB()     {rNFSTAT |= (1<<2);}   /* 清除就绪/忙位 */
#define NF_DETECT_RB()     {while(!(rNFSTAT&(1<<2)));}  /* 等待就绪   */

#define TACLS  1
#define TWRPH0  2
#define TWRPH1  1

void delay(int i)
{
 while(i-->0);
}

void Nand_Init(void)
{
 rNFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4)|(0<<0); 
 rNFCONT = (1<<4)|(1<<1)|(1<<0);
}

static void Nand_Reset(void)
{
 NF_nFCE_L();      /* 片选使能   */
 NF_CLEAR_RB();      /* 清除就绪/忙位  */
 NF_CMD(CMD_RESET);     /* 写复位命令  */
 NF_DETECT_RB();      /* 等待就绪   */
 NF_nFCE_H();      /* 片选禁用   */
}

unsigned char Nand_ReadPage(const int page, unsigned char * const buffer)
{
 int i;
 
 Nand_Reset();
 
 NF_nFCE_L();
 NF_CLEAR_RB();

 NF_CMD(CMD_READ1); 
 NF_ADDR(0x0);
 NF_ADDR(0x0);
 NF_ADDR(page&0xff);
 NF_ADDR((page>>8)&0xff);
 NF_ADDR((page>>16)&0xff);
 NF_CMD(CMD_READ2); 
  
 NF_DETECT_RB();

 for (i = 0; i < 2048; i++) 
 {
  buffer[i] =  NF_RDDATA8();
 }
 
 NF_nFCE_H();
}

int nand_read(int start_page, int read_pages, unsigned char *buffer)
{
 int i;

 Nand_Init();
 for(i=0; i {
  Nand_ReadPage(start_page, buffer + 2048*i);
  start_page++;
 }
 return 0;
}

 

7.2 board/samsung/micro2440/Makefile

COBJS := micro2440.o flash.o nand_read.o

 

7.3 arch/arm/cpu/arm920t/u-boot.lds

 .text :
 {
  arch/arm/cpu/arm920t/start.o (.text)
  board/samsung/micro2440/libmicro2440.o    (.text)
  *(.text)
 }

 

【说明】

如果是在RAM中运行,一定要删去board/samsung/micro2440/libmicro2440.o    (.text),否则在RAM中也不能运行。原因尚不理解,需要阅读代码

 

7.4 arch/arm/cpu/arm920t/start.S

下面红色部分是添加的部分,黑色的代码用于定位。

#ifndef CONFIG_SKIP_LOWLEVEL_INIT
    bl cpu_init_crit
#endif

 

#ifdef CONFIG_S3C2440_NAND_BOOT
    ldr sp, =0x30008000
    ldr r0, =0x0;
    ldr r1, _end_ofs
    mov r1, r1, LSR #11
    add r1, r1, #1
    ldr r2, =(CONFIG_SYS_TEXT_BASE)
    bl nand_read
    ldr pc, =relocations
#endif
......
......
copy_loop:
ldmia r0!, {r9-r10} /* copy from source address [r0] */
stmia r1!, {r9-r10} /* copy to target address [r1] */
cmp r0, r2 /* until source end address [r2] */
blo copy_loop

#ifdef CONFIG_S3C2440_NAND_BOOT
relocations:
    ldr r6, =CONFIG_SYS_TEXT_BASE
#endif

#ifndef CONFIG_PRELOADER
/*
* fix .rel.dyn relocations
*/
......
......
clbss_l:str r2, [r0] /* clear loop... */
add r0, r0, #4
cmp r0, r1
bne clbss_l

bl coloured_LED_init
bl red_LED_on
#endif

#ifdef CONFIG_S3C2440_NAND_BOOT
    ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
    bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
    ldr r0,=0x00000000
   ldr pc, =board_init_f
#endif

/*
* We are done. Do not return, instead branch to second part of board
* initialization, now running from RAM.
*/
#ifdef CONFIG_NAND_SPL

 

7.5 include/configs/micro2440.h

#define CONFIG_S3C2440_NAND_BOOT
/* #define CONFIG_SKIP_LOWLEVEL_INIT */

【说明】
由于要在Nand Flash中运行,所以需要注释掉#define CONFIG_SKIP_LOWLEVEL_INIT

7.6 arch/arm/lib/board.c

void board_init_f (ulong bootflag)
{
    ......

    gd->mon_len = _bss_end_ofs + 0x100000; /* why */

    ...... 

这里的修改参考了bscbem的日志:http://www.linuxidc.com/Linux/2011-02/32772p4.htm

如果有读者想了解原理请参考这个日志。

 


    /* relocate_code (addr_sp, id, addr); */
#ifdef CONFIG_S3C2440_NAND_BOOT /*add by wzc*/ 
    __asm__ __volatile__('mov sp,%0'::'r'(addr_sp):'sp');/*add by wzc*/ 
    board_init_r(id, addr); 
#else 
    relocate_code (addr_sp, id, addr); 
    /* NOTREACHED - relocate_code() does not return */ 
#endif
}
【说明】
至于gd->mon_len = _bss_end_ofs + 0x100000;我也不理解,需要阅读源代码才能解释。

7.7 下载到Nand Flash

 到这里应该就可以从Nand Flash启动了。


关键字:u-boot  mini2440  micro2440  移植  Nand  Flash启动 引用地址:u-boot-2011.03在mini2440/micro2440上的移植 支持Nand Flash启动

上一篇:u-boot-2011.03在mini2440/micro2440上的移植 支持yaffs下载
下一篇:u-boot-2011.03在mini2440/micro2440上的移植 结束语及资源下载

推荐阅读最新更新时间:2026-03-19 20:53

mini2440的nor flashnand flash启动过程区别
简介:一、调试经验;二、问答;三、ARM的nor flash与nand flash启动过程区别。 -------------------------------------------------------- 目标:祥读mini2440说明书 -------------------------------------------------------- 一、调试经验 1.一位老电脑科学家的提示:当你遇到怪问题时,重启是一种最简单的解决办法之一。因为操作系统本身有不完善之处,不管是微软视窗还是苹果电脑。 2.USB转口线出现乱码问题:说明串口线的功能和性能不稳定。可购买性能好的代替之。 二、问答 1.
[单片机]
友善之臂最新版mini2440学习笔记——u-boot 1.1.6移植(一)
从本文开始,将记录博主在进行u-boot 1.1.6移植过程中遇到的问题。本文将涉及两个问题: 1. u-boot中添加开发板 2. u-boot第一阶段启动代码 1. u-boot中添加开发板 1.1. Makefile更改 1.1.1. 增加反汇编文件输出 Makefile文件中239行,源文件为: ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) 更改为: ALL = $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(obj)u-boot.dis $
[单片机]
mini2440开发板 u-boot 移植
本实验所用的u-boot源码包,是国嵌提供的u-boot-2008.10 1.解压源码包 命令:tar jxvf u-boot-2008.10.tar.bz2 2.在顶层的Makefile中找到 smdk2410_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t smdk2410 NULL s3c24x0 参照此方法,添加: mini2440_config : unconfig @$(MKCONFIG) $(@:_config=) arm arm920t mini2440 NULL s3c24x0 3.修改/cpu/arm920t/star
[单片机]
u-boot移植(九)---代码修改---NAND
一、NAND原理      NAND 无地址空间,地址和数据的发送都依赖于LDATA 这一串数据总线。      不看随机页编程,看到从高位到低位的页,总共分为64个页面,每个页的组成是2K + 64 个byte,一个块的大小是(128K + 4K)byte,64页组成一块。 1.1 NAND Flash的编址   nand flash的的页的大小是(2048 + 64)byte,64这个数据是不参与编址的。   访问 nand flash: 发出命令:读、写、擦除 发出地址 传输数据   命令设置如下:    1.2 nand flash的访问      可以看看上面的模式选择,然后对应引脚进行操作,就
[单片机]
<font color='red'>u-boot</font><font color='red'>移植</font>(九)---代码修改---<font color='red'>NAND</font>
nand flash启动分析
2410支持从nand flash启动。通过将flash中最开始的4k代码拷贝到,2410片内的一块不用初始化的sram中运行,该拷贝过程完全由硬件支持,无需软件操作。   Nand Flash控制器有一个特殊的功能,在S3C2410上电后,Nand Flash控制器会自动的把Nand Flash上的前4K数据搬移到4K内部RAM中,并把0x00000000设置内部RAM的起始地址,CPU从内部RAM的0x00000000位置开始启动。这个过程不需要程序干涉。程序员需要完成的工作,是把最核心的启动程序放在Nand Flash的前4K中。   u-boot源码不支持从nand flash启动,可是s3c2410支持从n
[单片机]
Qt/Qte 4.7.2开发环境搭建及Micro2440移植笔记
虽然网上有不少关于这方面的资料,想了想还是自己写个总结,毕竟各人有各人的问题,这篇文章也主要是作为个人的学习记录,需要的朋友可以参考哈,老手高手们就不用看了哈。。 之前已经搭建过友善之臂提供的qtopia-2.20开发环境,但用着用着愈发觉着不爽。为何??Qtopia-2.20是基于Qt-Embedded2.3的。2.3版本哪!!!现在Qt/Qte的最新版本是Qt4.8beta。虽然用qtopia2.2的朋友还不少,但是作为新手的小弟,入门学的是现在流行的4.x版本(实际上Qt4.x也发行很久了吧),在PC上编译测试无错的程序拿到qtopia中编译便错漏百出,原因很明显的就是因为版本问题。2.3版本果断无法支持4.x的。于是便
[单片机]
mini2440通过NFS启动U-Boot参数设置
// 编译内核 cd /home/guoqian/4-3-1/linux-2.6.29 make disclean cp config-mini2440 .config make menuconfig ARCH=arm make uImage ARCH=arm CROSS_COMPILE=arm-linux- // 将uImage拷至TFTP cp arch/arm/boot/uImage /tftpboot/ // u-boot参数设置 set ipaddr 192.168.1.230 set serverip 192.168.1.123 set gatewayip 192.168.1.1 set bootcmd 'tf
[单片机]
搭建一个mini2440开发板U-Boot的框架
一、移植环境 主 机: Ubuntu 开发板:友善之臂mini2440 编译器:arm-linux-gcc-4.3.2 u-boot:u-boot-2009.03.tar.bz2 二、移植步骤 目前u-boot对很多CPU直接支持,可以查看board目录的一些子目录,如:board/samsung/目录下就是对三星一些ARM处理器的支持,有smdk2400、smdk2410和smdk6400,但没有2440,所以我们就在这里建立自己的开发板项目。 1)因2440和2410的资源差不多,主频和外设有点差别,所以我们就在board/samsung/下建立自己开发板的项目,取名叫mini2440 #tar -jx
[单片机]
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

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