📄 fat.c
字号:
}
else //文件存在就向文件的结尾添加数据
{
if(Time > 0x8000) UpDataFAT(FileSize);//写FAT表
AddToEnd(LastAddr,WriteData,FileSize);
}
UpDataRecord(FileSize);
return;
}
/**********************************************************************************************
**
** 函数名称:WriteFile
**
** 函数功能:向文件中写如数据
**
** 输入参数:文件大小,待写数据
**
** 返 回 值:1--写入成功
**
** 影响参数:暂无
**
** 调用模块:暂无
**
** 说 明:暂无
**
**********************************************************************************************/
BYTE WriteFile(DWORD WriteAddr,DWORD FileSize,BYTE *WriteData)
{
WORD i=0,j=0;
BYTE Buffer[512];
DWORD Len = FileSize,FileSize_OF_Sector = FileSize >> 9;
do
{
Len = FileSize - i*512;
memset(Buffer,0xFF,512);
if(Len >= 512)
{
for(j = 0;j < 512;j++)
{
Buffer[j] = *(WriteData + j + i*512);;
}
}
else
{
for(j = 0;j < Len;j++)
{
Buffer[j] = *(WriteData + j + i*512);;
}
}
mmc_write_block(WriteAddr + i,Buffer);
}while((i++) < FileSize_OF_Sector);
return 1;
}
/**********************************************************************************************
**
** 函数名称:strupr
**
** 函数功能:将字符串里面的字母转换为对应的大写字母
**
** 输入参数:字符串
**
** 返 回 值:转换后的字符串
**
** 影响参数:暂无
**
** 调用模块:暂无
**
** 说 明:FAT16中的字母都以大写的形式存储
**
**********************************************************************************************/
char *strupr(char *Str)
{
char *cp;
cp = Str;
while (*cp != 0)
{
if (*cp >= 'a' && *cp <= 'z' )
{
*cp -= 'a' - 'A';
}
cp++;
}
return Str;
}
/**********************************************************************************************
**
** 函数名称:ChkFileExist
**
** 函数功能:检查文件是否存在
**
** 输入参数:文件名
**
** 返 回 值:0--文件不存在,1--文件存在
**
** 影响参数:暂无
**
** 调用模块:暂无
**
** 说 明:暂无
**
**********************************************************************************************/
BYTE ChkFileExist(BYTE *Name)
{
BYTE i,j,k,Buf1[11],Buf2[11];
BYTE Flag = 0;
for(i=0;i<8;i++)
{
if(*Name != '.' && *Name != '\0')
{
Buf1[i] = *Name;
}
else
{
goto Label;
}
Name++;
Label: Buf1[i+1] = 0x20;
}
for(i=0;i<3;i++)
{
Name++;
if(*Name != 0) Buf1[i+8] = *Name;
else Buf1[i+8] = 0x20;
}
mmc_read_block(RootDir_Start_SecNum);
for(i=0;i<16;i++)
{
k = i << 5;
for(j = k;j < k + 11;j++) Buf2[j - k] = MMCRDData[j];
if(!memcmp(Buf1,Buf2,11))
{
Flag = 1;
break;
}
else
{
Flag = 0;
}
}
return Flag;
}
/**********************************************************************************************
**
** 函数名称:AddToEnd
**
** 函数功能:向文件的结尾添加数据
**
** 输入参数:暂无
**
** 返 回 值:0--添加失败,1--添加成功
**
** 影响参数:暂无
**
** 调用模块:暂无
**
** 说 明:暂无
**
**********************************************************************************************/
void AddToEnd(DWORD Addr,BYTE *buf,DWORD Length)
{
DWORD Temp,Temp1,Temp2,Len;
WORD i,j,k;
mmc_read_block(RootDir_Start_SecNum);
Temp = MMCRDData[60]|(MMCRDData[61] << 8)|(MMCRDData[62] << 16)|(MMCRDData[63] << 24);
Temp += Length;
MMCRDData[60] = (Temp & 0x000000FF) >> 0x00;//文件大小
MMCRDData[61] = (Temp & 0x0000FF00) >> 0x08;
MMCRDData[62] = (Temp & 0x00FF0000) >> 0x10;
MMCRDData[63] = (Temp & 0xFF000000) >> 0x18;
mmc_write_block(RootDir_Start_SecNum,MMCRDData);
Temp1 = Addr / 512;
Temp2 = Addr % 512;
if(Temp2 == 0)
{
WriteFile(Temp1,Length,buf);
}
else
{
mmc_read_block(Temp1);
k=0;
for(i=Temp2;i<512;i++)
{
MMCRDData[i] = *(buf+i-Temp2);
k++;
}
mmc_write_block(Temp1,MMCRDData);
Len = Length - k;
for(i=0;i<Len;i++)
{
*(buf+i) = *(buf+k+i);
}
WriteFile(Temp1+1,Len,buf);
}
return ;
}
/**********************************************************************************************
**
** 函数名称:FindFileEnd
**
** 函数功能:查找文件的结尾
**
** 输入参数:暂无
**
** 返 回 值:查找到的地址
**
** 影响参数:暂无
**
** 调用模块:暂无
**
** 说 明:暂无
**
**********************************************************************************************/
DWORD FindFileEnd()
{
DWORD FileDataEndAddr = 0;
/* for(i=0;;i++)
{
mmc_read_block(FileDataStartAddr+i);
for(j=0;j<512;j++)
{
if((MMCRDData[j] == 0xFF && MMCRDData[j+1] == 0xFF) || (MMCRDData[j] == 0x00 && MMCRDData[j+1] == 0x00))
{
FileDataEndAddr = j + ((FileDataStartAddr + i) << 9);
return FileDataEndAddr;
}
}
}*/
mmc_read_block(TotalSector-1);
FileDataEndAddr = MMCRDData[4]|(MMCRDData[5] << 8)|(MMCRDData[6] << 16)|(MMCRDData[7] << 24);
if(FileDataEndAddr == 0)
return (Data_Start_SecNum << 9);
else
return FileDataEndAddr;
}
/**********************************************************************************************
**
** 函数名称:GetRecord
**
** 函数功能:获取向MMC中写的次数
**
** 输入参数:暂无
**
** 返 回 值:记录的次数
**
** 影响参数:暂无
**
** 调用模块:暂无
**
** 说 明:根据记录的次数决定是否需要写FAT表,最后一个扇区的0-3字节记录该数据
**
**********************************************************************************************/
DWORD GetRecord(void)
{
DWORD Rt = 0;
mmc_read_block(TotalSector-1);
Rt = MMCRDData[0]|(MMCRDData[1] << 8)|(MMCRDData[2] << 16 )|(MMCRDData[3] << 24);
return Rt;
}
/**********************************************************************************************
**
** 函数名称:UpDataRecord
**
** 函数功能:获取向MMC中写的次数
**
** 输入参数:暂无
**
** 返 回 值:暂无
**
** 影响参数:暂无
**
** 调用模块:暂无
**
** 说 明:更新最后一个扇区的0-3字节记录该数据
**
**********************************************************************************************/
void UpDataRecord(DWORD FileLength)
{
DWORD Temp1 = 0,Temp2 = 0;
mmc_read_block(TotalSector-1);
Temp1 = MMCRDData[0]|(MMCRDData[1] << 8)|(MMCRDData[2] << 16 )|(MMCRDData[3] << 24);
Temp1 ++;
MMCRDData[0] = (Temp1 & 0x000000FF) >> 0x00;
MMCRDData[1] = (Temp1 & 0x0000FF00) >> 0x08;
MMCRDData[2] = (Temp1 & 0x00FF0000) >> 0x10;
MMCRDData[3] = (Temp1 & 0xFF000000) >> 0x18;
Temp2 = MMCRDData[4]|(MMCRDData[5] << 8)|(MMCRDData[6] << 16 )|(MMCRDData[7] << 24);
if(Temp2 == 0) Temp2 = (Data_Start_SecNum << 9) + FileLength;
else Temp2 += FileLength;
MMCRDData[4] = (Temp2 & 0x000000FF) >> 0x00;
MMCRDData[5] = (Temp2 & 0x0000FF00) >> 0x08;
MMCRDData[6] = (Temp2 & 0x00FF0000) >> 0x10;
MMCRDData[7] = (Temp2 & 0xFF000000) >> 0x18;
mmc_write_block(TotalSector-1,MMCRDData);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -