Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Tue Aug 30 17:15:31 2016 +0000
Revision:
44:8ebe6b70f932
Parent:
43:28202405094d
Parent:
42:1578f0480dcb
Child:
45:b85384e7d825
Fuse branches.

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 25:aac250164497 10
Jeej 42:1578f0480dcb 11 #define MODEM_TO (5000)
Jeej 42:1578f0480dcb 12
Jeej 25:aac250164497 13 typedef struct {
Jeej 25:aac250164497 14 Thread* thread;
Jeej 26:9f0b9833cac6 15 Queue<void, 8> ready;
Jeej 26:9f0b9833cac6 16 Queue<void, 2> boot;
Jeej 25:aac250164497 17 Queue<d7a_com_rx_msg_t, 16> pkt_queue;
Jeej 37:e04613e021f2 18 Queue<register_file_param_t, 64> registered_files;
Jeej 37:e04613e021f2 19 uint8_t nb_files;
Jeej 26:9f0b9833cac6 20 int8_t status;
Jeej 26:9f0b9833cac6 21 DigitalInOut* reset;
Jeej 32:1e8d2d1c2946 22 bool booted;
Jeej 25:aac250164497 23 } d7a_modem_ctx_t;
Jeej 25:aac250164497 24
Jeej 25:aac250164497 25 d7a_modem_ctx_t g_modem_ctx;
Jeej 25:aac250164497 26
Jeej 25:aac250164497 27 void d7a_modem_thread(const void *p);
Jeej 25:aac250164497 28
Jeej 26:9f0b9833cac6 29 void d7a_modem_open( PinName reset_pin )
Jeej 25:aac250164497 30 {
Jeej 25:aac250164497 31 FPRINT("\r\n");
Jeej 28:0376b97b4b55 32
Jeej 31:ab9bfdbc6b44 33 g_modem_ctx.thread = new Thread(d7a_modem_thread, NULL, osPriorityHigh, DEFAULT_STACK_SIZE);
Jeej 32:1e8d2d1c2946 34 g_modem_ctx.booted = false;
Jeej 37:e04613e021f2 35 g_modem_ctx.nb_files = 0;
Jeej 26:9f0b9833cac6 36
Jeej 30:d775c1409849 37 if (reset_pin == NC)
Jeej 30:d775c1409849 38 {
Jeej 30:d775c1409849 39 g_modem_ctx.reset = NULL;
Jeej 30:d775c1409849 40 }
Jeej 30:d775c1409849 41 else
Jeej 30:d775c1409849 42 {
Jeej 34:1311cc53201a 43 g_modem_ctx.reset = new DigitalInOut(reset_pin, PIN_OUTPUT, OpenDrain, 1);
Jeej 30:d775c1409849 44 }
Jeej 37:e04613e021f2 45
Jeej 30:d775c1409849 46 d7a_modem_reset();
Jeej 34:1311cc53201a 47 }
Jeej 34:1311cc53201a 48
Jeej 34:1311cc53201a 49 static bool d7a_modem_wait_boot( uint32_t millisec )
Jeej 34:1311cc53201a 50 {
Jeej 34:1311cc53201a 51 FPRINT("(%d)\r\n", millisec);
Jeej 34:1311cc53201a 52 osEvent evt = g_modem_ctx.boot.get(millisec);
Jeej 34:1311cc53201a 53 return (evt.status == osEventMessage)? true: false;
Jeej 34:1311cc53201a 54 }
Jeej 34:1311cc53201a 55
Jeej 34:1311cc53201a 56
Jeej 34:1311cc53201a 57 static bool d7a_modem_wait_ready( uint32_t millisec )
Jeej 34:1311cc53201a 58 {
Jeej 34:1311cc53201a 59 FPRINT("(%d)\r\n", millisec);
Jeej 34:1311cc53201a 60 osEvent evt = g_modem_ctx.ready.get(millisec);
Jeej 34:1311cc53201a 61 return (evt.status == osEventMessage)? true: false;
Jeej 34:1311cc53201a 62 }
Jeej 34:1311cc53201a 63
Jeej 34:1311cc53201a 64 static void d7a_modem_soft_reset(void)
Jeej 34:1311cc53201a 65 {
Jeej 34:1311cc53201a 66 FPRINT("\r\n");
Jeej 34:1311cc53201a 67 IPRINT("MODEM Soft Reset.\r\n");
Jeej 37:e04613e021f2 68
Jeej 37:e04613e021f2 69 // Clean buffer and queues
Jeej 37:e04613e021f2 70 d7a_com_restart();
Jeej 26:9f0b9833cac6 71
Jeej 34:1311cc53201a 72 // Try software reset
Jeej 34:1311cc53201a 73 d7a_sys_software_reset();
Jeej 34:1311cc53201a 74 }
Jeej 34:1311cc53201a 75
Jeej 34:1311cc53201a 76 static void d7a_modem_hard_reset(void)
Jeej 34:1311cc53201a 77 {
Jeej 34:1311cc53201a 78 FPRINT("\r\n");
Jeej 34:1311cc53201a 79
Jeej 34:1311cc53201a 80 ASSERT(g_modem_ctx.reset != NULL, "No reset PIN specified\r\n");
Jeej 34:1311cc53201a 81
Jeej 34:1311cc53201a 82 IPRINT("MODEM Hard Reset.\r\n");
Jeej 34:1311cc53201a 83
Jeej 34:1311cc53201a 84 // Use hardware reset
Jeej 34:1311cc53201a 85 // Assert reset pin
Jeej 34:1311cc53201a 86 *(g_modem_ctx.reset) = 0;
Jeej 34:1311cc53201a 87
Jeej 34:1311cc53201a 88 // Clean buffer and queues
Jeej 34:1311cc53201a 89 d7a_com_restart();
Jeej 34:1311cc53201a 90 Thread::wait(100);
Jeej 34:1311cc53201a 91
Jeej 34:1311cc53201a 92 // Release reset pin
Jeej 34:1311cc53201a 93 *(g_modem_ctx.reset) = 1;
Jeej 34:1311cc53201a 94
Jeej 25:aac250164497 95 }
Jeej 25:aac250164497 96
Jeej 43:28202405094d 97 void d7a_modem_reset(void)
Jeej 25:aac250164497 98 {
Jeej 34:1311cc53201a 99 FPRINT("\r\n");
Jeej 34:1311cc53201a 100 bool reset_ok = false;
Jeej 34:1311cc53201a 101 g_modem_ctx.booted = false;
Jeej 34:1311cc53201a 102
Jeej 40:b4df548bd9d8 103 //d7a_modem_soft_reset();
Jeej 40:b4df548bd9d8 104 //reset_ok = d7a_modem_wait_boot(5000);
Jeej 34:1311cc53201a 105
Jeej 34:1311cc53201a 106 if (!reset_ok)
Jeej 26:9f0b9833cac6 107 {
Jeej 34:1311cc53201a 108 d7a_modem_hard_reset();
Jeej 42:1578f0480dcb 109 reset_ok = d7a_modem_wait_boot(MODEM_TO);
Jeej 26:9f0b9833cac6 110 }
Jeej 34:1311cc53201a 111 ASSERT(reset_ok, "MODEM BOOT Timeout\r\n");
Jeej 34:1311cc53201a 112 g_modem_ctx.booted = true;
Jeej 34:1311cc53201a 113
Jeej 42:1578f0480dcb 114 ASSERT(d7a_modem_wait_ready(MODEM_TO), "MODEM READY Timeout\r\n");
Jeej 34:1311cc53201a 115 IPRINT("MODEM Ready.\r\n");
Jeej 25:aac250164497 116 }
Jeej 25:aac250164497 117
Jeej 25:aac250164497 118 void d7a_modem_new_pkt(d7a_com_rx_msg_t* pkt)
Jeej 25:aac250164497 119 {
Jeej 25:aac250164497 120 FPRINT("\r\n");
Jeej 25:aac250164497 121 ASSERT(g_modem_ctx.pkt_queue.put(pkt) == osOK, "MODEM queue full!\r\n");
Jeej 25:aac250164497 122 }
Jeej 25:aac250164497 123
Jeej 43:28202405094d 124 d7a_com_rx_msg_t* d7a_modem_wait_pkt(uint32_t millisec)
Jeej 25:aac250164497 125 {
Jeej 30:d775c1409849 126 FPRINT("(millisec:%d)\r\n", millisec);
Jeej 25:aac250164497 127 osEvent evt = g_modem_ctx.pkt_queue.get(millisec);
Jeej 25:aac250164497 128 return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
Jeej 25:aac250164497 129 }
Jeej 25:aac250164497 130
Jeej 30:d775c1409849 131 void d7a_modem_msg(uint8_t value, uint8_t* buf, uint8_t len)
Jeej 25:aac250164497 132 {
Jeej 25:aac250164497 133 FPRINT("(value:0x%02X, buf:0x%08x, len:%d)\r\n", value, buf, len);
Jeej 25:aac250164497 134 d7a_com_tx_msg_t msg;
Jeej 43:28202405094d 135 uint8_t val = value;
Jeej 25:aac250164497 136 msg.id = KAL_COM_FLOW_CMD;
Jeej 25:aac250164497 137 msg.pbuf = &val;
Jeej 25:aac250164497 138 msg.abuf = buf;
Jeej 25:aac250164497 139 msg.plen = 1;
Jeej 25:aac250164497 140 msg.alen = len;
Jeej 34:1311cc53201a 141 d7a_com_post_msg(&msg);
Jeej 25:aac250164497 142 }
Jeej 25:aac250164497 143
Jeej 43:28202405094d 144 bool d7a_modem_register(register_file_param_t* file_infos)
Jeej 25:aac250164497 145 {
Jeej 43:28202405094d 146 bool err;
Jeej 34:1311cc53201a 147
Jeej 43:28202405094d 148 DPRINT("Declare %d.\r\n", file_infos->fid);
Jeej 43:28202405094d 149
Jeej 43:28202405094d 150 d7a_modem_msg(WM_CMD_DECLARE_FILE, (uint8_t*)file_infos, sizeof(register_file_param_t));
Jeej 43:28202405094d 151 err = d7a_modem_wait_ready(TO_FS);
Jeej 28:0376b97b4b55 152
Jeej 43:28202405094d 153 WARNING(!err, "Timeout on declare FID:%d\r\n", file_infos->fid);
Jeej 43:28202405094d 154
Jeej 43:28202405094d 155 DPRINT("Declare %d done.\r\n", file_infos->fid);
Jeej 28:0376b97b4b55 156
Jeej 43:28202405094d 157 return err;
Jeej 25:aac250164497 158 }
Jeej 25:aac250164497 159
Jeej 43:28202405094d 160 bool d7a_modem_start(void)
Jeej 25:aac250164497 161 {
Jeej 43:28202405094d 162 bool err;
Jeej 43:28202405094d 163
Jeej 43:28202405094d 164 DPRINT("Start modem.\r\n");
Jeej 43:28202405094d 165
Jeej 43:28202405094d 166 d7a_modem_msg(WM_CMD_START_STACK, NULL, 0);
Jeej 43:28202405094d 167 err = d7a_modem_wait_ready(TO_FS);
Jeej 43:28202405094d 168
Jeej 43:28202405094d 169 WARNING(!err, "Timeout on start\r\n");
Jeej 43:28202405094d 170
Jeej 43:28202405094d 171 DPRINT("Start done.\r\n");
Jeej 30:d775c1409849 172
Jeej 43:28202405094d 173 return err;
Jeej 43:28202405094d 174 }
Jeej 43:28202405094d 175
Jeej 43:28202405094d 176 bool d7a_modem_stop(void)
Jeej 43:28202405094d 177 {
Jeej 43:28202405094d 178 bool err;
Jeej 43:28202405094d 179
Jeej 43:28202405094d 180 DPRINT("Stop modem.\r\n");
Jeej 25:aac250164497 181
Jeej 43:28202405094d 182 d7a_modem_msg(WM_CMD_STOP_STACK, NULL, 0);
Jeej 43:28202405094d 183 err = d7a_modem_wait_ready(TO_FS);
Jeej 28:0376b97b4b55 184
Jeej 43:28202405094d 185 WARNING(!err, "Timeout on stop\r\n");
Jeej 43:28202405094d 186
Jeej 43:28202405094d 187 DPRINT("Stop done.\r\n");
Jeej 28:0376b97b4b55 188
Jeej 43:28202405094d 189 return err;
Jeej 25:aac250164497 190 }
Jeej 25:aac250164497 191
Jeej 30:d775c1409849 192 void d7a_modem_print_infos( void )
Jeej 27:934ab7455115 193 {
Jeej 27:934ab7455115 194 uint8_t uid[8];
Jeej 43:28202405094d 195 d7a_revision_t rev;
Jeej 27:934ab7455115 196
Jeej 43:28202405094d 197 //D7A_FS_READ(0, uid, 0, 8);
Jeej 43:28202405094d 198 //D7A_FS_READ(2, &rev, 0, sizeof(d7a_revision_t));
Jeej 27:934ab7455115 199
Jeej 31:ab9bfdbc6b44 200 PRINT("------------ D7A Modem infos ------------\r\n");
Jeej 31:ab9bfdbc6b44 201 PRINT("| UID: %02X%02X%02X%02X%02X%02X%02X%02X |\r\n", uid[0], uid[1], uid[2], uid[3], uid[4], uid[5], uid[6], uid[7]);
Jeej 31:ab9bfdbc6b44 202 PRINT("| Manufacturer ID: %08X |\r\n", rev.manufacturer_id);
Jeej 31:ab9bfdbc6b44 203 PRINT("| Device ID: %08X |\r\n", rev.device_id);
Jeej 31:ab9bfdbc6b44 204 PRINT("| Hardware version: %08X |\r\n", rev.hw_version);
Jeej 31:ab9bfdbc6b44 205 PRINT("| Firmware version: %d-%d.%d.%d-%08x \t|\r\n", rev.fw_version.id, rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch, rev.fw_version.hash);
Jeej 31:ab9bfdbc6b44 206 PRINT("| File system CRC: 0x%08x |\r\n", rev.fs_crc);
Jeej 31:ab9bfdbc6b44 207 PRINT("-----------------------------------------\r\n");
Jeej 30:d775c1409849 208
Jeej 27:934ab7455115 209 }
Jeej 27:934ab7455115 210
Jeej 25:aac250164497 211 void d7a_modem_thread(const void *p)
Jeej 25:aac250164497 212 {
Jeej 25:aac250164497 213 FPRINT("\r\n");
Jeej 25:aac250164497 214 d7a_com_rx_msg_t* pkt;
Jeej 25:aac250164497 215
Jeej 25:aac250164497 216 while (true)
Jeej 25:aac250164497 217 {
Jeej 25:aac250164497 218 pkt = d7a_modem_wait_pkt();
Jeej 25:aac250164497 219 ASSERT(pkt != NULL, "MODEM NULL pkt\r\n");
Jeej 25:aac250164497 220
Jeej 25:aac250164497 221 switch(pkt->id)
Jeej 25:aac250164497 222 {
Jeej 25:aac250164497 223 case KAL_COM_FLOW_CMD:
Jeej 25:aac250164497 224 uint8_t cmd = pkt->buffer[0];
Jeej 25:aac250164497 225 if (cmd == WM_CMD_READY)
Jeej 25:aac250164497 226 {
Jeej 34:1311cc53201a 227 DPRINT("Modem ready\r\n");
Jeej 26:9f0b9833cac6 228 g_modem_ctx.ready.put(NULL);
Jeej 26:9f0b9833cac6 229 }
Jeej 26:9f0b9833cac6 230 else if (cmd == WM_CMD_BOOT)
Jeej 26:9f0b9833cac6 231 {
Jeej 37:e04613e021f2 232 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 233
Jeej 37:e04613e021f2 234 if (g_modem_ctx.booted == true)
Jeej 37:e04613e021f2 235 {
Jeej 43:28202405094d 236 // Do something?
Jeej 37:e04613e021f2 237 }
Jeej 37:e04613e021f2 238 else
Jeej 37:e04613e021f2 239 {
Jeej 37:e04613e021f2 240 g_modem_ctx.boot.put(NULL);
Jeej 37:e04613e021f2 241 }
Jeej 25:aac250164497 242 }
Jeej 25:aac250164497 243 else
Jeej 25:aac250164497 244 {
Jeej 25:aac250164497 245 EPRINT("MODEM Unknown cmd %d\r\n", cmd);
Jeej 25:aac250164497 246 }
Jeej 25:aac250164497 247 break;
Jeej 25:aac250164497 248 default:
Jeej 25:aac250164497 249 EPRINT("MODEM Unknown Flow ID 0x%02X\r\n", pkt->id);
Jeej 25:aac250164497 250 break;
Jeej 25:aac250164497 251 }
Jeej 25:aac250164497 252
Jeej 25:aac250164497 253 FREE(pkt);
Jeej 25:aac250164497 254 }
Jeej 25:aac250164497 255 }
Jeej 37:e04613e021f2 256
Jeej 37:e04613e021f2 257
Jeej 37:e04613e021f2 258