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

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

?? fat16.c

?? 基于STM32的 模擬時序
?? C
?? 第 1 頁 / 共 5 頁
字號:
/****************************************Copyright (c)**************************************************
**                       思 蛻 盟 豆 皮 開 發 小 組
**                             stmfans 論壇
**
**                   QQ 群: 65081316  StmFans思蛻盟 1組
**                   QQ 群: 68584951  StmFans思蛻盟 2組
**                      http://www.stmfans.com/bbs/
**
** This program was produced by the
** IAR Embedded Workbench 4.0 Kickstart 442
** Copyright 2008-2009 stmfans 
** Chip type           : STM32F103VB
** Program type        : Application
** Clock frequency     : 8.000000 MHz
** Memory model        : 
** External SRAM size  : 
** Data Stack size     : 
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: fat16.c
**創   建   人: 陳海
**最后修改日期: 2008年10月23日
**描        述: 豆皮開發板教程
**              
**--------------歷史版本信息----------------------------------------------------------------------------
** 創建人: Roland Riegel
** 版  本: v0.01
** 日 期: 2008年06月08日
** 描 述: 原始版本
**
**--------------當前版本信息----------------------------------------------------------------------------
** 創建人: 陳海
** 版  本: v0.02
** 日 期: 2008年10月23日
** 描 述: 當前版本
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/


/* Includes ------------------------------------------------------------------*/
#include "fat16.h"



#include <string.h>

#if USE_DYNAMIC_MEMORY
    #include <stdlib.h>
#endif

/**
 * \addtogroup fat16 FAT16 support
 *
 * This module implements FAT16 read and write access.
 * 
 * The following features are supported:
 * - File names up to 31 characters long.
 * - Unlimited depth of subdirectories.
 * - Short 8.3 and long filenames.
 * - Creating and deleting files.
 * - Reading and writing from and to files.
 * - File resizing.
 * - File sizes of up to 4 gigabytes.
 * 
 * @{
 */
/**
 * \file
 * FAT16 implementation (license: GPLv2 or LGPLv2.1)
 *
 * \author Roland Riegel
 */

/**
 * \addtogroup fat16_config FAT16 configuration
 * Preprocessor defines to configure the FAT16 implementation.
 */

/**
 * \addtogroup fat16_fs FAT16 access
 * Basic functions for handling a FAT16 filesystem.
 */

/**
 * \addtogroup fat16_file FAT16 file functions
 * Functions for managing files.
 */

/**
 * \addtogroup fat16_dir FAT16 directory functions
 * Functions for managing directories.
 */

/**
 * @}
 */

#define FAT16_CLUSTER_FREE 0x0000
#define FAT16_CLUSTER_RESERVED_MIN 0xfff0
#define FAT16_CLUSTER_RESERVED_MAX 0xfff6
#define FAT16_CLUSTER_BAD 0xfff7
#define FAT16_CLUSTER_LAST_MIN 0xfff8
#define FAT16_CLUSTER_LAST_MAX 0xffff

#define FAT16_DIRENTRY_DELETED 0xe5
#define FAT16_DIRENTRY_LFNLAST (1 << 6)
#define FAT16_DIRENTRY_LFNSEQMASK ((1 << 6) - 1)

/* Each entry within the directory table has a size of 32 bytes
 * and either contains a 8.3 DOS-style file name or a part of a
 * long file name, which may consist of several directory table
 * entries at once.
 *
 * multi-byte integer values are stored little-endian!
 *
 * 8.3 file name entry:
 * ====================
 * offset  length  description
 *      0       8  name (space padded)
 *      8       3  extension (space padded)
 *     11       1  attributes (FAT16_ATTRIB_*)
 *
 * long file name (lfn) entry ordering for a single file name:
 * ===========================================================
 * LFN entry n
 *     ...
 * LFN entry 2
 * LFN entry 1
 * 8.3 entry (see above)
 * 
 * lfn entry:
 * ==========
 * offset  length  description
 *      0       1  ordinal field
 *      1       2  unicode character 1
 *      3       3  unicode character 2
 *      5       3  unicode character 3
 *      7       3  unicode character 4
 *      9       3  unicode character 5
 *     11       1  attribute (always 0x0f)
 *     12       1  type (reserved, always 0)
 *     13       1  checksum
 *     14       2  unicode character 6
 *     16       2  unicode character 7
 *     18       2  unicode character 8
 *     20       2  unicode character 9
 *     22       2  unicode character 10
 *     24       2  unicode character 11
 *     26       2  cluster (unused, always 0)
 *     28       2  unicode character 12
 *     30       2  unicode character 13
 * 
 * The ordinal field contains a descending number, from n to 1.
 * For the n'th lfn entry the ordinal field is or'ed with 0x40.
 * For deleted lfn entries, the ordinal field is set to 0xe5.
 */

struct fat16_header_struct
{
    u32 size;

    u32 fat_offset;
    u32 fat_size;

    u16 sector_size;
    u16 cluster_size;

    u32 root_dir_offset;

    u32 cluster_zero_offset;
};

struct fat16_fs_struct
{
    struct partition_struct* partition;
    struct fat16_header_struct header;
};

struct fat16_file_struct
{
    struct fat16_fs_struct* fs;
    struct fat16_dir_entry_struct dir_entry;
    u32 pos;
    u16 pos_cluster;
};

struct fat16_dir_struct
{
    struct fat16_fs_struct* fs;
    struct fat16_dir_entry_struct dir_entry;
    u16 entry_next;
};

struct fat16_read_callback_arg
{
    u16 entry_cur;
    u16 entry_num;
    u32 entry_offset;
    u8 byte_count;
};

struct fat16_usage_count_callback_arg
{
    u16 cluster_count;
    u8 buffer_size;
};

#if !USE_DYNAMIC_MEMORY
static struct fat16_fs_struct fat16_fs_handlers[FAT16_FS_COUNT];
static struct fat16_file_struct fat16_file_handlers[FAT16_FILE_COUNT];
static struct fat16_dir_struct fat16_dir_handlers[FAT16_DIR_COUNT];
#endif

static u8 fat16_read_header(struct fat16_fs_struct* fs);
static u8 fat16_read_root_dir_entry(const struct fat16_fs_struct* fs, u16 entry_num, struct fat16_dir_entry_struct* dir_entry);
static u8 fat16_read_sub_dir_entry(const struct fat16_fs_struct* fs, u16 entry_num, const struct fat16_dir_entry_struct* parent, struct fat16_dir_entry_struct* dir_entry);
static u8 fat16_dir_entry_seek_callback(u8* buffer, u32 offset, void* p);
static u8 fat16_dir_entry_read_callback(u8* buffer, u32 offset, void* p);
static u8 fat16_interpret_dir_entry(struct fat16_dir_entry_struct* dir_entry, const u8* raw_entry);
static u16 fat16_get_next_cluster(const struct fat16_fs_struct* fs, u16 cluster_num);
static u16 fat16_append_clusters(const struct fat16_fs_struct* fs, u16 cluster_num, u16 count);
static u8 fat16_free_clusters(const struct fat16_fs_struct* fs, u16 cluster_num);
static u8 fat16_terminate_clusters(const struct fat16_fs_struct* fs, u16 cluster_num);
static u8 fat16_clear_cluster(const struct fat16_fs_struct* fs, u16 cluster_num);
static u16 fat16_clear_cluster_callback(u8* buffer, u32 offset, void* p);
static u32 fat16_find_offset_for_dir_entry(const struct fat16_fs_struct* fs, const struct fat16_dir_struct* parent, const struct fat16_dir_entry_struct* dir_entry);
static u8 fat16_write_dir_entry(const struct fat16_fs_struct* fs, struct fat16_dir_entry_struct* dir_entry);

static u8 fat16_get_fs_free_callback(u8* buffer, u32 offset, void* p);

//static void fat16_set_file_modification_date(struct fat16_dir_entry_struct* dir_entry, u16 year, u8 month, u8 day);
//static void fat16_set_file_modification_time(struct fat16_dir_entry_struct* dir_entry, u8 hour, u8 min, u8 sec);

/**
 * \ingroup fat16_fs
 * Opens a FAT16 filesystem.
 *
 * \param[in] partition Discriptor of partition on which the filesystem resides.
 * \returns 0 on error, a FAT16 filesystem descriptor on success.
 * \see fat16_open
 */
struct fat16_fs_struct* fat16_open(struct partition_struct* partition)
{
    if(!partition ||
#if FAT16_WRITE_SUPPORT
       !partition->device_write ||
       !partition->device_write_interval
#else
       0
#endif
      )
        return 0;

#if USE_DYNAMIC_MEMORY
    struct fat16_fs_struct* fs = malloc(sizeof(*fs));
    if(!fs)
        return 0;
#else
    struct fat16_fs_struct* fs = fat16_fs_handlers;
    u8 i;
    for(i = 0; i < FAT16_FS_COUNT; ++i)
    {
        if(!fs->partition)
            break;

        ++fs;
    }
    if(i >= FAT16_FS_COUNT)
        return 0;
#endif

    memset(fs, 0, sizeof(*fs));

    fs->partition = partition;
    if(!fat16_read_header(fs))
    {
#if USE_DYNAMIC_MEMORY
        free(fs);
#else
        fs->partition = 0;
#endif
        return 0;
    }
    
    return fs;
}

/**
 * \ingroup fat16_fs
 * Closes a FAT16 filesystem.
 *
 * When this function returns, the given filesystem descriptor
 * will be invalid.
 *
 * \param[in] fs The filesystem to close.
 * \see fat16_open
 */
void fat16_close(struct fat16_fs_struct* fs)
{
    if(!fs)
        return;

#if USE_DYNAMIC_MEMORY
    free(fs);
#else
    fs->partition = 0;
#endif
}

/**
 * \ingroup fat16_fs
 * Reads and parses the header of a FAT16 filesystem.
 *
 * \param[inout] fs The filesystem for which to parse the header.
 * \returns 0 on failure, 1 on success.
 */
u8 fat16_read_header(struct fat16_fs_struct* fs)
{
    if(!fs)
        return 0;

    struct partition_struct* partition = fs->partition;
    if(!partition)
        return 0;

    /* read fat parameters */
    u8 buffer[25];
    u32 partition_offset = partition->offset * 512;
    if(!partition->device_read(partition_offset + 0x0b, buffer, sizeof(buffer)))
        return 0;

    u16 bytes_per_sector = ((u16) buffer[0x00]) |
                                ((u16) buffer[0x01] << 8);
    u8 sectors_per_cluster = buffer[0x02];
    u16 reserved_sectors = ((u16) buffer[0x03]) |
                                ((u16) buffer[0x04] << 8);
    u8 fat_copies = buffer[0x05];
    u16 max_root_entries = ((u16) buffer[0x06]) |
                                ((u16) buffer[0x07] << 8);
    u16 sector_count_16 = ((u16) buffer[0x08]) |
                               ((u16) buffer[0x09] << 8);
    u16 sectors_per_fat = ((u16) buffer[0x0b]) |
                               ((u16) buffer[0x0c] << 8);
    u32 sector_count = ((u32) buffer[0x15]) |
                            ((u32) buffer[0x16] << 8) |
                            ((u32) buffer[0x17] << 16) |
                            ((u32) buffer[0x18] << 24);
    
    if(sectors_per_fat == 0)
        /* this is not a FAT16 */
        return 0;

    if(sector_count == 0)
    {
        if(sector_count_16 == 0)
            /* illegal volume size */
            return 0;
        else
            sector_count = sector_count_16;
    }

    /* ensure we really have a FAT16 fs here */
    u32 data_sector_count = sector_count
                                 - reserved_sectors
                                 - (u32) sectors_per_fat * fat_copies
                                 - ((max_root_entries * 32 + bytes_per_sector - 1) / bytes_per_sector);
    u32 data_cluster_count = data_sector_count / sectors_per_cluster;
    if(data_cluster_count < 4085 || data_cluster_count >= 65525)
        /* this is not a FAT16 */
        return 0;

    partition->type = PARTITION_TYPE_FAT16;

    /* fill header information */
    struct fat16_header_struct* header = &fs->header;
    memset(header, 0, sizeof(*header));
    
    header->size = sector_count * bytes_per_sector;

    header->fat_offset = /* jump to partition */
                         partition_offset +
                         /* jump to fat */
                         (u32) reserved_sectors * bytes_per_sector;
    header->fat_size = (data_cluster_count + 2) * 2;

    header->sector_size = bytes_per_sector;
    header->cluster_size = (u32) bytes_per_sector * sectors_per_cluster;

    header->root_dir_offset = /* jump to fats */
                              header->fat_offset +
                              /* jump to root directory entries */
                              (u32) fat_copies * sectors_per_fat * bytes_per_sector;

    header->cluster_zero_offset = /* jump to root directory entries */
                                  header->root_dir_offset +
                                  /* skip root directory entries */
                                  (u32) max_root_entries * 32;

    return 1;
}

