without warning at positive error codes.
Fork of d7a_1x by
src/d7a_modem.cpp@90:eaf980532613, 2017-03-28 (annotated)
- 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?
User | Revision | Line number | New 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 |