?? flashloader.c
字號:
/**********************************文件頭部注釋*******************************************/
/*/////////////////////////////////////////////////////////////////////////////////////////
//
// 文件名: flashloader.c
//
// 創(chuàng)建者: HCX
//
// 創(chuàng)建時(shí)間: 2002.05.12
//
// 文件描述: 包含loader部分關(guān)于flash設(shè)備的全部驅(qū)動(dòng)
//
// 修改記錄:
// 日期(月.日.年) 作者 修改原因及內(nèi)容
//
//
/////////////////////////////////////////////////////////////////////////////////////////*/
/************************************文件包含*********************************************/
#include <string.h>
#include <ostime.h>
#include <stdarg.h>
#include "stlite.h"
#include "stddefs.h"
#include "stflashd.h"
#include "stcommon.h"
#include "app_data.h"
/* Private Types ---------------------------------------------------------- */
/* linked list construct to support any number of Flash banks */
struct inst_t
{
struct inst_t *Next; /* ptr. to next (else NULL) */
ST_DeviceName_t BankName; /* Initialization bank name */
U32 MagicNumber; /* Handle validity check value */
BOOL BankOpen; /* Flash bank Opened iff TRUE */
U32 LastOffsP1; /* last offset plus one */
U32 DeviceCode; /* stored for GetParams */
U32 ManufactCode; /* stored for GetParams */
STFLASH_DeviceType_t DeviceType; /* Flash device type */
U32 *BaseAddress; /* Flash bank base address */
U32 *VppAddress; /* Flash bank Vpp enable address */
U32 MinAccessWidth; /* Access width of device(s) (bytes) */
U32 MaxAccessWidth; /* devices per bank * MinAccessWidth */
U32 MinAccessMask; /* MinAccessWidth - 1 */
U32 MaxAccessMask; /* MaxAccessWidth - 1 */
ST_Partition_t *DriverPartition; /* base address of partition */
U32 NumberOfBlocks; /* number of regions in Blocks */
STFLASH_Block_t Blocks[1]; /* extendable size */
};
typedef struct inst_t stflash_Inst_t;
/************************************常量定義*********************************************/
#define MAGIC_NUMBER 0x31415927 /* easy as pi(e) */
/* /////////////////////////////////////////
///// hcx add for flash //////
/////////////////////////////////////////*/
#define STFLASH_BANK_0_BASE FLASH_BANK_0_BASE_ADDRESS
#define STFLASH_BANK_1_BASE FLASH_BANK_1_BASE_ADDRESS
#define FLASH_BOOT_BLOCK_ADDR 0x7fff0000
#ifdef FLASH_BOTTOM_8M
#define MIN_ACCESS_WIDTH STFLASH_ACCESS_16_BITS
#define MAX_ACCESS_WIDTH STFLASH_ACCESS_16_BITS
#define FLASH_BOOT_BLOCK_NO 19
#define NUM_BLOCKS 19
#define DEVICE_TYPE STFLASH_M29W800B
static STFLASH_Block_t BlockData_s[NUM_BLOCKS] =
{
{ STFLASH_BOOT_0_SIZE, STFLASH_BOOT_BLOCK },
{ STFLASH_PARA_0_SIZE, STFLASH_PARAMETER_BLOCK },
{ STFLASH_PARA_1_SIZE, STFLASH_PARAMETER_BLOCK },
{ STFLASH_MAIN_1F_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_0_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_1_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_2_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_3_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_4_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_5_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_6_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_7_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_8_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_9_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_A_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_B_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_C_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_D_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_E_SIZE, STFLASH_MAIN_BLOCK }};
#endif
#ifdef FLASH_TOP_8M
#define MIN_ACCESS_WIDTH STFLASH_ACCESS_16_BITS
#define MAX_ACCESS_WIDTH STFLASH_ACCESS_16_BITS
#define FLASH_BOOT_BLOCK_NO 19
#define NUM_BLOCKS 19
#define DEVICE_TYPE STFLASH_M29W800T
static STFLASH_Block_t BlockData_s[NUM_BLOCKS] =
{
{ STFLASH_MAIN_0_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_1_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_2_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_3_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_4_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_5_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_6_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_7_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_8_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_9_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_A_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_B_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_C_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_D_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_E_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_1F_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_PARA_0_SIZE, STFLASH_PARAMETER_BLOCK },
{ STFLASH_PARA_1_SIZE, STFLASH_PARAMETER_BLOCK },
{ STFLASH_BOOT_0_SIZE, STFLASH_BOOT_BLOCK } };
#endif
#ifdef FLASH_BOTTOM_16M
/* keith modification */
#if 1
#define MIN_ACCESS_WIDTH STFLASH_ACCESS_16_BITS
#define MAX_ACCESS_WIDTH STFLASH_ACCESS_16_BITS
#define FLASH_BOOT_BLOCK_NO 39
#define NUM_BLOCKS 39
#define DEVICE_TYPE STFLASH_M29W1600B
static STFLASH_Block_t BlockData_s[NUM_BLOCKS] =
{
{ STFLASH_PARA_0_SIZE, STFLASH_BOOT_BLOCK },
{ STFLASH_PARA_0_SIZE, STFLASH_PARAMETER_BLOCK },
{ STFLASH_PARA_0_SIZE, STFLASH_PARAMETER_BLOCK },
{ STFLASH_PARA_0_SIZE, STFLASH_PARAMETER_BLOCK },
{ STFLASH_PARA_0_SIZE, STFLASH_PARAMETER_BLOCK },
{ STFLASH_PARA_0_SIZE, STFLASH_PARAMETER_BLOCK },
{ STFLASH_PARA_0_SIZE, STFLASH_PARAMETER_BLOCK },
{ STFLASH_PARA_0_SIZE, STFLASH_PARAMETER_BLOCK },
{ STFLASH_MAIN_0_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_1_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_2_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_3_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_4_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_5_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_6_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_7_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_8_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_9_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_A_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_B_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_C_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_D_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_E_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_F_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_0_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_1_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_2_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_3_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_4_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_5_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_6_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_7_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_8_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_9_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_A_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_B_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_C_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_D_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_E_SIZE, STFLASH_MAIN_BLOCK }};
#else
#define MIN_ACCESS_WIDTH STFLASH_ACCESS_16_BITS
#define MAX_ACCESS_WIDTH STFLASH_ACCESS_16_BITS
#define FLASH_BOOT_BLOCK_NO 35
#define NUM_BLOCKS 35
#define DEVICE_TYPE STFLASH_M29W1600B
static STFLASH_Block_t BlockData_s[NUM_BLOCKS] =
{
{ STFLASH_BOOT_0_SIZE, STFLASH_BOOT_BLOCK },
{ STFLASH_PARA_0_SIZE, STFLASH_PARAMETER_BLOCK },
{ STFLASH_PARA_1_SIZE, STFLASH_PARAMETER_BLOCK },
{ STFLASH_MAIN_1F_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_0_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_1_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_2_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_3_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_4_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_5_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_6_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_7_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_8_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_9_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_A_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_B_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_C_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_D_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_E_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_0_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_1_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_2_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_3_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_4_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_5_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_6_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_7_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_8_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_9_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_A_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_B_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_C_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_D_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_E_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_F_SIZE, STFLASH_MAIN_BLOCK }};
#endif
#endif
#ifdef FLASH_TOP_16M
#define MIN_ACCESS_WIDTH STFLASH_ACCESS_16_BITS
#define MAX_ACCESS_WIDTH STFLASH_ACCESS_16_BITS
#define FLASH_BOOT_BLOCK_NO 35
#define NUM_BLOCKS 35
#define DEVICE_TYPE STFLASH_M29W1600T
static STFLASH_Block_t BlockData_s[NUM_BLOCKS] =
{
{ STFLASH_MAIN_0_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_1_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_2_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_3_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_4_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_5_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_6_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_7_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_8_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_9_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_A_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_B_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_C_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_D_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_E_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_F_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_0_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_1_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_2_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_3_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_4_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_5_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_6_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_7_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_8_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_9_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_A_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_B_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_C_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_D_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_E_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_MAIN_1F_SIZE, STFLASH_MAIN_BLOCK },
{ STFLASH_PARA_0_SIZE, STFLASH_PARAMETER_BLOCK },
{ STFLASH_PARA_1_SIZE, STFLASH_PARAMETER_BLOCK },
{ STFLASH_BOOT_0_SIZE, STFLASH_BOOT_BLOCK } };
#endif
/**********************************外部變量聲明*******************************************/
/*******************************本文件使用變量定義****************************************/
static semaphore_t Atomic;
static stflash_Inst_t *stflash_Sentinel = NULL; /* ptr. to first node */
static const ST_Revision_t stflash_DriverRev = "STFLASH-REL_2.0.2";
/**************************************函數(shù)***********************************************/
static void VppEnable( U32 *VppAddress );
static void VppDisable( U32 *VppAddress );
static ST_ErrorCode_t m29w800t_Write( stflash_Inst_t *ThisElem,
U32 Offset[],
U8 *Buffer[],
U32 NumberToWrite[],
U32 iBlockNumToWrite,
U32 *NumberActuallyWritten );
/****************************************************************************
Name : STFLASH_Init()
Description : Generates a linked list element for each instance called,
into which the caller's InitParams are copied. Also
attempts to Read the Electronic Signature to identify
the device, which is returned in STFLASH_Params_t when
GetParams() is called.
Parameters : ST_DeviceName_t Name of the Flash bank, and a pointer to
STFLASH_InitParams_t InitParams data structure.
Return Value : ST_ErrorCode_t specified as
ST_NO_ERROR No errors occurred
ST_ERROR_NO_MEMORY Insufficient memory free
ST_ERROR_ALREADY_INITIALISED Bank already initialised
ST_ERROR_BAD_PARAMETER Error in parameters passed
See Also : STFLASH_InitParams_t
STFLASH_GetParams()
STFLASH_Term()
****************************************************************************/
ST_ErrorCode_t STFLASH_Init( const ST_DeviceName_t Name,
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -