📄 adv_ctl.c
字号:
#endif //END ADV_ECC
(unsigned short*)pBuffer = smtProlBuff.bFlatBuff; // Switch the address of Prolix buffer;
}
ADV_R_CLE = SMT_BYTE1; // CLE is set up in high
*ADV_R_DATAIO = SMT_C_RNDOUT1; // Random Read command 05h
ADV_R_CLE = SMT_BYTE0; // CLE is set up in low
ADV_R_ALE = SMT_BYTE1; // ALE is set up in high
*ADV_R_DATAIO = (unsigned short)((ulColumn & 0xFF) | ((ulPage % 4) << 3)); // column address
*ADV_R_DATAIO = (unsigned short)(((ulColumn >> 8) & 0xFF) | 0x04);
ADV_R_ALE = SMT_BYTE0; // ALE is set up in low
ADV_R_CLE = SMT_BYTE1; // CLE is set up in high
*ADV_R_DATAIO = SMT_C_RNDOUT2; // Random Read command e0h
ADV_R_CLE = SMT_BYTE0; // CLE is set up in low
for(iLoop = 0; iLoop < SMT_S_PROLIX; iLoop+=2)
{
*(unsigned short*)pBuffer = *ADV_R_DATAIO; // Read data area
pBuffer +=2;
}
iRetVal = advReadyCheck(SMT_M_US2CNT(1)); // Ready check (1uS) routine is call
}
return(iRetVal);
}
/************************************************************************
* advPageProgram
* Type : int
* Ret val : Error Code
* SMT_E_SUCCESS ( 0) ... Successful
* SMT_E_FAILURE (-1) ... Failure
* Argument : unsigned long ulColumn ... Column address
* unsigned long ulPage ... Page address
* const char *pBuffer ... Read data buffer
* unsigned char bVerify ... Verify Enable/Disable flag
* Function : Page program function
************************************************************************/
int advPageProgram(unsigned long ulColumn, unsigned long ulPage, const char *pBuffer, unsigned char bVerify)
{
int iRetVal; // Return value
int iLoop; // Loop Counter
unsigned long uTimeLoop; // Time Loop Counter
union SMT_STATUS uStatus; // Status code
unsigned long ulCvtPage;
unsigned short *pWrtPnt;
if(adv_EraseFlg)
{
advEraseChk();
}
ulCvtPage = ulPage/4;
if((unsigned long)pBuffer & 0x01) // check if pBuffer Address A0
{
memcpy(ulTranBuf, pBuffer , SMT_S_DATA);
pWrtPnt = ulTranBuf;
}
else
pWrtPnt = (unsigned short *)pBuffer;
#ifdef ADV_HDMA
// HDMA Setting
*(volatile unsigned long*)0x48240 = 0x0; // clear DmaReg
*(volatile unsigned short*)0x48240 = SMT_S_DATA/2; // transfer count
*(volatile unsigned char*)0x48243 = 0x80; // dual transfer mode
*(volatile unsigned long*)0x48244 = (unsigned long)pWrtPnt; // source address
*(volatile unsigned char*)0x48247 |=0x70; // 16bit transfer, src inc
*(volatile unsigned long*)0x48248 = (unsigned long)ADV_R_DATAIO; // dest address
*(volatile unsigned char*)0x4824b &=0x0f; // successive transfer mode, dest fix
*(volatile unsigned char*)0x4824b |=0x40;
#endif
ADV_R_WP = SMT_BYTE1; // WP is set up in high
ADV_R_CLE = SMT_BYTE1; // CLE is set up in high
*ADV_R_DATAIO = SMT_C_SDATINP; // Serial data input command 80h
ADV_R_CLE = SMT_BYTE0; // CLE is set up in low
ADV_R_ALE = SMT_BYTE1; // ALE is set up in high
*ADV_R_DATAIO = (unsigned short)(ulColumn & 0xFF); // column address
*ADV_R_DATAIO = (unsigned short)((ulColumn >> 8) & 0xFF |(ulPage % 4));
*ADV_R_DATAIO = (unsigned short)(ulCvtPage & 0xFF); // page address
*ADV_R_DATAIO = (unsigned short)((ulCvtPage >> 8) & 0xFF); //
ADV_R_ALE = SMT_BYTE0; // ALE is set up in low
#ifdef ADV_ECC
SMT_ECC_RST; // Reset ECC
SMT_ECC_EN; // Enable ECC
#endif
#ifdef ADV_HDMA
SMT_DMA_ENABLE;
SMT_DMA_TRG;
for(uTimeLoop = 0; uTimeLoop<SMT_M_US2CNT(10); uTimeLoop++)
{
if(!SMT_DMA_FLAG)
break;
}
#else
// pWrtPnt = (unsigned short *)pBuffer;
for(iLoop = 0; iLoop < SMT_S_DATA; iLoop+=2) // Write data area
{
*ADV_R_DATAIO = *pWrtPnt++;
}
#endif
#ifdef ADV_ECC
SMT_ECC_DIS;
if(SMT_ECC_RDY)
smtProlBuff.stDatBuff.bEcc1[0] = *ECC_A0_LPL_ADDR; //LP0
smtProlBuff.stDatBuff.bEcc1[1] = *ECC_A0_LPH_ADDR; //LP1
smtProlBuff.stDatBuff.bEcc1[2] = *ECC_A0_CP_ADDR; //CP
smtProlBuff.stDatBuff.bEcc2[0] = *ECC_A1_LPL_ADDR;
smtProlBuff.stDatBuff.bEcc2[1] = *ECC_A1_LPH_ADDR;
smtProlBuff.stDatBuff.bEcc2[2] = *ECC_A1_CP_ADDR;
#endif
ADV_R_CLE = SMT_BYTE1; // CLE is set up in high
*ADV_R_DATAIO = SMT_C_RNDIN; // Serial data input command 85h
ADV_R_CLE = SMT_BYTE0; // CLE is set up in low
ADV_R_ALE = SMT_BYTE1; // ALE is set up in high
*ADV_R_DATAIO = (unsigned short)((ulColumn & 0xFF) | ((ulPage % 4) << 3)); // column address
*ADV_R_DATAIO = (unsigned short)(((ulColumn >> 8) & 0xFF) | 0x04);
ADV_R_ALE = SMT_BYTE0; // ALE is set up in low
pWrtPnt = (unsigned short *)smtProlBuff.bFlatBuff;
for(iLoop = 0; iLoop < SMT_S_PROLIX; iLoop+=2) // Write data area
{
*ADV_R_DATAIO = *pWrtPnt++;
}
ADV_R_CLE = SMT_BYTE1; // CLE is set up in high
*ADV_R_DATAIO = SMT_C_PROGRAM; // Page program command 10h
ADV_R_CLE = SMT_BYTE0; // CLE is set up in low
iRetVal = advReadyCheck(SMT_M_MS2CNT(20)); // Ready check (20mS) routine is call
if(iRetVal == SMT_E_SUCCESS)
{
ADV_R_WP = SMT_BYTE0; // WP is set up in low
iRetVal = advStatusRead(&uStatus.bByte); // Status read routine is call
if(iRetVal == SMT_E_SUCCESS)
{
if(((uStatus.stBit.bRB)&&(uStatus.stBit.bPF)) // Status = Ready? and Erase = Fail?
||(!uStatus.stBit.bRB)) // or Status = Busy?
{
smtErrInf.iSmtErr = SMT_E_PAGPROG; // ERROR : Page program error !!
iRetVal = SMT_E_FAILURE;
}
}
}
if(bVerify)
{
iRetVal = smtVerifyCheck(ulPage, pBuffer);
}
return(iRetVal);
}
/************************************************************************
* advProlixProgram
* Type : int
* Ret val : Error Code
* SMT_E_SUCCESS ( 0) ... Successful
* SMT_E_FAILURE (-1) ... Failure
* Argument : unsigned long ulColumn ... Column address
* unsigned long ulPage ... Page address
* const char *pBuffer ... Read data buffer (16 Bytes)
* Function : Prolix program function
************************************************************************/
int advProlixProgram(unsigned long ulColumn, unsigned long ulPage, const char *pBuffer)
{
int iRetVal; // Return value
int iLoop; // Loop Counter
union SMT_STATUS uStatus; // Status code
unsigned long ulCvtPage;
unsigned short *pWrtPnt;
if(adv_EraseFlg)
{
advEraseChk();
}
ulCvtPage = ulPage/4;
ADV_R_WP = SMT_BYTE1; // WP is set up in high
ADV_R_CLE = SMT_BYTE1; // CLE is set up in high
*ADV_R_DATAIO = SMT_C_SDATINP; // Serial data input command
ADV_R_CLE = SMT_BYTE0; // CLE is set up in low
ADV_R_ALE = SMT_BYTE1; // ALE is set up in high
*ADV_R_DATAIO = (unsigned short)(ulColumn & 0xFF | ((ulPage %4)<<3)); // column addrss
*ADV_R_DATAIO = (unsigned short)(((ulColumn >> 8) & 0xFF) | 0x04);
*ADV_R_DATAIO = (unsigned short)(ulCvtPage & 0xFF); // page address
*ADV_R_DATAIO = (unsigned short)((ulCvtPage >> 8) & 0xFF);
ADV_R_ALE = SMT_BYTE0; // ALE is set up in low
pWrtPnt = (unsigned short *)pBuffer;
for(iLoop = 0; iLoop < SMT_S_PROLIX; iLoop+=2)
{
*ADV_R_DATAIO = *pWrtPnt++; // Write prolix area
}
ADV_R_CLE = SMT_BYTE1; // CLE is set up in high
*SMT_R_DATAIO = SMT_C_PROGRAM; // Page program command
ADV_R_CLE = SMT_BYTE0; // CLE is set up in low
iRetVal = advReadyCheck(SMT_M_MS2CNT(20)); // Ready check (20mS) routine is call
if(iRetVal == SMT_E_SUCCESS)
{
ADV_R_WP = SMT_BYTE0; // WP is set up in low
iRetVal = advStatusRead(&uStatus.bByte); // Status read routine is call
if(iRetVal == SMT_E_SUCCESS)
{
if(((uStatus.stBit.bRB)&&(uStatus.stBit.bPF)) // Status = Ready? and Erase = Fail?
||(!uStatus.stBit.bRB)) // or Status = Busy?
{
smtErrInf.iSmtErr = SMT_E_PAGPROG; // ERROR : Page program error !!
iRetVal = SMT_E_FAILURE;
}
}
}
return(iRetVal);
}
/************************************************************************
* advReadyCheck
* Type : int
* Ret val : Error Code
* SMT_E_SUCCESS ( 0) ... Successful
* SMT_E_FAILURE (-1) ... Failure
* Argument : unsigned long ulTime ... Wait time
* Function : Ready statuc check
************************************************************************/
int advReadyCheck(unsigned long ulTime)
{
int iRetVal; // Return Value
unsigned long ulLoop; // Loop Counter
for(ulLoop = 0; ulLoop < ulTime; ulLoop++)
{
if(ADV_R_RB) // Ready?
{
break;
}
}
if(ulLoop < ulTime)
{
iRetVal = SMT_E_SUCCESS;
smtErrInf.iSmtErr = SMT_E_SUCCESS;
}
else
{
iRetVal = SMT_E_FAILURE;
smtErrInf.iSmtErr = SMT_E_TIMEOUT;
}
return(iRetVal);
}
/************************************************************************
* advEraseChk
* Type : int
* Ret val : Error Code
* SMT_E_SUCCESS ( 0) ... Successful
* SMT_E_FAILURE (-1) ... Failure
* Argument : none
* Function : Block Erase result check
************************************************************************/
int advEraseChk(void)
{
int iRetVal;
union SMT_STATUS uStatus; // Status code
if(!adv_EraseFlg)
{
return(SMT_E_SUCCESS);
}
adv_EraseFlg = 0; // Erasing flag clear
iRetVal = advReadyCheck(SMT_M_MS2CNT(400)); // Ready check (400mS) routine is call
if(iRetVal == SMT_E_SUCCESS)
{
ADV_R_WP = SMT_BYTE0; // WP is set up in low
iRetVal = advStatusRead(&uStatus.bByte); // Status read routine is call
if(iRetVal == SMT_E_SUCCESS)
{
if(((uStatus.stBit.bRB)&&(uStatus.stBit.bPF)) // Status = Ready? and Erase = Fail?
||(!uStatus.stBit.bRB)) // or Status = Busy?
{
smtErrInf.iSmtErr = SMT_E_BKERASE; // ERROR : Block erase error !!
iRetVal = SMT_E_FAILURE;
}
}
}
return(iRetVal);
}
/***** End of file *****/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -