Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Wed Oct 26 10:03:59 2016 +0000
Revision:
0:82a60d86ab2e
Child:
1:765933092750
release v4.4.10

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 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 0:82a60d86ab2e 52 extern const 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