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

📄 9311fop.c

📁 详细介绍了arm7-at91r40008,的开发全过程
💻 C
📖 第 1 页 / 共 3 页
字号:
/*函数功能:重新分配参数扇区										*/
/*输入说明:														*/
/*输出说明:成功后返回新的扇区号,失败返回0xFFFF					*/
/*------------------------------------------------------------------*/
INT16U FAnewSector(INT16U* Flag, INT16U Cur)
{
	BOOL	dd;
	INT16U	i, rc, k, tmp;
	INT16U	fold[SLMANAG/2], fnew[SLMANAG/2];
	INT32U	offset, daddr, saddr, da, sa;

	memcpy (fold, Flag, SLMANAG);
	rc = 0;
	for (i=0; i<SLALLNUM; i++)
	{
		if (fold[i] == SFINVALID)
			rc++;
	}
	if (rc < SLBSAENUM)		//小于一个扇区失败
	{
		rc = 0;
		for (i=0; i<SLALLNUM; i++)
		{
			if (fold[i+SLALLNUM] == SFINVALID)
				rc++;
		}
		if (rc < SLBSAENUM)
			return (Cur);		
	}
	
	if (rc >= SLBSAENUM)	//参数
	{
		rc = 0;
		saddr = GetRealSector(SACFG);
		daddr = GetRealSector(SATEMP);
		offset = GetRealSector(SATMP);
		tmp = SLANEW/SLBSAENUM + 1;
		for (i=0; i<tmp; i++)
		{
			dd = FSectorErase(GetFlashNumber(daddr) + i);
			if (!dd)
			{
				return (FOPERROR);
			}
		}

		dd = FSectorErase(GetFlashNumber(offset));
		if (!dd)
		{
			return (FOPERROR);
		}

		for (i=0; i<SLALLNUM; i++)
		{
			if (fold[i] == SFERROR)
			{
				fnew[i] = SFERROR;

			}
			else if (fold[i] == SFINVALID)
			{

			}
			else if (fold[i] == SFNOUSE)
			{

			}
			else
			{
				while (fnew[rc] == SFERROR)
				{
					rc++;
					if (rc >= SLMANAG/2)
					{
						return (FOPERROR);
					}
				}
				
				da = offset + rc * SLFINFO;
				sa = GetRealSector(SAFINFO) + i * SLFINFO;
				dd = FFlashCpy(da, sa, SLFINFO, FALSE);
				if (!dd)
				{
					return (FOPERROR);
				}
			
				sa = saddr + i * SABSAESIZE;
				da = daddr + rc * SABSAESIZE;
				dd = FFlashCpy(da, sa, SABSAESIZE, FALSE);
				if(!dd)
				{
					return (FOPERROR);
				}
	
				fnew[rc] = fold[i];
				rc++;
			}
			
		}

		tmp = rc/SLBSAENUM + 1;
		for (i=0; i<tmp; i++)
		{
			sa = daddr + i * SBIGSIZE;
			da = saddr + i * SBIGSIZE;
			dd = FFlashCpy(da, sa, SBIGSIZE, TRUE);					
			if(!dd)
			{
				return (FOPERROR);
			}
		}
		
		for (; i<(SLCFG/SBIGSIZE); i++)
			FSectorErase(GetFlashNumber(SACFG + i * SBIGSIZE));
		
		k = rc;
		for (; rc<SLALLNUM; rc++)
			fnew[rc] = SFNOUSE;
	}
	else
	{
		da = GetRealSector(SATMP);
		sa = GetRealSector(SAFINFO);
		
		dd = FSectorErase(GetFlashNumber(da));
		if (!dd)
			return (FOPERROR);
			
		dd = FFlashCpy(da, sa, SLFINFO * SLALLNUM, FALSE);
		if (!dd)
			return (FOPERROR);
			
		for (rc=0; rc<SLALLNUM; rc++)
			fnew[rc] = fold[rc];
	}
	
	//程序
	for (i=SLALLNUM; i<SLMANAG/2; i++)
	{
		if (fold[i] == SFINVALID)
			continue;
		if (fold[i] != SFNOUSE)
		{
			daddr = GetRealSector(SATMP) + rc * SLFINFO;
			saddr = GetRealSector(SAFINFO) + i * SLFINFO;
			dd = FFlashCpy(daddr, saddr, SLFINFO, FALSE);
			if (!dd)
				return (FOPERROR);
			fnew[rc] = fold[i];
			rc++;
		}
		if (Cur >= SLALLNUM)
			k = rc;
	}
	
	for (; rc<SLMANAG/2; rc++)
		fnew[rc] = SFNOUSE;
	
	saddr = GetRealSector(SATMP);
	daddr = GetRealSector(SAFINFO);
	dd = FFlashCpy(daddr, saddr, SLITTERSIZE, TRUE);
	if (!dd)
		return (FOPERROR);	
	
	dd = FSetManage(fnew, SLMANAG/2);
	if (!dd)
		return (FOPERROR);	
	
	memcpy (Flag, fnew, SLMANAG);
	return (k);
}

/*------------------------------------------------------------------*/
/*函数名称:GetManage()												*/
/*函数功能:获得管理内容											*/
/*输入说明:														*/
/*输出说明:														*/
/*------------------------------------------------------------------*/
BOOL FGetManage(INT16U* SFlag, INT16U Len)
{
	INT16U	i, rc, size;
	INT32U	offset;
	
	size = SLITTERSIZE / SLMANAG;
	offset = GetRealSector(SAMANAG);
	rc = FlashRead(FLASH_BASE, offset, (INT8U*)SFlag, size * sizeof (INT16U));
	if (rc != size * sizeof (INT16U))
		return (FALSE);
	for (i=0; i<size; i++)
		if (SFlag[i] == SFNOUSE)
			break;
	
	size = Len * sizeof (INT16U);
	offset = offset + i * SLMANAG;
	rc = FlashRead(FLASH_BASE, offset, (INT8U*)SFlag, size);
	if (rc != size)
		return (FALSE);
	
	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:SetManage()												*/
/*函数功能:更新管理内容											*/
/*输入说明:														*/
/*输出说明:														*/
/*------------------------------------------------------------------*/
BOOL FSetManage(INT16U* SFlag, INT16U Len)
{
	BOOL	dd;
	INT16U	i, rc, size;
	INT32U	offset, addr;
	INT16U	tmp[SLALLNUM];
	
	addr = GetRealSector(SAMANAG);
	size = SLITTERSIZE / SLMANAG;
	rc = FlashRead(FLASH_BASE, addr, (INT8U*)tmp, size * sizeof (INT16U));
	if (rc != size * sizeof (INT16U))
		return (FALSE);
	for (i=0; i<size; i++)
		if (tmp[i] == SFNOUSE)
		{
			i++;
			break;
		}

	if (i == size)
	{
		rc = GetFlashNumber(addr);
		if (!FSectorErase(rc))
		{
			return (FALSE);
		}
		else
			dd = FSectorErase(rc);
		if (dd)
			i = 1;
		else
			return (FALSE);
	}
	
	offset = addr + (i-1) * sizeof(INT16U);

	rc = FlashWrite(FLASH_BASE, offset, (INT8U*)&i, sizeof(INT16U));
	if (rc != sizeof(INT16U))
		return (FALSE);

	size = Len * sizeof (INT16U);
	offset = addr + i * SLMANAG;

	rc = FlashWrite(FLASH_BASE, offset, (INT8U*)SFlag, size);
	if (rc != size)
		return (FALSE);


	return (TRUE);
}
/*------------------------------------------------------------------*/
/*函数名称:FFlashCpy()												*/
/*函数功能:执行扇区内容复制										*/
/*输入说明:Flag--TRUE将清除原地址、目地址内容所在的扇区			*/
/*输出说明:														*/
/*------------------------------------------------------------------*/
BOOL FFlashCpy(INT32U Daddr, INT32U Saddr, INT32U Count, BOOL Flag)
{
	BOOL	dd;
	INT16U	ss, ds;
	INT32U	len;

	ss = GetFlashNumber(Saddr);
	ds = GetFlashNumber(Daddr);
	
	SysSchedul();
	if (Flag)
	{
		dd = FSectorErase(ds);
		if (!dd)
			return (FALSE);
	}
	
	len = FlashCpy(Daddr, Saddr, Count);
	if (len != Count)
		return (FALSE);

	if (Flag)
	{
		dd = FSectorErase(ss);
		if (!dd)
			return (FALSE);
	}
	
	SysSchedul();
	return (TRUE);
}

/*------------------------------------------------------------------*/
/*函数名称:FSectorErase()											*/
/*函数功能:扇区擦除												*/
/*输入说明:														*/
/*输出说明:														*/
/*------------------------------------------------------------------*/
BOOL FSectorErase(INT16U Sector)
{
	BOOL dd;
	
	SysSchedul();
	dd = FlashErase(FLASH_BASE, Sector);
	SysSchedul();
	return (dd);
}


/*------------------------------------------------------------------*/
/*函数名称:GetFlashNumber()										*/
/*函数功能:根据地址获得扇区号										*/
/*输入说明:														*/
/*输出说明:														*/
/*------------------------------------------------------------------*/
INT16U GetFlashNumber(INT32U Addr)
{
	INT16U	rc;
	
	if (Addr < SABOOT2)
		rc = Addr / 0x2000;
	else
		rc = Addr / 0x10000 + 7;
	
	return (rc);
}

/*------------------------------------------------------------------*/
/*函数名称:GetFlashAddr()											*/
/*函数功能:根据扇区号获得地址										*/
/*输入说明:														*/
/*输出说明:														*/
/*------------------------------------------------------------------*/
INT32U GetFlashAddr(INT16U Number)
{
	INT32U	rc;
	if (Number < 8)
		rc = Number * 0x2000;
	else
		rc = (Number - 7) * 0x10000;
	
	return (rc);
}

/*------------------------------------------------------------------*/
/*函数名称:GetRealSector()											*/
/*函数功能:获得存储地址											*/
/*输入说明:														*/
/*输出说明:														*/
/*------------------------------------------------------------------*/
INT32U	GetRealSector(INT32U Addr)
{
	return (Addr);
}


/*------------------------------------------------------------------*/
/*函数名称:FGetSamp()												*/
/*函数功能:获得采样文件信息										*/
/*输入说明:														*/
/*输出说明:														*/
/*------------------------------------------------------------------*/
INT8U FGetSamp(void* pData, INT16U Attr[3], BOOL Flag)
{
	INT8U	i, j, k, rc, size;
	char *name[6] = {"ua", "uc", "ia", "ib", "ic", "io"};
	struct SysTime_t time;
	struct FileInfo	list;
	struct LBInfo_t	lb;
	struct DBInfo	info;

	size = sizeof (struct FileInfo);

	if (Flag)
	{
		memcpy ((INT8U*)&list, pData, size);
		rc = FClass(list.Name);
		if (rc == SFRECORD)
		{
			for (i=1; i<6; i++)
			{
				if (!strncmp(list.Name+i, "fd", 2))
				{
					j = i;
					break;
				}
			}
			if (6 == i)
				return (0);
			
			Attr[0] = list.Name[j+2] - 48 - 1;	
			Attr[1] = list.Name[j-1] - 48;
			for (i=0; i<6; i++)
			{
				if (!strncmp(list.Name+j+3, name[i], 2))
				{
					Attr[2] = LBDATAUA + i;
				}	
			}
		}
		else
		{
			return (0);			
		}
	}
	
	info.Type = LBINFO;
	info.Num = 0;
	rc = 0;	
	for (i=0; i<FDNum; i++)
	{
		info.SuperID = i;
		for (j=0; j<LBLIMIT; j++)
		{
			info.DevID = j;
			if (Flag)
			{
				if ((i != Attr[0]) || (j != Attr[1]))
					continue;
			}
			DBRead((INT8U*)&lb, &info);
			if (info.Num != 0)
			{
				TimeChange((void*)&time, SYSTIME, (void*)&lb.Time, ABSTIME);
				time.Year = time.Year % 100;
				
				for (k=0; k<ADNUM; k++)
				{
					if ((lb.Flag>>k) & 0x01)
					{
						sprintf(list.Name, "%01dfd%01d%02s_%02d-%02d-%02d_%02d-%02d-%02d-%03d.rec", j, (i+1), name[k], (INT8U)time.Year, time.Month, time.Day, time.Hour, time.Minute, time.Second, time.MSecond);	
						list.Length = lb.Length * 2;
						list.Attr = 0x81B6;
					
						if (Flag)
						{
							if ((i != Attr[0]) || (j != Attr[1]) || (k != (Attr[2]-LBDATAUA)))
								continue;
						}
						memcpy ((INT8U*)(((struct FileInfo*)pData)+rc), (INT8U*)&list, size);
						rc++;
					}
				} 
			}
			info.Num = 0;
		}
	}

	return (rc);
}

/*------------------------------------------------------------------*/
/*函数名称:FReadSamp()												*/
/*函数功能:读取采样文件内容										*/
/*输入说明:														*/
/*输出说明:														*/
/*------------------------------------------------------------------*/
INT32U FReadSamp(INT16U Attr[3], INT32U Offset, INT8U* pData, INT32U Len)
{
	INT16U	tmp;
	struct DBInfo	info;	
	
	info.SuperID = Attr[0];
	info.DevID = Attr[1];
	info.Type = Attr[2];
	tmp = Offset / 2;
	info.Start = tmp / 32 + ((tmp % 32)<<8);
	tmp = Len / 2;
	info.Num = tmp / 32 + ((tmp % 32)<<8);
	
	if (DBRead(pData, &info))
		return (tmp * 2);
	else
		return (0);
}

/*------------------------------------------------------------------*/
/*函数名称:FDelSamp()												*/
/*函数功能:删除采样文件											*/
/*输入说明:														*/
/*输出说明:														*/
/*------------------------------------------------------------------*/
BOOL FDelSamp(INT16U Attr[3])
{
	BOOL rc = FALSE;
	INT16U	tmp;
	struct LBInfo_t	lb;
	struct DBInfo	info;	
	
	info.SuperID = Attr[0];
	info.DevID = Attr[1];
	info.Type = LBINFO;
	info.Num = 0;
	
	DBRead((INT8U*)&lb, &info);
	if (info.Num != 0)
	{
		tmp = Attr[2] - LBDATAUA;
		tmp = 0xFFFF ^ (0x01<<tmp);
		lb.Flag &= tmp;
		info.Start = 0xFFFF;
		rc = DBWrite((INT8U*)&lb, &info);
	}		
	
	return (rc);	
}




⌨️ 快捷键说明

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