Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of d7a_1x by
src/d7a_fs.cpp@25:aac250164497, 2016-03-25 (annotated)
- Committer:
- Jeej
- Date:
- Fri Mar 25 16:48:02 2016 +0000
- Revision:
- 25:aac250164497
- Child:
- 26:9f0b9833cac6
D7A_1x compatibility. TODO Register file add check if file exists.
Who changed what in which revision?
User | Revision | Line number | New 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 | 25:aac250164497 | 16 | uint8_t cmd; |
Jeej | 25:aac250164497 | 17 | uint8_t fid; |
Jeej | 25:aac250164497 | 18 | uint32_t offset; |
Jeej | 25:aac250164497 | 19 | uint32_t length; |
Jeej | 25:aac250164497 | 20 | } d7a_fs_com_req_t; |
Jeej | 25:aac250164497 | 21 | |
Jeej | 25:aac250164497 | 22 | TYPEDEF_STRUCT_PACKED { |
Jeej | 25:aac250164497 | 23 | uint8_t cmd; |
Jeej | 25:aac250164497 | 24 | int8_t status; |
Jeej | 25:aac250164497 | 25 | uint32_t length; |
Jeej | 25:aac250164497 | 26 | uint8_t data[1]; |
Jeej | 25:aac250164497 | 27 | } d7a_fs_com_resp_t; |
Jeej | 25:aac250164497 | 28 | |
Jeej | 25:aac250164497 | 29 | typedef struct { |
Jeej | 25:aac250164497 | 30 | d7a_fs_com_req_t req; |
Jeej | 25:aac250164497 | 31 | void* data; |
Jeej | 25:aac250164497 | 32 | } d7a_fs_com_t; |
Jeej | 25:aac250164497 | 33 | |
Jeej | 25:aac250164497 | 34 | typedef struct { |
Jeej | 25:aac250164497 | 35 | Thread* thread; |
Jeej | 25:aac250164497 | 36 | Semaphore* fs_done; |
Jeej | 25:aac250164497 | 37 | WriteFileFunction write_file; |
Jeej | 25:aac250164497 | 38 | ReadFileFunction read_file; |
Jeej | 25:aac250164497 | 39 | Queue<d7a_com_rx_msg_t, 16> pkt_queue; |
Jeej | 25:aac250164497 | 40 | uint8_t hdr_map[FS_MAX_FILE_QTY]; |
Jeej | 25:aac250164497 | 41 | uint8_t nb_files; |
Jeej | 25:aac250164497 | 42 | d7a_fs_com_t com; // just one for now |
Jeej | 25:aac250164497 | 43 | } d7a_fs_ctx_t; |
Jeej | 25:aac250164497 | 44 | |
Jeej | 25:aac250164497 | 45 | d7a_fs_ctx_t g_fs_ctx; |
Jeej | 25:aac250164497 | 46 | |
Jeej | 25:aac250164497 | 47 | void d7a_fs_thread(const void *p); |
Jeej | 25:aac250164497 | 48 | |
Jeej | 25:aac250164497 | 49 | void d7a_fs_open(WriteFileFunction write_file, ReadFileFunction read_file) |
Jeej | 25:aac250164497 | 50 | { |
Jeej | 25:aac250164497 | 51 | FPRINT("\r\n"); |
Jeej | 25:aac250164497 | 52 | |
Jeej | 25:aac250164497 | 53 | memset(&g_fs_ctx.com, 0, sizeof(g_fs_ctx.com)); |
Jeej | 25:aac250164497 | 54 | g_fs_ctx.write_file = write_file; |
Jeej | 25:aac250164497 | 55 | g_fs_ctx.read_file = read_file; |
Jeej | 25:aac250164497 | 56 | g_fs_ctx.fs_done = new Semaphore(1); |
Jeej | 25:aac250164497 | 57 | g_fs_ctx.thread = new Thread(d7a_fs_thread, NULL, osPriorityBelowNormal, DEFAULT_STACK_SIZE*2); |
Jeej | 25:aac250164497 | 58 | |
Jeej | 25:aac250164497 | 59 | // Wait to consume Semaphore |
Jeej | 25:aac250164497 | 60 | g_fs_ctx.fs_done->wait(); |
Jeej | 25:aac250164497 | 61 | } |
Jeej | 25:aac250164497 | 62 | |
Jeej | 25:aac250164497 | 63 | static void d7a_fs_msg(uint8_t* buf, uint8_t len, uint8_t id) |
Jeej | 25:aac250164497 | 64 | { |
Jeej | 25:aac250164497 | 65 | FPRINT("\r\n"); |
Jeej | 25:aac250164497 | 66 | d7a_com_tx_msg_t msg; |
Jeej | 25:aac250164497 | 67 | msg.id = id; |
Jeej | 25:aac250164497 | 68 | msg.pbuf = buf; |
Jeej | 25:aac250164497 | 69 | msg.plen = len; |
Jeej | 25:aac250164497 | 70 | msg.alen = 0; |
Jeej | 25:aac250164497 | 71 | d7a_com_send_msg(&msg); |
Jeej | 25:aac250164497 | 72 | } |
Jeej | 25:aac250164497 | 73 | |
Jeej | 25:aac250164497 | 74 | void d7a_fs_wait_done( uint32_t millisec ) |
Jeej | 25:aac250164497 | 75 | { |
Jeej | 25:aac250164497 | 76 | FPRINT("\r\n"); |
Jeej | 25:aac250164497 | 77 | g_fs_ctx.fs_done->wait(millisec); |
Jeej | 25:aac250164497 | 78 | } |
Jeej | 25:aac250164497 | 79 | |
Jeej | 25:aac250164497 | 80 | void d7a_fs_new_pkt(d7a_com_rx_msg_t* pkt) |
Jeej | 25:aac250164497 | 81 | { |
Jeej | 25:aac250164497 | 82 | FPRINT("\r\n"); |
Jeej | 25:aac250164497 | 83 | ASSERT(g_fs_ctx.pkt_queue.put(pkt) == osOK, "FS queue full!\r\n"); |
Jeej | 25:aac250164497 | 84 | } |
Jeej | 25:aac250164497 | 85 | |
Jeej | 25:aac250164497 | 86 | d7a_com_rx_msg_t* d7a_fs_wait_pkt( uint32_t millisec ) |
Jeej | 25:aac250164497 | 87 | { |
Jeej | 25:aac250164497 | 88 | FPRINT("\r\n"); |
Jeej | 25:aac250164497 | 89 | osEvent evt = g_fs_ctx.pkt_queue.get(millisec); |
Jeej | 25:aac250164497 | 90 | return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL; |
Jeej | 25:aac250164497 | 91 | } |
Jeej | 25:aac250164497 | 92 | |
Jeej | 25:aac250164497 | 93 | static void d7a_fs_hdr(uint8_t fid, d7a_fs_header_t* hdr) |
Jeej | 25:aac250164497 | 94 | { |
Jeej | 25:aac250164497 | 95 | FPRINT("\r\n"); |
Jeej | 25:aac250164497 | 96 | g_fs_ctx.read_file(fid, 0, sizeof(d7a_fs_header_t), (uint8_t*)hdr); |
Jeej | 25:aac250164497 | 97 | } |
Jeej | 25:aac250164497 | 98 | |
Jeej | 25:aac250164497 | 99 | uint32_t d7a_fs_get_properties(uint8_t fid, d7a_fs_property_t prop, d7a_fs_properties_t* props) |
Jeej | 25:aac250164497 | 100 | { |
Jeej | 25:aac250164497 | 101 | FPRINT("\r\n"); |
Jeej | 25:aac250164497 | 102 | d7a_fs_header_t hdr; |
Jeej | 25:aac250164497 | 103 | d7a_fs_hdr(fid, &hdr); |
Jeej | 25:aac250164497 | 104 | |
Jeej | 25:aac250164497 | 105 | uint32_t ret = 0; |
Jeej | 25:aac250164497 | 106 | if (prop == KAL_FS_PROP_ALL) |
Jeej | 25:aac250164497 | 107 | { |
Jeej | 25:aac250164497 | 108 | // Fill in the API structure |
Jeej | 25:aac250164497 | 109 | //props->addr = (uint32_t)d7a_fs_get_memory_addr(hdr); |
Jeej | 25:aac250164497 | 110 | props->type = hdr.byte.type; |
Jeej | 25:aac250164497 | 111 | |
Jeej | 25:aac250164497 | 112 | props->afid = hdr.byte.afid; |
Jeej | 25:aac250164497 | 113 | props->ifid = hdr.byte.ifid; |
Jeej | 25:aac250164497 | 114 | props->prop = hdr.byte.prop; |
Jeej | 25:aac250164497 | 115 | props->perm = hdr.byte.perm; |
Jeej | 25:aac250164497 | 116 | |
Jeej | 25:aac250164497 | 117 | props->length = hdr.bf.length; |
Jeej | 25:aac250164497 | 118 | props->alloc = hdr.bf.alloc; |
Jeej | 25:aac250164497 | 119 | } |
Jeej | 25:aac250164497 | 120 | else |
Jeej | 25:aac250164497 | 121 | { |
Jeej | 25:aac250164497 | 122 | switch(prop) |
Jeej | 25:aac250164497 | 123 | { |
Jeej | 25:aac250164497 | 124 | case KAL_FS_PROP_SIZE: ret = hdr.bf.length; break; |
Jeej | 25:aac250164497 | 125 | case KAL_FS_PROP_ALLOC: ret = hdr.bf.alloc; break; |
Jeej | 25:aac250164497 | 126 | case KAL_FS_PROP_TYPE: ret = hdr.byte.type; break; |
Jeej | 25:aac250164497 | 127 | //case KAL_FS_PROP_ADDR: ret = (uint32_t)d7a_fs_get_memory_addr(hdr); break; |
Jeej | 25:aac250164497 | 128 | case KAL_FS_PROP_AFID: ret = hdr.byte.afid; break; |
Jeej | 25:aac250164497 | 129 | case KAL_FS_PROP_IFID: ret = hdr.byte.ifid; break; |
Jeej | 25:aac250164497 | 130 | case KAL_FS_PROP_PROP: ret = hdr.byte.prop; break; |
Jeej | 25:aac250164497 | 131 | case KAL_FS_PROP_PERM: ret = hdr.byte.perm; break; |
Jeej | 25:aac250164497 | 132 | default: |
Jeej | 25:aac250164497 | 133 | ASSERT(false, "FS:Invalid get prop request %d\n",prop); |
Jeej | 25:aac250164497 | 134 | } |
Jeej | 25:aac250164497 | 135 | } |
Jeej | 25:aac250164497 | 136 | DPRINT("GetProp[%d](%d): %d\n",fid,prop,ret); |
Jeej | 25:aac250164497 | 137 | return ret; |
Jeej | 25:aac250164497 | 138 | } |
Jeej | 25:aac250164497 | 139 | |
Jeej | 25:aac250164497 | 140 | int d7a_fs_distant_create(uint8_t fid, d7a_fs_properties_t* props) |
Jeej | 25:aac250164497 | 141 | { |
Jeej | 25:aac250164497 | 142 | FPRINT("\r\n"); |
Jeej | 25:aac250164497 | 143 | DPRINT("CrD[%d] type 0x%x\n",fid,props->type); |
Jeej | 25:aac250164497 | 144 | |
Jeej | 25:aac250164497 | 145 | switch (props->type) |
Jeej | 25:aac250164497 | 146 | { |
Jeej | 25:aac250164497 | 147 | case EEPROM: |
Jeej | 25:aac250164497 | 148 | case RAM: |
Jeej | 25:aac250164497 | 149 | case PFLASH: |
Jeej | 25:aac250164497 | 150 | case HOST: |
Jeej | 25:aac250164497 | 151 | ASSERT(g_fs_ctx.com.req.cmd == FS_OP_NULL,"FS: Concurrent Distant File access\n"); |
Jeej | 25:aac250164497 | 152 | // Build WR command |
Jeej | 25:aac250164497 | 153 | uint8_t* buf = (uint8_t*)MALLOC(sizeof(d7a_fs_com_req_t) + sizeof(d7a_fs_properties_t)); |
Jeej | 25:aac250164497 | 154 | d7a_fs_com_req_t* buf_req = (d7a_fs_com_req_t*)buf; |
Jeej | 25:aac250164497 | 155 | *buf_req = (d7a_fs_com_req_t){FS_OP_CREATE,fid,0,sizeof(d7a_fs_properties_t)}; |
Jeej | 25:aac250164497 | 156 | memcpy(&buf[sizeof(d7a_fs_com_req_t)],(uint8_t*)props,sizeof(d7a_fs_properties_t)); |
Jeej | 25:aac250164497 | 157 | |
Jeej | 25:aac250164497 | 158 | // Keep command request for response treatment |
Jeej | 25:aac250164497 | 159 | g_fs_ctx.com.req.cmd = FS_OP_CREATE; |
Jeej | 25:aac250164497 | 160 | d7a_fs_msg(buf,sizeof(d7a_fs_com_req_t) + sizeof(d7a_fs_properties_t), KAL_COM_FLOW_FS_CMD); |
Jeej | 25:aac250164497 | 161 | FREE(buf); |
Jeej | 25:aac250164497 | 162 | break; |
Jeej | 25:aac250164497 | 163 | // Wrong type |
Jeej | 25:aac250164497 | 164 | default: |
Jeej | 25:aac250164497 | 165 | ASSERT(false, "FS:post_distant_create wrong file type %x\n",props->type); |
Jeej | 25:aac250164497 | 166 | break; |
Jeej | 25:aac250164497 | 167 | } |
Jeej | 25:aac250164497 | 168 | return 0; |
Jeej | 25:aac250164497 | 169 | } |
Jeej | 25:aac250164497 | 170 | |
Jeej | 25:aac250164497 | 171 | void d7a_fs_post_distant_stat(uint8_t fid, int* length) |
Jeej | 25:aac250164497 | 172 | { |
Jeej | 25:aac250164497 | 173 | FPRINT("\r\n"); |
Jeej | 25:aac250164497 | 174 | // "Distant" Files |
Jeej | 25:aac250164497 | 175 | ASSERT(g_fs_ctx.com.req.cmd ==FS_OP_NULL,"FS: Concurrent Distant File access\n"); |
Jeej | 25:aac250164497 | 176 | g_fs_ctx.com.req = (d7a_fs_com_req_t){FS_OP_STAT,fid,0,0}; |
Jeej | 25:aac250164497 | 177 | g_fs_ctx.com.data = length; |
Jeej | 25:aac250164497 | 178 | d7a_fs_msg((uint8_t*)&g_fs_ctx.com.req,sizeof(d7a_fs_com_req_t), KAL_COM_FLOW_FS_CMD); |
Jeej | 25:aac250164497 | 179 | // We do a "normal" STAT but we don't want to update our local(true) file-size |
Jeej | 25:aac250164497 | 180 | // with the response of the STAT as: |
Jeej | 25:aac250164497 | 181 | // - the distant is likely a "Host-file" with hazardous size/alloc |
Jeej | 25:aac250164497 | 182 | // - we may not even have the corresponding local file (-> assert when getting props) |
Jeej | 25:aac250164497 | 183 | // So flag the cmd to differentiate response treatment |
Jeej | 25:aac250164497 | 184 | g_fs_ctx.com.req.cmd = FS_OP_DSTAT; // XXX |
Jeej | 25:aac250164497 | 185 | } |
Jeej | 25:aac250164497 | 186 | |
Jeej | 25:aac250164497 | 187 | |
Jeej | 25:aac250164497 | 188 | |
Jeej | 25:aac250164497 | 189 | #define OP_SIZE_RD 10 |
Jeej | 25:aac250164497 | 190 | #define OP_SIZE_WR 10 |
Jeej | 25:aac250164497 | 191 | #define OP_SIZE_STAT 2 |
Jeej | 25:aac250164497 | 192 | #define OP_SIZE_FLUSH 2 |
Jeej | 25:aac250164497 | 193 | #define OP_SIZE_CREATE 10 |
Jeej | 25:aac250164497 | 194 | #define OP_SIZE_RETSTAT (2+4) |
Jeej | 25:aac250164497 | 195 | #define OP_SIZE_RETDATA (2+4) |
Jeej | 25:aac250164497 | 196 | uint8_t k_valid_cmd[] = {FS_OP_RD, FS_OP_WR, FS_OP_STAT, FS_OP_FLUSH, FS_OP_CREATE}; |
Jeej | 25:aac250164497 | 197 | uint8_t k_valid_size[]= {OP_SIZE_RD,OP_SIZE_WR,OP_SIZE_STAT,OP_SIZE_FLUSH,OP_SIZE_CREATE}; |
Jeej | 25:aac250164497 | 198 | |
Jeej | 25:aac250164497 | 199 | |
Jeej | 25:aac250164497 | 200 | // TODO: Add a token field for multiple transactions |
Jeej | 25:aac250164497 | 201 | /// -------------------------------------------------------- |
Jeej | 25:aac250164497 | 202 | /// |CMD/RESP| PAYLOAD | |
Jeej | 25:aac250164497 | 203 | /// -------------------------------------------------------- |
Jeej | 25:aac250164497 | 204 | /// | 1B | PKT.blen - 1 bytes | |
Jeej | 25:aac250164497 | 205 | /// -------------------------------------------------------- |
Jeej | 25:aac250164497 | 206 | /// | | 1B | 4B | 4B | PKT.blen - 10 bytes| |
Jeej | 25:aac250164497 | 207 | /// -------------------------------------------------------- |
Jeej | 25:aac250164497 | 208 | // | write | FID | offset | length | datas... | |
Jeej | 25:aac250164497 | 209 | // | read | FID | offset | length | |
Jeej | 25:aac250164497 | 210 | // | flush | FID | |
Jeej | 25:aac250164497 | 211 | // | retstat|status| length | <d7a_fs_properties_t> |
Jeej | 25:aac250164497 | 212 | // | retdat |status| length | datas... | |
Jeej | 25:aac250164497 | 213 | void d7a_fs_thread(const void *p) |
Jeej | 25:aac250164497 | 214 | { |
Jeej | 25:aac250164497 | 215 | FPRINT("\r\n"); |
Jeej | 25:aac250164497 | 216 | d7a_com_rx_msg_t* pkt; |
Jeej | 25:aac250164497 | 217 | int8_t status; |
Jeej | 25:aac250164497 | 218 | |
Jeej | 25:aac250164497 | 219 | while (true) |
Jeej | 25:aac250164497 | 220 | { |
Jeej | 25:aac250164497 | 221 | status = FS_STAT_OK; |
Jeej | 25:aac250164497 | 222 | // TODO: For now only one outgoing-request can be pending |
Jeej | 25:aac250164497 | 223 | // An incoming-request response can be served simultaneously |
Jeej | 25:aac250164497 | 224 | // TODO: handle segmentation. For now MTU = 255-10 = 245 |
Jeej | 25:aac250164497 | 225 | pkt = d7a_fs_wait_pkt(); |
Jeej | 25:aac250164497 | 226 | ASSERT(pkt != NULL, "FS NULL pkt\r\n"); |
Jeej | 25:aac250164497 | 227 | // --------------------------------------------------------------------------- |
Jeej | 25:aac250164497 | 228 | // Peer request |
Jeej | 25:aac250164497 | 229 | // --------------------------------------------------------------------------- |
Jeej | 25:aac250164497 | 230 | switch (pkt->id) |
Jeej | 25:aac250164497 | 231 | { |
Jeej | 25:aac250164497 | 232 | case KAL_COM_FLOW_FS_CMD: |
Jeej | 25:aac250164497 | 233 | d7a_fs_com_req_t* req = (d7a_fs_com_req_t*)pkt->buffer; |
Jeej | 25:aac250164497 | 234 | DPRINT("Rfs[%d] cmd:%d\n",req->fid,req->cmd); |
Jeej | 25:aac250164497 | 235 | d7a_fs_com_resp_t buf = (d7a_fs_com_resp_t) {.cmd = FS_OP_RETSTAT}; |
Jeej | 25:aac250164497 | 236 | |
Jeej | 25:aac250164497 | 237 | // Error management makes sense here as we face peer-requests, |
Jeej | 25:aac250164497 | 238 | // and we don't want to assert because of the peer. |
Jeej | 25:aac250164497 | 239 | //status = d7a_fs_check_req(req, pkt->blen); |
Jeej | 25:aac250164497 | 240 | //buf.status = status; |
Jeej | 25:aac250164497 | 241 | buf.status = FS_STAT_OK; |
Jeej | 25:aac250164497 | 242 | |
Jeej | 25:aac250164497 | 243 | // From here we assume that the request is valid |
Jeej | 25:aac250164497 | 244 | // TODO: for now we consider that COM-FS request are targetting |
Jeej | 25:aac250164497 | 245 | // FIDs that are "local" to the Host, but we can extend this |
Jeej | 25:aac250164497 | 246 | // to "distant" files as well.(i.e. access SPI-Flash of an Host) |
Jeej | 25:aac250164497 | 247 | if (status != FS_STAT_OK) |
Jeej | 25:aac250164497 | 248 | { |
Jeej | 25:aac250164497 | 249 | buf.length = 0; |
Jeej | 25:aac250164497 | 250 | // Here we respond to request errors and OP_STAT |
Jeej | 25:aac250164497 | 251 | d7a_fs_msg((uint8_t*)&buf,OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP); |
Jeej | 25:aac250164497 | 252 | } |
Jeej | 25:aac250164497 | 253 | else if (req->cmd == FS_OP_RD) |
Jeej | 25:aac250164497 | 254 | { |
Jeej | 25:aac250164497 | 255 | d7a_fs_com_resp_t* b = (d7a_fs_com_resp_t*)MALLOC(OP_SIZE_RETDATA + req->length); |
Jeej | 25:aac250164497 | 256 | uint32_t len = g_fs_ctx.read_file(req->fid, req->offset+sizeof(d7a_fs_header_t), req->length, &b->data[0]); |
Jeej | 25:aac250164497 | 257 | b->length = len; |
Jeej | 25:aac250164497 | 258 | b->cmd = FS_OP_RETDATA; |
Jeej | 25:aac250164497 | 259 | b->status = FS_STAT_OK; // TODO |
Jeej | 25:aac250164497 | 260 | d7a_fs_msg((uint8_t*)b, OP_SIZE_RETDATA + req->length, KAL_COM_FLOW_FS_RESP); |
Jeej | 25:aac250164497 | 261 | FREE(b); |
Jeej | 25:aac250164497 | 262 | } |
Jeej | 25:aac250164497 | 263 | else if (req->cmd == FS_OP_WR) |
Jeej | 25:aac250164497 | 264 | { |
Jeej | 25:aac250164497 | 265 | buf.length = g_fs_ctx.write_file(req->fid, req->offset+sizeof(d7a_fs_header_t), req->length, &pkt->buffer[OP_SIZE_WR]); |
Jeej | 25:aac250164497 | 266 | d7a_fs_msg((uint8_t*)&buf, OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP); |
Jeej | 25:aac250164497 | 267 | } |
Jeej | 25:aac250164497 | 268 | else if (req->cmd == FS_OP_STAT) |
Jeej | 25:aac250164497 | 269 | { |
Jeej | 25:aac250164497 | 270 | // If file doesn't exist, FS_OP_STAT response is already handled |
Jeej | 25:aac250164497 | 271 | // by the common d7a_fs_check_req error response. |
Jeej | 25:aac250164497 | 272 | d7a_fs_com_resp_t* b = (d7a_fs_com_resp_t*)MALLOC(OP_SIZE_RETSTAT + sizeof(d7a_fs_properties_t)); |
Jeej | 25:aac250164497 | 273 | d7a_fs_get_properties(req->fid, KAL_FS_PROP_ALL, (d7a_fs_properties_t*) &b->data[0]); |
Jeej | 25:aac250164497 | 274 | d7a_fs_properties_t* props = (d7a_fs_properties_t*)&b->data[0]; |
Jeej | 25:aac250164497 | 275 | b->length = props->length; |
Jeej | 25:aac250164497 | 276 | b->cmd = FS_OP_RETSTAT; |
Jeej | 25:aac250164497 | 277 | b->status = FS_STAT_OK; |
Jeej | 25:aac250164497 | 278 | d7a_fs_msg((uint8_t*)b,OP_SIZE_RETSTAT + sizeof(d7a_fs_properties_t), KAL_COM_FLOW_FS_RESP); |
Jeej | 25:aac250164497 | 279 | FREE(b); |
Jeej | 25:aac250164497 | 280 | } |
Jeej | 25:aac250164497 | 281 | else if (req->cmd == FS_OP_FLUSH) |
Jeej | 25:aac250164497 | 282 | { |
Jeej | 25:aac250164497 | 283 | //d7a_fs_flush(req->fid); |
Jeej | 25:aac250164497 | 284 | //d7a_fs_msg((uint8_t*)&buf, OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP); |
Jeej | 25:aac250164497 | 285 | } |
Jeej | 25:aac250164497 | 286 | else if (req->cmd == FS_OP_CREATE) |
Jeej | 25:aac250164497 | 287 | { |
Jeej | 25:aac250164497 | 288 | //d7a_fs_create(req->fid,(d7a_fs_properties_t*)&pkt->buffer[OP_SIZE_CREATE]); |
Jeej | 25:aac250164497 | 289 | //d7a_fs_msg((uint8_t*)&buf, OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP); |
Jeej | 25:aac250164497 | 290 | } |
Jeej | 25:aac250164497 | 291 | break; |
Jeej | 25:aac250164497 | 292 | // --------------------------------------------------------------------------- |
Jeej | 25:aac250164497 | 293 | // Response to our commands |
Jeej | 25:aac250164497 | 294 | // --------------------------------------------------------------------------- |
Jeej | 25:aac250164497 | 295 | case KAL_COM_FLOW_FS_RESP: |
Jeej | 25:aac250164497 | 296 | d7a_fs_com_resp_t* resp = (d7a_fs_com_resp_t*)pkt->buffer; |
Jeej | 25:aac250164497 | 297 | DPRINT("Rfs resp - status:%d bytes:%d\n",resp->status,resp->length); |
Jeej | 25:aac250164497 | 298 | ASSERT(g_fs_ctx.com.req.cmd !=FS_OP_NULL,"FS: Unexpected FS_RESP\n"); |
Jeej | 25:aac250164497 | 299 | if (g_fs_ctx.com.req.cmd != FS_OP_STAT && |
Jeej | 25:aac250164497 | 300 | g_fs_ctx.com.req.cmd != FS_OP_DSTAT ) |
Jeej | 25:aac250164497 | 301 | { |
Jeej | 25:aac250164497 | 302 | // No pity for errors here, handled-ones should be avoided at |
Jeej | 25:aac250164497 | 303 | // upper level, the others diserve to assert anyway. |
Jeej | 25:aac250164497 | 304 | ASSERT(resp->status==FS_STAT_OK,"FS: Peer error:%d\n",resp->status); |
Jeej | 25:aac250164497 | 305 | |
Jeej | 25:aac250164497 | 306 | // Fill read buffer |
Jeej | 25:aac250164497 | 307 | if (resp->cmd == FS_OP_RETDATA) |
Jeej | 25:aac250164497 | 308 | { |
Jeej | 25:aac250164497 | 309 | memcpy(g_fs_ctx.com.data, &resp->data[0], resp->length); |
Jeej | 25:aac250164497 | 310 | } |
Jeej | 25:aac250164497 | 311 | else if (resp->cmd == FS_OP_RETSTAT) |
Jeej | 25:aac250164497 | 312 | { |
Jeej | 25:aac250164497 | 313 | if (g_fs_ctx.com.req.cmd == FS_OP_WR) |
Jeej | 25:aac250164497 | 314 | { |
Jeej | 25:aac250164497 | 315 | // We did a successful WR, update size if needed |
Jeej | 25:aac250164497 | 316 | // TODO:This is not really enforcing header coherency. It will do the |
Jeej | 25:aac250164497 | 317 | // job for Hosted NVM storage, provided the Host doesn't use the file for |
Jeej | 25:aac250164497 | 318 | // writing. |
Jeej | 25:aac250164497 | 319 | d7a_fs_header_t hdr; |
Jeej | 25:aac250164497 | 320 | d7a_fs_hdr(g_fs_ctx.com.req.fid, &hdr); |
Jeej | 25:aac250164497 | 321 | if (resp->length != hdr.bf.length) |
Jeej | 25:aac250164497 | 322 | { |
Jeej | 25:aac250164497 | 323 | //d7a_fs_set_properties(g_fs_ctx.com.req.fid, KAL_FS_PROP_SIZE, resp->length); |
Jeej | 25:aac250164497 | 324 | } |
Jeej | 25:aac250164497 | 325 | } |
Jeej | 25:aac250164497 | 326 | } |
Jeej | 25:aac250164497 | 327 | } |
Jeej | 25:aac250164497 | 328 | else // FS_OP_STAT/DSTAT |
Jeej | 25:aac250164497 | 329 | { |
Jeej | 25:aac250164497 | 330 | if (g_fs_ctx.com.req.cmd == FS_OP_STAT) |
Jeej | 25:aac250164497 | 331 | { |
Jeej | 25:aac250164497 | 332 | d7a_fs_header_t hdr; |
Jeej | 25:aac250164497 | 333 | d7a_fs_hdr(g_fs_ctx.com.req.fid, &hdr); |
Jeej | 25:aac250164497 | 334 | // Try to keep HOST-files coherency as much as we can: |
Jeej | 25:aac250164497 | 335 | // STAT returns the full header so we can update all fields. |
Jeej | 25:aac250164497 | 336 | if (hdr.byte.type == HOST) |
Jeej | 25:aac250164497 | 337 | { |
Jeej | 25:aac250164497 | 338 | d7a_fs_properties_t* props = (d7a_fs_properties_t*)&resp->data[0]; |
Jeej | 25:aac250164497 | 339 | // XXX d7a_fs_set_properties_p is for now keeping our file remote, |
Jeej | 25:aac250164497 | 340 | // as it doesn't change addr,type,mirror etc. |
Jeej | 25:aac250164497 | 341 | //d7a_fs_set_properties(hdr, (uint32_t)props); |
Jeej | 25:aac250164497 | 342 | } |
Jeej | 25:aac250164497 | 343 | } |
Jeej | 25:aac250164497 | 344 | // TODO: for now only keep length info for upper layer. (normal for a STAT) |
Jeej | 25:aac250164497 | 345 | if (g_fs_ctx.com.data!=NULL) *(uint32_t*)g_fs_ctx.com.data = resp->length; |
Jeej | 25:aac250164497 | 346 | status = resp->status; |
Jeej | 25:aac250164497 | 347 | } |
Jeej | 25:aac250164497 | 348 | // Free to serve a new request |
Jeej | 25:aac250164497 | 349 | g_fs_ctx.com.req.cmd = FS_OP_NULL; |
Jeej | 25:aac250164497 | 350 | // Inform requester |
Jeej | 25:aac250164497 | 351 | g_fs_ctx.fs_done->release(); |
Jeej | 25:aac250164497 | 352 | break; |
Jeej | 25:aac250164497 | 353 | default: |
Jeej | 25:aac250164497 | 354 | EPRINT("FS Unknown Flow ID 0x%02X\r\n", pkt->id); |
Jeej | 25:aac250164497 | 355 | break; |
Jeej | 25:aac250164497 | 356 | } |
Jeej | 25:aac250164497 | 357 | FREE(pkt); |
Jeej | 25:aac250164497 | 358 | } |
Jeej | 25:aac250164497 | 359 | } |