Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Tue Aug 30 10:48:11 2016 +0000
Revision:
41:a924aa709b6f
Parent:
38:c1e7f97ab396
Child:
44:8ebe6b70f932
Some fixes.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 25:aac250164497 1 #ifndef _D7A_FS_H_
Jeej 25:aac250164497 2 #define _D7A_FS_H_
Jeej 25:aac250164497 3
Jeej 25:aac250164497 4 #include "mbed.h"
Jeej 25:aac250164497 5 #include "rtos.h"
Jeej 34:1311cc53201a 6 #include "dbg.h"
Jeej 25:aac250164497 7 #include "d7a_common.h"
Jeej 25:aac250164497 8 #include "d7a_com.h"
Jeej 25:aac250164497 9
Jeej 37:e04613e021f2 10 #define TO_FS (8000) // Long time to give the modem time to reboot in case of assert
Jeej 33:f9a542d3efaa 11 #define FS_MAX_CONCURRENCY 16 // Maximum number of concurrent access
Jeej 26:9f0b9833cac6 12
Jeej 26:9f0b9833cac6 13 // PROP Byte
Jeej 26:9f0b9833cac6 14 #define FS_BFO_STORAGE_CLASS 0
Jeej 26:9f0b9833cac6 15 #define FS_BFO_ACT_COND 4
Jeej 26:9f0b9833cac6 16 #define FS_BFO_ACT_EN 7
Jeej 26:9f0b9833cac6 17 #define FS_BFS_STORAGE_CLASS 2
Jeej 26:9f0b9833cac6 18 #define FS_BFS_ACT_COND 3
Jeej 26:9f0b9833cac6 19 #define FS_BFS_ACT_EN 1
Jeej 26:9f0b9833cac6 20
Jeej 26:9f0b9833cac6 21 //======================================================================
Jeej 26:9f0b9833cac6 22 // Attributes and macros
Jeej 26:9f0b9833cac6 23 //======================================================================
Jeej 26:9f0b9833cac6 24 // "Piped" File: rd/wr are not stored but just sent on IF
Jeej 26:9f0b9833cac6 25 #define FS_TRANSIENT (TRANSIENT << FS_BFO_STORAGE_CLASS)
Jeej 26:9f0b9833cac6 26 // "RAM" File: rd/wr to a volatile buffer.
Jeej 26:9f0b9833cac6 27 #define FS_VOLATILE (VOLATILE << FS_BFO_STORAGE_CLASS)
Jeej 26:9f0b9833cac6 28 // "Mirrored" File: loaded from NVM, cached/used in RAM. Flushable to NVM.
Jeej 26:9f0b9833cac6 29 #define FS_RESTORABLE (RESTORABLE << FS_BFO_STORAGE_CLASS)
Jeej 26:9f0b9833cac6 30 // "Normal" File: rd/wr from/to NVM
Jeej 26:9f0b9833cac6 31 #define FS_PERMANENT (PERMANENT << FS_BFO_STORAGE_CLASS)
Jeej 26:9f0b9833cac6 32 #define FS_ACT_COND(c) ((c & 0x7) << FS_BFO_ACT_COND)
Jeej 26:9f0b9833cac6 33 #define FS_ACT_EN (1 << FS_BFO_ACT_EN)
Jeej 26:9f0b9833cac6 34
Jeej 26:9f0b9833cac6 35 #define FS_RUNNABLE (1 << FS_BFO_RUNNABLE)
Jeej 26:9f0b9833cac6 36 #define FS_ENCRYPTED (1 << FS_BFO_ENCRYPTED)
Jeej 26:9f0b9833cac6 37
Jeej 26:9f0b9833cac6 38 // XXX Old ALP Hack
Jeej 26:9f0b9833cac6 39 #define NACK FS_RUNNABLE
Jeej 26:9f0b9833cac6 40 #define NOTIF FS_ENCRYPTED
Jeej 26:9f0b9833cac6 41
Jeej 26:9f0b9833cac6 42 // D7AactP Enabled File properties
Jeej 26:9f0b9833cac6 43 #if 0 // Condition is not used (nor usable)
Jeej 26:9f0b9833cac6 44 #define FS_TRANSIENT_NOTIF(c) (FS_TRANSIENT | FS_ACT_EN | FS_ACT_COND(c))
Jeej 26:9f0b9833cac6 45 #define FS_VOLATILE_NOTIF(c) (FS_VOLATILE | FS_ACT_EN | FS_ACT_COND(c))
Jeej 26:9f0b9833cac6 46 #define FS_RESTORABLE_NOTIF(c)(FS_RESTORABLE | FS_ACT_EN | FS_ACT_COND(c))
Jeej 26:9f0b9833cac6 47 #define FS_PERMANENT_NOTIF(c) (FS_PERMANENT | FS_ACT_EN | FS_ACT_COND(c))
Jeej 26:9f0b9833cac6 48 #else
Jeej 26:9f0b9833cac6 49 #define FS_TRANSIENT_NOTIF (FS_TRANSIENT | FS_ACT_EN)
Jeej 26:9f0b9833cac6 50 #define FS_VOLATILE_NOTIF (FS_VOLATILE | FS_ACT_EN)
Jeej 26:9f0b9833cac6 51 #define FS_RESTORABLE_NOTIF (FS_RESTORABLE | FS_ACT_EN)
Jeej 26:9f0b9833cac6 52 #define FS_PERMANENT_NOTIF (FS_PERMANENT | FS_ACT_EN)
Jeej 26:9f0b9833cac6 53 #endif
Jeej 26:9f0b9833cac6 54
Jeej 26:9f0b9833cac6 55 #define RWX_RWX 0b00111111
Jeej 26:9f0b9833cac6 56 #define RW_ALL 0b00110110
Jeej 26:9f0b9833cac6 57 #define RW_RW 0b00110110
Jeej 26:9f0b9833cac6 58 #define RW_STANDARD 0b00110100
Jeej 26:9f0b9833cac6 59 #define RW_R 0b00110100
Jeej 26:9f0b9833cac6 60 #define R_R 0b00100100
Jeej 26:9f0b9833cac6 61
Jeej 26:9f0b9833cac6 62
Jeej 25:aac250164497 63 // COM-FS Operation-codes. Mimics ALP ones.
Jeej 25:aac250164497 64 #define FS_OP_NULL 0
Jeej 25:aac250164497 65 #define FS_OP_RD 1
Jeej 25:aac250164497 66 #define FS_OP_WR 4
Jeej 41:a924aa709b6f 67 #define FS_OP_SYNC 6 // Write File Properties
Jeej 29:8e7c5c1e9aab 68 #define FS_OP_TOUCH 7 // Not in ALP but '7' is still in 'write' actions area
Jeej 25:aac250164497 69 #define FS_OP_STAT 16
Jeej 29:8e7c5c1e9aab 70 #define FS_OP_DSTAT 30 // Not in ALP: Variant of STAT for distant files
Jeej 25:aac250164497 71 #define FS_OP_CREATE 17
Jeej 25:aac250164497 72 #define FS_OP_FLUSH 20
Jeej 30:d775c1409849 73 #define FS_OP_EXECUTE 31
Jeej 25:aac250164497 74 #define FS_OP_RETSTAT 32
Jeej 25:aac250164497 75 #define FS_OP_RETDATA 34
Jeej 25:aac250164497 76
Jeej 29:8e7c5c1e9aab 77
Jeej 30:d775c1409849 78
Jeej 25:aac250164497 79 // FS/COM-FS Status-codes. Mimics ALP ones.
Jeej 25:aac250164497 80 enum {
Jeej 25:aac250164497 81 FS_STAT_PENDING = 1,
Jeej 25:aac250164497 82 FS_STAT_OK = 0,
Jeej 25:aac250164497 83 FS_STAT_ERR_FID_NOEXIST = -1, // FF
Jeej 25:aac250164497 84 FS_STAT_ERR_FID_ALREADYEXIST = -2, // FE
Jeej 25:aac250164497 85 FS_STAT_ERR_NOTRESTORABLE = -3, // FD
Jeej 25:aac250164497 86 FS_STAT_ERR_PERMISSION = -4, // FC
Jeej 25:aac250164497 87 FS_STAT_ERR_LENGTH_OVFL = -5, // FB
Jeej 25:aac250164497 88 FS_STAT_ERR_ALLOC_OVFL = -6, // FA
Jeej 25:aac250164497 89 FS_STAT_ERR_START_OFFSET_OVFL = -7, // F9
Jeej 25:aac250164497 90 FS_STAT_ERR_WRITE_OVFL = -8, // F8
Jeej 25:aac250164497 91 FS_STAT_ERR_WRITE_PROTECTED = -9, // F7
Jeej 25:aac250164497 92 FS_STAT_ERR_UNKNOWN_OPERATION = -10, // F6
Jeej 25:aac250164497 93 FS_STAT_ERR_INCOMPLETE_OPERAND = -11, // F5
Jeej 25:aac250164497 94 FS_STAT_ERR_WRONG_OPERAND = -12, // F4
Jeej 25:aac250164497 95 FS_STAT_ERR_UNKNOWN = -127, // 80
Jeej 25:aac250164497 96 };
Jeej 25:aac250164497 97
Jeej 25:aac250164497 98
Jeej 25:aac250164497 99 // Memory "TYPE"
Jeej 41:a924aa709b6f 100 // ------------------------------------------------------
Jeej 41:a924aa709b6f 101 // | Sync | Distant | Com | MemType |
Jeej 41:a924aa709b6f 102 // ------------------------------------------------------
Jeej 41:a924aa709b6f 103 // | b7 | b6 | b5-b4 | b3-b0 |
Jeej 41:a924aa709b6f 104 // ------------------------------------------------------
Jeej 41:a924aa709b6f 105 #define FS_TYPE_SYNC 0x80
Jeej 41:a924aa709b6f 106 #define FS_TYPE_DISTANT 0x40
Jeej 41:a924aa709b6f 107 #define FS_MEM_TYPE(t) ((t)&0x0F)
Jeej 41:a924aa709b6f 108 #define FS_COM_TYPE(t) ((t)&0x30)
Jeej 41:a924aa709b6f 109 #define FS_DISTANT_TYPE(t) ((t)&0x70)
Jeej 38:c1e7f97ab396 110 enum {
Jeej 38:c1e7f97ab396 111 // Markers
Jeej 38:c1e7f97ab396 112 NOFILE = 0,
Jeej 38:c1e7f97ab396 113 ERASED = 0xff,
Jeej 38:c1e7f97ab396 114 // Physical Type
Jeej 38:c1e7f97ab396 115 PFLASH = 1,
Jeej 38:c1e7f97ab396 116 EEPROM = 2,
Jeej 38:c1e7f97ab396 117 RAM = 3,
Jeej 41:a924aa709b6f 118 OTP = 4,
Jeej 41:a924aa709b6f 119 UNKNOWN = 0x0F,
Jeej 38:c1e7f97ab396 120 // PSRAM
Jeej 38:c1e7f97ab396 121 // DDR
Jeej 38:c1e7f97ab396 122 // ...etc
Jeej 41:a924aa709b6f 123 FS_COM_UART = (0<<4),
Jeej 41:a924aa709b6f 124 FS_COM_SPI = (1<<4),
Jeej 41:a924aa709b6f 125 FS_COM_I2C = (2<<4),
Jeej 41:a924aa709b6f 126 // DISTANT Full Types
Jeej 41:a924aa709b6f 127 // Symetric HST-COM Files:
Jeej 41:a924aa709b6f 128 // - Header on Host side (i.e. need syncro on STAT)
Jeej 41:a924aa709b6f 129 // - Data on Host side
Jeej 41:a924aa709b6f 130 // - Same/Similar memory physical types
Jeej 41:a924aa709b6f 131 HOSTNS = FS_TYPE_SYNC + FS_TYPE_DISTANT + FS_COM_UART,
Jeej 41:a924aa709b6f 132 // Synchronised Symetric HST / COM Files
Jeej 41:a924aa709b6f 133 // - Idem Symetric HST-COM Files excepted:
Jeej 41:a924aa709b6f 134 // - Local header is assumed to be syncronised (through FS:SYNC)
Jeej 41:a924aa709b6f 135 HOSTS = FS_TYPE_DISTANT + FS_COM_UART,
Jeej 41:a924aa709b6f 136 HOST = FS_TYPE_DISTANT + FS_COM_UART, // Common Alias for FS_DISTANT_TYPE(t) usage
Jeej 25:aac250164497 137 };
Jeej 25:aac250164497 138 // File "Storage Class"
Jeej 25:aac250164497 139 enum { TRANSIENT=0, VOLATILE, RESTORABLE, PERMANENT};
Jeej 25:aac250164497 140 // D7AactP "trigger" TODO: is it really applicable ?
Jeej 25:aac250164497 141 enum { LIST=0, READ, WRITE, WRITE_FLUSH};
Jeej 25:aac250164497 142
Jeej 25:aac250164497 143 // =======================================================================
Jeej 25:aac250164497 144 // d7a_fs_header_t
Jeej 25:aac250164497 145 // -----------------------------------------------------------------------
Jeej 25:aac250164497 146 /// Header Structure
Jeej 25:aac250164497 147 // =======================================================================
Jeej 25:aac250164497 148 TYPEDEF_STRUCT_PACKED{
Jeej 25:aac250164497 149 uint32_t addr : 32;
Jeej 25:aac250164497 150
Jeej 41:a924aa709b6f 151 // MEMORY Type 8bits
Jeej 41:a924aa709b6f 152 uint32_t t_mem : 4;
Jeej 41:a924aa709b6f 153 uint32_t t_com : 2;
Jeej 41:a924aa709b6f 154 uint32_t t_distant : 1;
Jeej 41:a924aa709b6f 155 uint32_t t_sync : 1;
Jeej 25:aac250164497 156
Jeej 25:aac250164497 157 // RAM Mirroring
Jeej 25:aac250164497 158 uint32_t mirror_idx : 7;
Jeej 25:aac250164497 159 uint32_t mirrored : 1;
Jeej 25:aac250164497 160
Jeej 25:aac250164497 161 uint32_t fid : 8;
Jeej 25:aac250164497 162
Jeej 25:aac250164497 163 uint32_t afid : 8;
Jeej 25:aac250164497 164
Jeej 25:aac250164497 165 /// Storage Class
Jeej 25:aac250164497 166 uint32_t storage_class : 2;
Jeej 25:aac250164497 167 /// RFU
Jeej 25:aac250164497 168 uint32_t rfu_2 : 1;
Jeej 25:aac250164497 169 uint32_t rfu_3 : 1;
Jeej 25:aac250164497 170 /// D7AactP condition
Jeej 25:aac250164497 171 uint32_t act_cond : 3;
Jeej 25:aac250164497 172 /// D7AactP is enabled
Jeej 25:aac250164497 173 uint32_t act_en : 1;
Jeej 25:aac250164497 174
Jeej 25:aac250164497 175 /// Guest permissions
Jeej 25:aac250164497 176 uint32_t guest_x : 1;
Jeej 25:aac250164497 177 uint32_t guest_w : 1;
Jeej 25:aac250164497 178 uint32_t guest_r : 1;
Jeej 25:aac250164497 179 /// User permissions
Jeej 25:aac250164497 180 uint32_t user_x : 1;
Jeej 25:aac250164497 181 uint32_t user_w : 1;
Jeej 25:aac250164497 182 uint32_t user_r : 1;
Jeej 25:aac250164497 183 /// File is executable
Jeej 25:aac250164497 184 uint32_t runable : 1;
Jeej 25:aac250164497 185 /// File is encrypted
Jeej 25:aac250164497 186 uint32_t encrypted : 1;
Jeej 25:aac250164497 187
Jeej 25:aac250164497 188
Jeej 25:aac250164497 189 uint32_t length : 24;
Jeej 25:aac250164497 190 uint32_t alloc : 24;
Jeej 25:aac250164497 191
Jeej 25:aac250164497 192 uint32_t ifid : 8;
Jeej 25:aac250164497 193 } d7a_fs_header_bf_t;
Jeej 25:aac250164497 194
Jeej 25:aac250164497 195 TYPEDEF_STRUCT_PACKED{
Jeej 25:aac250164497 196 uint32_t addr;
Jeej 25:aac250164497 197 uint8_t type;
Jeej 25:aac250164497 198 uint8_t mirror;
Jeej 25:aac250164497 199 uint8_t fid;
Jeej 25:aac250164497 200
Jeej 25:aac250164497 201 uint8_t afid;
Jeej 25:aac250164497 202 uint8_t prop;
Jeej 25:aac250164497 203 uint8_t perm;
Jeej 25:aac250164497 204
Jeej 25:aac250164497 205 uint8_t length[3];
Jeej 25:aac250164497 206 uint8_t alloc[3];
Jeej 25:aac250164497 207 uint8_t ifid;
Jeej 25:aac250164497 208 } d7a_fs_header_byte_t;
Jeej 25:aac250164497 209
Jeej 25:aac250164497 210 typedef union
Jeej 25:aac250164497 211 {
Jeej 25:aac250164497 212 d7a_fs_header_bf_t bf;
Jeej 25:aac250164497 213 d7a_fs_header_byte_t byte;
Jeej 25:aac250164497 214
Jeej 25:aac250164497 215 } d7a_fs_header_t;
Jeej 25:aac250164497 216
Jeej 25:aac250164497 217
Jeej 25:aac250164497 218 typedef enum {
Jeej 25:aac250164497 219 KAL_FS_PROP_SIZE,
Jeej 25:aac250164497 220 KAL_FS_PROP_ALLOC,
Jeej 25:aac250164497 221 KAL_FS_PROP_TYPE,
Jeej 25:aac250164497 222 KAL_FS_PROP_ADDR,
Jeej 25:aac250164497 223 KAL_FS_PROP_AFID,
Jeej 25:aac250164497 224 KAL_FS_PROP_IFID,
Jeej 25:aac250164497 225 KAL_FS_PROP_PROP,
Jeej 25:aac250164497 226 KAL_FS_PROP_PERM,
Jeej 25:aac250164497 227
Jeej 25:aac250164497 228 KAL_FS_PROP_ALL,
Jeej 25:aac250164497 229 } d7a_fs_property_t;
Jeej 25:aac250164497 230
Jeej 25:aac250164497 231 typedef struct{
Jeej 25:aac250164497 232 uint32_t addr;
Jeej 25:aac250164497 233 uint8_t type;
Jeej 25:aac250164497 234 uint8_t afid;
Jeej 25:aac250164497 235 uint8_t ifid;
Jeej 25:aac250164497 236 uint8_t prop;
Jeej 25:aac250164497 237 uint8_t perm;
Jeej 25:aac250164497 238 uint32_t length;
Jeej 25:aac250164497 239 uint32_t alloc;
Jeej 25:aac250164497 240 } d7a_fs_properties_t;
Jeej 25:aac250164497 241
Jeej 30:d775c1409849 242
Jeej 30:d775c1409849 243 typedef d7a_fs_header_t* (*GetStatFileFunction)(const uint8_t file_id);
Jeej 30:d775c1409849 244
Jeej 30:d775c1409849 245 typedef bool (*SetStatFileFunction)(const uint8_t file_id, const d7a_fs_header_t* hdr);
Jeej 30:d775c1409849 246
Jeej 30:d775c1409849 247 typedef uint32_t (*WriteFileFunction)( const uint8_t file_id,
Jeej 30:d775c1409849 248 const uint16_t offset,
Jeej 30:d775c1409849 249 const uint16_t size,
Jeej 30:d775c1409849 250 const uint8_t * const content);
Jeej 30:d775c1409849 251
Jeej 30:d775c1409849 252 typedef uint32_t (*ReadFileFunction)( const uint8_t file_id,
Jeej 30:d775c1409849 253 const uint16_t offset,
Jeej 30:d775c1409849 254 const uint16_t size,
Jeej 30:d775c1409849 255 uint8_t* buf);
Jeej 30:d775c1409849 256
Jeej 30:d775c1409849 257 typedef uint32_t (*TouchFileFunction)( const uint8_t file_id,
Jeej 30:d775c1409849 258 const uint16_t offset,
Jeej 30:d775c1409849 259 const uint16_t size);
Jeej 30:d775c1409849 260
Jeej 30:d775c1409849 261 typedef struct {
Jeej 30:d775c1409849 262 GetStatFileFunction get_stat;
Jeej 30:d775c1409849 263 SetStatFileFunction set_stat;
Jeej 30:d775c1409849 264 WriteFileFunction write_file;
Jeej 30:d775c1409849 265 ReadFileFunction read_file;
Jeej 30:d775c1409849 266 TouchFileFunction touch_file;
Jeej 30:d775c1409849 267 } d7a_fs_callbacks_t;
Jeej 30:d775c1409849 268
Jeej 34:1311cc53201a 269
Jeej 34:1311cc53201a 270 // Utils
Jeej 34:1311cc53201a 271 #define D7A_FS_READ(fid,data,offset,len) do {\
Jeej 34:1311cc53201a 272 int status = d7a_fs_read((fid), (data), (offset), (len));\
Jeej 34:1311cc53201a 273 ASSERT(status == FS_STAT_OK, "Read file error %d (FID:%d OFF:%d LEN:%d)\r\n", status, (fid), (offset), (len));\
Jeej 34:1311cc53201a 274 } while(0);
Jeej 34:1311cc53201a 275
Jeej 34:1311cc53201a 276
Jeej 30:d775c1409849 277 void d7a_fs_open(const d7a_fs_callbacks_t* config);
Jeej 34:1311cc53201a 278 int8_t d7a_fs_wait_done(const uint8_t id, uint32_t millisec);
Jeej 25:aac250164497 279 void d7a_fs_new_pkt(d7a_com_rx_msg_t* pkt);
Jeej 25:aac250164497 280 d7a_com_rx_msg_t* d7a_fs_wait_pkt( uint32_t millisec = osWaitForever );
Jeej 25:aac250164497 281 uint32_t d7a_fs_get_properties(uint8_t fid, d7a_fs_property_t prop, d7a_fs_properties_t* props);
Jeej 34:1311cc53201a 282 int d7a_fs_distant_stat(uint8_t fid, int* length);
Jeej 25:aac250164497 283 int d7a_fs_distant_create(uint8_t fid, d7a_fs_properties_t* props);
Jeej 27:934ab7455115 284 int d7a_fs_read(uint8_t fid, void *data, uint32_t offset, uint32_t length);
Jeej 25:aac250164497 285
Jeej 25:aac250164497 286
Jeej 25:aac250164497 287 #endif