Exportable version of WizziLab's modem driver.

Dependents:   modem_ref_helper

Committer:
Jeej
Date:
Tue Sep 07 15:58:51 2021 +0000
Revision:
61:820395fc5572
Parent:
60:08efaaca0e83
Child:
62:75d819d68e5f
Added boot callbeck set function

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