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

📄 9311fop.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 3 页
字号:
/*------------------------------------------------------------------*/
/*模块名称:9311fop.c                                            	*/
/*模块功能:9311的文件操作,管理文件的存储和读取等					*/
/*编写日期:2004年11月                                         		*/
/*编写者:  dingding												*/
/*------------------------------------------------------------------*/

#include    "includes.h"

extern void SysSchedul(void);
extern INT16U	FDNum;
extern INT16U	dingding, PortNo;
struct FOPInfo fop;

/*------------------------------------------------------------------*/
/*函数名称:FInit()													*/
/*函数功能:检查flash的使用情况,并初始化							*/
/*输入说明:无														*/
/*输出说明:无														*/
/*------------------------------------------------------------------*/
BOOL FInit(void)
{
	INT16U	dd, oldID, port;
	INT16U	tmp[SLMANAG/2];

	if (USART1ID == OSPrioCur)
	{
		PortNo = PORT2;
		port = PORT1;
	}
	else
	{
		PortNo = PORT1;
		port = PORT2;
	}
	SysSchedul();
	UsartClose(port);
	UsartClose(PortNo);
	at91_extirq_close (&FIQ_DESC);
	at91_irq_close (TC0_DESC.periph_id);
	at91_irq_close (TC2_DESC.periph_id);		
	at91_irq_close ( WDI_ID );
	dingding = 2;
	if (OSPrioCur)
	{
		oldID = OSPrioCur;
		OSTaskChangePrio(OSPrioCur, HID);
	}
		
//	at91_irq_close ( WDI_ID );
	dd = FGetManage(tmp, SLMANAG/2);
	if (dd)
	{
		dd = FAnewSector(tmp, 128);
	}
//	at91_irq_open (WDI_ID, INTWATCHDOG, AIC_SRCTYPE_INT_EDGE_TRIGGERED, Tmr_TickISR);
	
	if (OSPrioCur)
		OSTaskChangePrio(OSPrioCur, oldID);

	UsartOpen(port);
	if (dd>128)
		return (FALSE);
	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:FReadInfo()												*/
/*函数功能:根据文件名获取文件信息									*/
/*输入说明:文件名													*/
/*输出说明:文件信息,成功返回TRUE									*/
/*------------------------------------------------------------------*/
BOOL FReadInfo(struct FileInfo* pFile)
{
	BOOL	rc = FALSE;
	INT16U	tmp[3], oldID;
	struct FMemInfo fmem;
	
	if (OSPrioCur)
	{
		oldID = OSPrioCur;
		OSTaskChangePrio(OSPrioCur, HID);
	}
	
	memcpy (fmem.Name, (INT8U*)pFile->Name, MAXFILENAMELEN);
	if (FGetADDR(&fmem))
	{
		if (fmem.Flag == SFRECORD)
		{
			rc = FGetSamp((void*)pFile, tmp, TRUE);
		}
		else
		{
			rc = FGetInfo(pFile, fmem.SAddr);
		}
	}

	if (OSPrioCur)
		OSTaskChangePrio(OSPrioCur, oldID);
	return (rc);
}

/*------------------------------------------------------------------*/
/*函数名称:FReadInfo()												*/
/*函数功能:获取存储的文件信息										*/
/*输入说明:无														*/
/*输出说明:得到的文件个数;0xFFFF--内部存储出错					*/
/*------------------------------------------------------------------*/
INT16U FReadInfos(void* pData, void* ListName)
{
	INT16U	i, j, rc, oldID;
	INT16U	tmp[SLMANAG/2];
	struct FileInfo list;

	if (OSPrioCur)
	{
		oldID = OSPrioCur;
		OSTaskChangePrio(OSPrioCur, HID);
	}
		
	memset ((INT8U*)&list, 0, sizeof (struct FileInfo));	
	if (!FGetManage(tmp, SLMANAG/2))
	{
		if (OSPrioCur)
			OSTaskChangePrio(OSPrioCur, oldID);
		return (FALSE);
	}
		
	rc = 0;

	if(strstr(ListName, "4.0/data" ) != NULL)
	{
		for (i=0; i<SLALLNUM; i++)
		{
			if (!((tmp[i] == SFINVALID) || (tmp[i] == SFERROR) ||
				(tmp[i] == SFNOUSE) || (tmp[i] == SFNEXT)))
			{
				if (FGetInfo(((struct FileInfo*)pData)+rc, i))
					rc++;
			}
		}
	}
	else  if(strstr(ListName, "4.0/temp" ) != NULL)		//虚拟,指向NVRAM
	{
		rc = FGetSamp(pData, &i, FALSE);

	}
	else if(strstr(ListName, "4.0/" ) != NULL)
	{
		for (i=SLALLNUM; i<SLMANAG/2; i++)
		{
			if (!((tmp[i] == SFINVALID) || (tmp[i] == SFNOUSE)))
			{
				if (FGetInfo(((struct FileInfo*)pData)+rc, i))
					rc++;
			}
		}
		//虚拟目录
		for (j=0; j<2; j++)
		{
			if (j == 0)
				memcpy ((INT8U*)&list.Name, "data", 10);
			else
				memcpy ((INT8U*)&list.Name, "temp", 10);
				
			list.Length = 33;
			list.Attr = 0x416D;
			memcpy ((INT8U*)(((struct FileInfo*)pData)+rc), (INT8U*)&list, sizeof (struct FileInfo));
			rc++;
		}
	}
	
	if (OSPrioCur)
		OSTaskChangePrio(OSPrioCur, oldID);	
	return (rc);
}

/*------------------------------------------------------------------*/
/*函数名称:FWrite()												*/
/*函数功能:下装文件到flash	 										*/
/*输入说明:pData--内容位置;Num--文件第几包,最高位=1为最后一包;	*/
/*			Lenth--此包长度;pFInfo--文件信息						*/
/*输出说明:写进的长度;0xFFFF--校验出错							*/
/*------------------------------------------------------------------*/
INT16U FWrite(INT8U* pData, INT16U Num, INT16U Length, struct FileInfo* pFile)
{
	BOOL	dd, ding=TRUE;
	INT16U	i, rc, tmp, num, oldID, port;
	INT32U	offset, saddr, daddr, temp;
	INT16U	flag[SLMANAG/2];
	
	struct FOPInfo ff;
	
	memcpy (&ff, &fop, sizeof(struct FOPInfo));
	
	if (USART1ID == OSPrioCur)
	{
		PortNo = PORT2;
		port = PORT1;
	}
	else
	{
		PortNo = PORT1;
		port = PORT2;
	}
	SysSchedul();
	UsartClose(port);
	UsartClose(PortNo);
	at91_extirq_close (&FIQ_DESC);
	at91_irq_close (TC0_DESC.periph_id);
	at91_irq_close (TC2_DESC.periph_id);		
	at91_irq_close ( WDI_ID );
	dingding = 2;
	if (OSPrioCur)
	{
		oldID = OSPrioCur;
		OSTaskChangePrio(OSPrioCur, HID);
	}


	for (i=0; i<MAXFILENAMELEN; i++)
		pFile->Name[i] = tolower(pFile->Name[i]);
	
	num = Num & FRAMENUM;
	if ((strncmp(fop.MInfo.Name, pFile->Name, MAXFILENAMELEN)) || (num == 0))
	{
		memcpy (fop.MInfo.Name, (INT8U*)pFile->Name, MAXFILENAMELEN);
		
		if (ding)
			ding = FGetManage(flag, SLMANAG/2);

		if (ding)
			ding = FSetADDR(&fop.MInfo, flag, SLMANAG/2);
		
		//不能写入记录
		if (fop.MInfo.Flag == SFRECORD)
			ding = FALSE;
		
		fop.Flag = FOPWRITE;
		fop.Num = 0;
		fop.Ltmp = 0;
		fop.Length = 0;
		flag[fop.MInfo.SAddr] = fop.MInfo.Flag;
		
		if (ding)
			ding = FSetManage(flag, SLMANAG/2);
	}
	
	if (ding)
	{
		if (num == fop.Num)
			offset = fop.MInfo.Addr + fop.Length;
		
		else if (num+1 == fop.Num)	//只能改写上次长度
		{
			fop.Num--;
			fop.Length = fop.Length - fop.Ltmp;
			offset = fop.MInfo.Addr + fop.Length;
			if (num == 0)
			{
				daddr = GetRealSector(fop.MInfo.Addr);
				if (ding)
					ding = FSectorErase(GetFlashNumber(daddr));
				
			}
			else	
			{
				fop.Flag |= FOPRENEW;
				tmp = GetFlashNumber(offset);
				saddr = GetFlashAddr(tmp);
				daddr = GetRealSector(fop.MInfo.Addr);
				temp = offset - saddr;
				if (ding)
					ding = FFlashCpy(daddr, saddr, temp, TRUE);
				if (ding)
					ding = FFlashCpy(saddr, daddr, temp, TRUE);
			}
		}
		else
		{
			ding = FALSE;
		}
	}
		
	if (num == 1)
		dd = FALSE;

	if (ding)
	{
		rc = FlashWrite(FLASH_BASE, offset, pData, Length);
		if (rc == FOPERROR)
		{
			ding = FALSE;
		}
	
		fop.Num++;
		fop.Ltmp = rc;
		fop.Length += rc;
		
		if ((fop.Length > SABSAESIZE) && (fop.MInfo.Flag > SFDAT))
		{
			dd = FALSE;
			tmp = fop.Length / SABSAESIZE;
			if (tmp % 2)
			{
				if ((fop.Flag & FOPNEXT) != FOPNEXT)
				{
					dd = TRUE;
					fop.Flag |= FOPNEXT;
				}
			}
			else
			{
				if ((fop.Flag & FOPNEXT) == FOPNEXT)
				{
					dd = TRUE;
					fop.Flag ^= FOPNEXT;
				}
			}
			
			if (dd)
			{
				tmp += fop.MInfo.SAddr;
				if (ding)
					ding = FGetManage(flag, SLMANAG/2);
				flag[tmp] = SFNEXT;
				if (ding)
					ding = FSetManage(flag, SLMANAG/2);
			}
		}
	}
	
	if (Num & LASTFRAME)
	{
		pFile->Length = fop.Length;
		pFile->CreateTime = 0;
		pFile->Attr = 0x81B6;
		tmp = FCRC(pFile, &fop.MInfo);
		pFile->Crc = tmp;
		//pFile->Crc = *(INT16U*)(pData + Length - 2);	//dingding?
				
		if (ding)
			ding = FSetInfo(pFile, fop.MInfo.SAddr);
		
		memset (&fop, 0, sizeof (struct FOPInfo));
	}

	SysSchedul();
	if (OSPrioCur)
		OSTaskChangePrio(OSPrioCur, oldID);
	
	UsartOpen(port);
	if (ding)
		return (rc);
	else
		return (FOPERROR);
}


/*------------------------------------------------------------------*/
/*函数名称:FRead()													*/
/*函数功能:读取文件到到指定位置									*/
/*输入说明:pData--内容位置;Num--文件第几包;Lenth--此包长度;		*/
/*			pFInfo--文件信息										*/
/*输出说明:读取的长度												*/
/*------------------------------------------------------------------*/
INT16U FRead(INT8U* pData, INT16U Num, INT16U Length, struct FileInfo* pFile)
{
	INT16U	i, rc, len, num, oldID;
	INT32U	offset;
	struct FileInfo file;

	if (OSPrioCur)
	{
		oldID = OSPrioCur;
		OSTaskChangePrio(OSPrioCur, HID);
	}
	memset ((INT8U*)&file, 0, sizeof(struct FileInfo));
	
	for (i=0; i<MAXFILENAMELEN; i++)
		file.Name[i] = tolower(pFile->Name[i]);

	if (strncmp(fop.MInfo.Name, file.Name, MAXFILENAMELEN))
	{
		memcpy (fop.MInfo.Name, (INT8U*)file.Name, MAXFILENAMELEN);
		if (!FGetADDR(&fop.MInfo))
		{
			if (OSPrioCur)
				OSTaskChangePrio(OSPrioCur, oldID);
			return (FOPERROR);
		}
		
		
		fop.Flag = FOPREAD;
		fop.Num = 0;
		fop.Ltmp = 0;
		fop.Length = 0;
		
		if (fop.MInfo.Flag == SFRECORD)
		{
			FGetSamp((void*)&file, (INT16U*)fop.MInfo.Addr, TRUE);
			
		}
		else
		{
			if (!FGetInfo(&file, fop.MInfo.SAddr))
			{
				if (OSPrioCur)
					OSTaskChangePrio(OSPrioCur, oldID);
				return (FOPERROR);
			}
			
			rc = FCRC(&file, &fop.MInfo);
			if (rc != file.Crc)
			{
				if (OSPrioCur)
					OSTaskChangePrio(OSPrioCur, oldID);
				return (FOPERROR);
			}
		}
				
	}
	else
	{
		if (fop.MInfo.Flag == SFRECORD)
		{
			FGetSamp((void*)&file, (INT16U*)fop.MInfo.Addr, TRUE);
		}
		else
		{
			if (!FGetInfo(&file, fop.MInfo.SAddr))
			{
				if (OSPrioCur)
					OSTaskChangePrio(OSPrioCur, oldID);
				return (FOPERROR);
			}
		}
	}
	
	if (Length == 0xFFFF)
		Length = file.Length;	
	if (Length > (file.Length - fop.Length))
		len = file.Length - fop.Length;
	else
		len = Length;
	if (len == 0)
	{
		memset (&fop, 0, sizeof (struct FOPInfo));
		if (OSPrioCur)
			OSTaskChangePrio(OSPrioCur, oldID);
		return (len);
	}
	
	num = Num & 0x7FFF;	
	if (num == fop.Num)
		offset = fop.MInfo.Addr + fop.Length;
	else if (num+1 == fop.Num)
		offset = fop.MInfo.Addr + fop.Length - fop.Ltmp;
	else
	{
		if (OSPrioCur)
			OSTaskChangePrio(OSPrioCur, oldID);
		return (FOPERROR);
	}
	
	if (fop.MInfo.Flag == SFRECORD)
	{
		rc = FReadSamp((INT16U*)fop.MInfo.Addr, offset, pData, len);
	}
	else
		rc = FlashRead(FLASH_BASE, offset, pData, len);
	
	if (rc != len)
	{
		if (OSPrioCur)
			OSTaskChangePrio(OSPrioCur, oldID);
		return (FOPERROR);
	}
	
	fop.Num++;
	fop.Ltmp = rc;
	fop.Length += rc;

	if (fop.Length >= file.Length)
		memset (&fop, 0, sizeof (struct FOPInfo));
		
	if (OSPrioCur)
		OSTaskChangePrio(OSPrioCur, oldID);
	return (rc);	
}

/*------------------------------------------------------------------*/
/*函数名称:FDelete()												*/
/*函数功能:文件删除		 										*/
/*输入说明:输入文件名												*/
/*输出说明:删除成功输出TRUE										*/
/*------------------------------------------------------------------*/
BOOL FDelete(struct FileInfo* pFile)
{
	BOOL	flag = FALSE, dd = TRUE;
	INT16U	i, j, rc, oldID, port;
	INT16U	tmp[SLMANAG/2];
	struct FileInfo info;

	if (USART1ID == OSPrioCur)
	{
		PortNo = PORT2;
		port = PORT1;
	}
	else
	{
		PortNo = PORT1;
		port = PORT2;
	}
	SysSchedul();
	UsartClose(port);

⌨️ 快捷键说明

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