www.pudn.com > usbcode.rar > NFlash32._c


/*++ 
 
Module Name: 
 
         NFlash32.c 
 
Abstract: 
 
         Header file related to D12 module 
 
Environment: 
 
        ICCAVR 6.29 
 
Revision History: 
 
        04/23/2004      chenchil   created 
 
--*/ 
/******************************************************************/ 
#include "io8515v.h" 
#include "d12head.h" 
#include "scsi.h" 
 
unsigned int WriteResidueVal = 0; 
unsigned char Flash_Write_Sec = 0x00; 
unsigned char Flash_Write_Col = 0x00; 
unsigned char Flash_Write_addl = 0x00; 
unsigned char Flash_Write_addh = 0x00; 
unsigned long ReadResidueVal = 0; 
unsigned char Flash_Read_Sec = 0x00; 
unsigned char Flash_Read_Col = 0x00; 
unsigned char Flash_Read_addl = 0x00; 
unsigned char Flash_Read_addh = 0x00; 
 
void flashErase(unsigned char addh,unsigned char addl) 
{ 
	char i=0; 
	fWPs;//打开写保护 
	fCOMMAND = 0x60; 
	fADD = addl; 
	fADD = addh; 
	fCOMMAND = 0xd0; 
	asm("nop \n nop"); 
	while(!fRB); 
	fCOMMAND = 0x70; 
	i = fDATA; 
	csram; 
	fWPc;//写保护 
} 
 
void flashWritecmd(void) 
{ 
	unsigned char Erase_addh,Erase_addl; 
	unsigned char Sour_addh,Sour_addl,Dest_addh,Dest_addl; 
	unsigned char Sour_two_addh,Sour_two_addl,Dest_two_addh,Dest_two_addl; 
	unsigned int Erase_Count = 0,i = 0; 
	unsigned int CopyBack_Count = 0; 
	unsigned int CopyBack_two_count = 0; 
	unsigned int WritePageNum = 0; 
	union{ 
		unsigned char c[2]; 
		unsigned int add; 
	}Start_add; 
	union{ 
		unsigned char c[2]; 
		unsigned int add; 
	}End_add; 
	flashErase(0xfa, 0x00); 
	Sour_addh = XmtBuff.b[19]; 
	Sour_addl = (XmtBuff.b[20]/0x20) * 0x20; 
	Dest_addh = 0xfa; 
	Dest_addl = (XmtBuff.b[20]/0x20) * 0x20; 
	CopyBack_Count = XmtBuff.b[20]%0x20; 
	for(i=0;i (0x20 - (XmtBuff.b[20] % 0x20))) 
			Erase_Count ++; 
	}else if(XmtBuff.b[20] % 0x20){ 
		Erase_Count ++; 
	} 
	Start_add.add = (XmtBuff.b[19]<<8)+XmtBuff.b[20]; 
	End_add.add = Start_add.add + WritePageNum; 
	flashErase(0xfb, 0x00); 
	Sour_two_addh = End_add.c[1]; 
	Sour_two_addl = End_add.c[0]; 
	Dest_two_addh = 0xfb; 
	Dest_two_addl = End_add.c[0]; 
	CopyBack_two_count = (Erase_Count * 0x20) - CopyBack_Count -WritePageNum; 
	for(i=0;i 0) 
	{ 
		fWPs;//打开写保护 
		fCOMMAND = Flash_Write_Sec; 
		fCOMMAND = 0x80; 
		fADD = 0x00; 
		fADD = Flash_Write_addl; 
		fADD = Flash_Write_addh; 
		 
		for(i=0;i<256;i++) 
		{ 
			fDATA = PageBuff[i]; 
		} 
		 
		fCOMMAND = 0x10; 
		asm("nop \n nop"); 
		while(!fRB); 
		fCOMMAND = 0x70; 
		i = fDATA; 
		D12_COMMAND = 0xf2;// 清 OUT 缓冲区 
		csram; 
		fWPc;//写保护 
		 
		if(Flash_Write_Sec== 0x01){ 
			WriteResidueVal = WriteResidueVal - 1; 
			if(Flash_Write_addl== 255){ 
				Flash_Write_addl= 0x00; 
				Flash_Write_addh++; 
			}else 
				Flash_Write_addl++; 
		} 
	} 
} 
 
void flashCopyBLack(unsigned char Source_addh,unsigned char Source_addl,unsigned char Destination_addh,unsigned char Destination_addl) 
{ 
	unsigned char i; 
	fWPs;//打开写保护 
	fCOMMAND = 0x00; 
	fADD = 0x00; 
	fADD = Source_addl; 
	fADD = Source_addh; 
	asm("nop \n nop"); 
	while(!fRB); 
	 
	fCOMMAND = 0x8a; 
	fADD = 0x00; 
	fADD = Destination_addl; 
	fADD = Destination_addh; 
	asm("nop \n nop"); 
	while(!fRB); 
	fCOMMAND = 0x70; 
	i = fDATA; 
	csram; 
	fWPc;//写保护 
} 
 
void flashReadcmd(void) 
{ 
	Flash_Read_Sec = 0x00; 
	Flash_Read_Col = 0x00; 
	Flash_Read_addl = XmtBuff.b[20]; 
	Flash_Read_addh = XmtBuff.b[19]; 
  	ReadResidueVal = (XmtBuff.b[22]<<8) + XmtBuff.b[23]; 
      	ReadResidueVal = 512 * ReadResidueVal; 
	fCOMMAND = 0xff; 
	asm("nop \n nop"); 
	while(!fRB); 
} 
 
void flashRead(void) 
{ 
	unsigned char i; 
	unsigned char  temp; 
	if(ReadResidueVal > 0){ 
		ReadResidueVal -= 64; 
		temp = (unsigned char)(Flash_Read_Col + 64); 
		fCOMMAND = Flash_Read_Sec; 
		fADD = Flash_Read_Col; 
		fADD = Flash_Read_addl; 
		fADD = Flash_Read_addh; 
		asm("nop \n nop"); 
		while(!fRB); 
		switch (Flash_Read_Sec) 
		{ 
			case 0x00: 
				if(temp == 0) 
				{ 
					Flash_Read_Sec = 0x01; 
					Flash_Read_Col = 0x00; 
				}else 
				{ 
					Flash_Read_Col += 64; 
				} 
				break; 
			case 0x01: 
				if(temp == 0) 
				{ 
					if(Flash_Read_addl == 255){ 
						Flash_Read_addl = 0x00; 
						Flash_Read_addh ++; 
					}else 
						Flash_Read_addl ++; 
					Flash_Read_Sec = 0x00; 
					Flash_Read_Col = 0x00; 
				}else 
				{ 
					Flash_Read_Col += 64; 
				} 
				break; 
		} 
		 
		D12_COMMAND = 0x05;// 选择 IN 端点(指针指向0位置) 
		cwait; 
		D12_COMMAND = 0xf0;// 写缓冲区 
		cwait; 
		D12_DATA = 0x00; 
		cwait; 
		D12_DATA = 64; 
		csram; 
		for(i=0;i<64;i++) 
		{ 
			D12_DATA = fDATA; 
			cwait; 
		} 
		D12_COMMAND = 0xfa;// 设置 IN 缓冲区有效(满标志) 
		csram; 
	} 
}