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

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

?? fat.c

?? U盤MP3下的文件系統(完全兼容FAT16/FAT32)
?? C
?? 第 1 頁 / 共 5 頁
字號:
/*C**************************************************************************
* NAME:         fat.c
*----------------------------------------------------------------------------
* Copyright (c) 2003 Atmel.
*----------------------------------------------------------------------------
* RELEASE:      snd1c-refd-nf-4_0_3      
* REVISION:     1.41     
*----------------------------------------------------------------------------
* PURPOSE:
* FAT16/FAT12 file-system basics functions
* 
* NOTES:
* Supports only the first partition
* Supports only 512 bytes sector size
* Supports only file fragmentation < MAX_FILE_FRAGMENT_NUMBER
* Supports only one file openned at a time
*
* Global Variables:
*   - gl_buffer: array of bytes in pdata space
*****************************************************************************/

/*_____ I N C L U D E S ____________________________________________________*/

#include "config.h"                         /* system configuration */
#include "..\mem\hard.h"                    /* low level function definition */
#include "file.h"                           /* file function definition */
#include "fat.h"                            /* fat file-system definition */


/*_____ M A C R O S ________________________________________________________*/


/*_____ D E F I N I T I O N ________________________________________________*/

extern        bit     reserved_disk_space;
extern  pdata Byte    gl_buffer[];
extern  xdata Byte    fat_buf_sector[];  /* 512 bytes buffer */

extern  char  pdata *lfn_name; /* long filename limited to MAX_FILENAME_LEN chars */

/* disk management */
extern  data  Uint32  fat_ptr_fats;         /* address of the first byte of FAT */
extern  data  Uint32  fat_ptr_rdir;         /* address of the first byte of root dir */
extern  data  Uint32  fat_ptr_data;         /* address of the first byte of data */
extern  data  Byte    fat_cluster_size;     /* cluster size (sector count) */
extern  idata Byte    fat_cluster_mask;     /* mask for end of cluster test */

extern  bdata bit     dir_is_root;          /* TRUE: point the root directory  */
extern  bdata bit     fat_is_fat16;         /* TRUE: FAT16 - FALSE: FAT12 */
extern  bdata bit     fat_open_mode;        /* READ or WRITE */
extern  bdata bit     fat_2_is_present;     /* TRUE: 2 FATs - FALSE: 1 FAT */
extern  bdata bit     flag_end_disk_file;


extern  xdata Uint32  fat_count_of_clusters;/* number of cluster - 2 */
extern  xdata Uint16  fat_root_entry;       /* position in root dir */
extern  xdata Union32 fat_file_size;
extern  xdata Uint16  fat_fat_size;         /* FAT size in sector count */


/* directory management */
extern  idata Uint32  fat_dir_current_sect; /* sector of selected entry in dir list */
extern  xdata Uint16  fat_dir_list_index;   /* index of current entry in dir list */
extern  xdata Uint16  fat_dir_list_last;    /* index of last entry in dir list */
extern  idata Uint16  fat_dclust_byte_count;/* byte counter in directory sector */
extern  idata Uint16  fat_dchain_index;     /* the number of the fragment of the dir, in fact
                                               the index of the table in the cluster chain */
extern  idata Byte    fat_dchain_nb_clust;  /* the offset of the cluster from the first cluster
                                               of the dir fragment */
extern  xdata Uint32  fat_dir_start_sect;   /* start sector of dir list */
extern  xdata Uint16  fat_dir_current_offs; /* entry offset from fat_dir_current_sect */
extern  xdata Byte    fat_last_dclust_index;/* index of the last cluster in directory chain */
extern  xdata fat_st_cache   fat_cache;     /* The cache structure, see the .h for more info */
extern  xdata fat_st_clust_chain dclusters[MAX_DIR_FRAGMENT_NUMBER];
                                            /* cluster chain for the current directory */
extern  xdata char  ext[3];                 /* file extension (limited to 3 characters) */
#define fat_dir_entry_list  fat_buf_sector  /* manual variable overlay */


/* file management */
extern  data  Uint16  fat_fclust_byte_count;/* byte counter in file cluster */
extern  idata Byte    fat_last_clust_index; /* index of the last cluster in file chain */
extern  idata Byte    fat_fchain_index;     /* the number of the fragment of the file, in fact
                                               the index of the table in the cluster chain */
