Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Fri Jan 06 15:33:26 2017 +0000
Revision:
84:e5388f1b8ed9
Parent:
83:f4054d0b29ba
Typedef to separate declarations

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 43:28202405094d 7 #include "d7a.h"
Jeej 84:e5388f1b8ed9 8 #include "d7a_typedefs.h"
Jeej 25:aac250164497 9
Jeej 79:82b01c1a62f6 10 #if 0
Jeej 79:82b01c1a62f6 11 #define FS_DPRINT(...) DPRINT(__VA_ARGS__)
Jeej 79:82b01c1a62f6 12 #define FS_DPRINT_DATA(...) DPRINT_DATA(__VA_ARGS__)
Jeej 83:f4054d0b29ba 13 #define FS_FPRINT(...) FPRINT(__VA_ARGS__)
Jeej 79:82b01c1a62f6 14 #else
Jeej 79:82b01c1a62f6 15 #define FS_DPRINT(...);
Jeej 79:82b01c1a62f6 16 #define FS_DPRINT_DATA(...);
Jeej 83:f4054d0b29ba 17 #define FS_FPRINT(...);
Jeej 79:82b01c1a62f6 18 #endif
Jeej 25:aac250164497 19
Jeej 25:aac250164497 20 #define FS_MAX_FILE_QTY 256
Jeej 25:aac250164497 21 #define FS_MAX_MIRROR_QTY 32
Jeej 25:aac250164497 22 #define FS_MAX_WATCHERS_QTY 32
Jeej 25:aac250164497 23
Jeej 25:aac250164497 24 #define FS_NULL_MAP 0xFF // XXX: this actually removes usage of file 255
Jeej 25:aac250164497 25
Jeej 25:aac250164497 26 TYPEDEF_STRUCT_PACKED {
Jeej 30:d775c1409849 27 uint8_t id;
Jeej 25:aac250164497 28 uint8_t cmd;
Jeej 25:aac250164497 29 uint8_t fid;
Jeej 25:aac250164497 30 uint32_t offset;
Jeej 25:aac250164497 31 uint32_t length;
Jeej 25:aac250164497 32 } d7a_fs_com_req_t;
Jeej 25:aac250164497 33
Jeej 25:aac250164497 34 TYPEDEF_STRUCT_PACKED {
Jeej 30:d775c1409849 35 uint8_t id;
Jeej 25:aac250164497 36 uint8_t cmd;
Jeej 30:d775c1409849 37 int8_t status;
Jeej 25:aac250164497 38 uint32_t length;
Jeej 25:aac250164497 39 uint8_t data[1];
Jeej 25:aac250164497 40 } d7a_fs_com_resp_t;
Jeej 25:aac250164497 41
Jeej 25:aac250164497 42 typedef struct {
Jeej 25:aac250164497 43 d7a_fs_com_req_t req;
Jeej 34:1311cc53201a 44 int8_t status;
Jeej 25:aac250164497 45 void* data;
Jeej 25:aac250164497 46 } d7a_fs_com_t;
Jeej 25:aac250164497 47
Jeej 77:8c792719a1fc 48 static WriteFileFunction g_fs_write_file;
Jeej 77:8c792719a1fc 49 static ReadFileFunction g_fs_read_file;
Jeej 84:e5388f1b8ed9 50
Jeej 84:e5388f1b8ed9 51 static OS_Thread g_fs_thread(osPriorityHigh, 512, NULL);
Jeej 84:e5388f1b8ed9 52 static OS_Queue<d7a_com_rx_msg_t, 8> g_fs_pkt_queue;
Jeej 25:aac250164497 53
Jeej 76:fda2e34ff19d 54 void d7a_fs_thread();
Jeej 25:aac250164497 55
Jeej 49:81d5bddb02f0 56 d7a_errors_t d7a_fs_open(WriteFileFunction wf, ReadFileFunction rf)
Jeej 25:aac250164497 57 {
Jeej 83:f4054d0b29ba 58 FS_FPRINT("\r\n");
Jeej 25:aac250164497 59
Jeej 77:8c792719a1fc 60 g_fs_write_file = wf;
Jeej 77:8c792719a1fc 61 g_fs_read_file = rf;
Jeej 49:81d5bddb02f0 62
Jeej 77:8c792719a1fc 63 osStatus err = g_fs_thread.start(d7a_fs_thread);
Jeej 76:fda2e34ff19d 64 ASSERT(err == osOK, "Failed to start d7a_fs_thread (err: %d)\r\n", err);
Jeej 76:fda2e34ff19d 65
Jeej 49:81d5bddb02f0 66 return D7A_ERR_NONE;
Jeej 25:aac250164497 67 }
Jeej 25:aac250164497 68
Jeej 56:da34fc11e760 69 d7a_errors_t d7a_fs_close(void)
Jeej 56:da34fc11e760 70 {
Jeej 83:f4054d0b29ba 71 FS_FPRINT("\r\n");
Jeej 56:da34fc11e760 72
Jeej 77:8c792719a1fc 73 g_fs_thread.terminate();
Jeej 56:da34fc11e760 74
Jeej 56:da34fc11e760 75 return D7A_ERR_NONE;
Jeej 56:da34fc11e760 76 }
Jeej 56:da34fc11e760 77
Jeej 25:aac250164497 78 static void d7a_fs_msg(uint8_t* buf, uint8_t len, uint8_t id)
Jeej 25:aac250164497 79 {
Jeej 83:f4054d0b29ba 80 FS_FPRINT("\r\n");
Jeej 25:aac250164497 81 d7a_com_tx_msg_t msg;
Jeej 25:aac250164497 82 msg.id = id;
Jeej 25:aac250164497 83 msg.pbuf = buf;
Jeej 25:aac250164497 84 msg.plen = len;
Jeej 25:aac250164497 85 msg.alen = 0;
Jeej 34:1311cc53201a 86 d7a_com_post_msg(&msg);
Jeej 25:aac250164497 87 }
Jeej 25:aac250164497 88
Jeej 25:aac250164497 89 void d7a_fs_new_pkt(d7a_com_rx_msg_t* pkt)
Jeej 25:aac250164497 90 {
Jeej 83:f4054d0b29ba 91 FS_FPRINT("\r\n");
Jeej 77:8c792719a1fc 92 ASSERT(g_fs_pkt_queue.put(pkt) == osOK, "FS queue full!\r\n");
Jeej 25:aac250164497 93 }
Jeej 25:aac250164497 94
Jeej 25:aac250164497 95 d7a_com_rx_msg_t* d7a_fs_wait_pkt( uint32_t millisec )
Jeej 25:aac250164497 96 {
Jeej 83:f4054d0b29ba 97 FS_FPRINT("(millisec:%d)\r\n", millisec);
Jeej 77:8c792719a1fc 98 osEvent evt = g_fs_pkt_queue.get(millisec);
Jeej 25:aac250164497 99 return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
Jeej 25:aac250164497 100 }
Jeej 25:aac250164497 101
Jeej 27:934ab7455115 102
Jeej 30:d775c1409849 103 #define OP_SIZE_RD 11
Jeej 30:d775c1409849 104 #define OP_SIZE_WR 11
Jeej 30:d775c1409849 105 #define OP_SIZE_TOUCH 11
Jeej 41:a924aa709b6f 106 #define OP_SIZE_SYNC 11
Jeej 30:d775c1409849 107 #define OP_SIZE_STAT 3
Jeej 30:d775c1409849 108 #define OP_SIZE_FLUSH 3
Jeej 30:d775c1409849 109 #define OP_SIZE_CREATE 11
Jeej 30:d775c1409849 110 #define OP_SIZE_RETSTAT (3+4)
Jeej 30:d775c1409849 111 #define OP_SIZE_RETDATA (3+4)
Jeej 41:a924aa709b6f 112 uint8_t k_valid_cmd[] = {FS_OP_RD, FS_OP_WR, FS_OP_TOUCH ,FS_OP_STAT, FS_OP_FLUSH, FS_OP_CREATE, FS_OP_SYNC};
Jeej 41:a924aa709b6f 113 uint8_t k_valid_size[]= {OP_SIZE_RD,OP_SIZE_WR,OP_SIZE_TOUCH,OP_SIZE_STAT,OP_SIZE_FLUSH,OP_SIZE_CREATE,OP_SIZE_SYNC};
Jeej 41:a924aa709b6f 114
Jeej 52:c7a58fc48bd2 115 // ------------------------------------------------------------------
Jeej 52:c7a58fc48bd2 116 // |TOKEN|CMD/RESP| PAYLOAD |
Jeej 52:c7a58fc48bd2 117 // --------------------------------------------------------------
Jeej 52:c7a58fc48bd2 118 // | 1B | 1B | PKT.blen - 1 bytes |
Jeej 52:c7a58fc48bd2 119 // --------------------------------------------------------------
Jeej 52:c7a58fc48bd2 120 // | | | 1B | 4B | 4B | PKT.blen - 11 bytes|
Jeej 52:c7a58fc48bd2 121 // --------------------------------------------------------------
Jeej 30:d775c1409849 122 // | | write | FID | offset | length | datas... |
Jeej 30:d775c1409849 123 // | | read | FID | offset | length |
Jeej 30:d775c1409849 124 // | | touch | FID | offset | length |
Jeej 30:d775c1409849 125 // | | exist | FID |
Jeej 30:d775c1409849 126 // | | flush | FID |
Jeej 30:d775c1409849 127 // | | retstat|status| length | <kal_fs_properties_t>
Jeej 30:d775c1409849 128 // | | retdat |status| length | datas... |
Jeej 76:fda2e34ff19d 129 void d7a_fs_thread()
Jeej 25:aac250164497 130 {
Jeej 83:f4054d0b29ba 131 FS_FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 25:aac250164497 132 d7a_com_rx_msg_t* pkt;
Jeej 26:9f0b9833cac6 133 int8_t status = FS_STAT_OK;
Jeej 25:aac250164497 134
Jeej 25:aac250164497 135 while (true)
Jeej 25:aac250164497 136 {
Jeej 25:aac250164497 137 status = FS_STAT_OK;
Jeej 25:aac250164497 138 // TODO: For now only one outgoing-request can be pending
Jeej 25:aac250164497 139 // An incoming-request response can be served simultaneously
Jeej 25:aac250164497 140 // TODO: handle segmentation. For now MTU = 255-10 = 245
Jeej 25:aac250164497 141 pkt = d7a_fs_wait_pkt();
Jeej 25:aac250164497 142 ASSERT(pkt != NULL, "FS NULL pkt\r\n");
Jeej 25:aac250164497 143 // ---------------------------------------------------------------------------
Jeej 25:aac250164497 144 // Peer request
Jeej 25:aac250164497 145 // ---------------------------------------------------------------------------
Jeej 25:aac250164497 146 switch (pkt->id)
Jeej 25:aac250164497 147 {
Jeej 25:aac250164497 148 case KAL_COM_FLOW_FS_CMD:
Jeej 25:aac250164497 149 d7a_fs_com_req_t* req = (d7a_fs_com_req_t*)pkt->buffer;
Jeej 79:82b01c1a62f6 150 FS_DPRINT("Rfs[%d](%d) cmd:%d\n", req->fid, req->id, req->cmd);
Jeej 30:d775c1409849 151 //dbg_print_data("%02X ", (uint8_t*)req, sizeof(d7a_fs_com_req_t));
Jeej 79:82b01c1a62f6 152 //FS_DPRINT("\r\n");
Jeej 30:d775c1409849 153 d7a_fs_com_resp_t buf = (d7a_fs_com_resp_t) {.id = req->id, .cmd = FS_OP_RETSTAT};
Jeej 25:aac250164497 154
Jeej 25:aac250164497 155 // Error management makes sense here as we face peer-requests,
Jeej 25:aac250164497 156 // and we don't want to assert because of the peer.
Jeej 25:aac250164497 157 //status = d7a_fs_check_req(req, pkt->blen);
Jeej 25:aac250164497 158 //buf.status = status;
Jeej 25:aac250164497 159 buf.status = FS_STAT_OK;
Jeej 25:aac250164497 160
Jeej 25:aac250164497 161 // From here we assume that the request is valid
Jeej 25:aac250164497 162 // TODO: for now we consider that COM-FS request are targetting
Jeej 25:aac250164497 163 // FIDs that are "local" to the Host, but we can extend this
Jeej 25:aac250164497 164 // to "distant" files as well.(i.e. access SPI-Flash of an Host)
Jeej 25:aac250164497 165 if (status != FS_STAT_OK)
Jeej 25:aac250164497 166 {
Jeej 25:aac250164497 167 buf.length = 0;
Jeej 25:aac250164497 168 // Here we respond to request errors and OP_STAT
Jeej 25:aac250164497 169 d7a_fs_msg((uint8_t*)&buf,OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 170 }
Jeej 25:aac250164497 171 else if (req->cmd == FS_OP_RD)
Jeej 25:aac250164497 172 {
Jeej 25:aac250164497 173 d7a_fs_com_resp_t* b = (d7a_fs_com_resp_t*)MALLOC(OP_SIZE_RETDATA + req->length);
Jeej 77:8c792719a1fc 174 ASSERT(g_fs_read_file != NULL, "FS Read callback not implemented!\r\n");
Jeej 77:8c792719a1fc 175 uint32_t len = g_fs_read_file(req->fid, req->offset, req->length, &b->data[0]);
Jeej 51:644de6fe1ee7 176
Jeej 30:d775c1409849 177 b->id = req->id;
Jeej 25:aac250164497 178 b->cmd = FS_OP_RETDATA;
Jeej 51:644de6fe1ee7 179 if (len == req->length)
Jeej 51:644de6fe1ee7 180 {
Jeej 51:644de6fe1ee7 181 b->length = len;
Jeej 51:644de6fe1ee7 182 b->status = FS_STAT_OK;
Jeej 51:644de6fe1ee7 183 }
Jeej 51:644de6fe1ee7 184 else
Jeej 51:644de6fe1ee7 185 {
Jeej 51:644de6fe1ee7 186 b->length = 0;
Jeej 51:644de6fe1ee7 187 b->status = FS_STAT_ERR_FID_NOEXIST;
Jeej 51:644de6fe1ee7 188 WARNING(false, "FS_STAT_ERR_FID_NOEXIST\r\n");
Jeej 51:644de6fe1ee7 189 }
Jeej 51:644de6fe1ee7 190
Jeej 51:644de6fe1ee7 191 d7a_fs_msg((uint8_t*)b, OP_SIZE_RETDATA + b->length, KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 192 FREE(b);
Jeej 25:aac250164497 193 }
Jeej 25:aac250164497 194 else if (req->cmd == FS_OP_WR)
Jeej 25:aac250164497 195 {
Jeej 77:8c792719a1fc 196 ASSERT(g_fs_write_file != NULL, "FS Write callback not implemented!\r\n");
Jeej 77:8c792719a1fc 197 buf.length = g_fs_write_file(req->fid, req->offset, req->length, &pkt->buffer[OP_SIZE_WR]);
Jeej 25:aac250164497 198 d7a_fs_msg((uint8_t*)&buf, OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP);
Jeej 25:aac250164497 199 }
Jeej 45:b85384e7d825 200 else if (req->cmd == FS_OP_TOUCH)
Jeej 45:b85384e7d825 201 {
Jeej 79:82b01c1a62f6 202 FS_DPRINT("PS Touch f:%d o:%d s:%d\r\n", req->fid, req->offset, req->length);
Jeej 77:8c792719a1fc 203 //buf.length = g_fs_callback->touch_file(req->fid, req->offset, req->length);
Jeej 45:b85384e7d825 204 d7a_fs_msg((uint8_t*)&buf, OP_SIZE_RETSTAT, KAL_COM_FLOW_FS_RESP);
Jeej 45:b85384e7d825 205 }
Jeej 26:9f0b9833cac6 206 else
Jeej 26:9f0b9833cac6 207 {
Jeej 43:28202405094d 208 ASSERT(false, "FS: Unsupported cmd %d\r\n", req->cmd);
Jeej 26:9f0b9833cac6 209 }
Jeej 25:aac250164497 210 break;
Jeej 25:aac250164497 211 // ---------------------------------------------------------------------------
Jeej 25:aac250164497 212 // Response to our commands
Jeej 25:aac250164497 213 // ---------------------------------------------------------------------------
Jeej 25:aac250164497 214 case KAL_COM_FLOW_FS_RESP:
Jeej 43:28202405094d 215 ASSERT(false, "FS: Commands are not used\r\n");
Jeej 25:aac250164497 216 break;
Jeej 25:aac250164497 217 default:
Jeej 25:aac250164497 218 EPRINT("FS Unknown Flow ID 0x%02X\r\n", pkt->id);
Jeej 25:aac250164497 219 break;
Jeej 25:aac250164497 220 }
Jeej 25:aac250164497 221 FREE(pkt);
Jeej 25:aac250164497 222 }
Jeej 25:aac250164497 223 }