亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? mpfs.c

?? pic18f66j60單片機tcp/ip協議中的MPFS程序
?? C
字號:
/*********************************************************************
 *
 *               Microchip File System Implementaion on PIC18
 *
 *********************************************************************
 * 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 THIS_IS_MPFS

#include <string.h>
#include <stdlib.h>

#include "..\Include\MPFS.h"
#include "..\Include\Helpers.h"

#if defined(MPFS_USE_EEPROM)
    #include "..\Include\XEEPROM.h"
#endif
// 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.
 */
#ifdef MPFS_USE_PGRM
typedef struct  _MPFS_ENTRY
{
    BYTE Flag;
    MPFS Address;
    BYTE Name[MAX_FILE_NAME_LEN];
} MPFS_ENTRY;
#else	//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;
#endif

static union
{
    struct
    {
        unsigned char bNotAvailable : 1;
    } bits;
    BYTE Val;
} mpfsFlags;

BYTE mpfsOpenCount;

#if defined(MPFS_USE_PGRM)

	// 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;


/*********************************************************************
 * 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_PGRM)
    return TRUE;
#else
    /*
     * Initialize the EEPROM access routines.
     * Use ~ 400 Khz.
     */
    //XEEInit(EE_BAUD(CLOCK_FREQ, 400000));

    //return TRUE;
#endif
}


/*********************************************************************
 * 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;

#if defined(MPFS_USE_PGRM)
    FAT = (MPFS)&MPFS_Start;
#else
    FAT = MPFS_Start;
#endif

    // If string is empty, do not attempt to find it in FAT.
    if ( *file == '\0' )
        return MPFS_INVALID;

    file = (BYTE*)strupr((char*)file);

    while(1)
    {
#if defined(MPFS_USE_PGRM)
        // Bring current FAT entry into RAM.
        memcpypgm2ram(&entry, (ROM void*)FAT, sizeof(entry));
#else
        XEEReadArray(EEPROM_CONTROL, FAT, (unsigned char*)&entry, sizeof(entry));
#endif

        // 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 handle)
 *
 * PreCondition:    MPFSOpen() != MPFS_INVALID &&
 *
 * Input:           handle      - 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 handle)
{
    _currentHandle = handle;
    return (XEEBeginRead(EEPROM_CONTROL, handle) == XEE_SUCCESS);
}
#endif

/*********************************************************************
 * Function:        BYTE MPFSGet(void)
 *
 * PreCondition:    MPFSOpen() != MPFS_INVALID &&
 *                  MPFSGetBegin() == TRUE
 *
 * Input:           None
 *
 * Output:          Data byte from current address.
 *
 * Side Effects:    None
 *
 * Overview:        Reads a byte from current address.
 *
 * Note:            Caller must call MPFSIsEOF() to check for end of
 *                  file condition
 ********************************************************************/
BYTE MPFSGet(void)
{
    BYTE t;
    
#if defined(MPFS_USE_PGRM)
    t = (BYTE)*_currentHandle;
#else
    t = XEERead();
#endif
    _currentHandle++;

    if ( t == MPFS_DLE )
    {
#if defined(MPFS_USE_PGRM)
        t = (BYTE)*_currentHandle;
#else
        t = XEERead();
#endif
        _currentHandle++;
    }
    else if ( t == MPFS_ETX )
    {
        _currentHandle = MPFS_INVALID;
    }

    return t;

}


/*********************************************************************
 * Function:        MPFS MPFSGetEnd(void)
 *
 * PreCondition:    MPFSOpen() != MPFS_INVALID &&
 *                  MPFSGetBegin() = TRUE
 *
 * Input:           None
 *
 * Output:          Current mpfs handle.
 *
 * Side Effects:    None
 *
 * Overview:        Ends on-going read cycle.
 *                  MPFS handle that is returned must be used
 *                  for subsequent begin gets..
 *
 * Note:            None
 ********************************************************************/
#if defined(MPFS_USE_EEPROM)
MPFS MPFSGetEnd(void)
{
    XEEEndRead();
    return _currentHandle;
}
#endif


/*********************************************************************
 * Function:        MPFS MPFSFormat(void)
 *
 * PreCondition:    None
 *
 * Input:           None
 *
 * Output:          A valid MPFS handle that can be used for MPFSPut
 *
 * Side Effects:    None
 *
 * Overview:        Prepares MPFS image to get re-written
 *                  Declares MPFS as in use.
 *
 * Note:            MPFS will be unaccessible until MPFSClose is
 *                  called.
 ********************************************************************/
MPFS MPFSFormat(void)
{
    mpfsFlags.bits.bNotAvailable = TRUE;
    return (MPFS)MPFS_RESERVE_BLOCK;
}


/*********************************************************************
 * Function:        BOOL MPFSPutBegin(MPFS handle)
 *
 * PreCondition:    MPFSInit() and MPFSFormat() are already called.
 *
 * Input:           handle  - handle to where put to begin
 *
 * Output:          TRUE if successful
 *                  !TRUE otherwise
 *
 * Side Effects:    None
 *
 * Overview:        Prepares MPFS image to get re-written
 *
 * Note:            MPFS will be unaccessible until MPFSClose is
 *                  called.
 ********************************************************************/
#if defined(MPFS_USE_EEPROM)
BOOL MPFSPutBegin(MPFS handle)
{
    //_currentCount = 0;
    _currentHandle = handle;
    _currentCount = (BYTE)handle;
    _currentCount &= (MPFS_WRITE_PAGE_SIZE-1);
    return (XEEBeginWrite(EEPROM_CONTROL, handle) == XEE_SUCCESS);
}
#endif


/*********************************************************************
 * Function:        BOOL MPFSPut(BYTE b)
 *
 * PreCondition:    MPFSFormat() or MPFSCreate() must be called
 *                  MPFSPutBegin() is already called.
 *
 * Input:           b       - data to write.
 *
 * Output:          TRUE if successfull
 *                  !TRUE if failed.
 *
 * Side Effects:    Original MPFS handle is no longer valid.
 *                  Updated MPFS handle must be obtained by calling
 *                  MPFSPutEnd().
 *
 * Overview:        None
 *
 * Note:            Actual write may not get started until internal
 *                  write page is full.  To ensure that previously
 *                  data gets written, caller must call MPFSPutEnd()
 *                  after last call to MPFSPut().
 ********************************************************************/
BOOL MPFSPut(BYTE b)
{
#if defined(MPFS_USE_EEPROM)
    if ( XEEWrite(b) )
        return FALSE;

    _currentCount++;
    _currentHandle++;
    if ( _currentCount >= MPFS_WRITE_PAGE_SIZE )
    {
        MPFSPutEnd();
        XEEBeginWrite(EEPROM_CONTROL, _currentHandle);
    }
#endif
    return TRUE;
}

/*********************************************************************
 * Function:        MPFS MPFSPutEnd(void)
 *
 * PreCondition:    MPFSPutBegin() is already called.
 *
 * Input:           None
 *
 * Output:          Up-to-date MPFS handle
 *
 * Side Effects:    Original MPFS handle is no longer valid.
 *                  Updated MPFS handle must be obtained by calling
 *                  MPFSPutEnd().
 *
 * Overview:        None
 *
 * Note:            Actual write may not get started until internal
 *                  write page is full.  To ensure that previously
 *                  data gets written, caller must call MPFSPutEnd()
 *                  after last call to MPFSPut().
 ********************************************************************/
MPFS MPFSPutEnd(void)
{
#if defined(MPFS_USE_EEPROM)
    _currentCount = 0;
    XEEEndWrite();
    while( XEEIsBusy(EEPROM_CONTROL) );
#endif

    return _currentHandle;
}

/*********************************************************************
 * Function:        MPFS MPFSSeek(MPFS_OFFSET offset)
 *
 * PreCondition:    MPFSGetBegin() is already called.
 *
 * Input:           offset      - Offset from current pointer
 *
 * Output:          New MPFS handle located to given offset
 *
 * Side Effects:    None.
 *
 * Overview:        None
 *
 * Note:            None.
 ********************************************************************/
MPFS MPFSSeek(MPFS_OFFSET offset)
{
    WORD i;

    MPFSGetBegin(_currentFile);

    i = 0;
    while(i++ != offset)
        MPFSGet();

    MPFSGetEnd();

    return _currentHandle;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久久久久免费相片 | 不卡视频免费播放| 欧美日韩精品专区| 国产女同性恋一区二区| 日韩av电影天堂| 97超碰欧美中文字幕| 精品国产网站在线观看| 一区二区成人在线观看| k8久久久一区二区三区| 亚洲精品一区二区三区福利| 亚洲一区二区3| 99精品视频在线免费观看| 久久久久9999亚洲精品| 麻豆精品在线视频| 欧美日韩国产成人在线91| 亚洲精品视频在线看| 成人av电影免费在线播放| 欧美一区二区视频观看视频| 亚洲一区二区精品3399| 色琪琪一区二区三区亚洲区| 综合久久国产九一剧情麻豆| 成人av资源下载| 日本一区二区免费在线观看视频 | 亚洲欧美福利一区二区| 国产成人午夜片在线观看高清观看| 日韩一区二区三区四区 | 青青国产91久久久久久 | 99久久99久久精品国产片果冻| 精品日产卡一卡二卡麻豆| 视频一区二区三区中文字幕| 欧美午夜精品一区二区蜜桃| 亚洲啪啪综合av一区二区三区| 成人av综合在线| 国产精品久久久久久久久晋中 | 亚洲视频在线观看三级| 成人高清在线视频| 国产精品久久久久永久免费观看 | 日韩欧美高清dvd碟片| 日日骚欧美日韩| 91.麻豆视频| 男女男精品视频网| 精品国产乱码久久久久久夜甘婷婷 | 免费在线成人网| 91精品国产色综合久久| 青青草伊人久久| 久久久精品中文字幕麻豆发布| 国产精品一区二区在线看| 国产精品久久久久影院色老大| 成人18精品视频| 亚洲一区在线播放| 精品久久久影院| 国产激情视频一区二区三区欧美 | 国产精品女人毛片| 色香色香欲天天天影视综合网| 午夜精品一区二区三区三上悠亚| 日韩限制级电影在线观看| 九九国产精品视频| 中文字幕一区二区三区乱码在线| 欧美四级电影网| 在线观看成人免费视频| 天天操天天综合网| 精品国产乱码久久久久久蜜臀 | 亚洲欧美日韩成人高清在线一区| 91免费观看视频| 日产国产欧美视频一区精品| 中文字幕不卡在线| 精品视频全国免费看| 国产一区二区毛片| 亚洲国产欧美在线| 久久久99精品久久| 欧美三区在线观看| 国产成人精品影院| 亚洲成a人片综合在线| 国产人久久人人人人爽| 在线视频一区二区三| 精品一区二区三区在线观看| 最新成人av在线| 337p日本欧洲亚洲大胆色噜噜| 92精品国产成人观看免费| 久久66热re国产| 亚洲欧美日韩成人高清在线一区| 精品少妇一区二区三区日产乱码| 北条麻妃一区二区三区| 免费人成网站在线观看欧美高清| 国产精品高潮呻吟久久| 久久综合久久综合亚洲| 欧美三级日韩三级国产三级| 欧美一区二区三区视频在线| 成人午夜激情视频| 日韩精品高清不卡| 亚洲人成亚洲人成在线观看图片 | 免费精品视频最新在线| 亚洲黄色av一区| 精品国产电影一区二区 | 色综合婷婷久久| 国产麻豆精品在线| 美女性感视频久久| 亚洲h在线观看| 亚洲免费观看高清完整| 国产精品嫩草影院av蜜臀| 久久婷婷色综合| 日韩欧美国产综合| 日韩午夜电影av| 欧美一二三四区在线| 欧美日韩亚洲丝袜制服| 欧洲精品一区二区| 色一情一伦一子一伦一区| 91亚洲男人天堂| 成人av在线资源| 不卡视频在线观看| 91香蕉视频mp4| 色综合久久综合| 在线日韩国产精品| 欧美天天综合网| 欧美日韩免费高清一区色橹橹 | 污片在线观看一区二区| 亚洲18影院在线观看| 天天色天天操综合| 免费欧美日韩国产三级电影| 激情欧美日韩一区二区| 国内外精品视频| 国产成人久久精品77777最新版本 国产成人鲁色资源国产91色综 | 成人黄色小视频在线观看| 成人一区二区视频| 97se亚洲国产综合自在线不卡| 91在线国产福利| 欧美性色欧美a在线播放| 欧美军同video69gay| 欧美一区二区三区免费视频| 久久中文字幕电影| 日本一区二区不卡视频| 亚洲色图另类专区| 偷窥少妇高潮呻吟av久久免费| 蜜臀精品久久久久久蜜臀| 精品一区二区免费看| 成人免费黄色在线| 色呦呦日韩精品| 日韩一区二区免费高清| 国产欧美一区二区精品秋霞影院| 国产精品无遮挡| 亚洲午夜久久久久久久久电影网 | 国产拍揄自揄精品视频麻豆| 国产精品盗摄一区二区三区| 亚洲一区二区在线播放相泽| 美女一区二区久久| 色综合天天综合网国产成人综合天| 欧美日韩在线一区二区| 精品国产乱码久久久久久久| 国产精品美女久久久久久久网站| 夜夜嗨av一区二区三区| 久久精品国产一区二区三区免费看| 国产99久久精品| 在线播放日韩导航| 国产精品嫩草影院av蜜臀| 日韩av中文字幕一区二区三区| 国产不卡高清在线观看视频| 欧美日韩精品一区二区| 国产片一区二区三区| 亚洲成av人片一区二区| 精品国产乱码久久久久久图片 | 久久久久国产精品人| 亚洲午夜久久久久久久久电影院| 国产一区二区三区在线看麻豆| 91蜜桃视频在线| 久久精品欧美日韩| 日本欧美一区二区三区| 一本一本大道香蕉久在线精品| 精品福利在线导航| 日韩激情中文字幕| 色综合久久久久久久久久久| 久久女同精品一区二区| 日韩中文字幕亚洲一区二区va在线| 成人午夜电影小说| 精品国产sm最大网站| 午夜欧美视频在线观看| 91黄视频在线| 国产精品成人免费精品自在线观看| 免费在线观看成人| 欧美精品99久久久**| 亚洲国产精品一区二区久久恐怖片| 成人黄色在线看| 欧美国产精品专区| 韩国v欧美v亚洲v日本v| 欧美成人在线直播| 青娱乐精品视频| 欧美一级专区免费大片| 日日夜夜精品免费视频| 欧美日韩精品二区第二页| 亚洲综合成人网| 91九色02白丝porn| 一区二区国产盗摄色噜噜| 色婷婷香蕉在线一区二区| 国产精品久久777777| 国产 日韩 欧美大片| 久久综合色一综合色88| 国产在线精品免费| 久久人人超碰精品| 国产成人精品亚洲777人妖| 国产蜜臀97一区二区三区| bt欧美亚洲午夜电影天堂|