Exportable version of WizziLab's modem driver.
Diff: src/modem_ref.cpp
- Revision:
- 46:9b83866cef2c
- Parent:
- 45:6a4c373e1178
- Child:
- 50:9eb5eed8b014
--- a/src/modem_ref.cpp Wed Feb 20 13:43:19 2019 +0000 +++ b/src/modem_ref.cpp Wed Jul 31 16:48:48 2019 +0000 @@ -41,12 +41,6 @@ #define ROOT_KEY_SIZE 16 -#define SERIAL_SEND(_flow,_data,_size) do { \ - ASSERT(_size<256, "SERIAL_SEND too big for serial protocol (%d/%dmax)", _size, 255);\ - u8 wch[WC_HEADER_SIZE] = {WC_SYNC_BYTE_0,WC_SYNC_BYTE_1,_size,g_modem.tx_sequ++,_flow};\ - g_modem.send(wch,WC_HEADER_SIZE,_data,_size);\ -}while(0) - // Flows #define WC_FLOWID_CMD 0x10 #define WC_FLOWID_ALP 0x20 @@ -67,6 +61,21 @@ // Misc CMD... #define WM_BOOT 0x81 +static void serial_send(u8 flowid, u8* data, int size) +{ + u8 len = (u8)size; + u8 wch[WC_HEADER_SIZE] = { + WC_SYNC_BYTE_0, + WC_SYNC_BYTE_1, + len, + g_modem.tx_sequ++, + flowid + }; + + ASSERT(size < 256, "serial_send too big for serial protocol (%d/%dmax)", size, 255); + + g_modem.send(wch, WC_HEADER_SIZE, data, len); +} protected void modem_input(u8 flowid,u8* payload,u8 size) { @@ -423,7 +432,7 @@ public void modem_reset(void) { - SERIAL_SEND(WC_FLOW_SYS_RST,NULL,0); + serial_send(WC_FLOW_SYS_RST,NULL,0); } public void modem_read_file(u8 fid, void *data, u32 offset, u32 length, u8 id) @@ -434,7 +443,7 @@ g_modem.user[id].data = (u8*)data; ALP_ACTION_TAG(p,id,true); ALP_ACTION_F_RD_DATA(p,true,fid,offset,length); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp)); } public void modem_read_fprop(u8 fid, alp_file_header_t* data, u8 id) @@ -445,7 +454,7 @@ g_modem.user[id].data = (u8*)data; ALP_ACTION_TAG(p,id,true); ALP_ACTION_F_RD_PROP(p,true,fid); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp)); } public void modem_read_fprop_root(u8 fid, alp_file_header_t* data, u8* root_key, u8 id) @@ -464,7 +473,7 @@ modem_add_root_permission(&tmp[ALP_ACTION_TAG_SIZE], root_key, &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET], ALP_ACTION_F_RD_PROP_SIZE); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(lastp-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (lastp-tmp)); } public void modem_write_fprop(u8 fid, alp_file_header_t* data, u8 id) @@ -474,7 +483,7 @@ DPRINT(L_API, "WR PROPS[%d]\n",fid); ALP_ACTION_TAG(p,id,true); ALP_ACTION_F_WR_PROP(p,true,fid,0,sizeof(alp_file_header_t),data); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp)); } public void modem_write_fprop_root(u8 fid, alp_file_header_t* data, u8* root_key, u8 id) @@ -492,24 +501,24 @@ modem_add_root_permission(&tmp[ALP_ACTION_TAG_SIZE], root_key, &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET], ALP_ACTION_F_WR_PROP_SIZE_MAX); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(lastp-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (lastp-tmp)); } public void modem_write_file(u8 fid, void *data, u32 offset, u32 length, u8 id) { - ALLOC_BUFFER(u8,tmp,(ALP_ACTION_TAG_SIZE + ALP_ACTION_F_WR_DATA_SIZE_MAX(length))); + ALLOC_BUFFER(u8, tmp,(ALP_ACTION_TAG_SIZE + ALP_ACTION_F_WR_DATA_SIZE_MAX(length))); u8* p = tmp; REF_PRINT("WR[%d]@%d %d Bytes\n",fid,offset,length); ALP_ACTION_TAG(p,id,true); ALP_ACTION_F_WR_DATA(p,true,fid,offset,length,data); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp)); DEALLOC_BUFFER(tmp); } public void modem_write_file_root(u8 fid, void *data, u32 offset, u32 length, u8* root_key, u8 id) { - ALLOC_BUFFER(u8,tmp,(ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_SIZE(ALP_ACTION_F_WR_DATA_SIZE_MAX(length)))); + ALLOC_BUFFER(u8, tmp,(ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_SIZE(ALP_ACTION_F_WR_DATA_SIZE_MAX(length)))); u8* p = tmp; u8* lastp; @@ -523,7 +532,7 @@ modem_add_root_permission(&tmp[ALP_ACTION_TAG_SIZE], root_key, &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET], ALP_ACTION_F_WR_DATA_SIZE(offset,length)); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(lastp-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (lastp-tmp)); DEALLOC_BUFFER(tmp); } @@ -534,7 +543,7 @@ REF_PRINT("FLUSH[%d]\n",fid); ALP_ACTION_TAG(p,id,true); ALP_ACTION_F_FLUSH(p,true,fid); - SERIAL_SEND(WC_FLOW_ALP_UNS, tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp)); } public void modem_flush_file_root(u8 fid, u8* root_key, u8 id) @@ -552,7 +561,7 @@ modem_add_root_permission(&tmp[ALP_ACTION_TAG_SIZE], root_key, &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET], ALP_ACTION_F_FLUSH_SIZE); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(lastp-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (lastp-tmp)); } public void modem_declare_file(u8 fid, alp_file_header_t* hdr, u8 local, u8 id) @@ -563,7 +572,7 @@ REF_PRINT("DECLARE[%d]\n",fid); ALP_ACTION_TAG(p,id,true); ALP_ACTION_F_DECLARE(p,true,fid,hdr,local); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp)); } public void modem_create_file(u8 fid, alp_file_header_t* hdr, u8 id) @@ -574,7 +583,7 @@ REF_PRINT("CREATE[%d]\n",fid); ALP_ACTION_TAG(p,id,true); ALP_ACTION_F_CREATE(p,true,fid,hdr); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp)); } public void modem_notify_file(u8 fid, u32 offset, u32 length, u8 id) @@ -585,7 +594,7 @@ REF_PRINT("NOTIFY[%d]@%d %d Bytes\n",fid,offset,length); ALP_ACTION_TAG(p,id,true); ALP_ACTION_F_TOUCH(p,true,fid,offset,length); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp)); } public void modem_delete_file(u8 fid, u8 id) @@ -596,7 +605,7 @@ REF_PRINT("DELETE[%d]\n",fid); ALP_ACTION_TAG(p,id,true); ALP_ACTION_F_DELETE(p,true,fid); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp)); } public void modem_delete_file_root(u8 fid, u8* root_key, u8 id) @@ -614,25 +623,25 @@ modem_add_root_permission(&tmp[ALP_ACTION_TAG_SIZE], root_key, &tmp[ALP_ACTION_TAG_SIZE + ALP_ACTION_PERM_REQ_OFFSET], ALP_ACTION_F_DELETE_SIZE); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(lastp-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (lastp-tmp)); } public void modem_send_raw_alp(u8* payload, u32 length, u8 id) { - ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + length); + ALLOC_BUFFER(u8, tmp,ALP_ACTION_TAG_SIZE + length); u8* p = tmp; REF_PRINT("ALP RAW %d Bytes\n",length); ALP_ACTION_TAG(p,id,true); // User Payload memcpy(p,payload,length);p+=length; - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp)); DEALLOC_BUFFER(tmp); } public void modem_send_file_content(u8* itf, u8 itf_length, void *istatus, u8 fid, void *data, u32 offset, u32 length, u8 id) { - ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_RSP_F_DATA_SIZE_MAX(length)); + ALLOC_BUFFER(u8, tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_RSP_F_DATA_SIZE_MAX(length)); u8* p = tmp; g_modem.user[id].istatus= (u8*)istatus; @@ -645,13 +654,13 @@ ALP_ACTION_NOP(p,true); } ALP_ACTION_RSP_F_DATA(p,fid,offset,length,data); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp)); DEALLOC_BUFFER(tmp); } public void modem_remote_read_file(u8* itf, u8 itf_length, void *istatus , u8 fid, void *data, u32 offset, u32 length, u8 id) { - ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_F_RD_DATA_SIZE_MAX); + ALLOC_BUFFER(u8, tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_F_RD_DATA_SIZE_MAX); u8* p = tmp; g_modem.user[id].data = (u8*)data; g_modem.user[id].istatus = (u8*)istatus; @@ -660,13 +669,13 @@ ALP_ACTION_TAG(p,id,true); ALP_ACTION_FORWARD(p,itf,itf_length); ALP_ACTION_F_RD_DATA(p,true,fid,offset,length); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp)); DEALLOC_BUFFER(tmp); } public void modem_remote_write_file(u8* itf, u8 itf_length, void *istatus, u8 fid, void *data, u32 offset, u32 length, u8 id) { - ALLOC_BUFFER(u8,tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_F_WR_DATA_SIZE_MAX(length)); + ALLOC_BUFFER(u8, tmp,ALP_ACTION_TAG_SIZE + ALP_ACTION_FORWARD_SIZE(itf_length) + ALP_ACTION_F_WR_DATA_SIZE_MAX(length)); u8* p = tmp; g_modem.user[id].istatus = (u8*)istatus; @@ -674,7 +683,7 @@ ALP_ACTION_TAG(p,id,true); ALP_ACTION_FORWARD(p,itf,itf_length); ALP_ACTION_F_WR_DATA(p,true,fid,offset,length,data); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp)); DEALLOC_BUFFER(tmp); } @@ -715,7 +724,7 @@ ALP_ACTION_F_WR_DATA_SIZE(offset,length) ); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp)); DEALLOC_BUFFER(tmp); } @@ -735,7 +744,7 @@ { ALP_ACTION_URCC_DIS(p,true,type,ifid,val); } - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp)); } public void modem_activate_itf(u8 type, u8 nb_dev, u8 ifid, u8 flags, u8 enable, u8 id) @@ -746,7 +755,7 @@ REF_PRINT("ACTIVATE ITFTYPE[%x]:%d\n",type,enable); ALP_ACTION_TAG(p,id,true); ALP_ACTION_ACTIVATE_ITF(p,true,enable,type,nb_dev,ifid,flags); - SERIAL_SEND(WC_FLOW_ALP_UNS,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_UNS, tmp, (p-tmp)); } public void modem_respond(s8 status, int id) @@ -757,7 +766,7 @@ if (id>=0) { ALP_ACTION_RSP_TAG(p,id,true,(status<0)?true:false); } ALP_ACTION_RSP_STATUS(p, g_modem.action, status); - SERIAL_SEND(WC_FLOW_ALP_RESP,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_RESP, tmp, (p-tmp)); } public void modem_respond_fprop(u8 fid, u8* hdr, int id) @@ -768,16 +777,16 @@ if (id>=0) { ALP_ACTION_RSP_TAG(p,id,true,false); } ALP_ACTION_RSP_F_PROP(p,fid,hdr); - SERIAL_SEND(WC_FLOW_ALP_RESP,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_RESP, tmp, (p-tmp)); } public void modem_respond_read(u8 fid,void *data, u32 offset, u32 length, int id) { - ALLOC_BUFFER(u8,tmp,ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_F_DATA_SIZE_MAX(length)); + ALLOC_BUFFER(u8, tmp,ALP_ACTION_RSP_TAG_SIZE + ALP_ACTION_RSP_F_DATA_SIZE_MAX(length)); u8* p = tmp; REF_PRINT("F_DATA[%d]@%d %d Bytes\n",fid,offset,length); if (id>=0) { ALP_ACTION_RSP_TAG(p,id,true,false); } ALP_ACTION_RSP_F_DATA(p,fid,offset,length,data); - SERIAL_SEND(WC_FLOW_ALP_RESP,tmp, (u8)(p-tmp)); + serial_send(WC_FLOW_ALP_RESP, tmp, (p-tmp)); DEALLOC_BUFFER(tmp); } \ No newline at end of file