Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Fri Oct 21 15:31:45 2016 +0000
Revision:
66:492b1d7ba370
Parent:
63:afd046faedb0
Child:
67:9ac9d109b80a
Wait after sending data to not release the resource too soon

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 43:28202405094d 1 #include "mbed.h"
Jeej 43:28202405094d 2 #include "rtos.h"
Jeej 43:28202405094d 3 #include "dbg.h"
Jeej 43:28202405094d 4 #include "d7a.h"
Jeej 43:28202405094d 5 #include "d7a_com.h"
Jeej 43:28202405094d 6 #include "d7a_common.h"
Jeej 43:28202405094d 7 #include "d7a_fs.h"
Jeej 43:28202405094d 8 #include "d7a_modem.h"
Jeej 43:28202405094d 9 #include "d7a_sys.h"
Jeej 43:28202405094d 10 #include "d7a_alp.h"
Jeej 43:28202405094d 11
Jeej 55:5ea18a3a01b9 12 #define FIRST_IFT_FILE (108)
Jeej 55:5ea18a3a01b9 13
Jeej 49:81d5bddb02f0 14 bool g_open = false;
Jeej 66:492b1d7ba370 15 bool g_started = false;
Jeej 49:81d5bddb02f0 16 bool g_local_fs = false;
Jeej 43:28202405094d 17
Jeej 49:81d5bddb02f0 18 d7a_errors_t d7a_open(const d7a_com_config_t* com_config, PinName reset_pin, const d7a_callbacks_t* callbacks)
Jeej 43:28202405094d 19 {
Jeej 45:b85384e7d825 20 FPRINT("\r\n");
Jeej 45:b85384e7d825 21
Jeej 66:492b1d7ba370 22 d7a_errors_t err = D7A_ERR_STATE;
Jeej 49:81d5bddb02f0 23
Jeej 49:81d5bddb02f0 24 if (g_open)
Jeej 49:81d5bddb02f0 25 {
Jeej 51:644de6fe1ee7 26 WARNING(false, "D7A Already open\r\n");
Jeej 49:81d5bddb02f0 27 return D7A_ERR_NONE;
Jeej 49:81d5bddb02f0 28 }
Jeej 49:81d5bddb02f0 29
Jeej 55:5ea18a3a01b9 30 do
Jeej 55:5ea18a3a01b9 31 {
Jeej 55:5ea18a3a01b9 32
Jeej 55:5ea18a3a01b9 33 err = d7a_com_open(com_config);
Jeej 56:da34fc11e760 34 if (err < D7A_ERR_NONE) break;
Jeej 55:5ea18a3a01b9 35
Jeej 55:5ea18a3a01b9 36 err = d7a_sys_open();
Jeej 56:da34fc11e760 37 if (err < D7A_ERR_NONE) break;
Jeej 55:5ea18a3a01b9 38
Jeej 55:5ea18a3a01b9 39 err = d7a_fs_open(callbacks->write_file, callbacks->read_file);
Jeej 56:da34fc11e760 40 if (err < D7A_ERR_NONE) break;
Jeej 55:5ea18a3a01b9 41
Jeej 59:b42eae56b51b 42 err = d7a_alp_open(callbacks->unsolicited_msg);
Jeej 56:da34fc11e760 43 if (err < D7A_ERR_NONE) break;
Jeej 55:5ea18a3a01b9 44
Jeej 55:5ea18a3a01b9 45 err = d7a_modem_open(reset_pin, callbacks->notif_done);
Jeej 56:da34fc11e760 46 if (err < D7A_ERR_NONE) break;
Jeej 55:5ea18a3a01b9 47
Jeej 55:5ea18a3a01b9 48 if (callbacks->write_file != NULL && callbacks->read_file != NULL)
Jeej 55:5ea18a3a01b9 49 {
Jeej 55:5ea18a3a01b9 50 g_local_fs = true;
Jeej 55:5ea18a3a01b9 51 }
Jeej 55:5ea18a3a01b9 52
Jeej 66:492b1d7ba370 53 g_open = true;
Jeej 66:492b1d7ba370 54 g_started = true;
Jeej 55:5ea18a3a01b9 55
Jeej 55:5ea18a3a01b9 56 } while (0);
Jeej 49:81d5bddb02f0 57
Jeej 63:afd046faedb0 58 WARNING(err == D7A_ERR_NONE, "%s err %d\r\n", __FUNCTION__, err);
Jeej 49:81d5bddb02f0 59
Jeej 49:81d5bddb02f0 60 return err;
Jeej 43:28202405094d 61 }
Jeej 43:28202405094d 62
Jeej 53:3e4aa4b57090 63
Jeej 45:b85384e7d825 64 d7a_errors_t d7a_close(void)
Jeej 43:28202405094d 65 {
Jeej 45:b85384e7d825 66 FPRINT("\r\n");
Jeej 45:b85384e7d825 67
Jeej 66:492b1d7ba370 68 d7a_errors_t err = D7A_ERR_STATE;
Jeej 49:81d5bddb02f0 69
Jeej 56:da34fc11e760 70 do
Jeej 56:da34fc11e760 71 {
Jeej 56:da34fc11e760 72 err = d7a_com_close();
Jeej 56:da34fc11e760 73 if (err < D7A_ERR_NONE) break;
Jeej 56:da34fc11e760 74
Jeej 56:da34fc11e760 75 err = d7a_modem_close();
Jeej 56:da34fc11e760 76 if (err < D7A_ERR_NONE) break;
Jeej 56:da34fc11e760 77
Jeej 56:da34fc11e760 78 err = d7a_fs_close();
Jeej 56:da34fc11e760 79 if (err < D7A_ERR_NONE) break;
Jeej 56:da34fc11e760 80
Jeej 56:da34fc11e760 81 err = d7a_sys_close();
Jeej 56:da34fc11e760 82 } while (0);
Jeej 45:b85384e7d825 83
Jeej 63:afd046faedb0 84 WARNING(err == D7A_ERR_NONE, "%s err %d\r\n", __FUNCTION__, err);
Jeej 55:5ea18a3a01b9 85
Jeej 50:30440c9aeb7c 86 return err;
Jeej 43:28202405094d 87 }
Jeej 43:28202405094d 88
Jeej 43:28202405094d 89
Jeej 45:b85384e7d825 90 d7a_errors_t d7a_start(void)
Jeej 43:28202405094d 91 {
Jeej 45:b85384e7d825 92 FPRINT("\r\n");
Jeej 45:b85384e7d825 93
Jeej 66:492b1d7ba370 94 d7a_errors_t err = D7A_ERR_STATE;
Jeej 49:81d5bddb02f0 95
Jeej 66:492b1d7ba370 96 if (!g_started)
Jeej 66:492b1d7ba370 97 {
Jeej 66:492b1d7ba370 98 err = d7a_modem_start();
Jeej 66:492b1d7ba370 99 if (err == D7A_ERR_NONE)
Jeej 66:492b1d7ba370 100 {
Jeej 66:492b1d7ba370 101 g_started = true;
Jeej 66:492b1d7ba370 102 }
Jeej 66:492b1d7ba370 103 }
Jeej 45:b85384e7d825 104
Jeej 63:afd046faedb0 105 WARNING(err == D7A_ERR_NONE, "%s err %d\r\n", __FUNCTION__, err);
Jeej 55:5ea18a3a01b9 106
Jeej 50:30440c9aeb7c 107 return err;
Jeej 43:28202405094d 108 }
Jeej 43:28202405094d 109
Jeej 53:3e4aa4b57090 110
Jeej 45:b85384e7d825 111 d7a_errors_t d7a_stop(void)
Jeej 43:28202405094d 112 {
Jeej 45:b85384e7d825 113 FPRINT("\r\n");
Jeej 45:b85384e7d825 114
Jeej 66:492b1d7ba370 115 d7a_errors_t err = D7A_ERR_STATE;
Jeej 49:81d5bddb02f0 116
Jeej 66:492b1d7ba370 117 if (g_started)
Jeej 66:492b1d7ba370 118 {
Jeej 66:492b1d7ba370 119 err = d7a_modem_stop();
Jeej 66:492b1d7ba370 120 if (err == D7A_ERR_NONE)
Jeej 66:492b1d7ba370 121 {
Jeej 66:492b1d7ba370 122 g_started = false;
Jeej 66:492b1d7ba370 123 }
Jeej 66:492b1d7ba370 124 }
Jeej 45:b85384e7d825 125
Jeej 63:afd046faedb0 126 WARNING(err == D7A_ERR_NONE, "%s err %d\r\n", __FUNCTION__, err);
Jeej 55:5ea18a3a01b9 127
Jeej 50:30440c9aeb7c 128 return err;
Jeej 43:28202405094d 129 }
Jeej 43:28202405094d 130
Jeej 53:3e4aa4b57090 131
Jeej 55:5ea18a3a01b9 132 d7a_errors_t d7a_create(const uint8_t file_id, d7a_fs_storage_t prop, d7a_fs_perm_t perm, uint32_t size, uint32_t alloc, d7a_action_t action, alp_rpol_t retry)
Jeej 43:28202405094d 133 {
Jeej 45:b85384e7d825 134 FPRINT("\r\n");
Jeej 45:b85384e7d825 135
Jeej 66:492b1d7ba370 136 d7a_errors_t err = D7A_ERR_STATE;
Jeej 45:b85384e7d825 137
Jeej 45:b85384e7d825 138 DPRINT("Create %d.\r\n", file_id);
Jeej 45:b85384e7d825 139
Jeej 66:492b1d7ba370 140 if (g_started)
Jeej 66:492b1d7ba370 141 {
Jeej 66:492b1d7ba370 142 register_file_param_t file_infos = {
Jeej 66:492b1d7ba370 143 .fid = file_id,
Jeej 66:492b1d7ba370 144 .type = RAM,
Jeej 66:492b1d7ba370 145 .afid = action,
Jeej 66:492b1d7ba370 146 .ifid = FIRST_IFT_FILE + retry, // The interface files match the retry policies
Jeej 66:492b1d7ba370 147 .prop = (uint8_t)prop | ((action)? FS_ACT_EN : 0),
Jeej 66:492b1d7ba370 148 .perm = (uint8_t)perm,
Jeej 66:492b1d7ba370 149 .size = size,
Jeej 66:492b1d7ba370 150 .alloc = alloc,
Jeej 66:492b1d7ba370 151 };
Jeej 66:492b1d7ba370 152
Jeej 66:492b1d7ba370 153 err = d7a_modem_register(&file_infos);
Jeej 66:492b1d7ba370 154 }
Jeej 45:b85384e7d825 155
Jeej 45:b85384e7d825 156 DPRINT("Create %d Done. err %d\r\n", file_id, err);
Jeej 45:b85384e7d825 157
Jeej 63:afd046faedb0 158 WARNING(err == D7A_ERR_NONE, "%s FID %d err %d\r\n", __FUNCTION__, file_id, err);
Jeej 55:5ea18a3a01b9 159
Jeej 45:b85384e7d825 160 return err;
Jeej 43:28202405094d 161 }
Jeej 43:28202405094d 162
Jeej 53:3e4aa4b57090 163
Jeej 55:5ea18a3a01b9 164 d7a_errors_t d7a_declare(const uint8_t file_id, d7a_fs_storage_t prop, d7a_fs_perm_t perm, uint32_t length, uint32_t alloc, d7a_action_t action, alp_rpol_t retry)
Jeej 43:28202405094d 165 {
Jeej 45:b85384e7d825 166 FPRINT("\r\n");
Jeej 49:81d5bddb02f0 167
Jeej 66:492b1d7ba370 168 d7a_errors_t err = D7A_ERR_STATE;
Jeej 46:665391110051 169
Jeej 45:b85384e7d825 170 DPRINT("Declare %d.\r\n", file_id);
Jeej 45:b85384e7d825 171
Jeej 55:5ea18a3a01b9 172 ASSERT(g_local_fs, "You cannot delare a file if the write_file/read_file callbacks are not specified\r\n");
Jeej 49:81d5bddb02f0 173
Jeej 66:492b1d7ba370 174 if (g_started)
Jeej 66:492b1d7ba370 175 {
Jeej 66:492b1d7ba370 176 register_file_param_t file_infos = {
Jeej 66:492b1d7ba370 177 .fid = file_id,
Jeej 66:492b1d7ba370 178 .type = HOST+RAM,
Jeej 66:492b1d7ba370 179 .afid = action,
Jeej 66:492b1d7ba370 180 .ifid = FIRST_IFT_FILE + retry, // The interface files match the retry policies
Jeej 66:492b1d7ba370 181 .prop = (uint8_t)prop | ((action)? FS_ACT_EN : 0),
Jeej 66:492b1d7ba370 182 .perm = (uint8_t)perm,
Jeej 66:492b1d7ba370 183 .size = length,
Jeej 66:492b1d7ba370 184 .alloc = alloc,
Jeej 66:492b1d7ba370 185 };
Jeej 66:492b1d7ba370 186
Jeej 66:492b1d7ba370 187 err = d7a_modem_register(&file_infos);
Jeej 66:492b1d7ba370 188 }
Jeej 45:b85384e7d825 189
Jeej 45:b85384e7d825 190 DPRINT("Declare %d Done\r\n", file_id);
Jeej 45:b85384e7d825 191
Jeej 63:afd046faedb0 192 WARNING(err == D7A_ERR_NONE, "%s FID %d err %d\r\n", __FUNCTION__, file_id, err);
Jeej 55:5ea18a3a01b9 193
Jeej 46:665391110051 194 return err;
Jeej 43:28202405094d 195 }
Jeej 43:28202405094d 196
Jeej 53:3e4aa4b57090 197
Jeej 58:38a366236bda 198 d7a_msg_t** d7a_read(const uint8_t file_id, const uint32_t offset, const uint32_t size, d7a_addressee_t* addressee, alp_rpol_t retry)
Jeej 43:28202405094d 199 {
Jeej 45:b85384e7d825 200 FPRINT("\r\n");
Jeej 45:b85384e7d825 201
Jeej 66:492b1d7ba370 202 d7a_msg_t** ret = NULL;
Jeej 46:665391110051 203
Jeej 63:afd046faedb0 204 DPRINT("Read %d @%d %d bytes.\r\n", file_id, offset, size);
Jeej 46:665391110051 205
Jeej 66:492b1d7ba370 206 if (g_started)
Jeej 66:492b1d7ba370 207 {
Jeej 66:492b1d7ba370 208 ret = d7a_alp_read_file(file_id, offset, size, addressee, retry);
Jeej 66:492b1d7ba370 209 }
Jeej 46:665391110051 210
Jeej 58:38a366236bda 211 DPRINT("Read %d Done.\r\n", file_id);
Jeej 45:b85384e7d825 212
Jeej 63:afd046faedb0 213 WARNING(ret[0]->err == D7A_ERR_NONE, "%s FID: %d OFF: %d LEN: %d err %d\r\n", __FUNCTION__, file_id, offset, size, ret[0]->err);
Jeej 55:5ea18a3a01b9 214
Jeej 58:38a366236bda 215 return ret;
Jeej 46:665391110051 216 }
Jeej 46:665391110051 217
Jeej 53:3e4aa4b57090 218
Jeej 58:38a366236bda 219 d7a_msg_t** d7a_write(const uint8_t file_id, const uint32_t offset, const uint32_t size, const uint8_t* const buf, d7a_addressee_t* addressee, alp_rpol_t retry, bool resp)
Jeej 46:665391110051 220 {
Jeej 46:665391110051 221 FPRINT("\r\n");
Jeej 46:665391110051 222
Jeej 66:492b1d7ba370 223 d7a_msg_t** ret = NULL;
Jeej 46:665391110051 224
Jeej 63:afd046faedb0 225 DPRINT("Write %d @%d %d bytes.\r\n", file_id, offset, size);
Jeej 46:665391110051 226
Jeej 66:492b1d7ba370 227 if (g_started)
Jeej 66:492b1d7ba370 228 {
Jeej 66:492b1d7ba370 229 ret = d7a_alp_write_file(file_id, offset, size, buf, addressee, retry, resp);
Jeej 66:492b1d7ba370 230 }
Jeej 46:665391110051 231
Jeej 58:38a366236bda 232 DPRINT("Write %d Done.\r\n", file_id);
Jeej 46:665391110051 233
Jeej 63:afd046faedb0 234 WARNING(ret[0]->err == D7A_ERR_NONE, "%s FID: %d OFF: %d LEN: %d err %d\r\n", __FUNCTION__, file_id, offset, size, ret[0]->err);
Jeej 55:5ea18a3a01b9 235
Jeej 58:38a366236bda 236 return ret;
Jeej 43:28202405094d 237 }
Jeej 43:28202405094d 238
Jeej 53:3e4aa4b57090 239
Jeej 46:665391110051 240 d7a_errors_t d7a_notify(const uint8_t file_id, const uint32_t offset, const uint32_t size)
Jeej 43:28202405094d 241 {
Jeej 45:b85384e7d825 242 FPRINT("\r\n");
Jeej 45:b85384e7d825 243
Jeej 66:492b1d7ba370 244 d7a_errors_t err = D7A_ERR_STATE;
Jeej 46:665391110051 245
Jeej 63:afd046faedb0 246 DPRINT("Notify %d @%d %d bytes.\r\n", file_id, offset, size);
Jeej 45:b85384e7d825 247
Jeej 66:492b1d7ba370 248 if (g_started)
Jeej 66:492b1d7ba370 249 {
Jeej 66:492b1d7ba370 250 notify_file_param_t notif = {
Jeej 66:492b1d7ba370 251 .bf.fid = file_id,
Jeej 66:492b1d7ba370 252 .bf.offset = offset,
Jeej 66:492b1d7ba370 253 .bf.size = size
Jeej 66:492b1d7ba370 254 };
Jeej 66:492b1d7ba370 255
Jeej 66:492b1d7ba370 256 err = d7a_modem_notify(&notif);
Jeej 66:492b1d7ba370 257 }
Jeej 46:665391110051 258
Jeej 46:665391110051 259 DPRINT("Notify %d Done. err %d\r\n", file_id, err);
Jeej 46:665391110051 260
Jeej 63:afd046faedb0 261 WARNING(err == D7A_ERR_NONE, "%s FID: %d OFF: %d LEN: %d err %d\r\n", __FUNCTION__, file_id, offset, size, err);
Jeej 55:5ea18a3a01b9 262
Jeej 46:665391110051 263 return err;
Jeej 50:30440c9aeb7c 264 }
Jeej 50:30440c9aeb7c 265
Jeej 50:30440c9aeb7c 266
Jeej 58:38a366236bda 267 void d7a_free_msg(d7a_msg_t** msg)
Jeej 58:38a366236bda 268 {
Jeej 58:38a366236bda 269 int i = 0;
Jeej 58:38a366236bda 270 while (msg[i] != NULL)
Jeej 58:38a366236bda 271 {
Jeej 59:b42eae56b51b 272 d7a_alp_free_msg(msg[i]);
Jeej 58:38a366236bda 273 i++;
Jeej 58:38a366236bda 274 }
Jeej 58:38a366236bda 275
Jeej 58:38a366236bda 276 FREE(msg);
Jeej 58:38a366236bda 277 }
Jeej 58:38a366236bda 278
Jeej 60:8d4133fbc060 279 void d7a_print_msg(d7a_msg_t** msg)
Jeej 60:8d4133fbc060 280 {
Jeej 60:8d4133fbc060 281 uint8_t i = 0;
Jeej 60:8d4133fbc060 282 while (msg[i] != NULL)
Jeej 60:8d4133fbc060 283 {
Jeej 60:8d4133fbc060 284 PRINT("MSG %2d ERR:%4d", i, msg[i]->err);
Jeej 60:8d4133fbc060 285 if (msg[i]->lb)
Jeej 60:8d4133fbc060 286 {
Jeej 60:8d4133fbc060 287 PRINT_DATA(" UID:", "%02X", msg[i]->id, 8, " ");
Jeej 60:8d4133fbc060 288 PRINT("LB:%3d", msg[i]->lb);
Jeej 60:8d4133fbc060 289 }
Jeej 60:8d4133fbc060 290 if (msg[i]->data)
Jeej 60:8d4133fbc060 291 {
Jeej 60:8d4133fbc060 292 PRINT(" FID: %3d OFF: %3d LEN: %3d", msg[i]->data->fid, msg[i]->data->offset, msg[i]->data->length);
Jeej 60:8d4133fbc060 293 PRINT_DATA(" DATA:", " %02X", msg[i]->data->buf, msg[i]->data->length, "");
Jeej 60:8d4133fbc060 294 }
Jeej 60:8d4133fbc060 295 PRINT("\r\n");
Jeej 60:8d4133fbc060 296 i++;
Jeej 60:8d4133fbc060 297 }
Jeej 60:8d4133fbc060 298 }
Jeej 58:38a366236bda 299
Jeej 50:30440c9aeb7c 300 void d7a_modem_print_infos(void)
Jeej 50:30440c9aeb7c 301 {
Jeej 50:30440c9aeb7c 302 uint8_t uid[8];
Jeej 50:30440c9aeb7c 303 d7a_revision_t rev;
Jeej 50:30440c9aeb7c 304
Jeej 58:38a366236bda 305 d7a_msg_t** msg;
Jeej 58:38a366236bda 306
Jeej 60:8d4133fbc060 307 msg = d7a_read(0, 0, D7A_UID_LEN);
Jeej 60:8d4133fbc060 308 ASSERT(msg[0]->err >= D7A_ERR_NONE, "Failed to read UID file. err %d\r\n", msg[0]->err);
Jeej 60:8d4133fbc060 309 ASSERT(msg[0]->data, "No data in response\r\n");
Jeej 60:8d4133fbc060 310 memcpy(uid, msg[0]->data->buf, D7A_UID_LEN);
Jeej 58:38a366236bda 311 d7a_free_msg(msg);
Jeej 58:38a366236bda 312
Jeej 58:38a366236bda 313 msg = d7a_read(2, 0, sizeof(d7a_revision_t));
Jeej 63:afd046faedb0 314 ASSERT(msg[0]->err >= D7A_ERR_NONE, "Failed to read Revision file. err %d\r\n", msg[0]->err);
Jeej 60:8d4133fbc060 315 ASSERT(msg[0]->data, "No data in response\r\n");
Jeej 59:b42eae56b51b 316 memcpy(&rev, msg[0]->data->buf, sizeof(d7a_revision_t));
Jeej 58:38a366236bda 317 d7a_free_msg(msg);
Jeej 50:30440c9aeb7c 318
Jeej 50:30440c9aeb7c 319 PRINT("------------ D7A Modem infos ------------\r\n");
Jeej 50:30440c9aeb7c 320 PRINT_DATA("| UID: ", "%02X", uid, 8, " |\r\n");
Jeej 50:30440c9aeb7c 321 PRINT("| Manufacturer ID: %08X |\r\n", rev.manufacturer_id);
Jeej 50:30440c9aeb7c 322 PRINT("| Device ID: %08X |\r\n", rev.device_id);
Jeej 50:30440c9aeb7c 323 PRINT("| Hardware version: %08X |\r\n", rev.hw_version);
Jeej 50:30440c9aeb7c 324 PRINT("| Firmware version: %d-%d.%d.%d-%08x \t|\r\n", rev.fw_version.id, rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch, rev.fw_version.hash);
Jeej 50:30440c9aeb7c 325 PRINT("| File system CRC: 0x%08x |\r\n", rev.fs_crc);
Jeej 50:30440c9aeb7c 326 PRINT("-----------------------------------------\r\n");
Jeej 50:30440c9aeb7c 327
Jeej 43:28202405094d 328 }