Program to update the D7A modem's firmware.

Dependencies:   modem_ref_helper DebouncedInterrupt

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?

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