Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Thu Aug 25 09:38:40 2016 +0000
Revision:
38:c1e7f97ab396
Parent:
37:e04613e021f2
Child:
40:b4df548bd9d8
Child:
43:28202405094d
Adapted file system to new modem version (tested with version 4.2.38)

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 25:aac250164497 9
Jeej 25:aac250164497 10 typedef struct {
Jeej 25:aac250164497 11 Thread* thread;
Jeej 26:9f0b9833cac6 12 Queue<void, 8> ready;
Jeej 26:9f0b9833cac6 13 Queue<void, 2> boot;
Jeej 25:aac250164497 14 Queue<d7a_com_rx_msg_t, 16> pkt_queue;
Jeej 37:e04613e021f2 15 Queue<register_file_param_t, 64> registered_files;
Jeej 37:e04613e021f2 16 uint8_t nb_files;
Jeej 26:9f0b9833cac6 17 int8_t status;
Jeej 26:9f0b9833cac6 18 DigitalInOut* reset;
Jeej 32:1e8d2d1c2946 19 bool booted;
Jeej 25:aac250164497 20 } d7a_modem_ctx_t;
Jeej 25:aac250164497 21
Jeej 25:aac250164497 22 d7a_modem_ctx_t g_modem_ctx;
Jeej 25:aac250164497 23
Jeej 25:aac250164497 24 void d7a_modem_thread(const void *p);
Jeej 25:aac250164497 25
Jeej 26:9f0b9833cac6 26 void d7a_modem_open( PinName reset_pin )
Jeej 25:aac250164497 27 {
Jeej 25:aac250164497 28 FPRINT("\r\n");
Jeej 28:0376b97b4b55 29
Jeej 31:ab9bfdbc6b44 30 g_modem_ctx.thread = new Thread(d7a_modem_thread, NULL, osPriorityHigh, DEFAULT_STACK_SIZE);
Jeej 32:1e8d2d1c2946 31 g_modem_ctx.booted = false;
Jeej 37:e04613e021f2 32 g_modem_ctx.nb_files = 0;
Jeej 26:9f0b9833cac6 33
Jeej 30:d775c1409849 34 if (reset_pin == NC)
Jeej 30:d775c1409849 35 {
Jeej 30:d775c1409849 36 g_modem_ctx.reset = NULL;
Jeej 30:d775c1409849 37 }
Jeej 30:d775c1409849 38 else
Jeej 30:d775c1409849 39 {
Jeej 34:1311cc53201a 40 g_modem_ctx.reset = new DigitalInOut(reset_pin, PIN_OUTPUT, OpenDrain, 1);
Jeej 30:d775c1409849 41 }
Jeej 37:e04613e021f2 42
Jeej 30:d775c1409849 43 d7a_modem_reset();
Jeej 34:1311cc53201a 44 ASSERT(d7a_sys_ping_modem(30000), "Modem does not respond\r\n");
Jeej 34:1311cc53201a 45 }
Jeej 34:1311cc53201a 46
Jeej 34:1311cc53201a 47 static bool d7a_modem_wait_boot( uint32_t millisec )
Jeej 34:1311cc53201a 48 {
Jeej 34:1311cc53201a 49 FPRINT("(%d)\r\n", millisec);
Jeej 34:1311cc53201a 50 osEvent evt = g_modem_ctx.boot.get(millisec);
Jeej 34:1311cc53201a 51 return (evt.status == osEventMessage)? true: false;
Jeej 34:1311cc53201a 52 }
Jeej 34:1311cc53201a 53
Jeej 34:1311cc53201a 54
Jeej 34:1311cc53201a 55 static bool d7a_modem_wait_ready( uint32_t millisec )
Jeej 34:1311cc53201a 56 {
Jeej 34:1311cc53201a 57 FPRINT("(%d)\r\n", millisec);
Jeej 34:1311cc53201a 58 osEvent evt = g_modem_ctx.ready.get(millisec);
Jeej 34:1311cc53201a 59 return (evt.status == osEventMessage)? true: false;
Jeej 34:1311cc53201a 60 }
Jeej 34:1311cc53201a 61
Jeej 34:1311cc53201a 62 static void d7a_modem_soft_reset(void)
Jeej 34:1311cc53201a 63 {
Jeej 34:1311cc53201a 64 FPRINT("\r\n");
Jeej 34:1311cc53201a 65 IPRINT("MODEM Soft Reset.\r\n");
Jeej 37:e04613e021f2 66
Jeej 37:e04613e021f2 67 // Clean buffer and queues
Jeej 37:e04613e021f2 68 d7a_com_restart();
Jeej 26:9f0b9833cac6 69
Jeej 34:1311cc53201a 70 // Try software reset
Jeej 34:1311cc53201a 71 d7a_sys_software_reset();
Jeej 34:1311cc53201a 72 }
Jeej 34:1311cc53201a 73
Jeej 34:1311cc53201a 74 static void d7a_modem_hard_reset(void)
Jeej 34:1311cc53201a 75 {
Jeej 34:1311cc53201a 76 FPRINT("\r\n");
Jeej 34:1311cc53201a 77
Jeej 34:1311cc53201a 78 ASSERT(g_modem_ctx.reset != NULL, "No reset PIN specified\r\n");
Jeej 34:1311cc53201a 79
Jeej 34:1311cc53201a 80 IPRINT("MODEM Hard Reset.\r\n");
Jeej 34:1311cc53201a 81
Jeej 34:1311cc53201a 82 // Use hardware reset
Jeej 34:1311cc53201a 83 // Assert reset pin
Jeej 34:1311cc53201a 84 *(g_modem_ctx.reset) = 0;
Jeej 34:1311cc53201a 85
Jeej 34:1311cc53201a 86 // Clean buffer and queues
Jeej 34:1311cc53201a 87 d7a_com_restart();
Jeej 34:1311cc53201a 88 Thread::wait(100);
Jeej 34:1311cc53201a 89
Jeej 34:1311cc53201a 90 // Release reset pin
Jeej 34:1311cc53201a 91 *(g_modem_ctx.reset) = 1;
Jeej 34:1311cc53201a 92
Jeej 25:aac250164497 93 }
Jeej 25:aac250164497 94
Jeej 30:d775c1409849 95 void d7a_modem_reset( void )
Jeej 25:aac250164497 96 {
Jeej 34:1311cc53201a 97 FPRINT("\r\n");
Jeej 34:1311cc53201a 98 bool reset_ok = false;
Jeej 34:1311cc53201a 99 g_modem_ctx.booted = false;
Jeej 34:1311cc53201a 100
Jeej 34:1311cc53201a 101 d7a_modem_soft_reset();
Jeej 37:e04613e021f2 102 reset_ok = d7a_modem_wait_boot(3000);
Jeej 34:1311cc53201a 103
Jeej 34:1311cc53201a 104 if (!reset_ok)
Jeej 26:9f0b9833cac6 105 {
Jeej 34:1311cc53201a 106 d7a_modem_hard_reset();
Jeej 37:e04613e021f2 107 reset_ok = d7a_modem_wait_boot(3000);
Jeej 26:9f0b9833cac6 108 }
Jeej 34:1311cc53201a 109 ASSERT(reset_ok, "MODEM BOOT Timeout\r\n");
Jeej 34:1311cc53201a 110 g_modem_ctx.booted = true;
Jeej 34:1311cc53201a 111
Jeej 37:e04613e021f2 112 ASSERT(d7a_modem_wait_ready(3000), "MODEM READY Timeout\r\n");
Jeej 34:1311cc53201a 113 IPRINT("MODEM Ready.\r\n");
Jeej 25:aac250164497 114 }
Jeej 25:aac250164497 115
Jeej 25:aac250164497 116 void d7a_modem_new_pkt(d7a_com_rx_msg_t* pkt)
Jeej 25:aac250164497 117 {
Jeej 25:aac250164497 118 FPRINT("\r\n");
Jeej 25:aac250164497 119 ASSERT(g_modem_ctx.pkt_queue.put(pkt) == osOK, "MODEM queue full!\r\n");
Jeej 25:aac250164497 120 }
Jeej 25:aac250164497 121
Jeej 25:aac250164497 122 d7a_com_rx_msg_t* d7a_modem_wait_pkt( uint32_t millisec )
Jeej 25:aac250164497 123 {
Jeej 30:d775c1409849 124 FPRINT("(millisec:%d)\r\n", millisec);
Jeej 25:aac250164497 125 osEvent evt = g_modem_ctx.pkt_queue.get(millisec);
Jeej 25:aac250164497 126 return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
Jeej 25:aac250164497 127 }
Jeej 25:aac250164497 128
Jeej 30:d775c1409849 129 void d7a_modem_msg(uint8_t value, uint8_t* buf, uint8_t len)
Jeej 25:aac250164497 130 {
Jeej 25:aac250164497 131 FPRINT("(value:0x%02X, buf:0x%08x, len:%d)\r\n", value, buf, len);
Jeej 25:aac250164497 132 d7a_com_tx_msg_t msg;
Jeej 25:aac250164497 133 uint8_t val=value;
Jeej 25:aac250164497 134 msg.id = KAL_COM_FLOW_CMD;
Jeej 25:aac250164497 135 msg.pbuf = &val;
Jeej 25:aac250164497 136 msg.abuf = buf;
Jeej 25:aac250164497 137 msg.plen = 1;
Jeej 25:aac250164497 138 msg.alen = len;
Jeej 34:1311cc53201a 139 d7a_com_post_msg(&msg);
Jeej 25:aac250164497 140 }
Jeej 25:aac250164497 141
Jeej 30:d775c1409849 142 bool d7a_modem_register_file(uint8_t fid, uint8_t retry_policy)
Jeej 25:aac250164497 143 {
Jeej 30:d775c1409849 144 bool ret = true;
Jeej 30:d775c1409849 145
Jeej 30:d775c1409849 146 FPRINT("(fid:%d, retry_policy:0x%02X)\r\n", fid, retry_policy);
Jeej 37:e04613e021f2 147 register_file_param_t* rparams = (register_file_param_t*)MALLOC(sizeof(register_file_param_t));
Jeej 37:e04613e021f2 148
Jeej 37:e04613e021f2 149 rparams->bf.fid = fid;
Jeej 37:e04613e021f2 150 rparams->bf.retry_policy = retry_policy;
Jeej 25:aac250164497 151
Jeej 26:9f0b9833cac6 152 // Check If modem already has it
Jeej 37:e04613e021f2 153 PRINT("Register: %d\r\n", rparams->bf.fid);
Jeej 34:1311cc53201a 154
Jeej 37:e04613e021f2 155 g_modem_ctx.status = d7a_fs_distant_stat(rparams->bf.fid, NULL);
Jeej 30:d775c1409849 156 if (g_modem_ctx.status < 0)
Jeej 25:aac250164497 157 {
Jeej 26:9f0b9833cac6 158 d7a_fs_properties_t props;
Jeej 26:9f0b9833cac6 159 // retrieve local properties
Jeej 37:e04613e021f2 160 d7a_fs_get_properties(rparams->bf.fid, KAL_FS_PROP_ALL, &props);
Jeej 25:aac250164497 161 // create a remote Host file matching our local one
Jeej 38:c1e7f97ab396 162 props.type |= HOST;
Jeej 37:e04613e021f2 163 g_modem_ctx.status = d7a_fs_distant_create(rparams->bf.fid, &props);
Jeej 25:aac250164497 164 }
Jeej 28:0376b97b4b55 165
Jeej 30:d775c1409849 166 if (g_modem_ctx.status == 0)
Jeej 26:9f0b9833cac6 167 {
Jeej 26:9f0b9833cac6 168 // Distant file is ready, lets register a D7A Interface for it
Jeej 37:e04613e021f2 169 d7a_modem_msg(WM_CMD_REGISTER_FILE,(uint8_t*)rparams,sizeof(register_file_param_t));
Jeej 30:d775c1409849 170 ret = d7a_modem_wait_ready(TO_FS);
Jeej 30:d775c1409849 171 }
Jeej 30:d775c1409849 172 else
Jeej 30:d775c1409849 173 {
Jeej 30:d775c1409849 174 ret = false;
Jeej 26:9f0b9833cac6 175 }
Jeej 28:0376b97b4b55 176
Jeej 34:1311cc53201a 177 //Thread::wait(100); // Let time to the modem to write to the flash
Jeej 34:1311cc53201a 178
Jeej 37:e04613e021f2 179 // save registered file
Jeej 37:e04613e021f2 180 g_modem_ctx.registered_files.put(rparams);
Jeej 37:e04613e021f2 181 g_modem_ctx.nb_files++;
Jeej 37:e04613e021f2 182
Jeej 30:d775c1409849 183 DPRINT("Register done.\r\n");
Jeej 33:f9a542d3efaa 184 //g_modem_ctx.ressource->release();
Jeej 30:d775c1409849 185
Jeej 30:d775c1409849 186 return ret;
Jeej 25:aac250164497 187 }
Jeej 25:aac250164497 188
Jeej 25:aac250164497 189 void d7a_modem_notify_file(uint8_t fid, uint32_t offset, uint32_t length)
Jeej 25:aac250164497 190 {
Jeej 25:aac250164497 191 FPRINT("(fid:%d, offset:%d, length:%d)\r\n", fid, offset, length);
Jeej 30:d775c1409849 192 DPRINT("Notify %d.\r\n", fid);
Jeej 30:d775c1409849 193
Jeej 25:aac250164497 194 notify_file_param_t nfp = {
Jeej 25:aac250164497 195 .bf.fid = fid,
Jeej 25:aac250164497 196 .bf.offset = offset,
Jeej 25:aac250164497 197 .bf.size = length
Jeej 25:aac250164497 198 };
Jeej 25:aac250164497 199
Jeej 25:aac250164497 200 d7a_modem_msg(WM_CMD_NOTIFY_FILE,(uint8_t*)&nfp,sizeof(notify_file_param_t));
Jeej 37:e04613e021f2 201 WARNING(d7a_modem_wait_ready(TO_FS), "Notification Timeout on FID:%d\r\n", fid);
Jeej 28:0376b97b4b55 202
Jeej 32:1e8d2d1c2946 203 //Thread::wait(100); // XXX: To avoid lost packets
Jeej 28:0376b97b4b55 204
Jeej 30:d775c1409849 205 DPRINT("Notify %d done.\r\n", fid);
Jeej 33:f9a542d3efaa 206 //g_modem_ctx.ressource->release();
Jeej 25:aac250164497 207 }
Jeej 25:aac250164497 208
Jeej 30:d775c1409849 209 void d7a_modem_print_infos( void )
Jeej 27:934ab7455115 210 {
Jeej 27:934ab7455115 211 uint8_t uid[8];
Jeej 27:934ab7455115 212 revision_t rev;
Jeej 27:934ab7455115 213
Jeej 33:f9a542d3efaa 214 //g_modem_ctx.ressource->wait();
Jeej 30:d775c1409849 215
Jeej 34:1311cc53201a 216 D7A_FS_READ(0, uid, 0, 8);
Jeej 34:1311cc53201a 217 D7A_FS_READ(2, &rev, 0, sizeof(revision_t));
Jeej 27:934ab7455115 218
Jeej 31:ab9bfdbc6b44 219 PRINT("------------ D7A Modem infos ------------\r\n");
Jeej 31:ab9bfdbc6b44 220 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 221 PRINT("| Manufacturer ID: %08X |\r\n", rev.manufacturer_id);
Jeej 31:ab9bfdbc6b44 222 PRINT("| Device ID: %08X |\r\n", rev.device_id);
Jeej 31:ab9bfdbc6b44 223 PRINT("| Hardware version: %08X |\r\n", rev.hw_version);
Jeej 31:ab9bfdbc6b44 224 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 225 PRINT("| File system CRC: 0x%08x |\r\n", rev.fs_crc);
Jeej 31:ab9bfdbc6b44 226 PRINT("-----------------------------------------\r\n");
Jeej 30:d775c1409849 227
Jeej 33:f9a542d3efaa 228 //g_modem_ctx.ressource->release();
Jeej 27:934ab7455115 229 }
Jeej 27:934ab7455115 230
Jeej 27:934ab7455115 231
Jeej 37:e04613e021f2 232 void d7a_modem_recover_thread(const void *p)
Jeej 37:e04613e021f2 233 {
Jeej 37:e04613e021f2 234 WARNING(false, "Modem rebooting, %d files to restore\r\n", g_modem_ctx.nb_files);
Jeej 37:e04613e021f2 235 // Reset modem
Jeej 37:e04613e021f2 236 ASSERT(d7a_modem_wait_ready(3000), "MODEM READY Timeout\r\n");
Jeej 37:e04613e021f2 237
Jeej 37:e04613e021f2 238 d7a_com_start_tx();
Jeej 37:e04613e021f2 239
Jeej 37:e04613e021f2 240 uint8_t nb = g_modem_ctx.nb_files;
Jeej 37:e04613e021f2 241 // register files again
Jeej 37:e04613e021f2 242 for (int i = 0; i < nb; i++)
Jeej 37:e04613e021f2 243 {
Jeej 37:e04613e021f2 244 osEvent evt = g_modem_ctx.registered_files.get(1000);
Jeej 37:e04613e021f2 245 register_file_param_t* file = (evt.status == osEventMessage)? (register_file_param_t*)evt.value.p: NULL;
Jeej 37:e04613e021f2 246
Jeej 37:e04613e021f2 247 ASSERT(file != NULL, "NULL file while recovering\r\n");
Jeej 37:e04613e021f2 248
Jeej 37:e04613e021f2 249 d7a_modem_register_file(file->bf.fid, file->bf.retry_policy);
Jeej 37:e04613e021f2 250 }
Jeej 37:e04613e021f2 251
Jeej 37:e04613e021f2 252 g_modem_ctx.nb_files = nb;
Jeej 37:e04613e021f2 253 IPRINT("Modem reboot OK\r\n");
Jeej 37:e04613e021f2 254 }
Jeej 37:e04613e021f2 255
Jeej 37:e04613e021f2 256
Jeej 25:aac250164497 257 void d7a_modem_thread(const void *p)
Jeej 25:aac250164497 258 {
Jeej 25:aac250164497 259 FPRINT("\r\n");
Jeej 25:aac250164497 260 d7a_com_rx_msg_t* pkt;
Jeej 25:aac250164497 261
Jeej 25:aac250164497 262 while (true)
Jeej 25:aac250164497 263 {
Jeej 25:aac250164497 264 pkt = d7a_modem_wait_pkt();
Jeej 25:aac250164497 265 ASSERT(pkt != NULL, "MODEM NULL pkt\r\n");
Jeej 25:aac250164497 266
Jeej 25:aac250164497 267 switch(pkt->id)
Jeej 25:aac250164497 268 {
Jeej 25:aac250164497 269 case KAL_COM_FLOW_CMD:
Jeej 25:aac250164497 270 uint8_t cmd = pkt->buffer[0];
Jeej 25:aac250164497 271 if (cmd == WM_CMD_READY)
Jeej 25:aac250164497 272 {
Jeej 34:1311cc53201a 273 DPRINT("Modem ready\r\n");
Jeej 26:9f0b9833cac6 274 g_modem_ctx.ready.put(NULL);
Jeej 26:9f0b9833cac6 275 }
Jeej 26:9f0b9833cac6 276 else if (cmd == WM_CMD_BOOT)
Jeej 26:9f0b9833cac6 277 {
Jeej 37:e04613e021f2 278 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 279
Jeej 37:e04613e021f2 280 if (g_modem_ctx.booted == true)
Jeej 37:e04613e021f2 281 {
Jeej 37:e04613e021f2 282 d7a_com_stop_tx();
Jeej 37:e04613e021f2 283 Thread* reset_th = new Thread(d7a_modem_recover_thread, NULL, osPriorityRealtime);
Jeej 37:e04613e021f2 284 }
Jeej 37:e04613e021f2 285 else
Jeej 37:e04613e021f2 286 {
Jeej 37:e04613e021f2 287 g_modem_ctx.boot.put(NULL);
Jeej 37:e04613e021f2 288 }
Jeej 25:aac250164497 289 }
Jeej 25:aac250164497 290 else
Jeej 25:aac250164497 291 {
Jeej 25:aac250164497 292 EPRINT("MODEM Unknown cmd %d\r\n", cmd);
Jeej 25:aac250164497 293 }
Jeej 25:aac250164497 294 break;
Jeej 25:aac250164497 295 default:
Jeej 25:aac250164497 296 EPRINT("MODEM Unknown Flow ID 0x%02X\r\n", pkt->id);
Jeej 25:aac250164497 297 break;
Jeej 25:aac250164497 298 }
Jeej 25:aac250164497 299
Jeej 25:aac250164497 300 FREE(pkt);
Jeej 25:aac250164497 301 }
Jeej 25:aac250164497 302 }
Jeej 37:e04613e021f2 303
Jeej 37:e04613e021f2 304
Jeej 37:e04613e021f2 305