📄 9311fop.c
字号:
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 + -