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