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

📄 sm_normal.c

📁 常见卡(SD,NAND,XD,MS,ATA,CF)完整DRIVER
💻 C
📖 第 1 页 / 共 5 页
字号:
	{
		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 + -