在 U-BOOT 对 Nand Flash 的支持

1.1    U-BOOT 对从 Nand Flash 启动的支持

1.1.1   Nand Flash 启动 U-BOOT 的基本原理

1. 前 4K 的问题

如果 S3C2410 被配置成从 Nand Flash 启动(配置由硬件工程师在电路板设置), S3C2410 的 Nand Flash 控制器 有一个特殊的功能, 在 S3C2410 上电后, Nand Flash 控制器会自动的把 Nand Flash 上的前 4K 数据搬移到 4K 内部 RAM 中, 并把 0x00000000 设置内部 RAM 的起始地址, CPU 从内部 RAM 的 0x00000000 位置开始启动。这个过 程不需要程序干涉。

程序员需要完成的工作,是把最核心的启动程序放在 Nand Flash 的前 4K 中。

2.  启动程序的安排

由于 Nand Flash 控制器从 Nand Flash 中搬移到内部 RAM 的代码是有限的,所以, 在启动代码的前 4K 里,我 们必须完成 S3C2410 的核心配置以及把启动代码(UBOOT)剩余部分搬到 RAM 中运行。以 UBOOT 为例, 前 4K 完成的主要工作, 见第四部分的 2.2 节。

1.1.2   支持 Nand Flash 启动代码说明

首先在 include/configs/crane2410.h 中加入 CONFIG_S3C2410_NAND_BOOT, 如下:

#define CONFIG_S3C2410_NAND_BOOT      1

支持从 Nand Flash 中启动.

  1. 执行 Nand Flash 初始化 下面代码在 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 函数去执行

...

DW_STACK_START:

.word       STACK_BASE+STACK_SIZE­4

  1. nand_reset C 代码 下面代码被加在/board/crane2410/crane2410.c 中 void nand_reset(void)

{

int i;

/* 设置 Nand Flash 控制器 */ rNFCONF=(1<<15)|(1<<14)|(1<<13)|(1<<12)|(1<<11)|(TACLS<<8)|(TWRPH0<<4)|(TWRPH1<<0);

/* 给 Nand Flash 芯片发送复位命令 */ NF_nFCE_L();

NF_CMD(0xFF);

for(i=0; i<10; i++); NF_WAITRB();

NF_nFCE_H();

}

  1. 从 Nand Flash 中把
    UBOOT 拷贝到 RAM

@read U­BOOT from
Nand Flash to RAM

ldr r0, =UBOOT_RAM_BASE @ 设置第 1 个参数: UBOOT 在 RAM 中的起始地址 mov   r1, #0x0   @
设置第 2 个参数:Nand Flash 的起始地址

mov   r2, #0x20000                        @ 设置第 3 个参数: UBOOT 的长度(128KB)

bl     nand_read_whole                     @ 调用 nand_read_whole(), 该函数在 board/crane2410/crane2410.c 中 tst  r0, #0x0       @
如果函数的返回值为 0,表示执行成功.

beq   ok_nand_read                       @ 执行内存比较


  1. Nand Flash 中把数据读入到 RAM 中

int
nand_read_whole(unsigned char *buf, unsigned long start_addr, int size)

{

int i, j;

/* 如果起始地址和长度不是 512 字节(1 页)的倍数, 则返回错误代码 */

if ((start_addr & NAND_BLOCK_MASK) || (size &
NAND_BLOCK_MASK)) { return ­1;

}

/* 激活 Nand Flash */ NF_nFCE_L();

for(i=0;
i<10; i++);

i = start_addr;

while(i <
start_addr + size) {

/* 读 A 区 */ rNFCMD = 0;

/* 写入读取地址 */ rNFADDR = i & 0xff;
rNFADDR = (i >> 9) & 0xff; rNFADDR = (i >> 17) & 0xff;
rNFADDR = (i >> 25) & 0xff;

NF_WAITRB();

/* 读出一页(512 字节) */

for(j=0; j <
NAND_SECTOR_SIZE; j++, i++) {

*buf = (rNFDATA & 0xff); buf++;

}

}

/* 停止驱动 Nand Flash */ NF_nFCE_H();

return 0;

}

5.  校查搬移后的数据

把 RAM 中的前 4K 与内部中前 4K 进行比较, 如果完全相同, 则表示搬移成功. ok_nand_read:

mov r0, #0x00000000                   @内部 RAM 的起始地址

ldr r1, =UBOOT_RAM_BASE  @UBOOT 在 RAM 中的起始地址

mov r2, #0x400                              @比较 1024 次, 每次 4 字节, 4 bytes
* 1024 = 4K­bytes go_next: @ 比较 1024 次, 每次 4 个字节

ldr  
r3, [r0], #4

ldr r4, [r1], #4 teq   r3, r4

bne notmatch subs r2, r2, #4

