📄 sm_normal.c
字号:
{
if((*pbTempBuffer1) != (*pbTempBuffer2) )
{
MP_DEBUG1("i = %d ,write very fail",i);
}
pbTempBuffer1++;
pbTempBuffer2++;
}
mem_free(pbTempBuffer1);
#endif
return PASS;
}
static SWORD LogicalWrite(DWORD dwLogAddr, DWORD dwSectorCount, DWORD dwBufferAddress)
{
ST_MEDIA_MEAT *sMediaMeat;
DWORD dwNewPhyAddr, dwBlock, dwLogBlock, dwZone, dwPhyBlockAddr, dwPhyAddr, dwPage, dwTail, i;
SWORD swRetValue;
WORD *pwLog2PhyTable;
BYTE *pbTempBuffer, *pbBuffer, *pReAssignTable,*pbTempBuffer1;
if (!dwSectorCount)
{
MP_DEBUG1("-E- dwSectorCount %d", dwSectorCount);
return FAIL;
}
pbBuffer = (BYTE *) dwBufferAddress;
sMediaMeat = (ST_MEDIA_MEAT *) sInfo.sMediaMeat[sInfo.bCurMode];
pwLog2PhyTable = (WORD *) sInfo.wLog2PhyTable[sInfo.bCurMode];
pReAssignTable = (BYTE *) sInfo.bReAssignTable[sInfo.bCurMode];
dwPage = dwLogAddr % sMediaMeat->wMaxSector;
dwBlock = dwLogAddr / sMediaMeat->wMaxSector;
dwZone = dwBlock / sMediaMeat->wMaxLogBlock;
dwLogBlock = dwBlock % sMediaMeat->wMaxLogBlock;
dwPhyBlockAddr = pwLog2PhyTable[(dwZone * MAX_BLOCK) + dwLogBlock];
dwPhyBlockAddr = dwPhyBlockAddr + (dwZone * MAX_BLOCK); //get physical block address
dwPhyAddr = (dwPhyBlockAddr * sMediaMeat->wMaxSector) + dwPage; // get physical sector address;
dwTail = sMediaMeat->wMaxSector - dwPage - dwSectorCount;
if ((dwPage == 0) && (dwTail == 0))
{
pbTempBuffer = (BYTE *) dwBufferAddress;
}
else
{
// pbTempBuffer = bTempBuffer;
pbTempBuffer1 = (BYTE *)mem_malloc(0x40000);
pbTempBuffer = pbTempBuffer1;
if (dwPage)
{
if ((swRetValue = PhysicalRead((dwPhyAddr - dwPage), dwPage, (DWORD) pbTempBuffer)))
{
MP_DEBUG1("-E- PhysicalRead FAIL (swRetValue: %d)", swRetValue);
return swRetValue;
}
pbTempBuffer += (dwPage << MCARD_SECTOR_BIT_OFFSET);
}
for (i = 0; i < (dwSectorCount << MCARD_SECTOR_BIT_OFFSET); i++)
{
*pbTempBuffer++ = *pbBuffer++;
}
if (dwTail)
{
if ((swRetValue =PhysicalRead((dwPhyAddr + dwSectorCount), dwTail, (DWORD) pbTempBuffer)))
{
mem_free(pbTempBuffer1);
MP_DEBUG1("-E- PhysicalRead FAIL (swRetValue: %d)", swRetValue);
return swRetValue;
}
}
// pbTempBuffer = bTempBuffer;
pbTempBuffer = pbTempBuffer1;
}
dwNewPhyAddr = GetEmptyBlock(dwZone);
if (dwNewPhyAddr == 0xffff)
{
pReAssignTable[dwZone] = 0;
dwNewPhyAddr = GetEmptyBlock(dwZone);
if (dwNewPhyAddr == 0xffff)
{
mem_free(pbTempBuffer1);
MP_DEBUG("-E- no free block");
return FAIL;
}
}
dwNewPhyAddr += (dwZone * MAX_BLOCK);
if ((swRetValue = PhysicalErase((dwNewPhyAddr * sMediaMeat->wMaxSector))))
{
mem_free(pbTempBuffer1);
MP_DEBUG1("-E- SmPhysicalErase FAIL (swRetValue: %d)", swRetValue);
return swRetValue;
}
if ((swRetValue =PhysicalWrite((dwNewPhyAddr * sMediaMeat->wMaxSector), sMediaMeat->wMaxSector,(DWORD) pbTempBuffer, dwBlock)))
{
mem_free(pbTempBuffer1);
MP_DEBUG1("-E- SmPhysicalWrite FAIL (swRetValue: %d)", swRetValue);
return swRetValue;
}
if ((swRetValue = PhysicalErase((dwPhyBlockAddr * sMediaMeat->wMaxSector))))
{
mem_free(pbTempBuffer1);
MP_DEBUG1("-E- SmPhysicalErase FAIL (swRetValue: %d)", swRetValue);
return swRetValue;
}
pwLog2PhyTable[dwZone * MAX_BLOCK + dwLogBlock] = (WORD) (dwNewPhyAddr % MAX_BLOCK);
pwLog2PhyTable[dwZone * MAX_BLOCK + pReAssignTable[dwZone] + MAX_LOGBLOCK] =
(WORD) (dwPhyBlockAddr % MAX_BLOCK);
dwNewPhyAddr = pReAssignTable[dwZone];
dwNewPhyAddr++;
if (dwNewPhyAddr >= 24)
{
dwNewPhyAddr = 0;
}
pReAssignTable[dwZone] = dwNewPhyAddr;
mem_free(pbTempBuffer1);
return PASS;
}
static SWORD PhysicalWrite(DWORD dwPhyAddr, DWORD dwSectorCount, DWORD dwBufferAddress,
DWORD dwLogAddr)
{
register MCARD *sMcard;
SWORD swRetValue;
BYTE i;
BYTE *pbBuffer;
pbBuffer = (BYTE *) dwBufferAddress;
sMcard = (MCARD *) (MCARD_BASE);
sMcard->McSmC = 0x0;
if(sInfo.bCurMode == INITIAL_NAND){
if((MultiDieFlag & MultiDie) == MultiDie){
if(dwPhyAddr < (MaxPhyPage/2)){
GpioValueSetting(0,NAND1_CE);
// MP_DEBUG("write nand 1");
}else{
dwPhyAddr = dwPhyAddr - (MaxPhyPage/2);
GpioValueSetting(0,NAND2_CE);
MP_DEBUG("write nand 2");
}
}
else{
// MP_DEBUG("write nand 1");
GpioValueSetting(0,NAND1_CE);
}
}
else if(sInfo.bCurMode == INITIAL_XD){
GpioValueSetting(0,XD_CE);
}
while (dwSectorCount)
{
if (Polling_SM_Status())
return FAIL;
SetControl();
WaitReady();
//McardIODelay(0x5);
SetCommand(SEQ_DATA_IN_CMD);
SetAddress(dwPhyAddr, 0);
if ((swRetValue = WriteSector((DWORD) pbBuffer, MCARD_SECTOR_SIZE)))
{
MP_DEBUG1("-E- SmWriteSector FAIL (swRetValue: %d)", swRetValue);
return swRetValue;
}
BuildRedtData(dwLogAddr);
for (i = 0; i < 16; i++)
{
sMcard->McSmDat = bRedtData[i];
}
SetCommand(PAGE_PROG_CMD);
pbBuffer += MCARD_SECTOR_SIZE;
dwSectorCount--;
dwPhyAddr++;
if ((swRetValue = WaitReady()))
{
MP_DEBUG1("-E- WaitReady FAIL (swRetValue: %d)", swRetValue);
return swRetValue;
}
SetCommand(READ_STATUS);
if ((swRetValue = ReadStatus()))
{
MP_DEBUG1("-E- write SmReadStatus FAIL (swRetValue: %d)", swRetValue);
return swRetValue;
}
sMcard->McSmC = 0x0;
}
GpioValueSetting(1,NAND1_CE);
GpioValueSetting(1,NAND2_CE);
GpioValueSetting(1,XD_CE);
return PASS;
}
static SWORD WriteSector(DWORD dwBufferAddress, WORD wSize)
{
register CHANNEL *sChannel;
register MCARD *sMcard;
DWORD dwTimeOutCount;
#if ECC4S_ENABLE
if ((MLC == TRUE) && (sInfo.bCurMode == INITIAL_NAND))
ECC4S_Encode();
#endif
if (dwBufferAddress & 0x3)
{
MP_DEBUG("-E- target buffer must align to 4 bytes boundary !");
return FAIL;
}
sChannel = (CHANNEL *) (DMA_MC_BASE);
sMcard = (MCARD *) (MCARD_BASE);
sMcard->McSmC &=~ ECC_ENABLE;
sMcard->McSmC |= ECC_ENABLE;
#ifdef SM_TIMEOUT_HANDLE
DmaIntEna(IM_MCRDDM);
blTimeOutFlag = 0;
AddTimerProc(2000, TimeoutHandle);
sChannel->Control = 0x0;
sChannel->StartA = dwBufferAddress;
sChannel->EndA = dwBufferAddress + wSize - 1;
sMcard->McDmarl = MCARD_DMA_LIMIT_ENABLE + (wSize >> 2);
sMcard->McardC = ((sMcard->McardC & 0xffffffef) | MCARD_DMA_DIR_MC | MCARD_FIFO_ENABLE);
sChannel->Control = (MCARD_DMA_ENABLE | MCARD_INT_DBFEND_ENABLE);
TaskSleep();
if (blTimeOutFlag == 1)
{
MP_DEBUG1("-E- DMA end FAIL (status: %x)", sChannel->Control);
return DMA_TIMEOUT;
}
RemoveTimerProc(TimeoutHandle);
return PASS;
#else
sChannel->Control = 0x0;
sChannel->StartA = dwBufferAddress;
sChannel->EndA = dwBufferAddress + wSize - 1;
sMcard->McDmarl = MCARD_DMA_LIMIT_ENABLE + (wSize >> 2);
sMcard->McardC = ((sMcard->McardC & 0xffffffef) | MCARD_DMA_DIR_MC | MCARD_FIFO_ENABLE);
sChannel->Control = MCARD_DMA_ENABLE;
dwTimeOutCount = (g_bAniFlag & ANI_VIDEO)? (TIMEOUT_COUNT>>3):TIMEOUT_COUNT;
while ((sChannel->Control & MCARD_DMA_ENABLE))
{
if (Polling_SM_Status())
return FAIL;
if (dwTimeOutCount == 0)
{
MP_DEBUG1("-E- DMA end FAIL (status: %x)", sChannel->Control);
return DMA_TIMEOUT;
}
dwTimeOutCount--;
TASK_YIELD();
}
dwTimeOutCount = (g_bAniFlag & ANI_VIDEO)? (TIMEOUT_COUNT>>3):TIMEOUT_COUNT;
while (!(sMcard->McSmIc & (IC_SFTCE | IC_ECB)))
{
if (Polling_SM_Status())
return FAIL;
if (dwTimeOutCount == 0)
{
MP_DEBUG1("-E- FIFO transaction count FAIL (status: %x)", sMcard->McSmIc);
return IC_SFTCE_TIMEOUT;
}
dwTimeOutCount--;
TASK_YIELD();
}
sMcard->McSmIc &= ~(IC_SFTCE | IC_ECB);
return PASS;
#endif
}
static SWORD PhysicalErase(DWORD dwPhyAddr)
{
register MCARD *sMcard;
SWORD swRetValue;
if(sInfo.bCurMode == INITIAL_NAND){
if((MultiDieFlag & MultiDie) == MultiDie){
if(dwPhyAddr < (MaxPhyPage/2)){
GpioValueSetting(0,NAND1_CE);
MP_DEBUG("erase nand 1");
}else{
dwPhyAddr = dwPhyAddr - (MaxPhyPage/2);
GpioValueSetting(0,NAND2_CE);
MP_DEBUG("erase nand 2");
}
}
else{
GpioValueSetting(0,NAND1_CE);
}
}
else if(sInfo.bCurMode == INITIAL_XD){
GpioValueSetting(0,XD_CE);
}
sMcard = (MCARD *) (MCARD_BASE);
SetControl();
WaitReady();
//McardIODelay(5);
SetCommand(BLOCK_ERASE_CMD_1CYC);
SetAddress(dwPhyAddr, 1);
SetCommand(BLOCK_ERASE_CMD_2CYC);
if ((swRetValue = WaitReady()))
{
MP_DEBUG1("-E- WaitReady FAIL (swRetValue: %d)", swRetValue);
return swRetValue;
}
SetCommand(READ_STATUS);
if ((swRetValue = ReadStatus()))
{
MP_DEBUG1("-E- erase SmReadStatus FAIL (swRetValue: %d)", swRetValue);
return swRetValue;
}
if ((swRetValue = WaitReady()))
{
MP_DEBUG1("-E- WaitReady FAIL (swRetValue: %d)", swRetValue);
return swRetValue;
}
sMcard->McSmC = 0;
GpioValueSetting(1,NAND1_CE);
GpioValueSetting(1,NAND2_CE);
GpioValueSetting(1,XD_CE);
return PASS;
}
static SWORD ReadStatus(void)
{
register MCARD *sMcard;
DWORD dwTimeOutCount;
BYTE bStatus;
sMcard = (MCARD *) (MCARD_BASE);
dwTimeOutCount = (g_bAniFlag & ANI_VIDEO)? (TIMEOUT_COUNT>>3):TIMEOUT_COUNT;
bStatus = sMcard->McSmDat;
while (!(bStatus & STATUS_READY))
{
if (!dwTimeOutCount)
{
MP_DEBUG1("-E- Read Status TimeOut (status: %x)", bStatus);
return FAIL;
}
bStatus = sMcard->McSmDat;
dwTimeOutCount--;
TASK_YIELD();
}
if (bStatus & STATUS_FAIL)
{
MP_DEBUG1("-E- Read Status FAIL (status: %x)", bStatus);
return FAIL;
}
return PASS;
}
static void BuildRedtData(DWORD dwLogAddr)
{
register MCARD *sMcard;
DWORD dwTempAddr, dwParity;
ST_MEDIA_MEAT *sMediaMeat;
sMcard = (MCARD *) (MCARD_BASE);
sMediaMeat = (ST_MEDIA_MEAT *) sInfo.sMediaMeat[sInfo.bCurMode];
dwTempAddr = dwLogAddr % sMediaMeat->wMaxLogBlock;
dwParity = CheckWordParity((WORD) (dwTempAddr) + 0x1000);
dwTempAddr = ((dwTempAddr << 1) | 0x1000) + dwParity;
#if ECC4S_ENABLE
if ((MLC == TRUE) && (sInfo.bCurMode == INITIAL_NAND))
{
ECC4S_Encode_Check();
bRedtData[0] = (BYTE) (dwTempAddr >> 8);
bRedtData[1] = (BYTE) dwTempAddr;
bRedtData[2] = bRedtData[0];
bRedtData[3] = bRedtData[1];
bRedtData[4] = 0xff;
bRedtData[5] = 0xff;
bRedtData[6] = (BYTE) ((sMcard->McEcc4SCrc74>>24) & 0xff);
bRedtData[7] = (BYTE) ((sMcard->McEcc4SCrc74>>16) & 0xff);
bRedtData[8] = (BYTE) ((sMcard->McEcc4SCrc74>>8) & 0xff);
bRedtData[9] = (BYTE) (sMcard->McEcc4SCrc74 & 0xff);
bRedtData[10] = (BYTE) ((sMcard->McEcc4SCrc41>>24) & 0xff);
bRedtData[11] =(BYTE) ((sMcard->McEcc4SCrc41>>16) & 0xff);
bRedtData[12] = (BYTE) ((sMcard->McEcc4SCrc41>>8) & 0xff);
bRedtData[13] = (BYTE) (sMcard->McEcc4SCrc41 & 0xff);
bRedtData[14] = (BYTE) ((sMcard->McEcc4SCrc10>>24) & 0xff);
bRedtData[15] = (BYTE) ((sMcard->McEcc4SCrc10>>16) & 0xff) ;
}
else
#endif
{
bRedtData[0] = 0xff;
bRedtData[1] = 0xff;
bRedtData[2] = 0xff;
bRedtData[3] = 0xff;
bRedtData[4] = 0xff;
bRedtData[5] = 0xff;
bRedtData[6] = (BYTE) (dwTempAddr >> 8);
bRedtData[7] = (BYTE) dwTempAddr;
bRedtData[8] = (BYTE) (sMcard->McSmEcc2 & 0xff);
bRedtData[9] = (BYTE) ((sMcard->McSmEcc2 >> 8) & 0xff);
bRedtData[10] = (BYTE) ((sMcard->McSmEcc2 >> 16) & 0xff);
bRedtData[11] = bRedtData[6];
bRedtData[12] = bRedtData[7];
bRedtData[13] = (BYTE) (sMcard->McSmEcc1 & 0xff);
bRedtData[14] = (BYTE) ((sMcard->McSmEcc1 >> 8) & 0xff);
bRedtData[15] = (BYTE) ((sMcard->McSmEcc1 >> 16) & 0xff);
}
}
static SWORD CISWrite(DWORD dwBufferAddress)
{
register MCARD *sMcard;
SWORD swRetValue;
BYTE i;
BYTE *pbBuffer;
pbBuffer = (BYTE *) dwBufferAddress;
sMcard = (MCARD *) (MCARD_BASE);
if(sInfo.bCurMode == INITIAL_NAND){
GpioValueSetting(0,NAND1_CE);
}
SetControl();
WaitReady();
SetCommand(SEQ_DATA_IN_CMD);
SetAddress(0, 0);
if ((swRetValue = WriteSector((DWORD) pbBuffer, MCARD_SECTOR_SIZE)))
{
MP_DEBUG1("-E- DMA Write FAIL (swRetValue: %d)", swRetValue);
return swRetValue;
}
#if ECC4S_ENABLE
if ((MLC == TRUE) && (sInfo.bCurMode == INITIAL_NAND))
{
bRedtData[0] = bRedtData[1] = bRedtData[2] = 0xff;
bRedtData[3] = bRedtData[4] = bRedtData[5] = 0xff;
bRedtData[6] = (BYTE) ((sMcard->McEcc4SCrc74>>24) & 0xff);
bRedtData[7] = (BYTE) ((sMcard->McEcc4SCrc74>>16) & 0xff);
bRedtData[8] = (BYTE) ((sMcard->McEcc4SCrc74>>8) & 0xff);
bRedtData[9] = (BYTE) (sMcard->McEcc4SCrc74 & 0xff);
bRedtData[10] = (BYTE) ((sMcard->McEcc4SCrc41>>24) & 0xff);
bRedtData[11] =(BYTE) ((sMcard->McEcc4SCrc41>>16) & 0xff);
bRedtData[12] = (BYTE) ((sMcard->McEcc4SCrc41>>8) & 0xff);
bRedtData[13] = (BYTE) (sMcard->McEcc4SCrc41 & 0xff);
bRedtData[14] = (BYTE) ((sMcard->McEcc4SCrc10>>24) & 0xff);
bRedtData[15] = (BYTE) ((sMcard->McEcc4SCrc10>>16) & 0xff);
}
else
#endif
{
bRedtData[0] = bRedtData[1] = bRedtData[2] = 0xff;
bRedtData[3] = bRedtData[4] = bRedtData[5] = 0xff;
bRedtData[6] = bRedtData[7] = 0x00;
bRedtDa
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -