Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Mon Sep 05 13:21:50 2016 +0000
Revision:
50:30440c9aeb7c
Parent:
49:81d5bddb02f0
Child:
55:5ea18a3a01b9
Disabled dbg prints

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