📄 api32.c
字号:
#include "Api32.h"
/*OpenFile32()、GetDirInfo32()、DownDir32()改长文件名寻址,List32()从UNICODE编码中单提取字符*/
/**************************************定义全局变量*************************************/
extern struct FILEINFO FileInfo;
extern uint32 DirStartCluster32, NowCluster32, NowSector;
extern uint8 DBUF[512];
extern SFATBPBINFO DeviceInfo;
extern SFILEINFO ThisFile;
extern SUDEV uDev;
extern SFLAGS bFlags;
uint8 str2Name(uint8 * nam, uint8 * str)
{
uint8 * cp;
uint32 i, space;
space = 8;
cp = str;
while (*cp != 0)
{
if (*cp >= 'a' && *cp <= 'z' )
{
*cp -= 'a' - 'A';
}
cp++;
}
cp = str;
for(i = 0; i < 9; i++)
{
/*if(*cp == 0)
{
return 1;
}*/
nam[i] = *cp++;
if(*cp == '.')
{
i++;
break;
}
space --;
}
do
{
nam[i++] = 0x20;
space --;
}while(space != 0);
i = 8;
while(*++cp != 0)
{
nam[i++] = *cp;
}
return 1;
}
/****************************************************************************************/
uint8 CreateDir32(uint8 *pName, uint8 * RiliShizhong)
{
uint8 pLongEntName[256];/* 记录长文件名目录项 */
uint8 pBuffer[32]; /* 记录短文件名目录项 */
uint8 * CreatTime;
uint32 sector, cnum;
uint32 i, j, len, bwrite;
uint32 bstop = 0, InByte = 0, DirEntCount, sum;
uint32 ClusterPointer;
CreatTime = RiliShizhong;
MakeShortEntry(pName, pBuffer, 1, CreatTime);
sum = ChkSum(pBuffer);
len = MakeLongEntry(pLongEntName, pName, sum);
if((len % 32) != 0)
return FALSE;
if((len + 32) > DeviceInfo.BPB_BytesPerSec)
return FALSE;
ThisFile.bFileOpen = 0;
ThisFile.FatSectorPointer = 0;
cnum = GetFreeClusterNum32();/* 获取空簇、即目录首簇 */
if(cnum < 0x02)
return FALSE;
ClrACluster(cnum);
pBuffer[11] = 0x10;
pBuffer[21] = (uint8)(cnum >> 24);
pBuffer[20] = (uint8)(cnum >> 16);
pBuffer[27] = (uint8)(cnum >> 8);
pBuffer[26] = (uint8)(cnum);
pBuffer[28] = 0;pBuffer[29] = 0;pBuffer[30] = 0;pBuffer[31] = 0;
bstop = 0;
do
{
NowCluster32 = DirStartCluster32;
NowSector = FirstSectorofCluster32(NowCluster32);
ClusterPointer = NowCluster32;
for(sector = 0; sector < DeviceInfo.BPB_SecPerClus; sector++)
{
if(! ReadSector(DBUF, NowSector + sector, 1))
{
return FALSE;
}
DirEntCount = 0;
bwrite = 0;
for(i=0; i < DeviceInfo.BPB_BytesPerSec; i += 32)
{
if(DirEntCount == 0)
{
InByte = i;
}
if(DBUF[i] == 0xE5)
{
DirEntCount++;
}
else if(DBUF[i] == 0x00)
{
DirEntCount++;
DBUF[i] = 0xE5;
bwrite = 1;
}
else
{
DirEntCount = 0;
}
if((DirEntCount * 32) >= (len + 32))
{
for(j = 0; j < len; j++)
{
DBUF[InByte + j] = *((uint8 *)pLongEntName + j);
}
for(j = 0; j < 32; j++)
{
DBUF[InByte + len + j] = *(pBuffer + j);
}
if(! WriteSector(DBUF, (NowSector + sector), 1))
{
return FALSE;
}
bstop = 1;
break;
}
}
if(bstop == 1)
break;
if(/*(len != 0) && */(bwrite == 1))
{
if(! WriteSector(DBUF, NowSector + sector, 1))
return FALSE;
}
}
if(bstop == 1)
break;
NowCluster32 = GetNextClusterNum32(NowCluster32);
if(NowCluster32 > DeviceInfo.TotCluster)
{
NowCluster32 = CreateClusterLink32(ClusterPointer);
if(NowCluster32 == 0x00)
return FALSE;
NowSector = FirstSectorofCluster32(NowCluster32);
for(i = 0; i < DeviceInfo.BPB_BytesPerSec; i++)
{
DBUF[i] = 0x00;
}
for(sector = 0; sector < DeviceInfo.BPB_SecPerClus; sector++)
{
if(!WriteSector(DBUF, NowSector + sector, 1))
{
return FALSE;
}
}
}
DirStartCluster32 = NowCluster32;
}while(NowCluster32 <= DeviceInfo.TotCluster);
if(NowCluster32 > DeviceInfo.TotCluster)
return FALSE;
for(i = 64; i < DeviceInfo.BPB_BytesPerSec; i++)
{
DBUF[i] = 0x00;
}
for(i = 0; i < 43; i++)
{
DBUF[i] = 0x20;
}
DBUF[0] = 0x2e;/*.目录*/
for(i =11; i < 32; i++)
{
DBUF[i] = pBuffer[i];
}
DBUF[32] = 0x2e;
DBUF[33] = 0x2e;/*..目录*/
for(i = 43; i < 64; i++)
{
DBUF[i] = pBuffer[i-32];
}
if(DirStartCluster32 == DeviceInfo.RootStartCluster) /*Root Dir*/
{
DBUF[53] = 0; DBUF[52] = 0; DBUF[59] = 0; DBUF[58] = 0;
}
else
{
DBUF[53] = (uint8)(DirStartCluster32 >> 24);
DBUF[52] = (uint8)(DirStartCluster32 >> 16);
DBUF[59] = (uint8)(DirStartCluster32 >> 8);
DBUF[58] = (uint8)(DirStartCluster32);
}
NowSector = FirstSectorofCluster32(cnum);
if(! WriteSector(DBUF, NowSector, 1))
return FALSE;
DirStartCluster32 = cnum;/*置该子目录为当前目录*/
ThisFile.ClusterPointer = 0;
return TRUE;
}
uint8 CreateFile32(uint8 *pName, uint8 Mode, uint8 *RiliShizhong)
{
uint8 pLongEntName[256];/* 记录长文件名目录项 */
uint8 pBuffer[32]; /* 记录短文件名目录项 */
uint8 * CreatTime;
uint32 sector, cnum;
uint32 i = 0, j, len, bwrite;
uint32 bstop, InByte = 0, DirEntCount, sum;/* InByte记录目录项开始,不能定义为8位 */
uint32 ClusterPointer;
switch(Mode)
{
case 'c' :
{
RemoveFile32(pName);
break;
}
case 'a' :
{
len = OpenFile32(pName);
if(len > 0 )
{
if(SetFilePointer32(len))
{
return TRUE;
}
}
break;
}
default:
{
break;
}
}
CreatTime = RiliShizhong;
MakeShortEntry(pName, pBuffer, 0, CreatTime);
sum = ChkSum(pBuffer);
len = MakeLongEntry(pLongEntName, pName, sum);
if((len % 32) != 0)
return FALSE;
if((len + 32) > DeviceInfo.BPB_BytesPerSec)
return FALSE;
ThisFile.bFileOpen=0;
/*到第32个文件,先给该文件分配起始簇1F4(1F4为空),建立文件是要再新建簇链,为1F5(填FFFFFFFF)*/
cnum = GetFreeClusterNum32();
if(cnum < 0x02)
return FALSE;
ClrACluster(cnum);
pBuffer[21] = (uint8)(cnum >> 24);
pBuffer[20] = (uint8)(cnum >> 16);
pBuffer[27] = (uint8)(cnum >> 8);
pBuffer[26] = (uint8)(cnum);
pBuffer[28] = 0; pBuffer[29] = 0; pBuffer[30] = 0; pBuffer[31] = 0;
bstop = 0;
/*再次建文件又要新建簇链(基于上次文件的16个簇的基础上)。DirStartCluster32不在循环体内为当前子目录指针3。
所以要把DirStartCluster32的更改放入循环体内,要不每次都会去更该子目录首簇,造成后面部分文件的丢失。2008.3.14*/
do
{
NowCluster32 = DirStartCluster32;
NowSector = FirstSectorofCluster32(NowCluster32);
ClusterPointer = NowCluster32;
for(sector = 0; sector < DeviceInfo.BPB_SecPerClus; sector++)
{
if(! ReadSector(DBUF, NowSector + sector, 1))
return FALSE;
DirEntCount = 0;
bwrite = 0;
for(i=0; i < DeviceInfo.BPB_BytesPerSec; i += 32)
{
if(DirEntCount == 0)
{
InByte = i;
}
if(DBUF[i] == 0xE5)
{
DirEntCount++;
}
else if(DBUF[i] == 0x00)
{
DirEntCount++;
DBUF[i] = 0xE5;
bwrite = 1;
}
else
{
DirEntCount = 0;
}
if((DirEntCount * 32) >= (len + 32))
{
for(j = 0; j < len; j++)
{
DBUF[InByte + j] = pLongEntName[j]/**((uint8 *)pLongEntName + j)*/;
}
for(j = 0; j < 32; j++)
{
DBUF[InByte + len + j] = pBuffer[j]/* *(pBuffer + j)*/;
}
if(! WriteSector(DBUF, (NowSector + sector), 1))
return FALSE;
bstop = 1;
break;
}
}
if(bstop == 1)
{
break;
}
if(/*(len != 0) && */(bwrite == 1))
{
if(! WriteSector(DBUF, NowSector + sector, 1))
return FALSE;
}
}
if(bstop == 1)
break;
/*NowCluster32 = GetNextClusterNum32(NowCluster32);
if(NowCluster32 > DeviceInfo.TotCluster)
{
} */
NowCluster32 = CreateClusterLink32(ClusterPointer);
if(NowCluster32 == 0x00)
{
return FALSE;
}
ClrACluster(NowCluster32);
DirStartCluster32 = NowCluster32;
}while(NowCluster32 <= DeviceInfo.TotCluster);
ThisFile.StartCluster = cnum;
ThisFile.LengthInByte = 0;
ThisFile.ClusterPointer = ThisFile.StartCluster;
ThisFile.SectorPointer = FirstSectorofCluster32(ThisFile.StartCluster);
ThisFile.OffsetofSector = 0;
ThisFile.SectorofCluster = 0;
ThisFile.bFileOpen = 1;
ThisFile.pointer = 0;
ThisFile.FatSectorPointer = 0;
ThisFile.FDTClusterPointer = NowCluster32;
ThisFile.FDTSectorPointer = NowSector + sector;
ThisFile.FDTOffsetOfSector = (InByte + len);
return TRUE;
}
uint8 WriteFile32(uint32 writeLength,uint8 *pBuffer, uint8 *RiliShizhong)
{
/*uint32 , ClusterNum, SectorNum, OtherBytes,*/
uint32 tlen, len, i, InSector;
uint32 bSuccess;
uint16 DirCreatTime, DirCreatDate;
if(! ThisFile.bFileOpen)
{
return FALSE;
}
ThisFile.bFileOpen = 0;
bSuccess = 0;
tlen = 0;
while(writeLength > 0)
{
//----------喂狗--------------
MCF_GPIO_PODR_DATAL|=MCF_GPIO_PODR_DATAL_PODR_DATAL0; //高电平.
_ASMLINE(" NOP ");
_ASMLINE(" NOP ");
MCF_GPIO_PODR_DATAL&=(~MCF_GPIO_PODR_DATAL_PODR_DATAL0); //低电平.
//----------喂狗--------------
if((writeLength + ThisFile.OffsetofSector) > DeviceInfo.BPB_BytesPerSec)
{
len = DeviceInfo.BPB_BytesPerSec;
}
else
{
len = (writeLength + ThisFile.OffsetofSector);
}
if(ThisFile.OffsetofSector > 0)
{
if(ReadSector(DBUF, ThisFile.SectorPointer, 1))
{
len = (len - ThisFile.OffsetofSector);
for(i = 0; i < len; i ++)
{
DBUF[ThisFile.OffsetofSector + i] = *(pBuffer + i);
}
if(! WriteSector(DBUF, ThisFile.SectorPointer, 1))
{
return FALSE;
}
ThisFile.OffsetofSector = (ThisFile.OffsetofSector + len);
}
else
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -