Program to update the D7A modem's firmware.
Dependencies: modem_ref_helper DebouncedInterrupt
cup.h@15:24434827c575, 2017-03-10 (annotated)
- Committer:
- Jeej
- Date:
- Fri Mar 10 16:01:27 2017 +0000
- Revision:
- 15:24434827c575
- Parent:
- 9:bd53ca2aece5
- Child:
- 22:f2b01e5e087e
Sanity commit 4.7.232
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jeej | 0:82a60d86ab2e | 1 | #include "mbed.h" |
Jeej | 0:82a60d86ab2e | 2 | #include "d7a.h" |
Jeej | 0:82a60d86ab2e | 3 | #include "bin.h" |
Jeej | 0:82a60d86ab2e | 4 | |
Jeej | 0:82a60d86ab2e | 5 | #define D7A_READ(_ret, _fid, _offset, _size, _root_key) do{\ |
Jeej | 0:82a60d86ab2e | 6 | d7a_msg_t** _msg = d7a_read((_fid), (_offset), (_size), (_root_key));\ |
Jeej | 0:82a60d86ab2e | 7 | ASSERT(_msg[0]->err >= D7A_ERR_NONE, "READ failed. err %d\r\n", _msg[0]->err);\ |
Jeej | 0:82a60d86ab2e | 8 | ASSERT(_msg[0]->data, "READ failed. No data in response\r\n");\ |
Jeej | 0:82a60d86ab2e | 9 | ASSERT(_msg[0]->data->offset == 0, "READ failed. Wrong data offset %d/%d\r\n", _msg[0]->data->offset, (_offset));\ |
Jeej | 0:82a60d86ab2e | 10 | ASSERT(_msg[0]->data->length == (_size), "READ failed. Wrong data length %d/%d\r\n", _msg[0]->data->length, (_size));\ |
Jeej | 0:82a60d86ab2e | 11 | memcpy((_ret), _msg[0]->data->buf, (_size));\ |
Jeej | 0:82a60d86ab2e | 12 | d7a_free_msg(_msg);\ |
Jeej | 0:82a60d86ab2e | 13 | } while (0) |
Jeej | 0:82a60d86ab2e | 14 | |
Jeej | 0:82a60d86ab2e | 15 | #define D7A_WRITE(_data, _fid, _offset, _size, _root_key) do{\ |
Jeej | 0:82a60d86ab2e | 16 | d7a_msg_t** _msg = d7a_write((_fid), (_offset), (_size), (_data), (_root_key));\ |
Jeej | 0:82a60d86ab2e | 17 | ASSERT(_msg[0]->err == D7A_ERR_NONE, "WRITE failed. err %d\r\n", _msg[0]->err);\ |
Jeej | 0:82a60d86ab2e | 18 | d7a_free_msg(_msg);\ |
Jeej | 0:82a60d86ab2e | 19 | } while (0) |
Jeej | 0:82a60d86ab2e | 20 | |
Jeej | 0:82a60d86ab2e | 21 | #define D7A_FLUSH(_fid, _root_key) do{\ |
Jeej | 0:82a60d86ab2e | 22 | d7a_msg_t** _msg = d7a_flush((_fid), (_root_key));\ |
Jeej | 0:82a60d86ab2e | 23 | ASSERT(_msg[0]->err >= D7A_ERR_NONE, "FLUSH failed. err %d\r\n", _msg[0]->err);\ |
Jeej | 0:82a60d86ab2e | 24 | d7a_free_msg(_msg);\ |
Jeej | 0:82a60d86ab2e | 25 | } while (0) |
Jeej | 0:82a60d86ab2e | 26 | |
Jeej | 0:82a60d86ab2e | 27 | //------------------------------------------------------------------ |
Jeej | 0:82a60d86ab2e | 28 | // CUP Package files structure: |
Jeej | 0:82a60d86ab2e | 29 | // | SIZE | ADDR | BINARY | PAD | CRC | Next Archive |
Jeej | 0:82a60d86ab2e | 30 | // | 4B | 4B | XB | 0-3 B | 4B | ... |
Jeej | 0:82a60d86ab2e | 31 | // | | | ... |
Jeej | 0:82a60d86ab2e | 32 | // |<------------------CRC----------------------->| | ... |
Jeej | 0:82a60d86ab2e | 33 | // |<-----------------------SIZE------------------------>| ... |
Jeej | 0:82a60d86ab2e | 34 | // |
Jeej | 0:82a60d86ab2e | 35 | // Archive must be word-aligned |
Jeej | 0:82a60d86ab2e | 36 | // Archives can be concatenated |
Jeej | 0:82a60d86ab2e | 37 | // ADDR is the destination address of the installed archive |
Jeej | 0:82a60d86ab2e | 38 | // SIZE accounts for whole archive (including itself) |
Jeej | 0:82a60d86ab2e | 39 | // Binary size must be multiple of word (i.e pad=4) |
Jeej | 0:82a60d86ab2e | 40 | // CRC calculated on whole archive (obviously excluding itself) |
Jeej | 0:82a60d86ab2e | 41 | // Values (size,addr) are stored little-endian |
Jeej | 0:82a60d86ab2e | 42 | |
Jeej | 0:82a60d86ab2e | 43 | |
Jeej | 7:5b8648784381 | 44 | extern uint8_t root_key[CUP_DEFAULT_KEY_SIZE]; |
Jeej | 7:5b8648784381 | 45 | extern uint8_t root_key_size; |
Jeej | 0:82a60d86ab2e | 46 | |
Jeej | 15:24434827c575 | 47 | |
Jeej | 15:24434827c575 | 48 | |
Jeej | 0:82a60d86ab2e | 49 | //====================================================================== |
Jeej | 0:82a60d86ab2e | 50 | // cup_cfg_t |
Jeej | 0:82a60d86ab2e | 51 | //---------------------------------------------------------------------- |
Jeej | 0:82a60d86ab2e | 52 | /// @brief This is the structure of the CUP Config FILE. |
Jeej | 0:82a60d86ab2e | 53 | /// This file _MUST_ always be located a the same place (EEPROM |
Jeej | 0:82a60d86ab2e | 54 | /// Origin) as BOOT/CUP access it in a hardcoded way. |
Jeej | 0:82a60d86ab2e | 55 | /// !! Do NOT touch this except if you're a CUP Master !! |
Jeej | 0:82a60d86ab2e | 56 | //====================================================================== |
Jeej | 0:82a60d86ab2e | 57 | TYPEDEF_STRUCT_PACKED |
Jeej | 0:82a60d86ab2e | 58 | { |
Jeej | 0:82a60d86ab2e | 59 | // The CUP Command |
Jeej | 0:82a60d86ab2e | 60 | uint16_t cmd; |
Jeej | 0:82a60d86ab2e | 61 | // Number of Archives to be CUP'ed |
Jeej | 0:82a60d86ab2e | 62 | uint16_t arch_nb; |
Jeej | 0:82a60d86ab2e | 63 | // This field has 2 meanings: |
Jeej | 0:82a60d86ab2e | 64 | // - when read-out it gives start address of CUP-Code file |
Jeej | 0:82a60d86ab2e | 65 | // - when written (for a CUP start) it gives the offset (in bytes) at |
Jeej | 0:82a60d86ab2e | 66 | // which the first archive is stored in CUP-Code file |
Jeej | 0:82a60d86ab2e | 67 | uint32_t src_offset; |
Jeej | 0:82a60d86ab2e | 68 | // CRC32 of the arch_nb concatenated archives starting at offset |
Jeej | 0:82a60d86ab2e | 69 | uint32_t signature; |
Jeej | 0:82a60d86ab2e | 70 | // TODO: Deciphering key. For now CUP MAX size |
Jeej | 0:82a60d86ab2e | 71 | uint32_t key; |
Jeej | 0:82a60d86ab2e | 72 | // Debug / Uart config |
Jeej | 0:82a60d86ab2e | 73 | uint32_t dbg_cfg; |
Jeej | 0:82a60d86ab2e | 74 | } cup_cfg_t; |
Jeej | 0:82a60d86ab2e | 75 | |
Jeej | 15:24434827c575 | 76 | TYPEDEF_STRUCT_PACKED |
Jeej | 15:24434827c575 | 77 | { |
Jeej | 15:24434827c575 | 78 | uint8_t* data; |
Jeej | 15:24434827c575 | 79 | uint8_t cfg_fid; |
Jeej | 15:24434827c575 | 80 | uint8_t code_fid; |
Jeej | 15:24434827c575 | 81 | uint32_t code_size; |
Jeej | 15:24434827c575 | 82 | uint32_t data_size; |
Jeej | 15:24434827c575 | 83 | uint32_t local_mtu; |
Jeej | 15:24434827c575 | 84 | uint32_t nb_archives; |
Jeej | 15:24434827c575 | 85 | uint32_t signature; |
Jeej | 15:24434827c575 | 86 | uint32_t mfg_id; |
Jeej | 15:24434827c575 | 87 | uint32_t dev_id; |
Jeej | 15:24434827c575 | 88 | uint32_t hw_id; |
Jeej | 15:24434827c575 | 89 | uint8_t fw_id; |
Jeej | 15:24434827c575 | 90 | uint8_t fw_major; |
Jeej | 15:24434827c575 | 91 | uint8_t fw_minor; |
Jeej | 15:24434827c575 | 92 | uint16_t fw_patch; |
Jeej | 15:24434827c575 | 93 | uint32_t fw_hash; |
Jeej | 15:24434827c575 | 94 | uint8_t target_fw_id; |
Jeej | 15:24434827c575 | 95 | uint8_t target_fw_major; |
Jeej | 15:24434827c575 | 96 | uint8_t target_fw_minor; |
Jeej | 15:24434827c575 | 97 | } cup_param_t; |
Jeej | 4:23cb73bb11b3 | 98 | |
Jeej | 15:24434827c575 | 99 | |
Jeej | 15:24434827c575 | 100 | extern cup_param_t const cup_modem; |
Jeej | 15:24434827c575 | 101 | extern cup_param_t const cup_bootloader; |
Jeej | 15:24434827c575 | 102 | |
Jeej | 15:24434827c575 | 103 | void cup_start_update(uint32_t offset, bool bootloader = false); |
Jeej | 0:82a60d86ab2e | 104 | |
Jeej | 0:82a60d86ab2e | 105 |