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