📄 file.c
字号:
//****************************************************************************************
//** 文件名:File.c
//** Copyright (c) 2002 Hard&SoftMcuStudio
//** 创建人:Hard&SoftMcuStudio
//** 日期:2002.06.27
//** 描述:Flash file systems
//**
//** 版本:1.0
//**************************************************************************************
#include <string.h>
#include "file.h"
INT8U aucHZK[267616];
INT8U aucEK[4096];
//Nand Flash Operation Routine
INT8U Erase_Block(INT32U ulBlock);
void ReadPage(INT32U ulBlock,INT32U ulPage,INT8U *pucPageBuf);
INT8U WritePage(INT32U ulBlock,INT32U ulPage,INT8U *pucPageBuf);
INT32U seek_blank_block(INT32U StartBlock);
void creat_file(INT8U *pucFileInfo);
void close_file(void);
void write_file(INT8U ucEndFlag,INT8U *pucBlockBuf);
INT32U find_file(INT8U *pucFileInfo);
INT32U comp_filename(INT8U *pucString1,INT8U *pucString2);
INT8U read_file(INT8U *pucBlockBuf,INT32 lByteNum);
static void LoadFont(void);
/*Download and format is OK!*/
/***************************************************************/
/* FAT表说明 */
/*(1)KM29U128T 共有1024个Block/Cluster,1Block=32Page */
/* 或 1Cluster=32Sector */
/*(2)1Page/Sector=512B,1Block/Cluster=16KB */
/* 因此共有空间1024*16KB=16MB */
/*(3)RootDir信息占用Block0,用户数据存放于Block1~1023 */
/* 可用空间共为1023*32=32736Sector=15.98MB */
/*(4)FAT信息存放在每个Block的首页(Page)的独立区,该区共有16Bytes*/
/* 这16Bytes的含义如下: */
/* Offset[0]->该Block的使用情况 */
/* 0xFF :unused Block */
/* 0x00 :bad Block */
/* 0x01~0xFE:used Block */
/* Offset[ 1~ 7]->保留字节(对其中的数据无任何要求) */
/* Offset[ 8~11]->Pre Block(MSB) */
/* 若当前Block是FirstBlock,则该值为其本身 */
/* Offset[12~15]->Next Block(MSB) */
/* 若当前块为LastBlock,则该值为0xFFFF */
/***************************************************************/
/* Root Directory 记录格式 */
/* Offset[ 0~10]->file name */
/* Offset[11~25]->file attribute */
/* Offset[26~27]->file starting cluster(LSB) */
/* Offset[28~31]->file size in byte(LSB) */
/*暂存Root Directory数据,每条记录为32Byte,因此共可有512条记录*/
INT8U root_buf[512][32];
INT32U pre_block;
INT32U current_block;
INT8U Block_1Page_Buf[528]; //Block首页Buffer
INT8U Page_Buf[528];
//------------------------------------------------------------------
// 函数名:INT32U Seek_blank_block(void)
// 输 入: 开始Block号
// 输 出: 空的Block号
// 功能描述:寻找介于StartBlock与EndBlock之间的第一个Blank Block
// 全局变量:Block_1Page_Buf
//------------------------------------------------------------------
INT32U seek_blank_block(INT32U StartBlock)
{
INT32U ulBlockNum;
ulBlockNum=StartBlock;
ReadPage(ulBlockNum,0,Block_1Page_Buf);
while(Block_1Page_Buf[512]!=UNUSED_MARK)
ReadPage(++ulBlockNum,0,Block_1Page_Buf);
return(ulBlockNum);
}
//------------------------------------------------------------------
// 函数名:void creat_file(INT8U *pucFileInfo)
// 输 入: INT8U *pucFileInfo --包含文件名和文件长度
// 输 出: Null
// 功能描述:将Root Directory数据读入root_buf[],并在root_buf中修改之
// 全局变量:root_buf
//------------------------------------------------------------------
void creat_file(INT8U *pucFileInfo)
{
INT32U ulPageNum,Pointer,i;
for(ulPageNum=0;ulPageNum<32;ulPageNum++)
{
/*将Root information读到root_buf中*/
ReadPage(Root_Cluster,ulPageNum,Page_Buf);
for(Pointer=0;Pointer<512;Pointer++)
{
root_buf[ulPageNum*16+Pointer/32][Pointer%32]=Page_Buf[Pointer];
}
}
/*在root_buf寻找空表项*/
Pointer=0;
while(root_buf[Pointer][0]!=0x00)
{
Pointer++;
}
/*copy the file name and file size*/
for(i=0;i<32;i++)
root_buf[Pointer][i]= *pucFileInfo++;
current_block=seek_blank_block(Start_Cluster);
pre_block=current_block;
root_buf[Pointer][26]=(INT8U)(current_block%256); //store LSB
root_buf[Pointer][27]=(INT8U)(current_block/256); //store MSB
// disp_root();
}
//------------------------------------------------------------------
// 函数名:void close_file(void)
// 输 入: Null
// 输 出: Null
// 功能描述:将root_buf中的数据写回Root Directory所处的Block(即Block0)
// 全局变量:Page_Buf
//------------------------------------------------------------------
void close_file(void)
{
INT32U ulPageNum,Pointer;
/*Erase Root_information Cluster*/
Erase_Block(0);
/*将root_buf中的数据逐页写入*/
for(ulPageNum=0;ulPageNum<32;ulPageNum++)
{
for(Pointer=0;Pointer<512;Pointer++)
{
Page_Buf[Pointer]=root_buf[ulPageNum*16+Pointer/32][Pointer%32];
}
/*独立区以0xFF填充*/
for(Pointer=512;Pointer<(512+16);Pointer++)
{
Page_Buf[Pointer]=0xFF;
}
WritePage(Root_Cluster,ulPageNum,&(Page_Buf[0]));
}
}
//------------------------------------------------------------------
// 函数名:void write_file(INT8U ucEndFlag,INT8U *pucBlockBuf)
// 输 入: INT8U ucEndFlag--1 End
// --0 Not End
// INT8U *pucBlockBuf--块buffer
// 输 出: Null
// 功能描述:将pucBlockBuf中的数据写到1个Block中
// 全局变量:Page_Buf, pre_block, current_block
//------------------------------------------------------------------
void write_file(INT8U ucEndFlag,INT8U *pucBlockBuf)
{
INT32U ulNextBlock,ulPageNum,Pointer;
//Uart_Printf("\nWrite data,Current block is:%d",current_block);
if(ucEndFlag) //若为文件的最后一个Block,则LastBlock=0xFFFF
ulNextBlock=LAST_BLOCK;
else
ulNextBlock=seek_blank_block(current_block+1);
//write USED mark//
Page_Buf[512+0]=0x01;
//write pre_block//
Page_Buf[512+8]=0x00;
Page_Buf[512+9]=0x00;
Page_Buf[512+10]=pre_block/256;
Page_Buf[512+11]=pre_block%256;
//write ulNextBlock//
Page_Buf[512+12]=0x00;
Page_Buf[512+13]=0x00;
Page_Buf[512+14]=ulNextBlock/256;
Page_Buf[512+15]=ulNextBlock%256;
for(ulPageNum=0;ulPageNum<32;ulPageNum++)
{
for(Pointer=0;Pointer<512;Pointer++)
{
Page_Buf[Pointer]=*pucBlockBuf;
//*pucBlockBuf=0xff;
pucBlockBuf++;
}
WritePage(current_block,ulPageNum,Page_Buf);
}
pre_block=current_block;
current_block=ulNextBlock;
}
//------------------------------------------------------------------
// 函数名:INT8U read_file(INT8U *pucBlockBuf,INT32 lByteNum)
// 输 入: INT8U *pucBlockBuf -- Block Buffer
// INT32U lByteNum --块buffer
// 输 出: Null
// 功能描述:从当前块读取lByteNum个块到pucBlockBuf
// 全局变量:Page_Buf
//------------------------------------------------------------------
INT8U read_file(INT8U *pucBlockBuf,INT32 lByteNum)
{
INT32U ulPageNum,Pointer;
//Uart_Printf("\nRead data,Current block is:%d",current_block);
for(ulPageNum=0;ulPageNum<32;ulPageNum++)
{
ReadPage(current_block,ulPageNum,Page_Buf);
for(Pointer=0;Pointer<512;Pointer++)
{
*pucBlockBuf=Page_Buf[Pointer];
pucBlockBuf++;
lByteNum--;
if(lByteNum==0)
{
current_block=Page_Buf[512+14]*256+Page_Buf[512+15];
return 1;
}
}
}
current_block=Page_Buf[512+14]*256+Page_Buf[512+15];
return 1;
}
//------------------------------------------------------------------
// 函数名:INT32U comp_filename(INT8U *pucString1,INT8U *pucString2)
// 输 入: INT8U *pucString1
// INT8U *pucString2
// 输 出: 0--相同
// 1--不相同
// 功能描述:比较两个文件名
// 全局变量:Null
//------------------------------------------------------------------
INT32U comp_filename(INT8U *pucString1,INT8U *pucString2)
{
INT32U ulDiffNum=0;
INT32U ulNamePointer;
for(ulNamePointer=0;ulNamePointer<11;ulNamePointer++)
{
if(pucString1[ulNamePointer]!=pucString2[ulNamePointer])
ulDiffNum++;
}
return (ulDiffNum);
}
//------------------------------------------------------------------
// 函数名:INT32U find_file(INT8U *pucFileName)
// 输 入: INT8U *pucFileName --文件名
// 输 出: 该文件在Root information区中的位置,即第几条记录
// 功能描述:查找文件在root表的位置
// 全局变量:root_buf
//------------------------------------------------------------------
INT32U find_file(INT8U *pucFileName)
{
INT32U ulPageNum,Pointer;
//read the root information//
for(ulPageNum=0;ulPageNum<32;ulPageNum++)
{
//将Root information读到root_buf中//
ReadPage(Root_Cluster,ulPageNum,Page_Buf);
for(Pointer=0;Pointer<512;Pointer++)
{
root_buf[ulPageNum*16+Pointer/32][Pointer%32]=Page_Buf[Pointer];
}
}
for(Pointer=0;Pointer<512;Pointer++)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -