📄 flashdef.c
字号:
/******************************************************************************/
/* */
/* 版权所有(c) 2001汉王科技 */
/* */
/******************************************************************************/
/* 文 件 名 */
/* flashdef.c */
/* */
/* 版 本 号 */
/* 1.0 */
/* */
/* 描 述 */
/* */
/* 组 成 */
/* */
/* 作 者 */
/* 王飞 */
/* */
/* 日 期 */
/* 2002-07-23 */
/* */
/* 历史记录 */
/******************************************************************************/
#include "flashdef.h"
#include "typedef.h"
#include "vsb.h"
#include "nucleus.h"
/////////////////////////////////////////////////////////////////////
// 描述:SST Flash接口。
//
// 时间:2001年7月11日
//
// 注释:FLASH 扇区大小 块 大 小 每片大小(对应片选)
// ===== ======== ======== ==================
// SST 4096字节 64K字节 2M字节(一个物理片)
#define sst_get_address(lpwDst) ((UINT16 *)((UINT32)lpwDst&0xFFE00000|0xAAAA))
#define sst_get_offset(lpwDst) ((UINT16 *)((UINT32)lpwDst&0xFFE00000|0x5554))
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// sst flash IO
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/////////////////////////////////////////////////////////////////////
// 描述:Flash写操作需要一段时间,调用wait_till_ready将等待直
// 至Flash写操作结束。
//
// 参数:lpwDst Flash的写地址。
//
// 注释:写操作过程中目标地址中的每个字节第6bit应在不停的变
// 化,如果不发生变化,表示写操作结束。
BOOL wait_till_ready(UINT16 * lpwDst)
{
UINT16 predata, curdata;
UINT32 timeout;
predata = *lpwDst;
predata = predata & 0x0040;
timeout = 0x07FFFF;
while(timeout)
{
curdata = *lpwDst;
curdata = curdata & 0x0040;
if(predata == curdata)
break;
predata = curdata;
timeout--;
}
return (timeout>0);
}
#define IMR (*((UINT32*)0xFFFFF304))
////////////////////////////////////////////////////////////////////////////////
//
UINT32 sst_write(UINT16 *lpwDst, UINT16 *lpwSrc, UINT32 dwSrcWords)
{
UINT32 index;
UINT32 old = IMR;
UINT16 *address = sst_get_address(lpwDst);
UINT16 *offset = sst_get_offset(lpwDst);
UINT16 *src = lpwSrc, *dst = lpwDst;
IMR = 0x00FFFFFF; //屏蔽中断
for(index=0; index<dwSrcWords; index++)
{
*address = 0xAAAA;
*offset = 0x5555;
*address = 0xA0A0;
*lpwDst = *lpwSrc;
wait_till_ready(lpwDst-1);
if(*lpwDst++ != *lpwSrc++)
break;
}
IMR = old;//打开中断
// 返回写正确的字数
return index;
}
////////////////////////////////////////////////////////////////////////////////
//
BOOL FlashEraseBlock(UINT16 * lpwDst)
{
UINT32 old = IMR;
BOOL bSucess;
UINT16 *addres = sst_get_address(lpwDst);
UINT16 *offset = sst_get_offset(lpwDst);
IMR = 0x00FFFFFF; //屏蔽中断
*addres = 0xAAAA;
*offset = 0x5555;
*addres = 0x8080;
*addres = 0xAAAA;
*offset = 0x5555;
*lpwDst = 0x5050;
bSucess = wait_till_ready(lpwDst);
IMR = old;//打开中断
return bSucess;
}
WORD FlashDevEraseBlock(UINT32 addr)
{
if(FlashEraseBlock((UINT16*)addr))
return ERR_NONE;
return ERR_ERASE;
}
WORD FlashDevRead(DWORD address, DWORD length, BYTE_PTR buffer)
{
memcpy(buffer, (void*)address, length);
return ERR_NONE;
}
WORD FlashDevWrite(DWORD address, DWORD length, BYTE_PTR buffer)
{
UINT16 pBuffer[VSB_SIZE/2+1];
UINT32 rc;
if((address & 1) && (length & 1)) //奇地址,奇长度
{
memcpy(((BYTE *)pBuffer)+1, buffer, length++);
address--;
*((BYTE *)pBuffer) = *((BYTE *)address);
}
else if((address & 1) && !(length & 1)) //奇地址,偶数长度
{
memcpy(((BYTE *)pBuffer)+1, buffer, length);
address--;
length += 2;
*((BYTE *)pBuffer) = *((BYTE *)address);
*((BYTE *)pBuffer+length) = *((BYTE *)address+length);
}
else if(!(address & 1) && (length & 1)) //偶地址,奇长度
{
*((BYTE *)pBuffer+length) = *((BYTE *)address+length);
memcpy(pBuffer, buffer, length++);
}
else //偶地址,偶长度
{
memcpy(pBuffer, buffer, length);
}
length >>= 1;
rc = sst_write((UINT16 *)(address), pBuffer, length);
return (rc == length) ? ERR_NONE : ERR_WRITE;
}
////////////////////////////////////////////////////////////////////////////////
// end flash.cpp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -