Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
// 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;
}
Exemplo n.º 4
0
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;
}