⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 system.c

📁 s3c2450 bsp for wince 5.0 经验证,完全没问题
💻 C
📖 第 1 页 / 共 5 页
字号:
/*      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 + -