📄 msdef_i.c
字号:
//
//
// SET_BS;
// SET_SCLK;
//
//
// SDIO_OUT;
//
// //Send TPC
// SendTPC(GET_INT);
//
// JudgeBusy();
//
// SET_BS;
//
// CLR_SCLK;
// SET_SCLK;
//
// for( i=0x80,data=0; i!=0; i>>=1 )
// {
// CLR_SCLK;
// SET_SCLK;
// if( GET_SDIO )
// {
// data |= i;
// }
// }
// //16 bits CRC
// for( i=0x80,crc=0; i!=0; i>>=1 )
// {
// CLR_SCLK;
// SET_SCLK;
// if( GET_SDIO )
// {
// crc |= i;
// }
// }
// crc <<= 8;
// for( i=0x80; i!=1; i>>=1 )
// {
// CLR_SCLK;
// SET_SCLK;
// if( GET_SDIO )
// {
// crc |= i;
// }
// }
// //LSB of CRC
// CLR_BS;
// CLR_SCLK;
// SET_SCLK;
// if( GET_SDIO )
// {
// crc |= 1;
// }
//
// CLR_SCLK;
// return data;
}
/**********************************************************************
* Function Name : void ReadPageData(unsigned char *buf)
* Description : Read one page data,and write to buffer designated
* Input Para : buf: the buf store data
* Ouput Para : None
* Remark :
***********************************************************************/
void ReadPageData(unsigned char *buf)
{
unsigned char i,temp;
unsigned short j,crc;
ReadPacket(READ_PAGE_DATA, buf, 512);
// CLR_SCLK;
// CLR_BS;
//
// SET_SCLK;
// CLR_SCLK;
// SET_SCLK;
// CLR_SCLK;
// SET_SCLK;
// CLR_SCLK;
// SET_SCLK;
// CLR_SCLK;
// SET_SCLK;
// CLR_SCLK;
// SET_SCLK;
// CLR_SCLK;
//
// SET_BS;
// SET_SCLK;
//
// SDIO_OUT;
//
// //Send TPC
// SendTPC(READ_PAGE_DATA);
//
// JudgeBusy();
//
// SET_BS;
//
// CLR_SCLK;
// SET_SCLK;
//
// for( j=0; j<512; j++)
// {
//
// for( i=0x80,temp=0; i!=0; i>>=1 )
// {
// CLR_SCLK;
// SET_SCLK;
// if( GET_SDIO )
// {
// temp |= i;
// }
// }
// buf[j] = temp; //Store data
// }
// //16 bits CRC
// for( i=0x80,crc=0; i!=0; i>>=1 )
// {
// CLR_SCLK;
// SET_SCLK;
// if( GET_SDIO )
// {
// crc |= i;
//
// }
// }
// crc <<= 8;
// for( i=0x80; i!=1; i>>=1 )
// {
// CLR_SCLK;
// SET_SCLK;
// if( GET_SDIO )
// {
// crc |= i;
// }
// }
// //LSB of CRC
// CLR_BS;
// CLR_SCLK;
// SET_SCLK;
// if( GET_SDIO )
// {
// crc |= 1;
// }
//
// CLR_SCLK;
// SET_SCLK;
//
// CLR_SCLK;
// SET_SCLK;
}
/**********************************************************************
* Function Name : void WriteReg(unsigned char data)
* Description : Set the Register address accessed by WRITE_REG and READ_REG
* Input Para : data: the para write to
*
* Ouput Para :None
* Remark :
***********************************************************************/
unsigned char WritePageData(unsigned char *buf)
{
unsigned char j,temp[512];
unsigned short i,crc;
crc = updcrc(buf, 512);
WritePacket(WRITE_PAGE_DATA, buf, 512, crc);
// SDIO_OUT;
// CLR_SCLK;
// CLR_BS;
// SET_SCLK;
// CLR_SCLK;
// SET_SCLK;
// CLR_SCLK;
// SET_SCLK;
// CLR_SCLK;
// SET_SCLK;
// CLR_SCLK;
// SET_SCLK;
// CLR_SCLK;
// SET_SCLK;
// CLR_SCLK;
// SET_BS;
// SET_SCLK;
//
// //Send TPC
// SendTPC(WRITE_PAGE_DATA);
//
// //send data
// for( i=0; i<512; i++)
// {
// SendByte(buf[i]);
// }
//
// //Send CRC16
// SendCRC( crc );
//
// JudgeBusy();
//
// CLR_BS;
}
/**********************************************************************
* Function Name : void WriteReg(unsigned char data)
* Description : Set the Register address accessed by WRITE_REG and READ_REG
* Input Para : data: the para write to
*
* Ouput Para :None
* Remark :
***********************************************************************/
void WriteReg(unsigned char data)
{
unsigned char i,buf[1];
unsigned short crc;
buf[0] = data;
crc = updcrc(buf,1);
WritePacket(WRITE_REG, buf, 1, crc);
// CLR_SCLK;
// CLR_BS;
// SET_SCLK;
// CLR_SCLK;
// SET_SCLK;
// CLR_SCLK;
// SET_SCLK;
// CLR_SCLK;
// SET_SCLK;
// CLR_SCLK;
// SET_SCLK;
// CLR_SCLK;
// SET_SCLK;
// CLR_SCLK;
// SET_BS;
// SET_SCLK;
//
// SDIO_OUT;
//
// //Send TPC
// SendTPC(WRITE_REG);
//
// //send data
// SendByte(data);
//
// SendCRC( crc );
//
// JudgeBusy();
//
// CLR_BS;
}
/**********************************************************************
* Function Name : void WaitForINT()
* Description : Waiting for INT
* Input Para : None
* Ouput Para : None
* Remark :
***********************************************************************/
unsigned char WaitForINT()
{
unsigned long i = 0;
//Waiting for INT
SDIO_IN;
while( !GET_SDIO )
{
CLR_SCLK;
SET_SCLK;
i++;
if (i > 10000)
{
break;
}
}
return 1;
}
unsigned char ReadBlockData(unsigned char *buf,unsigned long blockindex)
{
unsigned short i;
SetRWRegAddr(0x14,1,0x14,1); //CMD para reg
WriteReg(0x0);
SetRWRegAddr(0x11,1,0x11,1); //Block addr2
WriteReg( blockindex>>16 );
SetRWRegAddr(0x12,1,0x12,1); //Block addr1
WriteReg( blockindex>>8 );
SetRWRegAddr(0x13,1,0x13,1); //Block addr0
WriteReg( blockindex );
SetRWRegAddr(0x15,1,0x15,1); //page No.
WriteReg( 0 );
SendCMD(BLOCK_READ_CMD);
WaitForINT();
GetINT();
for (i=0; i<31; i++)
{
ReadPageData(buf);
WaitForINT();
GetINT();
buf += 512;
}
SendCMD(BLOCK_END);
WaitForINT();
GetINT();
ReadPageData(buf);
//WaitForINT();
//GetINT();
return 0;
}
unsigned char WriteBlockData(unsigned char *buf,unsigned long blockindex, unsigned char* tmp)
{
unsigned short i;
SetRWRegAddr(0x14,1,0x14,1); //CMD para reg
WriteReg(0x0);
SetRWRegAddr(0x11,1,0x11,1); //Block addr2
WriteReg( blockindex>>16 );
SetRWRegAddr(0x12,1,0x12,1); //Block addr1
WriteReg( blockindex>>8 );
SetRWRegAddr(0x13,1,0x13,1); //Block addr0
WriteReg( blockindex );
SetRWRegAddr(0x15,1,0x15,1); //page No.
WriteReg(0);
if (tmp != NULL)
{
SetRWRegAddr(0x16,1,0x16,1);
WriteReg(*tmp++);
SetRWRegAddr(0x17,1,0x17,1);
WriteReg(*tmp++);
SetRWRegAddr(0x18,1,0x18,1);
WriteReg(*tmp++);
SetRWRegAddr(0x19,1,0x19,1);
WriteReg(*tmp++);
SetRWRegAddr(0x1a,1,0x1a,1);
WriteReg(*tmp++);
SetRWRegAddr(0x1b,1,0x1b,1);
WriteReg(*tmp++);
SetRWRegAddr(0x1c,1,0x1c,1);
WriteReg(*tmp++);
SetRWRegAddr(0x1d,1,0x1d,1);
WriteReg(*tmp++);
SetRWRegAddr(0x1e,1,0x1e,1);
WriteReg(*tmp++);
}
SendCMD(BLOCK_WRITE_CMD);
WaitForINT();
GetINT();
for (i=0; i<32; i++)
{
WritePageData(buf);
WaitForINT();
GetINT();
buf += 512;
}
SendCMD(BLOCK_END);
WaitForINT();
GetINT();
return 0;
}
void ReadExtraDataArea(unsigned char *buf,unsigned long pageindex,unsigned short num)
{
unsigned long block;
unsigned short i;
unsigned char page,temp;
//
SetRWRegAddr(0x14,1,0x14,1); //CMD para reg
WriteReg(0x40);
for( i=0; i<num; i++,pageindex++ )
{
block = pageindex / 32;
page = pageindex % 32;
SetRWRegAddr(0x11,1,0x11,1); //Block addr2
WriteReg( block>>16 );
SetRWRegAddr(0x12,1,0x12,1); //Block addr1
WriteReg( block>>8 );
SetRWRegAddr(0x13,1,0x13,1); //Block addr0
WriteReg( block );
SetRWRegAddr(0x15,1,0x15,1); //page No.
WriteReg( page );
SendCMD(BLOCK_READ_CMD);
WaitForINT();
GetINT();
SetRWRegAddr(0x16,1,0x16,1);
temp = ReadReg();
*(buf++) = temp;
SetRWRegAddr(0x17,1,0x17,1);
temp = ReadReg();
*(buf++) = temp;
SetRWRegAddr(0x18,1,0x18,1);
temp = ReadReg();
*(buf++) = temp;
SetRWRegAddr(0x19,1,0x19,1);
temp = ReadReg();
*(buf++) = temp;
SetRWRegAddr(0x1a,1,0x1a,1);
temp = ReadReg();
*(buf++) = temp;
SetRWRegAddr(0x1b,1,0x1b,1);
temp = ReadReg();
*(buf++) = temp;
SetRWRegAddr(0x1c,1,0x1c,1);
temp = ReadReg();
*(buf++) = temp;
SetRWRegAddr(0x1d,1,0x1d,1);
temp = ReadReg();
*(buf++) = temp;
SetRWRegAddr(0x1e,1,0x1e,1);
temp = ReadReg();
*(buf++) = temp;
}
}
/**********************************************************************
* Function Name : void EraseBlocks(unsigned short block,unsigned short num)
* Description : Erase block
* Input Para : block: designated the start block
* num:designated the number to erase
* Ouput Para : None
* Remark :
***********************************************************************/
void EraseBlocks(unsigned short block,unsigned short num)
{
unsigned short i;
for( i=0; i<num; i++,block++ )
{
SetRWRegAddr(0x11,1,0x11,1); //Block addr2
WriteReg( block>>16 );
SetRWRegAddr(0x12,1,0x12,1); //Block addr1
WriteReg( block>>8 );
SetRWRegAddr(0x13,1,0x13,1); //Block addr0
WriteReg( block );
SendCMD(BLOCK_ERASE_CMD);
WaitForINT();
GetINT();
}
}
void SendByte(unsigned char n)
{
unsigned char i;
for( i=0x80; i!=0; i>>=1)
{
if( i&n )
{
SET_SDIO;
}
else
{
CLR_SDIO;
}
CLR_SCLK;
SET_SCLK;
}
}
int IsDisable(unsigned short Block) //物理块
{
int i;
unsigned short * DisTable = (unsigned short*)(DISTABLE_ADDR);
if (Block < 2) //??????
{
return 1;
}
if (NumOfBlock == 0x0800)
{
if (Block > 2047)
{
return 1;
}
}
else
if (NumOfBlock == 0x1000)
{
if (Block > 4095)
{
return 1;
}
}
else
if (NumOfBlock == 0x2000)
{
if (Block > 8191)
{
return 1;
}
}
else
{
return 1; //no support
}
for (i=0; i<256; i++)
{
if (DisTable[i] == 0xFFFF)
{
return 0;
}
else
if (_SWAP(DisTable[i]) == Block)
{
return 1;
}
}
return 0;
}
long GetPhyBlock(unsigned short logicBlock)
{
unsigned char tmp[9];
unsigned short PhyBlock;
unsigned short *LPTable = (unsigned short*)LPTABLE_ADDR;
if (NumOfBlock == 0x0800)
{
if (logicBlock > 2047)
{
return -1;
}
}
else
if (NumOfBlock == 0x1000)
{
if (logicBlock > 4095)
{
return -1;
}
}
else
if (NumOfBlock == 0x2000)
{
if (logicBlock > 8191)
{
return -1;
}
}
//PhyBlock = LPTable[GetLogicBlockIndex(logicBlock)];
PhyBlock = LPTable[LBIndex[logicBlock]];
if (PhyBlock == 0xFFFF)
{
return -1;
}
if (IsDisable(PhyBlock))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -