⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nand.c

📁 S3C2410的bootloader
💻 C
📖 第 1 页 / 共 2 页
字号:
/******************************************************************************* *  * 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 + -