void TC_FTL_BasicalValidation(CuTest* tc) { STATUS ret; UINT8 buffer[MPP_SIZE]; MTD_Init(); ret = FTL_Format(); CuAssertTrue(tc, ret==STATUS_SUCCESS); ret = FTL_Init(); CuAssertTrue(tc, ret==STATUS_SUCCESS); buffer[0] = 0x5a; ret = FTL_Write(0, buffer); CuAssertTrue(tc, ret==STATUS_SUCCESS); buffer[0] = 0x00; ret = FTL_Read(0, buffer); CuAssertTrue(tc, ret==STATUS_SUCCESS); CuAssertTrue(tc, buffer[0] == 0x5a); }
UINT32 PSII_HALWrapper(VOID *pPacket, VOID *pInOutBuf, UINT32 *pResult) { FTLPacket *pstInPacketFTL = NULL; VFLPacket *pstInPacketVFL = NULL; UINT32 nCtrlCode; UINT32 nLsn; UINT32 nNumOfScts; UINT8 *pBuf; UINT32 *pTotalScts; UINT32 nVbn; UINT32 nVpn; UINT32 nSrcVpn; UINT32 nDesVpn; BOOL32 bCleanChk; BUFType eType; Buffer *pbBuf; /* UINT16 *pFTLCxtVbn = NULL; */ HALWP_LOG_PRINT((TEXT("[HALWP: IN] ++PSII_HALWrapper()\r\n"))); pstInPacketFTL = (FTLPacket*)pPacket; if (pstInPacketFTL->nCtrlCode <= PM_HAL_FIL_INIT) { HALWP_LOG_PRINT((TEXT("[HALWP:LOG] VFL packet\r\n"))); pstInPacketFTL = NULL; pstInPacketVFL = (VFLPacket*)pPacket; nCtrlCode = pstInPacketVFL->nCtrlCode; nVbn = pstInPacketVFL->nVbn; nVpn = pstInPacketVFL->nVpn; pbBuf = pstInPacketVFL->pBuf; nSrcVpn = pstInPacketVFL->nSrcVpn; nDesVpn = pstInPacketVFL->nDesVpn; bCleanChk = pstInPacketVFL->bCleanCheck; eType = pstInPacketVFL->eType; } else { HALWP_LOG_PRINT((TEXT("[HALWP:LOG] FTL packet\r\n"))); nCtrlCode = pstInPacketFTL->nCtrlCode; nLsn = pstInPacketFTL->nLsn; nNumOfScts = pstInPacketFTL->nNumOfScts; pBuf = pstInPacketFTL->pBuf; pTotalScts = pstInPacketFTL->pTotalScts; } HALWP_LOG_PRINT((TEXT("[HALWP:LOG] nCtrlCode = %d\r\n"), nCtrlCode)); HALWP_LOG_PRINT((TEXT("[HALWP:LOG] nLsn = %d(0x%x)\r\n"), nLsn, nLsn)); HALWP_LOG_PRINT((TEXT("[HALWP:LOG] nNumOfScts = %d\r\n"), nNumOfScts)); HALWP_LOG_PRINT((TEXT("[HALWP:LOG] pBuf = 0x%x\r\n"), (UINT32)pBuf)); //HALWP_LOG_PRINT((TEXT("[HALWP:LOG] pTotalScts = %d(0x%x)\r\n"), *pTotalScts,(UINT32)pTotalScts)); switch (nCtrlCode) { case PM_HAL_VFL_INIT: HALWP_RTL_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_VFL_INIT\r\n"))); *pResult = (UINT32)VFL_Init(); pInOutBuf = NULL; break; case PM_HAL_VFL_OPEN: HALWP_RTL_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_VFL_OPEN\r\n"))); *pResult = (UINT32)VFL_Open(); pInOutBuf = NULL; break; case PM_HAL_FIL_INIT: HALWP_RTL_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_FIL_INIT\r\n"))); *pResult = (UINT32)FIL_Init(); pInOutBuf = NULL; break; case PM_HAL_FIL_GET_NANDINFO: HALWP_INF_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_FTL_INIT\r\n"))); GetNandInfo((NAND_INFO *)pInOutBuf); break; case PM_HAL_FTL_INIT: HALWP_INF_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_FTL_INIT\r\n"))); *pResult = (UINT32)FTL_Init(); pInOutBuf = NULL; break; case PM_HAL_FTL_OPEN: HALWP_INF_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_FTL_OPEN\r\n"))); HALWP_INF_PRINT((TEXT("[HALWP:INF] pTotalScts = %d\r\n"), *pTotalScts)); if ( bAllreadyFTLOpen == FALSE ) { *pResult = (UINT32)FTL_Open(pTotalScts); if ( *pResult == FTL_SUCCESS ) { bAllreadyFTLOpen = TRUE; TotalScts = *pTotalScts; } } else { *pTotalScts = TotalScts; *pResult = FTL_SUCCESS; HALWP_ERR_PRINT((TEXT("[HALWP:INF] TotalScts = %d\r\n"), TotalScts)); } pInOutBuf = NULL; break; case PM_HAL_FTL_FORMAT: HALWP_INF_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_FTL_FORMAT\r\n"))); *pResult = (UINT32)FTL_Format(); pInOutBuf = NULL; break; case PM_HAL_VFL_READ: HALWP_INF_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_VFL_READ\r\n"))); HALWP_INF_PRINT((TEXT("[HALWP:INF] nVpn = %d(0x%x)\r\n"), nVpn)); HALWP_INF_PRINT((TEXT("[HALWP:INF] pBuf = 0x%x\r\n"), (UINT32)pBuf)); HALWP_INF_PRINT((TEXT("[HALWP:INF] bCleanChk = 0x%x\r\n"), (UINT32)bCleanChk)); *pResult = (UINT32)VFL_Read(nVpn,(Buffer*)pbBuf,bCleanChk); break; case PM_HAL_FTL_READ: HALWP_INF_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_FTL_READ\r\n"))); HALWP_INF_PRINT((TEXT("[HALWP:INF] nLsn = %d\r\n"), nLsn)); HALWP_INF_PRINT((TEXT("[HALWP:INF] nNumOfScts= %d\r\n"), nNumOfScts)); HALWP_INF_PRINT((TEXT("[HALWP:INF] pBuf = 0x%x\r\n"), (UINT32)pBuf)); *pResult = (UINT32)FTL_Read(nLsn,nNumOfScts,(UINT8*)pBuf); pInOutBuf = NULL; break; case PM_HAL_FTL_SCAN: HALWP_INF_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_FTL_SCAN\r\n"))); // nLsn number is SCAN_FS or SCAN_OS *pResult = (UINT32)FTL_Scan(nLsn); pInOutBuf = NULL; break; #if (WMR_READ_RECLAIM) case PM_HAL_FTL_READRECLAIM: HALWP_INF_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_FTL_READRECLAIM\r\n"))); *pResult = (UINT32)FTL_ReadReclaim(); pInOutBuf = NULL; break; #endif case PM_HAL_FTL_WRITE: HALWP_INF_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_FTL_WRITE\r\n"))); HALWP_INF_PRINT((TEXT("[HALWP:INF] nLsn = %d\r\n"), nLsn)); HALWP_INF_PRINT((TEXT("[HALWP:INF] nNumOfScts= %d\r\n"), nNumOfScts)); HALWP_INF_PRINT((TEXT("[HALWP:INF] pBuf = 0x%x\r\n"), (UINT32)pBuf)); *pResult = (UINT32)FTL_Write(nLsn,nNumOfScts,(UINT8*)pBuf); pInOutBuf = NULL; break; case PM_HAL_FTL_DELETE: HALWP_INF_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_FTL_DELETE\r\n"))); HALWP_INF_PRINT((TEXT("[HALWP:INF] nLsn = %d\r\n"), nLsn)); HALWP_INF_PRINT((TEXT("[HALWP:INF] nNumOfScts= %d\r\n"), nNumOfScts)); *pResult = (UINT32)FTL_Delete(nLsn,nNumOfScts); pInOutBuf = NULL; break; case PM_HAL_FTL_CLOSE: HALWP_INF_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_FTL_CLOSE\r\n"))); *pResult = (UINT32)FTL_Close(); pInOutBuf = NULL; bAllreadyFTLOpen = FALSE; TotalScts = 0; break; case PM_HAL_FTL_GARBAGECOLLECT: HALWP_INF_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_FTL_GARBAGECOLLECT\r\n"))); *pResult = (UINT32)FTL_GarbageCollect(); pInOutBuf = NULL; break; case PM_HAL_FTL_FORMATPROC: HALWP_INF_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_FTL_FORMATPROC\r\n"))); // *pResult = (UINT32)FTL_FormatProc(); pInOutBuf = NULL; break; case PM_HAL_WMR_FORMAT_FIL: HALWP_INF_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_WMR_FORMAT_FIL\r\n"))); *pResult = (UINT32)WMR_Format_FIL(); pInOutBuf = NULL; break; case PM_HAL_WMR_FORMAT_VFL: HALWP_INF_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_WMR_FORMAT_VFL\r\n"))); *pResult = (UINT32)WMR_Format_VFL(); pInOutBuf = NULL; break; case PM_HAL_WMR_FORMAT_FTL: HALWP_INF_PRINT((TEXT("[HALWP:INF] nCtrlCode = PM_HAL_WMR_FORMAT_FTL\r\n"))); *pResult = (UINT32)WMR_Format_FTL(); pInOutBuf = NULL; break; default: return FALSE; } HALWP_LOG_PRINT((TEXT("[HALWP:OUT] --PSII_HALWrapper()\r\n"))); return TRUE; }
// Format FTL layer // You must close FTL layer FTL_Close() BOOL32 WMR_Format_FTL(void) { UINT32 nBlock; UINT32 pTotalScts; WMR_UTIL_LOG((TEXT("[WMR ] ++WMR_Format_FTL()\r\n"))); #if 0 if (FTL_Close() == FTL_SUCCESS) { WMR_UTIL_LOG((TEXT("[WMR ] WMR_Format_FTL() : FTL_Close() Success\r\n"))); } else { WMR_UTIL_ERR((TEXT("[WMR:ERR] WMR_Format_FTL() : FTL_Close() Failure\r\n"))); return FALSE32; } #endif for (nBlock=FTL_INFO_SECTION_START; nBlock<SUBLKS_TOTAL; nBlock++) { if (VFL_Erase(nBlock) != VFL_SUCCESS) { WMR_UTIL_ERR((TEXT("[WMR:ERR] WMR_Format_FTL() : VFL_Erase() Failure @ Virtual Block %d\r\n"), nBlock)); } } WMR_UTIL_INF((TEXT("[WMR:INF] WMR_Format_FTL() : All Virtual Block Erased (VFL) !!!\r\n"))); if (FTL_Init() == FTL_SUCCESS) { WMR_UTIL_INF((TEXT("[WMR:INF] WMR_Format_FTL() : FTL_Init() Success\r\n"))); } else { WMR_UTIL_ERR((TEXT("[WMR:ERR] WMR_Format_FTL() : FTL_Init() Failure\r\n"))); return FALSE32; } if (FTL_Format() == FTL_SUCCESS) { WMR_UTIL_INF((TEXT("[WMR:INF] WMR_Format_FTL() : FTL_Format() Success\r\n"))); } else { WMR_UTIL_ERR((TEXT("[WMR:ERR] WMR_Format_FTL() : FTL_Format() Failure\r\n"))); return FALSE32; } WMR_UTIL_LOG((TEXT("[WMR ] --WMR_Format_FTL()\r\n"))); if (FTL_Open(&pTotalScts) == FTL_SUCCESS) { WMR_UTIL_INF((TEXT("[WMR:INF] WMR_Format_FTL() : FTL_Open() Success\r\n"))); } else { WMR_UTIL_ERR((TEXT("[WMR:ERR] WMR_Format_FTL() : FTL_Open() Failure\r\n"))); return FALSE32; } WMR_UTIL_LOG((TEXT("[WMR ] --WMR_Format_FTL()\r\n"))); return TRUE32; }
int ftl_setup() { if(HasFTLInit) return 0; nand_setup(); Data = nand_get_geometry(); Data2 = nand_get_data(); if(VFL_Init() != 0) { bufferPrintf("ftl: VFL_Init failed\r\n"); return -1; } if(FTL_Init() != 0) { bufferPrintf("ftl: FTL_Init failed\r\n"); return -1; } int i; int foundSignature = FALSE; DebugPrintf("ftl: Attempting to read %d pages from first block of first bank.\r\n", Data->pagesPerBlock); uint8_t* buffer = malloc(Data->bytesPerPage); for(i = 0; i < Data->pagesPerBlock; i++) { int ret; if((ret = nand_read_alternate_ecc(0, i, buffer)) == 0) { uint32_t id = *((uint32_t*) buffer); if(id == FTL_ID_V1 || id == FTL_ID_V2) { bufferPrintf("ftl: Found production format: %x\r\n", id); foundSignature = TRUE; break; } else { DebugPrintf("ftl: Found non-matching signature: %x\r\n", ((uint32_t*) buffer)); } } else { DebugPrintf("ftl: page %d of first bank is unreadable: %x!\r\n", i, ret); } } free(buffer); if(!foundSignature || !hasDeviceInfoBBT()) { bufferPrintf("ftl: no signature or production format.\r\n"); return -1; } if(VFL_Open() != 0) { bufferPrintf("ftl: VFL_Open failed\r\n"); return -1; } int pagesAvailable; int bytesPerPage; if(FTL_Open(&pagesAvailable, &bytesPerPage) != 0) { bufferPrintf("ftl: FTL_Open failed\r\n"); return -1; } HasFTLInit = TRUE; return 0; }