📄 nand.c
字号:
/******************************************************************************* * * Copyright: * Everfocus INC. All Right Reserved. * * File: nand.c * * Notes: 关于nand flash详细初始化,请参见nand.txt文件 * * Modifications: * $Log: nand.c,v $ * Revision 1.5 2003/09/23 08:24:47 tangmian * 添加了新的nand命令, 用于初始化事件记录数据库 * * Revision 1.4 2003/09/15 01:23:40 tangmian * Add a new function to be used to create Card Database Header. * * Revision 1.3 2003/08/19 06:33:19 tangmian * 修改了nand flash的分区. * ******************************************************************************/#include "dbug.h"#include "libdbug.h"#include "net.h"#include "mcf5272.h"#define NANDHEADOFFSET 0#define NANDHEADSIZE 1#define LINUXKERNELOFFSET 1#define LINUXKERNELSIZE 127#define ROOTFSOFFSET 128#define ROOTFSSIZE 256#define LOGDBOFFSET 384#define LOGDBSIZE 978#define CARDDBOFFSET 1408#define CARDDBSIZE 398#define IDINDEXOFFSET 1856#define IDINDEXSIZE 64#define NUMINDEXOFFSET 1952#define NUMINDEXSIZE 64#if 0#define LOGDBSIZE 1024#define LOGDBOFFSET 256#define CARDDBSIZE 384#define CARDDBOFFSET 1344#define IDINDEX 64#define NUMBERINDEX 64#endifextern ADDRESS md_last_address;extern ADDRESS disasm_last_address;extern void download_image(ADDRESS);extern void download_coff(void);extern int download_nand(ADDRESS);extern int download_srecord(int);extern int download_elf(int);int info_flash[11];unsigned char data[512];unsigned char badinfo[2048];union NandChange{ int a; char b[4];};/* =========================== io_outsb ====================================== * Function: * 拷贝buf中的数据到地址addr所指向的空间中 * Params: * addr: 存放数据的起始地址 * buf: 被拷贝数据的首地址 * len: 被拷贝数据的长度 * =========================================================================== */void io_outsb(unsigned int addr, void *buf, int len){ volatile unsigned char *ap = (volatile unsigned char *) addr; unsigned char *bp = (unsigned char *) buf; while (len--) *ap++ = *bp++;}/* =========================== io_insb ====================================== * Function: * 拷贝addr所指向的空间中的数据到buf中 * Params: * addr: 被拷贝数据的首地址 * buf: 存放数据的起始地址 * len: 被拷贝数据的长度 * =========================================================================== */void io_insb(unsigned int addr, void *buf, int len){ volatile unsigned char *ap = (volatile unsigned char *) addr; unsigned char *bp = (unsigned char *) buf; while (len--) *bp++ = *ap++;}/* =========================== StrtoNum ====================================== * Function: * 将字符串转换成整形数 * Params: * str: 字符串首地址 * Return value: * 被转换的整形数 * =========================================================================== */int StrtoNum(char* str){ int i, j, a, b, size; int num=0; size=strlen(str); for(i=0; i<size; i++) { b=1; if((str[i]<='9')&&(str[i]>='0')) { a=(int)(str[i]-'0'); for(j=0; j<size-i-1; j++) b*=10; num+=a*b; } else return -1; } return num;}/* =========================== StrtoHex ====================================== * Function: * 将字符串转换成整形数,用于转换16进制 * Params: * str: 字符串首地址 * Return value: * 被转换的整形数 * =========================================================================== */int StrtoHex(char* str){ int i, a, size; int num=0; char* pchar; pchar=&str[2]; size=strlen(str)-2; for(i=0; i<size; i++) { if((str[i+2]>='0')&&(str[i+2]<='9')) a=(int)(str[i+2]-0x30); else if((str[i+2]>='a')&&(str[i+2]<='f')) a=(int)(str[i+2]-0x57); else return -1; num+=a<<((size-i-1)*4); } return num;}/* =========================== Flash_Readstatus ====================================== * Function: * 读取nand flash的状态 * Return value: * nand flash的状态: 0xC0表示正常, 其他表示不正常 * =================================================================================== */int Flash_Readstatus(){ int status; CLE_H(); writeb(0x70, NANDADDR); CLE_L(); status=readb(NANDADDR); printf("\n"); printf("The NAND Flash status is %x\n", status); return status;}/* =========================== Flash_ReadID==== ====================================== * Function: * 读取nand flash的ID号 * =================================================================================== */void Flash_ReadID(){ int a, b; Select(); CLE_H(); writeb(0x90, NANDADDR); CLE_L(); ALE_H(); writeb(0x00, NANDADDR); ALE_L(); a=readb(NANDADDR); b=readb(NANDADDR); NSelect(); printf("The manufucture ID is %x, The device ID is %x\n", a, b); }/* =========================== Flash_Reset===== ====================================== * Function: * 重新启动nand flash设备 * =================================================================================== */void Flash_Reset(){ CLE_L(); ALE_L(); Select(); CLE_H(); writeb(0xff, NANDADDR); CLE_L(); while((readw(MBASS+PADAT)&0x4000)==0x0000) ; NSelect();// printf("The nand flash reset OK!!!\n");}/* =========================== Flash_Pageread ====================================== * Function: * 读取nand flash设备一页数据 * Params: * page: 页数 * num: 读取一页中多少字节 * ================================================================================= */void Flash_Pageread(unsigned long page, int num){ int j; unsigned int ADD2, ADD3; memset(data, 0, 512); ALE_L(); CLE_L(); ADD3=(unsigned int)((page<<16)>>24); ADD2=(unsigned int)((page<<24)>>24); Select(); CLE_H(); writeb(0x00, NANDADDR); /*Main area data read command(00h)*/ CLE_L(); ALE_H(); writeb(0x00, NANDADDR); writeb(ADD2, NANDADDR); writeb(ADD3, NANDADDR); ALE_L(); while((readw(MBASS+PADAT)&0x4000)==0x0000) ; for(j=0; j<num; j++) data[j]=readb(NANDADDR); while((readw(MBASS+PADAT)&0x4000)==0x0000) ; NSelect();}/* =========================== Flash_Readdata ====================================== * Function: * 读取nand flash设备中的数据,并拷贝到内存中 * Params: * page:读取数据的起始页数 * num:总共要读取的字节数 * address:将读出的数据存入内存的首地址 * ================================================================================= */void Flash_Readdata(unsigned long page, int num, unsigned long address){ int i, cpage, ch1; int caddr, pagenum; cpage=page; caddr=address; pagenum=num/512; for(i=0; i<pagenum; i++) {a: ch1=cpage/32; if(badinfo[ch1]!=0x01) { cpage=(ch1+1)*32; goto a; } Flash_Pageread(cpage, 512); io_outsb(caddr, data, 512); caddr+=512; cpage++; } pagenum=num%512; if(pagenum!=0) {b: ch1=cpage/32; if(badinfo[ch1]!=0x01) { cpage=(ch1+1)*32; goto b; } Flash_Pageread(cpage, pagenum); io_outsb(caddr, data, pagenum); } }/* =========================== Flash_Display ====================================== * Function: * 显示nand flash设备中某一页的数据 * Params: * num:页数 * ================================================================================ */void Flash_Display(int num){ int i; unsigned ADD2, ADD3; unsigned char data[528]; if(num>2048*32) { printf("The page number is out of range!!!\n"); return; } ADD3=(unsigned int)((num<<16)>>24); ADD2=(unsigned int)((num<<24)>>24); ALE_L(); CLE_L(); Select(); CLE_H(); writeb(0x00, NANDADDR); /*Main area data read command(00h)*/ CLE_L(); ALE_H(); writeb(0x00, NANDADDR); writeb(ADD2, NANDADDR); writeb(ADD3, NANDADDR); ALE_L(); while((readw(MBASS+PADAT)&0x4000)==0x0000) ; for(i=0;i<528;i++) data[i]=readb(NANDADDR); while((readw(MBASS+PADAT)&0x4000)==0x0000) ; NSelect(); printf("The page data is:"); for(i=0; i<512; i++) { if(i % 16 == 0) printf("\n%04X: ", i); printf("%02x,", data[i]); } printf("\n"); printf("The oob data is:\n"); for(i=0; i<16; i++) printf("%x,", data[512+i]); printf("\n"); }/* =========================== Flash_Pagewrite ====================================== * Function: * 写一页数据到nand flash中 * Params: * page:页数 * num:写入的字节数 * ================================================================================== */void Flash_Pagewrite(unsigned long page, int num){ int i, state=0; unsigned int ADD2, ADD3; Flash_Reset(); ADD3=(unsigned int)((page<<16)>>24); ADD2=(unsigned int)((page<<24)>>24); ALE_L(); CLE_L(); Select(); CLE_H(); writeb(0x80, NANDADDR); /*Sequential Data Input command (80h)*/ CLE_L(); ALE_H(); writeb(0x00, NANDADDR); writeb(ADD2, NANDADDR); writeb(ADD3, NANDADDR); ALE_L(); for(i=0; i<num; i++) writeb(data[i], NANDADDR); CLE_H(); writeb(0x10, NANDADDR); CLE_L(); while((readw(MBASS+PADAT)&0x4000)==0x0000) ; CLE_H(); writeb(0x70, NANDADDR); CLE_L(); state=readb(NANDADDR); NSelect();}/* =========================== Flash_Writedata ====================================== * Function: * 将内存中的数据写入nand flash中 * Params: * page:写入nand flash中的起始页数 * num:写入多少字节 * address: 内存的起始地址 * ================================================================================== */void Flash_Writedata(unsigned long page, int num, unsigned long address){ int i, cpage, ch1; int caddr, pagenum; cpage=page; caddr=address; pagenum=num/512;// printf("The page is %d, the number is %d, the address is %d, the pagenum is %d\n", page, num, address, pagenum); printf("Nand Writing frome page %d, %d bytes...", page, num); for(i=0; i<pagenum; i++){a: if((i % 80) == 0){ printf("\n"); } printf("."); ch1=cpage/32; if(badinfo[ch1]!=0x01){ cpage=(ch1+1)*32; goto a; } io_insb(caddr, data, 512); Flash_Pagewrite(cpage, 512); caddr+=512; cpage++; } pagenum=num%512; if(pagenum!=0){b: ch1=cpage/32; if(badinfo[ch1]!=0x01){ cpage=(ch1+1)*32; goto b; } io_insb(caddr, data, pagenum); Flash_Pagewrite(cpage, pagenum); } printf("\n");}/* =========================== Flash_WritedataEx ====================================== * Function: * 将内存中的数据写入nand flash中,并写带外数据 * Params: * page:写入nand flash中的起始页数 * num:写入多少字节 * address: 内存的起始地址 * ==================================================================================== */void Flash_WritedataEx(unsigned long page, int num, unsigned long address){ int i, cpage, ch1; int caddr, pagenum; cpage=page; caddr=address; pagenum=num/528; printf("The page is %d, the number is %d, the address is %d, the pagenum is %d\n", page, num, address, pagenum); for(i=0; i<pagenum; i++) {a: ch1=cpage/32; if(badinfo[ch1]!=0x01) { cpage=(ch1+1)*32; goto a; } io_insb(caddr, data, 528); Flash_Pagewrite(cpage, 528); caddr+=528; cpage++; } pagenum=num%528; if(pagenum!=0) {b: ch1=cpage/32; if(badinfo[ch1]!=0x01) { cpage=(ch1+1)*32; goto b; } io_insb(caddr, data, pagenum); Flash_Pagewrite(cpage, pagenum); } }/* =========================== Flash_Init ============================================= * Function: * 初始化寄存器以便操作nand flash * ==================================================================================== */void Flash_Init(){ INITCSBR1(); INITCSOR1(); INITPACNT(); INITPADDR(); info_flash[0]=0xec; //Initial information of flash info_flash[1]=32; info_flash[2]=2048; info_flash[3]=32; info_flash[4]=528; info_flash[5]=512; info_flash[6]=16; info_flash[7]=32; info_flash[8]=0xff; info_flash[9]=0x00; info_flash[10]=0x00;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -