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

Last change on this file since 295 was 295, checked in by alain, 11 years ago

Introducing a major release, to suppoort the tsar_generic_leti platform
and the various (external or internal) peripherals configurations.
The map.xml format has been modified, in order to support the new
vci_iopic componentand a new policy for peripherals initialisation.
The IRQs are nom described in the XICU and IOPIC components
(and not anymore in the processors).
To enforce this major change, the map.xml file signature changed:
The signature value must be: 0xDACE2014

This new release has been tested on the tsar_generic_leti platform
for the following mappings:

  • 4c_4p_sort_leti
  • 4c_4p_sort_leti_ext
  • 4c_4p_transpose_leti
  • 4c_4p_transpose_leti_ext
  • 4c_1p_four_leti_ext
  • Property svn:executable set to *
File size: 10.6 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 in partition
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 partition **********************************/
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    partition_sectors;       // total number of sectors (RESVD+FAT+DATA)
146    unsigned int    partition_lba;           // lba of first partiton sector
147    unsigned int    data_lba;                // lba of first data sector 
148    unsigned int    cache_lba;               // lba of sector loaded in fat_cache
149    unsigned int    last_cluster_allocated;  // Last known cluster allocated
150    unsigned int    number_free_cluster;     // number of free clusters
151    unsigned int    fs_info_lba;             // lba of fs_info
152    unsigned int    lock;                    // lock protecting exclusive access
153} fat32_fs_t;
154/***************************************************************************************/
155
156/*********************** Export Functions  *********************************************/
157
158extern void _fat_print();
159
160// functions used for low level access to fat
161// (move sectors between block device and system buffers)
162
163extern int _fat_init(  unsigned int mode );        // mode for IOC driver
164
165extern int _fat_open(  unsigned int mode,          // mode for IOC driver
166                       char*  pathname,            // file pathname from root
167                       unsigned int create );      // create new file if non zero
168
169extern int _fat_read(  unsigned int mode,          // mode for IOC driver
170                       unsigned int fd_id,         // file descriptor index
171                       void*        buffer,        // destination buffer
172                       unsigned int count,            // number of sectors to read
173                       unsigned int offset );      // offset sector in file
174
175extern int _fat_write( unsigned int mode,         // mode for IOC driver
176                       unsigned int fd_id,        // file descriptor index
177                       void*        buffer,               // source buffer
178                       unsigned int count,        // number of sectors to write
179                       unsigned int offset );     // offset sector in file
180
181extern int _fat_fstat( unsigned int fd_id );      // file descriptor index
182
183extern int _fat_close( unsigned int fd_id );      // file descriptor index
184
185
186// functions used by user system calls
187// (should move bytes between system buffers and user buffers)
188
189extern int _fat_user_open(  char*        pathname,  // file pathname from root
190                            unsigned int flags );   // unused
191
192extern int _fat_user_read(  unsigned int fd_id,     // file descriptor index
193                            void*        buffer,    // destination buffer
194                            unsigned int count,     // number of sectors to read
195                            unsigned int offset );  // number of sectors to skip in file
196
197extern int _fat_user_write( unsigned int fd_id,     // file descriptor index
198                            void*        buffer,    // source buffer
199                            unsigned int count,     // number of sectors to write
200                            unsigned int offset );  // number of sectors to skip in file
201
202extern int _fat_user_lseek( unsigned int fd_id,
203                            unsigned int offset,
204                            unsigned int whence ); 
205
206/***************************************************************************************/
207
208
209#endif
210
211
212// Local Variables:
213// tab-width: 4
214// c-basic-offset: 4
215// c-file-offsets:((innamespace . 0)(inline-open . 0))
216// indent-tabs-mode: nil
217// End:
218// vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4
219
Note: See TracBrowser for help on using the repository browser.