⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 file.c

📁 一个简单而又高效的嵌入式操作系统.包括GUI及文件系统.仿Windows设计,类似于MFC风格
💻 C
📖 第 1 页 / 共 2 页
字号:
//****************************************************************************************
//** 文件名: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 + -