Comply with Vernie's review :-).
[bertos.git] / fs / battfs.h
index 0449d4f1a50ebff4f4b62eebfb826c37aaaf0932..d2e3b6fcccf94d55eddecaca6cb2fc1360105f5e 100644 (file)
  * \author Francesco Sacchi <batt@develer.com>
  *
  * \brief BattFS: a filesystem for embedded platforms (interface).
+ * TODO: Add detailed filesystem description.
  */
 
 #ifndef FS_BATTFS_H
 #define FS_BATTFS_H
 
 #include <cfg/compiler.h> // uintXX_t; STATIC_ASSERT
+#include <algo/rotating_hash.h>
+
+typedef uint16_t filled_t;
+typedef uint16_t pgoff_t;
+typedef uint8_t  inode_t;
+typedef uint8_t  seqnum_t;
+typedef rotating_t fsc_t;
 
 /**
  * BattFS page header.
- * \note fields order is chosen to comply with alignment.
+ * \note fields order is chosen to comply
+ * with CPU alignment.
  */
 typedef struct BattFsPageHeader
 {
-       uint16_t filled;      ///< filled bytes in page.
-       uint16_t page_off;    ///< Page offset inside file.
-       uint8_t  inode;       ///< File inode (file identifier).
-       uint8_t  seqnum;      ///< bit[1:0]: Page sequence number; bit[7:2] unused for now, must be set to 1.
-       uint16_t crc;         ///< CRC of the page header.
+       inode_t  inode;  ///< File inode (file identifier).
+       seqnum_t seqnum; ///< bit[1:0]: Page sequence number; bit[7:2] unused for now, must be set to 1.
+       filled_t filled; ///< Filled bytes in page.
+       pgoff_t  pgoff;  ///< Page offset inside file.
+       fsc_t    fsc;    ///< CRC of the page header.
 } BattFsPageHeader;
 
-STATIC_ASSERT(sizeof(BattFsPageHeader) == 8);
+/* Ensure structure has no padding added */
+STATIC_ASSERT(sizeof(BattFsPageHeader) == sizeof(filled_t) + sizeof(pgoff_t)
+              + sizeof(inode_t) + sizeof(seqnum_t) + sizeof(fsc_t));
 
 /**
  * Reset page sequence number of struct \a m to default value (0xFF).
@@ -77,5 +88,53 @@ STATIC_ASSERT(sizeof(BattFsPageHeader) == 8);
  */
 #define INC_SEQ(m) SET_SEQ((m), SEQ(m) + 1)
 
+/* Fwd decl */
+struct BattFsSuper;
+
+/**
+ * Type interface for disk init function.
+ * \return true if all is ok, false otherwise.
+ */
+typedef bool (*disk_init_t) (struct BattFsSuper *d);
+
+/**
+ * Type interface for disk page read function.
+ * \a page is the page address, \a size the lenght to be read.
+ * \return the number of bytes read.
+ */
+typedef size_t (*disk_page_read_t) (struct BattFsSuper *d, void *buf, battfs_page_t page, size_t size);
+
+/**
+ * Type interface for disk page write function.
+ * \a page is the page address, \a size the lenght to be written.
+ * \return the number of bytes written.
+ */
+typedef size_t (*disk_page_write_t) (struct BattFsSuper *d, const void *buf, battfs_page_t page, size_t size);
+
+/**
+ * Type interface for disk page erase function.
+ * \a page is the page address.
+ * \return true if all is ok, false otherwise.
+ */
+typedef bool (*disk_page_erase_t) (struct BattFsSuper *d, battfs_page_t page);
+
+typedef uint32_t disk_size_t ///< Type for disk sizes.
+
+/**
+ * Context used to describe a disk.
+ * This context structure will be used to access disk.
+ * Must be initialized by hw memory driver.
+ */
+typedef struct BattFsSuper
+{
+       disk_init_t init;        ///< Disk init.
+       disk_page_read_t  read;  ///< Page read.
+       disk_page_write_t write; ///< Page write.
+       disk_page_erase_t erase; ///< Page erase.
+
+       disk_size_t disk_size;   ///< Size of the disk, in bytes.
+       disk_size_t free_bytes;  ///< Free space on the disk.
+       /* TODO add other fields. */
+} BattFsSuper;
 
 #endif /* FS_BATTFS_H */