source: soft/giet_vm/giet_fat32/fat32.h @ 345

Last change on this file since 345 was 300, checked in by cfuguet, 11 years ago

The disk image used by the GIET_VM does not contain
anymore a Master Boot Record (MBR) as we do not need
multiple partitions.

The only filesystem in the disk is the FAT32 which
starts at sector 0 (Volume Boot Record).

  • Property svn:executable set to *
File size: 10.5 KB
Line 
1////////////////////////////////////////////////////////////////////////////
2// File     : fat32.h
3// Date     : 01/09/2013
4// Author   : Marco Jankovic / Alain Greiner
5// Copyright (c) UPMC-LIP6
6////////////////////////////////////////////////////////////////////////////
7
8#ifndef _FAT32_H
9#define _FAT32_H
10
11#include "giet_config.h"
12
13/*************** Partition Boot Sector Format ******************************************/
14//                                     offset |  length
15#define BS_JMPBOOT                          0 ,  3
16#define BS_OEMNAME                          3 ,  8
17#define BPB_BYTSPERSEC                     11 ,  2
18#define BPB_SECPERCLUS                     13 ,  1
19#define BPB_RSVDSECCNT                     14 ,  2
20#define BPB_NUMFATS                        16 ,  1
21#define BPB_ROOTENTCNT                     17 ,  2
22#define BPB_TOTSEC16                       19 ,  2
23#define BPB_MEDIA                          21 ,  1
24#define BPB_FATSZ16                        22 ,  2
25#define BPB_SECPERTRK                      24 ,  2
26#define BPB_NUMHEADS                       26 ,  2
27#define BPB_HIDDSEC                        28 ,  4
28#define BPB_TOTSEC32                       32 ,  4
29#define BPB_PARTITION_TABLE               446 , 64
30
31// FAT 32
32#define BPB_FAT32_FATSZ32                  36 ,  4
33#define BPB_FAT32_EXTFLAGS                 40 ,  2
34#define BPB_FAT32_FSVER                    42 ,  2
35#define BPB_FAT32_ROOTCLUS                 44 ,  4
36#define BPB_FAT32_FSINFO                   48 ,  2
37#define BPB_FAT32_BKBOOTSEC                50 ,  2
38#define BS_FAT32_DRVNUM                    64 ,  1
39#define BS_FAT32_BOOTSIG                   66 ,  1
40#define BS_FAT32_VOLID                     67 ,  4
41#define BS_FAT32_VOLLAB                    71 , 11
42#define BS_FAT32_FILSYSTYPE                82 ,  8
43
44// Partitions
45#define FIRST_PARTITION_ACTIVE            446 ,  8
46#define FIRST_PARTITION_BEGIN_LBA         454 ,  4
47#define FIRST_PARTITION_SIZE              458 ,  4
48#define SECOND_PARTITION_ACTIVE           462 ,  8
49#define SECOND_PARTITION_BEGIN_LBA        470 ,  4
50#define SECOND_PARTITION_SIZE             474 ,  4
51#define THIRD_PARTITION_ACTIVE            478 ,  8
52#define THIRD_PARTITION_BEGIN_LBA         486 ,  4
53#define THIRD_PARTITION_SIZE              490 ,  4
54#define FOURTH_PARTITION_ACTIVE           494 ,  8
55#define FOURTH_PARTITION_BEGIN_LBA        502 ,  4
56#define FOURTH_PARTITION_SIZE             506 ,  4   
57/***************************************************************************************/
58
59#define MBR_SIGNATURE_POSITION            510 , 2
60#define MBR_SIGNATURE_VALUE               0xAA55 
61
62/************** FAT_FS_INFO SECTOR  ****************************************************/
63#define FS_SIGNATURE_VALUE_1              0x52526141
64#define FS_SIGNATURE_VALUE_2              0x72724161
65#define FS_SIGNATURE_VALUE_3              0x000055AA 
66#define FS_SIGNATURE_POSITION_1           0   , 4 
67#define FS_SIGNATURE_POSITION_2           484 , 4
68#define FS_SIGNATURE_POSITION_3           508 , 4 
69#define FS_FREE_CLUSTER                   488 , 4
70#define FS_FREE_CLUSTER_HINT              492 , 4
71/***************************************************************************************/
72
73#define DIR_ENTRY_SIZE          32
74                   
75/******* Directory Entry Structure (32 bytes) ******************************************/
76//                          offset | length
77#define DIR_NAME                 0 , 11   // dir_entry name
78#define DIR_ATTR                11 ,  1   // attributes
79#define DIR_NTRES               12 ,  1   // reserved for the OS       
80#define DIR_CRT_TIMES_TENTH     13 ,  1
81#define DIR_FST_CLUS_HI         20 ,  2   // cluster index 16 MSB bits
82#define DIR_WRT_TIME            22 ,  2   // time of last write
83#define DIR_WRT_DATE            24 ,  2   // date of last write
84#define DIR_FST_CLUS_LO         26 ,  2   // cluster index 16 LSB bit
85#define DIR_FILE_SIZE           28 ,  4   // file size (up to 4 giga bytes)
86/***************************************************************************************/
87
88/******* LFN Directory Entry Structure  (32 bytes) *************************************/
89//                          offset | length
90#define LDIR_ORD                 0 ,  1   // Sequence number (from 0x01 to 0x0f)   
91#define LDIR_NAME_1              1 , 10   // name broken into 3 parts
92#define LDIR_ATTR               11 ,  1   // attributes (must be 0x0F)
93#define LDIR_TYPE               12 ,  1   // directory type (must be 0x00)
94#define LDIR_CHKSUM             13 ,  1   // checksum of name in short dir 
95#define LDIR_NAME_2             14 , 12
96#define LDIR_RSVD               26 ,  2   // artifact of previous fat (must be 0)
97#define LDIR_NAME_3             28 ,  4   
98/***************************************************************************************/
99
100/***********************  DIR_ATTR values  (attributes) ********************************/
101#define ATTR_READ_ONLY          0x01
102#define ATTR_HIDDEN             0x02
103#define ATTR_SYSTEM             0x04
104#define ATTR_VOLUME_ID          0x08
105#define ATTR_DIRECTORY          0x10
106#define ATTR_ARCHIVE            0x20
107#define ATTR_LONG_NAME_MASK     0x0f      // READ_ONLY|HIDDEN|SYSTEM|VOLUME_ID
108/***************************************************************************************/
109
110/********************* DIR_ORD special values ******************************************/
111#define FREE_ENTRY              0xE5     // this entry is free in the directory
112#define NO_MORE_ENTRY           0x00     // no more entry in the directory
113/***************************************************************************************/
114
115/******************** CLuster Index Special Values *************************************/
116#define FREE_CLUSTER            0x00000000
117#define RESERVED_CLUSTER        0x00000001
118#define BAD_CLUSTER             0x0FFFFFF7
119#define END_OF_CHAIN_CLUSTER    0x0ffffff8
120/***************************************************************************************/
121
122#define FAT_INITIALISED         0xBABEF00D
123
124/************ This struct defines a file descriptor ************************************/
125typedef struct file_descriptor_s
126{
127   unsigned int  used;                      // descriptor contains an open file
128   unsigned int  first_cluster;             // first cluster index on disk
129   unsigned int  file_size;                 // number of bytes   
130   unsigned int  lba_dir_entry;             // lba of dir_entry for an open file
131   char          name[244];                 // pathname
132}  file_desc_t;
133/***************************************************************************************/
134
135/************ This struct describes a FAT32 disk **********************************/
136typedef struct fat32_fs_s
137{
138    char            fat_cache[512];          // FAT cache: 1 sector = 128 cluster indexes
139    file_desc_t     fd[GIET_OPEN_FILES_MAX]; // file descriptors array
140    unsigned int    initialised;             // contains 0xBABEF00D when FAT initialised
141    unsigned int    sector_size;             // number of bytes (power of 2)
142    unsigned int    sectors_per_cluster;     // power of 2 (must be greater than 4)
143    unsigned int    cluster_size;            // sector_size * sector_per_cluster (bytes)
144    unsigned int    fat_sectors;             // number of sectors occupied by one FAT copy
145    unsigned int    fat_lba;                 // lba of first FAT sector
146    unsigned int    data_lba;                // lba of first data sector 
147    unsigned int    cache_lba;               // lba of sector loaded in fat_cache
148    unsigned int    last_cluster_allocated;  // Last known cluster allocated
149    unsigned int    number_free_cluster;     // number of free clusters
150    unsigned int    fs_info_lba;             // lba of fs_info
151    unsigned int    lock;                    // lock protecting exclusive access
152} fat32_fs_t;
153/***************************************************************************************/
154
155/*********************** Export Functions  *********************************************/
156
157extern void _fat_print();
158
159// functions used for low level access to fat
160// (move sectors between block device and system buffers)
161
162extern int _fat_init(  unsigned int mode );        // mode for IOC driver
163
164extern int _fat_open(  unsigned int mode,          // mode for IOC driver
165                       char*  pathname,            // file pathname from root
166                       unsigned int create );      // create new file if non zero
167
168extern int _fat_read(  unsigned int mode,          // mode for IOC driver
169                       unsigned int fd_id,         // file descriptor index
170                       void*        buffer,        // destination buffer
171                       unsigned int count,            // number of sectors to read
172                       unsigned int offset );      // offset sector in file
173
174extern int _fat_write( unsigned int mode,         // mode for IOC driver
175                       unsigned int fd_id,        // file descriptor index
176                       void*        buffer,               // source buffer
177                       unsigned int count,        // number of sectors to write
178                       unsigned int offset );     // offset sector in file
179
180extern int _fat_fstat( unsigned int fd_id );      // file descriptor index
181
182extern int _fat_close( unsigned int fd_id );      // file descriptor index
183
184
185// functions used by user system calls
186// (should move bytes between system buffers and user buffers)
187
188extern int _fat_user_open(  char*        pathname,  // file pathname from root
189                            unsigned int flags );   // unused
190
191extern int _fat_user_read(  unsigned int fd_id,     // file descriptor index
192                            void*        buffer,    // destination buffer
193                            unsigned int count,     // number of sectors to read
194                            unsigned int offset );  // number of sectors to skip in file
195
196extern int _fat_user_write( unsigned int fd_id,     // file descriptor index
197                            void*        buffer,    // source buffer
198                            unsigned int count,     // number of sectors to write
199                            unsigned int offset );  // number of sectors to skip in file
200
201extern int _fat_user_lseek( unsigned int fd_id,
202                            unsigned int offset,
203                            unsigned int whence ); 
204
205/***************************************************************************************/
206
207
208#endif
209
210
211// Local Variables:
212// tab-width: 4
213// c-basic-offset: 4
214// c-file-offsets:((innamespace . 0)(inline-open . 0))
215// indent-tabs-mode: nil
216// End:
217// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
218
Note: See TracBrowser for help on using the repository browser.