beq done_nand_read bne 
go_next

notmatch:

1:b     1b
done_nand_read:

mov pc, r10

原文地址:https://www.cnblogs.com/fanweisheng/p/11106189.html

时间: 2024-10-07 09:51:04

在 U-BOOT 对 Nand Flash 的支持的相关文章

u-boot-2014.10移植第19天----添加nand flash命令支持(一)

今天继续移植nand flash,对于很多情况而言,u-boot从nand flash启动是一个至关重要的功能,毕竟NOR flash成本太高,不是所有开发板都会添加NOR flash. u-boot中的SMDK2410模板是没有支持从nand flash启动的功能的,但是却有支持操作nand_flash的操作命令,2410和2440在nand flash支持上的区别有: 1.2410仅支持小块nandflash,2440则同时支持大块nandflash:2.为支持大块nandflash,244

u-boot-2014.10移植第21天----添加nand flash命令支持(三)

硬件平台:tq2440 开发环境:Ubuntu-3.11 u-boot版本:2014.10 本文允许转载,请注明出处:http://blog.csdn.net/fulinus 虽说nand flash读写操作是可以了,但是我使用nand markbad命令将一个块标记为坏块时,再用nand scrub命令恢复出厂设置时,却出现了下面的错误: nand0: MTD Erase failure: -5 说明我们的nand flash移植是不完全正确的. 下面查找原因 在文件drivers/mtd/n

mtk nand flash配置支持

mtk nand flash配置支持 1.首先确认flash型号,例如:Sandisk的SD7DP24C_4G.2.查看mediatek/build/tools/emigen/MT6572/MemoryDeviceList_MT6572.xls中是否有对该芯片的支持,如果不支持,可以去mtk官网下载最新的MemoryDeviceList_MT6572.xls文件.3.修改mediatek/custom/project_name/preloader/inc/custom_MemoryDevice.

u-boot-2014.10移植第20天----添加nand flash命令支持(二)

继前一天移植的情况,运行后发现: Flash: 2 MiBNAND:  0 MiB 说明Nand flash没有移植成功,在文件drivers/mtd/nand/s3c2440_nand.c 中发现board_nand_init函数中: nand->select_chip = NULL 选择芯片函数为NULL,我们在board_nand_init函数上面加上s3c2440_nand_select函数,代码如下: static void s3c2440_nand_select(struct mtd

u-boot-2014.10移植第22天----添加nand flash命令支持(四)

解决问题: nand0: MTD Erase failure: -5 drivers/mtd/nand/nand_bbt.c文件中初始化bbt /* * Allocate memory (2bit per block) and clear the memory bad block * table. */ this->bbt = kzalloc(len, GFP_KERNEL); if (!this->bbt) return -ENOMEM; 每个block用2个比特表示是否为坏块. nand_

U-BOOT 对 Nand Flash 命令的支持

U-BOOT 对 Nand Flash 命令的支持 在 U­BOOT 下对 Nand Flash 的支持主要是在命令行下实现对 nand flash 的操作.对 nand flash 实现的命令 为:nand info.nand device.nand read.nand write.nand erease.nand bad. 用到的主要数据结构有:struct nand_flash_dev.struct nand_chip.前者包括主要的芯片型号.存储容量. 设备 ID.I/O 总线宽度等信息

u-boot分析(九)----nand flash初始化|nand flash读写分析

u-boot分析(九) 上篇博文我们按照210的启动流程,分析到了初始化串口,由于接下来的取消存储保护不是很重要,所以我们今天按照u-boot的启动流程对nand flash初始化进行分析. 今天我们会用到的文档: 1.        2440芯片手册:http://download.csdn.net/detail/wrjvszq/8358949 2.        6410芯片手册:http://download.csdn.net/detail/wrjvszq/8358965 3.      

【详解】如何编写Linux下Nand Flash驱动

From: http://www.crifan.com/files/doc/docbook/linux_nand_driver/release/html/linux_nand_driver.html 版本:v2.2 Crifan Li 摘要 本文先解释了Nand Flash相关的一些名词,再从Flash硬件机制开始,介绍到Nand Flash的常见的物理特性,且深入介绍了Nand Flash的一些高级功能,然后开始介绍Linux下面和Nand Flash相关的软件架构MTD的相关知识,最后介绍了

五、2440裸机开发 nand flash 操作

五.nand flash 操作 原文地址:http://blog.csdn.net/woshidahuaidan2011/article/details/51220911 by jaosn Email: [email protected] 于nor flash相比,nand flash的容量要大许多,nand 不同于nor ,其采用i/o接口只能采取顺序访问,s3c2440不仅具有nandflash的接口,而且还可以利用某些机制实现直接从nandflash启动并运行程序.相对于norflash,