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

📄 udisk.c

📁 周立功LPC23XX系列U盘源码。UDiskDrvDemo
💻 C
📖 第 1 页 / 共 2 页
字号:
	{
		if (rwdisk.cmds == 0)
		{										
			ret = 0;
		}
		else
		{
			ret = rwdisk.cmds;
		}
	}
	else	
	{
		ret = 0xff;						// 设备没响应
	}	
	return (ret);
}

/*********************************************************************************************************
** 函数名称: GetFCB
** 功能描述: 获取文件控制块
** 输入参数: 无
** 输出参数: 若当前文件控制块空闲, 则返回当前文件控制块的指针,否则返回NULL
********************************************************************************************************/
FileCB	*GetFCB(void)
{
	if (CurFileCB.fh == HANDLE_AVAILABLE)
	{
		return (&CurFileCB);
	}
	else
	{	
		return (NULL);
	}
}

/*********************************************************************************************************
** 函数名称: FreeFCB
** 功能描述: 释放当前文件控制块,令当前文件控制块的句柄空闲
** 输入参数: 无
** 输出参数: 无
********************************************************************************************************/
void FreeFCB(void)
{
	CurFileCB.fh 	= HANDLE_AVAILABLE;
	CurFileCB.fsize = 0;
}

/*********************************************************************************************************
** 函数名称: FileOpen
** 功能描述: 打开文件.若该文件不存在,则建立一个
** 输入参数: fileName:	文件名或文件路径
** 输出参数: 文件控制块指针,NULL为不能打开文件, 非零值为当前文件控制块的指针
********************************************************************************************************/
FileCB	*FileOpen(char *fileName)
{
	uint8	reqbuff[6];	   							// 请求帧控制信息缓存,仅存储请求帧前6个字节的信息
	uint8	framedat_rcvbuf[13];					// 应答帧数据域接收缓存

	FileCB	*FileCBPt;

	rwdisk.write_ptr = framedat_rcvbuf;				// 设定接收应答帧数据域中数据的接收缓存	

	/* 获取文件控制块,若没有则返回 */
	FileCBPt = GetFCB();
	if (NULL == FileCBPt)				 
	{
		return (NULL);
	}

	/* 获取了文件控制块,初始化请求帧控制信息缓存 */
	reqbuff[0] = 'U';
	reqbuff[1] = ':';
	reqbuff[2] = 0x10;
	reqbuff[3] = 0xff;
	reqbuff[4] = strlen(fileName); 
	reqbuff[5] = 0;
	
	/* 发送打开文件请求帧 */
	SendRequest(reqbuff, 6);						// 发送请求帧的前6字节
	SendRequest((uint8*)fileName, strlen(fileName));// 发送请求帧的数据域数据(文件名或目录名)
	
	/* 接收应答帧 */
	if (Wait_Ack() == TRUE)		
	{
		if (rwdisk.cmds == CMD_SUCCESS)
		{	
			FileCBPt->fh 	= framedat_rcvbuf[0];
			FileCBPt->fsize = framedat_rcvbuf[1] + framedat_rcvbuf[2] * 0x100 + framedat_rcvbuf[3] * 0x10000 + framedat_rcvbuf[4] * 0x1000000;	
		}
		else
		{
			FileCBPt = NULL;
		}
	}
	else	
	{
		FileCBPt	 = NULL;
	}	
	return (FileCBPt);
}

/*********************************************************************************************************
** 函数名称: FileClose
** 功能描述: 关闭已打开的文件
** 输入参数: 无
** 输出参数: NO_RESPONSE为没有应答, 否则返回指令执行的状态
********************************************************************************************************/
uint8 FileClose(void)
{
	uint8 	reqbuff[6];
	uint8	framedat_rcvbuf[6];			// 应答帧数据域接收缓存

   /* 初始化关闭文件请求帧缓存 */
	reqbuff[0] = 'U';	
	reqbuff[1] = ':';	
	reqbuff[2] = 0x12;
	reqbuff[3] = 0;		
	reqbuff[4] = 0;		
	reqbuff[5] = 0;
	
	FreeFCB();
	rwdisk.write_ptr = framedat_rcvbuf;	// 设定接收应答帧数据域中数据的接收缓存
	SendRequest(reqbuff, 6);			// 发送命令请求帧
	
	/* 等待文件关闭 */
	if (Wait_Ack() == TRUE)		
	{
		return (rwdisk.cmds);
	}
	else
	{
		return (NO_RESPONSE);						
	}
}

/*********************************************************************************************************
** 函数名称: RemoveFile
** 功能描述: 删除指定的文件
** 输入参数: FileName:  文件名或文件路径
** 输出参数: 为0表示正常删除文件,
**	         非零值为删除文件失败
********************************************************************************************************/
uint8 RemoveFile(char *FileName)
{
	uint8	reqbuff[6];
	uint8	framedat_rcvbuf[6];		 	// 应答帧数据域接收缓存
	uint8	namelen;
	uint8	ret;

	reqbuff[0] = 'U';
	reqbuff[1] = ':';
	reqbuff[2] = 0x13;
	reqbuff[3] = 0xff;
	namelen    = strlen(FileName);		
	reqbuff[4] = namelen; 
	reqbuff[5] = 0;
	
	rwdisk.write_ptr = framedat_rcvbuf;

	SendRequest(reqbuff, 6);					
	SendRequest((uint8*)FileName, namelen);	
	
	if (Wait_Ack() == TRUE)				// 等待应答完毕
	{
		if (rwdisk.cmds == CMD_SUCCESS)
		{	
			ret = 0;
		}
		else
		{
			ret = rwdisk.cmds;
		}
	}
	else	
	{
		ret = 0xff;						// 设备没响应
	}	
	return (ret);
}

/*********************************************************************************************************
** 函数名称: S_FileWrite
** 功能描述: 将小于512字节的数据写入文件
** 输入参数: Buf   :   要写的数据所在缓存的地址
**        	 Size  :   要写入文件的字节数, 但最大不能超过512字节
**        	 FileCBPt: 文件控制块指针
** 输出参数: 若操作成功则返回实际写入的字节数, 否则返回0
********************************************************************************************************/
uint16	S_FileWrite(void *Buf,  uint16 Size,  FileCB  *FileCBPt)
{
	uint8	reqbuff[10];  

	if (NULL == FileCBPt)	
	{
		return (0);
	}

	rwdisk.write_ptr = &reqbuff[6];		// 设定接收应答帧数据域中数据的接收缓存

	reqbuff[0] = 'U';
	reqbuff[1] = ':';
	reqbuff[2] = 0x20;
	
	/* 若输入的文件控制块句柄空闲则进一步操作,否则直接返回 */
	if (FileCBPt->fh != HANDLE_AVAILABLE) 
	{
		reqbuff[3] = FileCBPt->fh;
	}
	else 
	{
		return (0);
	}
	
	reqbuff[4] 		 = (uint8)Size;
	reqbuff[5] 		 = (uint8)(Size / 0x100);

	/* 发送写文件请求帧 */
	SendRequest(reqbuff, 6);					
	SendRequest((uint8*)Buf, Size);			

	/* 等待写文件操作完成 */
	if (Wait_Ack() == TRUE)					
	{	
		if (rwdisk.cmds != CMD_SUCCESS)
		{
			return (0);
		}
	}
	else
	{	
		return (0);
	}
	return (uint16)(reqbuff[6] + reqbuff[7] * 0x100); 
}

/*********************************************************************************************************
** 函数名称: S_FileRead
** 功能描述: 读取文件
** 输入参数: Buf     :保存所读回数据的缓存地址
**        	 Size    :要读入的字节数
**        	 FileCBPt:文件控制块指针
** 输出参数: 实际读到的字节数,但若操作出错或失败则返回0
********************************************************************************************************/
uint16 S_FileRead(void *Buf,  uint16 Size,  FileCB	*FileCBPt)
{
	uint8	reqbuff[10];

	if (NULL == FileCBPt)	
	{
		return (0);
	}
	
	/* 若输入的文件控制块的文件句柄有效则进一步操作,否则直接返回 */
	if (FileCBPt->fh != HANDLE_AVAILABLE) 
	{
		reqbuff[3] = FileCBPt->fh;
	}
	else
	{
		return (0);
	}	

	rwdisk.write_ptr = (uint8*)Buf;	// 设置接收应答帧数据域数据的缓存地址

	reqbuff[0] = 'U';
	reqbuff[1] = ':';	
	reqbuff[2] = 0x30;
	reqbuff[4] = 4;
	reqbuff[5] = 0;
	reqbuff[6] = (uint8)Size;
	reqbuff[7] = (uint8)(Size / 0x100);
	reqbuff[8] = 0;
	reqbuff[9] = 0;
	
	SendRequest(reqbuff, 10);		
	
	/* 等待应答帧发送完毕 */
	if (Wait_Ack() == TRUE)			
	{	
		if (rwdisk.cmds != CMD_SUCCESS)
		{
			return 0;
		}
	}
	else
	{	
		return (0);
	}
	return ((uint16)rwdisk.wlen);  // 返回接收数据的字节数
}

/*********************************************************************************************************
** 函数名称: FileWrite
** 功能描述: 可将字节数大于512的数据块写入文件
** 输入参数: Buf     : 要写的数据所在缓存的地址
**        	 Size    : 要写入文件的字节数
**        	 FileCBPt: 文件控制块指针
** 输出参数: 实际写的字节数
********************************************************************************************************/
uint32 FileWrite(uint8 *Buf,  uint32 Size,  FileCB	*FileCBPt)
{
	uint32	alreadywr_N 	= 0;  	// 用于指示已经写入的数据字节数
	uint16  bewritten_N 	= 0;  	// 每次写操作所实际写入的数据字节数
	
	/* 单次写文件操作所能写入的数据块长度是有限的,所以若写入数据长度超过单次最大写数据长度,就需要分批进行操作 */
	while ((Size / MAX_FILE_SIZE) > 0)
	{
		Size 		-= MAX_FILE_SIZE;
		bewritten_N  = S_FileWrite(Buf + alreadywr_N, MAX_FILE_SIZE, FileCBPt);
		
		if (bewritten_N == MAX_FILE_SIZE)
		{
			alreadywr_N += bewritten_N;
		}
		else						// 写文件出错
		{
			return (alreadywr_N);
		}
	}
	/* 所需写入的数据少于MAX_FILE_SIZE时的最后一次写操作 */
	bewritten_N   = 0;
	if (Size != 0)
	{
		bewritten_N = S_FileWrite(Buf+alreadywr_N, (uint16)Size, FileCBPt);
	}

	return (alreadywr_N+bewritten_N);// 返回已经写入的数据数目
}

/*********************************************************************************************************
** 函数名称: FileRead
** 功能描述: 读取文件
** 输入参数: Buf     :保存读回的数据
**        	 Size    :要读的字节数
**        	 FileCBPt:文件控制块指针
** 输出参数: 实际读到的字节数
********************************************************************************************************/
uint32 FileRead(uint8 *Buf,  uint32 Size,  FileCB	*FileCBPt)
{
	uint32	alreadyrd_N = 0;
	uint16  beread_N    = 0;
	
	while((Size / MAX_FILE_SIZE) > 0)
	{
		Size -= MAX_FILE_SIZE;
		beread_N = S_FileRead( Buf + alreadyrd_N, MAX_FILE_SIZE, FileCBPt);
		if (beread_N == MAX_FILE_SIZE)
		{
			alreadyrd_N += beread_N;
		}
		else						// 写文件出错
		{
			return (alreadyrd_N);
		}
	}

	beread_N = 0;
	if (Size != 0)
	{
		beread_N = S_FileRead(Buf + alreadyrd_N, (uint16) Size, FileCBPt);
	}
	return (alreadyrd_N + beread_N);
}

/*********************************************************************************************************
** 函数名称: FileSeek
** 功能描述: 移动文件读\写位置
** 输入参数: FileCBPt  : 文件控制块指针
**        	 offset    : 移动偏移量
**        	 move_mode : 移动模式
**					  SEEK_SET  文件的读写指针移动至文件头位置,并从此处开始移动
**					  SEEK_CUR  文件的读写指针移动至当前位置,并从此处开始移动
**					  SEEK_END  文件的读写指针移动至至文件尾,并从此处开始移动
** 输出参数: 成功返回0
**         	 出错返回非0值
********************************************************************************************************/
uint8 FileSeek(FileCB	*FileCBPt,  int32 offset,  uint8 move_mode)
{
	uint8	reqbuff[11];
	uint8	framedat_rcvbuf[11];	// 应答帧数据域接收缓存

	if (NULL == FileCBPt)	
	{
		return (PARAMETER_ERR);
	}
	
	if (FileCBPt->fh != 0xff)
	{ 
		reqbuff[3] = FileCBPt->fh;
	}
	else
	{ 
		return (PARAMETER_ERR);
	}

	rwdisk.write_ptr = framedat_rcvbuf;

	reqbuff[0] 	= 'U';	
	reqbuff[1] 	= ':';	
	reqbuff[2] 	= 0x40;
	reqbuff[4]  = 5;
	reqbuff[5]  = 0;
	reqbuff[6]  = offset & 0xff;
	reqbuff[7]  = (offset >> 8)  & 0xff;
	reqbuff[8]  = (offset >> 16) & 0xff;
	reqbuff[9]  = (offset >> 24) & 0xff;
	reqbuff[10] = move_mode;

	SendRequest(reqbuff, 11);		// 发送命令请求帧
	
	/* 等待应答完毕 */
	if (Wait_Ack() == TRUE)			
	{	
		return (rwdisk.cmds);
	}
	else	
	{
		return (0xff);
	}
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -