📄 msdef_i.c
字号:
{
return -1;
}
//ReadExtraDataArea(tmp, ((unsigned short)(PhyBlock))*32, 1);
ReadExtraDataArea(tmp, ((unsigned short)(PhyBlock))<<5, 1);
if (tmp[2] == 0xFF && tmp[3] == 0xFF)
{
return -1;
}
return PhyBlock;
}
unsigned short GetLogicBlockIndex(unsigned short logicBlock)
{
return LBIndex[logicBlock];
/*if (logicBlock <= 493)
{
return logicBlock;
}
else
{
return ((logicBlock-494)/496+1)*512 + (logicBlock-494)%496;
//return ((logicBlock-494)/(512-16))<<9 + 512 + (logicBlock-494)%496;
//return ((((logicBlock-494)>>9) - ((logicBlock-494)>>4))<<9) + 512 + (logicBlock-494)%496;
}*/
}
int CreateLPTable()
{
unsigned short i;
unsigned short LogicBlock;
unsigned short index;
unsigned short EndBlock;
unsigned char tmp[9];
unsigned short *LPTable = (unsigned short*)LPTABLE_ADDR;
memset(LPTable, 0xFF, 0x4000);
if (NumOfBlock == 0x0800)
{
EndBlock = 2047;
}
else
if (NumOfBlock == 0x1000)
{
EndBlock = 4095;
}
else
if (NumOfBlock == 0x2000)
{
EndBlock = 8191;
}
else
{
return -1; //no support
}
//Seek all of Blocks
for (i=2; i<EndBlock; i++)
{
//ResetWatchDog();
if (IsDisable(i))
{
continue;
}
//ReadExtraDataArea(tmp, i*32, 1);
ReadExtraDataArea(tmp, i<<5, 1);
if ((tmp[0] & 0x80) == 0)
{
continue; //bad block
}
if (tmp[2] == 0xFF && tmp[3] == 0xFF)
{
continue; //unused
}
LogicBlock = ((tmp[2]<<8)&0xFF00) | tmp[3]; //注意高低字节顺序
index = GetLogicBlockIndex(LogicBlock); //求逻辑块在表中的索引
if (LPTable[index] == 0xFFFF)
{
LPTable[index] = i; //记录物理块
}
else
{
if (tmp[0] & 0x10)
{
//ReadExtraDataArea(tmp, LPTable[index]*32, 1); //读已经注册物理块的扩展数据区
ReadExtraDataArea(tmp, LPTable[index]<<5, 1); //读已经注册物理块的扩展数据区
if (tmp[0] & 0x10)
{
if (i > LPTable[index])
{
EraseBlocks(LPTable[index], 1); //擦除块 是否也擦除了扩展数据区????
LPTable[index] = i; //记录物理块
}
else
{
EraseBlocks(i, 1); //擦除块 是否也擦除了扩展数据区????
}
}
}
else
{
//ReadExtraDataArea(tmp, LPTable[index]*32, 1); //读已经注册物理块的扩展数据区
ReadExtraDataArea(tmp, LPTable[index]<<5, 1); //读已经注册物理块的扩展数据区
if (tmp[0] & 0x10)
{
EraseBlocks(LPTable[index], 1); //擦除块 是否也擦除了扩展数据区????
LPTable[index] = i; //记录物理块
}
else
{
if (i > LPTable[index])
{
EraseBlocks(LPTable[index], 1); //擦除当前块 是否也擦除了扩展数据区????
LPTable[index] = i; //记录物理块
}
else
{
EraseBlocks(i, 1); //擦除当前块 是否也擦除了扩展数据区????
}
}
}
}
}
return 0;
}
long FindUnusedBlock(unsigned short logicBlock)
{
unsigned short beginBlock;
unsigned short endBlock;
long currentBlock;
unsigned short index;
unsigned char tmp[9];
if (logicBlock <= 493)
{
beginBlock = 2;
endBlock = 511;
}
else
{
beginBlock = ((logicBlock-494)/496+1)*512;
//beginBlock = ((logicBlock-494)/496)*512+512;
//beginBlock = ((logicBlock-494)/(512-16))*512+512;
//beginBlock = ((logicBlock-494)/512-(logicBlock-494)/16))*512+512;
//beginBlock = (((logicBlock-494)>>9)-((logicBlock-494)>>4))<<9+512;
endBlock = beginBlock+511;
}
currentBlock = GetPhyBlock(logicBlock); //逻辑块
if (currentBlock == -1)
{
currentBlock = beginBlock; //BeginBlock不在查找
//return -1;
}
index = (unsigned short)currentBlock;
while (1)
{
index++;
if (index > endBlock)
{
index = beginBlock;
}
if (index == (unsigned short)currentBlock)
{
return -1;
}
if (IsDisable(index))
{
continue;
}
//ReadExtraDataArea(tmp, index*32, 1); //读物理块的扩展数据区
ReadExtraDataArea(tmp, index<<5, 1); //读物理块的扩展数据区
if ((tmp[0] & 0x80) == 0)
{
continue; //bad block
}
if (tmp[2] == 0xFF && tmp[3] == 0xFF)
{
return index;
}
}
return -1;
}
int WriteLogicBlock(unsigned char * buf, unsigned short logicBlock)
{
int i;
unsigned char tmp[9];
unsigned short *LPTable = (unsigned short*)LPTABLE_ADDR;
//unsigned char tmp1[9];
long unusedBlock;
long PhyBlock = GetPhyBlock(logicBlock);
//find a unused block in same segment
unusedBlock = FindUnusedBlock(logicBlock); //返回物理块
if (unusedBlock == -1)
{
asm("nop");
unusedBlock = FindUnusedBlock(logicBlock);
return -1;
}
if (PhyBlock != -1)
{
//ReadExtraDataArea(tmp, PhyBlock*32, 1); //读已经注册物理块的扩展数据区
ReadExtraDataArea(tmp, PhyBlock<<5, 1); //读已经注册物理块的扩展数据区
}
else
{
//ReadExtraDataArea(tmp, unusedBlock*32, 1); //读已经注册物理块的扩展数据区
ReadExtraDataArea(tmp, unusedBlock<<5, 1); //读已经注册物理块的扩展数据区
tmp[2] = (logicBlock>>8)&0xFF;
tmp[3] = logicBlock&0xff;
}
//write data to new block
EraseBlocks((unsigned short)unusedBlock, 1);
//change logic address of new block
WriteBlockData(buf, (unsigned short)unusedBlock, tmp);
//erase current phy block
EraseBlocks((unsigned short)PhyBlock, 1);
//updata LPTable
LPTable[GetLogicBlockIndex(logicBlock)] = unusedBlock;
return 0;
}
int ReadLogicBlock(unsigned char * buf, unsigned short logicBlock)
{
long PhyBlock = GetPhyBlock(logicBlock);
if (PhyBlock == -1)
{
//asm("nop");
//PhyBlock = GetPhyBlock(logicBlock);
return 0;
}
if (currentblockno == PhyBlock)
{
return 0;
}
else
{
ReadBlockData(buf, (unsigned short)PhyBlock);
currentblockno = PhyBlock;
}
return 0;
}
int M_ReadSectors(unsigned char* Buffer, unsigned long StartSec, unsigned long Sectors)
{
unsigned char * tmpbuf = (unsigned char*)TEMP_BUFF;
unsigned long tempSector = StartSec+OffsetPBR; //加上PBR的偏移
unsigned short copySectors;
unsigned short logicBlock;
unsigned short ReadedSectors = 0;
while (1)
{
//logicBlock = tempSector / 32;
logicBlock = tempSector>>5;
if (ReadLogicBlock(tmpbuf, logicBlock) == -1)
{
return -1;
}
//copySectors = 32-tempSector%32;
copySectors = 32-(tempSector&0x01F);
if (copySectors > Sectors-ReadedSectors)
{
copySectors = Sectors-ReadedSectors;
}
//memcpy(Buffer+ReadedSectors*512, tmpbuf+(tempSector%32)*512, copySectors*512);
memcpy(Buffer+(ReadedSectors<<9), tmpbuf+((tempSector&0x01F)<<9), copySectors<<9);
ReadedSectors += copySectors;
if (ReadedSectors >= Sectors)
{
return 0;
}
tempSector += copySectors;
}
}
int M_WriteSectors(unsigned char* Buffer, unsigned long StartSec, unsigned long Sectors)
{
unsigned char * tmpbuf = (unsigned char*)TEMP_BUFF;
unsigned long tempSector = StartSec+OffsetPBR; //加上PBR的偏移
unsigned short copySectors;
unsigned short logicBlock;
unsigned short WritedSectors = 0;
while (1)
{
//logicBlock = tempSector / 32;
logicBlock = tempSector>>5;
if (ReadLogicBlock(tmpbuf, logicBlock) == -1)
{
return -1;
}
//copySectors = 32-(tempSector%32);
copySectors = 32-(tempSector&0x0001F);
if (copySectors > Sectors-WritedSectors)
{
copySectors = Sectors-WritedSectors;
}
//memcpy(tmpbuf+(tempSector%32)*512, Buffer+WritedSectors*512, copySectors*512);
memcpy(tmpbuf+((tempSector&0x001F)<<9), Buffer+(WritedSectors<<9), copySectors<<9);
WriteLogicBlock(tmpbuf, logicBlock);
WritedSectors += copySectors;
if (WritedSectors >= Sectors)
{
return 0;
}
tempSector += copySectors;
}
}
void SleepMS(void)
{
//unsigned char* buf = (unsigned char*)malloc(0x4000);
unsigned char tmp[9];
if (WriteBackLPTable == 0)
{
WriteBackLPTable = 1;
ReadExtraDataArea(tmp, PosOfLPTable<<5, 1); //读已经注册物理块的扩展数据区
EraseBlocks(PosOfLPTable, 1);
WriteBlockData((unsigned char*)LPTABLE_ADDR, PosOfLPTable, NULL);
ReadBlockData((unsigned char*)LPTABLE_ADDR, PosOfLPTable);
}
//free(buf);
}
void WakeupMS(void)
{
unsigned char* boot = (unsigned char*)malloc(0x4000);
currentblockno = 0;
/*DrawText(100, 100, "11111");
UpdateLcd();*/
ReadBlockData(boot, 0);
memcpy((unsigned char*)DISTABLE_ADDR, boot+512, 512);
/*DrawText(100, 100, "22222");
UpdateLcd();*/
//ResetWatchDog();
ReadBlockData((unsigned char*)LPTABLE_ADDR, PosOfLPTable);
/*DrawText(100, 100, "33333");
UpdateLcd();*/
//ResetWatchDog();
free(boot);
}
int WritePacket(unsigned char TPC, unsigned char * data, unsigned short length, unsigned short CRC)
{
unsigned short k;
unsigned char i;
unsigned char ret = 0;
//BS0 SDIO is input; BS is low
// while (!GET_SDIO)
// {
// CLR_SCLK;
// SET_SCLK;
// }
CLR_SCLK;
SET_SCLK;
CLR_SCLK;
SET_SCLK;
CLR_SCLK;
SET_BS;
SET_SCLK;
//asm("nop");
SDIO_OUT;
//BS1 SDIO is output; BS is high; Send TPC
for( i=0x80; i!=1; i>>=1 )
{
if( i&TPC ) //***************?
{
SET_SDIO;
}
else
{
CLR_SDIO;
}
CLR_SCLK;
SET_SCLK;
}
if( TPC&0x01 ) //****************
{
SET_SDIO;
}
else
{
CLR_SDIO;
}
CLR_SCLK;
CLR_BS;
SET_SCLK;
//BS2 SDIO is output; BS is low; Send data and CRC
for (k=0; k<length; k++) //Send data
{
for( i=0x80; i!=0; i>>=1)
{
if( i&data[k] )
{
SET_SDIO;
}
else
{
CLR_SDIO;
}
CLR_SCLK;
SET_SCLK;
}
}
for( k=0x8000; k!=1; k>>=1 ) //Send CRC
{
if( k&CRC ) //***************?
{
SET_SDIO;
}
else
{
CLR_SDIO;
}
CLR_SCLK;
SET_SCLK;
}
if( CRC&0x01 ) //****************
{
SET_SDIO;
}
else
{
CLR_SDIO;
}
CLR_SCLK;
SET_BS;
SET_SCLK;
SDIO_IN;
//BS3 SDIO is input; BS is high; Recieve BSY status
while (ret!=0x55 && ret!=0xAA)
{
for( i=0x80,ret=0; i!=0; i>>=1 )
{
CLR_SCLK;
SET_SCLK;
if( GET_SDIO )
{
ret |= i;
}
}
}
CLR_SCLK;
CLR_BS;
SET_SCLK;
//BS0 SDIO is input; BS is low
CLR_SCLK;
SET_SCLK;
CLR_SCLK;
SET_SCLK;
return 0;
}
int ReadPacket(unsigned char TPC, unsigned char * data, unsigned short length)
{
unsigned short k;
unsigned char i;
unsigned char ret = 0;
//BS0 SDIO is input; BS is low
// while (!GET_SDIO)
// {
// CLR_SCLK;
// SET_SCLK;
// }
CLR_SCLK;
SET_SCLK;
CLR_SCLK;
SET_SCLK;
CLR_SCLK;
SET_BS;
SET_SCLK;
//asm("nop");
SDIO_OUT;
//BS1 SDIO is output; BS is high; Send TPC
for( i=0x80; i!=1; i>>=1 )
{
if( i&TPC ) //***************?
{
SET_SDIO;
}
else
{
CLR_SDIO;
}
CLR_SCLK;
SET_SCLK;
}
if( TPC&0x01 ) //****************
{
SET_SDIO;
}
else
{
CLR_SDIO;
}
CLR_SCLK;
CLR_BS;
SET_SCLK;
//asm("nop");
SDIO_IN;
//BS2 SDIO is input; BS is low; Recieve BSY status
while (ret!=0x55 && ret!=0xAA)
{
for( i=0x80,ret=0; i!=0; i>>=1 )
{
CLR_SCLK;
SET_SCLK;
if( GET_SDIO )
{
ret |= i;
}
}
}
CLR_SCLK;
SET_BS;
SET_SCLK;
SDIO_IN;
//BS3 SDIO is iutput; BS is high; Recieve data and CRC
for (k=0; k<length; k++) //Recieve data
{
for( i=0x80,ret=0; i!=0; i>>=1 )
{
CLR_SCLK;
SET_SCLK;
if( GET_SDIO )
{
ret |= i;
}
}
data[k] = ret;
}
for( i=0x80,k=0; i!=0; i>>=1 ) //Recieve CRC
{
CLR_SCLK;
SET_SCLK;
if( GET_SDIO )
{
k |= i;
}
}
k <<= 8;
for( i=0x80; i!=1; i>>=1 )
{
CLR_SCLK;
SET_SCLK;
if( GET_SDIO )
{
k |= i;
}
}
//LSB of CRC
CLR_BS;
CLR_SCLK;
SET_SCLK;
if( GET_SDIO )
{
k |= 1;
}
//BS0 SDIO is input; BS is low
CLR_SCLK;
SET_SCLK;
CLR_SCLK;
SET_SCLK;
CLR_SCLK;
SET_SCLK;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -