📄 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<CopyBack_Count;i++){
flashCopyBLack(Sour_addh,Sour_addl,Dest_addh,Dest_addl);
Sour_addl ++;
Dest_addl ++;
}
Erase_addl = (XmtBuff.b[20]/0x20) * 0x20;
Erase_addh = XmtBuff.b[19];
WritePageNum = (XmtBuff.b[22]<<8)+XmtBuff.b[23];
Erase_Count = WritePageNum / 0x20;
if(WritePageNum % 0x20){
Erase_Count ++;
if((WritePageNum % 0x20) > (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<CopyBack_two_count;i++){
flashCopyBLack(Sour_two_addh,Sour_two_addl,Dest_two_addh,Dest_two_addl);
Sour_two_addl ++;
Dest_two_addl ++;
}
for(i=0;i<Erase_Count;i++){
flashErase(Erase_addh, Erase_addl);
if(Erase_addl == 224){
Erase_addl = 0x00;
Erase_addh ++;
}else
Erase_addl += 0x20;
}
for(i=0;i<CopyBack_Count;i++){
Sour_addl --;
Dest_addl --;
flashCopyBLack(Dest_addh,Dest_addl,Sour_addh,Sour_addl);
}
for(i=0;i<CopyBack_two_count;i++){
Sour_two_addl --;
Dest_two_addl --;
flashCopyBLack(Dest_two_addh,Dest_two_addl,Sour_two_addh,Sour_two_addl);
}
Flash_Write_Sec= 0x00;
Flash_Write_Col= 0x00;
Flash_Write_addl= XmtBuff.b[20];
Flash_Write_addh= XmtBuff.b[19];
WriteResidueVal=(XmtBuff.b[22]<<8)+XmtBuff.b[23];
}
void flashWrite(unsigned char * PageBuff)
{
unsigned int i;
if(WriteResidueVal > 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;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -