Exportable version of WizziLab's modem driver.

Dependents:   modem_ref_helper

Committer:
Jeej
Date:
Mon Feb 04 17:34:17 2019 +0000
Revision:
48:37bf104b3a39
Parent:
41:6f83174ffed4
Child:
49:7a2f4992ff90
Added remote read/write root functions.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 1:40ead20ecb14 1 #include "mbed.h"
Jeej 1:40ead20ecb14 2 #include "WizziDebug.h"
Jeej 1:40ead20ecb14 3
Jeej 0:027760f45e2c 4 #include "modem_ref.h"
Jeej 13:10589aaf8853 5 #include "kal_crypto.h"
Jeej 41:6f83174ffed4 6 #include "kal_codec.h"
Jeej 0:027760f45e2c 7
Jeej 39:bc4fccf2d84b 8 #if 0
Jeej 4:8f031be3ff7d 9 #define REF_PRINT(...) PRINT(__VA_ARGS__)
Jeej 13:10589aaf8853 10 #define URC_PRINT(...) PRINT(__VA_ARGS__)
Jeej 4:8f031be3ff7d 11 #else
Jeej 4:8f031be3ff7d 12 #define REF_PRINT(...);
Jeej 13:10589aaf8853 13 #define URC_PRINT(...);
Jeej 4:8f031be3ff7d 14 #endif
Jeej 4:8f031be3ff7d 15
Jeej 0:027760f45e2c 16 typedef struct {
Jeej 0:027760f45e2c 17 action_callback_t* cb;
Jeej 0:027760f45e2c 18 u8* data;
Jeej 1:40ead20ecb14 19 u8* istatus;
Jeej 0:027760f45e2c 20 } modem_user_t;
Jeej 0:027760f45e2c 21
Jeej 0:027760f45e2c 22 typedef struct {
Jeej 8:97875739f11a 23 u8* data;
Jeej 8:97875739f11a 24 u8 type;
Jeej 8:97875739f11a 25 u8 length;
Jeej 8:97875739f11a 26 } modem_istatus_t;
Jeej 8:97875739f11a 27
Jeej 8:97875739f11a 28 typedef struct {
Jeej 0:027760f45e2c 29 fx_serial_send_t* send;
Jeej 0:027760f45e2c 30 modem_callbacks_t* cb;
Jeej 0:027760f45e2c 31 modem_user_t user[MAX_USER_NB];
Jeej 8:97875739f11a 32 modem_istatus_t istatus;
Jeej 0:027760f45e2c 33 u8 state;
Jeej 0:027760f45e2c 34 u8 tx_sequ;
Jeej 41:6f83174ffed4 35 s32 action;
Jeej 0:027760f45e2c 36 } modem_ctx_t;
Jeej 0:027760f45e2c 37 static modem_ctx_t g_modem;
Jeej 0:027760f45e2c 38
Jeej 0:027760f45e2c 39 #define STATE_OPEN 0xab
Jeej 0:027760f45e2c 40 #define STATE_CLOSED 0
Jeej 0:027760f45e2c 41
Jeej 13:10589aaf8853 42 #define ROOT_KEY_SIZE 16
Jeej 13:10589aaf8853 43
Jeej 0:027760f45e2c 44 #define SERIAL_SEND(_flow,_data,_size) do { \
Jeej 21:d5018a680915 45 ASSERT(_size<256, "SERIAL_SEND too big for serial protocol (%d/%dmax)", _size, 255);\
Jeej 0:027760f45e2c 46 u8 wch[WC_HEADER_SIZE] = {WC_SYNC_BYTE_0,WC_SYNC_BYTE_1,_size,g_modem.tx_sequ++,_flow};\
Jeej 0:027760f45e2c 47 g_modem.send(wch,WC_HEADER_SIZE,_data,_size);\
Jeej 0:027760f45e2c 48 }while(0)
Jeej 0:027760f45e2c 49
Jeej 0:027760f45e2c 50 // Flows
Jeej 0:027760f45e2c 51 #define WC_FLOWID_CMD 0x10
Jeej 0:027760f45e2c 52 #define WC_FLOWID_ALP 0x20
Jeej 0:027760f45e2c 53 #define WC_FLOWID_SYS 0x30
Jeej 0:027760f45e2c 54
Jeej 0:027760f45e2c 55 // Sub-Flows
Jeej 0:027760f45e2c 56 #define WC_FLOW_ALP_CMD 0x20
Jeej 0:027760f45e2c 57 #define WC_FLOW_ALP_RESP 0x21
Jeej 0:027760f45e2c 58 #define WC_FLOW_ALP_UNS 0x22
Jeej 0:027760f45e2c 59 #define WC_FLOW_SYS_RST 0x30
Jeej 0:027760f45e2c 60 #define WC_FLOW_SYS_PING 0x34
Jeej 0:027760f45e2c 61 #define WC_FLOW_SYS_PONG 0x35
Jeej 0:027760f45e2c 62 #define WC_FLOW_SYS_CFG 0x36
Jeej 0:027760f45e2c 63 #define WC_FLOW_SYS_XON 0x39
Jeej 0:027760f45e2c 64 #define WC_FLOW_SYS_XOFF 0x3a
Jeej 0:027760f45e2c 65 #define WC_FLOW_SYS_XACK 0x3b
Jeej 0:027760f45e2c 66
Jeej 0:027760f45e2c 67 // Misc CMD...
Jeej 0:027760f45e2c 68 #define WM_BOOT 0x81
Jeej 0:027760f45e2c 69
Jeej 0:027760f45e2c 70
Jeej 0:027760f45e2c 71 protected void modem_input(u8 flowid,u8* payload,u8 size)
Jeej 0:027760f45e2c 72 {
Jeej 0:027760f45e2c 73 int rem =size;
Jeej 0:027760f45e2c 74 u8* p = payload;
Jeej 0:027760f45e2c 75 alp_parsed_chunk_t r;
Jeej 0:027760f45e2c 76 int id = -1;
Jeej 0:027760f45e2c 77 s8 err = ALP_ERR_NONE;
Jeej 1:40ead20ecb14 78 u8 eop;
Jeej 34:137ae523ca43 79 uint32_t parsed;
Jeej 41:6f83174ffed4 80
Jeej 41:6f83174ffed4 81 g_modem.action = -1;
Jeej 41:6f83174ffed4 82
Jeej 41:6f83174ffed4 83 //REF_PRINT("input 0x%x/%d Bytes\n",flowid,size);
Jeej 0:027760f45e2c 84 switch (flowid)
Jeej 0:027760f45e2c 85 {
Jeej 0:027760f45e2c 86 case WC_FLOW_ALP_UNS:
Jeej 0:027760f45e2c 87 case WC_FLOW_ALP_CMD:
Jeej 34:137ae523ca43 88 parsed = alp_parse_chunk(&p, &r);
Jeej 34:137ae523ca43 89 if (!parsed)
Jeej 34:137ae523ca43 90 {
Jeej 34:137ae523ca43 91 // Discard the payload in case of parsing error.
Jeej 41:6f83174ffed4 92 REF_PRINT("Parsing error line %d!\r\n", __LINE__);
Jeej 34:137ae523ca43 93 break;
Jeej 34:137ae523ca43 94 }
Jeej 34:137ae523ca43 95 rem -= parsed;
Jeej 41:6f83174ffed4 96 g_modem.action++;
Jeej 41:6f83174ffed4 97 //REF_PRINT("Rem %d Bytes\n", rem);
Jeej 0:027760f45e2c 98 // This should always be a TAG'ed request in case of FS access...
Jeej 0:027760f45e2c 99 if (r.type == ALP_OPCODE_TAG)
Jeej 0:027760f45e2c 100 {
Jeej 41:6f83174ffed4 101 REF_PRINT("ACT %d: TAG[%d]\n", g_modem.action, r.meta.tag.id);
Jeej 41:6f83174ffed4 102
Jeej 0:027760f45e2c 103 id = r.meta.tag.id;
Jeej 41:6f83174ffed4 104
Jeej 8:97875739f11a 105 while(rem>0)
Jeej 0:027760f45e2c 106 {
Jeej 8:97875739f11a 107 // Parse File Operation
Jeej 34:137ae523ca43 108 parsed = alp_parse_chunk(&p, &r);
Jeej 34:137ae523ca43 109 if (!parsed)
Jeej 34:137ae523ca43 110 {
Jeej 34:137ae523ca43 111 // Discard the payload in case of parsing error.
Jeej 41:6f83174ffed4 112 REF_PRINT("Parsing error line %d!\r\n", __LINE__);
Jeej 34:137ae523ca43 113 break;
Jeej 34:137ae523ca43 114 }
Jeej 34:137ae523ca43 115 rem -= parsed;
Jeej 41:6f83174ffed4 116 g_modem.action++;
Jeej 26:2c934a269914 117 //REF_PRINT("ALP OP[%d]\n",r.type);
Jeej 8:97875739f11a 118 switch (r.type)
Jeej 8:97875739f11a 119 {
Jeej 8:97875739f11a 120 case ALP_OPCODE_F_RD_DATA:
Jeej 41:6f83174ffed4 121 REF_PRINT("ACT %d: F_RD_DATA[%d] @%d %d bytes\n", g_modem.action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length);
Jeej 31:517fc900afba 122 if (g_modem.cb->read)
Jeej 31:517fc900afba 123 {
Jeej 41:6f83174ffed4 124 g_modem.cb->read(r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length, id);
Jeej 31:517fc900afba 125 }
Jeej 8:97875739f11a 126 break;
Jeej 8:97875739f11a 127 case ALP_OPCODE_F_WR_DATA:
Jeej 41:6f83174ffed4 128 REF_PRINT("ACT %d: F_WR_DATA[%d] @%d %d bytes\n", g_modem.action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length);
Jeej 31:517fc900afba 129 if (g_modem.cb->write)
Jeej 31:517fc900afba 130 {
Jeej 41:6f83174ffed4 131 g_modem.cb->write(r.meta.f_data.fid, r.data, r.meta.f_data.offset, r.meta.f_data.length, id);
Jeej 31:517fc900afba 132 }
Jeej 8:97875739f11a 133 break;
Jeej 8:97875739f11a 134 case ALP_OPCODE_F_RD_PROP:
Jeej 41:6f83174ffed4 135 REF_PRINT("ACT %d: F_RD_PROP[%d]\n", g_modem.action, r.meta.f_data.fid);
Jeej 31:517fc900afba 136 if (g_modem.cb->read_fprop)
Jeej 31:517fc900afba 137 {
Jeej 41:6f83174ffed4 138 g_modem.cb->read_fprop(r.meta.f_data.fid, id);
Jeej 31:517fc900afba 139 }
Jeej 8:97875739f11a 140 break;
Jeej 8:97875739f11a 141 case ALP_OPCODE_F_DELETE:
Jeej 41:6f83174ffed4 142 REF_PRINT("ACT %d: F_DELETE[%d]\n", g_modem.action, r.meta.f_data.fid);
Jeej 31:517fc900afba 143 if (g_modem.cb->remove)
Jeej 31:517fc900afba 144 {
Jeej 41:6f83174ffed4 145 g_modem.cb->remove(r.meta.f_data.fid, id);
Jeej 31:517fc900afba 146 }
Jeej 8:97875739f11a 147 break;
Jeej 8:97875739f11a 148 case ALP_OPCODE_F_FLUSH:
Jeej 41:6f83174ffed4 149 REF_PRINT("ACT %d: F_FLUSH[%d]\n", g_modem.action, r.meta.f_data.fid);
Jeej 31:517fc900afba 150 if (g_modem.cb->flush)
Jeej 31:517fc900afba 151 {
Jeej 41:6f83174ffed4 152 g_modem.cb->flush(r.meta.f_data.fid, id);
Jeej 31:517fc900afba 153 }
Jeej 8:97875739f11a 154 break;
Jeej 8:97875739f11a 155 default:
Jeej 41:6f83174ffed4 156 ASSERT(false,"ASSERT: Unsupported ALP File Operation: %d\n", r.type);
Jeej 8:97875739f11a 157 break;
Jeej 8:97875739f11a 158 }
Jeej 26:2c934a269914 159 //REF_PRINT("ALP Parsing done. rem %d\n", rem);
Jeej 0:027760f45e2c 160 }
Jeej 26:2c934a269914 161 //REF_PRINT("ALP Packet done.\n");
Jeej 0:027760f45e2c 162 }
Jeej 0:027760f45e2c 163 else
Jeej 0:027760f45e2c 164 {
Jeej 0:027760f45e2c 165 // ... or a 'real' URC (or ISTATUS if enabled on modem)
Jeej 8:97875739f11a 166 g_modem.istatus = (modem_istatus_t){0};
Jeej 9:2f921fe9c519 167 do
Jeej 0:027760f45e2c 168 {
Jeej 8:97875739f11a 169 switch (r.type)
Jeej 8:97875739f11a 170 {
Jeej 8:97875739f11a 171 case ALP_OPCODE_RSP_URC:
Jeej 25:14c01b9fc04d 172 if (ALP_URC_TYPE_LQUAL == r.meta.urc.type)
Jeej 41:6f83174ffed4 173 {
Jeej 41:6f83174ffed4 174 REF_PRINT("ACT %d: RSP_URC: LQUAL[%d] %d\n", g_modem.action, r.meta.urc.ifid, r.meta.urc.per);
Jeej 41:6f83174ffed4 175 if (g_modem.cb->lqual)
Jeej 41:6f83174ffed4 176 {
Jeej 41:6f83174ffed4 177 g_modem.cb->lqual(r.meta.urc.ifid, r.meta.urc.per);
Jeej 41:6f83174ffed4 178 }
Jeej 41:6f83174ffed4 179 }
Jeej 25:14c01b9fc04d 180 else if (ALP_URC_TYPE_LDOWN == r.meta.urc.type)
Jeej 41:6f83174ffed4 181 {
Jeej 41:6f83174ffed4 182 REF_PRINT("ACT %d: RSP_URC: LDOWN[%d]\n", g_modem.action, r.meta.urc.ifid);
Jeej 41:6f83174ffed4 183 if (g_modem.cb->ldown)
Jeej 41:6f83174ffed4 184 {
Jeej 41:6f83174ffed4 185 g_modem.cb->ldown(r.meta.urc.ifid);
Jeej 41:6f83174ffed4 186 }
Jeej 41:6f83174ffed4 187 }
Jeej 25:14c01b9fc04d 188 else if (ALP_URC_TYPE_BUSY == r.meta.urc.type)
Jeej 41:6f83174ffed4 189 {
Jeej 41:6f83174ffed4 190 REF_PRINT("ACT %d: RSP_URC: BUSY[%d]\n", g_modem.action, r.meta.urc.ifid);
Jeej 41:6f83174ffed4 191 if (g_modem.cb->busy)
Jeej 41:6f83174ffed4 192 {
Jeej 41:6f83174ffed4 193 g_modem.cb->busy(r.meta.urc.ifid);
Jeej 41:6f83174ffed4 194 }
Jeej 41:6f83174ffed4 195 }
Jeej 41:6f83174ffed4 196 else if (ALP_URC_TYPE_ITF_BUSY == r.meta.urc.type)
Jeej 41:6f83174ffed4 197 {
Jeej 41:6f83174ffed4 198 REF_PRINT("ACT %d: RSP_URC: ITF_BUSY[%d] for %d seconds\n", g_modem.action, r.meta.urc.ifid, r.meta.urc.per);
Jeej 41:6f83174ffed4 199 if (g_modem.cb->itf_busy)
Jeej 41:6f83174ffed4 200 {
Jeej 41:6f83174ffed4 201 g_modem.cb->itf_busy(r.meta.urc.ifid, r.meta.urc.per);
Jeej 41:6f83174ffed4 202 }
Jeej 41:6f83174ffed4 203 }
Jeej 8:97875739f11a 204 else
Jeej 41:6f83174ffed4 205 {
Jeej 41:6f83174ffed4 206 ASSERT(false, "ASSERT: Unsupported ALP URC: %d\n", r.meta.urc.type);
Jeej 41:6f83174ffed4 207 }
Jeej 8:97875739f11a 208 break;
Jeej 8:97875739f11a 209 default:
Jeej 35:ac940cf8ebe6 210 // This could be anything
Jeej 35:ac940cf8ebe6 211 // Let user deal with the payload
Jeej 31:517fc900afba 212 if (g_modem.cb->udata)
Jeej 31:517fc900afba 213 {
Jeej 31:517fc900afba 214 g_modem.cb->udata(payload, size);
Jeej 31:517fc900afba 215 }
Jeej 31:517fc900afba 216 rem = 0;
Jeej 8:97875739f11a 217 break;
Jeej 8:97875739f11a 218 }
Jeej 13:10589aaf8853 219
Jeej 9:2f921fe9c519 220 int tem = alp_parse_chunk(&p, &r);
Jeej 9:2f921fe9c519 221 if (!tem)
Jeej 9:2f921fe9c519 222 {
Jeej 9:2f921fe9c519 223 break;
Jeej 9:2f921fe9c519 224 }
Jeej 9:2f921fe9c519 225 rem -= tem;
Jeej 9:2f921fe9c519 226 } while (rem>=0);
Jeej 0:027760f45e2c 227 }
Jeej 0:027760f45e2c 228 break;
Jeej 0:027760f45e2c 229 case WC_FLOW_ALP_RESP:
Jeej 0:027760f45e2c 230 // This should always be a TAG'ed response as we tag our requests
Jeej 34:137ae523ca43 231 parsed = alp_parse_chunk(&p, &r);
Jeej 34:137ae523ca43 232 if (!parsed)
Jeej 34:137ae523ca43 233 {
Jeej 34:137ae523ca43 234 // Discard the payload in case of parsing error.
Jeej 41:6f83174ffed4 235 REF_PRINT("Parsing error line %d!\r\n", __LINE__);
Jeej 34:137ae523ca43 236 break;
Jeej 34:137ae523ca43 237 }
Jeej 34:137ae523ca43 238 rem -= parsed;
Jeej 41:6f83174ffed4 239 g_modem.action++;
Jeej 41:6f83174ffed4 240 //REF_PRINT("Rem %d Bytes\n", rem);
Jeej 34:137ae523ca43 241
Jeej 0:027760f45e2c 242 ASSERT((r.type == ALP_OPCODE_RSP_TAG),"ASSERT: expecting RESP_TAG got %d\n",r.type);
Jeej 41:6f83174ffed4 243 REF_PRINT("ACT %d: TAG[%d]\n", g_modem.action, r.meta.tag.id);
Jeej 1:40ead20ecb14 244 id = r.meta.tag.id;
Jeej 1:40ead20ecb14 245 eop = r.meta.tag.eop;
Jeej 0:027760f45e2c 246 ASSERT(g_modem.user[id].cb != NULL,"ASSERT: NULL Callback for ID %d\n",id);
Jeej 0:027760f45e2c 247 // Empty response
Jeej 0:027760f45e2c 248 if (rem <= 0)
Jeej 0:027760f45e2c 249 {
Jeej 0:027760f45e2c 250 // TODO: still no info on error...
Jeej 0:027760f45e2c 251 err = r.meta.tag.err ? ALP_ERR_UNKNOWN : ALP_ERR_NONE;
Jeej 41:6f83174ffed4 252
Jeej 41:6f83174ffed4 253 if (ALP_ERR_NONE != err)
Jeej 41:6f83174ffed4 254 {
Jeej 41:6f83174ffed4 255 REF_PRINT("NO INFO ON ERROR.\n");
Jeej 41:6f83174ffed4 256 }
Jeej 41:6f83174ffed4 257 else if (eop)
Jeej 41:6f83174ffed4 258 {
Jeej 41:6f83174ffed4 259 REF_PRINT("EOP.\n");
Jeej 41:6f83174ffed4 260 }
Jeej 41:6f83174ffed4 261
Jeej 1:40ead20ecb14 262 g_modem.user[id].cb(eop,err,id);
Jeej 0:027760f45e2c 263 return;
Jeej 0:027760f45e2c 264 }
Jeej 0:027760f45e2c 265
Jeej 1:40ead20ecb14 266 // Actual response(s)
Jeej 1:40ead20ecb14 267 while(rem>0)
Jeej 0:027760f45e2c 268 {
Jeej 34:137ae523ca43 269 parsed = alp_parse_chunk(&p, &r);
Jeej 34:137ae523ca43 270 if (!parsed)
Jeej 34:137ae523ca43 271 {
Jeej 34:137ae523ca43 272 // Discard the payload in case of parsing error.
Jeej 41:6f83174ffed4 273 REF_PRINT("Parsing error line %d!\r\n", __LINE__);
Jeej 34:137ae523ca43 274 break;
Jeej 34:137ae523ca43 275 }
Jeej 34:137ae523ca43 276 rem -= parsed;
Jeej 41:6f83174ffed4 277 g_modem.action++;
Jeej 41:6f83174ffed4 278 //REF_PRINT("Rem %d Bytes\n", rem);
Jeej 34:137ae523ca43 279
Jeej 1:40ead20ecb14 280 switch (r.type)
Jeej 1:40ead20ecb14 281 {
Jeej 14:a9c324663732 282 case ALP_OPCODE_RSP_TAG:
Jeej 41:6f83174ffed4 283 REF_PRINT("ACT %d: RSP_TAG[%d]\n", g_modem.action, r.meta.tag.id);
Jeej 14:a9c324663732 284 break;
Jeej 1:40ead20ecb14 285 case ALP_OPCODE_RSP_F_DATA:
Jeej 41:6f83174ffed4 286 REF_PRINT("ACT %d: RSP_F_DATA[%d]\n", g_modem.action, r.meta.f_data.length);
Jeej 20:17852941b19e 287 ASSERT(g_modem.user[id].data != NULL,"ASSERT: NULL Data Buffer for RD on ID %d\n",id);
Jeej 41:6f83174ffed4 288 memcpy(g_modem.user[id].data, r.data, r.meta.f_data.length);
Jeej 20:17852941b19e 289 break;
Jeej 6:581caeee80e8 290 case ALP_OPCODE_RSP_F_PROP:
Jeej 41:6f83174ffed4 291 REF_PRINT("ACT %d: RSP_F_PROP[%d]\n", g_modem.action, r.meta.f_data.length);
Jeej 1:40ead20ecb14 292 ASSERT(g_modem.user[id].data != NULL,"ASSERT: NULL Data Buffer for RD on ID %d\n",id);
Jeej 41:6f83174ffed4 293 memcpy(g_modem.user[id].data, r.data, r.meta.f_data.length);
Jeej 1:40ead20ecb14 294 break;
Jeej 1:40ead20ecb14 295 case ALP_OPCODE_RSP_STATUS:
Jeej 41:6f83174ffed4 296 REF_PRINT("ACT %d: RSP_STATUS[%d]\n", g_modem.action, r.meta.status.code);
Jeej 1:40ead20ecb14 297 err = r.meta.status.code;
Jeej 1:40ead20ecb14 298 break;
Jeej 1:40ead20ecb14 299 case ALP_OPCODE_RSP_ISTATUS:
Jeej 41:6f83174ffed4 300 REF_PRINT("ACT %d: RSP_ISTATUS[%d]\n", g_modem.action, r.meta.itf.length);
Jeej 1:40ead20ecb14 301 ASSERT(g_modem.user[id].istatus != NULL,"ASSERT: NULL ISTAT Buffer for RD on ID %d\n",id);
Jeej 41:6f83174ffed4 302 memcpy(g_modem.user[id].istatus, r.data, r.meta.itf.length);
Jeej 1:40ead20ecb14 303 break;
Jeej 37:f5424d109c6d 304 case ALP_OPCODE_RSP_EOPISTATUS:
Jeej 41:6f83174ffed4 305 REF_PRINT("ACT %d: RSP_EOPISTATUS[%02X]\n", g_modem.action, r.meta.istatus.itf);
Jeej 37:f5424d109c6d 306 err = r.meta.istatus.err ? ALP_ERR_ITF_START + r.meta.istatus.err : ALP_ERR_NONE;
Jeej 37:f5424d109c6d 307 break;
Jeej 1:40ead20ecb14 308 default:
Jeej 1:40ead20ecb14 309 ASSERT(false,"ASSERT: Unsupported ALP Response: %d\n",r.type);
Jeej 1:40ead20ecb14 310 break;
Jeej 1:40ead20ecb14 311 }
Jeej 0:027760f45e2c 312 }
Jeej 1:40ead20ecb14 313 if(eop)
Jeej 1:40ead20ecb14 314 { // This is mainly for debug, catch old pointers
Jeej 2:bcf269540633 315 //g_modem.user[id].data = NULL;
Jeej 2:bcf269540633 316 //g_modem.user[id].istatus= NULL;
Jeej 20:17852941b19e 317 REF_PRINT("EOP\n");
Jeej 1:40ead20ecb14 318 }
Jeej 6:581caeee80e8 319 // User Callback
Jeej 31:517fc900afba 320 if (g_modem.user[id].cb)
Jeej 31:517fc900afba 321 {
Jeej 31:517fc900afba 322 g_modem.user[id].cb(eop,err,id);
Jeej 31:517fc900afba 323 }
Jeej 0:027760f45e2c 324 break;
Jeej 0:027760f45e2c 325 case WC_FLOW_SYS_RST:
Jeej 0:027760f45e2c 326 // 'Software' reset request
Jeej 31:517fc900afba 327 if (g_modem.cb->reset)
Jeej 31:517fc900afba 328 {
Jeej 31:517fc900afba 329 g_modem.cb->reset();
Jeej 31:517fc900afba 330 }
Jeej 0:027760f45e2c 331 break;
Jeej 0:027760f45e2c 332 case WC_FLOWID_CMD:
Jeej 0:027760f45e2c 333 if (*p == WM_BOOT)
Jeej 0:027760f45e2c 334 {
Jeej 0:027760f45e2c 335 u16 nb_boot;
Jeej 0:027760f45e2c 336 u8 cause;
Jeej 0:027760f45e2c 337 p++;
Jeej 0:027760f45e2c 338 cause = p[0];
Jeej 0:027760f45e2c 339 nb_boot = HAL_TO_U16(p[3],p[2]);
Jeej 31:517fc900afba 340 if (g_modem.cb->boot)
Jeej 31:517fc900afba 341 {
Jeej 31:517fc900afba 342 g_modem.cb->boot(cause,nb_boot);
Jeej 31:517fc900afba 343 }
Jeej 0:027760f45e2c 344 }
Jeej 0:027760f45e2c 345 else
Jeej 0:027760f45e2c 346 {
Jeej 4:8f031be3ff7d 347 REF_PRINT("Unsupported CMD :0x%x\n",*p);
Jeej 0:027760f45e2c 348 }
Jeej 0:027760f45e2c 349 break;
Jeej 0:027760f45e2c 350 default:
Jeej 4:8f031be3ff7d 351 REF_PRINT("Unsupported WC Flowid:0x%x / %d Bytes\n",flowid,size);
Jeej 0:027760f45e2c 352 break;
Jeej 0:027760f45e2c 353 }
Jeej 0:027760f45e2c 354 }
Jeej 0:027760f45e2c 355
Jeej 13:10589aaf8853 356 private u32 modem_add_root_permission(u8* p, u8* root_key, u8* action, u32 action_size)
Jeej 13:10589aaf8853 357 {
Jeej 13:10589aaf8853 358 u8 hash[32];
Jeej 13:10589aaf8853 359
Jeej 13:10589aaf8853 360 // Calculate hash on action
Jeej 13:10589aaf8853 361 kal_sha256_init();
Jeej 13:10589aaf8853 362 kal_sha256_update(action, action_size);
Jeej 13:10589aaf8853 363 kal_sha256_update(root_key, ROOT_KEY_SIZE);
Jeej 13:10589aaf8853 364 kal_sha256_final(hash);
Jeej 13:10589aaf8853 365 // Prepend Permission-request...
Jeej 13:10589aaf8853 366 ALP_ACTION_PERM_REQ(p, false, ALP_PERM_REQ_ROOT);
Jeej 13:10589aaf8853 367 // ... and hash
Jeej 13:10589aaf8853 368 memcpy(p, hash, ALP_WIZZILAB_AUTH_PROTOCOL_TOKEN_SIZE);
Jeej 13:10589aaf8853 369
Jeej 13:10589aaf8853 370 return ALP_ACTION_PERM_REQ_OFFSET;
Jeej 13:10589aaf8853 371 }
Jeej 13:10589aaf8853 372
Jeej 0:027760f45e2c 373 public int modem_get_id(action_callback_t* cb)
Jeej 0:027760f45e2c 374 {
Jeej 0:027760f45e2c 375 int i;
Jeej 0:027760f45e2c 376 for(i=0;i<MAX_USER_NB;i++)
Jeej 0:027760f45e2c 377 {
Jeej 0:027760f45e2c 378 if (g_modem.user[i].cb == NULL)
Jeej 0:027760f45e2c 379 {
Jeej 0:027760f45e2c 380 g_modem.user[i].cb = cb;
Jeej 13:10589aaf8853 381 //REF_PRINT("Get ID:%d/0x%08x\n",i,cb);
Jeej 0:027760f45e2c 382 return i;
Jeej 0:027760f45e2c 383 }
Jeej 0:027760f45e2c 384 }
Jeej 0:027760f45e2c 385 ASSERT(i < MAX_USER_NB,"ASSERT: out of users\n");
Jeej 0:027760f45e2c 386 return -1;
Jeej 0:027760f45e2c 387 }
Jeej 0:027760f45e2c 388
Jeej 0:027760f45e2c 389 public int modem_free_id(u8 id)
Jeej 0:027760f45e2c 390 {
Jeej 0:027760f45e2c 391 if (id < MAX_USER_NB)
Jeej 0:027760f45e2c 392 {
Jeej 0:027760f45e2c 393 g_modem.user[id].cb = NULL;
Jeej 0:027760f45e2c 394 g_modem.user[id].data = NULL;
Jeej 1:40ead20ecb14 395 g_modem.user[id].istatus= NULL;
Jeej 13:10589aaf8853 396 //REF_PRINT("Free ID:%d\n",id);
Jeej 0:027760f45e2c 397 return id;
Jeej 0:027760f45e2c 398 }
Jeej 0:027760f45e2c 399 return -1;
Jeej 0:027760f45e2c 400 }
Jeej 0:027760f45e2c 401
Jeej 0:027760f45e2c 402 public void modem_open(fx_serial_send_t* send,modem_callbacks_t* callbacks)
Jeej 0:027760f45e2c 403 {
Jeej 0:027760f45e2c 404 if (g_modem.state != STATE_OPEN)
Jeej 0:027760f45e2c 405 {
Jeej 0:027760f45e2c 406 g_modem.send= send;
Jeej 0:027760f45e2c 407 g_modem.cb = callbacks;
Jeej 0:027760f45e2c 408 memset(g_modem.user,0,(MAX_USER_NB * sizeof(modem_user_t)));
Jeej 0:027760f45e2c 409
Jeej 4:8f031be3ff7d 410 REF_PRINT("Open Modem - Max users:%d\n",MAX_USER_NB);
Jeej 0:027760f45e2c 411
Jeej 0:027760f45e2c 412 g_modem.state = STATE_OPEN;
Jeej 0:027760f45e2c 413 }
Jeej 0:027760f45e2c 414 }
Jeej 0:027760f45e2c 415
Jeej 0:027760f45e2c 416 public void modem_close(void)
Jeej 0:027760f45e2c 417 {
Jeej 0:027760f45e2c 418 if (g_modem.state == STATE_OPEN)
Jeej 0:027760f45e2c 419 {
Jeej 0:027760f45e2c 420 g_modem.state = STATE_CLOSED;
Jeej 0:027760f45e2c 421 }
Jeej 0:027760f45e2c 422 }
Jeej 0:027760f45e2c 423
Jeej 0:027760f45e2c 424 public void modem_reset(void)
Jeej 0:027760f45e2c 425 {
Jeej 0:027760f45e2c 426 SERIAL_SEND(WC_FLOW_SYS_RST,NULL,0);
Jeej 0:027760f45e2c 427 }
Jeej 0:027760f45e2c 428
Jeej 13:10589aaf8853 429 public void modem_read_file(u8 fid, void *data, u32 offset, u32 length, u8 id)
Jeej 0:027760f45e2c 430 {
Jeej 0:027760f45e2c 431 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_RD_DATA_SIZE_MAX];
Jeej 0:027760f45e2c 432 u8* p = tmp;
Jeej 4:8f031be3ff7d 433 REF_PRINT("RD[%d]@%d %d Bytes\n",fid,offset,length);
Jeej 0:027760f45e2c 434 g_modem.user[id].data = (u8*)data;
Jeej 0:027760f45e2c 435 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 436 ALP_ACTION_F_RD_DATA(p,true,fid,offset,length);
Jeej 0:027760f45e2c 437 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 438 }
Jeej 0:027760f45e2c 439
Jeej 6:581caeee80e8 440 public void modem_read_fprop(u8 fid, alp_file_header_t* data, u8 id)
Jeej 6:581caeee80e8 441 {
Jeej 6:581caeee80e8 442 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_RD_PROP_SIZE];
Jeej 6:581caeee80e8 443 u8* p = tmp;
Jeej 11:a077da5fe68f 444 REF_PRINT("RD PROPS[%d]\n",fid);
Jeej 6:581caeee80e8 445 g_modem.user[id].data = (u8*)data;
Jeej 6:581caeee80e8 446 ALP_ACTION_TAG(p,id,true);
Jeej 6:581caeee80e8 447 ALP_ACTION_F_RD_PROP(p,true,fid);
Jeej 6:581caeee80e8 448 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 6:581caeee80e8 449 }
Jeej 6:581caeee80e8 450
Jeej 13:10589aaf8853 451 public void modem_read_fprop_root(u8 fid, alp_file_header_t* data, u8* root_key, u8 id)
Jeej 13:10589aaf8853 452 {
Jeej 13:10589aaf8853 453 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_SIZE(ALP_ACTION_F_RD_PROP_SIZE)];
Jeej 13:10589aaf8853 454 u8* p = tmp;
Jeej 13:10589aaf8853 455 u8* lastp;
Jeej 13:10589aaf8853 456 REF_PRINT("RD PROPS (ROOT)[%d]\n",fid);
Jeej 13:10589aaf8853 457 ASSERT(root_key != NULL, "Missing ROOT KEY\n");
Jeej 13:10589aaf8853 458 g_modem.user[id].data = (u8*)data;
Jeej 13:10589aaf8853 459 ALP_ACTION_TAG(p, id, true);
Jeej 13:10589aaf8853 460 // Actual Operation will take place after PERM_REQ
Jeej 13:10589aaf8853 461 p = &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET];
Jeej 13:10589aaf8853 462 ALP_ACTION_F_RD_PROP(p,true,fid);
Jeej 13:10589aaf8853 463 lastp = p;
Jeej 13:10589aaf8853 464 modem_add_root_permission(&tmp[ALP_ACTION_TAG_SIZE], root_key,
Jeej 13:10589aaf8853 465 &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET],
Jeej 13:10589aaf8853 466 ALP_ACTION_F_RD_PROP_SIZE);
Jeej 13:10589aaf8853 467 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(lastp-tmp));
Jeej 13:10589aaf8853 468 }
Jeej 13:10589aaf8853 469
Jeej 13:10589aaf8853 470 public void modem_write_fprop(u8 fid, alp_file_header_t* data, u8 id)
Jeej 13:10589aaf8853 471 {
Jeej 13:10589aaf8853 472 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_WR_PROP_SIZE_MAX];
Jeej 13:10589aaf8853 473 u8* p = tmp;
Jeej 13:10589aaf8853 474 DPRINT(L_API, "WR PROPS[%d]\n",fid);
Jeej 13:10589aaf8853 475 ALP_ACTION_TAG(p,id,true);
Jeej 13:10589aaf8853 476 ALP_ACTION_F_WR_PROP(p,true,fid,0,sizeof(alp_file_header_t),data);
Jeej 13:10589aaf8853 477 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 13:10589aaf8853 478 }
Jeej 13:10589aaf8853 479
Jeej 13:10589aaf8853 480 public void modem_write_fprop_root(u8 fid, alp_file_header_t* data, u8* root_key, u8 id)
Jeej 13:10589aaf8853 481 {
Jeej 13:10589aaf8853 482 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_SIZE(ALP_ACTION_F_WR_PROP_SIZE_MAX)];
Jeej 13:10589aaf8853 483 u8* p = tmp;
Jeej 13:10589aaf8853 484 u8* lastp;
Jeej 13:10589aaf8853 485 DPRINT(L_API, "WR PROPS (ROOT)[%d]\n",fid);
Jeej 13:10589aaf8853 486 ASSERT(root_key != NULL, "Missing ROOT KEY\n");
Jeej 13:10589aaf8853 487 ALP_ACTION_TAG(p, id, true);
Jeej 13:10589aaf8853 488 // Actual Operation will take place after PERM_REQ
Jeej 13:10589aaf8853 489 p = &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET];
Jeej 13:10589aaf8853 490 ALP_ACTION_F_WR_PROP(p,true,fid,0,sizeof(alp_file_header_t),data);
Jeej 13:10589aaf8853 491 lastp = p;
Jeej 13:10589aaf8853 492 modem_add_root_permission(&tmp[ALP_ACTION_TAG_SIZE], root_key,
Jeej 13:10589aaf8853 493 &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET],
Jeej 13:10589aaf8853 494 ALP_ACTION_F_WR_PROP_SIZE_MAX);
Jeej 13:10589aaf8853 495 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(lastp-tmp));
Jeej 13:10589aaf8853 496 }
Jeej 13:10589aaf8853 497
Jeej 14:a9c324663732 498 public void modem_write_file(u8 fid, void *data, u32 offset, u32 length, u8 id)
Jeej 0:027760f45e2c 499 {
Jeej 0:027760f45e2c 500 ALLOC_BUFFER(u8,tmp,(ALP_ACTION_TAG_SIZE + ALP_ACTION_F_WR_DATA_SIZE_MAX(length)));
Jeej 0:027760f45e2c 501
Jeej 0:027760f45e2c 502 u8* p = tmp;
Jeej 4:8f031be3ff7d 503 REF_PRINT("WR[%d]@%d %d Bytes\n",fid,offset,length);
Jeej 0:027760f45e2c 504 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 505 ALP_ACTION_F_WR_DATA(p,true,fid,offset,length,data);
Jeej 0:027760f45e2c 506 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 507 DEALLOC_BUFFER(tmp);
Jeej 0:027760f45e2c 508 }
Jeej 0:027760f45e2c 509
Jeej 14:a9c324663732 510 public void modem_write_file_root(u8 fid, void *data, u32 offset, u32 length, u8* root_key, u8 id)
Jeej 13:10589aaf8853 511 {
Jeej 13:10589aaf8853 512 ALLOC_BUFFER(u8,tmp,(ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_SIZE(ALP_ACTION_F_WR_DATA_SIZE_MAX(length))));
Jeej 13:10589aaf8853 513
Jeej 13:10589aaf8853 514 u8* p = tmp;
Jeej 13:10589aaf8853 515 u8* lastp;
Jeej 13:10589aaf8853 516 REF_PRINT("WR (ROOT)[%d]@%d %d Bytes\n",fid,offset,length);
Jeej 13:10589aaf8853 517 ASSERT(root_key != NULL, "Missing ROOT KEY\n");
Jeej 13:10589aaf8853 518 ALP_ACTION_TAG(p, id, true);
Jeej 13:10589aaf8853 519 // Actual Operation will take place after PERM_REQ
Jeej 13:10589aaf8853 520 p = &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET];
Jeej 13:10589aaf8853 521 ALP_ACTION_F_WR_DATA(p,true,fid,offset,length,data);
Jeej 13:10589aaf8853 522 lastp = p;
Jeej 13:10589aaf8853 523 modem_add_root_permission(&tmp[ALP_ACTION_TAG_SIZE], root_key,
Jeej 13:10589aaf8853 524 &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET],
Jeej 13:10589aaf8853 525 ALP_ACTION_F_WR_DATA_SIZE(offset,length));
Jeej 13:10589aaf8853 526 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(lastp-tmp));
Jeej 13:10589aaf8853 527 DEALLOC_BUFFER(tmp);
Jeej 13:10589aaf8853 528 }
Jeej 13:10589aaf8853 529
Jeej 13:10589aaf8853 530 public void modem_flush_file(u8 fid, u8 id)
Jeej 13:10589aaf8853 531 {
Jeej 13:10589aaf8853 532 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_FLUSH_SIZE];
Jeej 13:10589aaf8853 533 u8* p = tmp;
Jeej 13:10589aaf8853 534 REF_PRINT("FLUSH[%d]\n",fid);
Jeej 13:10589aaf8853 535 ALP_ACTION_TAG(p,id,true);
Jeej 13:10589aaf8853 536 ALP_ACTION_F_FLUSH(p,true,fid);
Jeej 13:10589aaf8853 537 SERIAL_SEND(WC_FLOW_ALP_UNS, tmp, (u8)(p-tmp));
Jeej 13:10589aaf8853 538 }
Jeej 13:10589aaf8853 539
Jeej 13:10589aaf8853 540 public void modem_flush_file_root(u8 fid, u8* root_key, u8 id)
Jeej 13:10589aaf8853 541 {
Jeej 13:10589aaf8853 542 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_SIZE(ALP_ACTION_F_FLUSH_SIZE)];
Jeej 13:10589aaf8853 543 u8* p = tmp;
Jeej 13:10589aaf8853 544 u8* lastp;
Jeej 13:10589aaf8853 545 REF_PRINT("FLUSH (ROOT)[%d]\n",fid);
Jeej 13:10589aaf8853 546 ASSERT(root_key != NULL, "Missing ROOT KEY\n");
Jeej 13:10589aaf8853 547 ALP_ACTION_TAG(p, id, true);
Jeej 13:10589aaf8853 548 // Actual Operation will take place after PERM_REQ
Jeej 13:10589aaf8853 549 p = &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET];
Jeej 13:10589aaf8853 550 ALP_ACTION_F_FLUSH(p,true,fid);
Jeej 13:10589aaf8853 551 lastp = p;
Jeej 13:10589aaf8853 552 modem_add_root_permission(&tmp[ALP_ACTION_TAG_SIZE], root_key,
Jeej 13:10589aaf8853 553 &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET],
Jeej 13:10589aaf8853 554 ALP_ACTION_F_FLUSH_SIZE);
Jeej 13:10589aaf8853 555 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(lastp-tmp));
Jeej 13:10589aaf8853 556 }
Jeej 13:10589aaf8853 557
Jeej 11:a077da5fe68f 558 public void modem_declare_file(u8 fid, alp_file_header_t* hdr, u8 local, u8 id)
Jeej 0:027760f45e2c 559 {
Jeej 0:027760f45e2c 560 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_DECLARE_SIZE];
Jeej 0:027760f45e2c 561 u8* p = tmp;
Jeej 0:027760f45e2c 562
Jeej 4:8f031be3ff7d 563 REF_PRINT("DECLARE[%d]\n",fid);
Jeej 0:027760f45e2c 564 ALP_ACTION_TAG(p,id,true);
Jeej 11:a077da5fe68f 565 ALP_ACTION_F_DECLARE(p,true,fid,hdr,local);
Jeej 0:027760f45e2c 566 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 567 }
Jeej 0:027760f45e2c 568
Jeej 0:027760f45e2c 569 public void modem_create_file(u8 fid, alp_file_header_t* hdr, u8 id)
Jeej 0:027760f45e2c 570 {
Jeej 0:027760f45e2c 571 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_CREATE_SIZE];
Jeej 0:027760f45e2c 572 u8* p = tmp;
Jeej 0:027760f45e2c 573
Jeej 4:8f031be3ff7d 574 REF_PRINT("CREATE[%d]\n",fid);
Jeej 0:027760f45e2c 575 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 576 ALP_ACTION_F_CREATE(p,true,fid,hdr);
Jeej 0:027760f45e2c 577 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 578 }
Jeej 0:027760f45e2c 579
Jeej 14:a9c324663732 580 public void modem_notify_file(u8 fid, u32 offset, u32 length, u8 id)
Jeej 0:027760f45e2c 581 {
Jeej 0:027760f45e2c 582 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_TOUCH_SIZE_MAX];
Jeej 0:027760f45e2c 583 u8* p = tmp;
Jeej 0:027760f45e2c 584
Jeej 4:8f031be3ff7d 585 REF_PRINT("NOTIFY[%d]@%d %d Bytes\n",fid,offset,length);
Jeej 0:027760f45e2c 586 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 587 ALP_ACTION_F_TOUCH(p,true,fid,offset,length);
Jeej 0:027760f45e2c 588 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 589 }
Jeej 0:027760f45e2c 590
Jeej 14:a9c324663732 591 public void modem_delete_file(u8 fid, u8 id)
Jeej 0:027760f45e2c 592 {
Jeej 0:027760f45e2c 593 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_DELETE_SIZE];
Jeej 0:027760f45e2c 594 u8* p = tmp;
Jeej 0:027760f45e2c 595
Jeej 4:8f031be3ff7d 596 REF_PRINT("DELETE[%d]\n",fid);
Jeej 0:027760f45e2c 597 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 598 ALP_ACTION_F_DELETE(p,true,fid);
Jeej 0:027760f45e2c 599 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 600 }
Jeej 0:027760f45e2c 601
Jeej 41:6f83174ffed4 602 public void modem_delete_file_root(u8 fid, u8* root_key, u8 id)
Jeej 41:6f83174ffed4 603 {
Jeej 41:6f83174ffed4 604 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_SIZE(ALP_ACTION_F_DELETE_SIZE)];
Jeej 41:6f83174ffed4 605 u8* p = tmp;
Jeej 41:6f83174ffed4 606 u8* lastp;
Jeej 41:6f83174ffed4 607
Jeej 41:6f83174ffed4 608 REF_PRINT("DELETE ROOT[%d]\n",fid);
Jeej 41:6f83174ffed4 609 ALP_ACTION_TAG(p,id,true);
Jeej 41:6f83174ffed4 610 // Actual Operation will take place after PERM_REQ
Jeej 41:6f83174ffed4 611 p = &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET];
Jeej 41:6f83174ffed4 612 ALP_ACTION_F_DELETE(p,true,fid);
Jeej 41:6f83174ffed4 613 lastp = p;
Jeej 41:6f83174ffed4 614 modem_add_root_permission(&tmp[ALP_ACTION_TAG_SIZE], root_key,
Jeej 41:6f83174ffed4 615 &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET],
Jeej 41:6f83174ffed4 616 ALP_ACTION_F_DELETE_SIZE);
Jeej 41:6f83174ffed4 617 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(lastp-tmp));
Jeej 41:6f83174ffed4 618 }
Jeej 41:6f83174ffed4 619
Jeej 0:027760f45e2c 620 public void modem_send_raw_alp(u8* payload, u32 length, u8 id)
Jeej 0:027760f45e2c 621 {
Jeej 0:027760f45e2c 622 ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + length);
Jeej 0:027760f45e2c 623 u8* p = tmp;
Jeej 0:027760f45e2c 624
Jeej 4:8f031be3ff7d 625 REF_PRINT("ALP RAW %d Bytes\n",length);
Jeej 0:027760f45e2c 626 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 627 // User Payload
Jeej 0:027760f45e2c 628 memcpy(p,payload,length);p+=length;
Jeej 0:027760f45e2c 629 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 630 DEALLOC_BUFFER(tmp);
Jeej 0:027760f45e2c 631 }
Jeej 0:027760f45e2c 632
Jeej 14:a9c324663732 633 public void modem_send_file_content(u8* itf, u8 itf_length, void *istatus, u8 fid, void *data, u32 offset, u32 length, u8 id)
Jeej 0:027760f45e2c 634 {
Jeej 0:027760f45e2c 635 ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_RSP_F_DATA_SIZE_MAX(length));
Jeej 0:027760f45e2c 636 u8* p = tmp;
Jeej 6:581caeee80e8 637 g_modem.user[id].istatus= (u8*)istatus;
Jeej 0:027760f45e2c 638
Jeej 4:8f031be3ff7d 639 REF_PRINT("SEND FILE[%d] CONTENTS @%d %d Bytes (itf %d Bytes)\n",fid,offset,length,itf_length);
Jeej 0:027760f45e2c 640 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 641 ALP_ACTION_FORWARD(p,itf,itf_length);
Jeej 17:b4ea2a912fd3 642 if (istatus)
Jeej 17:b4ea2a912fd3 643 {
Jeej 17:b4ea2a912fd3 644 // NOP action to get istats on ACKs
Jeej 17:b4ea2a912fd3 645 ALP_ACTION_NOP(p,true);
Jeej 17:b4ea2a912fd3 646 }
Jeej 0:027760f45e2c 647 ALP_ACTION_RSP_F_DATA(p,fid,offset,length,data);
Jeej 0:027760f45e2c 648 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 649 DEALLOC_BUFFER(tmp);
Jeej 0:027760f45e2c 650 }
Jeej 0:027760f45e2c 651
Jeej 18:a11302a76e96 652 public void modem_remote_read_file(u8* itf, u8 itf_length, void *istatus , u8 fid, void *data, u32 offset, u32 length, u8 id)
Jeej 1:40ead20ecb14 653 {
Jeej 1:40ead20ecb14 654 ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_F_RD_DATA_SIZE_MAX);
Jeej 1:40ead20ecb14 655 u8* p = tmp;
Jeej 18:a11302a76e96 656 g_modem.user[id].data = (u8*)data;
Jeej 18:a11302a76e96 657 g_modem.user[id].istatus = (u8*)istatus;
Jeej 1:40ead20ecb14 658
Jeej 4:8f031be3ff7d 659 REF_PRINT("RMT RD FILE[%d]@%d %d Bytes (itf %d Bytes)\n",fid,offset,length,itf_length);
Jeej 1:40ead20ecb14 660 ALP_ACTION_TAG(p,id,true);
Jeej 1:40ead20ecb14 661 ALP_ACTION_FORWARD(p,itf,itf_length);
Jeej 1:40ead20ecb14 662 ALP_ACTION_F_RD_DATA(p,true,fid,offset,length);
Jeej 1:40ead20ecb14 663 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 1:40ead20ecb14 664 DEALLOC_BUFFER(tmp);
Jeej 1:40ead20ecb14 665 }
Jeej 1:40ead20ecb14 666
Jeej 48:37bf104b3a39 667 public void modem_remote_read_file_root(u8* itf, u8 itf_length, void *istatus , u8 fid, void *data, u32 offset, u32 length, u8* root_key, u8 id)
Jeej 48:37bf104b3a39 668 {
Jeej 48:37bf104b3a39 669 ALLOC_BUFFER(u8, tmp, ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_F_RD_DATA_SIZE_MAX);
Jeej 48:37bf104b3a39 670 u8* p = tmp;
Jeej 48:37bf104b3a39 671 u32 perm_offset;
Jeej 48:37bf104b3a39 672
Jeej 48:37bf104b3a39 673 ASSERT(root_key != NULL, "Missing ROOT KEY\n");
Jeej 48:37bf104b3a39 674
Jeej 48:37bf104b3a39 675 g_modem.user[id].data = (u8*)data;
Jeej 48:37bf104b3a39 676 g_modem.user[id].istatus = (u8*)istatus;
Jeej 48:37bf104b3a39 677
Jeej 48:37bf104b3a39 678 REF_PRINT("RMT RD FILE (ROOT)[%d]@%d %d Bytes (itf %d Bytes)\n", fid, offset, length, itf_length);
Jeej 48:37bf104b3a39 679 ALP_ACTION_TAG(p, id, true);
Jeej 48:37bf104b3a39 680 ALP_ACTION_FORWARD(p, itf, itf_length);
Jeej 48:37bf104b3a39 681
Jeej 48:37bf104b3a39 682 // Mark start of permission request
Jeej 48:37bf104b3a39 683 perm_offset = (u32)(p-tmp);
Jeej 48:37bf104b3a39 684
Jeej 48:37bf104b3a39 685 // Actual Operation will take place after PERM_REQ
Jeej 48:37bf104b3a39 686 p = &tmp[perm_offset + ALP_ACTION_PERM_REQ_OFFSET];
Jeej 48:37bf104b3a39 687 ALP_ACTION_F_RD_DATA(p, true, fid, offset, length);
Jeej 48:37bf104b3a39 688
Jeej 48:37bf104b3a39 689 modem_add_root_permission(&tmp[perm_offset], root_key,
Jeej 48:37bf104b3a39 690 &tmp[perm_offset + ALP_ACTION_PERM_REQ_OFFSET],
Jeej 48:37bf104b3a39 691 ALP_ACTION_F_RD_DATA_SIZE(offset, length));
Jeej 48:37bf104b3a39 692
Jeej 48:37bf104b3a39 693 SERIAL_SEND(WC_FLOW_ALP_UNS, tmp, (u8)(p-tmp));
Jeej 48:37bf104b3a39 694 DEALLOC_BUFFER(tmp);
Jeej 48:37bf104b3a39 695 }
Jeej 48:37bf104b3a39 696
Jeej 48:37bf104b3a39 697
Jeej 18:a11302a76e96 698 public void modem_remote_write_file(u8* itf, u8 itf_length, void *istatus , u8 fid, void *data, u32 offset, u32 length, u8 id)
Jeej 18:a11302a76e96 699 {
Jeej 18:a11302a76e96 700 ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_F_WR_DATA_SIZE_MAX(length));
Jeej 18:a11302a76e96 701 u8* p = tmp;
Jeej 18:a11302a76e96 702 g_modem.user[id].istatus = (u8*)istatus;
Jeej 18:a11302a76e96 703
Jeej 18:a11302a76e96 704 REF_PRINT("RMT WR FILE[%d]@%d %d Bytes (itf %d Bytes)\n",fid,offset,length,itf_length);
Jeej 18:a11302a76e96 705 ALP_ACTION_TAG(p,id,true);
Jeej 18:a11302a76e96 706 ALP_ACTION_FORWARD(p,itf,itf_length);
Jeej 18:a11302a76e96 707 ALP_ACTION_F_WR_DATA(p,true,fid,offset,length,data);
Jeej 18:a11302a76e96 708 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 18:a11302a76e96 709 DEALLOC_BUFFER(tmp);
Jeej 18:a11302a76e96 710 }
Jeej 18:a11302a76e96 711
Jeej 48:37bf104b3a39 712 public void modem_remote_write_file_root(u8* itf, u8 itf_length, void *istatus , u8 fid, void *data, u32 offset, u32 length, u8* root_key, u8 id)
Jeej 48:37bf104b3a39 713 {
Jeej 48:37bf104b3a39 714 ALLOC_BUFFER(u8, tmp, ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_F_WR_DATA_SIZE_MAX(length));
Jeej 48:37bf104b3a39 715 u8* p = tmp;
Jeej 48:37bf104b3a39 716 u32 perm_offset;
Jeej 48:37bf104b3a39 717
Jeej 48:37bf104b3a39 718 ASSERT(root_key != NULL, "Missing ROOT KEY\n");
Jeej 48:37bf104b3a39 719
Jeej 48:37bf104b3a39 720 g_modem.user[id].istatus = (u8*)istatus;
Jeej 48:37bf104b3a39 721
Jeej 48:37bf104b3a39 722 REF_PRINT("RMT WR FILE (ROOT)[%d]@%d %d Bytes (itf %d Bytes)\n",fid,offset,length,itf_length);
Jeej 48:37bf104b3a39 723 ALP_ACTION_TAG(p, id, true);
Jeej 48:37bf104b3a39 724 ALP_ACTION_FORWARD(p, itf, itf_length);
Jeej 48:37bf104b3a39 725
Jeej 48:37bf104b3a39 726 // Mark start of permission request
Jeej 48:37bf104b3a39 727 perm_offset = (u32)(p-tmp);
Jeej 48:37bf104b3a39 728
Jeej 48:37bf104b3a39 729 // Actual Operation will take place after PERM_REQ
Jeej 48:37bf104b3a39 730 p = &tmp[perm_offset + ALP_ACTION_PERM_REQ_OFFSET];
Jeej 48:37bf104b3a39 731 ALP_ACTION_F_WR_DATA(p, true, fid, offset, length, data);
Jeej 48:37bf104b3a39 732
Jeej 48:37bf104b3a39 733 modem_add_root_permission(&tmp[perm_offset], root_key,
Jeej 48:37bf104b3a39 734 &tmp[perm_offset + ALP_ACTION_PERM_REQ_OFFSET],
Jeej 48:37bf104b3a39 735 ALP_ACTION_F_WR_DATA_SIZE(offset, length));
Jeej 48:37bf104b3a39 736
Jeej 48:37bf104b3a39 737 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 48:37bf104b3a39 738 DEALLOC_BUFFER(tmp);
Jeej 48:37bf104b3a39 739 }
Jeej 48:37bf104b3a39 740
Jeej 0:027760f45e2c 741 public void modem_enable_urc(u8 type, u8 ifid, u8 val, u8 enable, u8 id)
Jeej 0:027760f45e2c 742 {
Jeej 0:027760f45e2c 743 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_URCC_SIZE(ALP_URC_TYPE_LQUAL)];
Jeej 0:027760f45e2c 744 u8* p = tmp;
Jeej 4:8f031be3ff7d 745 REF_PRINT("URC[%d] Type %d ifid %d\n",enable,type,ifid);
Jeej 0:027760f45e2c 746
Jeej 0:027760f45e2c 747 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 748 // Actual Operation
Jeej 0:027760f45e2c 749 if (enable)
Jeej 0:027760f45e2c 750 {
Jeej 0:027760f45e2c 751 ALP_ACTION_URCC_EN(p,true,type,ifid,val);
Jeej 0:027760f45e2c 752 }
Jeej 0:027760f45e2c 753 else
Jeej 0:027760f45e2c 754 {
Jeej 0:027760f45e2c 755 ALP_ACTION_URCC_DIS(p,true,type,ifid,val);
Jeej 0:027760f45e2c 756 }
Jeej 0:027760f45e2c 757 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 758 }
Jeej 0:027760f45e2c 759
Jeej 1:40ead20ecb14 760 public void modem_activate_itf(u8 type, u8 nb_dev, u8 ifid, u8 flags, u8 enable, u8 id)
Jeej 1:40ead20ecb14 761 {
Jeej 1:40ead20ecb14 762 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_ACTIVATE_ITF_SIZE];
Jeej 1:40ead20ecb14 763 u8* p = tmp;
Jeej 1:40ead20ecb14 764
Jeej 4:8f031be3ff7d 765 REF_PRINT("ACTIVATE ITFTYPE[%x]:%d\n",type,enable);
Jeej 1:40ead20ecb14 766 ALP_ACTION_TAG(p,id,true);
Jeej 11:a077da5fe68f 767 ALP_ACTION_ACTIVATE_ITF(p,true,enable,type,nb_dev,ifid,flags);
Jeej 1:40ead20ecb14 768 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 1:40ead20ecb14 769 }
Jeej 1:40ead20ecb14 770
Jeej 41:6f83174ffed4 771 public void modem_respond(s8 status, int id)
Jeej 0:027760f45e2c 772 {
Jeej 0:027760f45e2c 773 u8 tmp[ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_STATUS_SIZE];
Jeej 0:027760f45e2c 774 u8* p = tmp;
Jeej 41:6f83174ffed4 775 REF_PRINT("RESP[%d]:%d\n",g_modem.action,status);
Jeej 0:027760f45e2c 776
Jeej 0:027760f45e2c 777 if (id>=0) { ALP_ACTION_RSP_TAG(p,id,true,(status<0)?true:false); }
Jeej 41:6f83174ffed4 778 ALP_ACTION_RSP_STATUS(p, g_modem.action, status);
Jeej 0:027760f45e2c 779 SERIAL_SEND(WC_FLOW_ALP_RESP,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 780 }
Jeej 0:027760f45e2c 781
Jeej 0:027760f45e2c 782 public void modem_respond_fprop(u8 fid, u8* hdr, int id)
Jeej 0:027760f45e2c 783 {
Jeej 0:027760f45e2c 784 u8 tmp[ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_F_PROP_SIZE];
Jeej 0:027760f45e2c 785 u8* p = tmp;
Jeej 4:8f031be3ff7d 786 REF_PRINT("RESP FPROP[%d]\n",fid);
Jeej 0:027760f45e2c 787
Jeej 0:027760f45e2c 788 if (id>=0) { ALP_ACTION_RSP_TAG(p,id,true,false); }
Jeej 0:027760f45e2c 789 ALP_ACTION_RSP_F_PROP(p,fid,hdr);
Jeej 0:027760f45e2c 790 SERIAL_SEND(WC_FLOW_ALP_RESP,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 791 }
Jeej 0:027760f45e2c 792
Jeej 14:a9c324663732 793 public void modem_respond_read(u8 fid,void *data, u32 offset, u32 length, int id)
Jeej 0:027760f45e2c 794 {
Jeej 0:027760f45e2c 795 ALLOC_BUFFER(u8,tmp,ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_F_DATA_SIZE_MAX(length));
Jeej 0:027760f45e2c 796 u8* p = tmp;
Jeej 4:8f031be3ff7d 797 REF_PRINT("F_DATA[%d]@%d %d Bytes\n",fid,offset,length);
Jeej 0:027760f45e2c 798 if (id>=0) { ALP_ACTION_RSP_TAG(p,id,true,false); }
Jeej 0:027760f45e2c 799 ALP_ACTION_RSP_F_DATA(p,fid,offset,length,data);
Jeej 0:027760f45e2c 800 SERIAL_SEND(WC_FLOW_ALP_RESP,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 801 DEALLOC_BUFFER(tmp);
Jeej 13:10589aaf8853 802 }