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 + -
显示快捷键?