Exportable version of WizziLab's modem driver.

Dependents:   modem_ref_helper

Committer:
Jeej
Date:
Thu Dec 14 19:16:25 2017 +0000
Revision:
21:d5018a680915
Parent:
20:17852941b19e
Child:
23:5553f9541759
ASSERT on send/read data too big.

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