Driver optimized for modem version 5.3.217

Dependencies:   modem_ref_v5_3_217 WizziCom WizziDebug ram_fs

Committer:
Jeej
Date:
Mon Jan 25 12:43:00 2021 +0000
Revision:
71:6f03605e039b
Parent:
67:ff13d7325c01
Minor changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 0:e9dd36a15d07 1 #include "modem_ref_helper.h"
Jeej 0:e9dd36a15d07 2
Jeej 0:e9dd36a15d07 3 #if 0
Jeej 0:e9dd36a15d07 4 #define HELPER_PRINT(...) PRINT(__VA_ARGS__)
Jeej 0:e9dd36a15d07 5 #else
Jeej 0:e9dd36a15d07 6 #define HELPER_PRINT(...);
Jeej 0:e9dd36a15d07 7 #endif
Jeej 0:e9dd36a15d07 8
Jeej 28:d3b2889f9fab 9 #define MODEM_VERSION_MAJOR 5
Jeej 45:382159015b55 10 #define MODEM_VERSION_MINOR 0
Jeej 45:382159015b55 11 #define MODEM_VERSION_PATCH 36
Jeej 47:cf88f0f370cb 12 #define MODEM_DEVICE_ID 0x00001001
Jeej 15:c90efeb6bd6a 13
Jeej 67:ff13d7325c01 14
Jeej 0:e9dd36a15d07 15 static WizziCom* g_modem_com;
Jeej 44:7563b8e53e1d 16 static Semaphore g_modem_ready;
Jeej 44:7563b8e53e1d 17 static int8_t g_err;
Jeej 0:e9dd36a15d07 18
Jeej 67:ff13d7325c01 19 static int g_boot_nb;
Jeej 67:ff13d7325c01 20 static int g_read_nb;
Jeej 67:ff13d7325c01 21 static int g_swr_nb;
Jeej 67:ff13d7325c01 22 static int g_hwr_nb;
Jeej 67:ff13d7325c01 23 static int g_pwc_nb;
Jeej 67:ff13d7325c01 24 static int g_fail_nb;
Jeej 67:ff13d7325c01 25
Jeej 43:90c9221c1430 26 void modem_print_error(uint8_t itf, int8_t error)
Jeej 0:e9dd36a15d07 27 {
Jeej 48:beb06c0bdb1e 28 if (ALP_ERR_ITF_START >= error && ALP_ERR_ITF_END < error)
Jeej 0:e9dd36a15d07 29 {
Jeej 43:90c9221c1430 30 error -= ALP_ERR_ITF_START;
Jeej 43:90c9221c1430 31 // Interface specific error
Jeej 43:90c9221c1430 32 if (ALP_ITF_TYPE_HOST == itf)
Jeej 43:90c9221c1430 33 {
Jeej 43:90c9221c1430 34 PRINT("ITF[%02X] Error %d\r\n", itf, error);
Jeej 43:90c9221c1430 35 }
Jeej 43:90c9221c1430 36 else if (ALP_ITF_TYPE_COM == itf)
Jeej 43:90c9221c1430 37 {
Jeej 43:90c9221c1430 38 PRINT("ITF[%02X] Error %d\r\n", itf, error);
Jeej 43:90c9221c1430 39 }
Jeej 43:90c9221c1430 40 else if (ALP_ITF_TYPE_D7A == itf)
Jeej 43:90c9221c1430 41 {
Jeej 43:90c9221c1430 42 PRINT("ITF[%02X] ", itf);
Jeej 43:90c9221c1430 43 switch (error)
Jeej 43:90c9221c1430 44 {
Jeej 43:90c9221c1430 45 /// No error
Jeej 43:90c9221c1430 46 case D7A_ERROR_NO: // = 0,
Jeej 43:90c9221c1430 47 PRINT("D7A_ERROR_NO\r\n");
Jeej 43:90c9221c1430 48 break;
Jeej 43:90c9221c1430 49 /// Resource busy
Jeej 43:90c9221c1430 50 case D7A_ERROR_BUSY: // = -1,
Jeej 43:90c9221c1430 51 PRINT("D7A_ERROR_BUSY\r\n");
Jeej 43:90c9221c1430 52 break;
Jeej 43:90c9221c1430 53 /// Bad parameter
Jeej 43:90c9221c1430 54 case D7A_ERROR_BAD_PARAM: // = -2,
Jeej 43:90c9221c1430 55 PRINT("D7A_ERROR_BAD_PARAM\r\n");
Jeej 43:90c9221c1430 56 break;
Jeej 43:90c9221c1430 57 /// Duty cycle limit overflow
Jeej 43:90c9221c1430 58 case D7A_ERROR_DUTY_CYCLE: // = -3,
Jeej 43:90c9221c1430 59 PRINT("D7A_ERROR_DUTY_CYCLE\r\n");
Jeej 43:90c9221c1430 60 break;
Jeej 43:90c9221c1430 61 /// CCA timeout
Jeej 43:90c9221c1430 62 case D7A_ERROR_CCA_TO: // = -4,
Jeej 43:90c9221c1430 63 PRINT("D7A_ERROR_CCA_TO\r\n");
Jeej 43:90c9221c1430 64 break;
Jeej 43:90c9221c1430 65 /// Security frame counter overflow
Jeej 43:90c9221c1430 66 case D7A_ERROR_NLS_KEY: // = -5,
Jeej 43:90c9221c1430 67 PRINT("D7A_ERROR_NLS_KEY\r\n");
Jeej 43:90c9221c1430 68 break;
Jeej 43:90c9221c1430 69 /// TX stream underflow
Jeej 43:90c9221c1430 70 case D7A_ERROR_TX_UDF: // = -6,
Jeej 43:90c9221c1430 71 PRINT("D7A_ERROR_TX_UDF\r\n");
Jeej 43:90c9221c1430 72 break;
Jeej 43:90c9221c1430 73 /// RX stream overflow
Jeej 43:90c9221c1430 74 case D7A_ERROR_RX_OVF: // = -7,
Jeej 43:90c9221c1430 75 PRINT("D7A_ERROR_RX_OVF\r\n");
Jeej 43:90c9221c1430 76 break;
Jeej 43:90c9221c1430 77 /// RX checksum
Jeej 43:90c9221c1430 78 case D7A_ERROR_RX_CRC: // = -8,
Jeej 43:90c9221c1430 79 PRINT("D7A_ERROR_RX_CRC\r\n");
Jeej 43:90c9221c1430 80 break;
Jeej 43:90c9221c1430 81 /// Abort
Jeej 43:90c9221c1430 82 case D7A_ERROR_ABORT: // = -9,
Jeej 43:90c9221c1430 83 PRINT("D7A_ERROR_ABORT\r\n");
Jeej 43:90c9221c1430 84 break;
Jeej 43:90c9221c1430 85 /// No ACK received
Jeej 43:90c9221c1430 86 case D7A_ERROR_NO_ACK: // = -10,
Jeej 43:90c9221c1430 87 PRINT("D7A_ERROR_NO_ACK\r\n");
Jeej 43:90c9221c1430 88 break;
Jeej 43:90c9221c1430 89 /// RX timeout
Jeej 43:90c9221c1430 90 case D7A_ERROR_RX_TO: // = -11,
Jeej 43:90c9221c1430 91 PRINT("D7A_ERROR_RX_TO\r\n");
Jeej 43:90c9221c1430 92 break;
Jeej 43:90c9221c1430 93 default:
Jeej 43:90c9221c1430 94 PRINT("Unknown Error %d\r\n", error);
Jeej 43:90c9221c1430 95 break;
Jeej 43:90c9221c1430 96 }
Jeej 43:90c9221c1430 97 }
Jeej 43:90c9221c1430 98 else if (ALP_ITF_TYPE_LWAN == itf)
Jeej 43:90c9221c1430 99 {
Jeej 43:90c9221c1430 100 PRINT("ITF[%02X] Error %d\r\n", itf, error);
Jeej 43:90c9221c1430 101 }
Jeej 43:90c9221c1430 102 else
Jeej 43:90c9221c1430 103 {
Jeej 43:90c9221c1430 104 PRINT("ITF[%02X] Error %d\r\n", itf, error);
Jeej 43:90c9221c1430 105 }
Jeej 0:e9dd36a15d07 106 }
Jeej 43:90c9221c1430 107 else
Jeej 0:e9dd36a15d07 108 {
Jeej 43:90c9221c1430 109 PRINT("ALP: ");
Jeej 43:90c9221c1430 110 switch (error)
Jeej 43:90c9221c1430 111 {
Jeej 43:90c9221c1430 112 // Not really errors, more like status
Jeej 43:90c9221c1430 113 case ALP_ERR_ITF_FULL: // 0x02: For interfaces supporting buffering, indicates buffer reached maximum capacity (no data loss)
Jeej 43:90c9221c1430 114 PRINT("ALP_ERR_ITF_FULL\r\n");
Jeej 43:90c9221c1430 115 break;
Jeej 43:90c9221c1430 116 case ALP_ERR_PARTIAL_COMPLETION: // 0x01: Action received and partially completed at response. To be completed after response
Jeej 43:90c9221c1430 117 PRINT("ALP_ERR_PARTIAL_COMPLETION\r\n");
Jeej 43:90c9221c1430 118 break;
Jeej 43:90c9221c1430 119
Jeej 43:90c9221c1430 120 // ALP Errors
Jeej 43:90c9221c1430 121 case ALP_ERR_NONE: // 0x00: Action completed (OK)
Jeej 43:90c9221c1430 122 PRINT("ALP_ERR_NONE\r\n");
Jeej 43:90c9221c1430 123 break;
Jeej 43:90c9221c1430 124 case ALP_ERR_FILE_NOT_FOUND: // 0xFF: Error access file: File ID does not exist
Jeej 43:90c9221c1430 125 PRINT("ALP_ERR_FILE_NOT_FOUND\r\n");
Jeej 43:90c9221c1430 126 break;
Jeej 43:90c9221c1430 127 case ALP_ERR_FILE_EXIST: // 0xFE: Error create file: File ID already exists
Jeej 43:90c9221c1430 128 PRINT("ALP_ERR_FILE_EXIST\r\n");
Jeej 43:90c9221c1430 129 break;
Jeej 43:90c9221c1430 130 case ALP_ERR_FILE_NOT_RESTORABLE: // 0xFD: Error restore file: File is not restorable
Jeej 43:90c9221c1430 131 PRINT("ALP_ERR_FILE_NOT_RESTORABLEr\n");
Jeej 43:90c9221c1430 132 break;
Jeej 43:90c9221c1430 133 case ALP_ERR_PERMISSION_DENIED: // 0xFC: Error access file: Insufficient permissions
Jeej 43:90c9221c1430 134 PRINT("ALP_ERR_PERMISSION_DENIED\r\n");
Jeej 43:90c9221c1430 135 break;
Jeej 43:90c9221c1430 136 case ALP_ERR_LENGTH_OVERFLOW: // 0xFB: Error create file: Supplied length (in header) is beyond file limits
Jeej 43:90c9221c1430 137 PRINT("ALP_ERR_LENGTH_OVERFLOW\r\n");
Jeej 43:90c9221c1430 138 break;
Jeej 43:90c9221c1430 139 case ALP_ERR_ALLOC_OVERFLOW: // 0xFA: Error create file: Supplied allocation (in header) is beyond file limits
Jeej 43:90c9221c1430 140 PRINT("ALP_ERR_ALLOC_OVERFLOW\r\n");
Jeej 43:90c9221c1430 141 break;
Jeej 43:90c9221c1430 142 case ALP_ERR_OFFSET_OVERFLOW: // 0xF9: Error write: Supplied start offset is out of bounds of file allocation
Jeej 43:90c9221c1430 143 PRINT("ALP_ERR_OFFSET_OVERFLOW\r\n");
Jeej 43:90c9221c1430 144 break;
Jeej 43:90c9221c1430 145 case ALP_ERR_WRITE_OVERFLOW: // 0xF8: Error complete write: Supplied data goes beyond file allocation
Jeej 43:90c9221c1430 146 PRINT("ALP_ERR_WRITE_OVERFLOW\r\n");
Jeej 43:90c9221c1430 147 break;
Jeej 43:90c9221c1430 148 case ALP_ERR_WRITE_ERROR: // 0xF7: Error write: impossible to write in storage location
Jeej 43:90c9221c1430 149 PRINT("ALP_ERR_WRITE_ERROR\r\n");
Jeej 43:90c9221c1430 150 break;
Jeej 43:90c9221c1430 151 case ALP_ERR_OPERATION_UNKNOWN: // 0xF6: Error unknown Operation
Jeej 43:90c9221c1430 152 PRINT("ALP_ERR_OPERATION_UNKNOWN\r\n");
Jeej 43:90c9221c1430 153 break;
Jeej 43:90c9221c1430 154 case ALP_ERR_OPERAND_INCOMPLETE: // 0xF5: Error incomplete Operand
Jeej 43:90c9221c1430 155 PRINT("ALP_ERR_OPERAND_INCOMPLETE\r\n");
Jeej 43:90c9221c1430 156 break;
Jeej 43:90c9221c1430 157 case ALP_ERR_OPERAND_WRONG_FORMAT: // 0xF4: Error wrong Operand format
Jeej 43:90c9221c1430 158 PRINT("ALP_ERR_OPERAND_WRONG_FORMAT\r\n");
Jeej 43:90c9221c1430 159 break;
Jeej 43:90c9221c1430 160 case ALP_ERR_ITF_INVALID: // 0xF3: Error invalid interface
Jeej 43:90c9221c1430 161 PRINT("ALP_ERR_ITF_INVALID\r\n");
Jeej 43:90c9221c1430 162 break;
Jeej 43:90c9221c1430 163 case ALP_ERR_ITF_OVERFLOW: // 0xF2: Error interface overflown (i.e. resources exhausted, buffer full with data discarded)
Jeej 43:90c9221c1430 164 PRINT("ALP_ERR_ITF_OVERFLOW\r\n");
Jeej 43:90c9221c1430 165 break;
Jeej 43:90c9221c1430 166 case ALP_ERR_QUERY_FAIL: // 0xF1: (Group of) Query result was false (Informative error code).
Jeej 43:90c9221c1430 167 PRINT("ALP_ERR_QUERY_FAIL\r\n");
Jeej 43:90c9221c1430 168 break;
Jeej 48:beb06c0bdb1e 169 case ALP_ERR_ITF_NOT_SPECIFIED:
Jeej 48:beb06c0bdb1e 170 PRINT("ALP_ERR_ITF_NOT_SPECIFIED\r\n");
Jeej 48:beb06c0bdb1e 171 break;
Jeej 43:90c9221c1430 172
Jeej 43:90c9221c1430 173 // Other Errors
Jeej 43:90c9221c1430 174 case ALP_ERR_UNKNOWN: // 0x80: Unknown error
Jeej 43:90c9221c1430 175 PRINT("ALP_ERR_UNKNOWN\r\n");
Jeej 43:90c9221c1430 176 break;
Jeej 43:90c9221c1430 177 case ALP_ERR_FS_TIMEOUT: // 0x81: Internal FS Error
Jeej 43:90c9221c1430 178 PRINT("ALP_ERR_FS_TIMEOUT\r\n");
Jeej 43:90c9221c1430 179 break;
Jeej 43:90c9221c1430 180 case ALP_ERR_ITF_UNKNOWN: // 0x82: Unknown Interface
Jeej 43:90c9221c1430 181 PRINT("ALP_ERR_ITF_UNKNOWN\r\n");
Jeej 43:90c9221c1430 182 break;
Jeej 43:90c9221c1430 183 case ALP_ERR_ITF_TIMEOUT: // 0x83: Internal ITF Error
Jeej 43:90c9221c1430 184 PRINT("ALP_ERR_ITF_TIMEOUT\r\n");
Jeej 43:90c9221c1430 185 break;
Jeej 43:90c9221c1430 186 default:
Jeej 43:90c9221c1430 187 PRINT("Unknown Error %d\r\n", error);
Jeej 43:90c9221c1430 188 break;
Jeej 43:90c9221c1430 189 }
Jeej 0:e9dd36a15d07 190 }
Jeej 0:e9dd36a15d07 191 }
Jeej 0:e9dd36a15d07 192
Jeej 1:0ec0bae00588 193 int my_alp_itf_d7a_cfg_size(d7a_sp_cfg_t* cfg)
Jeej 1:0ec0bae00588 194 {
Jeej 1:0ec0bae00588 195 int size = sizeof(d7a_sp_cfg_t) - sizeof(d7a_addressee_t);
Jeej 1:0ec0bae00588 196 size += D7A_ADDR_LEN(cfg->addressee.ctrl);
Jeej 1:0ec0bae00588 197 return size;
Jeej 1:0ec0bae00588 198 }
Jeej 1:0ec0bae00588 199
Jeej 0:e9dd36a15d07 200 // ============================================================}}}
Jeej 0:e9dd36a15d07 201
Jeej 0:e9dd36a15d07 202 // Serial adapters to WizziLab's own architecture
Jeej 0:e9dd36a15d07 203 // ============================================================{{{
Jeej 0:e9dd36a15d07 204
Jeej 1:0ec0bae00588 205 static void modem_serial_input(WizziCom* com, WizziComPacket_t* pkt)
Jeej 0:e9dd36a15d07 206 {
Jeej 0:e9dd36a15d07 207 modem_input(wizzicom_type_to_flow(pkt->type), pkt->data, pkt->length);
Jeej 0:e9dd36a15d07 208 }
Jeej 0:e9dd36a15d07 209
Jeej 1:0ec0bae00588 210 static int modem_serial_send(uint8_t* data1, uint8_t size1, uint8_t* data2, uint8_t size2)
Jeej 0:e9dd36a15d07 211 {
Jeej 0:e9dd36a15d07 212 (void)size1;
Jeej 0:e9dd36a15d07 213
Jeej 0:e9dd36a15d07 214 // Retrieve Flow ID from header and send packet
Jeej 0:e9dd36a15d07 215 g_modem_com->send((WizziComPacketType)wizzicom_flow_to_type(data1[4]), size2, data2);
Jeej 0:e9dd36a15d07 216
Jeej 0:e9dd36a15d07 217 return (size1 + size2);
Jeej 0:e9dd36a15d07 218 }
Jeej 0:e9dd36a15d07 219
Jeej 23:4ef5c82089a3 220 // Callback for id User
Jeej 0:e9dd36a15d07 221 static void my_main_callback(uint8_t terminal, int8_t err, uint8_t id)
Jeej 0:e9dd36a15d07 222 {
Jeej 0:e9dd36a15d07 223 (void)id;
Jeej 0:e9dd36a15d07 224
Jeej 44:7563b8e53e1d 225 g_err = err;
Jeej 44:7563b8e53e1d 226
Jeej 44:7563b8e53e1d 227 //modem_print_error(0xC0, g_err);
Jeej 44:7563b8e53e1d 228
Jeej 0:e9dd36a15d07 229 if (terminal)
Jeej 0:e9dd36a15d07 230 {
Jeej 44:7563b8e53e1d 231 g_modem_ready.release();
Jeej 0:e9dd36a15d07 232 }
Jeej 0:e9dd36a15d07 233 }
Jeej 0:e9dd36a15d07 234
Jeej 0:e9dd36a15d07 235 // Misc
Jeej 0:e9dd36a15d07 236 // ============================================================{{{
Jeej 44:7563b8e53e1d 237
Jeej 44:7563b8e53e1d 238 void modem_notify_host_rev(revision_t* data, alp_file_header_t* header, uint8_t* root_key)
Jeej 44:7563b8e53e1d 239 {
Jeej 44:7563b8e53e1d 240 uint8_t id = modem_get_id(my_main_callback);
Jeej 44:7563b8e53e1d 241
Jeej 44:7563b8e53e1d 242 // Write the version to the version file.
Jeej 44:7563b8e53e1d 243 // This file is notified on write.
Jeej 44:7563b8e53e1d 244 modem_write_file_root(FID_HOST_REV, (void*)data, 0, HAL_U32_BYTE_SWAP(header->alloc), root_key, id);
Jeej 67:ff13d7325c01 245 MODEM_WAIT_RESP(g_modem_ready);
Jeej 44:7563b8e53e1d 246
Jeej 49:035512e64fdd 247 // Error when writing to the file
Jeej 44:7563b8e53e1d 248 if (ALP_ERR_NONE != g_err)
Jeej 44:7563b8e53e1d 249 {
Jeej 49:035512e64fdd 250 // File exists
Jeej 49:035512e64fdd 251 if (ALP_ERR_FILE_NOT_FOUND != g_err)
Jeej 49:035512e64fdd 252 {
Jeej 49:035512e64fdd 253 // Delete old file
Jeej 49:035512e64fdd 254 modem_delete_file_root(FID_HOST_REV, root_key, id);
Jeej 67:ff13d7325c01 255 MODEM_WAIT_RESP(g_modem_ready);
Jeej 49:035512e64fdd 256 }
Jeej 44:7563b8e53e1d 257
Jeej 44:7563b8e53e1d 258 // Recreate file
Jeej 44:7563b8e53e1d 259 modem_create_file(FID_HOST_REV, header, id);
Jeej 67:ff13d7325c01 260 MODEM_WAIT_RESP(g_modem_ready);
Jeej 44:7563b8e53e1d 261
Jeej 44:7563b8e53e1d 262 // Retry writing to the file
Jeej 44:7563b8e53e1d 263 modem_write_file_root(FID_HOST_REV, (void*)data, 0, HAL_U32_BYTE_SWAP(header->alloc), root_key, id);
Jeej 67:ff13d7325c01 264 MODEM_WAIT_RESP(g_modem_ready);
Jeej 44:7563b8e53e1d 265 }
Jeej 44:7563b8e53e1d 266
Jeej 44:7563b8e53e1d 267 modem_free_id(id);
Jeej 44:7563b8e53e1d 268 }
Jeej 0:e9dd36a15d07 269
Jeej 0:e9dd36a15d07 270 void modem_update_file(uint8_t fid, alp_file_header_t* header, uint8_t* data)
Jeej 0:e9dd36a15d07 271 {
Jeej 0:e9dd36a15d07 272 alp_file_header_t remote_header;
Jeej 23:4ef5c82089a3 273 uint8_t id = modem_get_id(my_main_callback);
Jeej 0:e9dd36a15d07 274
Jeej 0:e9dd36a15d07 275 memset(&remote_header, 0, sizeof(alp_file_header_t));
Jeej 0:e9dd36a15d07 276
Jeej 0:e9dd36a15d07 277 // Read remote header
Jeej 23:4ef5c82089a3 278 modem_read_fprop(fid, &remote_header, id);
Jeej 67:ff13d7325c01 279 MODEM_WAIT_RESP(g_modem_ready);
Jeej 0:e9dd36a15d07 280
Jeej 0:e9dd36a15d07 281 // Add file in local file system
Jeej 0:e9dd36a15d07 282 ram_fs_new(fid, (uint8_t*)header, data);
Jeej 0:e9dd36a15d07 283
Jeej 0:e9dd36a15d07 284 // Update file
Jeej 0:e9dd36a15d07 285 if (memcmp(&remote_header, header, sizeof(alp_file_header_t)))
Jeej 0:e9dd36a15d07 286 {
Jeej 0:e9dd36a15d07 287 HELPER_PRINT("Updating file %d\n", fid);
Jeej 0:e9dd36a15d07 288 // Delete
Jeej 23:4ef5c82089a3 289 modem_delete_file(fid, id);
Jeej 67:ff13d7325c01 290 MODEM_WAIT_RESP(g_modem_ready);
Jeej 0:e9dd36a15d07 291 // Restore in local file system
Jeej 0:e9dd36a15d07 292 ram_fs_new(fid, (uint8_t*)header, data);
Jeej 0:e9dd36a15d07 293 // Re-create
Jeej 0:e9dd36a15d07 294 if (data)
Jeej 0:e9dd36a15d07 295 {
Jeej 23:4ef5c82089a3 296 modem_declare_file(fid, header, true, id);
Jeej 0:e9dd36a15d07 297 }
Jeej 0:e9dd36a15d07 298 else
Jeej 0:e9dd36a15d07 299 {
Jeej 23:4ef5c82089a3 300 modem_create_file(fid, header, id);
Jeej 0:e9dd36a15d07 301 }
Jeej 67:ff13d7325c01 302 MODEM_WAIT_RESP(g_modem_ready);
Jeej 0:e9dd36a15d07 303 }
Jeej 0:e9dd36a15d07 304 else
Jeej 0:e9dd36a15d07 305 {
Jeej 0:e9dd36a15d07 306 HELPER_PRINT("File %d up to date\n", fid);
Jeej 0:e9dd36a15d07 307 }
Jeej 0:e9dd36a15d07 308
Jeej 23:4ef5c82089a3 309 modem_free_id(id);
Jeej 0:e9dd36a15d07 310 }
Jeej 0:e9dd36a15d07 311
Jeej 12:04c32f2e03b7 312 Semaphore boot(0);
Jeej 12:04c32f2e03b7 313 void my_startup_boot(u8 cause, u16 number)
Jeej 12:04c32f2e03b7 314 {
Jeej 12:04c32f2e03b7 315 HELPER_PRINT("Modem BOOT[%c] #%d\r\n", cause, number);
Jeej 12:04c32f2e03b7 316 boot.release();
Jeej 12:04c32f2e03b7 317 }
Jeej 12:04c32f2e03b7 318
Jeej 0:e9dd36a15d07 319 void modem_helper_open(modem_callbacks_t* callbacks)
Jeej 0:e9dd36a15d07 320 {
Jeej 0:e9dd36a15d07 321 static union {
Jeej 0:e9dd36a15d07 322 uint8_t b[8];
Jeej 0:e9dd36a15d07 323 uint32_t w[2];
Jeej 0:e9dd36a15d07 324 } uid;
Jeej 0:e9dd36a15d07 325 revision_t rev;
Jeej 66:a529d603be20 326 uint8_t id;
Jeej 12:04c32f2e03b7 327
Jeej 67:ff13d7325c01 328 g_boot_nb++;
Jeej 67:ff13d7325c01 329
Jeej 12:04c32f2e03b7 330 // Override boot callback to catch the first boot message
Jeej 12:04c32f2e03b7 331 modem_callbacks_t boot_callbacks = {
Jeej 12:04c32f2e03b7 332 .read = NULL,
Jeej 12:04c32f2e03b7 333 .write = NULL,
Jeej 12:04c32f2e03b7 334 .read_fprop = NULL,
Jeej 12:04c32f2e03b7 335 .flush = NULL,
Jeej 12:04c32f2e03b7 336 .remove = NULL,
Jeej 12:04c32f2e03b7 337 .udata = NULL,
Jeej 12:04c32f2e03b7 338 .lqual = NULL,
Jeej 12:04c32f2e03b7 339 .ldown = NULL,
Jeej 12:04c32f2e03b7 340 .reset = NULL,
Jeej 49:035512e64fdd 341 .boot = my_startup_boot,
Jeej 49:035512e64fdd 342 .busy = NULL,
Jeej 49:035512e64fdd 343 .itf_busy = NULL,
Jeej 12:04c32f2e03b7 344 };
Jeej 0:e9dd36a15d07 345
Jeej 0:e9dd36a15d07 346 // Open modem Com port
Jeej 20:8e6a7f4e06a1 347 g_modem_com = new WizziCom(MODEM_PIN_RX, MODEM_PIN_TX, MODEM_PIN_IRQ_IN, MODEM_PIN_IRQ_OUT);
Jeej 0:e9dd36a15d07 348
Jeej 66:a529d603be20 349 // open with user callbacks
Jeej 66:a529d603be20 350 modem_open(modem_serial_send, callbacks);
Jeej 12:04c32f2e03b7 351
Jeej 1:0ec0bae00588 352 // Redirect All Port traffic to modem_serial_input
Jeej 1:0ec0bae00588 353 g_modem_com->attach(modem_serial_input, WizziComPacketUntreated);
Jeej 66:a529d603be20 354
Jeej 66:a529d603be20 355 // Wait for modem power up
Jeej 66:a529d603be20 356 ThisThread::sleep_for(100);
Jeej 12:04c32f2e03b7 357
Jeej 66:a529d603be20 358 // Try reading UID
Jeej 66:a529d603be20 359 id = modem_get_id(my_main_callback);
Jeej 66:a529d603be20 360 modem_read_file(D7A_FID_UID, uid.b, 0, 8, id);
Jeej 66:a529d603be20 361 if (!g_modem_ready.try_acquire_for(200))
Jeej 66:a529d603be20 362 {
Jeej 66:a529d603be20 363 HELPER_PRINT("Trying software reset...\n");
Jeej 66:a529d603be20 364
Jeej 66:a529d603be20 365 // Open driver to catch boot packet
Jeej 66:a529d603be20 366 modem_close();
Jeej 66:a529d603be20 367 modem_open(NULL, &boot_callbacks);
Jeej 12:04c32f2e03b7 368
Jeej 66:a529d603be20 369 // Try software reset
Jeej 66:a529d603be20 370 g_modem_com->send(WizziComPacketSysReset, 0, NULL);
Jeej 66:a529d603be20 371
Jeej 66:a529d603be20 372 if (!boot.try_acquire_for(1000))
Jeej 66:a529d603be20 373 {
Jeej 66:a529d603be20 374 HELPER_PRINT("Trying hardware reset...\n");
Jeej 66:a529d603be20 375
Jeej 66:a529d603be20 376 // Assert reset pin
Jeej 66:a529d603be20 377 DigitalOut reset_low(MODEM_PIN_RESET, 0);
Jeej 66:a529d603be20 378 ThisThread::sleep_for(100);
Jeej 66:a529d603be20 379
Jeej 66:a529d603be20 380 // Release reset pin
Jeej 66:a529d603be20 381 DigitalIn reset_release(MODEM_PIN_RESET);
Jeej 66:a529d603be20 382
Jeej 66:a529d603be20 383 if (!boot.try_acquire_for(1000))
Jeej 66:a529d603be20 384 {
Jeej 66:a529d603be20 385 // Modem not responding!
Jeej 67:ff13d7325c01 386 HELPER_PRINT("Trying power cycle.\n");
Jeej 67:ff13d7325c01 387
Jeej 67:ff13d7325c01 388 // Assert power pin
Jeej 67:ff13d7325c01 389 DigitalOut reset_low(D12, 0);
Jeej 67:ff13d7325c01 390 ThisThread::sleep_for(1000);
Jeej 67:ff13d7325c01 391
Jeej 67:ff13d7325c01 392 // Release reset pin
Jeej 67:ff13d7325c01 393 DigitalIn reset_release(D12);
Jeej 67:ff13d7325c01 394
Jeej 67:ff13d7325c01 395 if (!boot.try_acquire_for(1000))
Jeej 67:ff13d7325c01 396 {
Jeej 67:ff13d7325c01 397 // Modem not responding!
Jeej 67:ff13d7325c01 398 g_fail_nb++;
Jeej 67:ff13d7325c01 399 PRINT("Failed to open modem.\n");
Jeej 67:ff13d7325c01 400 }
Jeej 67:ff13d7325c01 401 else
Jeej 67:ff13d7325c01 402 {
Jeej 67:ff13d7325c01 403 g_pwc_nb++;
Jeej 67:ff13d7325c01 404 PRINT("Modem is up after power cycle.\n");
Jeej 67:ff13d7325c01 405 }
Jeej 66:a529d603be20 406 }
Jeej 66:a529d603be20 407 else
Jeej 66:a529d603be20 408 {
Jeej 67:ff13d7325c01 409 g_hwr_nb++;
Jeej 67:ff13d7325c01 410 PRINT("Modem is up after hardware reset.\n");
Jeej 66:a529d603be20 411 }
Jeej 66:a529d603be20 412 }
Jeej 66:a529d603be20 413 else
Jeej 66:a529d603be20 414 {
Jeej 67:ff13d7325c01 415 g_swr_nb++;
Jeej 67:ff13d7325c01 416 PRINT("Modem is up after software reset.\n");
Jeej 66:a529d603be20 417 }
Jeej 66:a529d603be20 418 }
Jeej 66:a529d603be20 419 else
Jeej 66:a529d603be20 420 {
Jeej 67:ff13d7325c01 421 g_read_nb++;
Jeej 67:ff13d7325c01 422 PRINT("Modem is up.\n");
Jeej 66:a529d603be20 423 }
Jeej 12:04c32f2e03b7 424
Jeej 67:ff13d7325c01 425 PRINT("Boot stats: boot:%d read:%d swr:%d hwr:%d pwc:%d fail:%d\n", g_boot_nb, g_read_nb, g_swr_nb, g_hwr_nb, g_pwc_nb, g_fail_nb);
Jeej 67:ff13d7325c01 426
Jeej 12:04c32f2e03b7 427 // Re-open with user callbacks
Jeej 12:04c32f2e03b7 428 modem_close();
Jeej 1:0ec0bae00588 429 modem_open(modem_serial_send, callbacks);
Jeej 0:e9dd36a15d07 430
Jeej 66:a529d603be20 431 id = modem_get_id(my_main_callback);
Jeej 0:e9dd36a15d07 432
Jeej 23:4ef5c82089a3 433 HELPER_PRINT("Start Modem Process (id=%d)\n", id);
Jeej 58:f7105abdceed 434 ThisThread::sleep_for(1000);
Jeej 0:e9dd36a15d07 435
Jeej 23:4ef5c82089a3 436 modem_read_file(D7A_FID_UID, uid.b, 0, 8, id);
Jeej 67:ff13d7325c01 437 MODEM_WAIT_RESP(g_modem_ready);
Jeej 0:e9dd36a15d07 438
Jeej 23:4ef5c82089a3 439 modem_read_file(D7A_FID_FIRMWARE_VERSION, (uint8_t*)&rev, 0, sizeof(revision_t), id);
Jeej 67:ff13d7325c01 440 MODEM_WAIT_RESP(g_modem_ready);
Jeej 0:e9dd36a15d07 441
Jeej 0:e9dd36a15d07 442 PRINT("------------ D7A Modem infos ------------\r\n");
Jeej 0:e9dd36a15d07 443 PRINT_DATA(" - UID: ", "%02X", uid.b, 8, "\r\n");
Jeej 0:e9dd36a15d07 444 PRINT(" - Manufacturer ID: %08X\r\n", rev.manufacturer_id);
Jeej 0:e9dd36a15d07 445 PRINT(" - Device ID: %08X\r\n", rev.device_id);
Jeej 0:e9dd36a15d07 446 PRINT(" - Hardware version: %08X\r\n", rev.hw_version);
Jeej 8:95ba5519a9f7 447 PRINT(" - Firmware version: v%d.%d.%d [%02X]\r\n", rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch, rev.fw_version.id);
Jeej 9:5d850e56ac20 448 PRINT(" - CUP max size: %d\r\n", rev.cup_max_size);
Jeej 0:e9dd36a15d07 449 PRINT("-----------------------------------------\r\n");
Jeej 47:cf88f0f370cb 450
Jeej 47:cf88f0f370cb 451 if (MODEM_DEVICE_ID == rev.device_id)
Jeej 0:e9dd36a15d07 452 {
Jeej 47:cf88f0f370cb 453 // Check version
Jeej 47:cf88f0f370cb 454 uint32_t rev_sum1 = (rev.fw_version.major << 24) | (rev.fw_version.minor << 16) | rev.fw_version.patch;
Jeej 47:cf88f0f370cb 455 uint32_t rev_sum2 = (MODEM_VERSION_MAJOR << 24) | (MODEM_VERSION_MINOR << 16) | MODEM_VERSION_PATCH;
Jeej 47:cf88f0f370cb 456 if (rev_sum1 < rev_sum2)
Jeej 47:cf88f0f370cb 457 {
Jeej 47:cf88f0f370cb 458 PRINT("\r\nYou need a modem at version %d.%d.%d or above to use this Driver.\r\n"
Jeej 47:cf88f0f370cb 459 "You can:\r\n"
Jeej 47:cf88f0f370cb 460 " - Check modem updates on the Dash7Board:\r\n"
Jeej 47:cf88f0f370cb 461 " Go to your site's version manager.\r\n"
Jeej 47:cf88f0f370cb 462 " - Check modem updates by importing:\r\n"
Jeej 47:cf88f0f370cb 463 " https://developer.mbed.org/teams/WizziLab/code/D7A_WM_Updater\r\n"
Jeej 47:cf88f0f370cb 464 " - Choose the right 'modem_ref_helper' revision.\r\n"
Jeej 47:cf88f0f370cb 465 " Right click on modem_ref_helper -> Revision.\r\n"
Jeej 47:cf88f0f370cb 466 , MODEM_VERSION_MAJOR, MODEM_VERSION_MINOR, MODEM_VERSION_PATCH);
Jeej 47:cf88f0f370cb 467
Jeej 58:f7105abdceed 468 ThisThread::sleep_for(osWaitForever);
Jeej 47:cf88f0f370cb 469 }
Jeej 47:cf88f0f370cb 470 }
Jeej 47:cf88f0f370cb 471 else
Jeej 47:cf88f0f370cb 472 {
Jeej 47:cf88f0f370cb 473 // Do not check version
Jeej 47:cf88f0f370cb 474 PRINT("/!\\ Not a modem firmware /!\\\r\n");
Jeej 0:e9dd36a15d07 475 }
Jeej 0:e9dd36a15d07 476
Jeej 23:4ef5c82089a3 477 modem_free_id(id);
Jeej 0:e9dd36a15d07 478 }
Jeej 67:ff13d7325c01 479
Jeej 67:ff13d7325c01 480 void modem_helper_close(void)
Jeej 67:ff13d7325c01 481 {
Jeej 67:ff13d7325c01 482 modem_close();
Jeej 67:ff13d7325c01 483 delete g_modem_com;
Jeej 67:ff13d7325c01 484 }
Jeej 67:ff13d7325c01 485