📄 fat.c
字号:
/******************************************************************************
*
* (c) copyright Freescale Semiconductor 2008
* ALL RIGHTS RESERVED
*
* File Name: Fat.c
*
* Description: Fat16 lite driver
*
* Assembler: Codewarrior for HC(S)08 V6.1
*
* Version: 1.1
*
* Author: Jose Ruiz (SSE Americas)
*
* Location: Guadalajara,Mexico
*
*
* UPDATED HISTORY:
*
* REV YYYY.MM.DD AUTHOR DESCRIPTION OF CHANGE
* --- ---------- ------ ---------------------
* 1.0 2008.02.18 Jose Ruiz Initial version
* 1.1 2008.05.02 Jose Ruiz Initial version
*
******************************************************************************/
/* Freescale is not obligated to provide any support, upgrades or new */
/* releases of the Software. Freescale may make changes to the Software at */
/* any time, without any obligation to notify or provide updated versions of */
/* the Software to you. Freescale expressly disclaims any warranty for the */
/* Software. The Software is provided as is, without warranty of any kind, */
/* either express or implied, including, without limitation, the implied */
/* warranties of merchantability, fitness for a particular purpose, or */
/* non-infringement. You assume the entire risk arising out of the use or */
/* performance of the Software, or any systems you design using the software */
/* (if any). Nothing may be construed as a warranty or representation by */
/* Freescale that the Software or any derivative work developed with or */
/* incorporating the Software will be free from infringement of the */
/* intellectual property rights of third parties. In no event will Freescale */
/* be liable, whether in contract, tort, or otherwise, for any incidental, */
/* special, indirect, consequential or punitive damages, including, but not */
/* limited to, damages for any loss of use, loss of time, inconvenience, */
/* commercial loss, or lost profits, savings, or revenues to the full extent */
/* such may be disclaimed by law. The Software is not fault tolerant and is */
/* not designed, manufactured or intended by Freescale for incorporation */
/* into products intended for use or resale in on-line control equipment in */
/* hazardous, dangerous to life or potentially life-threatening environments */
/* requiring fail-safe performance, such as in the operation of nuclear */
/* facilities, aircraft navigation or communication systems, air traffic */
/* control, direct life support machines or weapons systems, in which the */
/* failure of products could lead directly to death, personal injury or */
/* severe physical or environmental damage (High Risk Activities). You */
/* specifically represent and warrant that you will not use the Software or */
/* any derivative work of the Software for High Risk Activities. */
/* Freescale and the Freescale logos are registered trademarks of Freescale */
/* Semiconductor Inc. */
/*****************************************************************************/
/* Includes */
#include "Fat.h"
/* File Handlers */
WriteRHandler WHandler;
ReadRHandler RHandler;
/* File Buffers */
UINT8 ag8FATReadBuffer[512];
UINT8 ag8FATWriteBuffer[512];
/* Global Variables */
UINT16 u16FAT_Sector_Size;
UINT16 u16FAT_Cluster_Size;
UINT16 u16FAT_FAT_BASE;
UINT16 u16FAT_Root_BASE;
UINT16 u16FAT_Data_BASE;
UINT16 u16Main_Offset=0;
/***************************************************************************************/
UINT32 LWordSwap(UINT32 u32DataSwap)
{
UINT32 u32Temp;
u32Temp= (u32DataSwap & 0xFF000000) >> 24;
u32Temp+=(u32DataSwap & 0xFF0000) >> 8;
u32Temp+=(u32DataSwap & 0xFF00) << 8;
u32Temp+=(u32DataSwap & 0xFF) << 24;
return(u32Temp);
}
/***************************************************************************************/
void FAT_Read_Master_Block(void)
{
MasterBoot_Entries *pMasterBoot;
while(ag8FATReadBuffer[0]!= 0xEB && ag8FATReadBuffer[1]!=0x3C && ag8FATReadBuffer[2]!=0x90)
{
GetPhysicalBlock(u16Main_Offset++,&ag8FATReadBuffer[0]);
}
u16Main_Offset--;
pMasterBoot=(MasterBoot_Entries*)ag8FATReadBuffer;
u16FAT_Cluster_Size=pMasterBoot->SectorsPerCluster;
u16FAT_Sector_Size=ByteSwap(pMasterBoot->BytesPerSector);
u16FAT_FAT_BASE= u16Main_Offset+ByteSwap(pMasterBoot->ReservedSectors);
u16FAT_Root_BASE= (ByteSwap(pMasterBoot->SectorsPerFat)<<1)+u16FAT_FAT_BASE;
u16FAT_Data_BASE= (ByteSwap(pMasterBoot->RootDirectoryEntries) >>4)+u16FAT_Root_BASE;
}
/***************************************************************************************/
/*void FAT_LS(void)
{
UINT8 u8Counter;
root_Entries *sFileStructure;
GetPhysicalBlock(u16FAT_Root_BASE,ag8FATReadBuffer);
sFileStructure = (root_Entries*)&ag8FATReadBuffer[RootEntrySize];
while(sFileStructure->FileName[0]!=FILE_Clear)
{
if(sFileStructure->FileName[0]!=FILE_Erased)
{
Terminal_Send_String((UINT8*)"\r\n");
for(u8Counter=0;u8Counter<8;u8Counter++)
if(sFileStructure->FileName[u8Counter]!=' ')
Terminal_Send_Byte(sFileStructure->FileName[u8Counter]);
Terminal_Send_Byte('.');
for(u8Counter=0;u8Counter<3;u8Counter++)
if(sFileStructure->Extension[u8Counter]!=' ')
Terminal_Send_Byte(sFileStructure->Extension[u8Counter]);
}
sFileStructure++;
}
}
*/
/***************************************************************************************/
void FAT_FileClose(void)
{
root_Entries *sFileStructure;
UINT16 *pu16FATPointer;
UINT8 u8Counter;
UINT32 u32Sector;
UINT16 u16Offset;
/* Directory Entry*/
u32Sector=WHandler.Dir_Entry/(u16FAT_Sector_Size>>5);
u16Offset=WHandler.Dir_Entry%(u16FAT_Sector_Size>>5);
GetPhysicalBlock(u16FAT_Root_BASE+u32Sector,ag8FATReadBuffer);
sFileStructure=(root_Entries*)ag8FATReadBuffer;
sFileStructure+=u16Offset;
// FileName
for(u8Counter=0;u8Counter<8;u8Counter++)
sFileStructure->FileName[u8Counter]=WHandler.FileName[u8Counter];
// Entension
for(u8Counter=0;u8Counter<3;u8Counter++)
sFileStructure->Extension[u8Counter]=WHandler.Extension[u8Counter];
// Attributes
sFileStructure->Attributes=0x20;
sFileStructure->_Case=0x18;
sFileStructure->MiliSeconds=0xC6;
// Date & Time Information
sFileStructure->CreationTime=0x2008;
sFileStructure->CreationDate=0x2136;
sFileStructure->AccessDate=0x2136;
sFileStructure->ModificationTime=0x2008;
sFileStructure->ModificationDate=0x2136;
// Fat entry and file Size
sFileStructure->ClusterNumber=ByteSwap(WHandler.BaseFatEntry);
sFileStructure->SizeofFile=LWordSwap(WHandler.File_Size);
StorePhysicalBLock(u16FAT_Root_BASE+u32Sector,ag8FATReadBuffer)
/* FAT Table */
u32Sector=WHandler.CurrentFatEntry/(u16FAT_Sector_Size>>1);
u16Offset=WHandler.CurrentFatEntry%(u16FAT_Sector_Size>>1);
GetPhysicalBlock(u16FAT_FAT_BASE+u32Sector,ag8FATReadBuffer);
pu16FATPointer=(UINT16*)ag8FATReadBuffer;
pu16FATPointer+=u16Offset;
*pu16FATPointer=0xFFFF; // Write Final Cluster
StorePhysicalBLock(u16FAT_FAT_BASE+u32Sector,ag8FATReadBuffer)
}
/***************************************************************************************/
UINT16 FAT_SearchAvailableFAT(UINT16 u16CurrentFAT)
{
UINT16 *pu16DataPointer;
UINT16 u16FatEntry=0;
UINT16 u16Sector=0;
UINT16 u16byteSector;
u16Sector=u16FAT_FAT_BASE;
while(u16Sector < (((u16FAT_Root_BASE-u16FAT_FAT_BASE)>>1)+u16Main_Offset))
{ GetPhysicalBlock(u16Sector++,ag8FATReadBuffer);
pu16DataPointer=(UINT16*)ag8FATReadBuffer;
u16byteSector=0;
while(u16byteSector<u16FAT_Sector_Size)
{
if(*pu16DataPointer==0x0000)
if(u16FatEntry!=u16CurrentFAT)
return(u16FatEntry);
pu16DataPointer++;
u16FatEntry++;
u16byteSector++;
}
}
return(0); // Return 0 if no more FAT positions available
}
/***************************************************************************************/
UINT16 FAT_Entry(UINT16 u16FatEntry,UINT16 u16FatValue, UINT8 u8Function)
{
UINT16 *pu16DataPointer;
UINT16 u16Block;
UINT8 u8Offset;
u16Block = u16FatEntry / (u16FAT_Sector_Size>>1);
u8Offset = (UINT8)(u16FatEntry % (u16FAT_Sector_Size >>1));
GetPhysicalBlock(u16FAT_FAT_BASE+u16Block,ag8FATReadBuffer);
pu16DataPointer=(UINT16*)ag8FATReadBuffer;
pu16DataPointer+=u8Offset;
if(u8Function==NEXT_ENTRY)
return(ByteSwap(*pu16DataPointer));
if(u8Function==WRITE_ENTRY)
{
*pu16DataPointer=ByteSwap(u16FatValue);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -