fat12.h

00001 /***************************************************************************
00002                           fat12.h  -  description
00003                           -----------------------
00004     begin                : 
00005     copyright            : (C) 2004 by Dynacube Team
00006     email                :
00007  ***************************************************************************/
00008 
00009 /***************************************************************************
00010  *                                                                         *
00011  *   This program is free software; you can redistribute it and/or modify  *
00012  *   it under the terms of the GNU General Public License as published by  *
00013  *   the Free Software Foundation; either version 2 of the License, or     *
00014  *   (at your option) any later version.                                   *
00015  *                                                                         *
00016  ***************************************************************************/
00017  
00018 #ifndef __FAT12_H
00019 #define __FAT12_H
00020 
00021 #include "common/string.h"
00022 #include "proc/proc.h"
00023 #include "mm/mm.h"
00024 #include "dev/core/cmos.h"
00025 
00026 #define FORM_INT(a,b) ((b<<8)|a)
00027 #define FORM_LONG(a,b,c,d) ((d<<24)|(c<<16)|(b<<8)|a)
00028 #define MAX_FILE 10
00029 #define MAX_DIR 10
00030 
00031 #define BYTE1(a) (a&0xff)
00032 #define BYTE2(a) ((a>>8)&0xff)
00033 #define BYTE3(a) ((a>>16)&0xff)
00034 #define BYTE4(a) ((a>>24)&0xff)
00035 
00036 //Attributes in Root Directory
00037 
00038 #define ATTR_READ_ONLY 0x01
00039 #define ATTR_HIDDEN 0x02
00040 #define ATTR_SYSTEM 0x04
00041 #define ATTR_VOLUME_ID 0x08
00042 #define ATTR_DIRECTORY 0x10
00043 #define ATTR_ARCHIVE 0x20
00044 #define ATTR_LONG_NAME 0xf
00045 #define ATTR_LONG_NAME_MASK 0x3F
00046 
00047 //Start Sector Values
00048 
00049 #define BOOT_SEC 0
00050 #define FAT1_SEC 1
00051 #define FAT2_SEC 10
00052 #define ROOT_SEC 19
00053 #define DATA_SEC 33
00054 #define MAX_BLOCK 2849
00055 #define MAX_SECTOR 2880
00056 
00057 //Number of Entries
00058 
00059 #define DIR_ENTRIES 16
00060 
00061 
00062 // FAT Entry Values
00063 
00064 #define UNUSED 0
00065 #define RESERVED1 0xff0
00066 #define RESERVED2 0xff6
00067 #define BADCLUSTER 0xff7
00068 #define EOF1 0xFF8
00069 #define EOF2 0xFFF
00070 #define EOF(in) (in >= EOF1 && in <= EOF2)
00071 
00072 //Root Directory Dir[0] values
00073 
00074 #define FREE 0xE5
00075 #define REST_FREE 0x0
00076 #define KANJI 0x05
00077 
00078 //Error
00079 
00080 #define E_DISK            -1
00081 #define E_FS_NEXISTS      -2
00082 #define E_FS_EXISTS       -3
00083 #define E_FS_FNAME        -4
00084 #define E_FS_SPACE        -5
00085 #define E_FS_BUSY         -6
00086 #define E_NOT_LONG        -7
00087 #define E_FS_BADREQ       -8
00088 
00089 #define O_RDONLY 1
00090 #define O_RDWR   2
00091 
00092 #define MAX_FS_REQ 50
00093 
00094 //TYPES Of Requests
00095 
00096 #define OPEN            1
00097 #define CLOSE           2
00098 #define READ            3
00099 #define WRITE           4
00100 #define CREATEFIL       5
00101 #define OPENDIR         6
00102 #define CREATEDIR       7
00103 #define CLOSEDIR        8
00104 #define READDIR         9
00105 #define REMOVE          10
00106 #define RENAME          11
00107 
00108 #define LOAD            12
00109 
00110 struct boot_sector
00111  {
00112  char jumpBoot[3];
00113  char SysName[8];
00114  int charsPerSector;
00115  char SectorsPerCluster;
00116  int ReservedSectors;
00117  char FATcount;
00118  int MaxRootEntries;
00119  int TotalSectors1;
00120  char MediaDescriptor;
00121  int SectorsPerFAT;
00122  int SectorsPerTrack;
00123  int HeadCount;
00124  long HiddenSectors;
00125  long TotalSectors2;
00126  char DriveNumber;
00127  char Reserved1;
00128  char ExtBootSignature;
00129  long VolumeSerial;
00130  char VolumeLabel[11];
00131  char Reserved2[8];
00132 };
00133 struct dir_entry
00134  {
00135   char Filename[8];
00136   char Extension[3];
00137   char Attributes;
00138   char NTRes;
00139   char CrtTimeTenth;
00140   int CrtTime;
00141   int CrtDate;
00142   int LstAccDate;
00143   int FstClusHI;
00144   int WrtTime;
00145   int WrtDate;
00146   int FstClusLO;
00147   long FileSize;
00148  };
00149 
00150 typedef struct
00151 {
00152         char name[256];
00153         char attribute;
00154         DATE crt_dt;
00155         TIME crt_time;
00156         DATE acc_dt;
00157         long clu;
00158         long size;
00159         DATE mod_dt;
00160         TIME mod_time;
00161 } DIRENT;
00162 struct long_dir_entry
00163  {
00164   char LDIR_Ord;
00165   unsigned char LDIR_Name1[10];
00166   char LDIR_Attr;
00167   char LDIR_Type;
00168   char LDIR_Chksum;
00169   unsigned char LDIR_Name2[12];
00170   int  LDIR_FstClusLO;
00171   unsigned char LDIR_Name3[4];
00172  };
00173 struct sector
00174  {
00175   int base;
00176   int length;
00177  };
00178 struct file_des
00179  {
00180     int avl;
00181     char fname[256];
00182     int mode;
00183     int sec_offset;
00184     int offset;
00185     unsigned char buffer[512];
00186     long length;
00187     long tot_offset;
00188     struct dir_entry rs;
00189     int root_sec;
00190     int root_in;
00191  };
00192  extern struct file_des fd[MAX_PROC][MAX_FILE];
00193 struct dir_des
00194  {
00195     int avl;
00196     char fname[256];
00197     int sec_offset;
00198     int offset;
00199     unsigned char buffer[512];
00200  };
00201 extern struct dir_des dd[MAX_PROC][MAX_DIR];
00202 
00203 typedef struct
00204 {
00205   int type;
00206   int from_pid;
00207   union
00208   {
00209         struct
00210         {
00211                 char *fname;
00212                 int mode;
00213         }op;
00214         struct
00215         {
00216                 int fd_in;
00217         }cl;
00218         struct
00219         {
00220                 int fd_in;
00221                 char *buf;
00222                 int len;
00223         }re;
00224         struct
00225         {
00226                 int fd_in;
00227                 char *buf;
00228                 int len;
00229         }wr;
00230         struct
00231         {
00232                 char *name;
00233         }cr;
00234 
00235         struct
00236         {
00237                 char *dir_name;
00238         }opd;
00239         struct
00240         {
00241                 int dd_in;
00242         }cld;
00243         struct
00244         {
00245                 char *name;
00246         }crd;
00247 
00248         struct
00249         {
00250                 int dd_in;
00251                 DIRENT *dir;
00252         }red;
00253         struct
00254         {
00255                 char *old_name;
00256                 char *new_name;
00257         }ren;
00258         struct
00259         {
00260                 char *name;
00261         }rem;
00262   struct
00263   {
00264     char *fname;
00265   }load;
00266   };
00267 }fs_request;
00268 
00269 int form_time();
00270 void get_time(int ti,TIME *t);
00271 int form_date();
00272 
00273 unsigned char ChkSum (unsigned char *name);
00274 void parse_fat(int * fat_entry,int fat1,int fat2,int in);
00275 int read_fat(int *fat_entry,int in,int st_sec);
00276 int write_fat(int fat,int in,int st_sec);
00277 int write_dir(struct dir_entry *rs,int in,int st_sec);
00278 void print_dir(struct dir_entry *rs);
00279 void parse_dir(unsigned char *a,int in,struct dir_entry *rs);
00280 int read_dir(struct dir_entry *rs,int in,int st_sec);
00281 int write_long_dir(struct long_dir_entry *rs,int in,int st_sec);
00282 void parse_long_dir(struct long_dir_entry *rs,unsigned char *a,int i);
00283 void print_long_dir(struct long_dir_entry *rs);
00284 int read_long_dir(struct long_dir_entry *rs,int in,int st_sec);
00285 void print_boot_sector(struct boot_sector *bs);
00286 int read_boot_sector(struct boot_sector *bs);
00287 int write_boot_sector(struct boot_sector *bs);
00288 int read_sector(int offs,unsigned char *a);
00289 int write_sector(int offs,unsigned char *a);
00290 int clear_sec(int sec);
00291 void print_DIRENT(DIRENT *ds);
00292 int format(char *vlab);
00293 int get_next_sector(int sec);
00294 int get_free_sector(int prev);
00295 int get_free_entry(int *sec,int no_ent);
00296 int remove_chain(long clu);
00297 int get_long_name(char *long_name,unsigned char *a,int j,int *prev_sec,int cur);
00298 int rem_long_name(unsigned char *a,int j,int *prev_sec,int *c);
00299 int search(char *name,struct sector sec,struct dir_entry *rs,int *root_sec,int *root_in,int *prev_sec,int *s_cur);
00300 int get_part(char *name,int i);
00301 int get_dir_entry(char * dirname,struct dir_entry *rs,int *root_sec,int *root_in,int *prev,int *cur);
00302 int do_ls(int pid,char *dirname);
00303 int do_load(char *fname,int pid);
00304 
00305 int do_open(int pid,char *fname,int mode);
00306 int do_opendir(int pid,char *fname);
00307 int do_read(int pid,int fd_in,char *buf,int length);
00308 int do_readdir(int pid,int dd_in,DIRENT *dir);
00309 int do_write(int pid,int fd_in,char *buf,int length);
00310 int do_close(int pid,int fd_in);
00311 int do_closedir(int pid,int dd_in);
00312 int do_create(int pid,char *name,int is_dir);
00313 int fs_create(int pid,char *name);
00314 int do_createdir(int pid,char *name);
00315 int do_remove(int pid,char *name);
00316 int do_rename(int pid,char *old_name,char *new_name);
00317 void fs_init();
00318 int do_copy(int pid,char *src,char *dest);
00319 void runFS();
00320 int addfsreq(fs_request *r);
00321 void fscloseAll(DW pid);
00322 
00323 
00324 #endif

Generated on Thu Jul 27 23:52:26 2006 for Dynacube by  doxygen 1.4.7