U-Boot在2440上Nand Flash移植过程问题整理

本文介绍了在2440平台上移植U-Boot时,针对Nand Flash的操作,包括配置寄存器定义、Nand Flash的片选控制以及低级读取函数的实现。同时,讨论了环境变量存储位置的更改,从Nor Flash转移到Nand Flash,并指定了环境变量在Nand Flash中的偏移和大小。
摘要由CSDN通过智能技术生成
参考链接1:(该链接针对《嵌入式Linux应用 开发完全手册》上的例子并结合K9F1G08做了相应的修改,并附了源码)
参考链接2:介绍了整个U-BOOT移植过程,整理得很详细。
参考链接3:结合参考链接2,针对K9F1G08芯片做了修改


Nand Flash移植过程中针对自己Nand Flash的型号(K9F1G08U0B,128MB),修改nand_read.c文件如下

#include <config.h>

#define NF_BASE 0x4E000000 //Nand Flash配置寄存器基地址

#define __REGb(x) (*(volatile unsigned char *)(x))
#define __REGi(x) (*(volatile unsigned int *)(x))

#define NFCONF __REGi(NF_BASE + 0x0 ) //通过偏移量还是得到配置寄存器基地址
#define NFCONT __REGi(NF_BASE + 0x4 ) //通过偏移量得到控制寄存器基地址
#define NFCMD __REGb(NF_BASE + 0x8 ) //通过偏移量得到指令寄存器基地址
#define NFADDR __REGb(NF_BASE + 0xC ) //通过偏移量得到地址寄存器基地址
#define NFDATA __REGb(NF_BASE + 0x10) //通过偏移量得到数据寄存器基地址
#define NFSTAT __REGb(NF_BASE + 0x20) //通过偏移量得到状态寄存器基地址

#define NAND_CHIP_ENABLE (NFCONT &= ~(1<<1)) //Nand片选使能
#define NAND_CHIP_DISABLE (NFCONT |= (1<<1)) //取消Nand片选
#define NAND_CLEAR_RB (NFSTAT |= (1<<2))
#define NAND_DETECT_RB { while(! (NFSTAT&(1<<2)) );}

#define NAND_SECTOR_SIZE 2048
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)

/* low level nand read function */
int nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
int i, j;
int page_num;

if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK)) 
{
return -1; //地址或长度不对齐
}

NAND_CHIP_ENABLE; //选中Nand片选

for(i=start_addr; i < (start_addr + size);) 
{
//发出READ0指令
NAND_CLEAR_RB;
NFCMD = 0;

//对Nand进行寻址
page_num = i >> 11 ; /* addr / 2048 */
NFADDR = 0;
NFADDR = 0;
NFADDR = page_num & 0xFF;
NFADDR = (page_num >> 8) & 0xFF;
NFADDR = (page_num >> 16) & 0xFF;
        
NFCMD = 0x30;

NAND_DETECT_RB;

for(j=0; j < NAND_SECTOR_SIZE; j++, i++) 
{
*buf = (NFDATA & 0xFF);
buf++;
}
}

NAND_CHIP_DISABLE; //取消片选信号

return 0;
}


环境变量问题:

在my2440.h中

//注释掉环境变量保存到Flash的宏(注意:如果你要使用上一篇中的从Nor启动的saveenv命令,则要恢复这些Flash宏定义)
//#define    CONFIG_ENV_IS_IN_FLASH    1
//#define CONFIG_ENV_SIZE        0x10000    /* Total Size of Environment Sector */

//添加环境变量保存到Nand的宏(注意:如果你要使用上一篇中的从Nor启动的saveenv命令,则不要这些Nand宏定义)
#define CONFIG_ENV_IS_IN_NAND  1
#define CONFIG_ENV_OFFSET      0x40000 //将环境变量保存到nand中的0x40000位置
#define CONFIG_ENV_SIZE        0x20000 /* Total Size of Environment Sector */

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值