Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Thu Jan 05 12:37:44 2017 +0000
Revision:
82:5d1b101b6d11
Parent:
79:82b01c1a62f6
Child:
83:f4054d0b29ba
Fixed root request + some cleanup.

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