亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
精品sm在线观看| 亚洲成a人片综合在线| 亚洲精品乱码久久久久久久久| 五月天一区二区| 国产黄色91视频| 日韩一区二区三区电影| 亚洲永久精品国产| 成人av在线资源网| 久久一二三国产| 日本三级韩国三级欧美三级| 91日韩精品一区| 国产无人区一区二区三区| 亚洲成人资源网| 色综合久久久久网| 亚洲欧洲国产日韩| 粉嫩aⅴ一区二区三区四区| 欧美一区二区福利在线| 亚洲3atv精品一区二区三区| 色综合视频一区二区三区高清| 久久亚洲精华国产精华液| 秋霞电影网一区二区| 欧美人成免费网站| 五月激情六月综合| 久久网站热最新地址| 精品一区二区国语对白| 欧美精品aⅴ在线视频| 亚洲福利视频一区二区| 91精品福利在线| 亚洲一区二区三区免费视频| 欧美在线一二三四区| 亚洲一区二区3| 欧美日韩高清一区二区不卡| 亚洲高清视频在线| 欧美乱妇23p| av亚洲精华国产精华| 精品影院一区二区久久久| 欧美剧在线免费观看网站 | 亚洲精品国产一区二区精华液| 国产成人免费在线| 中文在线一区二区| 不卡的电影网站| 亚洲欧美一区二区不卡| 欧美三级三级三级爽爽爽| 日本伊人色综合网| 精品不卡在线视频| 99视频精品免费视频| 亚洲美女视频一区| 91精品国产综合久久福利软件 | 4438x成人网最大色成网站| 午夜精品爽啪视频| 精品日韩欧美一区二区| 东方欧美亚洲色图在线| 亚洲精品精品亚洲| 日韩欧美激情四射| 国产大陆亚洲精品国产| 亚洲色图欧美激情| 日韩欧美在线综合网| 国产成人av在线影院| 亚洲国产综合在线| 欧美变态tickling挠脚心| 成人久久视频在线观看| 日韩中文欧美在线| 国产精品网曝门| 欧美裸体一区二区三区| 国产大片一区二区| 亚洲成人先锋电影| 久久精品一区二区三区不卡牛牛| 91亚洲精华国产精华精华液| 日本在线不卡一区| 国产精品乱码一区二区三区软件| 欧美色爱综合网| 东方欧美亚洲色图在线| 午夜影视日本亚洲欧洲精品| 国产色综合一区| 欧美精品乱人伦久久久久久| 成人永久看片免费视频天堂| 午夜精品123| 亚洲视频在线观看三级| 欧美变态tickle挠乳网站| 日本精品裸体写真集在线观看| 激情综合五月婷婷| 亚洲图片一区二区| 最新不卡av在线| 久久美女艺术照精彩视频福利播放| 欧美性感一类影片在线播放| 高清在线成人网| 成人av网站在线观看免费| 欧美日韩国产中文| 国产成人8x视频一区二区 | 91精品国产色综合久久| 亚洲日本va在线观看| 欧美日韩成人在线| 亚洲va韩国va欧美va| 欧美日韩国产大片| 日韩精品亚洲一区| 欧美mv和日韩mv的网站| 国产精品一级二级三级| 日本在线播放一区二区三区| 欧美亚洲日本一区| aa级大片欧美| 国产精品99精品久久免费| 天堂久久一区二区三区| 亚洲一区二区三区四区五区中文| 中文字幕在线观看不卡视频| 国产视频一区在线观看| 精品国产不卡一区二区三区| 日韩一级欧美一级| 91精品国产综合久久久久久漫画| 欧美在线一二三| 欧美色综合网站| 欧美巨大另类极品videosbest | 国产精品综合在线视频| 乱一区二区av| 日本sm残虐另类| 男男视频亚洲欧美| 日本不卡123| 另类的小说在线视频另类成人小视频在线 | 国产精品综合二区| 久久精品国产成人一区二区三区| 日韩精品成人一区二区在线| 日韩av高清在线观看| 青青青爽久久午夜综合久久午夜| 日韩电影网1区2区| 另类小说视频一区二区| 国产麻豆一精品一av一免费 | 91看片淫黄大片一级在线观看| 成人avav影音| 色狠狠综合天天综合综合| 欧美午夜宅男影院| 日韩欧美在线综合网| 久久精品在线观看| 亚洲视频小说图片| 视频一区免费在线观看| 极品美女销魂一区二区三区| 国产成人免费高清| 欧美视频日韩视频在线观看| 日韩欧美一区中文| 国产精品你懂的| 亚洲a一区二区| 国产伦精品一区二区三区视频青涩 | 国产精品色眯眯| 亚洲综合在线电影| 精品在线播放午夜| 色先锋aa成人| 欧美成人一区二区三区片免费 | 色婷婷精品久久二区二区蜜臀av | 亚洲欧美日韩久久| 亚洲国产wwwccc36天堂| 狠狠狠色丁香婷婷综合久久五月| 波多野结衣精品在线| 777欧美精品| 欧美激情在线看| 亚洲综合区在线| 国产一区二区三区在线看麻豆| 波多野结衣视频一区| 欧美一区二区三区人| 国产精品第13页| 日本不卡在线视频| 99精品欧美一区二区三区小说| 3d动漫精品啪啪| 亚洲视频一二区| 国产成人99久久亚洲综合精品| 欧美人妖巨大在线| 亚洲精品欧美综合四区| 国模一区二区三区白浆| 欧美区在线观看| 亚洲精品成人在线| 国产成人免费视频网站| 日韩午夜激情视频| 一区二区高清在线| 成人黄色一级视频| 久久久久综合网| 日韩经典一区二区| 在线视频欧美精品| 国产精品欧美一级免费| 国精品**一区二区三区在线蜜桃| 欧美日本在线看| 亚洲国产aⅴ天堂久久| 国产凹凸在线观看一区二区| 欧美精品v日韩精品v韩国精品v| 亚洲欧美日本在线| jvid福利写真一区二区三区| 精品播放一区二区| 激情深爱一区二区| 日韩免费看的电影| 婷婷成人综合网| 欧美日韩国产首页| 亚洲一区在线观看视频| 91久久人澡人人添人人爽欧美| 最新中文字幕一区二区三区| 国产成人免费在线观看不卡| 欧美精品一区二区三区在线播放| 日本欧美一区二区| 制服.丝袜.亚洲.中文.综合| 亚洲国产成人91porn| 欧美日韩极品在线观看一区| 亚洲综合自拍偷拍| 欧美年轻男男videosbes| 亚洲妇熟xx妇色黄| 欧美一区二区日韩|