extern  idata Uint16  fat_fchain_nb_clust;  /* the offset of the cluster from the first cluster
                                               of the file fragment */

extern  xdata fat_st_clust_chain fclusters[MAX_FILE_FRAGMENT_NUMBER];
                                            /* cluster chain for the current file */


/* Mode repeat A/B variables */
extern xdata  Byte    fat_fchain_index_save;         
extern xdata  Byte    fat_fchain_nb_clust_save;
extern xdata  Uint16  fat_fclust_byte_count_save;

static xdata fat_st_free_space free_space;

/*_____ D E C L A R A T I O N ______________________________________________*/

static  void    fat_get_dir_entry (fat_st_dir_entry xdata *);
static  void    fat_get_dir_file_list (Byte);
static  bit     fat_get_clusters (fat_st_clust_chain xdata *, Byte);
static  bit     fat_set_clusters (void);
static  bit     fat_dopen (void);
static  bit     fat_dseek (Int16);
static  Byte    fat_dgetc (void);

code Byte PBR_record_part1[] =
{
  0xEB, 0x3C, 0x90, /* JMP instruction to boot code */
  'O', 'E', 'M', ' ', 'N', 'A', 'M', 'E', /* OEM name */
  SECTOR_SIZE, SECTOR_SIZE >> 8, /* number of bytes per sector */
  0x00, /* number of sector per cluster */
  NB_RESERVED, NB_RESERVED >> 8, /* number of reserved sector */
  NB_FATS, /* number of FAT */
  NB_ROOT_ENTRY, NB_ROOT_ENTRY >> 8, /* number of root directory entries */
  0x00, 0x00, /* total sectors if less than 65535 */
  HARD_DISK, /* media byte */
};

code Byte PBR_record_part2[] =
{
  FAT_DRIVE_NUMBER, /* Drive number */
  0x00, /* not used */
  FAT_EXT_SIGN, /* extended boot signature */
  0x00, 0x00, 0x00, 0x00, /* volume ID */
  'N', 'O', ' ', 'N', 'A', 'M', 'E', ' ', ' ', ' ', ' ', /* volume label */
  'F', 'A', 'T', '1', 0x00, ' ', ' ', ' ', /* File system type in ASCII */

};

/*F**************************************************************************
* NAME: fat_load_sector
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
*   This function load a sector in fat_buf_sector
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*----------------------------------------------------------------------------
* REQUIREMENTS:
*   
*****************************************************************************/
bit fat_load_sector(Uint32 sector)
{
Uint16 i;
  if (Hard_read_open(sector) == OK)
  {
    for (i = 0; i < (SECTOR_SIZE); i++)
    {
      fat_buf_sector[i++] = Hard_read_byte();
      fat_buf_sector[i++] = Hard_read_byte();
      fat_buf_sector[i++] = Hard_read_byte();
      fat_buf_sector[i]   = Hard_read_byte();
    }
    Hard_read_close();
    return OK;
  }
  else
  {
    return KO;
  }
}

/*F**************************************************************************
* NAME: fat_install
*----------------------------------------------------------------------------
* PARAMS:
*
* return:
*   - OK: intallation succeeded
*   - KO: - partition 1 signature not recognized
*         - FAT type is not FAT12/FAT16
*         - sector size is not 512 bytes
*         - MBR or PBR signatures are not correct
*         - low level read open failure
*----------------------------------------------------------------------------
* PURPOSE:
*   Install the fat system, read mbr, bootrecords...
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*   if MBR not found, try to mount unpartitionned FAT
*   sector size is fixed to 512 bytes to simplify low level drivers
*   fat_ptr_fats = partition offset + nb_reserved_sector
*   fat_ptr_rdir = fat_ptr_fat + fat_size * nb_fat
*   fat_ptr_data = fat_ptr_rdir + nb_root_entries * 32 / 512
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
bit fat_install (void)
{          
Uint32 fat_nb_sector;

  /* MBR/PBR determination */
  fat_ptr_fats = 1;
  if (fat_load_sector(MBR_ADDRESS) == OK)
  {
    
    if ((fat_buf_sector[0] == 0xEB) &&      /* PBR Byte 0 */
        (fat_buf_sector[2] == 0x90) &&      /* PBR Byte 2 */
        ((fat_buf_sector[21] & 0xF0) == 0xF0)) /* PBR Byte 21 : Media byte */
    {
      if ((fat_buf_sector[510] != LOW(BR_SIGNATURE)) &&         /* check PBR signature */
          (fat_buf_sector[511] != HIGH(BR_SIGNATURE)))
      {
        return KO;
      }
      else
      {
        fat_ptr_fats = 0x00000000; /* first sector is PBR */
      }
    }
    else
    {   /* first sector is MBR */
      if ((fat_buf_sector[446] != PARTITION_ACTIVE) && 
          (fat_buf_sector[446] != 0x00))
      {
        return KO;                            /* not a MBR */
      }
      else
      {
        /* read partition offset (in sectors) at offset 8 */
        ((Byte*)&fat_ptr_fats)[3] = fat_buf_sector[454];
        ((Byte*)&fat_ptr_fats)[2] = fat_buf_sector[455];
        ((Byte*)&fat_ptr_fats)[1] = fat_buf_sector[456];
        ((Byte*)&fat_ptr_fats)[0] = fat_buf_sector[457];
        if ((fat_buf_sector[510] != LOW(BR_SIGNATURE)) &&         /* check PBR signature */
            (fat_buf_sector[511] != HIGH(BR_SIGNATURE)))
        {
          return KO;
        }

      }

    }
  }
  else
  {
    return KO;
  }

  /* read and check usefull PBR info */
  if (fat_load_sector(fat_ptr_fats) == OK) 
  {
    if ((fat_buf_sector[11] != LOW(SECTOR_SIZE)) ||  /* read sector size (in bytes) */
        (fat_buf_sector[12] != HIGH(SECTOR_SIZE)))
    {
      return KO;
    }

    /* read cluster size (in sector) */
    fat_cluster_size = fat_buf_sector[13];
    fat_cluster_mask = HIGH((Uint16)fat_cluster_size * SECTOR_SIZE) - 1;
    /* compute FATs sector address: add reserved sector number */
    fat_ptr_fats += fat_buf_sector[14];
    fat_ptr_fats += (Uint16)fat_buf_sector[15] << 8;
    /* read number of FATs */
    if (fat_buf_sector[16] == 2)
      fat_2_is_present = TRUE;
    else
      fat_2_is_present = FALSE;
    /* read number of dir entries  and compute rdir offset */
    ((Byte*)&fat_ptr_data)[3] = fat_buf_sector[17];
    ((Byte*)&fat_ptr_data)[2] = fat_buf_sector[18];
    ((Byte*)&fat_ptr_data)[1] = 0;
    ((Byte*)&fat_ptr_data)[0] = 0;
    fat_ptr_data = (fat_ptr_data * DIR_SIZE) / SECTOR_SIZE;
    /* read number of sector in partition (<32Mb) */
    ((Byte*)&fat_nb_sector)[3] = fat_buf_sector[19];
    ((Byte*)&fat_nb_sector)[2] = fat_buf_sector[20];
    ((Byte*)&fat_nb_sector)[1] = 0x00;
    ((Byte*)&fat_nb_sector)[0] = 0x00;
    /* compute root directory sector address */
    ((Byte*)&fat_fat_size)[1] = fat_buf_sector[22];
    ((Byte*)&fat_fat_size)[0] = fat_buf_sector[23];
    
    fat_ptr_rdir = fat_buf_sector[16] * fat_fat_size;
    fat_ptr_rdir += fat_ptr_fats;

    /* read number of sector in partition (>32Mb) */
    if (!fat_nb_sector)
    {
      ((Byte*)&fat_nb_sector)[3] = fat_buf_sector[32];
      ((Byte*)&fat_nb_sector)[2] = fat_buf_sector[33];
      ((Byte*)&fat_nb_sector)[1] = fat_buf_sector[34];
      ((Byte*)&fat_nb_sector)[0] = fat_buf_sector[35];
    }

    fat_count_of_clusters = (fat_nb_sector - (1 + (fat_buf_sector[16] * fat_fat_size) + fat_ptr_data)) 
                            / fat_cluster_size;
    if (fat_count_of_clusters <= MAX_CLUSTERS12)
      fat_is_fat16 = FALSE;
    else
      if (fat_count_of_clusters <= MAX_CLUSTERS16)
        fat_is_fat16 = TRUE;
      /* else is FAT32 not supported */

    /* compute data sector address */
    fat_ptr_data += fat_ptr_rdir;
    /* check partition signature */
    if ((fat_buf_sector[510] != LOW(BR_SIGNATURE)) &&
        (fat_buf_sector[511] != HIGH(BR_SIGNATURE)))
    {
      return KO;
    }

    return OK;
  }
  else
  { /* low level error */
    return KO;
  }
}


/*F**************************************************************************
* NAME: fat_get_dir_entry
*----------------------------------------------------------------------------
* PARAMS:
*   entry: directory entry structure
*
* return:
*----------------------------------------------------------------------------
* PURPOSE:
*   Get from directory all information about a directory or file entry
*----------------------------------------------------------------------------
* EXAMPLE:
*----------------------------------------------------------------------------
* NOTE:
*   This function reads directly datas from sectors
*   It automaticaly computes difference between LFN and normal entries
*----------------------------------------------------------------------------
* REQUIREMENTS:
*****************************************************************************/
void fat_get_dir_entry (fat_st_dir_entry xdata *entry)
{
bit     exit_flag = FALSE;
bit     lfn_entry_found = FALSE;
Byte    i;

  /* clear the name buffer */
  for (i = MAX_FILENAME_LEN; i != 0; lfn_name[--i] = '\0');

  while (!exit_flag)
  /* loop while the entry is not a normal one. */
  {
    /* read the directory entry */
    if (dir_is_root == TRUE)
    { /* root dir is linear -> Hard_read_byte() */
      for (i = 0; i < DIR_SIZE; i++)
        gl_buffer[i] = Hard_read_byte();
    }
    else
    { /* subdir can be fragmented -> dgetc() */
      for (i = 0; i < DIR_SIZE; i++)
        gl_buffer[i] = fat_dgetc();
    }

    /*computes gathered data
    /* check if we have a LFN entry */
    if (gl_buffer[11] != ATTR_LFN_ENTRY)
    {
      if (!lfn_entry_found)
      {
        /* true DOS 8.3 entry format */
        for (i = 0; i < 8; i++)
        {
          lfn_name[i] = gl_buffer[i];
          
          if (lfn_name[i] == ' ')
          { /* space is end of name */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合久久久久综合99| 精品国产一区二区三区av性色 | 91福利国产成人精品照片| 欧美一a一片一级一片| 久久精品视频一区| 午夜视黄欧洲亚洲| 99riav久久精品riav| 久久亚洲欧美国产精品乐播| 尤物视频一区二区| 国产二区国产一区在线观看| 91精品在线观看入口| 亚洲另类一区二区| 国产成人综合在线观看| 日韩欧美国产一二三区| 亚洲大片免费看| 色婷婷精品大视频在线蜜桃视频 | 国产午夜精品美女毛片视频| 日韩av一区二区三区四区| 99久久精品久久久久久清纯| www一区二区| 久久国产福利国产秒拍| 欧美日韩成人在线一区| 亚洲一区二区av在线| 色综合咪咪久久| 国产精品不卡一区| 高清成人免费视频| 国产亚洲成av人在线观看导航| 麻豆久久久久久| 日韩亚洲欧美成人一区| 日本女优在线视频一区二区| 欧美无乱码久久久免费午夜一区| 最近日韩中文字幕| 91视频一区二区三区| 日韩美女久久久| 91网站在线播放| 亚洲欧美另类在线| 色女孩综合影院| 亚洲一区二区不卡免费| 欧美熟乱第一页| 五月婷婷久久丁香| 91精品国产一区二区三区| 日本欧美一区二区| 欧美精品一区二区三区蜜臀 | 亚洲精品中文字幕在线观看| 91免费在线视频观看| 亚洲精品你懂的| 欧美三级视频在线观看| 五月婷婷激情综合网| 日韩女优制服丝袜电影| 国产精品中文字幕欧美| 国产精品区一区二区三区| 99re6这里只有精品视频在线观看| 亚洲人成小说网站色在线| 欧美性一区二区| 日本成人在线网站| 久久久久国产一区二区三区四区| 成人午夜av电影| 亚洲一线二线三线久久久| 欧美日本一道本| 国产精品一线二线三线精华| 亚洲欧洲av色图| 欧美精品一二三| 粉嫩久久99精品久久久久久夜| 中文字幕五月欧美| 欧美福利一区二区| 大白屁股一区二区视频| 亚洲愉拍自拍另类高清精品| 欧美videos大乳护士334| 成人免费黄色在线| 偷拍一区二区三区| 久久精品视频一区| 精品视频一区 二区 三区| 极品少妇xxxx精品少妇偷拍| 亚洲视频 欧洲视频| 欧美一区二区福利在线| 99久久精品国产一区| 天堂久久久久va久久久久| 国产欧美1区2区3区| 欧美色男人天堂| 成人小视频在线观看| 天堂久久一区二区三区| 中文字幕亚洲一区二区av在线 | 亚洲一区中文日韩| 久久免费视频色| 欧美日韩成人综合天天影院 | 欧美精品一区二区三区很污很色的 | 欧美色偷偷大香| 国产精品资源网站| 偷拍亚洲欧洲综合| 亚洲欧美日韩中文播放| 欧美精品一区二区三区在线播放| 欧美视频一区在线| 成人黄色在线网站| 国产资源精品在线观看| 亚洲一本大道在线| 18欧美亚洲精品| 国产女同互慰高潮91漫画| 欧美一区二区三区啪啪| 色八戒一区二区三区| 丁香五精品蜜臀久久久久99网站| 蜜桃av一区二区在线观看| 亚洲成人你懂的| 亚洲乱码日产精品bd| 欧美高清在线一区| 久久一区二区视频| 日韩一区二区三区av| 欧美做爰猛烈大尺度电影无法无天| 成人午夜短视频| 国产成人h网站| 国产乱码精品一区二区三区五月婷| 日韩黄色一级片| 亚洲成a人v欧美综合天堂| 国产精品国模大尺度视频| 国产欧美日韩精品一区| 国产欧美日韩不卡免费| 中文字幕国产一区| 国产精品视频麻豆| 国产精品麻豆久久久| 欧美国产禁国产网站cc| 国产精品免费看片| 亚洲欧美日韩国产一区二区三区| 国产精品电影一区二区| 亚洲视频一二区| 一区二区三区四区视频精品免费| 综合色中文字幕| 一区二区三区资源| 亚洲不卡av一区二区三区| 亚洲第一福利视频在线| 肉色丝袜一区二区| 乱一区二区av| 国产**成人网毛片九色 | 免费成人av资源网| 国产一区二区美女| caoporen国产精品视频| 色婷婷综合久久久久中文一区二区 | 成人欧美一区二区三区视频网页 | 日本一区二区三区四区在线视频| 国产蜜臀av在线一区二区三区| 中文字幕在线观看一区| 亚洲女同女同女同女同女同69| 亚洲宅男天堂在线观看无病毒| 日日噜噜夜夜狠狠视频欧美人 | 成人动漫精品一区二区| 色天使色偷偷av一区二区| 777欧美精品| 久久精品夜色噜噜亚洲a∨| 国产精品入口麻豆原神| 性做久久久久久免费观看欧美| 老司机精品视频导航| youjizz国产精品| 91精品视频网| 欧美极品aⅴ影院| 午夜精品久久久久久久99樱桃| 激情综合色综合久久综合| 99久久777色| 日韩欧美一区二区免费| 国产精品久久午夜夜伦鲁鲁| 五月天视频一区| 丁香婷婷综合激情五月色| 欧美日韩在线三区| 久久久不卡网国产精品二区| 一区二区三区在线播放| 国产呦萝稀缺另类资源| 欧美日本一区二区三区四区| 国产精品美女www爽爽爽| 人人超碰91尤物精品国产| 波多野结衣中文字幕一区 | 国产婷婷色一区二区三区| 亚洲天堂免费看| 国产一区二区三区在线观看精品 | 日韩欧美国产一二三区| 亚洲精品美国一| 国产精品一二三四| 欧美一个色资源| 一区二区三国产精华液| 成人一区二区在线观看| 日韩视频一区二区在线观看| 亚洲欧洲韩国日本视频| 国产精品一线二线三线| 日韩一区二区三| 午夜av一区二区| 欧美性猛片xxxx免费看久爱| 国产精品久久久爽爽爽麻豆色哟哟 | 一区二区三区在线影院| 国产+成+人+亚洲欧洲自线| 日韩女优av电影| 日韩 欧美一区二区三区| 欧美三区在线观看| 亚洲激情第一区| 91婷婷韩国欧美一区二区| 国产欧美一区二区三区在线看蜜臀 | 欧美日韩一级二级三级| 亚洲女人****多毛耸耸8| a亚洲天堂av| 亚洲视频精选在线| gogo大胆日本视频一区| 国产精品高潮呻吟久久| 成人性生交大片免费看在线播放 | 91精品国产乱| 午夜a成v人精品|