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

📄 msdef_i.c

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