Comply with Vernie's review :-).
[bertos.git] / fs / battfs.h
1 /**
2  * \file
3  * <!--
4  * This file is part of BeRTOS.
5  *
6  * Bertos is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
19  *
20  * As a special exception, you may use this file as part of a free software
21  * library without restriction.  Specifically, if other files instantiate
22  * templates or use macros or inline functions from this file, or you compile
23  * this file and link it with other files to produce an executable, this
24  * file does not by itself cause the resulting executable to be covered by
25  * the GNU General Public License.  This exception does not however
26  * invalidate any other reasons why the executable file might be covered by
27  * the GNU General Public License.
28  *
29  * Copyright 2007 Develer S.r.l. (http://www.develer.com/)
30  *
31  * -->
32  *
33  * \version $Id:$
34  *
35  * \author Francesco Sacchi <batt@develer.com>
36  *
37  * \brief BattFS: a filesystem for embedded platforms (interface).
38  * TODO: Add detailed filesystem description.
39  */
40
41 #ifndef FS_BATTFS_H
42 #define FS_BATTFS_H
43
44 #include <cfg/compiler.h> // uintXX_t; STATIC_ASSERT
45 #include <algo/rotating_hash.h>
46
47 typedef uint16_t filled_t;
48 typedef uint16_t pgoff_t;
49 typedef uint8_t  inode_t;
50 typedef uint8_t  seqnum_t;
51 typedef rotating_t fsc_t;
52
53 /**
54  * BattFS page header.
55  * \note fields order is chosen to comply
56  * with CPU alignment.
57  */
58 typedef struct BattFsPageHeader
59 {
60         inode_t  inode;  ///< File inode (file identifier).
61         seqnum_t seqnum; ///< bit[1:0]: Page sequence number; bit[7:2] unused for now, must be set to 1.
62         filled_t filled; ///< Filled bytes in page.
63         pgoff_t  pgoff;  ///< Page offset inside file.
64         fsc_t    fsc;    ///< CRC of the page header.
65 } BattFsPageHeader;
66
67 /* Ensure structure has no padding added */
68 STATIC_ASSERT(sizeof(BattFsPageHeader) == sizeof(filled_t) + sizeof(pgoff_t)
69               + sizeof(inode_t) + sizeof(seqnum_t) + sizeof(fsc_t));
70
71 /**
72  * Reset page sequence number of struct \a m to default value (0xFF).
73  */
74 #define RESET_SEQ(m) ((m).seqnum = 0xFF)
75
76 /**
77  * Get page sequence number from struct \a m.
78  */
79 #define SEQ(m) ((m).seqnum & 0x03)
80
81 /**
82  * Set sequence number of struct \a m to \a d.
83  */
84 #define SET_SEQ(m, d) ((m).seqnum = ((m).seqnum & 0xFC) | ((d) & 0x03))
85
86 /**
87  * Increment sequence number of struct \a m.
88  */
89 #define INC_SEQ(m) SET_SEQ((m), SEQ(m) + 1)
90
91 /* Fwd decl */
92 struct BattFsSuper;
93
94 /**
95  * Type interface for disk init function.
96  * \return true if all is ok, false otherwise.
97  */
98 typedef bool (*disk_init_t) (struct BattFsSuper *d);
99
100 /**
101  * Type interface for disk page read function.
102  * \a page is the page address, \a size the lenght to be read.
103  * \return the number of bytes read.
104  */
105 typedef size_t (*disk_page_read_t) (struct BattFsSuper *d, void *buf, battfs_page_t page, size_t size);
106
107 /**
108  * Type interface for disk page write function.
109  * \a page is the page address, \a size the lenght to be written.
110  * \return the number of bytes written.
111  */
112 typedef size_t  (*disk_page_write_t) (struct BattFsSuper *d, const void *buf, battfs_page_t page, size_t size);
113
114 /**
115  * Type interface for disk page erase function.
116  * \a page is the page address.
117  * \return true if all is ok, false otherwise.
118  */
119 typedef bool (*disk_page_erase_t) (struct BattFsSuper *d, battfs_page_t page);
120
121 typedef uint32_t disk_size_t ///< Type for disk sizes.
122
123 /**
124  * Context used to describe a disk.
125  * This context structure will be used to access disk.
126  * Must be initialized by hw memory driver.
127  */
128 typedef struct BattFsSuper
129 {
130         disk_init_t init;        ///< Disk init.
131         disk_page_read_t  read;  ///< Page read.
132         disk_page_write_t write; ///< Page write.
133         disk_page_erase_t erase; ///< Page erase.
134
135         disk_size_t disk_size;   ///< Size of the disk, in bytes.
136         disk_size_t free_bytes;  ///< Free space on the disk.
137         /* TODO add other fields. */
138 } BattFsSuper;
139
140 #endif /* FS_BATTFS_H */