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

📄 otp.c

📁 SAMSUNG S3C6410 CPU BSP for winmobile6
💻 C
📖 第 1 页 / 共 2 页
字号:
	nScts = 1;

    do {
    	/* ONLD_Write */
        stPacket.nVol       = nVol;
        stPacket.nCtrlCode  = PS_HAL_LLD_OTP_WRITE;
        stPacket.nVbn       = 0;            // Not used
        stPacket.nVsn       = nPsn;
        stPacket.nNumOfScts = nScts;
        stPacket.nOpFlag    = LLD_FLAG_SYNC_OP | LLD_FLAG_ECC_ON;
        stPacket.pMBuf      = pData;
        stPacket.pSBuf      = NULL;			// Do not use spare area
        stPacket.pstMEBArg	= 0;			// by kathy
    
        nErr = KernelIoControl(IOCTL_POCKETSTOREII_CMD,  /* IO Control Code  */
                        &stPacket,              /* Input buffer     */
                        sizeof(BMLPacket),
                        NULL,                   /* Output buffer    */
                        0, 
                        (LPDWORD)(&nResult));
        if (nErr != TRUE)
        {
            OTP_ERR_PRINT( (TEXT("[OTP:ERR]  KernelIoControl() failure. ERR Code=%x\r\n"), nResult));
            return FALSE32;
        }
    } while(0);

    OTP_LOG_PRINT( (TEXT("[OTP:OUT]  -- OndOTPWrite\r\n")) );

    return TRUE32;
}


/*****************************************************************************/
/*                                                                           */
/* NAME                                                                      */
/*      OndOTPLock                                                           */
/*                                                                           */
/* DESCRIPTION                                                               */
/*      Lock OTP page                                                        */
/*                                                                           */
/* PARAMETERS                                                                */
/*      nVol                                                                 */
/*          Physical Device Number (0 ~ 7)                                   */
/*      nPsn                                                                 */
/*          Sector index to be write                                         */
/*      nRetCode                                                             */
/*          Reason for error                                                 */
/*                                                                           */
/* RETURN VALUES                                                             */
/*      If it successes, it returns TRUE. otherwize it returns FALSE         */
/*                                                                           */
/* NOTES                                                                     */
/*      We can lock OTP user area page by page                               */
/*                                                                           */
/*****************************************************************************/
BOOL
OndOTPLock( UINT32 nLock)
{
	INT32	nErr;
	UINT32  nVol = 0;
	UINT32  nPsn = 0;
	UINT32	nScts = 0;
	UINT32  nResult = 0;
	UCHAR	pSBuf[XSR_SPARE_SIZE];
    BMLPacket	stPacket;

	OTP_LOG_PRINT( (TEXT("[OTP: IN] ++OndOTPLock()\r\n")));
	
	nPsn = 0;
	nScts = 1;
	
	memset(pSBuf, 0xFF, nScts * XSR_SPARE_SIZE);
	switch(nLock)
	{
		case 0:	//OTP Lock
			*( (UINT16*)pSBuf + 7 ) = 0xFFFC;				// Lock command (8th word of block#0 sector#0)
			break;
		case 1: // 1st Block OTP Lock	
			*( (UINT16*)pSBuf + 7 ) = 0xFFF3;				// Lock command (8th word of block#0 sector#0)
			break;
		case 2: // OTP & 1st Block OTP Lock	
			*( (UINT16*)pSBuf + 7 ) = 0xFFF0;				// Lock command (8th word of block#0 sector#0)
			break;
		default:
            OTP_ERR_PRINT( (TEXT("[OTP:ERR]  The value of nLock(%d) is unknown.\r\n"), nLock));
            return FALSE;
	}
	

    do {
    	/* ONLD_Write */
        stPacket.nVol       = nVol;
        stPacket.nCtrlCode  = PS_HAL_LLD_OTP_WRITE;
        stPacket.nVbn       = 0;            // Not used
        stPacket.nVsn       = nPsn;
        stPacket.nNumOfScts = nScts;
        stPacket.nOpFlag    = LLD_FLAG_SYNC_OP | LLD_FLAG_ECC_ON;
        stPacket.pMBuf      = NULL;
        stPacket.pSBuf      = pSBuf;
        stPacket.pstMEBArg	= 0;			// by kathy
    
        nErr = KernelIoControl(IOCTL_POCKETSTOREII_CMD,  /* IO Control Code  */
                        &stPacket,              /* Input buffer     */
                        sizeof(BMLPacket),
                        NULL,                   /* Output buffer    */
                        0, 
                        (LPDWORD)(&nResult));
        if (nErr != TRUE)
        {
            OTP_ERR_PRINT( (TEXT("[OTP:ERR]  KernelIoControl() failure. ERR Code=%x\r\n"), nResult));
            return FALSE;
        }
    } while(0);

    OTP_LOG_PRINT( (TEXT("[OTP:OUT]  -- OndOTPLock\r\n")) );

    return TRUE;
}


