Dash7Board Code Upgrade Protocol demonstration code.

Dependencies:   modem_ref_helper CRC

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?

UserRevisionLine numberNew 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 }