📄 flash_memory.c
字号:
/****************************************************************************/
/* */
/* Copyright (C) 2006 Oki Electric Industry Co., LTD. */
/* */
/* System Name : ML675050 */
/* Module Name : Flash Memory Write Utility flash module */
/* File Name : flash_memory.c */
/* Revision : 01.00 */
/* Date : 2006/03/07 */
/* */
/****************************************************************************/
#include "fmwu_common.h"
#include "flash_memory.h"
/***** Define *****/
#define FLASH_SIZE 0x800000 /* External Flash Memory Size 2006.3.7 */
#define BIT_PASS_W 0x00000080
#define BIT_TIME_LIMIT_W 0x00000020
/****** DATA *******/
#define DAT_10 0x00000010
#define DAT_55 0x00000055
#define DAT_80 0x00000080
#define DAT_A0 0x000000A0
#define DAT_AA 0x000000AA
/****** ADDRESS ******/
static unsigned int FLASH_START = 0xC8800000; /* External Flash Start Address 2006.3.7*/
/****** FUNCTION ******/
static int subPoling(UHWORD *, UHWORD);
/********************************************************************/
/* Flash Memory Erase Proc */
/********************************************************************/
int fmChipErase(void)
{
int i;
unsigned char * addr = 0;
/* Flash Memory all Erase */
out_hw((FLASH_START + (ADDR_555 << 1)), DAT_AA); /* Flash Erase Command */
out_hw((FLASH_START + (ADDR_2AA << 1)), DAT_55);
out_hw((FLASH_START + (ADDR_555 << 1)), DAT_80);
out_hw((FLASH_START + (ADDR_555 << 1)), DAT_AA);
out_hw((FLASH_START + (ADDR_2AA << 1)), DAT_55);
out_hw((FLASH_START + (ADDR_555 << 1)), DAT_10);
/* Check Erase End */
if(subPoling((UHWORD*)FLASH_START, (UHWORD)BIT_PASS_W) != OK){
return ERROR;
}
addr = (UBYTE *)FLASH_START;
for(i=0; i<FLASH_SIZE; i++, addr++)
{
if(in_b(addr) != 0xFF)
return ERROR;
}
return OK;
}
/********************************************************************/
/* Flash Memory Write Proc */
/********************************************************************/
UWORD fmDataWrite(unsigned char *src_addr, unsigned long dst_offset, unsigned long write_size)
{
unsigned short *write_addr = (unsigned short *)(FLASH_START + dst_offset);
unsigned short *read_addr = (unsigned short *)src_addr;
unsigned short write_data;
UWORD i;
UWORD size = 0;
/* check for write data */
if((write_size & 1) == 1){
src_addr[write_size] = 0xFF;
write_size++;
}
for(i=0; i<write_size; i+=2, write_addr++, read_addr++){
write_data = in_hw(read_addr);
out_hw((FLASH_START + (ADDR_555 << 1)), DAT_AA);
/* Flash Write Command */
out_hw((FLASH_START + (ADDR_2AA << 1)), DAT_55);
out_hw((FLASH_START + (ADDR_555 << 1)), DAT_A0);
out_hw(write_addr, write_data);
/* Check Write End */
if(subPoling(write_addr, write_data) != OK){
break;
}
size += 2;
}
return size;
}
/********************************************************************/
/* Flash Memory Data Poling Proc */
/********************************************************************/
static int subPoling(UHWORD *addr, UHWORD data)
{
UHWORD pol;
pol = in_hw(addr); /* Data Read */
while((pol & BIT_PASS_W) != (data & BIT_PASS_W))
{ /* D7==1 */
if((pol & BIT_TIME_LIMIT_W) == BIT_TIME_LIMIT_W)
{ /* D5==1 */
pol = in_hw(addr); /* Data Read */
if((pol & BIT_PASS_W) != (data & BIT_PASS_W))
{
return ERROR; /* Access Error */
}
break;
}
else
{ /* D5!=1 */
pol = in_hw(addr); /* Data Read */
}
}
return OK; /* Access OK */
}
/********************************************************************/
/* Get Flash Memory Size Proc */
/********************************************************************/
UWORD fmGetFlashSize(void)
{
return(FLASH_SIZE);
}
/********************************************************************/
/* Get Flash Memory Start Address Proc */
/********************************************************************/
unsigned long fmGetFlashStart(void)
{
return FLASH_START;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -