📄 otp.c
字号:
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 + -