📄 9311fop.c
字号:
/*------------------------------------------------------------------*/
/*模块名称: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 + -