Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Tue Aug 20 13:51:30 2019 +0000
Revision:
32:e3ee65b5b835
Parent:
31:b9117984247d
Release SH2050 v5.3.217

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 22:f2b01e5e087e 1 #include "modem_ref_helper.h"
Jeej 22:f2b01e5e087e 2
Jeej 22:f2b01e5e087e 3 // ============================================================}}}
Jeej 22:f2b01e5e087e 4
Jeej 22:f2b01e5e087e 5 // Callbacks to MODEM's ALP requests
Jeej 22:f2b01e5e087e 6 // ============================================================{{{
Jeej 22:f2b01e5e087e 7 void my_read(u8 fid, u32 offset, u32 length, int id)
Jeej 22:f2b01e5e087e 8 {
Jeej 31:b9117984247d 9 modem_respond(ALP_ERR_FILE_NOT_FOUND, id);
Jeej 22:f2b01e5e087e 10 }
Jeej 22:f2b01e5e087e 11
Jeej 22:f2b01e5e087e 12 void my_write(u8 fid, void *data, u32 offset, u32 length, int id)
Jeej 22:f2b01e5e087e 13 {
Jeej 31:b9117984247d 14 modem_respond(ALP_ERR_FILE_NOT_FOUND, id);
Jeej 22:f2b01e5e087e 15 }
Jeej 22:f2b01e5e087e 16
Jeej 22:f2b01e5e087e 17 void my_read_fprop(u8 fid, int id)
Jeej 22:f2b01e5e087e 18 {
Jeej 31:b9117984247d 19 modem_respond(ALP_ERR_FILE_NOT_FOUND, id);
Jeej 22:f2b01e5e087e 20 }
Jeej 22:f2b01e5e087e 21
Jeej 22:f2b01e5e087e 22 void my_flush(u8 fid, int id)
Jeej 22:f2b01e5e087e 23 {
Jeej 31:b9117984247d 24 modem_respond(ALP_ERR_FILE_NOT_FOUND, id);
Jeej 22:f2b01e5e087e 25 }
Jeej 22:f2b01e5e087e 26
Jeej 22:f2b01e5e087e 27 void my_delete(u8 fid, int id)
Jeej 22:f2b01e5e087e 28 {
Jeej 31:b9117984247d 29 modem_respond(ALP_ERR_FILE_NOT_FOUND, id);
Jeej 22:f2b01e5e087e 30 }
Jeej 22:f2b01e5e087e 31
Jeej 29:aa16a927f0eb 32 void my_udata(void *data, u32 length)
Jeej 29:aa16a927f0eb 33 {
Jeej 29:aa16a927f0eb 34 uint8_t* p = (uint8_t*)data;
Jeej 29:aa16a927f0eb 35 int32_t rem = length;
Jeej 29:aa16a927f0eb 36 alp_parsed_chunk_t r;
Jeej 29:aa16a927f0eb 37 d7a_sp_res_t* istat;
Jeej 29:aa16a927f0eb 38
Jeej 29:aa16a927f0eb 39 do {
Jeej 29:aa16a927f0eb 40 uint32_t parsed = alp_parse_chunk(&p, &r);
Jeej 29:aa16a927f0eb 41 if (!parsed)
Jeej 29:aa16a927f0eb 42 {
Jeej 29:aa16a927f0eb 43 // Discard the payload in case of parsing error.
Jeej 29:aa16a927f0eb 44 PRINT("Parsing error!\r\n");
Jeej 29:aa16a927f0eb 45 break;
Jeej 29:aa16a927f0eb 46 }
Jeej 29:aa16a927f0eb 47 rem -= parsed;
Jeej 29:aa16a927f0eb 48
Jeej 29:aa16a927f0eb 49 switch (r.type)
Jeej 29:aa16a927f0eb 50 {
Jeej 29:aa16a927f0eb 51 // Interface status
Jeej 29:aa16a927f0eb 52 case ALP_OPCODE_RSP_ISTATUS:
Jeej 29:aa16a927f0eb 53 // D7A Interface
Jeej 29:aa16a927f0eb 54 if (ALP_ITF_TYPE_D7A == r.meta.itf.type)
Jeej 29:aa16a927f0eb 55 {
Jeej 29:aa16a927f0eb 56 union {
Jeej 29:aa16a927f0eb 57 u8 b[8];
Jeej 29:aa16a927f0eb 58 u32 w[2];
Jeej 29:aa16a927f0eb 59 } uid;
Jeej 29:aa16a927f0eb 60
Jeej 29:aa16a927f0eb 61 // ISTATUS can come either alone or together with ALP_OPCODE_RSP_F_DATA
Jeej 29:aa16a927f0eb 62 // but there should be only one per payload, moreover it will come first
Jeej 29:aa16a927f0eb 63 istat = (d7a_sp_res_t*)r.data;
Jeej 29:aa16a927f0eb 64 memcpy(uid.b,istat->addressee.id,8);
Jeej 29:aa16a927f0eb 65
Jeej 29:aa16a927f0eb 66 PRINT("Got accessed by UID:%08X%08X SNR: %3ddB RXLEV: -%-3ddBm LB: %3ddB\n",
Jeej 29:aa16a927f0eb 67 HAL_U32_BYTE_SWAP(uid.w[0]), HAL_U32_BYTE_SWAP(uid.w[1]),
Jeej 29:aa16a927f0eb 68 istat->snr, istat->rxlev, istat->lb);
Jeej 29:aa16a927f0eb 69 }
Jeej 29:aa16a927f0eb 70 else
Jeej 29:aa16a927f0eb 71 {
Jeej 29:aa16a927f0eb 72 PRINT("Got accessed by unknown Interface 0x%02X\n", r.meta.itf.type);
Jeej 29:aa16a927f0eb 73 }
Jeej 29:aa16a927f0eb 74 break;
Jeej 29:aa16a927f0eb 75 // Data return
Jeej 29:aa16a927f0eb 76 case ALP_OPCODE_RSP_F_DATA:
Jeej 29:aa16a927f0eb 77 // RSP_F_DATA can come either alone or together with ISTATUS
Jeej 29:aa16a927f0eb 78 PRINT("Got UNS File[%3d]@%d %d Bytes\n", r.meta.f_data.fid, r.meta.f_data.offset, r.meta.f_data.length);
Jeej 29:aa16a927f0eb 79 break;
Jeej 29:aa16a927f0eb 80 default:
Jeej 29:aa16a927f0eb 81 PRINT("Untreated OPCODE %d\n", r.type);
Jeej 29:aa16a927f0eb 82 break;
Jeej 29:aa16a927f0eb 83 }
Jeej 29:aa16a927f0eb 84 } while (rem > 0);
Jeej 22:f2b01e5e087e 85 }
Jeej 22:f2b01e5e087e 86
Jeej 22:f2b01e5e087e 87 void my_lqual(u8 ifid, int per)
Jeej 22:f2b01e5e087e 88 {
Jeej 22:f2b01e5e087e 89 PRINT("Interface File [%3d] LQUAL : %d%% PER\r\n", ifid, per);
Jeej 22:f2b01e5e087e 90 }
Jeej 22:f2b01e5e087e 91
Jeej 22:f2b01e5e087e 92 void my_ldown(u8 ifid)
Jeej 22:f2b01e5e087e 93 {
Jeej 22:f2b01e5e087e 94 PRINT("Interface File [%3d] LDOWN\r\n", ifid);
Jeej 22:f2b01e5e087e 95 }
Jeej 22:f2b01e5e087e 96
Jeej 22:f2b01e5e087e 97 void my_reset(void)
Jeej 22:f2b01e5e087e 98 {
Jeej 29:aa16a927f0eb 99 PRINT("Restarting application...\r\n");
Jeej 29:aa16a927f0eb 100 FLUSH();
Jeej 22:f2b01e5e087e 101 NVIC_SystemReset();
Jeej 22:f2b01e5e087e 102 }
Jeej 22:f2b01e5e087e 103
Jeej 22:f2b01e5e087e 104 void my_boot(u8 cause, u16 number)
Jeej 22:f2b01e5e087e 105 {
Jeej 29:aa16a927f0eb 106 PRINT("Modem BOOT[%c] #%d\r\n", cause, number);
Jeej 22:f2b01e5e087e 107
Jeej 22:f2b01e5e087e 108 // Modem re-booted, restart APP
Jeej 22:f2b01e5e087e 109 my_reset();
Jeej 29:aa16a927f0eb 110 }
Jeej 29:aa16a927f0eb 111
Jeej 29:aa16a927f0eb 112 void my_busy(u8 busy)
Jeej 29:aa16a927f0eb 113 {
Jeej 29:aa16a927f0eb 114 if (busy)
Jeej 29:aa16a927f0eb 115 {
Jeej 29:aa16a927f0eb 116 PRINT("Modem Busy\r\n");
Jeej 29:aa16a927f0eb 117
Jeej 29:aa16a927f0eb 118 /* Stop report, do not use modem */
Jeej 29:aa16a927f0eb 119 /* Wait for modem reboot or modem not busy */
Jeej 29:aa16a927f0eb 120 }
Jeej 29:aa16a927f0eb 121 else
Jeej 29:aa16a927f0eb 122 {
Jeej 29:aa16a927f0eb 123 PRINT("Modem not Busy\r\n");
Jeej 29:aa16a927f0eb 124
Jeej 29:aa16a927f0eb 125 /* Resume reports */
Jeej 29:aa16a927f0eb 126 }
Jeej 22:f2b01e5e087e 127 }