Exportable version of WizziLab's modem driver.

Dependents:   modem_ref_helper

Committer:
Jeej
Date:
Tue Sep 21 08:47:52 2021 +0000
Revision:
62:75d819d68e5f
Parent:
61:820395fc5572
Child:
63:544a488a06d3
Use loops instead of recurence

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 56:67e3d9608403 7 #include "d7a_1x_fs.h"
Jeej 0:027760f45e2c 8
Jeej 39:bc4fccf2d84b 9 #if 0
Jeej 57:5444cfda9889 10 #define REF_PRINT(...) PRINT(__VA_ARGS__)
Jeej 57:5444cfda9889 11 #define URC_PRINT(...) PRINT(__VA_ARGS__)
Jeej 4:8f031be3ff7d 12 #else
Jeej 57:5444cfda9889 13 #define REF_PRINT(...);
Jeej 57:5444cfda9889 14 #define URC_PRINT(...);
Jeej 4:8f031be3ff7d 15 #endif
Jeej 4:8f031be3ff7d 16
Jeej 0:027760f45e2c 17 typedef struct {
Jeej 0:027760f45e2c 18 action_callback_t* cb;
Jeej 57:5444cfda9889 19 alp_payload_t** alp_rsp;
Jeej 56:67e3d9608403 20 } modem_ref_user_t;
Jeej 0:027760f45e2c 21
Jeej 0:027760f45e2c 22 typedef struct {
Jeej 57:5444cfda9889 23 fx_serial_send_t* send;
Jeej 56:67e3d9608403 24 modem_ref_callbacks_t* cb;
Jeej 56:67e3d9608403 25 modem_lwan_callbacks_t* lwan_cb;
Jeej 56:67e3d9608403 26 modem_ref_user_t user[MAX_USER_NB];
Jeej 57:5444cfda9889 27 u8 state;
Jeej 56:67e3d9608403 28 } modem_ref_ctx_t;
Jeej 57:5444cfda9889 29
Jeej 56:67e3d9608403 30 static modem_ref_ctx_t g_modem;
Jeej 0:027760f45e2c 31
Jeej 0:027760f45e2c 32 #define STATE_OPEN 0xab
Jeej 0:027760f45e2c 33 #define STATE_CLOSED 0
Jeej 0:027760f45e2c 34
Jeej 0:027760f45e2c 35 // Flows
Jeej 0:027760f45e2c 36 #define WC_FLOWID_CMD 0x10
Jeej 0:027760f45e2c 37 #define WC_FLOWID_ALP 0x20
Jeej 0:027760f45e2c 38 #define WC_FLOWID_SYS 0x30
Jeej 0:027760f45e2c 39
Jeej 0:027760f45e2c 40 // Sub-Flows
Jeej 0:027760f45e2c 41 #define WC_FLOW_ALP_CMD 0x20
Jeej 0:027760f45e2c 42 #define WC_FLOW_ALP_RESP 0x21
Jeej 0:027760f45e2c 43 #define WC_FLOW_ALP_UNS 0x22
Jeej 0:027760f45e2c 44 #define WC_FLOW_SYS_RST 0x30
Jeej 0:027760f45e2c 45 #define WC_FLOW_SYS_PING 0x34
Jeej 0:027760f45e2c 46 #define WC_FLOW_SYS_PONG 0x35
Jeej 0:027760f45e2c 47 #define WC_FLOW_SYS_CFG 0x36
Jeej 0:027760f45e2c 48 #define WC_FLOW_SYS_XON 0x39
Jeej 0:027760f45e2c 49 #define WC_FLOW_SYS_XOFF 0x3a
Jeej 0:027760f45e2c 50 #define WC_FLOW_SYS_XACK 0x3b
Jeej 0:027760f45e2c 51
Jeej 0:027760f45e2c 52 // Misc CMD...
Jeej 0:027760f45e2c 53 #define WM_BOOT 0x81
Jeej 0:027760f45e2c 54
Jeej 57:5444cfda9889 55 #define PKT_MAX_SIZE 255
Jeej 57:5444cfda9889 56 static void serial_send(WizziComPacketType type, alp_payload_t* alp)
Jeej 57:5444cfda9889 57 {
Jeej 57:5444cfda9889 58 u8 buf[PKT_MAX_SIZE];
Jeej 59:3b38b5f499db 59
Jeej 62:75d819d68e5f 60 PRINT("<--\n");
Jeej 62:75d819d68e5f 61 alp_payload_print(alp);
Jeej 59:3b38b5f499db 62
Jeej 57:5444cfda9889 63 u32 len = alp_payload_to_buf(alp, buf, 0, PKT_MAX_SIZE);
Jeej 61:820395fc5572 64
Jeej 61:820395fc5572 65 ASSERT(g_modem.send != NULL, "NULL send function!\r\n");
Jeej 57:5444cfda9889 66 g_modem.send(type, buf, len);
Jeej 59:3b38b5f499db 67
Jeej 59:3b38b5f499db 68 alp_payload_free(alp);
Jeej 57:5444cfda9889 69 }
Jeej 57:5444cfda9889 70
Jeej 62:75d819d68e5f 71 static void call_fs_user_cb(alp_payload_t* alp)
Jeej 46:9b83866cef2c 72 {
Jeej 57:5444cfda9889 73 alp_parsed_chunk_t r;
Jeej 62:75d819d68e5f 74 u8* p;
Jeej 62:75d819d68e5f 75 int id;
Jeej 62:75d819d68e5f 76 u32 action = 0;
Jeej 57:5444cfda9889 77
Jeej 62:75d819d68e5f 78 while (alp != NULL)
Jeej 57:5444cfda9889 79 {
Jeej 62:75d819d68e5f 80 p = alp->d;
Jeej 62:75d819d68e5f 81 alp_parse_chunk(&p, &r);
Jeej 62:75d819d68e5f 82
Jeej 62:75d819d68e5f 83 switch (r.type)
Jeej 62:75d819d68e5f 84 {
Jeej 62:75d819d68e5f 85 case ALP_OPCODE_TAG:
Jeej 62:75d819d68e5f 86 id = r.meta.tag.id;
Jeej 62:75d819d68e5f 87 REF_PRINT("ACT %d: TAG[%d] ID:%d ERR:%d EOP:%d\n", action, id, r.meta.tag.err, r.meta.tag.eop);
Jeej 62:75d819d68e5f 88 break;
Jeej 62:75d819d68e5f 89 case ALP_OPCODE_F_RD_DATA:
Jeej 62:75d819d68e5f 90 REF_PRINT("ACT %d: F_RD_DATA[%d] @%d %d bytes\n", action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length);
Jeej 62:75d819d68e5f 91 if (g_modem.cb->read)
Jeej 62:75d819d68e5f 92 {
Jeej 62:75d819d68e5f 93 g_modem.cb->read(action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length, id);
Jeej 62:75d819d68e5f 94 }
Jeej 62:75d819d68e5f 95 break;
Jeej 62:75d819d68e5f 96 case ALP_OPCODE_F_WR_DATA:
Jeej 62:75d819d68e5f 97 REF_PRINT("ACT %d: F_WR_DATA[%d] @%d %d bytes\n", action, r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length);
Jeej 62:75d819d68e5f 98 if (g_modem.cb->write)
Jeej 62:75d819d68e5f 99 {
Jeej 62:75d819d68e5f 100 g_modem.cb->write(action, r.meta.f_data.fid, r.data, r.meta.f_data.offset, r.meta.f_data.length, id);
Jeej 62:75d819d68e5f 101 }
Jeej 62:75d819d68e5f 102 break;
Jeej 62:75d819d68e5f 103 case ALP_OPCODE_F_RD_PROP:
Jeej 62:75d819d68e5f 104 REF_PRINT("ACT %d: F_RD_PROP[%d]\n", action, r.meta.f_data.fid);
Jeej 62:75d819d68e5f 105 if (g_modem.cb->read_fprop)
Jeej 62:75d819d68e5f 106 {
Jeej 62:75d819d68e5f 107 g_modem.cb->read_fprop(action, r.meta.f_data.fid, id);
Jeej 62:75d819d68e5f 108 }
Jeej 62:75d819d68e5f 109 break;
Jeej 62:75d819d68e5f 110 case ALP_OPCODE_F_DELETE:
Jeej 62:75d819d68e5f 111 REF_PRINT("ACT %d: F_DELETE[%d]\n", action, r.meta.f_data.fid);
Jeej 62:75d819d68e5f 112 if (g_modem.cb->remove)
Jeej 62:75d819d68e5f 113 {
Jeej 62:75d819d68e5f 114 g_modem.cb->remove(action, r.meta.f_data.fid, id);
Jeej 62:75d819d68e5f 115 }
Jeej 62:75d819d68e5f 116 break;
Jeej 62:75d819d68e5f 117 case ALP_OPCODE_F_FLUSH:
Jeej 62:75d819d68e5f 118 REF_PRINT("ACT %d: F_FLUSH[%d]\n", action, r.meta.f_data.fid);
Jeej 62:75d819d68e5f 119 if (g_modem.cb->flush)
Jeej 62:75d819d68e5f 120 {
Jeej 62:75d819d68e5f 121 g_modem.cb->flush(action, r.meta.f_data.fid, id);
Jeej 62:75d819d68e5f 122 }
Jeej 62:75d819d68e5f 123 break;
Jeej 62:75d819d68e5f 124 default:
Jeej 62:75d819d68e5f 125 ASSERT(false, "ASSERT: Unsupported ALP File Operation: %d\n", r.type);
Jeej 62:75d819d68e5f 126 break;
Jeej 62:75d819d68e5f 127 }
Jeej 62:75d819d68e5f 128
Jeej 62:75d819d68e5f 129 ASSERT(id >= 0, "ASSERT: Wrong id %d\n", id);
Jeej 62:75d819d68e5f 130
Jeej 62:75d819d68e5f 131 action++;
Jeej 62:75d819d68e5f 132
Jeej 62:75d819d68e5f 133 alp = alp->next;
Jeej 57:5444cfda9889 134 }
Jeej 46:9b83866cef2c 135 }
Jeej 0:027760f45e2c 136
Jeej 62:75d819d68e5f 137 static void call_urc_user_cb(alp_payload_t* alp)
Jeej 57:5444cfda9889 138 {
Jeej 57:5444cfda9889 139 alp_parsed_chunk_t r;
Jeej 62:75d819d68e5f 140 u8* p;
Jeej 62:75d819d68e5f 141 u32 action = 0;
Jeej 57:5444cfda9889 142
Jeej 62:75d819d68e5f 143 while (alp != NULL)
Jeej 57:5444cfda9889 144 {
Jeej 62:75d819d68e5f 145 p = alp->d;
Jeej 62:75d819d68e5f 146 alp_parse_chunk(&p, &r);
Jeej 62:75d819d68e5f 147
Jeej 62:75d819d68e5f 148 switch (r.type)
Jeej 62:75d819d68e5f 149 {
Jeej 62:75d819d68e5f 150 case ALP_OPCODE_RSP_URC:
Jeej 62:75d819d68e5f 151 if (ALP_URC_TYPE_LQUAL == r.meta.urc.type)
Jeej 57:5444cfda9889 152 {
Jeej 62:75d819d68e5f 153 REF_PRINT("ACT %d: RSP_URC: LQUAL[%d] %d\n", action, r.meta.urc.ifid, r.meta.urc.per);
Jeej 62:75d819d68e5f 154 if (g_modem.cb->lqual)
Jeej 62:75d819d68e5f 155 {
Jeej 62:75d819d68e5f 156 g_modem.cb->lqual(r.meta.urc.ifid, r.meta.urc.per);
Jeej 62:75d819d68e5f 157 }
Jeej 57:5444cfda9889 158 }
Jeej 62:75d819d68e5f 159 else if (ALP_URC_TYPE_LDOWN == r.meta.urc.type)
Jeej 62:75d819d68e5f 160 {
Jeej 62:75d819d68e5f 161 REF_PRINT("ACT %d: RSP_URC: LDOWN[%d]\n", action, r.meta.urc.ifid);
Jeej 62:75d819d68e5f 162 if (g_modem.cb->ldown)
Jeej 62:75d819d68e5f 163 {
Jeej 62:75d819d68e5f 164 g_modem.cb->ldown(r.meta.urc.ifid);
Jeej 62:75d819d68e5f 165 }
Jeej 62:75d819d68e5f 166 }
Jeej 62:75d819d68e5f 167 else if (ALP_URC_TYPE_BUSY == r.meta.urc.type)
Jeej 57:5444cfda9889 168 {
Jeej 62:75d819d68e5f 169 REF_PRINT("ACT %d: RSP_URC: BUSY[%d]\n", action, r.meta.urc.ifid);
Jeej 62:75d819d68e5f 170 if (g_modem.cb->busy)
Jeej 62:75d819d68e5f 171 {
Jeej 62:75d819d68e5f 172 g_modem.cb->busy(r.meta.urc.ifid);
Jeej 62:75d819d68e5f 173 }
Jeej 57:5444cfda9889 174 }
Jeej 62:75d819d68e5f 175 else if (ALP_URC_TYPE_ITF_BUSY == r.meta.urc.type)
Jeej 57:5444cfda9889 176 {
Jeej 62:75d819d68e5f 177 REF_PRINT("ACT %d: RSP_URC: ITF_BUSY[%d] for %d seconds\n", action, r.meta.urc.ifid, r.meta.urc.per);
Jeej 62:75d819d68e5f 178
Jeej 62:75d819d68e5f 179 if (FID_LWAN_ITF == r.meta.urc.ifid)
Jeej 57:5444cfda9889 180 {
Jeej 62:75d819d68e5f 181 if (g_modem.lwan_cb)
Jeej 57:5444cfda9889 182 {
Jeej 62:75d819d68e5f 183 if (MAX_U32 == r.meta.urc.per)
Jeej 62:75d819d68e5f 184 {
Jeej 62:75d819d68e5f 185 if (g_modem.lwan_cb->join_failed)
Jeej 62:75d819d68e5f 186 {
Jeej 62:75d819d68e5f 187 g_modem.lwan_cb->join_failed();
Jeej 62:75d819d68e5f 188 }
Jeej 62:75d819d68e5f 189 }
Jeej 62:75d819d68e5f 190 else if (0 == r.meta.urc.per)
Jeej 57:5444cfda9889 191 {
Jeej 62:75d819d68e5f 192 if (g_modem.lwan_cb->packet_sent)
Jeej 62:75d819d68e5f 193 {
Jeej 62:75d819d68e5f 194 g_modem.lwan_cb->packet_sent();
Jeej 62:75d819d68e5f 195 }
Jeej 62:75d819d68e5f 196 }
Jeej 62:75d819d68e5f 197 else
Jeej 62:75d819d68e5f 198 {
Jeej 62:75d819d68e5f 199 if (g_modem.lwan_cb->itf_busy)
Jeej 62:75d819d68e5f 200 {
Jeej 62:75d819d68e5f 201 g_modem.lwan_cb->itf_busy(r.meta.urc.per);
Jeej 62:75d819d68e5f 202 }
Jeej 57:5444cfda9889 203 }
Jeej 57:5444cfda9889 204 }
Jeej 62:75d819d68e5f 205 }
Jeej 62:75d819d68e5f 206 else
Jeej 62:75d819d68e5f 207 {
Jeej 62:75d819d68e5f 208 if (g_modem.cb->itf_busy)
Jeej 57:5444cfda9889 209 {
Jeej 62:75d819d68e5f 210 g_modem.cb->itf_busy(r.meta.urc.ifid, r.meta.urc.per);
Jeej 57:5444cfda9889 211 }
Jeej 57:5444cfda9889 212 }
Jeej 57:5444cfda9889 213 }
Jeej 57:5444cfda9889 214 else
Jeej 57:5444cfda9889 215 {
Jeej 62:75d819d68e5f 216 ASSERT(false, "ASSERT: Unsupported ALP URC: %d\n", r.meta.urc.type);
Jeej 57:5444cfda9889 217 }
Jeej 62:75d819d68e5f 218 break;
Jeej 62:75d819d68e5f 219 default:
Jeej 62:75d819d68e5f 220 // This could be anything
Jeej 62:75d819d68e5f 221 // Let user deal with the payload
Jeej 62:75d819d68e5f 222 if (g_modem.cb->udata)
Jeej 62:75d819d68e5f 223 {
Jeej 62:75d819d68e5f 224 g_modem.cb->udata(alp);
Jeej 62:75d819d68e5f 225 }
Jeej 62:75d819d68e5f 226 break;
Jeej 62:75d819d68e5f 227 }
Jeej 62:75d819d68e5f 228
Jeej 62:75d819d68e5f 229 action++;
Jeej 62:75d819d68e5f 230
Jeej 62:75d819d68e5f 231 alp = alp->next;
Jeej 57:5444cfda9889 232 }
Jeej 57:5444cfda9889 233 }
Jeej 57:5444cfda9889 234
Jeej 57:5444cfda9889 235 void modem_ref_input(u8 flowid, u8* payload, u8 size)
Jeej 0:027760f45e2c 236 {
Jeej 0:027760f45e2c 237 int rem =size;
Jeej 57:5444cfda9889 238 u8* p = payload;
Jeej 0:027760f45e2c 239 alp_parsed_chunk_t r;
Jeej 0:027760f45e2c 240 int id = -1;
Jeej 57:5444cfda9889 241 s8 err = ALP_ERR_NONE;
Jeej 57:5444cfda9889 242 u8 eop;
Jeej 57:5444cfda9889 243 u32 parsed;
Jeej 57:5444cfda9889 244 alp_payload_t* alp;
Jeej 41:6f83174ffed4 245
Jeej 57:5444cfda9889 246 REF_PRINT("input 0x%x/%d Bytes\n", flowid, size);
Jeej 0:027760f45e2c 247 switch (flowid)
Jeej 0:027760f45e2c 248 {
Jeej 0:027760f45e2c 249 case WC_FLOW_ALP_UNS:
Jeej 0:027760f45e2c 250 case WC_FLOW_ALP_CMD:
Jeej 58:8d58e5cb4037 251
Jeej 57:5444cfda9889 252 // pre-parse payload
Jeej 57:5444cfda9889 253 alp = alp_payload_parse(p, size);
Jeej 58:8d58e5cb4037 254
Jeej 62:75d819d68e5f 255 PRINT("-->\n");
Jeej 62:75d819d68e5f 256 alp_payload_print(alp);
Jeej 57:5444cfda9889 257
Jeej 57:5444cfda9889 258 if (ALP_OPCODE_TAG == (alp->d[0] & 0x3F))
Jeej 0:027760f45e2c 259 {
Jeej 57:5444cfda9889 260 // Payload starts with a tag, this must be a FS command
Jeej 57:5444cfda9889 261 call_fs_user_cb(alp);
Jeej 0:027760f45e2c 262 }
Jeej 0:027760f45e2c 263 else
Jeej 0:027760f45e2c 264 {
Jeej 57:5444cfda9889 265 // else this is a 'real' URC (or ISTATUS if enabled on modem)
Jeej 57:5444cfda9889 266 call_urc_user_cb(alp);
Jeej 57:5444cfda9889 267 }
Jeej 57:5444cfda9889 268
Jeej 57:5444cfda9889 269 alp_payload_free(alp);
Jeej 56:67e3d9608403 270
Jeej 0:027760f45e2c 271 break;
Jeej 0:027760f45e2c 272 case WC_FLOW_ALP_RESP:
Jeej 57:5444cfda9889 273
Jeej 57:5444cfda9889 274 // pre-parse payload
Jeej 57:5444cfda9889 275 alp = alp_payload_parse(p, size);
Jeej 58:8d58e5cb4037 276
Jeej 62:75d819d68e5f 277 PRINT("-->\n");
Jeej 62:75d819d68e5f 278 alp_payload_print(alp);
Jeej 57:5444cfda9889 279
Jeej 57:5444cfda9889 280 p = alp->d;
Jeej 57:5444cfda9889 281 alp_parse_chunk(&p, &r);
Jeej 57:5444cfda9889 282
Jeej 0:027760f45e2c 283 // This should always be a TAG'ed response as we tag our requests
Jeej 57:5444cfda9889 284 ASSERT((r.type == ALP_OPCODE_RSP_TAG), "ASSERT: expecting RESP_TAG got 0x%02X\n", r.type);
Jeej 57:5444cfda9889 285
Jeej 1:40ead20ecb14 286 id = r.meta.tag.id;
Jeej 1:40ead20ecb14 287 eop = r.meta.tag.eop;
Jeej 58:8d58e5cb4037 288
Jeej 58:8d58e5cb4037 289 if (g_modem.user[id].cb == NULL)
Jeej 58:8d58e5cb4037 290 {
Jeej 58:8d58e5cb4037 291 PRINT("WARNING: NULL Callback for ID %d\n", id);
Jeej 58:8d58e5cb4037 292 alp_payload_print(alp);
Jeej 58:8d58e5cb4037 293 alp_payload_free(alp);
Jeej 58:8d58e5cb4037 294 break;
Jeej 58:8d58e5cb4037 295 }
Jeej 58:8d58e5cb4037 296 //ASSERT(g_modem.user[id].cb != NULL, "ASSERT: NULL Callback for ID %d\n", id);
Jeej 56:67e3d9608403 297
Jeej 58:8d58e5cb4037 298 if (g_modem.user[id].alp_rsp)
Jeej 58:8d58e5cb4037 299 {
Jeej 58:8d58e5cb4037 300 // Give the remaining of the payload to the user to deal with
Jeej 58:8d58e5cb4037 301 *(g_modem.user[id].alp_rsp) = alp_payload_append(*(g_modem.user[id].alp_rsp), alp);
Jeej 58:8d58e5cb4037 302 }
Jeej 58:8d58e5cb4037 303 else
Jeej 58:8d58e5cb4037 304 {
Jeej 58:8d58e5cb4037 305 // Discard payload
Jeej 58:8d58e5cb4037 306 alp_payload_free(alp);
Jeej 58:8d58e5cb4037 307 }
Jeej 58:8d58e5cb4037 308
Jeej 1:40ead20ecb14 309 if(eop)
Jeej 1:40ead20ecb14 310 { // This is mainly for debug, catch old pointers
Jeej 2:bcf269540633 311 //g_modem.user[id].data = NULL;
Jeej 2:bcf269540633 312 //g_modem.user[id].istatus= NULL;
Jeej 20:17852941b19e 313 REF_PRINT("EOP\n");
Jeej 1:40ead20ecb14 314 }
Jeej 57:5444cfda9889 315
Jeej 6:581caeee80e8 316 // User Callback
Jeej 57:5444cfda9889 317 g_modem.user[id].cb(eop, err, id);
Jeej 57:5444cfda9889 318
Jeej 0:027760f45e2c 319 break;
Jeej 0:027760f45e2c 320 case WC_FLOW_SYS_RST:
Jeej 0:027760f45e2c 321 // 'Software' reset request
Jeej 31:517fc900afba 322 if (g_modem.cb->reset)
Jeej 31:517fc900afba 323 {
Jeej 31:517fc900afba 324 g_modem.cb->reset();
Jeej 31:517fc900afba 325 }
Jeej 0:027760f45e2c 326 break;
Jeej 0:027760f45e2c 327 case WC_FLOWID_CMD:
Jeej 0:027760f45e2c 328 if (*p == WM_BOOT)
Jeej 0:027760f45e2c 329 {
Jeej 56:67e3d9608403 330 uint16_t nb_boot;
Jeej 57:5444cfda9889 331 u8 cause;
Jeej 0:027760f45e2c 332 p++;
Jeej 0:027760f45e2c 333 cause = p[0];
Jeej 56:67e3d9608403 334 nb_boot = HAL_TO_U16(p[3], p[2]);
Jeej 31:517fc900afba 335 if (g_modem.cb->boot)
Jeej 31:517fc900afba 336 {
Jeej 56:67e3d9608403 337 g_modem.cb->boot(cause, nb_boot);
Jeej 31:517fc900afba 338 }
Jeej 0:027760f45e2c 339 }
Jeej 0:027760f45e2c 340 else
Jeej 0:027760f45e2c 341 {
Jeej 56:67e3d9608403 342 REF_PRINT("Unsupported CMD :0x%x\n", *p);
Jeej 0:027760f45e2c 343 }
Jeej 0:027760f45e2c 344 break;
Jeej 57:5444cfda9889 345 default:
Jeej 56:67e3d9608403 346 REF_PRINT("Unsupported WC Flowid:0x%x / %d Bytes\n", flowid, size);
Jeej 0:027760f45e2c 347 break;
Jeej 0:027760f45e2c 348 }
Jeej 0:027760f45e2c 349 }
Jeej 0:027760f45e2c 350
Jeej 57:5444cfda9889 351 static u32 modem_ref_add_root_permission(u8* p, u8* root_key, u8* action, u32 action_size)
Jeej 13:10589aaf8853 352 {
Jeej 57:5444cfda9889 353 u8 hash[32];
Jeej 13:10589aaf8853 354
Jeej 13:10589aaf8853 355 // Calculate hash on action
Jeej 13:10589aaf8853 356 kal_sha256_init();
Jeej 13:10589aaf8853 357 kal_sha256_update(action, action_size);
Jeej 56:67e3d9608403 358 kal_sha256_update(root_key, D7A_FS_ROOT_KEY_SIZE);
Jeej 13:10589aaf8853 359 kal_sha256_final(hash);
Jeej 13:10589aaf8853 360 // Prepend Permission-request...
Jeej 56:67e3d9608403 361 ALP_ACTION_PERM_REQ(p, false, ALP_PERM_REQ_ROOT, ALP_WIZZILAB_AUTH_PROTOCOL_ID);
Jeej 13:10589aaf8853 362 // ... and hash
Jeej 56:67e3d9608403 363 memcpy(p, hash, ALP_ACTION_PERM_REQ_TOKEN_SIZE);
Jeej 13:10589aaf8853 364
Jeej 13:10589aaf8853 365 return ALP_ACTION_PERM_REQ_OFFSET;
Jeej 13:10589aaf8853 366 }
Jeej 13:10589aaf8853 367
Jeej 56:67e3d9608403 368 int modem_ref_get_id(action_callback_t* cb)
Jeej 0:027760f45e2c 369 {
Jeej 0:027760f45e2c 370 int i;
Jeej 56:67e3d9608403 371 // Use rolling ids
Jeej 57:5444cfda9889 372 static u8 rolling;
Jeej 56:67e3d9608403 373
Jeej 56:67e3d9608403 374 for(i = 0; i < MAX_USER_NB; i++)
Jeej 0:027760f45e2c 375 {
Jeej 56:67e3d9608403 376 int id = (i + rolling) % MAX_USER_NB;
Jeej 56:67e3d9608403 377
Jeej 56:67e3d9608403 378 if (g_modem.user[id].cb == NULL)
Jeej 0:027760f45e2c 379 {
Jeej 56:67e3d9608403 380 g_modem.user[id].cb = cb;
Jeej 56:67e3d9608403 381 rolling++;
Jeej 58:8d58e5cb4037 382 //PRINT("Get ID:%d/0x%08x\n", id, cb);
Jeej 56:67e3d9608403 383 return id;
Jeej 0:027760f45e2c 384 }
Jeej 0:027760f45e2c 385 }
Jeej 56:67e3d9608403 386 ASSERT(i < MAX_USER_NB, "ASSERT: out of users\n");
Jeej 0:027760f45e2c 387 return -1;
Jeej 0:027760f45e2c 388 }
Jeej 0:027760f45e2c 389
Jeej 57:5444cfda9889 390 int modem_ref_free_id(u8 id)
Jeej 0:027760f45e2c 391 {
Jeej 0:027760f45e2c 392 if (id < MAX_USER_NB)
Jeej 0:027760f45e2c 393 {
Jeej 0:027760f45e2c 394 g_modem.user[id].cb = NULL;
Jeej 58:8d58e5cb4037 395 //PRINT("Free ID:%d\n", id);
Jeej 0:027760f45e2c 396 return id;
Jeej 0:027760f45e2c 397 }
Jeej 0:027760f45e2c 398 return -1;
Jeej 0:027760f45e2c 399 }
Jeej 0:027760f45e2c 400
Jeej 56:67e3d9608403 401 void modem_ref_open(fx_serial_send_t* send, modem_ref_callbacks_t* callbacks)
Jeej 0:027760f45e2c 402 {
Jeej 0:027760f45e2c 403 if (g_modem.state != STATE_OPEN)
Jeej 0:027760f45e2c 404 {
Jeej 57:5444cfda9889 405 g_modem.send = send;
Jeej 0:027760f45e2c 406 g_modem.cb = callbacks;
Jeej 56:67e3d9608403 407 memset(g_modem.user, 0, (MAX_USER_NB * sizeof(modem_ref_user_t)));
Jeej 0:027760f45e2c 408
Jeej 56:67e3d9608403 409 REF_PRINT("Open Modem - Max users:%d\n", MAX_USER_NB);
Jeej 0:027760f45e2c 410
Jeej 0:027760f45e2c 411 g_modem.state = STATE_OPEN;
Jeej 0:027760f45e2c 412 }
Jeej 0:027760f45e2c 413 }
Jeej 0:027760f45e2c 414
Jeej 56:67e3d9608403 415 void modem_ref_close(void)
Jeej 0:027760f45e2c 416 {
Jeej 0:027760f45e2c 417 if (g_modem.state == STATE_OPEN)
Jeej 0:027760f45e2c 418 {
Jeej 0:027760f45e2c 419 g_modem.state = STATE_CLOSED;
Jeej 0:027760f45e2c 420 }
Jeej 0:027760f45e2c 421 }
Jeej 0:027760f45e2c 422
Jeej 56:67e3d9608403 423 void modem_ref_reset(void)
Jeej 6:581caeee80e8 424 {
Jeej 57:5444cfda9889 425 serial_send(WizziComPacketSysReset, NULL);
Jeej 13:10589aaf8853 426 }
Jeej 13:10589aaf8853 427
Jeej 56:67e3d9608403 428 void modem_ref_set_lwan_cb(modem_lwan_callbacks_t* callbacks)
Jeej 13:10589aaf8853 429 {
Jeej 56:67e3d9608403 430 g_modem.lwan_cb = callbacks;
Jeej 13:10589aaf8853 431 }
Jeej 13:10589aaf8853 432
Jeej 61:820395fc5572 433 void modem_ref_set_boot_cb(fx_boot_t* boot_cb)
Jeej 61:820395fc5572 434 {
Jeej 61:820395fc5572 435 g_modem.cb->boot = boot_cb;
Jeej 61:820395fc5572 436 }
Jeej 61:820395fc5572 437
Jeej 57:5444cfda9889 438 void modem_ref_alp(void* itf, alp_payload_t* alp_user, alp_payload_t** alp_rsp, int id)
Jeej 13:10589aaf8853 439 {
Jeej 57:5444cfda9889 440 alp_payload_t* alp = NULL;
Jeej 57:5444cfda9889 441
Jeej 57:5444cfda9889 442 if (alp_rsp)
Jeej 57:5444cfda9889 443 {
Jeej 57:5444cfda9889 444 // Expecting a response
Jeej 0:027760f45e2c 445
Jeej 57:5444cfda9889 446 // Make sure pointer value is NULL
Jeej 57:5444cfda9889 447 *alp_rsp = NULL;
Jeej 57:5444cfda9889 448 }
Jeej 57:5444cfda9889 449
Jeej 57:5444cfda9889 450 // response pointer
Jeej 57:5444cfda9889 451 g_modem.user[id].alp_rsp = alp_rsp;
Jeej 0:027760f45e2c 452
Jeej 56:67e3d9608403 453 // Always a tag
Jeej 56:67e3d9608403 454 alp = alp_payload_tag(alp, id);
Jeej 41:6f83174ffed4 455
Jeej 56:67e3d9608403 456 // Forward on itf if any
Jeej 56:67e3d9608403 457 if (itf)
Jeej 56:67e3d9608403 458 {
Jeej 56:67e3d9608403 459 alp = alp_payload_forward(alp, itf);
Jeej 17:b4ea2a912fd3 460 // NOP action to get istats on ACKs
Jeej 60:08efaaca0e83 461 alp = alp_payload_nop(alp, false);
Jeej 17:b4ea2a912fd3 462 }
Jeej 56:67e3d9608403 463
Jeej 56:67e3d9608403 464 // Add user payload
Jeej 57:5444cfda9889 465 alp = alp_payload_append(alp, alp_user);
Jeej 56:67e3d9608403 466
Jeej 56:67e3d9608403 467 // Send to modem
Jeej 57:5444cfda9889 468 serial_send(WizziComPacketAlpUns, alp);
Jeej 0:027760f45e2c 469 }
Jeej 0:027760f45e2c 470
Jeej 57:5444cfda9889 471 static void _modem_ref_rsp(alp_payload_t* alp_user, u8 err, int id)
Jeej 1:40ead20ecb14 472 {
Jeej 57:5444cfda9889 473 alp_payload_t* alp = NULL;
Jeej 56:67e3d9608403 474
Jeej 57:5444cfda9889 475 // response pointer
Jeej 57:5444cfda9889 476 g_modem.user[id].alp_rsp = NULL;
Jeej 1:40ead20ecb14 477
Jeej 56:67e3d9608403 478 // Always a tag
Jeej 56:67e3d9608403 479 alp = alp_payload_rsp_tag(alp, id, true, err);
Jeej 56:67e3d9608403 480
Jeej 56:67e3d9608403 481 // Add user payload
Jeej 57:5444cfda9889 482 alp = alp_payload_append(alp, alp_user);
Jeej 56:67e3d9608403 483
Jeej 56:67e3d9608403 484 // Send to modem
Jeej 60:08efaaca0e83 485 serial_send(WizziComPacketAlpResp, alp);
Jeej 18:a11302a76e96 486 }
Jeej 18:a11302a76e96 487
Jeej 57:5444cfda9889 488 void modem_ref_respond(u8 action, s8 status, int id)
Jeej 56:67e3d9608403 489 {
Jeej 57:5444cfda9889 490 alp_payload_t* alp = NULL;
Jeej 0:027760f45e2c 491
Jeej 56:67e3d9608403 492 alp = alp_payload_rsp_status(alp, action, status);
Jeej 56:67e3d9608403 493
Jeej 56:67e3d9608403 494 _modem_ref_rsp(alp, (status < ALP_ERR_NONE)? true: false, id);
Jeej 0:027760f45e2c 495 }
Jeej 0:027760f45e2c 496
Jeej 57:5444cfda9889 497 void modem_ref_respond_fprop(u8 fid, alp_file_header_t* hdr, int id)
Jeej 0:027760f45e2c 498 {
Jeej 57:5444cfda9889 499 alp_payload_t* alp = NULL;
Jeej 0:027760f45e2c 500
Jeej 56:67e3d9608403 501 alp = alp_payload_rsp_fprop(alp, fid, hdr);
Jeej 56:67e3d9608403 502
Jeej 56:67e3d9608403 503 _modem_ref_rsp(alp, false, id);
Jeej 0:027760f45e2c 504 }
Jeej 0:027760f45e2c 505
Jeej 57:5444cfda9889 506 void modem_ref_respond_read(u8 fid, void* data, u32 offset, u32 length, int id)
Jeej 0:027760f45e2c 507 {
Jeej 57:5444cfda9889 508 alp_payload_t* alp = NULL;
Jeej 56:67e3d9608403 509
Jeej 56:67e3d9608403 510 alp = alp_payload_rsp_f_data(alp, fid, data, offset, length);
Jeej 56:67e3d9608403 511
Jeej 56:67e3d9608403 512 _modem_ref_rsp(alp, false, id);
Jeej 13:10589aaf8853 513 }