Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

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?

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