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

📄 9311fop.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 3 页
字号:
	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]);

	rc = FClass(pFile->Name);
	
	//录波
	if (rc == SFRECORD)
	{
		rc = FGetSamp((void*)pFile, tmp, TRUE);
		if (rc)
			dd = FDelSamp(tmp);
		
		if (OSPrioCur)
			OSTaskChangePrio(OSPrioCur, oldID);	
		UsartOpen(port);

		return (dd);
	}
	
	dd = FGetManage(tmp, SLMANAG/2);

	for (i=0; i<SLMANAG/2; i++)
	{
		if (!dd)
			break;
			
		if ((tmp[i] == SFINVALID) || (tmp[i] == SFERROR) || (tmp[i] == SFNOUSE))
			continue;
		
    	if (tmp[i] == rc)
    	{
			dd = FGetInfo(&info, i);
			if (!strncmp(info.Name, pFile->Name, MAXFILENAMELEN))
			{
				if (rc < SFDAT)	//不能删除系统文件
				{
					dd = TRUE;
					if (OSPrioCur)
						OSTaskChangePrio(OSPrioCur, oldID);	
					UsartOpen(port);
					return (dd);
				}
											
				flag = TRUE;
				tmp[i] = SFINVALID;
				for (j=i+1; j<SLALLNUM; j++)
				{
					if (tmp[j] == SFNEXT)
						tmp[j] = SFINVALID;
					else if (tmp[j] == SFERROR)
						continue;
					else
						break;
				}
			}
		}
	}

	
	if (dd)
	{
		dd = FSetManage(tmp, SLMANAG/2);
	}
	
	if (OSPrioCur)
		OSTaskChangePrio(OSPrioCur, oldID);	
	UsartOpen(port);
	return (dd);
}


