flashdrv.c

来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C语言 代码 · 共 138 行

C
138
字号
/****************************************************************************
 * File: flahs_drv.c
 * Purpose: Flash related stuff
 ***************************************************************************/


#if ((SH_PLATFORM == PLATFORM_ASPEN)||(SH_PLATFORM==PLATFORM_BIGSUR))

#ifdef SDBTESTS
#include "StandAlone.h"
#include "platform.h"
#else SDBTESTS
// #include "aspen.h"
// #include "flashdrv.h"
// #if SH==4
// #include "sh4defs.h"
// #else
// #include "sh3defs.h"
// #endif
#endif SDBTESTS

flash_t *FlashMemory = FLASH_ADDRESS;
#define FLASH_READY 0x00800080
#define FLASH_TIME_LIMIT 1000

static void FlashReadRst()
{
	VL(FPGA_CMD_ADDR) |= 1;
	FlashMemory[0] = 0x50505050;
	FlashMemory[1] = 0x50505050;
	FlashMemory[0] = 0xffffffff;
	FlashMemory[1] = 0xffffffff;
	VL(FPGA_CMD_ADDR) &= ~1;
}

/*//////////////////////////////////////////////////////////////////////////*/

void FlashAutoSelect(flash_t *Mnfct, flash_t *DevCode)
{
	VL(FPGA_CMD_ADDR) |= 1;
	FlashMemory[0] = 0x90909090;
	*Mnfct = FlashMemory[0] & 0xffff;
	*DevCode = FlashMemory[2] & 0xffff;
	/* Back to read mode*/
	FlashReadRst();
}

/*//////////////////////////////////////////////////////////////////////////*/

short FlashErase(short sector)
{
	volatile flash_t
		*addr;

	flash_t
		i;

	short done;

	if (sector > LAST_SECTOR)
		return(FLASH_ILLEGAL_SECTOR);

	if (sector < 0)
		return(FLASH_ILLEGAL_SECTOR);

	VL(FPGA_CMD_ADDR) |= 1;

	addr = (flash_t *)((unsigned)FLASH_ADDRESS + FlashOffset(sector));
	addr[0] = 0x20202020;
	addr[1] = 0x20202020;

	//mon_printf("\n%p", addr);
	addr++;
	while ( FLASH_READY != (FLASH_READY & addr[0]) )
		;

	while ( FLASH_READY != (FLASH_READY & addr[1]) )
		;

	addr[0] = 0xd0d0d0d0;
	addr[1] = 0xd0d0d0d0;

	for (i=0; i<FLASH_TIME_LIMIT; i++)
		;

	addr++;
	addr[0] = 0x50505050;
	addr[1] = 0x50505050;
	while ( FLASH_READY != (FLASH_READY & addr[0]) )
		;
	while ( FLASH_READY != (FLASH_READY & addr[1]) )
		;

	FlashReadRst();
	return FLASH_SUCCESS;
}

/*//////////////////////////////////////////////////////////////////////////*/

short FlashWrite(flash_t *address, flash_t data)
{
	short status = FLASH_BUSY;
	int done;
	flash_t poll;
 
	volatile flash_t *addr = address;
	status = FLASH_SUCCESS;

	VL(FPGA_CMD_ADDR) |= 1;

	*addr = 0x40404040;

	while ( FLASH_READY != (FLASH_READY & (*addr)) )
		;

	*addr = data;

	while ( FLASH_READY != (FLASH_READY & (*addr)) )
		;

 	FlashReadRst();
	return status;
}

#define SECTOR_SHIFT 18

short FlashSector(unsigned offset)
{
	return ( offset >> SECTOR_SHIFT );
}

unsigned FlashOffset(short sector)
{
	return ( sector << SECTOR_SHIFT);
}

#endif ((SH_PLATFORM == PLATFORM_ASPEN)||(SH_PLATFORM==PLATFORM_BIGSUR))

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?