⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 flash_memory.c

📁 OKI DEMO FLASH WRITE PROGRAM
💻 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 + -