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

📄 flashdef.c

📁 intel的一个高效率FLASH文件系统。思路很好
💻 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 + -