Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Mon Sep 12 16:36:09 2016 +0000
Revision:
58:38a366236bda
Parent:
56:da34fc11e760
Child:
59:b42eae56b51b
Broadcast.

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