/*------------------------------------------------------------------*/
/*函数名称:FDeleteAll()											*/
/*函数功能:删除所有参数文件										*/
/*输入说明:														*/
/*输出说明:删除成功输出TRUE										*/
/*------------------------------------------------------------------*/
BOOL FDeleteAll(void)
{
/*	UCHAR	tmp;
	USHORT	i, j, rc;
	USHORT	fold[SLMANAG/2], fnew[SLMANAG/2];
	struct FileInfo info[5];
	
	if (!FGetManage(fold, SLMANAG/2))
		return (FALSE);
	
	for (i=0; i<SLALLNUM; i++)
		fnew[i] = SFNOUSE;
	rc = 0;
	for (i=SLALLNUM; i<SLMANAG/2; i++)
	{
		if ((fold[i] == SFBOOT1) || (fold[i] == SFBOOT2) ||(fold[i] == SFPROG) || (fold[i] == SFYCPARA))
		{
			if (!FGetInfo(&info[rc], i))
				return (FALSE);
			if (info[rc].Length != 0xFFFFFFFF)
			{
				fnew[SLALLNUM + rc] = fold[i];
				rc++;
			}
		}
	}
	
	i = GetFlashNumber(GetRealSector(SAMANAG));
	tmp = FlashErase(FLASH_BASE, i);
	if (!tmp)
		return (FALSE);
	i = GetFlashNumber(GetRealSector(SAFINFO));
	tmp = FlashErase(FLASH_BASE, i);
	if (!tmp)
		return (FALSE);	
	i = GetFlashNumber(GetRealSector(SACFG));
	for (j=0; j<4; j++)
	{
		if (!FlashErase(FLASH_BASE, (i+j)))
			return (FALSE);
	}
	
	for (i=0; i<rc; i++)
	{
		if (!FSetInfo(&info[i], i+SLALLNUM))
			return (FALSE);
	}
	for (i=SLALLNUM+rc; i<SLMANAG/2; i++)
		fnew[i] = SFNOUSE;
	
	if (!FSetManage(fnew, SLMANAG/2))
		return (FALSE);
*/	
	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:FCRC()													*/
/*函数功能:文件校验												*/
/*输入说明:														*/
/*输出说明:TRUE--校验正确;FALSE--错误								*/
/*------------------------------------------------------------------*/
INT16U FCRC(struct FileInfo* pFile, struct FMemInfo* pMem)
{
	INT16U	crc;
	
	crc = WHCRC16((INT8U*)(FLASH_BASE + fop.MInfo.Addr), pFile->Length);
	return (crc);
}

/*------------------------------------------------------------------*/
/*函数名称:FSetADDR()												*/
/*函数功能:输入文件名申请文件存储信息								*/
/*输入说明:结构中的文件名											*/
/*输出说明:修改文件管理区,并写入结构中的其他信息					*/
/*------------------------------------------------------------------*/
BOOL FSetADDR(struct FMemInfo* pMInfo, INT16U* SFlag, INT16U Len)
{
	BOOL	dd = FALSE;
	INT16U	i, j, k, saddr;
	struct FileInfo info;
	
	pMInfo->Flag = FClass(pMInfo->Name);

	
	//清除以前信息
	for (i=0; i<Len; i++)
	{
		if (SFlag[i] == pMInfo->Flag)
		{
			if (i >= SLALLNUM)
			{
				SFlag[i] = SFINVALID;
				break;
			}
			else if (FGetInfo(&info, i))
			{
				if (!strncmp(info.Name, pMInfo->Name, MAXFILENAMELEN))
				{
					SFlag[i] = SFINVALID;
					for (j=i+1; j<Len; j++)
					{
						if (SFlag[j] == SFNEXT)
							SFlag[j] = SFINVALID;
						else if (SFlag[j] == SFERROR)
							continue;
						else
							break;
					}
				}
			}
		}
	}
	
	//申请
	if (pMInfo->Flag < SFDAT)	//程序区
	{
		switch (pMInfo->Flag)
		{
			case SFBOOT1:
				pMInfo->Addr = SABOOT;

				dd = FSectorErase(0);
				if (!dd)
					return (FALSE);
				break;
				
			case SFBOOT2:
				pMInfo->Addr = GetRealSector(SABOOT2);
				
				k = GetFlashNumber(pMInfo->Addr);
				j = SLBOOT2 / SBIGSIZE;
				for (i=0; i<j; i++)
				{
					dd = FSectorErase(k+i);
					if (!dd)
						return (FALSE);
				}
				break;
				
			case SFPROG:
				pMInfo->Addr = GetRealSector(SAPROG);

				#ifndef BOOT_PROG
					KillProg(RESET_DD, RESET_CLR, TRUE);
					return (FALSE);
				#endif
				
				k = GetFlashNumber(pMInfo->Addr);
				j = SLPROG / SBIGSIZE;
				for (i=0; i<j; i++)
				{
					dd = FSectorErase(k+i);
					if (!dd)
						return (FALSE);
				}
				break;
				
			case SFYCPARA:
				pMInfo->Addr = GetRealSector(SAYCPARA);

				k = GetFlashNumber(pMInfo->Addr);
				dd = FSectorErase(k);
				if (!dd)
					return (FALSE);
				break;
		}
		for (i=SLALLNUM; i<Len; i++)
			if (SFlag[i] == SFNOUSE)
			{
				saddr = i;
				break;
			}

		if (saddr >= (SLALLNUM+SLANEW))
		{
//			at91_irq_close ( WDI_ID );
			saddr = FAnewSector(SFlag, saddr);
//			at91_irq_open (WDI_ID, INTWATCHDOG, AIC_SRCTYPE_INT_EDGE_TRIGGERED, Tmr_TickISR);
		}
		
		pMInfo->SAddr = saddr;	
	}
	else	//参数区	
	{
		for (i=0; i<SLALLNUM; i++)
			if (SFlag[i] == SFNOUSE)
			{
				saddr = i;
				break;
			}
				
		if (saddr >= SLANEW)
		{
//			at91_irq_close ( WDI_ID );
			saddr = FAnewSector(SFlag, saddr);
//			at91_irq_open (WDI_ID, INTWATCHDOG, AIC_SRCTYPE_INT_EDGE_TRIGGERED, Tmr_TickISR);
		} 
							
		pMInfo->SAddr = saddr;						
		pMInfo->Addr = GetRealSector(SACFG) + saddr * SABSAESIZE;
	}

	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:FGetADDR()												*/
/*函数功能:根据文件名获取文件存储信息								*/
/*输入说明:结构中的文件名											*/
/*输出说明:写入结构中的其他信息									*/
/*------------------------------------------------------------------*/
BOOL FGetADDR(struct FMemInfo* pMInfo)
{
	INT16U	i;
	INT16U	tmp[SLMANAG/2];
	struct FileInfo FInfo;
	
	pMInfo->Flag = FClass(pMInfo->Name);
	
	//录波
	if (pMInfo->Flag == SFRECORD)
	{
		pMInfo->Addr = 0;
		pMInfo->SAddr = 0;
		return (TRUE);
	}
	
	//程序区
	if (pMInfo->Flag < SFDAT)	
	{
		switch (pMInfo->Flag)
		{
			case SFBOOT1:
				pMInfo->Addr = SABOOT;
				break;
			case SFBOOT2:
				pMInfo->Addr = GetRealSector(SABOOT2);
				break;
			case SFPROG:
				pMInfo->Addr = GetRealSector(SAPROG);
				break;
			case SFYCPARA:
				pMInfo->Addr = GetRealSector(SAYCPARA);
				break;
			
		}
		
		if (!FGetManage(tmp, SLMANAG/2))
			return (FALSE);
		for (i=SLALLNUM; i<SLMANAG/2; i++)
			if (tmp[i] == pMInfo->Flag)
			{
				pMInfo->SAddr = i;
				return (TRUE);
			}
	}
	//参数区	
	else
	{
		if (!FGetManage(tmp, SLMANAG/2))
			return (FALSE);
	
		for (i=0; i<SLALLNUM; i++)
		{
			if (tmp[i] == pMInfo->Flag)
				if (FGetInfo(&FInfo, i))
					if (!strncmp(FInfo.Name, pMInfo->Name, MAXFILENAMELEN-1))
					{
						pMInfo->Addr = GetRealSector(SACFG) + i * SABSAESIZE;
						pMInfo->SAddr = i;
						return (TRUE);
					}
		}
	}
	
	return (FALSE);	
}

/*------------------------------------------------------------------*/
/*函数名称:FGetInfo()												*/
/*函数功能:根据扇区地址获取文件信息								*/
/*输入说明:扇区地址												*/
/*输出说明:文件信息,成功返回TRUE									*/
/*------------------------------------------------------------------*/
BOOL FGetInfo(struct FileInfo* pInfo, INT16U SAddr)
{
	INT32U	rc, offset;
	INT8U	tmp[SLFINFO];
	
	if (SAddr >= SLMANAG/2)
		return (FALSE);
		
	offset = GetRealSector(SAFINFO) + SLFINFO * SAddr;
	rc = FlashRead(FLASH_BASE, offset, tmp, SLFINFO);
	if (rc != SLFINFO)
		return (FALSE);
	else if ((tmp[0] == 0xFF) && (tmp[1] == 0xFF) && (tmp[2] == 0xFF))
		return (FALSE);


	memcpy ((INT8U*)pInfo, tmp, sizeof (struct FileInfo));
	return TRUE;
}

/*------------------------------------------------------------------*/
/*函数名称:FSetInfo()												*/
/*函数功能:根据扇区地址写入文件信息								*/
/*输入说明:扇区地址;文件信息										*/
/*输出说明:文件信息,成功返回TRUE									*/
/*------------------------------------------------------------------*/
BOOL FSetInfo(struct FileInfo* pInfo, INT16U SAddr)
{
	INT16U	rc, size;
	INT32U	offset;
	
	if (SAddr >= SLMANAG/2)
		return (FALSE);
		
	offset = GetRealSector(SAFINFO) + SLFINFO * SAddr;
	size = sizeof (struct FileInfo);

	rc = FlashWrite(FLASH_BASE, offset, (INT8U*)pInfo, size);
	if (rc == FOPERROR)
		return (FALSE);

	if (rc != size)
		return (FALSE);	

	return TRUE;
}

/*------------------------------------------------------------------*/
/*函数名称:FClass()												*/
/*函数功能:根据文件名获取文件类型,同时将文件名转化为小写			*/
/*输入说明:结构中的文件名											*/
/*输出说明:文件类型												*/
/*------------------------------------------------------------------*/
INT16U FClass(char *name)
{
	INT16U	i, len;
	INT16U	dotpos = MAXFILENAMELEN;
	char filename[MAXFILENAMELEN];
	
	len = strlen(name);
	for (i=0; i<len; i++)
	{
		filename[i] = tolower(name[i]);
		if (filename[i] == '.')
			dotpos = i;
	}
	filename[len] = '\0';
	memcpy (name, filename, len+1);
	
	if ((dotpos<MAXFILENAMELEN-2) && (dotpos>0))
	{
		if (!strncmp(filename+dotpos+1, "dal", 3))
		{
			
			return (SFDAL);
		}
		if (!strncmp(filename+dotpos+1, "dar", 3))
		{
			
			return (SFDAR);
		}
		if (!strncmp(filename+dotpos+1, "dat", 3))
		{
			if (!strncmp(filename, "dzfd", 4))
			{
				if (!strncmp(filename, "dzfd1.dat", 9))
					return (SFFD1);
				if (!strncmp(filename, "dzfd2.dat", 9))
					return (SFFD2);
				return (SFDZFD);
			}
			if (!strncmp(filename, "c0", 2))
			{
				if (!strncmp(filename, "c0001.dat", 9))
					return (SFC01);
				if (!strncmp(filename, "c0002.dat", 9))
					return (SFC02);
				if (!strncmp(filename, "c0041.dat", 9))
					return (SFC41);
				if (!strncmp(filename, "c0042.dat", 9))
					return (SFC42);				
				return (SFC);
			}
			if (!strncmp(filename, "myconfig.dat", 12))
				return (SFCFG);
			if (!strncmp(filename, "ports.dat", 9))
				return (SFPORT);
			if (!strncmp(filename, "devices.dat", 11))
				return (SFDEV);
			if (!strncmp(filename, "iptable.dat", 11))
				return (SFIPTBL);
				
			return (SFDAT);
		}
		if (!strncmp(filename+dotpos+1, "bin", 3))
		{
			if (!strncmp(filename, "bios", 4))
				return (SFBOOT1);
			if (!strncmp(filename, "boot", 4))			
				return (SFBOOT2);
			if (!strncmp(filename, "rom", 3))
				return (SFPROG);
		}
		if (!strncmp(filename+dotpos+1, "sys", 3))
		{
			if (!strncmp(filename, "ycpara", 6))
				return (SFYCPARA);
		}
		//故障录波文件
		if (!strncmp(filename+dotpos+1, "rec", 3))
		{
			return (SFRECORD);
		}
		
		return (SFOTHER);
	}
	
	return (SFOTHER);
}

/*------------------------------------------------------------------*/
/*函数名称:FAnewSector()											*/

⌨️ 快捷键说明

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