/*****************************************************************************/
/*                                                                           */
/* NAME                                                                      */
/*      OndOTPStatus                                                         */
/*                                                                           */
/* DESCRIPTION                                                               */
/*      Check OTP Lock Status                                                */
/*                                                                           */
/* PARAMETERS                                                                */
/*      nLock                                                                */
/*          Lock number (0 = OTL Lock, 1 = 1st block OTP Lock )              */
/*                                                                           */
/* RETURN VALUES                                                             */
/*      If the OTP block is locked, it returns TRUE.                         */
/*      otherwize it returns FALSE                                           */
/*                                                                           */
/* NOTES                                                                     */
/*      We can permanently lock OTP area only once                           */
/*                                                                           */
/*****************************************************************************/
BOOL
OndOTPStatus( UINT32 nLock )
{
	UINT32 nVol = 0;
	BOOL   nRet = FALSE;
	BOOL   nErr; 
	UCHAR  pSBuf = 0;
	UINT32 nResult = 0;
    BMLPacket	stPacket;	
	
	OTP_LOG_PRINT( (TEXT("[OTP: IN]  ++ OndOTPStatus\r\n")) );
	
	pSBuf = nLock;
	
    do {
    	/* OTP status check */
        stPacket.nVol       = nVol;
        stPacket.nCtrlCode  = PS_HAL_LLD_OTP_STATUS;
        stPacket.nVbn       = 0;            // Not used
        stPacket.nVsn       = 0;			// Not used
        stPacket.nNumOfScts = 0;
        stPacket.nOpFlag    = 0;
        stPacket.pMBuf      = 0;
        stPacket.pSBuf      = &pSBuf;
        stPacket.pstMEBArg	= 0;
    
        nErr = KernelIoControl(IOCTL_POCKETSTOREII_CMD,  /* IO Control Code  */
                        &stPacket,              /* Input buffer     */
                        sizeof(BMLPacket),
                        NULL,                   /* Output buffer    */
                        0, 
                        (LPDWORD)(&nResult));
        if (nErr != TRUE)
        {
            OTP_ERR_PRINT( (TEXT("[OTP:ERR]  KernelIoControl() failure. ERR Code=%x\r\n"), nResult));
            return FALSE;
        }
    } while(0);
    
    if( nResult == 1 )
    {
    	OTP_INF_PRINT( (TEXT("[OTP:INF]  OndOTPStatus(%d)=Locked\r\n"), nLock) );
    	nRet = TRUE;
    }
    else
    {
    	OTP_INF_PRINT( (TEXT("[OTP:INF]  OndOTPStatus(%d)=UnLocked\r\n"), nLock) );
    	nRet = FALSE;    	
    }
    
    OTP_LOG_PRINT( (TEXT("[OTP:OUT]  -- OndOTPStatus\r\n")) );

    return nRet;
}

⌨️ 快捷键说明

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