193 lines
5.8 KiB
C
193 lines
5.8 KiB
C
// *****************************************************************************
|
|
//
|
|
// File: H2FIL.c
|
|
//
|
|
// *****************************************************************************
|
|
//
|
|
// Notes:
|
|
//
|
|
// *****************************************************************************
|
|
//
|
|
// Copyright (C) 2008-2010 Apple, Inc. All rights reserved.
|
|
//
|
|
// This document is the property of Apple Computer, Inc.
|
|
// It is considered confidential and proprietary.
|
|
//
|
|
// This document may not be reproduced or transmitted in any form,
|
|
// in whole or in part, without the express written permission of
|
|
// Apple Computer, Inc.
|
|
//
|
|
// *****************************************************************************
|
|
|
|
#include "H2fmi.h"
|
|
#include "H2fmi_ppn.h"
|
|
#include <WMROAM.h>
|
|
#include <WMRFeatures.h>
|
|
#include <FIL.h>
|
|
|
|
/*****************************************************************************/
|
|
/* Static variables definitions */
|
|
/*****************************************************************************/
|
|
|
|
/*****************************************************************************/
|
|
/* Code Implementation */
|
|
/*****************************************************************************/
|
|
|
|
static LowFuncTbl stLowFuncTbl =
|
|
{
|
|
.GetDeviceInfo = h2fmiGetDeviceInfo,
|
|
.Reset = h2fmiReset,
|
|
.CalcCurrentTiming = h2fmiCalcCurrentTimings,
|
|
.SetWhiteningState = h2fmiSetWhiteningState,
|
|
.SetWhiteningMetadataState = h2fmiSetWhiteningMetadataState,
|
|
.RegisterCurrentTransaction = h2fmiRegisterCurrentTransaction,
|
|
|
|
#if (defined(AND_SUPPORT_BLOCK_STORAGE) && AND_SUPPORT_BLOCK_STORAGE)
|
|
.SetDeviceInfo = h2fmiSetDeviceInfo,
|
|
.ReadWithECC = h2fmiReadSinglePage,
|
|
.ReadNoECC = h2fmiReadNoECC,
|
|
.ReadMultiplePages = h2fmiReadSequentialPages,
|
|
.ReadScatteredPages = h2fmiReadScatteredPages,
|
|
#endif
|
|
|
|
#if (AND_FPART_ONLY || AND_SUPPORT_BLOCK_STORAGE)
|
|
.ReadMaxECC = h2fmiReadSinglePageMaxECC,
|
|
#endif
|
|
|
|
#if ((defined(AND_SUPPORT_NVRAM) && AND_SUPPORT_NVRAM) || (defined(AND_SUPPORT_FW_AREA) && AND_SUPPORT_FW_AREA))
|
|
.ReadBLPage = h2fmiReadBootpage,
|
|
#endif
|
|
|
|
#if !H2FMI_READONLY
|
|
.WriteMultiplePages = h2fmiWriteMultiplePages,
|
|
.Write = h2fmiWriteSinglePage,
|
|
.WriteScatteredPages = h2fmiWriteScatteredPages,
|
|
.WriteMaxECC = h2fmiWriteSinglePageMaxECC,
|
|
#endif // !H2FMI_READONLY
|
|
|
|
#if !(defined(AND_READONLY)) || AND_SUPPORT_NVRAM
|
|
.Erase = h2fmiEraseSingleBlock,
|
|
.EraseMultiple = NULL,
|
|
.WriteBLPage = h2fmiWriteBootpage,
|
|
#endif // !defined(AND_READONLY)
|
|
};
|
|
|
|
#if WITH_PPN
|
|
static LowFuncTbl stLowFuncTblPpn = {
|
|
|
|
#if (AND_SUPPORT_BLOCK_STORAGE || AND_SUPPORT_NVRAM || AND_SUPPORT_FW_AREA)
|
|
.GetDeviceInfo = h2fmiGetDeviceInfo,
|
|
.Reset = h2fmiReset,
|
|
.CalcCurrentTiming = h2fmiCalcCurrentTimings,
|
|
.SetWhiteningState = h2fmiSetWhiteningState,
|
|
.SetWhiteningMetadataState = h2fmiSetWhiteningMetadataState,
|
|
.RegisterCurrentTransaction = h2fmiRegisterCurrentTransaction,
|
|
.ReadWithECC = h2fmiPpnReadSinglePage,
|
|
#endif
|
|
|
|
#if (defined(AND_SUPPORT_BLOCK_STORAGE) && AND_SUPPORT_BLOCK_STORAGE)
|
|
.SetDeviceInfo = h2fmiSetDeviceInfo,
|
|
.ReadNoECC = NULL,
|
|
.ReadMultiplePages = NULL,
|
|
.ReadScatteredPages = NULL,
|
|
.ReadMaxECC = NULL,
|
|
#elif (defined(AND_FPART_ONLY) && AND_FPART_ONLY)
|
|
.ReadNoECC = NULL,
|
|
.ReadMaxECC = NULL,
|
|
#endif
|
|
|
|
#if ((defined(AND_SUPPORT_NVRAM) && AND_SUPPORT_NVRAM) || (defined(AND_SUPPORT_FW_AREA) && AND_SUPPORT_FW_AREA))
|
|
.ReadBLPage = h2fmiPpnReadBootpage,
|
|
#endif
|
|
|
|
#if !H2FMI_READONLY
|
|
.WriteMultiplePages = NULL,
|
|
.Write = h2fmiPpnWriteSinglePage,
|
|
.WriteScatteredPages = NULL,
|
|
.WriteMaxECC = NULL,
|
|
#endif // !H2FMI_READONLY
|
|
|
|
#if !(defined(AND_READONLY)) || AND_SUPPORT_NVRAM
|
|
.Erase = h2fmiPpnEraseSingleBlock,
|
|
.EraseMultiple = NULL,
|
|
.WriteBLPage = h2fmiPpnWriteBootpage,
|
|
#endif
|
|
.PerformCommandList = h2fmiPpnPerformCommandList,
|
|
};
|
|
#endif //WITH_PPN
|
|
|
|
extern h2fmi_t g_fmi0;
|
|
|
|
/*****************************************************************************/
|
|
/* Code Implementation */
|
|
/*****************************************************************************/
|
|
Int32
|
|
FIL_Init(void)
|
|
{
|
|
Int32 nFILRet;
|
|
static BOOL32 bInitDone = FALSE32;
|
|
|
|
if (TRUE32 == bInitDone)
|
|
{
|
|
h2fmiPrintConfig();
|
|
return FIL_SUCCESS;
|
|
}
|
|
|
|
nFILRet = h2fmiInit();
|
|
if (nFILRet != FIL_SUCCESS)
|
|
{
|
|
return nFILRet;
|
|
}
|
|
|
|
#if !WITH_PPN
|
|
if (g_fmi0.is_ppn)
|
|
{
|
|
WMR_PRINT(ERROR, "[FIL:ERR] Build does not support PPN!\n");
|
|
return FIL_UNSUPPORTED_ERROR;
|
|
}
|
|
#endif // WITH_PPN
|
|
|
|
bInitDone = TRUE32;
|
|
return FIL_SUCCESS;
|
|
}
|
|
|
|
LowFuncTbl*
|
|
FIL_GetFuncTbl()
|
|
{
|
|
LowFuncTbl *ppn = NULL;
|
|
|
|
#if WITH_PPN
|
|
ppn = &stLowFuncTblPpn;
|
|
#endif // WITH_PPN
|
|
|
|
return (g_fmi0.is_ppn ? ppn : &stLowFuncTbl);
|
|
}
|
|
|
|
BOOL32 FIL_GetStruct(UInt32 dwStructType, void* pvoidStructBuffer, UInt32* pdwStructSize)
|
|
{
|
|
WMR_PRINT(INF, "[FIL:INF] FIL_GetStruct(0x%08X)\n", dwStructType);
|
|
|
|
return h2fmiGetStruct(dwStructType, pvoidStructBuffer, pdwStructSize);
|
|
}
|
|
|
|
#if AND_SUPPORT_BLOCK_STORAGE
|
|
BOOL32 FIL_SetStruct(UInt32 dwStructType, void* pvoidStructBuffer, UInt32 dwStructSize)
|
|
{
|
|
WMR_PRINT(INF,
|
|
"[FIL:INF] FIL_SetStruct(0x%08X, %d)\n", dwStructType, dwStructSize);
|
|
|
|
return h2fmiSetStruct(dwStructType, pvoidStructBuffer, dwStructSize);
|
|
}
|
|
#endif //AND_SUPPORT_BLOCK_STORAGE
|
|
|
|
void FIL_Close(void)
|
|
{
|
|
// do nothing
|
|
}
|
|
/*
|
|
void FIL_SwitchToPpn(void)
|
|
{
|
|
stLowFuncTbl.GetDeviceInfo = h2fmi_ppn_get_device_info;
|
|
}
|
|
*/
|