/**
 * \ingroup fat16_fs
 * Reads a directory entry of the root directory.
 *
 * \param[in] fs Descriptor of file system to use.
 * \param[in] entry_num The index of the directory entry to read.
 * \param[out] dir_entry Directory entry descriptor which will get filled.
 * \returns 0 on failure, 1 on success
 * \see fat16_read_sub_dir_entry, fat16_read_dir_entry_by_path
 */
u8 fat16_read_root_dir_entry(const struct fat16_fs_struct* fs, u16 entry_num, struct fat16_dir_entry_struct* dir_entry)
{
    if(!fs || !dir_entry)
        return 0;

    /* we read from the root directory entry */
    const struct fat16_header_struct* header = &fs->header;
    device_read_interval_t device_read_interval = fs->partition->device_read_interval;
    u8 buffer[32];

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合久久久久综合99| 国产日韩精品一区二区浪潮av| 中文字幕中文字幕一区二区| 东方欧美亚洲色图在线| 国产欧美日韩在线| 97久久久精品综合88久久| 国产精品国产自产拍在线| thepron国产精品| 一区二区三区不卡视频在线观看| 日本韩国欧美一区| 亚洲成人av一区二区三区| 欧美日韩国产高清一区二区 | 91日韩精品一区| 在线免费不卡视频| 91精品国产综合久久精品图片 | aaa欧美日韩| 欧美一区二区三区在线观看| 99久久免费视频.com| 欧美日韩亚洲不卡| 日韩美一区二区三区| 亚洲欧美一区二区三区久本道91 | proumb性欧美在线观看| 亚洲三级在线看| 欧美三级日韩在线| 精品一二线国产| 中文在线一区二区| 欧美日本一道本| 精品亚洲porn| 亚洲美女免费视频| 精品日韩在线一区| 91小视频在线| 精品在线亚洲视频| 亚洲精品中文字幕在线观看| 日韩视频一区二区三区| jizzjizzjizz欧美| 免费精品视频在线| 自拍偷拍亚洲激情| 久久先锋影音av| 日本久久电影网| 国产一区二区三区四| 亚洲韩国精品一区| 日本一区二区三区高清不卡| 欧美日韩亚洲综合| 99久久精品免费观看| 久久精品国产精品亚洲精品| 亚洲欧洲av在线| www成人在线观看| 欧美日韩一区二区三区四区 | 欧美精品在线一区二区三区| 国产精品影视在线观看| 日本欧洲一区二区| 一区二区三区小说| 日本一区二区三区四区| 欧美一二三区在线| 欧美日本韩国一区二区三区视频| jizz一区二区| 丁香婷婷综合激情五月色| 欧美96一区二区免费视频| 亚洲视频精选在线| 国产欧美精品区一区二区三区| 欧美电影在线免费观看| 色综合天天在线| 成人avav影音| 成人一区在线观看| 国产精品正在播放| 精品一区二区三区在线播放| 亚洲一区二区三区四区的 | 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 激情深爱一区二区| 国产精品素人视频| 欧美videossexotv100| 奇米影视一区二区三区| 国产亚洲成aⅴ人片在线观看 | 在线观看区一区二| 国产日韩欧美激情| 国产网红主播福利一区二区| 精品少妇一区二区三区| 7799精品视频| 在线播放一区二区三区| 欧洲一区二区三区在线| 在线观看91精品国产入口| 91豆麻精品91久久久久久| 色美美综合视频| 在线精品视频一区二区| 欧美亚洲丝袜传媒另类| 欧美在线观看视频在线| 欧美日韩一区二区三区不卡| 欧美艳星brazzers| 欧美精品123区| 日韩午夜中文字幕| 精品久久久网站| 久久精品免费在线观看| 国产欧美日韩另类视频免费观看| 国产拍揄自揄精品视频麻豆| 国产精品美女久久久久久2018| 中文字幕av一区二区三区高 | 日韩美女主播在线视频一区二区三区| 欧美美女bb生活片| 日韩视频永久免费| 国产欧美一区二区三区在线看蜜臀| 中文字幕免费一区| 亚洲精品欧美综合四区| 午夜激情一区二区| 韩国女主播一区二区三区| 国产不卡视频一区| 色94色欧美sute亚洲线路一ni | 成人av在线资源| 色噜噜狠狠成人网p站| 欧美日韩一区二区在线视频| 欧美tickling网站挠脚心| 国产校园另类小说区| 亚洲色图欧洲色图婷婷| 污片在线观看一区二区| 国产在线精品一区二区不卡了| 高清beeg欧美| 欧美日韩一区久久| 26uuu国产在线精品一区二区| 综合色中文字幕| 日韩国产欧美在线播放| 国产高清视频一区| 欧美猛男男办公室激情| 高清国产一区二区| 欧美私人免费视频| 国产精品电影院| 91浏览器在线视频| 91精品国产一区二区人妖| 91精品国产综合久久小美女| 欧美精品一区二区精品网| 国产精品乱人伦一区二区| 午夜欧美一区二区三区在线播放| 久久国产精品露脸对白| 91激情在线视频| 国产婷婷一区二区| 国产精品一区二区三区四区| 国产精品色呦呦| 久久精品无码一区二区三区| 亚洲欧美视频在线观看| 精品一区二区免费| 欧美日韩一区高清| 成人免费在线观看入口| 老司机精品视频在线| 在线观看国产日韩| 国产精品久久久久天堂| 精品在线观看免费| 欧美卡1卡2卡| 亚洲免费在线电影| 国产69精品久久久久毛片| 日韩精品一区二区三区在线观看| 亚洲另类中文字| 丁香五精品蜜臀久久久久99网站| 欧美一区二区三区男人的天堂 | 777a∨成人精品桃花网| 国产精品久久久久影院老司| 久久成人综合网| 欧美丰满一区二区免费视频 | 天天操天天综合网| 欧美在线999| 亚洲免费av网站| 91在线码无精品| 中文字幕中文字幕中文字幕亚洲无线| 国产激情视频一区二区在线观看 | 国产在线国偷精品免费看| 制服丝袜av成人在线看| 亚洲午夜久久久久久久久电影网| av在线播放不卡| 中文字幕精品一区二区三区精品 | 国产日韩亚洲欧美综合| 久久精品国产澳门| 精品国产亚洲在线| 激情文学综合丁香| 精品精品国产高清a毛片牛牛| 日本aⅴ免费视频一区二区三区 | 欧美熟乱第一页| 亚洲综合激情网| 色噜噜久久综合| 亚洲一区在线视频观看| 在线观看成人免费视频| 亚洲综合色自拍一区| 欧美性大战久久久| 日本欧美一区二区在线观看| 欧美一区二区精美| 日本欧美一区二区| 26uuu精品一区二区三区四区在线| 极品少妇xxxx精品少妇| 97精品久久久午夜一区二区三区| 亚洲成人av电影在线| 亚洲精品欧美综合四区| 不卡一区二区中文字幕| 国产美女久久久久| 亚洲国产成人va在线观看天堂 | 欧美一区二区国产| 欧美肥大bbwbbw高潮| 国产91对白在线观看九色| 久色婷婷小香蕉久久| 亚洲成年人影院| 一区二区高清免费观看影视大全| 国产欧美一二三区| 日韩欧美aaaaaa| 欧美国产成人精品| 色婷婷av久久久久久久|