ocld.cpp

来自「SAMSUNG S3C6410 CPU BSP for winmobile6」· C++ 代码 · 共 1,751 行 · 第 1/5 页

CPP
1,751
字号
static VOID
_ReadEmptyData(UINT32 pAddr, UINT32 nScts, UINT32 nSize)
{
    UINT32 nBytes;
    volatile UINT32 nTmp;

    while (nScts-- > 0)
    {
        for (nBytes = nSize; nBytes > 0; nBytes -= sizeof(UINT32))
        {
            nTmp = *(volatile UINT32 *)pAddr;
        }
    }
}

static VOID
_ReadData(volatile UINT32 pAddr, register UINT8 *pBuf, UINT32 nScts, UINT32 nSize)
{
    register UINT32 *pBuffer = (UINT32 *)pBuf;

#if (OND_TRANS_MODE == OND_POL)
    UINT32 nBytes;

    while (nScts-- > 0)
    {
        for (nBytes = nSize; nBytes > 0; nBytes -= sizeof(UINT32))
        {
            *pBuffer++ = *(volatile UINT32 *)pAddr;
        }
    }
#elif (OND_TRANS_MODE == OND_LDM)
	//OneNand4burstPageRead(pAddr, (UINT32)pBuffer, (UINT32)((nSize * nScts)/16));
	OneNand8burstPageRead(pAddr, (UINT32)pBuffer, (UINT32)((nSize * nScts)/32));
#endif  // OND_TRANS_MODE
}

#ifdef ONENANDCON_READ_FULL_SECTOR
static VOID
_WriteData1(UINT32 pAddr, register UINT8 *pBuf)
{
    register UINT32 *pBuffer = (UINT32 *)pBuf;

#if (OND_TRANS_MODE == OND_POL)
    UINT32 nBytes;
    UINT32 nSize = ONDC_MAINSPARE/4;

    for (nBytes = nSize; nBytes > 0; nBytes -= sizeof(UINT32))
    {
        *(volatile UINT32 *)pAddr = *pBuffer++;
    }
#elif (OND_TRANS_MODE == OND_LDM)
   // OneNand4burstPageWrite((UINT32)pBuffer, (UINT32)pAddr, (UINT32)(ONDC_MAINSPARE/16));
    OneNand8burstPageWrite((UINT32)pBuffer, (UINT32)pAddr, (UINT32)(ONDC_MAINSPARE/32));
#elif (OND_TRANS_MODE == OND_DMA)
	DMASetChannelTransSize_Write(g_nDMABufferPhyPage, pAddr, ONDC_MAINSPARE/4);
	DMAChannelStart();

	// Check transfer end
	while((g_pDMAC0Reg->DMACC3Configuration&CHANNEL_ENABLE));
#endif  // OND_TRANS_MODE
}

static VOID
_ReadData1(UINT32 pAddr, register UINT8 *pBuf)
{
    register UINT32 *pBuffer = (UINT32 *)pBuf;

#ifdef ONENAND_READ_LED_ON
	g_pGPIOReg->GPNDAT |= (1<<13);
#endif  // ONENAND_READ_LED_ON
#if (OND_TRANS_MODE == OND_POL)
    UINT32 nBytes;
    UINT32 nSize = ONDC_MAINSPARE/4;

    for (nBytes = nSize; nBytes > 0; nBytes -= sizeof(UINT32))
    {
        *pBuffer++ = *(volatile UINT32 *)pAddr;
    }
#elif (OND_TRANS_MODE == OND_LDM)
	//OneNand4burstPageRead((UINT32)pAddr, (UINT32)pBuffer, (UINT32)(ONDC_MAINSPARE/16));
	OneNand8burstPageRead((UINT32)pAddr, (UINT32)pBuffer, (UINT32)(ONDC_MAINSPARE/32));
#elif (OND_TRANS_MODE == OND_DMA)
	DMASetChannelTransSize_Read(pAddr, g_nDMABufferPhyPage, ONDC_MAINSPARE/4);
	DMAChannelStart();

	// Check transfer end
	while((g_pDMAC0Reg->DMACC3Configuration&CHANNEL_ENABLE));
#endif  // OND_TRANS_MODE
#ifdef ONENAND_READ_LED_ON
	g_pGPIOReg->GPNDAT &= ~(1<<13);
#endif  // ONENAND_READ_LED_ON
}
#endif  // ONENANDCON_READ_FULL_SECTOR

static VOID
_Read_M11_Data(UINT32 *pM11Addr, UINT32 *pBuf, UINT32 nScts, UINT32 nSize)
{
    UINT32 nBytes;
    
    while (nScts-- > 0)
    {
        for (nBytes = nSize; nBytes > 0; nBytes -= sizeof(UINT32))
        {
            *pBuf++ = (UINT32)*pM11Addr++;
        }
    }
}

UINT32
_SetRWBlock(UINT32 nDev, UINT32 nSUbn, UINT32 nUBlks)
{
#if !defined(XSR_NBL2)
    UINT32 nBAddr;
    UINT32 nCAddr;

    ONLD_DBG_PRINT((TEXT("[ONLD : OUT] ++ONLD_SetRWArea()\r\n")));

    /* IOBE bit of pONENANDReg->MEM_CFG should be enabled for M10 execution. */

    nBAddr = GET_DEV_BADDR(nDev);
    nCAddr = GET_ONENANDCON_BADDR(nBAddr);

    /* Clear INT */
    OCLD_REG_INT_ERR_STAT(nCAddr) = (UINT16)CINT_CLEAR;

    /* Set start address to be unlocked */
    if (nUBlks > 1) ONLD_WRITE_CMD(nDev, nBAddr, nSUbn, 0, 0x08);

    /* Set unlock end address and initiate the unlock */
    ONLD_WRITE_CMD(nDev, nBAddr, nSUbn + nUBlks -1, 0, 0x09);

    /* wait until command is completed */
	while ((OCLD_REG_INT_ERR_STAT(nCAddr) & CPEND_INT) != (UINT16)CPEND_INT)
	{
        /* Wait until device ready */
        OAM_Idle();	
    }

    while ((OCLD_REG_INT_ERR_STAT(nCAddr) & BIT_LOCKED_BLK) == (UINT16)BIT_LOCKED_BLK)
    {
       /* Wait until device UnLock */
       OAM_Idle();
    } 

    ONLD_DBG_PRINT((TEXT("[ONLD : OUT] --ONLD_SetRWArea()\r\n")));
    return ONLD_SUCCESS;
#endif /* #if !defined(XSR_NBL2) */
}

static UINT32
_LockBlock (UINT32  nDev, UINT8  *pBufI, UINT32 nLenI)
{
    UINT32    nBAddr;
    UINT32    nSbn;
    UINT32    nBlks;
    UINT32    nCAddr;

    ONLD_DBG_PRINT((TEXT("[ONLD : OUT] ++_LockBlock()\r\n")));

    nSbn  = *(UINT32*)pBufI;
    nBlks = *((UINT32*)(pBufI+4));

    nBAddr = GET_DEV_BADDR(nDev);
    nCAddr = GET_ONENANDCON_BADDR(nBAddr);

    for (; nBlks > 0; nBlks--, nSbn++)
    {
        /* IOBE bit of pONENANDReg->MEM_CFG should be enabled for M10 execution. */

        /* Clear INT */
        OCLD_REG_INT_ERR_STAT(nCAddr) = (UINT16)CINT_CLEAR;

        /* Set lock end address and initiate the lock */
        ONLD_WRITE_CMD(nDev, nBAddr, nSbn, 0, 0x0B);

        /* wait until command is completed */
        while ((OCLD_REG_INT_ERR_STAT(nCAddr) & CPEND_INT) != (UINT16)CPEND_INT)
        {
		 /* Wait until device ready */
		 	OAM_Idle();
        }

        while((OCLD_REG_INT_ERR_STAT(nCAddr) & BIT_LOCKED_BLK) != (UINT16)BIT_LOCKED_BLK)
        {
         /* Wait until device Lock-tight */
         	OAM_Idle();
        }             
    }

    ONLD_DBG_PRINT((TEXT("[ONLD : OUT] --_LockBlock()\r\n")));
    return ONLD_SUCCESS;
}

static UINT32
_LockTigBlock (UINT32  nDev, UINT8  *pBufI, UINT32 nLenI)
{
    UINT32 nBAddr;
    UINT32 nSbn;
    UINT32 nBlks;
    UINT32 nCAddr;

    ONLD_DBG_PRINT((TEXT("[ONLD : OUT] ++_LockTigBlock()\r\n")));

    nBAddr = GET_DEV_BADDR(nDev);
    nCAddr = GET_ONENANDCON_BADDR(nBAddr);

    nSbn  = *(UINT32*)pBufI;
    nBlks = *((UINT32*)(pBufI+4));

    /* Clear INT */
    OCLD_REG_INT_ERR_STAT(nCAddr) = (UINT16)CINT_CLEAR;

    /* Set lock-tight start address */
	ONLD_WRITE_CMD(nDev, nBAddr, nSbn, 0, 0x0C);

    /* Set lock-tight end address and initiate the lock */
	ONLD_WRITE_CMD(nDev, nBAddr, nSbn + nBlks - 1, 0, 0x0D);

    // wait until command is completed
        while ((OCLD_REG_INT_ERR_STAT(nCAddr) & CPEND_INT) != (UINT16)CPEND_INT)
        {
		 /* Wait until device ready */
		 	OAM_Idle();
        }

        while((OCLD_REG_INT_ERR_STAT(nCAddr) & BIT_LOCKED_BLK) != (UINT16)BIT_LOCKED_BLK)
        {
         /* Wait until device Lock-tight */
         	OAM_Idle();
        }             

    ONLD_DBG_PRINT((TEXT("[ONLD : OUT] --_LockTigBlock()\r\n")));
    return ONLD_SUCCESS;
}

static VOID
_InitDevInfo(UINT32 nDev, UINT16 *pDID, UINT16 *pVID)
{
    UINT32 nBAddr;
    nBAddr = GET_DEV_BADDR(nDev);

    if(pDID == NULL || pVID == NULL)
    {
        ONLD_ERR_PRINT((TEXT("[ONLD : ERR] (_InitDevInfo) Illeagal Access\r\n")));
        return;
    }

    astONLDInfo[nDev].nBufSelSft       = 2;
    astONLDInfo[nDev].nSctSelSft       = 3;
    astONLDInfo[nDev].nBlkSelSft       = 8;
    astONLDInfo[nDev].nPgSelSft        = 2;
    astONLDInfo[nDev].nDDPSelSft       = 6;
    astONLDInfo[nDev].nFPASelSft       = 0;
    astONLDInfo[nDev].nFSAMask         = 3;
    astONLDInfo[nDev].nSctsPerPG       = 4;
    ONLD_CMD_LOCK_NAND                 = 0x002A;
    ONLD_CMD_LOCK_TIGHT                = 0x002C;
    astONLDInfo[nDev].MRead            = _M01_MRead;

    if (((*pDID & 0x00F0) == CHIP_256M) || ((*pDID & 0x00F0) == CHIP_128M))
    {
        astONLDInfo[nDev].nBufSelSft    = 1;
        astONLDInfo[nDev].nSctSelSft    = 1;
        astONLDInfo[nDev].nBlkSelSft    = 7;
        astONLDInfo[nDev].nPgSelSft     = 1;
        astONLDInfo[nDev].nFPASelSft    = 1;

        astONLDInfo[nDev].nFSAMask   = 1;
        astONLDInfo[nDev].nSctsPerPG = 2;

        if ((*pVID & 0x0F00) == M_DIE)
        {
            ONLD_CMD_LOCK_NAND       = 0x002B;
            ONLD_CMD_LOCK_TIGHT      = 0x002D;
        }
        astONLDInfo[nDev].MRead      = _M01_MRead;
    }

    if ((*pDID & 0x00F0) == CHIP_512M)
    {
        if ((*pVID & 0x0F00) == M_DIE || (*pVID & 0x0F00) == A_DIE)
        {
            astONLDInfo[nDev].MRead  = _M01_MRead;
        }
    }
    if ((*pDID & 0x00F0) == CHIP_1G)
    {
        if ((*pVID & 0x0F00) == M_DIE)
        {
            astONLDInfo[nDev].MRead  = _M01_MRead;
        }
    }

    if ((*pDID & 0x00F0) == CHIP_2G)
    {
        astONLDInfo[nDev].nDDPSelSft    = 5;

        if ((*pDID & 0x0008) == DDP_CHIP)
        {
            if ((*pVID & 0x0F00) == M_DIE)
            {
                astONLDInfo[nDev].MRead  = _M01_MRead;
            }
        }
    }
    else if ((*pDID & 0x00F0) == CHIP_4G)
    {
        astONLDInfo[nDev].nDDPSelSft    = 4;
    }

    if (astONLDDev[nDev].pstDevSpec->nLKFlag == BLK_LK)
    {
        astONLDInfo[nDev].SetRWArea = _SetRWBlock;
#ifdef LOCK_TIGHT
        astONLDInfo[nDev].LockTight = _LockTigBlock;
#else
        /* for erase refresh, lock-tight is disabled */
        astONLDInfo[nDev].LockTight = _LockBlock;
#endif
    }
    else if (astONLDDev[nDev].pstDevSpec->nLKFlag == RNG_LK)
    {
        astONLDInfo[nDev].SetRWArea = _SetRWRange;
        astONLDInfo[nDev].LockTight = _LockTigRange;
    }
    else
    {
        astONLDInfo[nDev].SetRWArea = NULL;
        astONLDInfo[nDev].LockTight = NULL;
    }
}

/*****************************************************************************/
/*                                                                           */
/* NAME                                                                      */
/*      _StrictChk                                                           */
/* DESCRIPTION                                                               */
/*      This function performs strict checks                                 */
/* PARAMETERS                                                                */
/*      nDev                                                                 */
/*          Physical Device Number (0 ~ 7)                                   */
/*      nPsn                                                                 */
/*          Physical Sector Number                                           */
/*      nScts                                                                */
/*          Number of Sectors                                                */
/* RETURN VALUES                                                             */
/*      TRUE32                                                               */
/*          Strict Check OK                                                  */
/*      FALSE32                                                              */
/*          Strcit Check Failure                                             */
/* NOTES                                                                     */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?