📄 mpfs.c
字号:
/*********************************************************************
*
* Microchip File System (MPFS) File Access API
* Module for Microchip TCP/IP Stack
* -Provides single API for accessing web pages and other files
* from internal program memory or an external serial EEPROM memory
* -Reference: AN833
*
*********************************************************************
* FileName: MPFS.c
* Dependencies: StackTsk.h
* MPFS.h
* Processor: PIC18, PIC24F, PIC24H, dsPIC30F, dsPIC33F
* Complier: Microchip C18 v3.02 or higher
* Microchip C30 v2.01 or higher
* Company: Microchip Technology, Inc.
*
* Software License Agreement
*
* This software is owned by Microchip Technology Inc. ("Microchip")
* and is supplied to you for use exclusively as described in the
* associated software agreement. This software is protected by
* software and other intellectual property laws. Any use in
* violation of the software license may subject the user to criminal
* sanctions as well as civil liability. Copyright 2006 Microchip
* Technology Inc. All rights reserved.
*
* This software is provided "AS IS." MICROCHIP DISCLAIMS ALL
* WARRANTIES, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, NOT LIMITED
* TO MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
* INFRINGEMENT. Microchip shall in no event be liable for special,
* incidental, or consequential damages.
*
*
* Author Date Comment
*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
* Nilesh Rajbharti 8/14/01 Original (Rev. 1.0)
* Nilesh Rajbharti 2/9/02 Cleanup
* Nilesh Rajbharti 5/22/02 Rev 2.0 (See version.log for detail)
* Howard Schlunder 3/31/05 Changed MPFS_ENTRY and mpfs_Flags for C30
********************************************************************/
#define __MPFS_C
#include "mpfs\mpfs.h"
// This file system supports short file names i.e. 8 + 3.
#define MAX_FILE_NAME_LEN (12u)
#define MPFS_DATA (0x00u)
#define MPFS_DELETED (0x01u)
#define MPFS_DLE (0x03u)
#define MPFS_ETX (0x04u)
/*
* MPFS Structure:
*
* MPFS_Start:
* <MPFS_DATA><Address1><FileName1>
* <MPFS_DATA><Address2><FileName2>
* ...
* <MPFS_ETX><Addressn><FileNamen>
* Address1:
* <Data1>[<Data2>...<Datan>]<MPFS_ETX><MPFS_INVALID>
* ...
*
* Note: If File data contains either MPFS_DLE or MPFS_ETX
* extra MPFS_DLE is stuffed before that byte.
*/
#if defined(MPFS_USE_EEPROM)
typedef struct _MPFS_ENTRY
{
BYTE Flag __attribute__((__packed__));
MPFS Address __attribute__((__packed__));
BYTE Name[MAX_FILE_NAME_LEN] __attribute__((__packed__));
} MPFS_ENTRY;
#else //Use program memory
typedef struct _MPFS_ENTRY
{
BYTE Flag;
MPFS Address;
BYTE Name[MAX_FILE_NAME_LEN];
} MPFS_ENTRY;
#if defined(__C30__)
static DWORD ReadProgramMemory(DWORD address);
#endif
#endif
static union
{
struct
{
unsigned char bNotAvailable : 1;
} bits;
BYTE Val;
} mpfsFlags;
BYTE mpfsOpenCount;
#if !defined(MPFS_USE_EEPROM)
// An address where MPFS data starts in program memory.
extern MPFS MPFS_Start;
#else
#define MPFS_Start MPFS_RESERVE_BLOCK
#endif
MPFS _currentHandle;
MPFS _currentFile;
BYTE _currentCount;
// debug stuff RSJ
BYTE *dest;
BYTE *src;
unsigned int size;
BYTE enter;
/*********************************************************************
* Function: BOOL MPFSInit(void)
*
* PreCondition: None
*
* Input: None
*
* Output: TRUE, if MPFS Storage access is initialized and
* MPFS is ready to be used.
* FALSE otherwise
*
* Side Effects: None
*
* Overview: None
*
* Note: None
********************************************************************/
BOOL MPFSInit(void)
{
mpfsOpenCount = 0;
mpfsFlags.Val = 0;
#if defined(MPFS_USE_EEPROM)
// Initialize the EEPROM access routines.
XEEInit();
#endif
return TRUE;
}
/*********************************************************************
* Function: MPFS MPFSOpen(BYTE* file)
*
* PreCondition: None
*
* Input: file - NULL terminated file name.
*
* Output: A handle if file is found
* MPFS_INVALID if file is not found.
*
* Side Effects: None
*
* Overview: None
*
* Note: None
********************************************************************/
MPFS MPFSOpen(BYTE* file)
{
MPFS_ENTRY entry;
MPFS FAT;
BYTE fileNameLen;
if( mpfsFlags.bits.bNotAvailable )
return MPFS_NOT_AVAILABLE;
FAT = MPFS_Start;
// If string is empty, do not attempt to find it in FAT.
if ((!file) || ( *file == '\0' ))
return MPFS_INVALID;
file = (BYTE*)strupr((char*)file);
while(1)
{
//***********
dest = (BYTE *)&entry;
src = (BYTE *)FAT;
size = sizeof(entry);
enter = 1;
//***********
// Bring current FAT entry into RAM.
#if defined(MPFS_USE_EEPROM)
XEEReadArray(FAT, (unsigned char*)&entry, sizeof(entry));
#else
#if defined(__C30__)
memcpypgm2ram(&entry, (ROM void*)(WORD)FAT, sizeof(entry));
#else
memcpypgm2ram(&entry, (ROM void*)FAT, sizeof(entry));
#endif
#endif
//***********
enter = 0;
//***********
// Make sure that it is a valid entry.
if (entry.Flag == MPFS_DATA)
{
// Does the file name match ?
fileNameLen = strlen((char*)file);
if ( fileNameLen > MAX_FILE_NAME_LEN )
fileNameLen = MAX_FILE_NAME_LEN;
if( memcmp((void*)file, (void*)entry.Name, fileNameLen) == 0 )
{
_currentFile = (MPFS)entry.Address;
mpfsOpenCount++;
return entry.Address;
}
// File does not match. Try next entry...
FAT += sizeof(entry);
}
else if ( entry.Flag == MPFS_ETX )
{
if ( entry.Address != (MPFS)MPFS_INVALID )
FAT = (MPFS)entry.Address;
else
break;
}
else
return (MPFS)MPFS_INVALID;
}
return (MPFS)MPFS_INVALID;
}
/*********************************************************************
* Function: void MPFSClose(void)
*
* PreCondition: None
*
* Input: handle - File handle to be closed
*
* Output: None
*
* Side Effects: None
*
* Overview: None
*
* Note: None
********************************************************************/
void MPFSClose(void)
{
_currentCount = 0;
mpfsFlags.bits.bNotAvailable = FALSE;
if ( mpfsOpenCount )
mpfsOpenCount--;
}
/*********************************************************************
* Function: BOOL MPFSGetBegin(MPFS hFile)
*
* PreCondition: MPFSOpen() != MPFS_INVALID &&
*
* Input: hFile - handle of file that is to be read
*
* Output: TRUE if successful
* !TRUE otherwise
*
* Side Effects: None
*
* Overview: Prepares MPFS storage media for subsequent reads.
*
* Note: None
********************************************************************/
#if defined(MPFS_USE_EEPROM)
BOOL MPFSGetBegin(MPFS hFile)
{
_currentHandle = hFile;
return (XEEBeginRead(hFile) == XEE_SUCCESS);
}
#endif
/*********************************************************************
* Function: BYTE MPFSGet(void)
*
* PreCondition: MPFSOpen() != MPFS_INVALID &&
* MPFSGetBegin() == TRUE
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -