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

📄 msdef_i.c

📁 uclinux下memory stick的驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
//	
//	
//	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 + -