Exportable version of WizziLab's modem driver.

Dependents:   modem_ref_helper

Committer:
Jeej
Date:
Thu Oct 04 11:42:00 2018 +0000
Revision:
39:bc4fccf2d84b
Parent:
37:f5424d109c6d
Child:
41:6f83174ffed4
Removed dbg prints

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