📄 tcl_gdi_windowsflash.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 + -