Dash7Board Code Upgrade Protocol demonstration code.
Dependencies: modem_ref_helper CRC
cup_app.cpp@8:6b7d38139b43, 2020-05-28 (annotated)
- Committer:
- Jeej
- Date:
- Thu May 28 09:11:58 2020 +0000
- Revision:
- 8:6b7d38139b43
- Child:
- 9:d110f2b86831
Updated for v5.3.283.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jeej | 8:6b7d38139b43 | 1 | #include "modem_ref_helper.h" |
Jeej | 8:6b7d38139b43 | 2 | #include "cup_app.h" |
Jeej | 8:6b7d38139b43 | 3 | #include "cup.h" |
Jeej | 8:6b7d38139b43 | 4 | #include "ram_fs.h" |
Jeej | 8:6b7d38139b43 | 5 | #include "files.h" |
Jeej | 8:6b7d38139b43 | 6 | |
Jeej | 8:6b7d38139b43 | 7 | //====================================================================== |
Jeej | 8:6b7d38139b43 | 8 | // cup_cfg_bcast_init |
Jeej | 8:6b7d38139b43 | 9 | //---------------------------------------------------------------------- |
Jeej | 8:6b7d38139b43 | 10 | /// @brief Init CUP status file. |
Jeej | 8:6b7d38139b43 | 11 | /// Called when a new CUP upload is started |
Jeej | 8:6b7d38139b43 | 12 | /// @param void |
Jeej | 8:6b7d38139b43 | 13 | /// @retval u8 TRUE when the CFG (UCAST) file is touched |
Jeej | 8:6b7d38139b43 | 14 | //====================================================================== |
Jeej | 8:6b7d38139b43 | 15 | uint8_t cup_cfg_bcast_init(void) |
Jeej | 8:6b7d38139b43 | 16 | { |
Jeej | 8:6b7d38139b43 | 17 | cup_cfg_bcast_header_t h; |
Jeej | 8:6b7d38139b43 | 18 | ram_fs_read(FID_APP_CUP_CFG_BCAST, offsetof(cup_cfg_bcast_t, header), sizeofof(cup_cfg_bcast_t, header), (uint8_t*)&h); |
Jeej | 8:6b7d38139b43 | 19 | PRINT("CUP BCAST START 0x%08x CHUNK %d LEN %d CMD 0x%04X TO %d SIG 0x%08x\r\n", |
Jeej | 8:6b7d38139b43 | 20 | h.start, h.chunk, h.len, h.cmd, h.to, h.sig_new); |
Jeej | 8:6b7d38139b43 | 21 | |
Jeej | 8:6b7d38139b43 | 22 | // Update the status only when a valid command is present |
Jeej | 8:6b7d38139b43 | 23 | if (((h.cmd == CUP_CMD_UPGRADE_UPLOAD) || (h.cmd == CUP_CMD_UPGRADE_UPLOAD_ALT) || (h.cmd == CUP_CMD_UPGRADE_FILE_START)) |
Jeej | 8:6b7d38139b43 | 24 | && (h.len) && (h.chunk) && (h.sig_new) && (h.to)) |
Jeej | 8:6b7d38139b43 | 25 | { |
Jeej | 8:6b7d38139b43 | 26 | if ((h.sig_curr != h.sig_new) || (!h.missed)) |
Jeej | 8:6b7d38139b43 | 27 | { |
Jeej | 8:6b7d38139b43 | 28 | // the signature changed, start over |
Jeej | 8:6b7d38139b43 | 29 | memset(&f_cup_cfg_bcast.bitmap, 0, sizeofof(cup_cfg_bcast_t, bitmap)); |
Jeej | 8:6b7d38139b43 | 30 | |
Jeej | 8:6b7d38139b43 | 31 | // Init the transfer status |
Jeej | 8:6b7d38139b43 | 32 | h.sig_curr = h.sig_new; |
Jeej | 8:6b7d38139b43 | 33 | h.missed = KAL_DIV_CEILING(h.len, h.chunk); |
Jeej | 8:6b7d38139b43 | 34 | h.crc_ok = 0; |
Jeej | 8:6b7d38139b43 | 35 | ram_fs_write(FID_APP_CUP_CFG_BCAST, 0, sizeof(cup_cfg_bcast_header_t), (uint8_t*)&h); |
Jeej | 8:6b7d38139b43 | 36 | PRINT("CUP BCAST RESET, MISSED %d\r\n", h.missed); |
Jeej | 8:6b7d38139b43 | 37 | } |
Jeej | 8:6b7d38139b43 | 38 | else |
Jeej | 8:6b7d38139b43 | 39 | { |
Jeej | 8:6b7d38139b43 | 40 | PRINT("CUP BCAST CONTINUE, MISSED %d\r\n", h.missed); |
Jeej | 8:6b7d38139b43 | 41 | } |
Jeej | 8:6b7d38139b43 | 42 | |
Jeej | 8:6b7d38139b43 | 43 | return TRUE; |
Jeej | 8:6b7d38139b43 | 44 | } |
Jeej | 8:6b7d38139b43 | 45 | |
Jeej | 8:6b7d38139b43 | 46 | return FALSE; |
Jeej | 8:6b7d38139b43 | 47 | } |
Jeej | 8:6b7d38139b43 | 48 | |
Jeej | 8:6b7d38139b43 | 49 | //====================================================================== |
Jeej | 8:6b7d38139b43 | 50 | // cup_cfg_bcast_update |
Jeej | 8:6b7d38139b43 | 51 | //---------------------------------------------------------------------- |
Jeej | 8:6b7d38139b43 | 52 | /// @brief Update CUP status file. |
Jeej | 8:6b7d38139b43 | 53 | /// Called when data is written in the CUP data file |
Jeej | 8:6b7d38139b43 | 54 | /// @param offset uint32_t offset of the new chunk |
Jeej | 8:6b7d38139b43 | 55 | /// @param plen uint32_t length of the new chunk |
Jeej | 8:6b7d38139b43 | 56 | /// @retval void |
Jeej | 8:6b7d38139b43 | 57 | //====================================================================== |
Jeej | 8:6b7d38139b43 | 58 | uint8_t cup_cfg_bcast_update(uint32_t offset, uint32_t plen) |
Jeej | 8:6b7d38139b43 | 59 | { |
Jeej | 8:6b7d38139b43 | 60 | // update header |
Jeej | 8:6b7d38139b43 | 61 | cup_cfg_bcast_header_t h; |
Jeej | 8:6b7d38139b43 | 62 | ram_fs_read(FID_APP_CUP_CFG_BCAST, offsetof(cup_cfg_bcast_t, header), sizeofof(cup_cfg_bcast_t, header), (uint8_t*)&h); |
Jeej | 8:6b7d38139b43 | 63 | |
Jeej | 8:6b7d38139b43 | 64 | // Update the status only when a valid command is present |
Jeej | 8:6b7d38139b43 | 65 | if (((h.cmd == CUP_CMD_UPGRADE_UPLOAD) || (h.cmd == CUP_CMD_UPGRADE_UPLOAD_ALT) || (h.cmd == CUP_CMD_UPGRADE_FILE_START)) |
Jeej | 8:6b7d38139b43 | 66 | && (h.chunk) && (h.missed)) |
Jeej | 8:6b7d38139b43 | 67 | { |
Jeej | 8:6b7d38139b43 | 68 | // check that the plen is compatible |
Jeej | 8:6b7d38139b43 | 69 | if ((plen == h.chunk) || (plen == (h.len % h.chunk))) |
Jeej | 8:6b7d38139b43 | 70 | { |
Jeej | 8:6b7d38139b43 | 71 | uint16_t idx = (offset - h.start) / h.chunk; |
Jeej | 8:6b7d38139b43 | 72 | uint32_t fof = idx/8 + sizeof(cup_cfg_bcast_header_t); |
Jeej | 8:6b7d38139b43 | 73 | |
Jeej | 8:6b7d38139b43 | 74 | // update bitmap |
Jeej | 8:6b7d38139b43 | 75 | if (fof < sizeof(cup_cfg_bcast_t)) |
Jeej | 8:6b7d38139b43 | 76 | { |
Jeej | 8:6b7d38139b43 | 77 | // read-modify-write one bit |
Jeej | 8:6b7d38139b43 | 78 | u8 bmp, bit = (1 << (idx & 7)); |
Jeej | 8:6b7d38139b43 | 79 | ram_fs_read(FID_APP_CUP_CFG_BCAST, fof, 1, &bmp); |
Jeej | 8:6b7d38139b43 | 80 | if (!(bmp & bit)) |
Jeej | 8:6b7d38139b43 | 81 | { |
Jeej | 8:6b7d38139b43 | 82 | h.missed--; |
Jeej | 8:6b7d38139b43 | 83 | bmp |= bit; |
Jeej | 8:6b7d38139b43 | 84 | ram_fs_write(FID_APP_CUP_CFG_BCAST, fof, 1, &bmp); |
Jeej | 8:6b7d38139b43 | 85 | } |
Jeej | 8:6b7d38139b43 | 86 | |
Jeej | 8:6b7d38139b43 | 87 | // CRC check when done or on the last chunk |
Jeej | 8:6b7d38139b43 | 88 | if ((!h.missed) || (idx == (h.len/h.chunk))) |
Jeej | 8:6b7d38139b43 | 89 | { |
Jeej | 8:6b7d38139b43 | 90 | extern uint32_t stream_crc; |
Jeej | 8:6b7d38139b43 | 91 | |
Jeej | 8:6b7d38139b43 | 92 | // Archive / Command check (~ 30 ms on 80k archive) |
Jeej | 8:6b7d38139b43 | 93 | h.crc_ok = (stream_crc == h.sig_curr) ? TRUE : FALSE; |
Jeej | 8:6b7d38139b43 | 94 | PRINT("CUP BCAST CRC=%08x / Expect %08x\r\n", stream_crc, h.sig_curr); |
Jeej | 8:6b7d38139b43 | 95 | } |
Jeej | 8:6b7d38139b43 | 96 | |
Jeej | 8:6b7d38139b43 | 97 | ram_fs_write(FID_APP_CUP_CFG_BCAST, 0, sizeof(cup_cfg_bcast_header_t), (uint8_t*)&h); |
Jeej | 8:6b7d38139b43 | 98 | } |
Jeej | 8:6b7d38139b43 | 99 | } |
Jeej | 8:6b7d38139b43 | 100 | } |
Jeej | 8:6b7d38139b43 | 101 | |
Jeej | 8:6b7d38139b43 | 102 | PRINT("CUP OFF %d CHUNK %d/%d LEN %d MISSING %d\r\n", |
Jeej | 8:6b7d38139b43 | 103 | offset, |
Jeej | 8:6b7d38139b43 | 104 | ((offset - h.start) / h.chunk) + 1, |
Jeej | 8:6b7d38139b43 | 105 | (h.len / h.chunk) + 1, |
Jeej | 8:6b7d38139b43 | 106 | plen, |
Jeej | 8:6b7d38139b43 | 107 | h.missed |
Jeej | 8:6b7d38139b43 | 108 | ); |
Jeej | 8:6b7d38139b43 | 109 | |
Jeej | 8:6b7d38139b43 | 110 | return h.crc_ok; |
Jeej | 8:6b7d38139b43 | 111 | } |