Program to update the D7A modem's firmware.
Dependencies: modem_ref_helper DebouncedInterrupt
cup.h@8:914b7aff5554, 2016-11-10 (annotated)
- Committer:
- Jeej
- Date:
- Thu Nov 10 17:18:42 2016 +0000
- Revision:
- 8:914b7aff5554
- Parent:
- 7:5b8648784381
- Child:
- 9:bd53ca2aece5
Release 4.6.0 - revised
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 | 0:82a60d86ab2e | 47 | //====================================================================== |
Jeej | 0:82a60d86ab2e | 48 | // cup_cfg_t |
Jeej | 0:82a60d86ab2e | 49 | //---------------------------------------------------------------------- |
Jeej | 0:82a60d86ab2e | 50 | /// @brief This is the structure of the CUP Config FILE. |
Jeej | 0:82a60d86ab2e | 51 | /// This file _MUST_ always be located a the same place (EEPROM |
Jeej | 0:82a60d86ab2e | 52 | /// Origin) as BOOT/CUP access it in a hardcoded way. |
Jeej | 0:82a60d86ab2e | 53 | /// !! Do NOT touch this except if you're a CUP Master !! |
Jeej | 0:82a60d86ab2e | 54 | //====================================================================== |
Jeej | 0:82a60d86ab2e | 55 | TYPEDEF_STRUCT_PACKED |
Jeej | 0:82a60d86ab2e | 56 | { |
Jeej | 0:82a60d86ab2e | 57 | // The CUP Command |
Jeej | 0:82a60d86ab2e | 58 | uint16_t cmd; |
Jeej | 0:82a60d86ab2e | 59 | // Number of Archives to be CUP'ed |
Jeej | 0:82a60d86ab2e | 60 | uint16_t arch_nb; |
Jeej | 0:82a60d86ab2e | 61 | // This field has 2 meanings: |
Jeej | 0:82a60d86ab2e | 62 | // - when read-out it gives start address of CUP-Code file |
Jeej | 0:82a60d86ab2e | 63 | // - when written (for a CUP start) it gives the offset (in bytes) at |
Jeej | 0:82a60d86ab2e | 64 | // which the first archive is stored in CUP-Code file |
Jeej | 0:82a60d86ab2e | 65 | uint32_t src_offset; |
Jeej | 0:82a60d86ab2e | 66 | // CRC32 of the arch_nb concatenated archives starting at offset |
Jeej | 0:82a60d86ab2e | 67 | uint32_t signature; |
Jeej | 0:82a60d86ab2e | 68 | // TODO: Deciphering key. For now CUP MAX size |
Jeej | 0:82a60d86ab2e | 69 | uint32_t key; |
Jeej | 0:82a60d86ab2e | 70 | // Debug / Uart config |
Jeej | 0:82a60d86ab2e | 71 | uint32_t dbg_cfg; |
Jeej | 0:82a60d86ab2e | 72 | } cup_cfg_t; |
Jeej | 0:82a60d86ab2e | 73 | |
Jeej | 4:23cb73bb11b3 | 74 | |
Jeej | 7:5b8648784381 | 75 | void cup_start_update(uint32_t src_offset, uint32_t max_size); |
Jeej | 0:82a60d86ab2e | 76 | |
Jeej | 0:82a60d86ab2e | 77 |