📄 system.c
字号:
/* RequestReadSecToHAL */
/* DESCRIPTION */
/* free all resources associated with the specified disk */
/* PARAMETERS */
/* pDisk BIBDRV_PS driver own structure pointer */
/* nSecNum Number of Sectors */
/* pBuf Pointer to Read buffer */
/* RETURN VALUES */
/* If it successes, it returns TRUE. otherwize it returns FALSE */
/* */
/*****************************************************************************/
static BOOL
RequestReadSecToHAL(PDISK pDisk,
UINT nSecNum,
UCHAR *pBuf)
{
#if defined(_SUPPORT_HAL_WRAPPER_)
VFLPacket stPacket;
INT nResult;
#endif
BOOL bRet = FALSE;
Buffer stBuf;
UINT32 nStartPageAddr;
UINT32 nVsnAlign;
UINT startSectorAddr;
UINT32 nVsnCnt;
UINT32 nSctToRead;
// UINT8 pTmpBuf[8192*2*2]; // maximum value for 2 plane & internal interleaving & 2CE ... hmseo-061208
UINT8 * pTmpBuf; // maximum value for 2 plane & internal interleaving & 2CE ... hmseo-061208
UINT32 uFullSectorBitmapPage;
DWORD nCnt, nBit1Cnt = 0;
BIBDRV_LOG_PRINT((TEXT("[BIBDRV: IN] ++RequestReadSecToHAL()\r\n")));
pTmpBuf = malloc(8192*2*2);
uFullSectorBitmapPage = ((1 << (stNandInfo.dwSectorsPerSuPage)) - 1);
#if defined(_SUPPORT_HAL_WRAPPER_)
stBuf.eStatus = BUF_AUX;
stBuf.nBank = 0;
stBuf.pData = (UINT8 *)pBuf;
stBuf.pSpare = NULL;
stPacket.nVol = pDisk->nVol;
stPacket.nCtrlCode = PM_HAL_VFL_READ;
stPacket.nVbn = 0; // Not used
stPacket.nVpn = nSecNum + pDisk->nBaseVsn;
stPacket.pBuf = &stBuf;
stPacket.nSrcVpn = 0;
stPacket.nDesVpn = 0;
stPacket.bCleanCheck = FALSE32;
BIBDRV_INF_PRINT((TEXT("[BIBDRV:INF] stPacket.nVol = %d\r\n"), stPacket.nVol));
BIBDRV_INF_PRINT((TEXT("[BIBDRV:INF] stPacket.nCtrlCode = 0x%x\r\n"), stPacket.nCtrlCode));
BIBDRV_INF_PRINT((TEXT("[BIBDRV:INF] stPacket.nVpn = %d\r\n"), stPacket.nVpn));
BIBDRV_INF_PRINT((TEXT("[BIBDRV:INF] stPacket.pBuf = 0x%x\r\n"), stPacket.pBuf));
KernelIoControl(IOCTL_POCKETSTOREII_CMD, /* IO Control Code */
&stPacket, /* Pointer to additional IO Control Code*/
sizeof(stPacket), /* Size of Input buffer */
NULL, /* Pointer to out buffer */
0, /* Size of Output buffer */
&nResult); /* Number of bytes returned */
if (VFL_SUCCESS != nResult)
{
BIBDRV_ERR_PRINT((TEXT("[BIBDRV:ERR] nResult = %d\r\n"), nResult));
goto RequestReadSecToHALError;
}
#else //(_SUPPORT_HAL_WRAPPER_)
startSectorAddr = nSecNum + pDisk->nBaseVsn;
nVsnCnt = 1;
nVsnAlign = startSectorAddr % stNandInfo.dwSectorsPerSuPage;
nStartPageAddr= startSectorAddr/stNandInfo.dwSectorsPerSuPage;
if (nVsnAlign != 0)
{
if (nVsnCnt >= (stNandInfo.dwSectorsPerSuPage - nVsnAlign))
{
nSctToRead = stNandInfo.dwSectorsPerSuPage - nVsnAlign;
}
else
{
nSctToRead = nVsnCnt;
}
}
else
{
if (nVsnCnt >= stNandInfo.dwSectorsPerSuPage)
{
nSctToRead = stNandInfo.dwSectorsPerSuPage;
}
else
{
nSctToRead = nVsnCnt;
}
}
stBuf.eStatus = BUF_AUX;
stBuf.nBank = 0;
stBuf.pSpare = NULL;
stBuf.nBitmap = ((((uFullSectorBitmapPage >> (stNandInfo.dwSectorsPerSuPage - nSctToRead))&uFullSectorBitmapPage)<<nVsnAlign)&uFullSectorBitmapPage);
if (((stBuf.nBitmap & 0x1) == 0x1) || (stBuf.nBitmap == 0x0))
{
stBuf.pData = (UINT8 *)pBuf;
}
else
{
stBuf.pData = (UINT8 *)pTmpBuf;
}
#define MULTI_SECTOR_READ 1 // only 1 sector reading from above layer
#if MULTI_SECTOR_READ // find the number of bit '1' at stBuf.nBitmap,
// But i cannot find the nBit1Cnt value except 1.
// so you must copy just 1 sector to pBuf from pTmpBuf after VFL_Read() in case stBuf.nBitmap is more 2.
for (nCnt = 0; nCnt < stNandInfo.dwSectorsPerSuPage; nCnt++)
{
if ((stBuf.nBitmap & (1 << nCnt)) != 0)
nBit1Cnt++;
}
#endif
// BIBDRV_RTL_PRINT((TEXT("[BIBDRV:INF] nStartPageAddr = 0x%x\r\n"), nStartPageAddr));
// BIBDRV_RTL_PRINT((TEXT("[BIBDRV:INF] stBuf.nBitmap = 0x%x\r\n"), stBuf.nBitmap));
// BIBDRV_RTL_PRINT((TEXT("[BIBDRV:INF] stBuf.pData = 0x%x\r\n"), stBuf.pData));
if (VFL_SUCCESS != VFL_Read(nStartPageAddr,
&stBuf,
FALSE32))
{
goto RequestReadSecToHALError;
}
for (nCnt = 0; nCnt < stNandInfo.dwSectorsPerSuPage; nCnt++)
{
if (nCnt == 0) continue;
else if ((stBuf.nBitmap & (1 << nCnt)) != 0)
{
#if MULTI_SECTOR_READ
memcpy(pBuf, pTmpBuf+(BYTES_PER_SECTOR*nCnt), BYTES_PER_SECTOR*nBit1Cnt); // the value of nBit1Cnt is only 1, so execute next line.
#else
memcpy(pBuf, pTmpBuf+(BYTES_PER_SECTOR*nCnt), BYTES_PER_SECTOR);
#endif
break;
}
}
#if 0
{
DWORD i;
for (i = 0; i < 512; i++) {
if (i % 16 == 0)
RETAILMSG(1, (L"0x%x: ", pBuf+i));
RETAILMSG(1, (L"%x%x ", (pBuf[i] >> 4) & 0x0f, pBuf[i] & 0x0f));
if ((i + 1) % 16 == 0)
RETAILMSG(1, (L"\r\n"));
}
}
#endif
#endif //(_SUPPORT_HAL_WRAPPER_)
bRet = TRUE;
RequestReadSecToHALError:
free(pTmpBuf);
BIBDRV_LOG_PRINT((TEXT("[BIBDRV:OUT] --RequestReadSecToHAL()\r\n")));
return bRet;
}
static void
ViewPage(UCHAR *pBuf)
{
UINT nIdx1, nIdx2;
RETAILMSG(1, (TEXT("=======================================================================\r\n")));
for (nIdx1 = 0; nIdx1 < (512/16); nIdx1 ++)
{
RETAILMSG(1, (TEXT("%02X : "), nIdx1));
for (nIdx2 = 0; nIdx2 < 16; nIdx2 ++)
{
RETAILMSG(1, (TEXT("%02X "), pBuf[nIdx1 * 16 + nIdx2]));
}
RETAILMSG(1, (TEXT("\r\n"), nIdx1));
}
RETAILMSG(1, (TEXT("=======================================================================\r\n")));
}
#if defined(_BIBDRV_CACHING_SECTORS_)
static BOOL
RequestReadSecToHALwithCaching(PDISK pDisk,
UINT nSecNum,
UCHAR *pBuf)
{
#if defined(_SUPPORT_HAL_WRAPPER_)
// FM_PACKET stPacket;
VFLPacket stPacket;
INT nResult;
BIBDRV_SEC_CACHE *pSecCache;
pSecCache = BIBDRVCache_GetSecCache (pDisk->pCacheBuf, nSecNum);
if (NULL != pSecCache)
{
memcpy(pBuf, pSecCache->aBuf, MAINPAGE_SIZE);
return TRUE;
}
stPacket.nVol = pDisk->nVol;
stPacket.nCtrlCode = PM_HAL_VFL_READ;
stPacket.nVpn = nSecNum + pDisk->nBaseVsn;
// stPacket.nNumOfScts = 1;
KernelIoControl(IOCTL_POCKETSTOREII_CMD, /* Io Control Code */
&stPacket, /* Input buffer (Additional Control Code) */
sizeof(stPacket), /* Size of Input buffer */
pBuf, /* Output buffer */
WMR_SECTOR_SIZE, /* Size of Output buffer */
&nResult); /* Error Return */
if (BML_SUCCESS != nResult)
{
return FALSE;
}
BIBDRVCache_AddSecCache (pDisk->pCacheBuf, nSecNum, pBuf);
return TRUE;
#else //(_SUPPORT_HAL_WRAPPER_)
VFLPacket stPacket;
INT nResult;
BOOL bRet = FALSE;
Buffer stBuf;
UINT32 nStartPageAddr;
UINT32 nVsnAlign;
UINT startSectorAddr;
UINT32 nVsnCnt;
UINT32 nSctToRead;
UINT32 uFullSectorBitmapPage;
uFullSectorBitmapPage = ((1 << (stNandInfo.dwSectorsPerSuPage)) - 1);
pSecCache = BIBDRVCache_GetSecCache (pDisk->pCacheBuf, nSecNum);
if (NULL != pSecCache)
{
memcpy(pBuf, pSecCache->aBuf, MAINPAGE_SIZE);
return TRUE;
}
startSectorAddr = nSecNum + pDisk->nBaseVsn;
nVsnCnt = 1;
nVsnAlign = startSectorAddr % stNandInfo.dwSectorsPerSuPage;
nStartPageAddr= startSectorAddr/stNandInfo.dwSectorsPerSuPage;
if (nVsnAlign != 0)
{
if (nVsnCnt >= (stNandInfo.dwSectorsPerSuPage - nVsnAlign))
{
nSctToRead = stNandInfo.dwSectorsPerSuPage - nVsnAlign;
}
else
{
nSctToRead = nVsnCnt;
}
}
else
{
if (nVsnCnt >= stNandInfo.dwSectorsPerSuPage)
{
nSctToRead = stNandInfo.dwSectorsPerSuPage;
}
else
{
nSctToRead = nVsnCnt;
}
}
stBuf.eStatus = BUF_AUX;
stBuf.nBank = 0;
stBuf.pData = (UINT8 *)pBuf;
stBuf.pSpare = NULL;
stBuf.nBitmap = ((((uFullSectorBitmapPage >> (stNandInfo.dwSectorsPerSuPage - nSctToRead))&uFullSectorBitmapPage)<<nVsnAlign)&uFullSectorBitmapPage);
if (VFL_SUCCESS != VFL_Read(nStartPageAddr,
&stBuf,
FALSE32))
{
return TRUE;
}
return FALSE;
#endif //(_SUPPORT_HAL_WRAPPER_)
}
#endif //(_BIBDRV_CACHING_SECTORS_)
/*****************************************************************************/
/* */
/* NAME */
/* DoDiskRead */
/* DESCRIPTION */
/* Do read operation from NAND flash memory */
/* PARAMETERS */
/* pDisk BIBDRV_PS driver own structure pointer */
/* pData PSQ_REQ structure pointer,it contains request information*/
/* for read operations */
/* RETURN VALUES */
/* If it successes, it returns TRUE. otherwize it returns FALSE */
/* */
/*****************************************************************************/
static DWORD
DoDiskRead(PDISK pDisk,
PVOID pData)
{
DWORD status = ERROR_SUCCESS;
DWORD num_sg;
DWORD bytes_this_sg;
PSG_REQ pSgr;
PSG_BUF pSg;
PUCHAR pBuf;
BOOL nRes;
UINT nSecCount, nSecIdx;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -