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

📄 ms.c

📁 常见卡(SD,NAND,XD,MS,ATA,CF)完整DRIVER
💻 C
📖 第 1 页 / 共 5 页
字号:
		psProParamReg->bDataCount1 = 0;
		psProParamReg->bDataCount0 = 0;
	}
	else
	{
		psProParamReg->bDataCount1 = (BYTE) (wSectorCount >> 8);
		psProParamReg->bDataCount0 = (BYTE) (wSectorCount);
	}
	if (dwLogAddr == 0)
	{
		psProParamReg->bDataAddr3 = 0;
		psProParamReg->bDataAddr2 = 0;
		psProParamReg->bDataAddr1 = 0;
		psProParamReg->bDataAddr0 = 0;
	}
	else
	{
		psProParamReg->bDataAddr3 = (BYTE) (dwLogAddr >> 24);
		psProParamReg->bDataAddr2 = (BYTE) (dwLogAddr >> 16);
		psProParamReg->bDataAddr1 = (BYTE) (dwLogAddr >> 8);
		psProParamReg->bDataAddr0 = (BYTE) (dwLogAddr);
	}
	psProParamReg->bTpcParameter = bTpcParam;
	psProParamReg->bCmdParameter = bCmdParam;
}
#endif
/*
// Static function prototype
*/
static void CommandProcess(void *McardDev);
static void SetPowerSwitch(BOOL blSwitch);
static void Select(void);
//static void DeSelelct(oid);
static SWORD ProLogicalWrite(DWORD dwLogAddr, DWORD dwSectorCount, DWORD dwBufferAddress);
static SWORD ProLogicalRead(DWORD dwLogAddr, DWORD dwSectorCount, DWORD dwBufferAddress);
static SWORD ProReadAttribute(DWORD dwBufferAddress);
static SWORD ProWaitCpuStartup(void);
static SWORD WaitDMAEnd(void);
static DWORD WaitCmdEnd(void);
static DWORD WaitRdy(void);
static SWORD GetIntValue(BYTE * bIntValue);
static SWORD WaitINT(void);
static SWORD Wait_INT_Signal_BREQ(DWORD *dwMcMsStatusTemp);
static SWORD Wait_INT_Signal_CED(DWORD *dwMcMsStatusTemp);
static SWORD Wait_INT_Signal(DWORD *dwMcMsStatusTemp);
static SWORD WaitTime1INT(void);
static SWORD Wait_For_INT_Pulse(DWORD *dwMcMsStatusTemp);

static SWORD WriteTpcBs(BYTE bTpc, BYTE * pbBuffer, BYTE bLen);
static SWORD ReadTpcBs(BYTE bTpc, BYTE * pbBuffer, BYTE bLen);
static SWORD ReadTpcBsPage(void);
static SWORD WriteTpcBsPage(void);
static SWORD InitLog2PhyTable(void);
static SWORD CheckDisableBlock(DWORD dwPhyAddr, BYTE * pbDisableAddr);
static WORD GetEmptyBlock(DWORD dwSegNum);
static WORD GetSameBlockPages(DWORD dwLogAddr, DWORD dwSectorCount);
static SWORD IdentifyType(void);
static SWORD ReadExtraData(DWORD dwBlockAddr, DWORD dwPageNumber, DWORD dwBufferAddress);
static SWORD PhysicalRead(DWORD dwBlockAddr, DWORD dwStartPage, DWORD dwSectorCount,
						  DWORD dwBufferAddress);
static SWORD LogicalRead(DWORD dwLogAddr, DWORD dwSectorCount, DWORD dwBufferAddress);
static SWORD FlatRead(DWORD dwBufferAddress, DWORD dwSectorCount, DWORD dwLogAddr);
static SWORD OverWriteExtraData(DWORD dwBlockAddr, DWORD dwPageNumber, BYTE bOverWriteFlag);
static SWORD WriteExtraData(DWORD dwBlockAddr, DWORD dwPageNumber, DWORD dwLogAddr);
static SWORD PhysicalErase(DWORD dwBlockAddr);
static SWORD PhysicalWrite(DWORD dwPhyAddr, DWORD dwStartPage, DWORD dwSectorCount,
						   DWORD dwBufferAddress, DWORD dwLogAddr);
static SWORD LogicalWrite(DWORD dwLogAddr, DWORD dwSectorCount, DWORD dwBufferAddress);
static SWORD FlatWrite(DWORD dwBufferAddress, DWORD dwSectorCount, DWORD dwLogAddr);
static SWORD GetAttributeInfo(void);
static SWORD BootProtectProcess(BYTE bBlockMaxCount);
static SWORD Identify(void);
static SWORD Format(void);
static SWORD ChangeBusWidth(BYTE bBusWidth);

/*
// Definition of internal functions
*/
void MsInitForClk(void)
{
	switch (g_dwCpuClk)
	{
	case CLOCK_96M_PLL1CFG:
		{
			bMS_CLOCK = 0x4;
		}
		break;
	case CLOCK_108M_PLL1CFG:
	case CLOCK_108M_PLL2CFG:
		{
			bMS_CLOCK = 0x5;
		}
		break;
	default:					// 72MHz
		{
			bMS_CLOCK = 0x3;
		}
		break;
	}
}

void MsInit(ST_MCARD_DEV * sDev)
{
	sDev->pbDescriptor = bDescriptor;
	sDev->dwLunNum = MS_LUN_NUM;
	sDev->wMcardType = MS;
	sDev->Flag.Installed = 1;
	sDev->CommandProcess = CommandProcess;

}

static inline BOOL Polling_MS_Status(void)
{
	return (!Ui_CheckMsPlugIn());
}

/*
// Definition of local functions 
*/
static void CommandProcess(void *pMcardDev)
{
	ST_MCARD_MAIL *sMcardRMail;
	register UART *sUart;
	GPIO *sGpio;
	DWORD dwTemp;
	register DWORD i;
	register ST_MCARD_DEV *pDev = ((ST_MCARD_DEV *) pMcardDev);
	sGpio = (GPIO *) (GPIO_BASE);

	sMcardRMail = pDev->sMcardRMail;
	McardSetClock(bMS_CLOCK);
	Select();
	switch (sMcardRMail->wCmd)
	{
	case INIT_CARD_CMD:
#if ((CHIP_VER & 0xffff0000) != CHIP_VER_600)

		sGpio->Mgpint &= ~0x00001000;
		sGpio->Fgpcfg[3] &= 0xfdfffdff;
		sGpio->Fgpdat[3] &= 0xfdffffff;
//		Select();//rick 7/31
		pDev->Flag.Detected = Ui_CheckMsPlugIn();		
		if (pDev->Flag.Detected == 1)
		{
			for (i = 0; i < 10000; i++)
			{
				if (!(sGpio->Fgpdat[3] & 0x00000200))
				{
					pDev->Flag.Detected = 1;
					break;
				}
				McardIODelay(0x5);
			}
		}
		else
		{
			if (!(sGpio->Fgpdat[3] & 0x00000200))
				pDev->Flag.Detected = 1;
			else
				pDev->Flag.Detected = 0;
		}
		dwTemp = sGpio->Fgpdat[3];
		sGpio->Fgpcfg[3] |= 0x00000200;
		sGpio->Mgpint |= 0x00001000;

#else
//		Select();//rick 7/31
		pDev->Flag.Detected = Ui_CheckMsPlugIn();
#endif
		if (pDev->Flag.Detected)
			//if(!(dwTemp & 0x00000200)) // MS exist
		{
			//card in
			//McardIODelay(0x500);                
			if(sInfo.bBusWidth == BUS_WIDTH_4)
			{
				MP_DEBUG("switch bus from 4 bit to 1 bit");
				ChangeBusWidth(BUS_WIDTH_1);
			}
			sInfo.bBusWidth = BUS_WIDTH_1;
			pDev->Flag.Detected = 1;
			if ((pDev->swStatus = Identify()))
			{
				//pDev->Flag.Detected = 0; 
				pDev->Flag.Present = 0;
				pDev->dwCapacity = 0;
				pDev->wSectorSize = 0;
				McardSetCurLun(pDev->dwLunNum, NULL_DEVICE);
			}
			else
			{
				McardSetClock(1);			
				pDev->wRenewCounter++;
				pDev->Flag.ReadOnly = sInfo.bWriteProtected;
				pDev->Flag.Present = 1;
				pDev->dwCapacity = sInfo.dwCapacity;
				pDev->wSectorSize = MCARD_SECTOR_SIZE;
				McardSetCurLun(pDev->dwLunNum, pDev->wMcardType);
				//EventSet(UI_EVENT, EVENT_CARD_INIT);
			}
		}
		else
		{
			//card out
		#if ((CHIP_VER & 0xffff0000) != CHIP_VER_600)			
			SetPowerSwitch(0);
		#endif
			pDev->Flag.Detected = 0;
			pDev->Flag.Present = 0;
			pDev->Flag.ReadOnly = 0;
			pDev->Flag.PipeEnable = 0;
			pDev->swStatus = 0;
			pDev->dwCapacity = 0;
			pDev->wSectorSize = 0;
			McardSetCurLun(pDev->dwLunNum, NULL_DEVICE);
			//EventSet(UI_EVENT, EVENT_CARD_INIT);
		}
		break;
	case REMOVE_CARD_CMD:		//Athena 03.11.2006 seperate card in & out
		//card out
		pDev->Flag.Detected = 0;
		pDev->Flag.Present = 0;
		pDev->Flag.ReadOnly = 0;
		pDev->Flag.PipeEnable = 0;
		pDev->swStatus = 0;
		pDev->dwCapacity = 0;
		pDev->wSectorSize = 0;
		McardSetCurLun(pDev->dwLunNum, NULL_DEVICE);
		break;
	case READ_PAGE_CMD:
		pDev->swStatus =
			FlatRead(sMcardRMail->dwBuffer, sMcardRMail->dwBlockCount, sMcardRMail->dwBlockAddr);
		break;

	case WRITE_PAGE_CMD:
		pDev->swStatus =
			FlatWrite(sMcardRMail->dwBuffer, sMcardRMail->dwBlockCount, sMcardRMail->dwBlockAddr);
		break;

	case FORMAT_CMD:
		pDev->swStatus = Format();
		break;

	default:
		MP_DEBUG("-E- INVALID CMD");
		break;
	}
//	DeSelect();
}


#ifdef ABEL_MS_TEST
static void SetPowerSwitch(BOOL blSwitch)
{
    MsSetPowerSwitch(blSwitch);
}
#else
static void SetPowerSwitch(BOOL blSwitch)
{
	//#define CHIP_A_VERSION    

	//bowen add flag for gpdat1 ???????????????
	static BOOL blFlag = FALSE;


	register GPIO *sGpio;

	sGpio = (GPIO *) (GPIO_BASE);

	if (blSwitch == 1)
	{
		if (blFlag == TRUE)
		{
			return;
		}

		blFlag = TRUE;

		//power on
#ifdef CHIP_A_VERSION
		sGpio->Mgpcfg0 = GPIO_DEFINE_2;
		sGpio->Mgpdat0 = 0x20000000;
#else
#if (defined(WINBOARD8))
		sGpio->Gpdat1 = 0x20020002;
#elif (defined(WINBOARD35))
		sGpio->Gpdat1 = 0x20060006;
#else
		sGpio->Gpdat1 = 0x20000000;
#ifdef SPBOARD
		sGpio->Gpdat1 &= ~0x00000002;	//Mason 12/14 for SHARP 8"
#else
		sGpio->Gpdat1 &= ~0x00002000;	//Lighter changed 0102
#endif
#endif
#endif
	}
	else
	{

		blFlag = FALSE;
		//power off
#ifdef CHIP_A_VERSION
		sGpio->Mgpcfg0 &= ~GPIO_DEFINE_2;
		sGpio->Mgpdat0 &= ~0x20000000;
#else
#if (defined(WINBOARD8)||defined(WINBOARD35))
		sGpio->Gpdat1 &= ~0x20000000;
#else
#ifdef SPBOARD
		sGpio->Gpdat1 &= ~0x20000002;	//Mason 12/14
#else
		sGpio->Gpdat1 |= 0x20002000;	//Lighter changed 0102
#endif

#endif
#endif
	}
}

#endif
static void DeSelect(void)
{
/*
	register GPIO *sGpio;
	sGpio = (GPIO *) (GPIO_BASE);
	sGpio->Fgpcfg[1] &= ~0xe020e020; //
	sGpio->Fgpdat[1] |= 0xe0200000;
	sGpio->Fgpdat[1] &= ~0x0000e020;
	sGpio->Fgpcfg[2] &= ~0x00010001;
	sGpio->Fgpdat[2] |= 0x00010001;			
	sGpio->Agpcfg &= ~0x00080008; // set agpcfg3 fun2 as bs			
	sGpio->Agpdat |= 0x00080000;
	sGpio->Agpdat &= ~0x00000008;
*/	
}
static void Select(void)
{
	register MCARD *sMcard;
	register GPIO *sGpio;
	DWORD dwTemp;

	sGpio = (GPIO *) (GPIO_BASE);
	sMcard = (MCARD *) (MCARD_BASE);
	sMcard->McardC = 0;
#if ((CHIP_VER & 0xffff0000) != CHIP_VER_600)
	dwTemp = sGpio->Fgpcfg[1];	// config fgpio[20] as BS
	dwTemp &= 0xffefffff;
	dwTemp |= GPIO_DEFINE_0;
	sGpio->Fgpcfg[1] = dwTemp;
	dwTemp = sGpio->Fgpcfg[2];	// config fgpio[47] as SCLK
	dwTemp &= 0x7fffffff;
	dwTemp |= GPIO_DEFINE_1;
	sGpio->Fgpcfg[2] = dwTemp;
	sGpio->Gpcfg1 |= GPIO_DEFINE_2;	// config gpio[24] ~ [27] as SMdata0 ~ 3 (Alt 3)
	SetPowerSwitch(1);//
	sMcard->McardC = (MCARD_FIFO_EMPTY | MCARD_ENABLE) + sInfo.bBusWidth;	// enable MS function
#else
	#if((CHIP_VER & 0x0000ffff) == CHIP_VER_A)
		#if ((STD_BOARD_VER == MP600PQFP_8M_SDRAM)||(STD_BOARD_VER == MP600PQFP_2M_SDRAM))
			sGpio->Fgpcfg[0] |= 0x0000030f; // FGPIO[0] ~[3] : D0 ~D3, FGPIO[8],[9],[15] : CMD ,CLK,WP
		//	sGpio->Fgpcfg[1] |= 0x00000004; //FGPIO[18] : CD 
			sGpio->Fgpcfg[1] &= ~ 0x00080000; // set Fgpio 19 as fun1 for ms ins
		       sGpio->Fgpcfg[1] |= 0x00000008;
			sMcard->McardC = (MCARD_FIFO_EMPTY | MCARD_ENABLE) + sInfo.bBusWidth+BIT11;	// enable MS function		
		#else
			sGpio->Fgpcfg[0] |= 0x00000300; // FGPIO[0] ~[3] : D0 ~D3, FGPIO[8],[9],[15] : CMD ,CLK,WP
			sGpio->Fgpcfg[1] |= 0x0000e000; // 600 B set gpio 29 ~ 32 as d0~3
			sGpio->Fgpcfg[2] |= 0x00000001;	
			sGpio->Fgpcfg[1] &= ~ 0x00080000; // set Fgpio 19 as fun1 for ms ins
		       sGpio->Fgpcfg[1] |= 0x00000008;
			sMcard->McardC = 0;	   
			sMcard->McardC = (MCARD_FIFO_EMPTY | MCARD_ENABLE) + sInfo.bBusWidth;	// enable MS function
		#endif

		
	#elif(((CHIP_VER & 0x0000ffff) == CHIP_VER_B)||((CHIP_VER & 0x0000ffff) == CHIP_VER_C))
		#if ((STD_BOARD_VER == MP600PQFP_8M_SDRAM)||(STD_BOARD_VER == MP600_128PQFP_CPU_8M_SDRAM))
			sGpio->Fgpcfg[0] |= 0x0000030f; // FGPIO[0] ~[3] : D0 ~D3, FGPIO[8],[9],[15] : CMD ,CLK,WP
		//	sGpio->Fgpcfg[1] |= 0x00000004; //FGPIO[18] : CD 
			sGpio->Fgpcfg[1] &= ~ 0x00080000; // set Fgpio 19 as fun1 for ms ins
		       sGpio->Fgpcfg[1] |= 0x00000008;
			sMcard->McardC = (MCARD_FIFO_EMPTY | MCARD_ENABLE) + sInfo.bBusWidth+BIT11;	// enable MS function		
		#else
			sGpio->Fgpcfg[1] |= 0x00000008; //
			sGpio->Fgpcfg[1] |= 0x0000e020; //
			sGpio->Fgpcfg[2] |= 0x00000001;	
			sGpio->Agpcfg &= ~0x00000008; // set agpcfg3 fun2 as bs
			sGpio->Agpcfg |= 0x00080000; // set agpcfg3 fun2 as bs		
			sMcard->McardC = 0;	   
			sMcard->McardC = (MCARD_FIFO_EMPTY | MCARD_ENABLE) + sInfo.bBusWidth;	// enable MS function
		#endif

	#endif
#endif	
	sMcard->McWdt = WATCHDOG_TIMER;
}

static SWORD ProWaitCpuStartup(void)
{
	SWORD swRetValue;
	DWORD i;
	BYTE bGetValue;

	for (i = 0; i < 0x10000; i++)
	{
		if ((swRetValue = ReadTpcBs(TPC_GET_INT, &bGetValue, 1)))
		{
			MP_DEBUG1("-E- TPC_GET_INT FAIL (swRetValue: %d)", swRetValue);
			return swRetValue;
		}

		if (bGetValue & 0x80)	//CED
		{
			if ((swRetValue = ReadTpcBs(TPC_GET_INT, &bGetValue, 1)))
			{
				MP_DEBUG1("-E- TPC_GET_INT FAIL (swRetValue: %d)", swRetValue);
				return swRetValue;
			}

			if (bGetValue & 0x40)
			{
				if (bGetValue & 0x01)
				{
					sInfo.bWriteProtected = 1;
					return PASS;
				}
				else
				{
					MP_DEBUG1("-E- ms cpu startup FIAL (status: %x)", bGetValue);
					return FAIL;
				}
			}
			else
			{
				return PASS;
			}
		}
	}
	MP_DEBUG("-E- ms cpu startup FIAL");
	return FAIL;
}
#if MsSpeedStatus  // rick ms pro faster 7/4
static SWORD ProLogicalWrite(DWORD dwLogAddr, DWORD dwSectorCount, DWORD dwBufferAddress)
{
	register MCARD *sMcard;
	DWORD i;
	SWORD swRetValue;
	BYTE bIntValue;

	sMcard = (MCARD *) (MCARD_BASE);
	sMcard->McMsT1 = PRO_TIMEOUT1;
	//Set Parameter Register
	SetProParaReg(bProFlashCMD[PRO_WRITE_DATA], dwSectorCount, dwLogAddr, 0x00, 0x00);

	if ((swRetValue = WriteTpcBs(TPC_EX_SET_CMD, (BYTE *) (&sProParamReg), 7)))
	{
		MP_DEBUG1("-E- TPC_EX_SET_CMD FAIL (swRetValue: %d)", swRetValue);
		return swRetValue;
	}

	if ((swRetValue = WaitTime1INT()))
	{
		MP_DEBUG1("-E- WaitTime1INT FAIL (swRetValue: %d)", swRetValue);
		return swRetValue;
	}

	if ((swRetValue = GetIntValue(&bIntValue)))
	{
		MP_DEBUG1("-E- GetINT FAIL (swRetValue: %d)", swRetValue);

⌨️ 快捷键说明

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