Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Thu Jun 02 09:24:52 2016 +0000
Revision:
31:ab9bfdbc6b44
Parent:
30:d775c1409849
Child:
33:f9a542d3efaa
New process for TX commands in d7a_com.

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