Exportable version of WizziLab's modem driver.

Dependents:   modem_ref_helper

Committer:
Jeej
Date:
Tue May 26 08:39:25 2020 +0000
Revision:
50:9eb5eed8b014
Parent:
46:9b83866cef2c
Parent:
49:7a2f4992ff90
Child:
51:92667569acc7
Publish

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