Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

Committer:
Jeej
Date:
Fri Mar 10 16:01:27 2017 +0000
Revision:
15:24434827c575
Parent:
9:bd53ca2aece5
Child:
22:f2b01e5e087e
Sanity commit 4.7.232

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 15:24434827c575 47
Jeej 15:24434827c575 48
Jeej 0:82a60d86ab2e 49 //======================================================================
Jeej 0:82a60d86ab2e 50 // cup_cfg_t
Jeej 0:82a60d86ab2e 51 //----------------------------------------------------------------------
Jeej 0:82a60d86ab2e 52 /// @brief This is the structure of the CUP Config FILE.
Jeej 0:82a60d86ab2e 53 /// This file _MUST_ always be located a the same place (EEPROM
Jeej 0:82a60d86ab2e 54 /// Origin) as BOOT/CUP access it in a hardcoded way.
Jeej 0:82a60d86ab2e 55 /// !! Do NOT touch this except if you're a CUP Master !!
Jeej 0:82a60d86ab2e 56 //======================================================================
Jeej 0:82a60d86ab2e 57 TYPEDEF_STRUCT_PACKED
Jeej 0:82a60d86ab2e 58 {
Jeej 0:82a60d86ab2e 59 // The CUP Command
Jeej 0:82a60d86ab2e 60 uint16_t cmd;
Jeej 0:82a60d86ab2e 61 // Number of Archives to be CUP'ed
Jeej 0:82a60d86ab2e 62 uint16_t arch_nb;
Jeej 0:82a60d86ab2e 63 // This field has 2 meanings:
Jeej 0:82a60d86ab2e 64 // - when read-out it gives start address of CUP-Code file
Jeej 0:82a60d86ab2e 65 // - when written (for a CUP start) it gives the offset (in bytes) at
Jeej 0:82a60d86ab2e 66 // which the first archive is stored in CUP-Code file
Jeej 0:82a60d86ab2e 67 uint32_t src_offset;
Jeej 0:82a60d86ab2e 68 // CRC32 of the arch_nb concatenated archives starting at offset
Jeej 0:82a60d86ab2e 69 uint32_t signature;
Jeej 0:82a60d86ab2e 70 // TODO: Deciphering key. For now CUP MAX size
Jeej 0:82a60d86ab2e 71 uint32_t key;
Jeej 0:82a60d86ab2e 72 // Debug / Uart config
Jeej 0:82a60d86ab2e 73 uint32_t dbg_cfg;
Jeej 0:82a60d86ab2e 74 } cup_cfg_t;
Jeej 0:82a60d86ab2e 75
Jeej 15:24434827c575 76 TYPEDEF_STRUCT_PACKED
Jeej 15:24434827c575 77 {
Jeej 15:24434827c575 78 uint8_t* data;
Jeej 15:24434827c575 79 uint8_t cfg_fid;
Jeej 15:24434827c575 80 uint8_t code_fid;
Jeej 15:24434827c575 81 uint32_t code_size;
Jeej 15:24434827c575 82 uint32_t data_size;
Jeej 15:24434827c575 83 uint32_t local_mtu;
Jeej 15:24434827c575 84 uint32_t nb_archives;
Jeej 15:24434827c575 85 uint32_t signature;
Jeej 15:24434827c575 86 uint32_t mfg_id;
Jeej 15:24434827c575 87 uint32_t dev_id;
Jeej 15:24434827c575 88 uint32_t hw_id;
Jeej 15:24434827c575 89 uint8_t fw_id;
Jeej 15:24434827c575 90 uint8_t fw_major;
Jeej 15:24434827c575 91 uint8_t fw_minor;
Jeej 15:24434827c575 92 uint16_t fw_patch;
Jeej 15:24434827c575 93 uint32_t fw_hash;
Jeej 15:24434827c575 94 uint8_t target_fw_id;
Jeej 15:24434827c575 95 uint8_t target_fw_major;
Jeej 15:24434827c575 96 uint8_t target_fw_minor;
Jeej 15:24434827c575 97 } cup_param_t;
Jeej 4:23cb73bb11b3 98
Jeej 15:24434827c575 99
Jeej 15:24434827c575 100 extern cup_param_t const cup_modem;
Jeej 15:24434827c575 101 extern cup_param_t const cup_bootloader;
Jeej 15:24434827c575 102
Jeej 15:24434827c575 103 void cup_start_update(uint32_t offset, bool bootloader = false);
Jeej 0:82a60d86ab2e 104
Jeej 0:82a60d86ab2e 105