Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Thu Jan 05 12:59:13 2017 +0000
Revision:
83:f4054d0b29ba
Parent:
82:5d1b101b6d11
Child:
84:e5388f1b8ed9
Selective FPRINT

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