Exportable version of WizziLab's modem driver.

Dependents:   modem_ref_helper

Committer:
Jeej
Date:
Tue May 09 12:52:56 2017 +0000
Revision:
2:bcf269540633
Parent:
1:40ead20ecb14
Child:
3:2b6d7ca523eb
Commented error check as it clashes with the RTOS

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 0:027760f45e2c 5
Jeej 0:027760f45e2c 6 typedef struct {
Jeej 0:027760f45e2c 7 action_callback_t* cb;
Jeej 0:027760f45e2c 8 u8* data;
Jeej 1:40ead20ecb14 9 u8* istatus;
Jeej 0:027760f45e2c 10 } modem_user_t;
Jeej 0:027760f45e2c 11
Jeej 0:027760f45e2c 12 typedef struct {
Jeej 0:027760f45e2c 13 fx_serial_send_t* send;
Jeej 0:027760f45e2c 14 modem_callbacks_t* cb;
Jeej 0:027760f45e2c 15 modem_user_t user[MAX_USER_NB];
Jeej 0:027760f45e2c 16 u8 state;
Jeej 0:027760f45e2c 17 u8 tx_sequ;
Jeej 0:027760f45e2c 18 } modem_ctx_t;
Jeej 0:027760f45e2c 19 static modem_ctx_t g_modem;
Jeej 0:027760f45e2c 20
Jeej 0:027760f45e2c 21 #define STATE_OPEN 0xab
Jeej 0:027760f45e2c 22 #define STATE_CLOSED 0
Jeej 0:027760f45e2c 23
Jeej 0:027760f45e2c 24 #define SERIAL_SEND(_flow,_data,_size) do { \
Jeej 0:027760f45e2c 25 u8 wch[WC_HEADER_SIZE] = {WC_SYNC_BYTE_0,WC_SYNC_BYTE_1,_size,g_modem.tx_sequ++,_flow};\
Jeej 0:027760f45e2c 26 g_modem.send(wch,WC_HEADER_SIZE,_data,_size);\
Jeej 0:027760f45e2c 27 }while(0)
Jeej 0:027760f45e2c 28
Jeej 0:027760f45e2c 29 // Flows
Jeej 0:027760f45e2c 30 #define WC_FLOWID_CMD 0x10
Jeej 0:027760f45e2c 31 #define WC_FLOWID_ALP 0x20
Jeej 0:027760f45e2c 32 #define WC_FLOWID_SYS 0x30
Jeej 0:027760f45e2c 33
Jeej 0:027760f45e2c 34 // Sub-Flows
Jeej 0:027760f45e2c 35 #define WC_FLOW_ALP_CMD 0x20
Jeej 0:027760f45e2c 36 #define WC_FLOW_ALP_RESP 0x21
Jeej 0:027760f45e2c 37 #define WC_FLOW_ALP_UNS 0x22
Jeej 0:027760f45e2c 38 #define WC_FLOW_SYS_RST 0x30
Jeej 0:027760f45e2c 39 #define WC_FLOW_SYS_PING 0x34
Jeej 0:027760f45e2c 40 #define WC_FLOW_SYS_PONG 0x35
Jeej 0:027760f45e2c 41 #define WC_FLOW_SYS_CFG 0x36
Jeej 0:027760f45e2c 42 #define WC_FLOW_SYS_XON 0x39
Jeej 0:027760f45e2c 43 #define WC_FLOW_SYS_XOFF 0x3a
Jeej 0:027760f45e2c 44 #define WC_FLOW_SYS_XACK 0x3b
Jeej 0:027760f45e2c 45
Jeej 0:027760f45e2c 46 // Misc CMD...
Jeej 0:027760f45e2c 47 #define WM_BOOT 0x81
Jeej 0:027760f45e2c 48
Jeej 0:027760f45e2c 49
Jeej 0:027760f45e2c 50 protected void modem_input(u8 flowid,u8* payload,u8 size)
Jeej 0:027760f45e2c 51 {
Jeej 0:027760f45e2c 52 int rem =size;
Jeej 0:027760f45e2c 53 u8* p = payload;
Jeej 0:027760f45e2c 54 alp_parsed_chunk_t r;
Jeej 0:027760f45e2c 55 int id = -1;
Jeej 0:027760f45e2c 56 s8 err = ALP_ERR_NONE;
Jeej 1:40ead20ecb14 57 u8 eop;
Jeej 0:027760f45e2c 58 //DPRINT("input 0x%x/%d Bytes\n",flowid,size);
Jeej 0:027760f45e2c 59 switch (flowid)
Jeej 0:027760f45e2c 60 {
Jeej 0:027760f45e2c 61 case WC_FLOW_ALP_UNS:
Jeej 0:027760f45e2c 62 case WC_FLOW_ALP_CMD:
Jeej 0:027760f45e2c 63 rem -= alp_parse_chunk(&p, &r);
Jeej 0:027760f45e2c 64 // This should always be a TAG'ed request in case of FS access...
Jeej 0:027760f45e2c 65 if (r.type == ALP_OPCODE_TAG)
Jeej 0:027760f45e2c 66 {
Jeej 0:027760f45e2c 67 id = r.meta.tag.id;
Jeej 0:027760f45e2c 68 // Parse File Operation
Jeej 0:027760f45e2c 69 rem -= alp_parse_chunk(&p, &r);
Jeej 0:027760f45e2c 70 //DPRINT("ALP OP[%d]\n",r.type);
Jeej 0:027760f45e2c 71 switch (r.type)
Jeej 0:027760f45e2c 72 {
Jeej 0:027760f45e2c 73 case ALP_OPCODE_F_RD_DATA:
Jeej 0:027760f45e2c 74 g_modem.cb->read(r.meta.f_data.fid,r.meta.f_data.offset,r.meta.f_data.length,id);
Jeej 0:027760f45e2c 75 break;
Jeej 0:027760f45e2c 76 case ALP_OPCODE_F_WR_DATA:
Jeej 0:027760f45e2c 77 g_modem.cb->write(r.meta.f_data.fid,r.data,r.meta.f_data.offset,r.meta.f_data.length,id);
Jeej 0:027760f45e2c 78 break;
Jeej 0:027760f45e2c 79 case ALP_OPCODE_F_RD_PROP:
Jeej 0:027760f45e2c 80 g_modem.cb->read_fprop(r.meta.f_data.fid,id);
Jeej 0:027760f45e2c 81 break;
Jeej 0:027760f45e2c 82 case ALP_OPCODE_F_DELETE:
Jeej 0:027760f45e2c 83 g_modem.cb->remove(r.meta.f_data.fid,id);
Jeej 0:027760f45e2c 84 break;
Jeej 0:027760f45e2c 85 case ALP_OPCODE_F_FLUSH:
Jeej 0:027760f45e2c 86 g_modem.cb->flush(r.meta.f_data.fid,id);
Jeej 0:027760f45e2c 87 break;
Jeej 0:027760f45e2c 88 default:
Jeej 0:027760f45e2c 89 ASSERT(false,"ASSERT: Unsupported ALP File Operation: %d\n",r.type);
Jeej 0:027760f45e2c 90 break;
Jeej 0:027760f45e2c 91 }
Jeej 0:027760f45e2c 92 }
Jeej 0:027760f45e2c 93 else
Jeej 0:027760f45e2c 94 {
Jeej 0:027760f45e2c 95 // ... or a 'real' URC (or ISTATUS if enabled on modem)
Jeej 0:027760f45e2c 96 switch (r.type)
Jeej 0:027760f45e2c 97 {
Jeej 0:027760f45e2c 98 case ALP_OPCODE_RSP_ISTATUS:
Jeej 0:027760f45e2c 99 // TODO
Jeej 0:027760f45e2c 100 DPRINT("Got ISTATUS[%x] %d Bytes\n",r.meta.itf.type,r.meta.itf.length);
Jeej 0:027760f45e2c 101 //g_modem.cb->istatus(r.meta.itf.type,r.meta.itf.length,r.data);
Jeej 0:027760f45e2c 102 break;
Jeej 0:027760f45e2c 103 case ALP_OPCODE_RSP_URC:
Jeej 0:027760f45e2c 104 if (r.meta.urc.type == ALP_URC_TYPE_LQUAL)
Jeej 0:027760f45e2c 105 g_modem.cb->lqual(r.meta.urc.ifid,r.meta.urc.per);
Jeej 0:027760f45e2c 106 else if (r.meta.urc.type == ALP_URC_TYPE_LQUAL)
Jeej 0:027760f45e2c 107 g_modem.cb->ldown(r.meta.urc.ifid);
Jeej 0:027760f45e2c 108 else
Jeej 0:027760f45e2c 109 ASSERT(false,"ASSERT: Unsupported ALP URC: %d\n",r.meta.urc.type);
Jeej 0:027760f45e2c 110 break;
Jeej 0:027760f45e2c 111 default:
Jeej 0:027760f45e2c 112 ASSERT(false,"ASSERT: Unsupported ALP URC: %d\n",r.type);
Jeej 0:027760f45e2c 113 break;
Jeej 0:027760f45e2c 114 }
Jeej 0:027760f45e2c 115 }
Jeej 0:027760f45e2c 116 break;
Jeej 0:027760f45e2c 117 case WC_FLOW_ALP_RESP:
Jeej 0:027760f45e2c 118 // This should always be a TAG'ed response as we tag our requests
Jeej 0:027760f45e2c 119 rem -= alp_parse_chunk(&p, &r);
Jeej 0:027760f45e2c 120 ASSERT((r.type == ALP_OPCODE_RSP_TAG),"ASSERT: expecting RESP_TAG got %d\n",r.type);
Jeej 1:40ead20ecb14 121 id = r.meta.tag.id;
Jeej 1:40ead20ecb14 122 eop = r.meta.tag.eop;
Jeej 0:027760f45e2c 123 ASSERT(g_modem.user[id].cb != NULL,"ASSERT: NULL Callback for ID %d\n",id);
Jeej 0:027760f45e2c 124 // Empty response
Jeej 0:027760f45e2c 125 if (rem <= 0)
Jeej 0:027760f45e2c 126 {
Jeej 0:027760f45e2c 127 // TODO: still no info on error...
Jeej 0:027760f45e2c 128 err = r.meta.tag.err ? ALP_ERR_UNKNOWN : ALP_ERR_NONE;
Jeej 1:40ead20ecb14 129 g_modem.user[id].cb(eop,err,id);
Jeej 0:027760f45e2c 130 return;
Jeej 0:027760f45e2c 131 }
Jeej 0:027760f45e2c 132
Jeej 1:40ead20ecb14 133 // Actual response(s)
Jeej 1:40ead20ecb14 134 while(rem>0)
Jeej 0:027760f45e2c 135 {
Jeej 1:40ead20ecb14 136 rem -= alp_parse_chunk(&p, &r);
Jeej 1:40ead20ecb14 137 switch (r.type)
Jeej 1:40ead20ecb14 138 {
Jeej 1:40ead20ecb14 139 case ALP_OPCODE_RSP_F_DATA:
Jeej 1:40ead20ecb14 140 case ALP_OPCODE_RSP_F_PROP: // Not supported but comes for free ...
Jeej 1:40ead20ecb14 141 ASSERT(g_modem.user[id].data != NULL,"ASSERT: NULL Data Buffer for RD on ID %d\n",id);
Jeej 1:40ead20ecb14 142 memcpy(g_modem.user[id].data,r.data,r.meta.f_data.length);
Jeej 1:40ead20ecb14 143 break;
Jeej 1:40ead20ecb14 144 case ALP_OPCODE_RSP_STATUS:
Jeej 1:40ead20ecb14 145 err = r.meta.status.code;
Jeej 1:40ead20ecb14 146 break;
Jeej 1:40ead20ecb14 147 case ALP_OPCODE_RSP_ISTATUS:
Jeej 1:40ead20ecb14 148 ASSERT(g_modem.user[id].istatus != NULL,"ASSERT: NULL ISTAT Buffer for RD on ID %d\n",id);
Jeej 1:40ead20ecb14 149 memcpy(g_modem.user[id].istatus,r.data,r.meta.itf.length);
Jeej 1:40ead20ecb14 150 break;
Jeej 1:40ead20ecb14 151 default:
Jeej 1:40ead20ecb14 152 ASSERT(false,"ASSERT: Unsupported ALP Response: %d\n",r.type);
Jeej 1:40ead20ecb14 153 break;
Jeej 1:40ead20ecb14 154 }
Jeej 0:027760f45e2c 155 }
Jeej 1:40ead20ecb14 156 g_modem.user[id].cb(eop,err,id);
Jeej 1:40ead20ecb14 157 if(eop)
Jeej 1:40ead20ecb14 158 { // This is mainly for debug, catch old pointers
Jeej 2:bcf269540633 159 //g_modem.user[id].data = NULL;
Jeej 2:bcf269540633 160 //g_modem.user[id].istatus= NULL;
Jeej 1:40ead20ecb14 161 }
Jeej 0:027760f45e2c 162 break;
Jeej 0:027760f45e2c 163 case WC_FLOW_SYS_RST:
Jeej 0:027760f45e2c 164 // 'Software' reset request
Jeej 0:027760f45e2c 165 g_modem.cb->reset();
Jeej 0:027760f45e2c 166 break;
Jeej 0:027760f45e2c 167 case WC_FLOWID_CMD:
Jeej 0:027760f45e2c 168 if (*p == WM_BOOT)
Jeej 0:027760f45e2c 169 {
Jeej 0:027760f45e2c 170 u16 nb_boot;
Jeej 0:027760f45e2c 171 u8 cause;
Jeej 0:027760f45e2c 172 p++;
Jeej 0:027760f45e2c 173 cause = p[0];
Jeej 0:027760f45e2c 174 nb_boot = HAL_TO_U16(p[3],p[2]);
Jeej 0:027760f45e2c 175 g_modem.cb->boot(cause,nb_boot);
Jeej 0:027760f45e2c 176 }
Jeej 0:027760f45e2c 177 else
Jeej 0:027760f45e2c 178 {
Jeej 0:027760f45e2c 179 DPRINT("Unsupported CMD :0x%x\n",*p);
Jeej 0:027760f45e2c 180 }
Jeej 0:027760f45e2c 181 break;
Jeej 0:027760f45e2c 182 default:
Jeej 0:027760f45e2c 183 DPRINT("Unsupported WC Flowid:0x%x / %d Bytes\n",flowid,size);
Jeej 0:027760f45e2c 184 break;
Jeej 0:027760f45e2c 185 }
Jeej 0:027760f45e2c 186 }
Jeej 0:027760f45e2c 187
Jeej 0:027760f45e2c 188 public int modem_get_id(action_callback_t* cb)
Jeej 0:027760f45e2c 189 {
Jeej 0:027760f45e2c 190 int i;
Jeej 0:027760f45e2c 191 for(i=0;i<MAX_USER_NB;i++)
Jeej 0:027760f45e2c 192 {
Jeej 0:027760f45e2c 193 if (g_modem.user[i].cb == NULL)
Jeej 0:027760f45e2c 194 {
Jeej 0:027760f45e2c 195 g_modem.user[i].cb = cb;
Jeej 0:027760f45e2c 196 //DPRINT("Get ID:%d/0x%08x\n",i,cb);
Jeej 0:027760f45e2c 197 return i;
Jeej 0:027760f45e2c 198 }
Jeej 0:027760f45e2c 199 }
Jeej 0:027760f45e2c 200 ASSERT(i < MAX_USER_NB,"ASSERT: out of users\n");
Jeej 0:027760f45e2c 201 return -1;
Jeej 0:027760f45e2c 202 }
Jeej 0:027760f45e2c 203
Jeej 0:027760f45e2c 204 public int modem_free_id(u8 id)
Jeej 0:027760f45e2c 205 {
Jeej 0:027760f45e2c 206 if (id < MAX_USER_NB)
Jeej 0:027760f45e2c 207 {
Jeej 0:027760f45e2c 208 g_modem.user[id].cb = NULL;
Jeej 0:027760f45e2c 209 g_modem.user[id].data = NULL;
Jeej 1:40ead20ecb14 210 g_modem.user[id].istatus= NULL;
Jeej 0:027760f45e2c 211 //DPRINT("Free ID:%d\n",id);
Jeej 0:027760f45e2c 212 return id;
Jeej 0:027760f45e2c 213 }
Jeej 0:027760f45e2c 214 return -1;
Jeej 0:027760f45e2c 215 }
Jeej 0:027760f45e2c 216
Jeej 0:027760f45e2c 217 public void modem_open(fx_serial_send_t* send,modem_callbacks_t* callbacks)
Jeej 0:027760f45e2c 218 {
Jeej 0:027760f45e2c 219 if (g_modem.state != STATE_OPEN)
Jeej 0:027760f45e2c 220 {
Jeej 0:027760f45e2c 221 g_modem.send= send;
Jeej 0:027760f45e2c 222 g_modem.cb = callbacks;
Jeej 0:027760f45e2c 223 memset(g_modem.user,0,(MAX_USER_NB * sizeof(modem_user_t)));
Jeej 0:027760f45e2c 224
Jeej 0:027760f45e2c 225 DPRINT("Open Modem - Max users:%d\n",MAX_USER_NB);
Jeej 0:027760f45e2c 226
Jeej 0:027760f45e2c 227 g_modem.state = STATE_OPEN;
Jeej 0:027760f45e2c 228 }
Jeej 0:027760f45e2c 229 }
Jeej 0:027760f45e2c 230
Jeej 0:027760f45e2c 231 public void modem_close(void)
Jeej 0:027760f45e2c 232 {
Jeej 0:027760f45e2c 233 if (g_modem.state == STATE_OPEN)
Jeej 0:027760f45e2c 234 {
Jeej 0:027760f45e2c 235 g_modem.state = STATE_CLOSED;
Jeej 0:027760f45e2c 236 }
Jeej 0:027760f45e2c 237 }
Jeej 0:027760f45e2c 238
Jeej 0:027760f45e2c 239 public void modem_reset(void)
Jeej 0:027760f45e2c 240 {
Jeej 0:027760f45e2c 241 SERIAL_SEND(WC_FLOW_SYS_RST,NULL,0);
Jeej 0:027760f45e2c 242 }
Jeej 0:027760f45e2c 243
Jeej 0:027760f45e2c 244 public void modem_read_file(u8 fid,void *data,u32 offset,u32 length, u8 id)
Jeej 0:027760f45e2c 245 {
Jeej 0:027760f45e2c 246 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_RD_DATA_SIZE_MAX];
Jeej 0:027760f45e2c 247 u8* p = tmp;
Jeej 0:027760f45e2c 248 DPRINT("RD[%d]@%d %d Bytes\n",fid,offset,length);
Jeej 0:027760f45e2c 249 g_modem.user[id].data = (u8*)data;
Jeej 0:027760f45e2c 250 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 251 ALP_ACTION_F_RD_DATA(p,true,fid,offset,length);
Jeej 0:027760f45e2c 252 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 253 }
Jeej 0:027760f45e2c 254
Jeej 0:027760f45e2c 255 public void modem_write_file(u8 fid,void *data,u32 offset,u32 length, u8 id)
Jeej 0:027760f45e2c 256 {
Jeej 0:027760f45e2c 257 ALLOC_BUFFER(u8,tmp,(ALP_ACTION_TAG_SIZE + ALP_ACTION_F_WR_DATA_SIZE_MAX(length)));
Jeej 0:027760f45e2c 258
Jeej 0:027760f45e2c 259 u8* p = tmp;
Jeej 0:027760f45e2c 260 DPRINT("WR[%d]@%d %d Bytes\n",fid,offset,length);
Jeej 0:027760f45e2c 261 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 262 ALP_ACTION_F_WR_DATA(p,true,fid,offset,length,data);
Jeej 0:027760f45e2c 263 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 264 DEALLOC_BUFFER(tmp);
Jeej 0:027760f45e2c 265 }
Jeej 0:027760f45e2c 266
Jeej 0:027760f45e2c 267 public void modem_declare_file(u8 fid, alp_file_header_t* hdr, u8 id)
Jeej 0:027760f45e2c 268 {
Jeej 0:027760f45e2c 269 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_DECLARE_SIZE];
Jeej 0:027760f45e2c 270 u8* p = tmp;
Jeej 0:027760f45e2c 271
Jeej 0:027760f45e2c 272 DPRINT("DECLARE[%d]\n",fid);
Jeej 0:027760f45e2c 273 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 274 ALP_ACTION_F_DECLARE(p,true,fid,hdr);
Jeej 0:027760f45e2c 275 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 276 }
Jeej 0:027760f45e2c 277
Jeej 0:027760f45e2c 278 public void modem_create_file(u8 fid, alp_file_header_t* hdr, u8 id)
Jeej 0:027760f45e2c 279 {
Jeej 0:027760f45e2c 280 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_CREATE_SIZE];
Jeej 0:027760f45e2c 281 u8* p = tmp;
Jeej 0:027760f45e2c 282
Jeej 0:027760f45e2c 283 DPRINT("CREATE[%d]\n",fid);
Jeej 0:027760f45e2c 284 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 285 ALP_ACTION_F_CREATE(p,true,fid,hdr);
Jeej 0:027760f45e2c 286 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 287 }
Jeej 0:027760f45e2c 288
Jeej 0:027760f45e2c 289 public void modem_notify_file(u8 fid,u32 offset,u32 length,u8 id)
Jeej 0:027760f45e2c 290 {
Jeej 0:027760f45e2c 291 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_TOUCH_SIZE_MAX];
Jeej 0:027760f45e2c 292 u8* p = tmp;
Jeej 0:027760f45e2c 293
Jeej 0:027760f45e2c 294 DPRINT("NOTIFY[%d]@%d %d Bytes\n",fid,offset,length);
Jeej 0:027760f45e2c 295 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 296 ALP_ACTION_F_TOUCH(p,true,fid,offset,length);
Jeej 0:027760f45e2c 297 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 298 }
Jeej 0:027760f45e2c 299
Jeej 0:027760f45e2c 300 public void modem_delete_file(u8 fid,u8 id)
Jeej 0:027760f45e2c 301 {
Jeej 0:027760f45e2c 302 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_F_DELETE_SIZE];
Jeej 0:027760f45e2c 303 u8* p = tmp;
Jeej 0:027760f45e2c 304
Jeej 0:027760f45e2c 305 DPRINT("DELETE[%d]\n",fid);
Jeej 0:027760f45e2c 306 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 307 ALP_ACTION_F_DELETE(p,true,fid);
Jeej 0:027760f45e2c 308 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 309 }
Jeej 0:027760f45e2c 310
Jeej 0:027760f45e2c 311 public void modem_send_raw_alp(u8* payload, u32 length, u8 id)
Jeej 0:027760f45e2c 312 {
Jeej 0:027760f45e2c 313 ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + length);
Jeej 0:027760f45e2c 314 u8* p = tmp;
Jeej 0:027760f45e2c 315
Jeej 0:027760f45e2c 316 DPRINT("ALP RAW %d Bytes\n",length);
Jeej 0:027760f45e2c 317 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 318 // User Payload
Jeej 0:027760f45e2c 319 memcpy(p,payload,length);p+=length;
Jeej 0:027760f45e2c 320 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 321 DEALLOC_BUFFER(tmp);
Jeej 0:027760f45e2c 322 }
Jeej 0:027760f45e2c 323
Jeej 0:027760f45e2c 324 public void modem_send_file_content(u8* itf, u8 itf_length,u8 fid,void *data,u32 offset,u32 length, u8 id)
Jeej 0:027760f45e2c 325 {
Jeej 0:027760f45e2c 326 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 327 u8* p = tmp;
Jeej 0:027760f45e2c 328
Jeej 0:027760f45e2c 329 DPRINT("SEND FILE[%d] CONTENTS @%d %d Bytes (itf %d Bytes)\n",fid,offset,length,itf_length);
Jeej 0:027760f45e2c 330 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 331 ALP_ACTION_FORWARD(p,itf,itf_length);
Jeej 0:027760f45e2c 332 ALP_ACTION_RSP_F_DATA(p,fid,offset,length,data);
Jeej 0:027760f45e2c 333 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 334 DEALLOC_BUFFER(tmp);
Jeej 0:027760f45e2c 335 }
Jeej 0:027760f45e2c 336
Jeej 1:40ead20ecb14 337 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 338 {
Jeej 1:40ead20ecb14 339 ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_F_RD_DATA_SIZE_MAX);
Jeej 1:40ead20ecb14 340 u8* p = tmp;
Jeej 1:40ead20ecb14 341 g_modem.user[id].data = (u8*)data;
Jeej 1:40ead20ecb14 342 g_modem.user[id].istatus= (u8*)istatus;
Jeej 1:40ead20ecb14 343
Jeej 1:40ead20ecb14 344 DPRINT("RMT RD FILE[%d]@%d %d Bytes (itf %d Bytes)\n",fid,offset,length,itf_length);
Jeej 1:40ead20ecb14 345 ALP_ACTION_TAG(p,id,true);
Jeej 1:40ead20ecb14 346 ALP_ACTION_FORWARD(p,itf,itf_length);
Jeej 1:40ead20ecb14 347 ALP_ACTION_F_RD_DATA(p,true,fid,offset,length);
Jeej 1:40ead20ecb14 348 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 1:40ead20ecb14 349 DEALLOC_BUFFER(tmp);
Jeej 1:40ead20ecb14 350 }
Jeej 1:40ead20ecb14 351
Jeej 0:027760f45e2c 352 public void modem_enable_urc(u8 type, u8 ifid, u8 val, u8 enable, u8 id)
Jeej 0:027760f45e2c 353 {
Jeej 0:027760f45e2c 354 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_URCC_SIZE(ALP_URC_TYPE_LQUAL)];
Jeej 0:027760f45e2c 355 u8* p = tmp;
Jeej 0:027760f45e2c 356 DPRINT("URC[%d] Type %d ifid %d\n",enable,type,ifid);
Jeej 0:027760f45e2c 357
Jeej 0:027760f45e2c 358 ALP_ACTION_TAG(p,id,true);
Jeej 0:027760f45e2c 359 // Actual Operation
Jeej 0:027760f45e2c 360 if (enable)
Jeej 0:027760f45e2c 361 {
Jeej 0:027760f45e2c 362 ALP_ACTION_URCC_EN(p,true,type,ifid,val);
Jeej 0:027760f45e2c 363 }
Jeej 0:027760f45e2c 364 else
Jeej 0:027760f45e2c 365 {
Jeej 0:027760f45e2c 366 ALP_ACTION_URCC_DIS(p,true,type,ifid,val);
Jeej 0:027760f45e2c 367 }
Jeej 0:027760f45e2c 368 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 369 }
Jeej 0:027760f45e2c 370
Jeej 1:40ead20ecb14 371 public void modem_activate_itf(u8 type, u8 nb_dev, u8 ifid, u8 flags, u8 enable, u8 id)
Jeej 1:40ead20ecb14 372 {
Jeej 1:40ead20ecb14 373 u8 tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_ACTIVATE_ITF_SIZE];
Jeej 1:40ead20ecb14 374 u8* p = tmp;
Jeej 1:40ead20ecb14 375
Jeej 1:40ead20ecb14 376 DPRINT("ACTIVATE ITFTYPE[%x]:%d\n",type,enable);
Jeej 1:40ead20ecb14 377 ALP_ACTION_TAG(p,id,true);
Jeej 1:40ead20ecb14 378 ALP_ACTION_ACTIVATE_ITF(p,enable,type,nb_dev,ifid,flags);
Jeej 1:40ead20ecb14 379 SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp));
Jeej 1:40ead20ecb14 380 }
Jeej 1:40ead20ecb14 381
Jeej 0:027760f45e2c 382 public void modem_respond(u8 action, s8 status, int id)
Jeej 0:027760f45e2c 383 {
Jeej 0:027760f45e2c 384 u8 tmp[ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_STATUS_SIZE];
Jeej 0:027760f45e2c 385 u8* p = tmp;
Jeej 0:027760f45e2c 386 DPRINT("RESP[%d]:%d\n",action,status);
Jeej 0:027760f45e2c 387
Jeej 0:027760f45e2c 388 if (id>=0) { ALP_ACTION_RSP_TAG(p,id,true,(status<0)?true:false); }
Jeej 0:027760f45e2c 389 ALP_ACTION_RSP_STATUS(p,action,status);
Jeej 0:027760f45e2c 390 SERIAL_SEND(WC_FLOW_ALP_RESP,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 391 }
Jeej 0:027760f45e2c 392
Jeej 0:027760f45e2c 393 public void modem_respond_fprop(u8 fid, u8* hdr, int id)
Jeej 0:027760f45e2c 394 {
Jeej 0:027760f45e2c 395 u8 tmp[ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_F_PROP_SIZE];
Jeej 0:027760f45e2c 396 u8* p = tmp;
Jeej 0:027760f45e2c 397 DPRINT("RESP FPROP[%d]\n",fid);
Jeej 0:027760f45e2c 398
Jeej 0:027760f45e2c 399 if (id>=0) { ALP_ACTION_RSP_TAG(p,id,true,false); }
Jeej 0:027760f45e2c 400 ALP_ACTION_RSP_F_PROP(p,fid,hdr);
Jeej 0:027760f45e2c 401 SERIAL_SEND(WC_FLOW_ALP_RESP,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 402 }
Jeej 0:027760f45e2c 403
Jeej 0:027760f45e2c 404 public void modem_respond_read(u8 fid,void *data,u32 offset,u32 length, int id)
Jeej 0:027760f45e2c 405 {
Jeej 0:027760f45e2c 406 ALLOC_BUFFER(u8,tmp,ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_F_DATA_SIZE_MAX(length));
Jeej 0:027760f45e2c 407 u8* p = tmp;
Jeej 0:027760f45e2c 408 DPRINT("F_DATA[%d]@%d %d Bytes\n",fid,offset,length);
Jeej 0:027760f45e2c 409 if (id>=0) { ALP_ACTION_RSP_TAG(p,id,true,false); }
Jeej 0:027760f45e2c 410 ALP_ACTION_RSP_F_DATA(p,fid,offset,length,data);
Jeej 0:027760f45e2c 411 SERIAL_SEND(WC_FLOW_ALP_RESP,tmp, (u8)(p-tmp));
Jeej 0:027760f45e2c 412 DEALLOC_BUFFER(tmp);
Jeej 0:027760f45e2c 413 }
Jeej 0:027760f45e2c 414
Jeej 0:027760f45e2c 415