without warning at positive error codes.

Fork of d7a_1x by WizziLab

Committer:
trond
Date:
Tue Mar 28 13:07:36 2017 +0000
Revision:
90:eaf980532613
Parent:
84:e5388f1b8ed9
Updated for testing at WizziLab

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Jeej 25:aac250164497 1 #include "mbed.h"
Jeej 25:aac250164497 2 #include "rtos.h"
Jeej 25:aac250164497 3 #include "dbg.h"
Jeej 25:aac250164497 4 #include "d7a_com.h"
Jeej 25:aac250164497 5 #include "d7a_fs.h"
Jeej 25:aac250164497 6 #include "d7a_modem.h"
Jeej 29:8e7c5c1e9aab 7 #include "d7a_sys.h"
Jeej 25:aac250164497 8 #include "d7a_common.h"
Jeej 43:28202405094d 9 #include "d7a.h"
Jeej 45:b85384e7d825 10 #include "d7a_alp.h"
Jeej 84:e5388f1b8ed9 11 #include "d7a_typedefs.h"
Jeej 25:aac250164497 12
Jeej 79:82b01c1a62f6 13 #if 1
Jeej 79:82b01c1a62f6 14 #define MODEM_DPRINT(...) DPRINT(__VA_ARGS__)
Jeej 79:82b01c1a62f6 15 #define MODEM_DPRINT_DATA(...) DPRINT_DATA(__VA_ARGS__)
Jeej 83:f4054d0b29ba 16 #define MODEM_FPRINT(...) FPRINT(__VA_ARGS__)
Jeej 79:82b01c1a62f6 17 #else
Jeej 79:82b01c1a62f6 18 #define MODEM_DPRINT(...);
Jeej 79:82b01c1a62f6 19 #define MODEM_DPRINT_DATA(...);
Jeej 83:f4054d0b29ba 20 #define MODEM_FPRINT(...);
Jeej 79:82b01c1a62f6 21 #endif
Jeej 79:82b01c1a62f6 22
Jeej 64:49a67f36d9c5 23 #define MODEM_TO (20000)
Jeej 42:1578f0480dcb 24
Jeej 84:e5388f1b8ed9 25 static NotifDoneFunction g_modem_notif_done;
Jeej 84:e5388f1b8ed9 26 static bool g_modem_booted;
Jeej 84:e5388f1b8ed9 27
Jeej 84:e5388f1b8ed9 28 static MBED_PinName g_modem_reset_pin;
Jeej 84:e5388f1b8ed9 29
Jeej 84:e5388f1b8ed9 30 static OS_Thread g_modem_thread(osPriorityHigh, 512, NULL);
Jeej 84:e5388f1b8ed9 31 static OS_Queue<void, 8> g_modem_ready;
Jeej 84:e5388f1b8ed9 32 static OS_Queue<void, 2> g_modem_boot;
Jeej 84:e5388f1b8ed9 33 static OS_Queue<d7a_com_rx_msg_t, 8> g_modem_pkt_queue;
Jeej 84:e5388f1b8ed9 34
Jeej 25:aac250164497 35
Jeej 76:fda2e34ff19d 36 void d7a_modem_thread();
Jeej 25:aac250164497 37
Jeej 84:e5388f1b8ed9 38 d7a_errors_t d7a_modem_open(MBED_PinName reset_pin, NotifDoneFunction nd)
Jeej 25:aac250164497 39 {
Jeej 83:f4054d0b29ba 40 MODEM_FPRINT("\r\n");
Jeej 28:0376b97b4b55 41
Jeej 45:b85384e7d825 42 d7a_errors_t err;
Jeej 77:8c792719a1fc 43
Jeej 77:8c792719a1fc 44 osStatus error = g_modem_thread.start(d7a_modem_thread);
Jeej 76:fda2e34ff19d 45 ASSERT(error == osOK, "Failed to start d7a_modem_thread (err: %d)\r\n", error);
Jeej 76:fda2e34ff19d 46
Jeej 77:8c792719a1fc 47 g_modem_booted = false;
Jeej 77:8c792719a1fc 48 g_modem_notif_done = nd;
Jeej 77:8c792719a1fc 49 g_modem_reset_pin = reset_pin;
Jeej 49:81d5bddb02f0 50
Jeej 77:8c792719a1fc 51 if (g_modem_reset_pin != NC)
Jeej 30:d775c1409849 52 {
Jeej 77:8c792719a1fc 53 DigitalIn rst(g_modem_reset_pin);
Jeej 30:d775c1409849 54 }
Jeej 37:e04613e021f2 55
Jeej 45:b85384e7d825 56 err = d7a_modem_reset();
Jeej 45:b85384e7d825 57
Jeej 45:b85384e7d825 58 return err;
Jeej 34:1311cc53201a 59 }
Jeej 34:1311cc53201a 60
Jeej 56:da34fc11e760 61 d7a_errors_t d7a_modem_close(void)
Jeej 56:da34fc11e760 62 {
Jeej 83:f4054d0b29ba 63 MODEM_FPRINT("\r\n");
Jeej 56:da34fc11e760 64
Jeej 77:8c792719a1fc 65 g_modem_thread.terminate();
Jeej 75:305024138382 66
Jeej 77:8c792719a1fc 67 if (g_modem_reset_pin != NC)
Jeej 75:305024138382 68 { // Release reset
Jeej 77:8c792719a1fc 69 DigitalIn rst(g_modem_reset_pin);
Jeej 75:305024138382 70 }
Jeej 56:da34fc11e760 71
Jeej 56:da34fc11e760 72 return D7A_ERR_NONE;
Jeej 56:da34fc11e760 73 }
Jeej 56:da34fc11e760 74
Jeej 45:b85384e7d825 75 d7a_errors_t d7a_modem_wait_boot( uint32_t millisec )
Jeej 34:1311cc53201a 76 {
Jeej 83:f4054d0b29ba 77 MODEM_FPRINT("(%d)\r\n", millisec);
Jeej 77:8c792719a1fc 78 osEvent evt = g_modem_boot.get(millisec);
Jeej 45:b85384e7d825 79 return (evt.status == osEventMessage)? (d7a_errors_t)(int32_t)evt.value.p : D7A_ERR_CMD_TO;
Jeej 34:1311cc53201a 80 }
Jeej 34:1311cc53201a 81
Jeej 45:b85384e7d825 82 d7a_errors_t d7a_modem_wait_ready( uint32_t millisec )
Jeej 34:1311cc53201a 83 {
Jeej 83:f4054d0b29ba 84 MODEM_FPRINT("(%d)\r\n", millisec);
Jeej 77:8c792719a1fc 85 osEvent evt = g_modem_ready.get(millisec);
Jeej 45:b85384e7d825 86 return (evt.status == osEventMessage)? (d7a_errors_t)(int32_t)evt.value.p : D7A_ERR_CMD_TO;
Jeej 34:1311cc53201a 87 }
Jeej 34:1311cc53201a 88
Jeej 34:1311cc53201a 89 static void d7a_modem_soft_reset(void)
Jeej 34:1311cc53201a 90 {
Jeej 83:f4054d0b29ba 91 MODEM_FPRINT("\r\n");
Jeej 34:1311cc53201a 92 IPRINT("MODEM Soft Reset.\r\n");
Jeej 37:e04613e021f2 93
Jeej 37:e04613e021f2 94 // Clean buffer and queues
Jeej 37:e04613e021f2 95 d7a_com_restart();
Jeej 26:9f0b9833cac6 96
Jeej 34:1311cc53201a 97 // Try software reset
Jeej 34:1311cc53201a 98 d7a_sys_software_reset();
Jeej 34:1311cc53201a 99 }
Jeej 34:1311cc53201a 100
Jeej 34:1311cc53201a 101 static void d7a_modem_hard_reset(void)
Jeej 34:1311cc53201a 102 {
Jeej 83:f4054d0b29ba 103 MODEM_FPRINT("\r\n");
Jeej 75:305024138382 104
Jeej 34:1311cc53201a 105 IPRINT("MODEM Hard Reset.\r\n");
Jeej 34:1311cc53201a 106
Jeej 34:1311cc53201a 107 // Use hardware reset
Jeej 77:8c792719a1fc 108 if (g_modem_reset_pin != NC)
Jeej 75:305024138382 109 { // Clear reset
Jeej 77:8c792719a1fc 110 DigitalOut rst(g_modem_reset_pin, 0);
Jeej 75:305024138382 111 }
Jeej 34:1311cc53201a 112
Jeej 34:1311cc53201a 113 // Clean buffer and queues
Jeej 34:1311cc53201a 114 d7a_com_restart();
Jeej 84:e5388f1b8ed9 115 OS_Thread ::wait(100);
Jeej 34:1311cc53201a 116
Jeej 77:8c792719a1fc 117 if (g_modem_reset_pin != NC)
Jeej 75:305024138382 118 { // Release reset
Jeej 77:8c792719a1fc 119 DigitalIn rst(g_modem_reset_pin);
Jeej 75:305024138382 120 }
Jeej 25:aac250164497 121 }
Jeej 25:aac250164497 122
Jeej 45:b85384e7d825 123 d7a_errors_t d7a_modem_reset(void)
Jeej 25:aac250164497 124 {
Jeej 83:f4054d0b29ba 125 MODEM_FPRINT("\r\n");
Jeej 45:b85384e7d825 126 d7a_errors_t err = D7A_ERR_UNKNOWN;
Jeej 77:8c792719a1fc 127 g_modem_booted = false;
Jeej 34:1311cc53201a 128
Jeej 76:fda2e34ff19d 129 //d7a_modem_soft_reset();
Jeej 76:fda2e34ff19d 130 //err = d7a_modem_wait_boot(5000);
Jeej 34:1311cc53201a 131
Jeej 45:b85384e7d825 132 if (err)
Jeej 26:9f0b9833cac6 133 {
Jeej 34:1311cc53201a 134 d7a_modem_hard_reset();
Jeej 45:b85384e7d825 135 err = d7a_modem_wait_boot(MODEM_TO);
Jeej 26:9f0b9833cac6 136 }
Jeej 45:b85384e7d825 137 ASSERT(!err, "MODEM BOOT err %d\r\n", err);
Jeej 77:8c792719a1fc 138 g_modem_booted = true;
Jeej 34:1311cc53201a 139
Jeej 45:b85384e7d825 140 err = d7a_modem_wait_ready(MODEM_TO);
Jeej 45:b85384e7d825 141 ASSERT(!err, "MODEM READY err %d\r\n", err);
Jeej 45:b85384e7d825 142
Jeej 34:1311cc53201a 143 IPRINT("MODEM Ready.\r\n");
Jeej 45:b85384e7d825 144
Jeej 45:b85384e7d825 145 return err;
Jeej 25:aac250164497 146 }
Jeej 25:aac250164497 147
Jeej 25:aac250164497 148 void d7a_modem_new_pkt(d7a_com_rx_msg_t* pkt)
Jeej 25:aac250164497 149 {
Jeej 83:f4054d0b29ba 150 MODEM_FPRINT("\r\n");
Jeej 77:8c792719a1fc 151 ASSERT(g_modem_pkt_queue.put(pkt) == osOK, "MODEM queue full!\r\n");
Jeej 25:aac250164497 152 }
Jeej 25:aac250164497 153
Jeej 43:28202405094d 154 d7a_com_rx_msg_t* d7a_modem_wait_pkt(uint32_t millisec)
Jeej 25:aac250164497 155 {
Jeej 83:f4054d0b29ba 156 MODEM_FPRINT("(millisec:%d)\r\n", millisec);
Jeej 77:8c792719a1fc 157 osEvent evt = g_modem_pkt_queue.get(millisec);
Jeej 25:aac250164497 158 return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
Jeej 25:aac250164497 159 }
Jeej 25:aac250164497 160
Jeej 30:d775c1409849 161 void d7a_modem_msg(uint8_t value, uint8_t* buf, uint8_t len)
Jeej 25:aac250164497 162 {
Jeej 83:f4054d0b29ba 163 MODEM_FPRINT("(value:0x%02X, buf:0x%08x, len:%d)\r\n", value, buf, len);
Jeej 25:aac250164497 164 d7a_com_tx_msg_t msg;
Jeej 43:28202405094d 165 uint8_t val = value;
Jeej 25:aac250164497 166 msg.id = KAL_COM_FLOW_CMD;
Jeej 25:aac250164497 167 msg.pbuf = &val;
Jeej 25:aac250164497 168 msg.abuf = buf;
Jeej 25:aac250164497 169 msg.plen = 1;
Jeej 25:aac250164497 170 msg.alen = len;
Jeej 34:1311cc53201a 171 d7a_com_post_msg(&msg);
Jeej 25:aac250164497 172 }
Jeej 25:aac250164497 173
Jeej 45:b85384e7d825 174 d7a_errors_t d7a_modem_register(register_file_param_t* file_infos)
Jeej 25:aac250164497 175 {
Jeej 45:b85384e7d825 176 d7a_errors_t err;
Jeej 34:1311cc53201a 177
Jeej 45:b85384e7d825 178 d7a_modem_msg(WM_CMD_REGISTER_FILE, (uint8_t*)file_infos, sizeof(register_file_param_t));
Jeej 43:28202405094d 179 err = d7a_modem_wait_ready(TO_FS);
Jeej 46:665391110051 180
Jeej 46:665391110051 181 return err;
Jeej 46:665391110051 182 }
Jeej 46:665391110051 183
Jeej 46:665391110051 184 d7a_errors_t d7a_modem_notify(notify_file_param_t* notif)
Jeej 46:665391110051 185 {
Jeej 46:665391110051 186 d7a_errors_t err;
Jeej 28:0376b97b4b55 187
Jeej 46:665391110051 188 d7a_modem_msg(WM_CMD_NOTIFY_FILE, (uint8_t*)notif, sizeof(notify_file_param_t));
Jeej 46:665391110051 189 err = d7a_modem_wait_ready(TO_FS);
Jeej 46:665391110051 190
Jeej 43:28202405094d 191 return err;
Jeej 25:aac250164497 192 }
Jeej 25:aac250164497 193
Jeej 45:b85384e7d825 194 d7a_errors_t d7a_modem_start(void)
Jeej 25:aac250164497 195 {
Jeej 45:b85384e7d825 196 d7a_errors_t err;
Jeej 43:28202405094d 197
Jeej 79:82b01c1a62f6 198 MODEM_DPRINT("Start modem.\r\n");
Jeej 43:28202405094d 199
Jeej 45:b85384e7d825 200 d7a_modem_msg(WM_CMD_D7A_STACK_START, NULL, 0);
Jeej 43:28202405094d 201 err = d7a_modem_wait_ready(TO_FS);
Jeej 43:28202405094d 202
Jeej 45:b85384e7d825 203 WARNING(!err, "Start modem err %d\r\n", err);
Jeej 43:28202405094d 204
Jeej 79:82b01c1a62f6 205 MODEM_DPRINT("Start done.\r\n");
Jeej 30:d775c1409849 206
Jeej 43:28202405094d 207 return err;
Jeej 43:28202405094d 208 }
Jeej 43:28202405094d 209
Jeej 45:b85384e7d825 210 d7a_errors_t d7a_modem_stop(void)
Jeej 43:28202405094d 211 {
Jeej 45:b85384e7d825 212 d7a_errors_t err;
Jeej 43:28202405094d 213
Jeej 79:82b01c1a62f6 214 MODEM_DPRINT("Stop modem.\r\n");
Jeej 25:aac250164497 215
Jeej 45:b85384e7d825 216 d7a_modem_msg(WM_CMD_D7A_STACK_STOP, NULL, 0);
Jeej 43:28202405094d 217 err = d7a_modem_wait_ready(TO_FS);
Jeej 66:492b1d7ba370 218
Jeej 79:82b01c1a62f6 219 MODEM_DPRINT("Stop done.\r\n");
Jeej 28:0376b97b4b55 220
Jeej 43:28202405094d 221 return err;
Jeej 25:aac250164497 222 }
Jeej 25:aac250164497 223
Jeej 76:fda2e34ff19d 224 void d7a_modem_thread()
Jeej 25:aac250164497 225 {
Jeej 83:f4054d0b29ba 226 MODEM_FPRINT("(id:0x%08x)\r\n", osThreadGetId());
Jeej 25:aac250164497 227 d7a_com_rx_msg_t* pkt;
Jeej 25:aac250164497 228
Jeej 25:aac250164497 229 while (true)
Jeej 25:aac250164497 230 {
Jeej 25:aac250164497 231 pkt = d7a_modem_wait_pkt();
Jeej 25:aac250164497 232 ASSERT(pkt != NULL, "MODEM NULL pkt\r\n");
Jeej 25:aac250164497 233
Jeej 25:aac250164497 234 switch(pkt->id)
Jeej 25:aac250164497 235 {
Jeej 25:aac250164497 236 case KAL_COM_FLOW_CMD:
Jeej 25:aac250164497 237 uint8_t cmd = pkt->buffer[0];
Jeej 45:b85384e7d825 238 if (cmd == WM_OK)
Jeej 25:aac250164497 239 {
Jeej 79:82b01c1a62f6 240 MODEM_DPRINT("Modem ready\r\n");
Jeej 77:8c792719a1fc 241 g_modem_ready.put((void*)D7A_ERR_NONE);
Jeej 26:9f0b9833cac6 242 }
Jeej 45:b85384e7d825 243 else if (cmd == WM_BOOT)
Jeej 26:9f0b9833cac6 244 {
Jeej 55:5ea18a3a01b9 245 boot_status_t* bs = (boot_status_t*)&(pkt->buffer[1]);
Jeej 55:5ea18a3a01b9 246 WARNING(false, "Modem booted CAUSE:%d NB_BOOT:%d\r\n", bs->bf.cause, bs->bf.nb_boot);
Jeej 37:e04613e021f2 247
Jeej 77:8c792719a1fc 248 if (g_modem_booted == true)
Jeej 37:e04613e021f2 249 {
Jeej 43:28202405094d 250 // Do something?
Jeej 37:e04613e021f2 251 }
Jeej 37:e04613e021f2 252 else
Jeej 37:e04613e021f2 253 {
Jeej 77:8c792719a1fc 254 g_modem_boot.put(NULL);
Jeej 37:e04613e021f2 255 }
Jeej 25:aac250164497 256 }
Jeej 45:b85384e7d825 257 else if (cmd == WM_ERROR)
Jeej 45:b85384e7d825 258 {
Jeej 45:b85384e7d825 259 int8_t err = pkt->buffer[1];
Jeej 45:b85384e7d825 260 int8_t ret;
Jeej 45:b85384e7d825 261
Jeej 45:b85384e7d825 262 WARNING(false, "Modem cmd error %d\r\n", err);
Jeej 45:b85384e7d825 263 switch (err)
Jeej 45:b85384e7d825 264 {
Jeej 45:b85384e7d825 265 case WM_ERR_NOT_READY: ret = D7A_ERR_NOT_READY; break;
Jeej 45:b85384e7d825 266 case WM_ERR_COM_LINK: ret = D7A_ERR_COM_LINK; break;
Jeej 45:b85384e7d825 267 case WM_ERR_ILLEGAL_FID: ret = D7A_ERR_ILLEGAL_FID; break;
Jeej 45:b85384e7d825 268 case WM_ERR_ILLEGAL_FILE_DEF: ret = D7A_ERR_ILLEGAL_FILE_DEF; break;
Jeej 45:b85384e7d825 269 case WM_ERR_UNKNOWN: ret = D7A_ERR_UNKNOWN; break;
Jeej 45:b85384e7d825 270 default: ret = D7A_ERR_NONE; break;
Jeej 45:b85384e7d825 271 }
Jeej 45:b85384e7d825 272
Jeej 77:8c792719a1fc 273 g_modem_ready.put((void*)ret);
Jeej 45:b85384e7d825 274 }
Jeej 46:665391110051 275 else if (cmd == WM_NOTIF_DONE)
Jeej 46:665391110051 276 {
Jeej 77:8c792719a1fc 277 if (g_modem_notif_done != NULL)
Jeej 49:81d5bddb02f0 278 {
Jeej 77:8c792719a1fc 279 g_modem_notif_done(pkt->buffer[1], pkt->buffer[2]);
Jeej 49:81d5bddb02f0 280 }
Jeej 46:665391110051 281 }
Jeej 25:aac250164497 282 else
Jeej 25:aac250164497 283 {
Jeej 25:aac250164497 284 EPRINT("MODEM Unknown cmd %d\r\n", cmd);
Jeej 25:aac250164497 285 }
Jeej 25:aac250164497 286 break;
Jeej 25:aac250164497 287 default:
Jeej 25:aac250164497 288 EPRINT("MODEM Unknown Flow ID 0x%02X\r\n", pkt->id);
Jeej 25:aac250164497 289 break;
Jeej 25:aac250164497 290 }
Jeej 25:aac250164497 291
Jeej 25:aac250164497 292 FREE(pkt);
Jeej 25:aac250164497 293 }
Jeej 25:aac250164497 294 }
Jeej 37:e04613e021f2 295
Jeej 37:e04613e021f2 296
Jeej 37:e04613e021f2 297