?? flashdrv.c
字號:
/********************************************************************************
Function: HZK flash driver file
description:
date: 2004-03-05
programmer: WYS
change:
*******************************************************************************/
#include "backup.h"
void flash_SDP_enable(unsigned char icnum);
void flash_SDP_disable(unsigned char icnum);
void far flash_write_sec(unsigned int sector,unsigned char icnum);
void far flash_read_sec(unsigned int sector,unsigned char icnum);
unsigned char far flash_write(unsigned long addr,unsigned char *str,int length);
void far flash_chip_erase(unsigned char icnum);
void far flash_all_clear(void);
#define BYTES_DIV_SECTOR 256
#define IC_SECTOR_NUMBER 2048
/*************************************************************************
* Function: flash software data protection enable
************************************************************/
void flash_SDP_enable(unsigned char icnum)
{
unsigned char *ptrfls;
long addr;
addr=0x100000;
ptrfls = (unsigned char *)(addr+0x5555);
*ptrfls = 0xaa;
ptrfls = (unsigned char *)(addr+0x2aaa);
*ptrfls = 0x55;
ptrfls = (unsigned char *)(addr+0x5555);
*ptrfls = 0xa0;
}
/*************************************************************************
* Function: flash software data protection disable
* Input: IC chip serial number(0~2)
************************************************************/
void flash_SDP_disable(unsigned char icnum)
{
unsigned char *ptrfls;
long addr;
addr=0x100000;
ptrfls = (unsigned char *)(addr+0x5555); //disable command
*ptrfls = 0xaa;
ptrfls = (unsigned char *)(addr+0x2aaa);
*ptrfls = 0x55;
ptrfls = (unsigned char *)(addr+0x5555);
*ptrfls = 0x80;
ptrfls = (unsigned char *)(addr+0x5555);
*ptrfls = 0xaa;
ptrfls = (unsigned char *)(addr+0x2aaa);
*ptrfls = 0x55;
ptrfls = (unsigned char *)(addr+0x5555);
*ptrfls = 0x20;
}
/*************************************************************************
* Function: write to flash a sector
* Input: sector(the flash sector number 0~2047)
* Input: IC chip serial number(0~2)
* data trans by : flashData[256]
************************************************************/
void far flash_write_sec(unsigned int sector,unsigned char icnum)
{
unsigned char *ptrfls;
int i,j;
long pass;
asm("\tFCLR I"); //disable int
asm("\tNOP");
flash_SDP_enable(icnum); //software data protection enable
pass = (long)sector;
pass = pass * BYTES_DIV_SECTOR; //offset in IC
pass+=0x100000;
ptrfls = (unsigned char *)pass;
for(i=0;i<BYTES_DIV_SECTOR;i++)
{
ptrfls[i]=flashData[i]; //data writer
}
asm("\tNOP");
asm("\tFSET I"); //Enable int
time_ap=30;
while(time_ap){}; //wait 15ms
}
/*************************************************************************
* Function: read from flash a sector
* Input: sector(the flash sector number 0~2047)
* Input: IC chip serial number(0~2)
* data trans by : flashData[256]
************************************************************/
void far flash_read_sec(unsigned int sector,unsigned char icnum)
{
unsigned char *ptrfls;
int i;
long pass;
pass = (long)sector;
pass = pass * BYTES_DIV_SECTOR; //offset in IC
pass+=0x100000;
ptrfls = (unsigned char *)pass;
for(i=0;i<BYTES_DIV_SECTOR;i++)
{
flashData[i]=ptrfls[i]; //data read
}
}
/*************************************************************************
* Function: write to flash a string
* Input: addr(0x100000~0x27ffff) -> flash absolute address
* str -> data point
* length -> data length
************************************************************/
unsigned char far flash_write(unsigned long addr,unsigned char *str,int length)
{
unsigned char *pstr;
unsigned char icnum;
long SecNum;
int i;
int j;
int k;
int pos;
pstr = str;
SecNum = (addr&0x7ffff) >> 8; //get the flash sector number
pos = (int)(addr & 0xff); //get the offset in the sector
j=0; //data length
for(k=0;k<IC_SECTOR_NUMBER;k++)
{
flash_read_sec(SecNum,icnum); //read a sector data to flashData[]
for(i=pos;i<BYTES_DIV_SECTOR;i++)
{
if(j>=length) break;
flashData[i] = *pstr++; //put data that want to writer into flashData[]
j++;
}
pos=0;
flash_write_sec(SecNum,icnum); //writer a sector data to flash
if(j>=length) break;
SecNum++;
if(SecNum>=IC_SECTOR_NUMBER)
{
break;
}
}
pstr = (unsigned char *)addr;
for(i=0;i<length;i++) //collate data
{
if((*pstr)!=(*str))
{
return NG;
}
str++;
pstr++;
}
return OK;
}
/*************************************************************************
* Function: flash chip erase
* Input: IC chip serial number(0~2)
note:
1)for at29c040, the erase time is 20ms.
2)the erease result is FF
3)if boot lockout feature enable, this function can NOT work
************************************************************/
void far flash_chip_erase(unsigned char icnum)
{
unsigned char *ptrfls;
long addr;
addr=0x100000;
ptrfls = (unsigned char *)(addr+0x5555); //chip erase comand
*ptrfls = 0xaa;
ptrfls = (unsigned char *)(addr+0x2aaa);
*ptrfls = 0x55;
ptrfls = (unsigned char *)(addr+0x5555);
*ptrfls = 0x80;
ptrfls = (unsigned char *)(addr+0x5555);
*ptrfls = 0xaa;
ptrfls = (unsigned char *)(addr+0x2aaa);
*ptrfls = 0x55;
ptrfls = (unsigned char *)(addr+0x5555);
*ptrfls = 0x10;
time_ap=60;
while(time_ap); //max.30ms delay
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -