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