📄 flash(39vf160).c
字号:
/*************************************************************************
* *
* File name Version *
* 1.0 *
* Flash.c *
* *
* Description *
* *
* This file contain the program used to operate on Flashrom *
* (32 bits wide SST std's 39VF160). *
* *
* History *
* *
* Name Date Remarks *
* *
* 03-30-2003 Created initial version 1.0 *
* 04-30-2005 Created initial version 2.0 *
* *
* *
* Copyright (c) 1992-2009 CTI & YDHQ *
*************************************************************************/
#undef _INLINE
#include <flash.h>
#define DELAY_TIME 2
extern cregister unsigned int IE,IF,IOF,ST;
void sleep(int n )
{
volatile int m;
for(m=0;m<n;m++)
{
nop();
}
}
/************************************************************************/
/* PROCEDURE: Check_Data_Polling */
/* */
/* During the internal program cycle, any attempt to read DQ7 of the */
/* last byte loaded during the page/byte-load cycle will receive the */
/* complement of the true data. Once the program cycle is completed, */
/* DQ7 will show true data. */
/* */
/* Input: */
/* Dst must already be set-up by the caller */
/* True Data is the original (true) data */
/* */
/* Output: */
/* None */
/************************************************************************/
static int compare_data(int *flash_addr,int idata)
{
volatile int c,odata,waiting = 0;
idata &= 0x00800080;
do
{
waiting += 1;
c = *flash_addr;
odata = c&0x00800080;
if(odata==idata) break;
} while(waiting<1000);
}
void flash_ram_int_writer(int *flash_ram_addr,int *data,int cnt)
{
int i;
int c,odata,idata;
for(i=0;i<cnt;)
{
idata = data[i];
*FLASH_ADDR_555 = 0X00AA00AA;
sleep(DELAY_TIME);
*FLASH_ADDR_2AA = 0X00550055;
sleep(DELAY_TIME);
*FLASH_ADDR_555 = 0X00A000A0;
sleep(DELAY_TIME);
flash_ram_addr[i]= idata;
sleep(DELAY_TIME);
compare_data(&flash_ram_addr[i],idata);
i += 1;
}
sleep(DELAY_TIME);
*FLASH_ADDR_555 = 0X00AA00AA;
sleep(DELAY_TIME);
*FLASH_ADDR_2AA = 0X00550055;
sleep(DELAY_TIME);
*FLASH_ADDR_555 = 0X00F000F0;
sleep(DELAY_TIME);
}
/*A section is 2KWord*/
void flash_section_erase(int *seg_addr)
{
volatile int odata;
*FLASH_ADDR_555 = 0X00AA00AA;
sleep(DELAY_TIME);
*FLASH_ADDR_2AA = 0X00550055;
sleep(DELAY_TIME);
*FLASH_ADDR_555 = 0X00800080;
sleep(DELAY_TIME);
*FLASH_ADDR_555 = 0X00AA00AA;
sleep(DELAY_TIME);
*FLASH_ADDR_2AA = 0X00550055;
sleep(DELAY_TIME);
*seg_addr = 0X00300030;
for(odata=0; odata<1000; odata+=1) sleep(1500);
}
/*A section is 2KWord*/
void flash_chip_erase(void)
{
volatile int *chip_addr = (volatile int*)0, odata;
*FLASH_ADDR_555 = 0X00AA00AA;
sleep(DELAY_TIME);
*FLASH_ADDR_2AA = 0X00550055;
sleep(DELAY_TIME);
*FLASH_ADDR_555 = 0X00800080;
sleep(DELAY_TIME);
*FLASH_ADDR_555 = 0X00AA00AA;
sleep(DELAY_TIME);
*FLASH_ADDR_2AA = 0X00550055;
sleep(DELAY_TIME);
*FLASH_ADDR_555 = 0X00100010;
for(odata=0; odata<4000; odata+=1) sleep(1500);
}
int ram_to_flash(int *flashAddr,int *ramAddr, int wCnt)
{
volatile int xcount,n;
ST &= 0xffffdfff;
xcount = wCnt/2048;
if(xcount==0)
{
flash_section_erase(flashAddr);
}
else if(xcount>=1)
{
if((wCnt%2048)!=0) xcount += 1;
for(n=0;n<xcount;n+=1) flash_section_erase(flashAddr+n*2048);
}
flash_ram_int_writer(flashAddr,ramAddr,wCnt);
ST |= 0x00002000;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -