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

📄 tcl_gdi_windowsflash.c

📁 用一个文件虚拟一片Flash,提供和嵌入式平台Flash Driver一样的接口
💻 C
字号:
/**********************************************************************************
File Name   : TCL_GDI_WIndowsFlash.c

Description :  windows flash 子系统

COPYRIGHT (C) 

Date               Modification                                             Name
----------------------------------------------------------------------------------
20060803        Created                                                 JokQu
<$ModMark> (do not move/delete)
***********************************************************************************/
#include "stdio.h"
#include "TCL_Common.h"
#include "TCL_GDI_Flash.h"
#include "TCL_GDI_WindowsFlash.h"

#define WINDOWS_FLASH_FILE_NAME		"WindowsFlashFile"	/* 文件名称 */
#define WINDOWS_FLASH_SECTOR_NUM 	(135)			/* 扇区总数*/
#define WINDOWS_FLASH_SIZE			(8 * 0x100000)	/* Flash 大小*/

static TCL_BOOL gbWindowFlashInit = TCL_FALSE;

typedef struct _FLASH_SECTOR_INFO_
{
	TCL_UINT32 iStartAddress;
	TCL_UINT32 iSize;
}FLASH_SECTOR_INFO;

static FILE *ghWindowsFlashFile = NULL;
static FLASH_SECTOR_INFO gsSectorInfo[WINDOWS_FLASH_SECTOR_NUM];
static TCL_CHAR cFileBuffer[WINDOWS_FLASH_SIZE];


/******************************************************************************
* Function:            TCL_GDI_WindowsFlash_Read
* Description:        读flash
* Calls:            	omit
* Called By: 		omit
* Table Accessed:	none
* Table Updated:	none
* Input:   		TCL_UINT32 uOffset	- 地址
				TCL_UINT8 *pData		- 数据
				TCL_UINT32 uDataLen	- 数据长度(字节数)
* Output:              	TCL_UINT32 *pAlreadyReadLen - 实际读获的长度(字节数)
* Return:              	ReturnType ( 请参考FlashDriverReturnType)
* Others: 			
* Note:			
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20090319						create
******************************************************************************/
TCL_UINT32 TCL_GDI_WindowsFlash_Read(TCL_UINT32 uOffset, TCL_UINT8 *pData, TCL_UINT32 uDataLen,TCL_UINT32 *pAlreadyReadLen)
{
	FILE *pFile = NULL;
	TCL_INT32 iReadSize = 0;

	if (NULL == pData )
	{
		/* pData = NULL */
		FLASH_ERROR(("error: TCL_GDI_WindowsFlash_ReadFlash - pData = NULL\n"));
		return TCL_GDI_FLASH_PARAMTER_INVALID;
	}

	if (NULL == pAlreadyReadLen )
	{
		/* pData = NULL */
		FLASH_ERROR(("error: TCL_GDI_WindowsFlash_ReadFlash - pAlreadyReadLen = NULL\n"));
		return TCL_GDI_FLASH_PARAMTER_INVALID;
	}	

	if ( (uOffset + uDataLen) > WINDOWS_FLASH_SIZE )
	{
		/* pData = NULL */
		FLASH_ERROR(("error: TCL_GDI_WindowsFlash_ReadFlashp - address(0x%x > 0x%x) invalid\n",WINDOWS_FLASH_SIZE));
		return TCL_GDI_FLASH_PARAMTER_INVALID;
	}
	
	*pAlreadyReadLen = 0;

	/* 打开文件(只读打开)*/
	if(( pFile = fopen(WINDOWS_FLASH_FILE_NAME,"rb")) == NULL)
	{
		/* 打开文件失败,建立文件*/
		if ((pFile = fopen(WINDOWS_FLASH_FILE_NAME,"wb+")) == NULL )
		{
			/* 建立文件失败*/
			FLASH_ERROR(("error: TCL_GDI_WindowsFlash_ReadFlash - open file failure\n"));
			return TCL_GDI_FLASH_FILE_ERROR;
		}
	}

	/* 文件定位*/
	if ( fseek(pFile,uOffset,SEEK_SET) != 0 )
	{
		FLASH_ERROR(("error: TCL_GDI_WindowsFlash_ReadFlash - fseek file failure\n"));
		return TCL_GDI_FLASH_FILE_ERROR;
	}

	/* 读文件*/
	iReadSize = fread(pData,uDataLen,1,pFile);

	FLASH_DEBUG(("info: TCL_GDI_WindowsFlash_Read - iReadSize = %d\n",iReadSize));
	
	*pAlreadyReadLen = uDataLen;

	/* 关闭文件*/
	fclose(pFile);

	return TCL_NO_ERROR;
}


/*******************************************************************************
* Function:            TCL_GDI_Flash_Write
* Description:        写flash
* Calls:            	omit
* Called By: 		omit
* Table Accessed:	none
* Table Updated:	none
* Input:   		TCL_UINT32 uOffset	- 地址
				TCL_UINT8 *pData		- 数据
				TCL_UINT32 uDataLen	- 数据长度(字节数)
* Output:              	TCL_UINT32 *pAlreadyWriteLen -  实际写入的数据长度(字节数)
* Return:              	TCL_NO_ERROR - 操作成功
				OTHER - 出错
* Others: 			
* Note:			
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20090319						create
*******************************************************************************/
TCL_UINT32 TCL_GDI_WindowsFlash_Write(TCL_UINT32 uOffset, TCL_UINT8 *pData, TCL_UINT32 uDataLen,TCL_UINT32 *pAlreadyWriteLen)
{
	FILE 		*pFile = NULL;
	TCL_INT32	iWriteSize = 0;
	TCL_INT32	iReadSize = 0;

	if (NULL == pData )
	{
		/* pData = NULL */
		FLASH_ERROR(("error: TCL_GDI_WindowsFlash_Write - pData = NULL\n"));
		return TCL_GDI_FLASH_PARAMTER_INVALID;
	}

	if (NULL == pAlreadyWriteLen )
	{
		/* pData = NULL */
		FLASH_ERROR(("error: TCL_GDI_WindowsFlash_Write - pAlreadyReadLen = NULL\n"));
		return TCL_GDI_FLASH_PARAMTER_INVALID;
	}	

	if ( (uOffset + uDataLen) > WINDOWS_FLASH_SIZE )
	{
		/* pData = NULL */
		FLASH_ERROR(("error: TCL_GDI_WindowsFlash_Write - address(0x%x > 0x%x) invalid\n",WINDOWS_FLASH_SIZE));
		return TCL_GDI_FLASH_PARAMTER_INVALID;
	}
	
	*pAlreadyWriteLen = 0;

	/* 打开文件(只读打开)*/
	memset(cFileBuffer,0,sizeof(cFileBuffer));
	if( ( pFile = fopen(WINDOWS_FLASH_FILE_NAME,"rb")) != NULL)
	{
		/* 文件定位*/
		if ( fseek(pFile,0L,SEEK_SET) != 0 )
		{
			FLASH_ERROR(("error: TCL_GDI_WindowsFlash_Write - fseek file failure\n"));
			fclose(pFile);
			return TCL_GDI_FLASH_FILE_ERROR;
		}
		else
		{
			/* 读文件*/
			iReadSize = fread(cFileBuffer,WINDOWS_FLASH_SIZE,1,pFile);	
			fclose(pFile);
		}
	}
	
	if( ( pFile=fopen(WINDOWS_FLASH_FILE_NAME,"wb" ) ) == NULL )
	{
		FLASH_ERROR(("error: TCL_GDI_WindowsFlash_WriteFlash - open file failure\n"));
		return TCL_GDI_FLASH_FILE_ERROR;
	}

	/* 文件定位*/
	if ( fseek(pFile,0,SEEK_SET) != 0 )
	{
		FLASH_ERROR(("error: TCL_GDI_WindowsFlash_Write - fseek file failure\n"));
		fclose(pFile);
		return TCL_GDI_FLASH_FILE_ERROR;
	}

	memcpy(&(cFileBuffer[uOffset]),pData,uDataLen);
	
	iWriteSize = fwrite(cFileBuffer,WINDOWS_FLASH_SIZE,1,pFile);
	fclose(pFile);
	
	*pAlreadyWriteLen = uDataLen;

	return TCL_NO_ERROR;
}


/*******************************************************************************
* Function:            TCL_GDI_WindowsFlash_FastWrite
* Description:        快速写flash
* Calls:            	omit
* Called By: 		omit
* Table Accessed:	none
* Table Updated:	none
* Input:   		TCL_UINT32 uOffset	- 地址
				TCL_UINT8 *pData		- 数据
				TCL_UINT32 uDataLen	- 数据长度(字节数)
* Output:              	TCL_UINT32 *pAlreadyWriteLen -  实际写入的数据长度(字节数)
* Return:              	TCL_NO_ERROR - 操作成功
				OTHER - 出错
* Others: 			
* Note:			
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20090319						create
*******************************************************************************/
TCL_UINT32 TCL_GDI_WindowsFlash_FastWrite(TCL_UINT32 uOffset, TCL_UINT8 *pData, TCL_UINT32 uDataLen,TCL_UINT32 *pAlreadyWriteLen)
{
	FILE 		*pFile = NULL;
	TCL_INT32	iWriteSize = 0;
	TCL_INT32	iReadSize = 0;

	if (NULL == pData )
	{
		/* pData = NULL */
		FLASH_ERROR(("error: TCL_GDI_WindowsFlash_FastWrite - pData = NULL\n"));
		return TCL_GDI_FLASH_PARAMTER_INVALID;
	}

	if (NULL == pAlreadyWriteLen )
	{
		/* pData = NULL */
		FLASH_ERROR(("error: TCL_GDI_WindowsFlash_FastWrite - pAlreadyReadLen = NULL\n"));
		return TCL_GDI_FLASH_PARAMTER_INVALID;
	}	

	if ( (uOffset + uDataLen) > WINDOWS_FLASH_SIZE )
	{
		/* pData = NULL */
		FLASH_ERROR(("error: TCL_GDI_WindowsFlash_FastWrite - address(0x%x > 0x%x) invalid\n",WINDOWS_FLASH_SIZE));
		return TCL_GDI_FLASH_PARAMTER_INVALID;
	}
	
	*pAlreadyWriteLen = 0;

	/* 打开文件(只读打开)*/
	memset(cFileBuffer,0,sizeof(cFileBuffer));
	if( ( pFile = fopen(WINDOWS_FLASH_FILE_NAME,"rb")) != NULL)
	{
		/* 文件定位*/
		if ( fseek(pFile,0L,SEEK_SET) != 0 )
		{
			FLASH_ERROR(("error: TCL_GDI_WindowsFlash_FastWrite - fseek file failure\n"));
			fclose(pFile);
			return TCL_GDI_FLASH_FILE_ERROR;
		}
		else
		{
			/* 读文件*/
			iReadSize = fread(cFileBuffer,WINDOWS_FLASH_SIZE,1,pFile);	
			fclose(pFile);
		}
	}
	
	if( ( pFile=fopen(WINDOWS_FLASH_FILE_NAME,"wb" ) ) == NULL )
	{
		FLASH_ERROR(("error: TCL_GDI_WindowsFlash_FastWrite - open file failure\n"));
		return TCL_GDI_FLASH_FILE_ERROR;
	}

	/* 文件定位*/
	if ( fseek(pFile,0,SEEK_SET) != 0 )
	{
		FLASH_ERROR(("error: TCL_GDI_WindowsFlash_FastWrite - fseek file failure\n"));
		fclose(pFile);
		return TCL_GDI_FLASH_FILE_ERROR;
	}

	memcpy(&(cFileBuffer[uOffset]),pData,uDataLen);
	
	iWriteSize = fwrite(cFileBuffer,WINDOWS_FLASH_SIZE,1,pFile);
	fclose(pFile);
	
	*pAlreadyWriteLen = uDataLen;

	return TCL_NO_ERROR;
}


/*******************************************************************************
* Function:            TCL_GDI_WindowsFlash_EraseSectors
* Description:        擦除扇区
* Calls:            	omit
* Called By: 		omit
* Table Accessed:	none
* Table Updated:	none
* Input:   		TCL_UINT32 uStartSectorNum	- 开始扇区号 
				TCL_UINT32 uNumOfSecs		- 扇区总数	
* Output:              	none
* Return:              TCL_NO_ERROR - 操作成功
				OTHER - 出错
* Others: 			
* Note:			
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20090319						create
*******************************************************************************/
TCL_UINT32 TCL_GDI_WindowsFlash_EraseSectors(TCL_UINT32 uStartSectorNum, TCL_UINT32 uNumOfSecs)
{
	return TCL_NO_ERROR;
}



 /******************************************************************************
* Function:            TCL_GDI_WindowsFlash_GetInfo
* Description:        返回Flash 相关信息(扇区信息,扇区数目,启动模式,
				是否支持CFI,设备ID,厂商ID)
* Calls:            	omit
* Called By: 		omit
* Table Accessed:	none
* Table Updated:	none
* Input:   		TCL_VOID
* Output:              	TCL_GDI_FLASH_INFO *pFlashInfo - Flash 相关信息(扇区信息,扇区数目,
				启动模式,是否支持CFI,设备ID,厂商ID)
* Return:              TCL_NO_ERROR - 操作成功
				OTHER - 出错
* Others: 			
* Note:			
*		Author			Date								Purpose	
*-----------------------------------------------------------------------------
*		JokQu			20090319						create
******************************************************************************/
TCL_UINT32 TCL_GDI_WindowsFlash_GetInfo(TCL_GDI_FLASH_INFO *pFlashInfo)
{
	TCL_INT32 iLoop = 0;

	if ( NULL == pFlashInfo )
	{
		FLASH_ERROR(("error: TCL_GDI_WindowsFlash_GetInfo - pFlashInfo = NULL\n"));
		return TCL_GDI_FLASH_PARAMTER_INVALID;
	}
	
	pFlashInfo->eBootMode	= TCL_GDI_FLBOOT_TOP;
	pFlashInfo->uCFI		= 1;
	pFlashInfo->uDeviceId	= 1;
	pFlashInfo->uManufactId	= 1;
	pFlashInfo->uSectorNum	= WINDOWS_FLASH_SECTOR_NUM;
	pFlashInfo->uFlashSize	= WINDOWS_FLASH_SIZE;

	for ( iLoop = 0; iLoop < WINDOWS_FLASH_SECTOR_NUM; iLoop++ )
	{
		pFlashInfo->eSectorInfo[iLoop].uSectorNo	= iLoop;
		pFlashInfo->eSectorInfo[iLoop].uStartAdress	= gsSectorInfo[iLoop].iStartAddress;
		pFlashInfo->eSectorInfo[iLoop].uSecLength	= gsSectorInfo[iLoop].iSize;
	}

	return TCL_NO_ERROR;
}


/*******************************************************************************
* Function:            TCL_GDI_WindowsFlash_Init
* Description:        初始化
* Calls:            	omit
* Called By: 		omit
* Table Accessed:	none
* Table Updated:	none
* Input:   		none
* Output:              	none
* Return:              TCL_NO_ERROR - 操作成功
				OTHER - 出错
* Others: 			
* Note:			
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20090319						create
*******************************************************************************/
TCL_UINT32 TCL_GDI_WindowsFlash_Init()
{
	TCL_INT32 iLoop		= 0;
	TCL_UINT32 iAddress = 0x0;

	memset(gsSectorInfo,0,sizeof(gsSectorInfo));

	for( iLoop = 0; iLoop < 8; iLoop++ )
	{
		gsSectorInfo[iLoop].iStartAddress	= iAddress;
		gsSectorInfo[iLoop].iSize			= 0x002000 ;
		iAddress = iAddress + 0x002000;
	}

	for(iLoop = 8; iLoop < WINDOWS_FLASH_SECTOR_NUM; iLoop++)
	{
		gsSectorInfo[iLoop].iStartAddress	= iAddress;
		gsSectorInfo[iLoop].iSize			= 0x010000;
		iAddress = iAddress + 0x010000;
	}

	gbWindowFlashInit = TCL_TRUE;
	return TCL_NO_ERROR;
}


/*******************************************************************************
* Function:            TCL_GDI_WindowsFlash_Exit
* Description:        退出
* Calls:            	omit
* Called By: 		omit
* Table Accessed:	none
* Table Updated:	none
* Input:   		none
* Output:              	none
* Return:              TCL_NO_ERROR - 操作成功
				OTHER - 出错
* Others: 			
* Note:			
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20090319						create
*******************************************************************************/
TCL_UINT32 TCL_GDI_WindowsFlash_Exit()
{
	gbWindowFlashInit = TCL_FALSE;
	return TCL_NO_ERROR;
}



/*******************************************************************************
* Function:            TCL_GDI_WindowsFlash_IsInit
* Description:        是否已初始化
* Calls:            	omit
* Called By: 		omit
* Table Accessed:	none
* Table Updated:	none
* Input:   		none
* Output:              	none
* Return:              TCL_TRUE - 已初始化
				TCL_FALSE - 没有初始化
* Others: 			
* Note:			
*		Author			Date								Purpose	
*----------------------------------------------------------------------------
*		JokQu			20090319						create
*******************************************************************************/
TCL_BOOL TCL_GDI_WindowsFlash_IsInit()
{
	return gbWindowFlashInit;
}

⌨️ 快捷键说明

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