Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Thu Aug 25 09:38:40 2016 +0000
Revision:
38:c1e7f97ab396
Parent:
34:1311cc53201a
Child:
41:a924aa709b6f
Child:
43:28202405094d
Adapted file system to new modem version (tested with version 4.2.38)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 25:aac250164497 1 #include "mbed.h"
Jeej 25:aac250164497 2 #include "rtos.h"
Jeej 25:aac250164497 3 #include "dbg.h"
Jeej 25:aac250164497 4 #include "d7a_com.h"
Jeej 25:aac250164497 5 #include "d7a_common.h"
Jeej 25:aac250164497 6 #include "d7a_fs.h"
Jeej 25:aac250164497 7
Jeej 25:aac250164497 8
Jeej 25:aac250164497 9 #define FS_MAX_FILE_QTY 256
Jeej 25:aac250164497 10 #define FS_MAX_MIRROR_QTY 32
Jeej 25:aac250164497 11 #define FS_MAX_WATCHERS_QTY 32
Jeej 25:aac250164497 12
Jeej 25:aac250164497 13 #define FS_NULL_MAP 0xFF // XXX: this actually removes usage of file 255
Jeej 25:aac250164497 14
Jeej 25:aac250164497 15 TYPEDEF_STRUCT_PACKED {
Jeej 30:d775c1409849 16 uint8_t id;
Jeej 25:aac250164497 17 uint8_t cmd;
Jeej 25:aac250164497 18 uint8_t fid;
Jeej 25:aac250164497 19 uint32_t offset;
Jeej 25:aac250164497 20 uint32_t length;
Jeej 25:aac250164497 21 } d7a_fs_com_req_t;
Jeej 25:aac250164497 22
Jeej 25:aac250164497 23 TYPEDEF_STRUCT_PACKED {
Jeej 30:d775c1409849 24 uint8_t id;
Jeej 25:aac250164497 25 uint8_t cmd;
Jeej 30:d775c1409849 26 int8_t status;
Jeej 25:aac250164497 27 uint32_t length;
Jeej 25:aac250164497 28 uint8_t data[1];
Jeej 25:aac250164497 29 } d7a_fs_com_resp_t;
Jeej 25:aac250164497 30
Jeej 25:aac250164497 31 typedef struct {
Jeej 25:aac250164497 32 d7a_fs_com_req_t req;
Jeej 34:1311cc53201a 33 int8_t status;
Jeej 25:aac250164497 34 void* data;
Jeej 25:aac250164497 35 } d7a_fs_com_t;
Jeej 25:aac250164497 36
Jeej 25:aac250164497 37 typedef struct {
Jeej 25:aac250164497 38 Thread* thread;
Jeej 26:9f0b9833cac6 39 Queue<void, 8> fs_done;
Jeej 30:d775c1409849 40 const d7a_fs_callbacks_t* callback;
Jeej 25:aac250164497 41 Queue<d7a_com_rx_msg_t, 16> pkt_queue;
Jeej 25:aac250164497 42 uint8_t hdr_map[FS_MAX_FILE_QTY];
Jeej 25:aac250164497 43 uint8_t nb_files;
Jeej 30:d775c1409849 44 d7a_fs_com_t com[FS_MAX_CONCURRENCY];
Jeej 25:aac250164497 45 } d7a_fs_ctx_t;
Jeej 25:aac250164497 46
Jeej 25:aac250164497 47 d7a_fs_ctx_t g_fs_ctx;
Jeej 25:aac250164497 48
Jeej 25:aac250164497 49 void d7a_fs_thread(const void *p);
Jeej 25:aac250164497 50
Jeej 30:d775c1409849 51 void d7a_fs_open(const d7a_fs_callbacks_t* config)
Jeej 25:aac250164497 52 {
Jeej 25:aac250164497 53 FPRINT("\r\n");
Jeej 25:aac250164497 54
Jeej 25:aac250164497 55 memset(&g_fs_ctx.com, 0, sizeof(g_fs_ctx.com));
Jeej 30:d775c1409849 56 g_fs_ctx.callback = config;
Jeej 31:ab9bfdbc6b44 57 g_fs_ctx.thread = new Thread(d7a_fs_thread, NULL, osPriorityHigh, DEFAULT_STACK_SIZE);
Jeej 25:aac250164497 58 }
Jeej 25:aac250164497 59
Jeej 30:d775c1409849 60 static uint8_t d7a_fs_get_req_id(void)
Jeej 30:d775c1409849 61 {
Jeej 30:d775c1409849 62 int i;
Jeej 30:d775c1409849 63 for (i=0;i<FS_MAX_CONCURRENCY;i++)
Jeej 30:d775c1409849 64 {
Jeej 30:d775c1409849 65 if (g_fs_ctx.com[i].req.cmd == FS_OP_NULL)
Jeej 30:d775c1409849 66 {
Jeej 30:d775c1409849 67 DPRINT("New req %d\r\n", i);
Jeej 30:d775c1409849 68 return i;
Jeej 30:d775c1409849 69 }
Jeej 30:d775c1409849 70 }
Jeej 30:d775c1409849 71 ASSERT(false, "FS: MAX_CONCURRENCY exceeded\r\n");
Jeej 30:d775c1409849 72 return 0xff;
Jeej 30:d775c1409849 73 }
Jeej 30:d775c1409849 74
Jeej 30:d775c1409849 75
Jeej 25:aac250164497 76 static void d7a_fs_msg(uint8_t* buf, uint8_t len, uint8_t id)
Jeej 25:aac250164497 77 {
Jeej 25:aac250164497 78 FPRINT("\r\n");
Jeej 25:aac250164497 79 d7a_com_tx_msg_t msg;
Jeej 25:aac250164497 80 msg.id = id;
Jeej 25:aac250164497 81 msg.pbuf = buf;
Jeej 25:aac250164497 82 msg.plen = len;
Jeej 25:aac250164497 83 msg.alen = 0;
Jeej 34:1311cc53201a 84 d7a_com_post_msg(&msg);
Jeej 25:aac250164497 85 }
Jeej 25:aac250164497 86
Jeej 34:1311cc53201a 87 int8_t d7a_fs_wait_done(const uint8_t id, uint32_t millisec)
Jeej 25:aac250164497 88 {
Jeej 34:1311cc53201a 89 FPRINT("(id:%d, to:%d)\r\n", id, millisec);
Jeej 34:1311cc53201a 90
Jeej 34:1311cc53201a 91 osEvent evt;
Jeej 34:1311cc53201a 92 do
Jeej 34:1311cc53201a 93 {
Jeej 34:1311cc53201a 94 evt = g_fs_ctx.fs_done.get(millisec);
Jeej 34:1311cc53201a 95 ASSERT(evt.status == osEventMessage, "FS Wait Timeout!\r\n");
Jeej 34:1311cc53201a 96 if ((uint8_t)evt.value.p != id)
Jeej 34:1311cc53201a 97 {
Jeej 34:1311cc53201a 98 g_fs_ctx.fs_done.put(evt.value.p);
Jeej 34:1311cc53201a 99 }
Jeej 34:1311cc53201a 100 } while ((uint8_t)evt.value.p != id);
Jeej 33:f9a542d3efaa 101
Jeej 34:1311cc53201a 102 // Free to serve a new request
Jeej 34:1311cc53201a 103 g_fs_ctx.com[id].req.cmd = FS_OP_NULL;
Jeej 34:1311cc53201a 104
Jeej 34:1311cc53201a 105 return g_fs_ctx.com[id].status;
Jeej 25:aac250164497 106 }
Jeej 25:aac250164497 107
Jeej 25:aac250164497 108 void d7a_fs_new_pkt(d7a_com_rx_msg_t* pkt)
Jeej 25:aac250164497 109 {
Jeej 25:aac250164497 110 FPRINT("\r\n");
Jeej 25:aac250164497 111 ASSERT(g_fs_ctx.pkt_queue.put(pkt) == osOK, "FS queue full!\r\n");
Jeej 25:aac250164497 112 }
Jeej 25:aac250164497 113
Jeej 25:aac250164497 114 d7a_com_rx_msg_t* d7a_fs_wait_pkt( uint32_t millisec )
Jeej 25:aac250164497 115 {
Jeej 30:d775c1409849 116 FPRINT("(millisec:%d)\r\n", millisec);
Jeej 25:aac250164497 117 osEvent evt = g_fs_ctx.pkt_queue.get(millisec);
Jeej 25:aac250164497 118 return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
Jeej 25:aac250164497 119 }
Jeej 25:aac250164497 120
Jeej 30:d775c1409849 121 static uint32_t d7a_fs_hdr(uint8_t fid, const d7a_fs_header_t* hdr)
Jeej 25:aac250164497 122 {
Jeej 25:aac250164497 123 FPRINT("\r\n");
Jeej 30:d775c1409849 124 d7a_fs_header_t* temp_hdr = g_fs_ctx.callback->get_stat(fid);
Jeej 30:d775c1409849 125 if (!temp_hdr)
Jeej 30:d775c1409849 126 {
Jeej 30:d775c1409849 127 return 0;
Jeej 30:d775c1409849 128 }
Jeej 30:d775c1409849 129 memcpy((void*)hdr, (void*)temp_hdr, sizeof(d7a_fs_header_t));
Jeej 30:d775c1409849 130 return sizeof(d7a_fs_header_t);
Jeej 25:aac250164497 131 }
Jeej 25:aac250164497 132
Jeej 25:aac250164497 133 uint32_t d7a_fs_get_properties(uint8_t fid, d7a_fs_property_t prop, d7a_fs_properties_t* props)
Jeej 25:aac250164497 134 {
Jeej 28:0376b97b4b55 135 FPRINT("(fid:%d, prop:0x%02X)\r\n", fid, prop);
Jeej 25:aac250164497 136 d7a_fs_header_t hdr;
Jeej 25:aac250164497 137 d7a_fs_hdr(fid, &hdr);
Jeej 25:aac250164497 138
Jeej 25:aac250164497 139 uint32_t ret = 0;
Jeej 25:aac250164497 140 if (prop == KAL_FS_PROP_ALL)
Jeej 25:aac250164497 141 {
Jeej 25:aac250164497 142 // Fill in the API structure
Jeej 25:aac250164497 143 //props->addr = (uint32_t)d7a_fs_get_memory_addr(hdr);
Jeej 25:aac250164497 144 props->type = hdr.byte.type;
Jeej 25:aac250164497 145
Jeej 25:aac250164497 146 props->afid = hdr.byte.afid;
Jeej 25:aac250164497 147 props->ifid = hdr.byte.ifid;
Jeej 25:aac250164497 148 props->prop = hdr.byte.prop;
Jeej 25:aac250164497 149 props->perm = hdr.byte.perm;
Jeej 25:aac250164497 150
Jeej 25:aac250164497 151 props->length = hdr.bf.length;
Jeej 25:aac250164497 152 props->alloc = hdr.bf.alloc;
Jeej 25:aac250164497 153 }
Jeej 25:aac250164497 154 else
Jeej 25:aac250164497 155 {
Jeej 25:aac250164497 156 switch(prop)
Jeej 25:aac250164497 157 {
Jeej 25:aac250164497 158 case KAL_FS_PROP_SIZE: ret = hdr.bf.length; break;
Jeej 25:aac250164497 159 case KAL_FS_PROP_ALLOC: ret = hdr.bf.alloc; break;
Jeej 25:aac250164497 160 case KAL_FS_PROP_TYPE: ret = hdr.byte.type; break;
Jeej 25:aac250164497 161 //case KAL_FS_PROP_ADDR: ret = (uint32_t)d7a_fs_get_memory_addr(hdr); break;
Jeej 25:aac250164497 162 case KAL_FS_PROP_AFID: ret = hdr.byte.afid; break;
Jeej 25:aac250164497 163 case KAL_FS_PROP_IFID: ret = hdr.byte.ifid; break;
Jeej 25:aac250164497 164 case KAL_FS_PROP_PROP: ret = hdr.byte.prop; break;
Jeej 25:aac250164497 165 case KAL_FS_PROP_PERM: ret = hdr.byte.perm; break;
Jeej 25:aac250164497 166 default:
Jeej 25:aac250164497 167 ASSERT(false, "FS:Invalid get prop request %d\n",prop);
Jeej 25:aac250164497 168 }
Jeej 25:aac250164497 169 }
Jeej 30:d775c1409849 170 //DPRINT("GetProp[%d](%d): %d\n",fid,prop,ret);
Jeej 25:aac250164497 171 return ret;
Jeej 25:aac250164497 172 }
Jeej 25:aac250164497 173
Jeej 34:1311cc53201a 174 int d7a_fs_distant_stat(uint8_t fid, int* length)
Jeej 26:9f0b9833cac6 175 {
Jeej 26:9f0b9833cac6 176 FPRINT("\r\n");
Jeej 26:9f0b9833cac6 177 // "Distant" Files
Jeej 30:d775c1409849 178 uint8_t id = d7a_fs_get_req_id();
Jeej 34:1311cc53201a 179 DPRINT("StatD[%d](%d)\r\n", fid, id);
Jeej 30:d775c1409849 180 g_fs_ctx.com[id].req = (d7a_fs_com_req_t){id,FS_OP_STAT,fid,0,0};
Jeej 30:d775c1409849 181 g_fs_ctx.com[id].data = length;
Jeej 31:ab9bfdbc6b44 182 d7a_fs_msg((uint8_t*)&g_fs_ctx.com[id].req, sizeof(d7a_fs_com_req_t), KAL_COM_FLOW_FS_CMD);
Jeej 26:9f0b9833cac6 183 // We do a "normal" STAT but we don't want to update our local(true) file-size
Jeej 26:9f0b9833cac6 184 // with the response of the STAT as:
Jeej 26:9f0b9833cac6 185 // - the distant is likely a "Host-file" with hazardous size/alloc
Jeej 26:9f0b9833cac6 186 // - we may not even have the corresponding local file (-> assert when getting props)
Jeej 26:9f0b9833cac6 187 // So flag the cmd to differentiate response treatment
Jeej 30:d775c1409849 188 g_fs_ctx.com[id].req.cmd = FS_OP_DSTAT; // XXX
Jeej 34:1311cc53201a 189
Jeej 34:1311cc53201a 190 return (int)d7a_fs_wait_done(id, TO_FS);
Jeej 26:9f0b9833cac6 191 }
Jeej 26:9f0b9833cac6 192
Jeej 25:aac250164497 193 int d7a_fs_distant_create(uint8_t fid, d7a_fs_properties_t* props)
Jeej 25:aac250164497 194 {
Jeej 30:d775c1409849 195 uint8_t id;
Jeej 34:1311cc53201a 196 int status = 0;
Jeej 25:aac250164497 197 FPRINT("\r\n");
Jeej 30:d775c1409849 198 //DPRINT("CrD[%d] type 0x%x\n",fid,props->type);
Jeej 38:c1e7f97ab396 199
Jeej 38:c1e7f97ab396 200
Jeej 38:c1e7f97ab396 201
Jeej 38:c1e7f97ab396 202 switch (FS_PHY_TYPE(props->type))
Jeej 25:aac250164497 203 {
Jeej 25:aac250164497 204 case EEPROM:
Jeej 25:aac250164497 205 case RAM:
Jeej 25:aac250164497 206 case PFLASH:
Jeej 30:d775c1409849 207 id = d7a_fs_get_req_id();
Jeej 34:1311cc53201a 208 DPRINT("CrD[%d](%d)\r\n", fid, id);
Jeej 25:aac250164497 209 // Build WR command
Jeej 25:aac250164497 210 uint8_t* buf = (uint8_t*)MALLOC(sizeof(d7a_fs_com_req_t) + sizeof(d7a_fs_properties_t));
Jeej 25:aac250164497 211 d7a_fs_com_req_t* buf_req = (d7a_fs_com_req_t*)buf;
Jeej 30:d775c1409849 212 *buf_req = (d7a_fs_com_req_t){id,FS_OP_CREATE,fid,0,sizeof(d7a_fs_properties_t)};
Jeej 25:aac250164497 213 memcpy(&buf[sizeof(d7a_fs_com_req_t)],(uint8_t*)props,sizeof(d7a_fs_properties_t));
Jeej 25:aac250164497 214
Jeej 25:aac250164497 215 // Keep command request for response treatment
Jeej 30:d775c1409849 216 g_fs_ctx.com[id].req.cmd = FS_OP_CREATE;
Jeej 25:aac250164497 217 d7a_fs_msg(buf,sizeof(d7a_fs_com_req_t) + sizeof(d7a_fs_properties_t), KAL_COM_FLOW_FS_CMD);
Jeej 25:aac250164497 218 FREE(buf);
Jeej 34:1311cc53201a 219 status = (int)d7a_fs_wait_done(id, TO_FS);
Jeej 25:aac250164497 220 break;
Jeej 25:aac250164497 221 // Wrong type
Jeej 25:aac250164497 222 default:
Jeej 38:c1e7f97ab396 223 ASSERT(false, "FS:post_distant_create wrong file type %x\n", FS_PHY_TYPE(props->type));
Jeej 25:aac250164497 224 break;
Jeej 25:aac250164497 225 }
Jeej 34:1311cc53201a 226
Jeej 34:1311cc53201a 227 return status;
Jeej 25:aac250164497 228 }
Jeej 25:aac250164497 229
Jeej 27:934ab7455115 230 int d7a_fs_read(uint8_t fid, void *data, uint32_t offset, uint32_t length)
Jeej 27:934ab7455115 231 {
Jeej 30:d775c1409849 232 //DPRINT("RdP[%d] @:%d %d bytes\n", fid, offset, length);
Jeej 27:934ab7455115 233 d7a_fs_header_t hdr;
Jeej 34:1311cc53201a 234 int status = 0;
Jeej 30:d775c1409849 235 uint8_t id;
Jeej 27:934ab7455115 236
Jeej 27:934ab7455115 237 if (!d7a_fs_hdr(fid, &hdr))
Jeej 27:934ab7455115 238 {
Jeej 30:d775c1409849 239 // If file is not found locally, it is a distant file
Jeej 38:c1e7f97ab396 240 hdr.bf.type |= FS_TYPE_DISTANT;
Jeej 27:934ab7455115 241 }
Jeej 27:934ab7455115 242
Jeej 38:c1e7f97ab396 243 if(hdr.bf.type & FS_TYPE_DISTANT) // XXX: HOST only
Jeej 27:934ab7455115 244 {
Jeej 38:c1e7f97ab396 245 id = d7a_fs_get_req_id();
Jeej 38:c1e7f97ab396 246 DPRINT("RdP[%d](%d) @:%d %d bytes\r\n", fid, id, offset, length);
Jeej 38:c1e7f97ab396 247 g_fs_ctx.com[id].req = (d7a_fs_com_req_t){id,FS_OP_RD,fid,offset,length};
Jeej 38:c1e7f97ab396 248 g_fs_ctx.com[id].data = data;
Jeej 38:c1e7f97ab396 249 d7a_fs_msg((uint8_t*)&g_fs_ctx.com[id].req, sizeof(d7a_fs_com_req_t), KAL_COM_FLOW_FS_CMD);
Jeej 38:c1e7f97ab396 250 status = (int)d7a_fs_wait_done(id, TO_FS);
Jeej 27:934ab7455115 251 }
Jeej 38:c1e7f97ab396 252 else
Jeej 38:c1e7f97ab396 253 {
Jeej 38:c1e7f97ab396 254 DPRINT("RdP[%d](-) @:%d %d bytes\r\n", fid, offset, length);
Jeej 38:c1e7f97ab396 255 status = (g_fs_ctx.callback->read_file(fid, offset, length, (uint8_t*)data) == length)?
Jeej 38:c1e7f97ab396 256 FS_STAT_OK : FS_STAT_ERR_UNKNOWN;
Jeej 38:c1e7f97ab396 257 }
Jeej 38:c1e7f97ab396 258
Jeej 34:1311cc53201a 259 return status;
Jeej 27:934ab7455115 260 }
Jeej 27:934ab7455115 261
Jeej 27:934ab7455115 262
Jeej 25:aac250164497 263
Jeej 30:d775c1409849 264 #define OP_SIZE_RD 11
Jeej 30:d775c1409849 265 #define OP_SIZE_WR 11
Jeej 30:d775c1409849 266 #define OP_SIZE_TOUCH 11
Jeej 30:d775c1409849 267 #define OP_SIZE_STAT 3
Jeej 30:d775c1409849 268 #define OP_SIZE_FLUSH 3
Jeej 30:d775c1409849 269 #define OP_SIZE_CREATE 11
Jeej 30:d775c1409849 270 #define OP_SIZE_RETSTAT (3+4)
Jeej 30:d775c1409849 271 #define OP_SIZE_RETDATA (3+4)
Jeej 30:d775c1409849 272 uint8_t k_valid_cmd[] = {FS_OP_RD, FS_OP_WR, FS_OP_TOUCH ,FS_OP_STAT, FS_OP_FLUSH, FS_OP_CREATE};
Jeej 30:d775c1409849 273 uint8_t k_valid_size[]= {OP_SIZE_RD,OP_SIZE_WR,OP_SIZE_TOUCH,OP_SIZE_STAT,OP_SIZE_FLUSH,OP_SIZE_CREATE};
Jeej 30:d775c1409849 274
Jeej 25:aac250164497 275
Jeej 25:aac250164497 276
Jeej 30:d775c1409849 277 /// ------------------------------------------------------------------
Jeej 30:d775c1409849 278 /// |TOKEN|CMD/RESP| PAYLOAD |
Jeej 30:d775c1409849 279 /// --------------------------------------------------------------
Jeej 30:d775c1409849 280 /// | 1B | 1B | PKT.blen - 1 bytes |
Jeej 30:d775c1409849 281 /// --------------------------------------------------------------
Jeej 30:d775c1409849 282 /// | | | 1B | 4B | 4B | PKT.blen - 11 bytes|
Jeej 30:d775c1409849 283 /// --------------------------------------------------------------
Jeej 30:d775c1409849 284 // | | write | FID | offset | length | datas... |
Jeej 30:d775c1409849 285 // | | read | FID | offset | length |
Jeej 30:d775c1409849 286 // | | touch | FID | offset | length |
Jeej 30:d775c1409849 287 // | | exist | FID |
Jeej 30:d775c1409849 288 // | | flush | FID |
Jeej 30:d775c1409849 289 // | | retstat|status| length | <kal_fs_properties_t>
Jeej 30:d775c1409849 290 // | | retdat |status| length | datas... |
Jeej 25:aac250164497 291 void d7a_fs_thread(const void *p)
Jeej 25:aac250164497 292 {
Jeej 25:aac250164497 293 FPRINT("\r\n");
Jeej 25:aac250164497 294 d7a_com_rx_msg_t* pkt;
Jeej 26:9f0b9833cac6 295 int8_t status = FS_STAT_OK;
Jeej 25:aac250164497 296
Jeej 25:aac250164497 297 while (true)
Jeej 25:aac250164497 298 {
Jeej 25:aac250164497 299 status = FS_STAT_OK;
Jeej 25:aac250164497 300 // TODO: For now only one outgoing-request can be pending
Jeej 25:aac250164497 301 // An incoming-request response can be served simultaneously
Jeej 25:aac250164497 302 // TODO: handle segmentation. For now MTU = 255-10 = 245
Jeej 25:aac250164497 303 pkt = d7a_fs_wait_pkt();
Jeej 25:aac250164497 304 ASSERT(pkt != NULL, "FS NULL pkt\r\n");
Jeej 25:aac250164497 305 // ---------------------------------------------------------------------------
Jeej 25:aac250164497 306 // Peer request
Jeej 25:aac250164497 307 // ---------------------------------------------------------------------------
Jeej 25:aac250164497 308 switch (pkt->id)
Jeej 25:aac250164497 309 {
Jeej 25:aac250164497 310 case KAL_COM_FLOW_FS_CMD:
Jeej 25:aac250164497 311 d7a_fs_com_req_t* req = (d7a_fs_com_req_t*)pkt->buffer;
Jeej 34:1311cc53201a 312 DPRINT("Rfs[%d](%d) cmd:%d\n", req->fid, req->id, req->cmd);
Jeej 30:d775c1409849 313 //dbg_print_data("%02X ", (uint8_t*)req, sizeof(d7a_fs_com_req_t));
Jeej 30:d775c1409849 314 //DPRINT("\r\n");
Jeej 30:d775c1409849 315 d7a_fs_com_resp_t buf = (d7a_fs_com_resp_t) {.id = req->id, .cmd = FS_OP_RETSTAT};
Jeej 25:aac250164497 316
Jeej 25:aac250164497 317 // Error management makes sense here as we face peer-requests,
Jeej 25:aac250164497 318 // and we don't want to assert because of the peer.
Jeej 25:aac250164497 319 //status = d7a_fs_check_req(req, pkt->blen);
Jeej 25:aac250164497 320 //buf.status = status;
Jeej 25:aac250164497 321 buf.status = FS_STAT_OK;
Jeej 25:aac250164497 322
Jeej 25:aac250164497 323 // From here we assume that the request is valid
Jeej 25:aac250164497 324 // TODO: for now we consider that COM-FS request are targetting
Jeej 25:aac250164497 325 // FIDs that are "local" to the Host, but we can extend this
Jeej 25:aac250164497 326 // to "distant" files as well.(i.e. access SPI-Flash of an Host)
Jeej 25:aac250164497 327 if (status != FS_STAT_OK)
Jeej 25:aac250164497 328 {
Jeej 25:aac250164497 329 buf.length = 0;
Jeej 25:aac250164497 330 // Here we respond to request errors and OP_STAT
Jeej 25:aac250164497 331 d7a_fs_msg((uint8_t*)&buf,OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 332 }
Jeej 25:aac250164497 333 else if (req->cmd == FS_OP_RD)
Jeej 25:aac250164497 334 {
Jeej 25:aac250164497 335 d7a_fs_com_resp_t* b = (d7a_fs_com_resp_t*)MALLOC(OP_SIZE_RETDATA + req->length);
Jeej 30:d775c1409849 336 uint32_t len = g_fs_ctx.callback->read_file(req->fid, req->offset, req->length, &b->data[0]);
Jeej 30:d775c1409849 337 b->id = req->id;
Jeej 25:aac250164497 338 b->length = len;
Jeej 25:aac250164497 339 b->cmd = FS_OP_RETDATA;
Jeej 25:aac250164497 340 b->status = FS_STAT_OK; // TODO
Jeej 25:aac250164497 341 d7a_fs_msg((uint8_t*)b, OP_SIZE_RETDATA + req->length, KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 342 FREE(b);
Jeej 25:aac250164497 343 }
Jeej 25:aac250164497 344 else if (req->cmd == FS_OP_WR)
Jeej 25:aac250164497 345 {
Jeej 30:d775c1409849 346 buf.length = g_fs_ctx.callback->write_file(req->fid, req->offset, req->length, &pkt->buffer[OP_SIZE_WR]);
Jeej 25:aac250164497 347 d7a_fs_msg((uint8_t*)&buf, OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 348 }
Jeej 25:aac250164497 349 else if (req->cmd == FS_OP_STAT)
Jeej 25:aac250164497 350 {
Jeej 25:aac250164497 351 // If file doesn't exist, FS_OP_STAT response is already handled
Jeej 25:aac250164497 352 // by the common d7a_fs_check_req error response.
Jeej 25:aac250164497 353 d7a_fs_com_resp_t* b = (d7a_fs_com_resp_t*)MALLOC(OP_SIZE_RETSTAT + sizeof(d7a_fs_properties_t));
Jeej 25:aac250164497 354 d7a_fs_get_properties(req->fid, KAL_FS_PROP_ALL, (d7a_fs_properties_t*) &b->data[0]);
Jeej 25:aac250164497 355 d7a_fs_properties_t* props = (d7a_fs_properties_t*)&b->data[0];
Jeej 30:d775c1409849 356 b->id = req->id;
Jeej 25:aac250164497 357 b->length = props->length;
Jeej 25:aac250164497 358 b->cmd = FS_OP_RETSTAT;
Jeej 25:aac250164497 359 b->status = FS_STAT_OK;
Jeej 26:9f0b9833cac6 360 d7a_fs_msg((uint8_t*)b, OP_SIZE_RETSTAT + sizeof(d7a_fs_properties_t), KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 361 FREE(b);
Jeej 25:aac250164497 362 }
Jeej 25:aac250164497 363 else if (req->cmd == FS_OP_FLUSH)
Jeej 25:aac250164497 364 {
Jeej 25:aac250164497 365 //d7a_fs_flush(req->fid);
Jeej 25:aac250164497 366 //d7a_fs_msg((uint8_t*)&buf, OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 367 }
Jeej 25:aac250164497 368 else if (req->cmd == FS_OP_CREATE)
Jeej 25:aac250164497 369 {
Jeej 25:aac250164497 370 //d7a_fs_create(req->fid,(d7a_fs_properties_t*)&pkt->buffer[OP_SIZE_CREATE]);
Jeej 25:aac250164497 371 //d7a_fs_msg((uint8_t*)&buf, OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 372 }
Jeej 29:8e7c5c1e9aab 373 else if (req->cmd == FS_OP_TOUCH)
Jeej 29:8e7c5c1e9aab 374 {
Jeej 30:d775c1409849 375 buf.length = g_fs_ctx.callback->touch_file(req->fid, req->offset, req->length);
Jeej 29:8e7c5c1e9aab 376 d7a_fs_msg((uint8_t*)&buf, OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP);
Jeej 29:8e7c5c1e9aab 377 }
Jeej 26:9f0b9833cac6 378 else
Jeej 26:9f0b9833cac6 379 {
Jeej 26:9f0b9833cac6 380 ASSERT(false, "FS: Unknown cmd %d\r\n", req->cmd);
Jeej 26:9f0b9833cac6 381 }
Jeej 25:aac250164497 382 break;
Jeej 25:aac250164497 383 // ---------------------------------------------------------------------------
Jeej 25:aac250164497 384 // Response to our commands
Jeej 25:aac250164497 385 // ---------------------------------------------------------------------------
Jeej 25:aac250164497 386 case KAL_COM_FLOW_FS_RESP:
Jeej 25:aac250164497 387 d7a_fs_com_resp_t* resp = (d7a_fs_com_resp_t*)pkt->buffer;
Jeej 30:d775c1409849 388 uint8_t id = resp->id;
Jeej 30:d775c1409849 389 DPRINT("Rfs(%d) resp - cmd:%d status:%d bytes:%d\n", id, resp->cmd, resp->status, resp->length);
Jeej 30:d775c1409849 390 //dbg_print_data("%02X ", (uint8_t*)resp, sizeof(d7a_fs_com_resp_t));
Jeej 30:d775c1409849 391 //DPRINT("\r\n");
Jeej 30:d775c1409849 392 ASSERT(g_fs_ctx.com[id].req.cmd != FS_OP_NULL, "FS: Unexpected FS_RESP ID:%d CMD:%d status:%d LEN:%d\n", id, resp->cmd, resp->status, resp->length);
Jeej 30:d775c1409849 393 if (g_fs_ctx.com[id].req.cmd != FS_OP_STAT &&
Jeej 30:d775c1409849 394 g_fs_ctx.com[id].req.cmd != FS_OP_DSTAT )
Jeej 25:aac250164497 395 {
Jeej 25:aac250164497 396 // No pity for errors here, handled-ones should be avoided at
Jeej 25:aac250164497 397 // upper level, the others diserve to assert anyway.
Jeej 26:9f0b9833cac6 398 ASSERT(resp->status == FS_STAT_OK, "FS: Peer error:%d\n", resp->status);
Jeej 25:aac250164497 399
Jeej 25:aac250164497 400 // Fill read buffer
Jeej 25:aac250164497 401 if (resp->cmd == FS_OP_RETDATA)
Jeej 25:aac250164497 402 {
Jeej 30:d775c1409849 403 memcpy(g_fs_ctx.com[id].data, &resp->data[0], resp->length);
Jeej 25:aac250164497 404 }
Jeej 25:aac250164497 405 else if (resp->cmd == FS_OP_RETSTAT)
Jeej 25:aac250164497 406 {
Jeej 30:d775c1409849 407 if (g_fs_ctx.com[id].req.cmd == FS_OP_WR)
Jeej 25:aac250164497 408 {
Jeej 25:aac250164497 409 // We did a successful WR, update size if needed
Jeej 25:aac250164497 410 // TODO:This is not really enforcing header coherency. It will do the
Jeej 25:aac250164497 411 // job for Hosted NVM storage, provided the Host doesn't use the file for
Jeej 25:aac250164497 412 // writing.
Jeej 25:aac250164497 413 d7a_fs_header_t hdr;
Jeej 30:d775c1409849 414 d7a_fs_hdr(g_fs_ctx.com[id].req.fid, &hdr);
Jeej 25:aac250164497 415 if (resp->length != hdr.bf.length)
Jeej 25:aac250164497 416 {
Jeej 30:d775c1409849 417 hdr.bf.length = resp->length;
Jeej 30:d775c1409849 418 g_fs_ctx.callback->set_stat(g_fs_ctx.com[id].req.fid, &hdr);
Jeej 25:aac250164497 419 }
Jeej 25:aac250164497 420 }
Jeej 25:aac250164497 421 }
Jeej 25:aac250164497 422 }
Jeej 25:aac250164497 423 else // FS_OP_STAT/DSTAT
Jeej 25:aac250164497 424 {
Jeej 30:d775c1409849 425 if (g_fs_ctx.com[id].req.cmd == FS_OP_STAT)
Jeej 25:aac250164497 426 {
Jeej 25:aac250164497 427 d7a_fs_header_t hdr;
Jeej 30:d775c1409849 428 d7a_fs_hdr(g_fs_ctx.com[id].req.fid, &hdr);
Jeej 25:aac250164497 429 // Try to keep HOST-files coherency as much as we can:
Jeej 25:aac250164497 430 // STAT returns the full header so we can update all fields.
Jeej 38:c1e7f97ab396 431 if (FS_COM_TYPE(hdr.byte.type) == HOST)
Jeej 25:aac250164497 432 {
Jeej 25:aac250164497 433 d7a_fs_properties_t* props = (d7a_fs_properties_t*)&resp->data[0];
Jeej 25:aac250164497 434 // XXX d7a_fs_set_properties_p is for now keeping our file remote,
Jeej 25:aac250164497 435 // as it doesn't change addr,type,mirror etc.
Jeej 38:c1e7f97ab396 436 props->type += HOST; // HOST, but keep physical type as well
Jeej 25:aac250164497 437 //d7a_fs_set_properties(hdr, (uint32_t)props);
Jeej 25:aac250164497 438 }
Jeej 25:aac250164497 439 }
Jeej 25:aac250164497 440 // TODO: for now only keep length info for upper layer. (normal for a STAT)
Jeej 30:d775c1409849 441 if (g_fs_ctx.com[id].data != NULL)
Jeej 26:9f0b9833cac6 442 {
Jeej 30:d775c1409849 443 *(uint32_t*)g_fs_ctx.com[id].data = resp->length;
Jeej 26:9f0b9833cac6 444 }
Jeej 25:aac250164497 445 status = resp->status;
Jeej 25:aac250164497 446 }
Jeej 34:1311cc53201a 447
Jeej 25:aac250164497 448 // Inform requester
Jeej 34:1311cc53201a 449 g_fs_ctx.com[id].status = status;
Jeej 34:1311cc53201a 450 g_fs_ctx.fs_done.put((void*)id);
Jeej 34:1311cc53201a 451
Jeej 25:aac250164497 452 break;
Jeej 25:aac250164497 453 default:
Jeej 25:aac250164497 454 EPRINT("FS Unknown Flow ID 0x%02X\r\n", pkt->id);
Jeej 25:aac250164497 455 break;
Jeej 25:aac250164497 456 }
Jeej 25:aac250164497 457 FREE(pkt);
Jeej 25:aac250164497 458 }
Jeej 25:aac250164497 459 }