Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Fri Jun 24 10:11:19 2016 +0000
Revision:
33:f9a542d3efaa
Parent:
32:1e8d2d1c2946
Child:
34:1311cc53201a
Rewritten parser.

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 28:0376b97b4b55 12 Semaphore* ressource;
Jeej 26:9f0b9833cac6 13 Queue<void, 8> ready;
Jeej 26:9f0b9833cac6 14 Queue<void, 2> boot;
Jeej 25:aac250164497 15 Queue<d7a_com_rx_msg_t, 16> pkt_queue;
Jeej 26:9f0b9833cac6 16 int8_t status;
Jeej 26:9f0b9833cac6 17 DigitalInOut* reset;
Jeej 30:d775c1409849 18 int16_t waiting_count;
Jeej 28:0376b97b4b55 19 uint8_t ready_count;
Jeej 32:1e8d2d1c2946 20 bool booted;
Jeej 25:aac250164497 21 } d7a_modem_ctx_t;
Jeej 25:aac250164497 22
Jeej 25:aac250164497 23 d7a_modem_ctx_t g_modem_ctx;
Jeej 25:aac250164497 24
Jeej 25:aac250164497 25 void d7a_modem_thread(const void *p);
Jeej 25:aac250164497 26
Jeej 26:9f0b9833cac6 27 void d7a_modem_open( PinName reset_pin )
Jeej 25:aac250164497 28 {
Jeej 25:aac250164497 29 FPRINT("\r\n");
Jeej 28:0376b97b4b55 30
Jeej 28:0376b97b4b55 31 g_modem_ctx.ressource = new Semaphore(1);
Jeej 31:ab9bfdbc6b44 32 g_modem_ctx.thread = new Thread(d7a_modem_thread, NULL, osPriorityHigh, DEFAULT_STACK_SIZE);
Jeej 28:0376b97b4b55 33 g_modem_ctx.waiting_count = 0;
Jeej 28:0376b97b4b55 34 g_modem_ctx.ready_count = 0;
Jeej 32:1e8d2d1c2946 35 g_modem_ctx.booted = false;
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 30:d775c1409849 43 g_modem_ctx.reset = new DigitalInOut(reset_pin, PIN_OUTPUT, OpenDrain, 0);
Jeej 30:d775c1409849 44 }
Jeej 30:d775c1409849 45
Jeej 30:d775c1409849 46 d7a_modem_reset();
Jeej 26:9f0b9833cac6 47
Jeej 26:9f0b9833cac6 48 // Wait for modem ready
Jeej 30:d775c1409849 49 osEvent evt = g_modem_ctx.boot.get(5000);
Jeej 26:9f0b9833cac6 50 ASSERT(evt.status == osEventMessage, "MODEM BOOT Timeout\r\n");
Jeej 30:d775c1409849 51 IPRINT("MODEM Boot OK.\r\n");
Jeej 30:d775c1409849 52 ASSERT(d7a_modem_wait_ready(2000), "MODEM READY Timeout\r\n");
Jeej 30:d775c1409849 53 IPRINT("MODEM Ready.\r\n");
Jeej 32:1e8d2d1c2946 54 g_modem_ctx.booted = true;
Jeej 25:aac250164497 55 }
Jeej 25:aac250164497 56
Jeej 30:d775c1409849 57 void d7a_modem_reset( void )
Jeej 25:aac250164497 58 {
Jeej 30:d775c1409849 59 if (g_modem_ctx.reset == NULL)
Jeej 26:9f0b9833cac6 60 {
Jeej 30:d775c1409849 61 // Try software reset
Jeej 30:d775c1409849 62 d7a_sys_software_reset();
Jeej 33:f9a542d3efaa 63
Jeej 33:f9a542d3efaa 64 // Clean reception buffer
Jeej 33:f9a542d3efaa 65 d7a_com_flush_rx();
Jeej 26:9f0b9833cac6 66 }
Jeej 26:9f0b9833cac6 67 else
Jeej 26:9f0b9833cac6 68 {
Jeej 30:d775c1409849 69 // Use hardware reset
Jeej 30:d775c1409849 70 // Assert reset pin
Jeej 30:d775c1409849 71 *(g_modem_ctx.reset) = 0;
Jeej 30:d775c1409849 72 Thread::wait(10);
Jeej 33:f9a542d3efaa 73
Jeej 33:f9a542d3efaa 74 // Clean reception buffer
Jeej 33:f9a542d3efaa 75 d7a_com_flush_rx();
Jeej 33:f9a542d3efaa 76
Jeej 30:d775c1409849 77 // Release reset pin
Jeej 30:d775c1409849 78 *(g_modem_ctx.reset) = 1;
Jeej 30:d775c1409849 79 Thread::wait(10);
Jeej 26:9f0b9833cac6 80 }
Jeej 30:d775c1409849 81 }
Jeej 30:d775c1409849 82
Jeej 30:d775c1409849 83 bool d7a_modem_wait_ready( uint32_t millisec )
Jeej 30:d775c1409849 84 {
Jeej 30:d775c1409849 85 g_modem_ctx.waiting_count++;
Jeej 30:d775c1409849 86 FPRINT("(%d)\r\n", g_modem_ctx.waiting_count);
Jeej 30:d775c1409849 87 osEvent evt = g_modem_ctx.ready.get(millisec);
Jeej 30:d775c1409849 88 return (evt.status == osEventMessage)? true: false;
Jeej 25:aac250164497 89 }
Jeej 25:aac250164497 90
Jeej 25:aac250164497 91 void d7a_modem_new_pkt(d7a_com_rx_msg_t* pkt)
Jeej 25:aac250164497 92 {
Jeej 25:aac250164497 93 FPRINT("\r\n");
Jeej 25:aac250164497 94 ASSERT(g_modem_ctx.pkt_queue.put(pkt) == osOK, "MODEM queue full!\r\n");
Jeej 25:aac250164497 95 }
Jeej 25:aac250164497 96
Jeej 25:aac250164497 97 d7a_com_rx_msg_t* d7a_modem_wait_pkt( uint32_t millisec )
Jeej 25:aac250164497 98 {
Jeej 30:d775c1409849 99 FPRINT("(millisec:%d)\r\n", millisec);
Jeej 25:aac250164497 100 osEvent evt = g_modem_ctx.pkt_queue.get(millisec);
Jeej 25:aac250164497 101 return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
Jeej 25:aac250164497 102 }
Jeej 25:aac250164497 103
Jeej 30:d775c1409849 104 void d7a_modem_msg(uint8_t value, uint8_t* buf, uint8_t len)
Jeej 25:aac250164497 105 {
Jeej 25:aac250164497 106 FPRINT("(value:0x%02X, buf:0x%08x, len:%d)\r\n", value, buf, len);
Jeej 25:aac250164497 107 d7a_com_tx_msg_t msg;
Jeej 25:aac250164497 108 uint8_t val=value;
Jeej 25:aac250164497 109 msg.id = KAL_COM_FLOW_CMD;
Jeej 25:aac250164497 110 msg.pbuf = &val;
Jeej 25:aac250164497 111 msg.abuf = buf;
Jeej 25:aac250164497 112 msg.plen = 1;
Jeej 25:aac250164497 113 msg.alen = len;
Jeej 25:aac250164497 114 d7a_com_send_msg(&msg);
Jeej 25:aac250164497 115 }
Jeej 25:aac250164497 116
Jeej 30:d775c1409849 117 bool d7a_modem_register_file(uint8_t fid, uint8_t retry_policy)
Jeej 25:aac250164497 118 {
Jeej 33:f9a542d3efaa 119 //g_modem_ctx.ressource->wait();
Jeej 28:0376b97b4b55 120
Jeej 30:d775c1409849 121 bool ret = true;
Jeej 30:d775c1409849 122
Jeej 30:d775c1409849 123 FPRINT("(fid:%d, retry_policy:0x%02X)\r\n", fid, retry_policy);
Jeej 25:aac250164497 124 register_file_param_t rparams = {
Jeej 25:aac250164497 125 .bf.fid = fid ,
Jeej 30:d775c1409849 126 .bf.retry_policy = retry_policy
Jeej 25:aac250164497 127 };
Jeej 25:aac250164497 128
Jeej 26:9f0b9833cac6 129 // Check If modem already has it
Jeej 30:d775c1409849 130 DPRINT("Register: %d\r\n", rparams.bf.fid);
Jeej 26:9f0b9833cac6 131 d7a_fs_distant_stat(rparams.bf.fid, NULL);
Jeej 26:9f0b9833cac6 132 g_modem_ctx.status = (int32_t)d7a_fs_wait_done(TO_FS);
Jeej 30:d775c1409849 133 if (g_modem_ctx.status < 0)
Jeej 25:aac250164497 134 {
Jeej 26:9f0b9833cac6 135 d7a_fs_properties_t props;
Jeej 26:9f0b9833cac6 136 // retrieve local properties
Jeej 26:9f0b9833cac6 137 d7a_fs_get_properties(rparams.bf.fid, KAL_FS_PROP_ALL, &props);
Jeej 25:aac250164497 138 // create a remote Host file matching our local one
Jeej 25:aac250164497 139 props.type = HOST;
Jeej 26:9f0b9833cac6 140 d7a_fs_distant_create(rparams.bf.fid, &props);
Jeej 26:9f0b9833cac6 141 g_modem_ctx.status = (int32_t)d7a_fs_wait_done(TO_FS);
Jeej 25:aac250164497 142 }
Jeej 28:0376b97b4b55 143
Jeej 30:d775c1409849 144 if (g_modem_ctx.status == 0)
Jeej 26:9f0b9833cac6 145 {
Jeej 26:9f0b9833cac6 146 // Distant file is ready, lets register a D7A Interface for it
Jeej 26:9f0b9833cac6 147 d7a_modem_msg(WM_CMD_REGISTER_FILE,(uint8_t*)&rparams,sizeof(register_file_param_t));
Jeej 30:d775c1409849 148 ret = d7a_modem_wait_ready(TO_FS);
Jeej 30:d775c1409849 149 }
Jeej 30:d775c1409849 150 else
Jeej 30:d775c1409849 151 {
Jeej 30:d775c1409849 152 ret = false;
Jeej 26:9f0b9833cac6 153 }
Jeej 28:0376b97b4b55 154
Jeej 30:d775c1409849 155 DPRINT("Register done.\r\n");
Jeej 33:f9a542d3efaa 156 //g_modem_ctx.ressource->release();
Jeej 30:d775c1409849 157
Jeej 30:d775c1409849 158 return ret;
Jeej 25:aac250164497 159 }
Jeej 25:aac250164497 160
Jeej 25:aac250164497 161 void d7a_modem_notify_file(uint8_t fid, uint32_t offset, uint32_t length)
Jeej 25:aac250164497 162 {
Jeej 33:f9a542d3efaa 163 //g_modem_ctx.ressource->wait();
Jeej 28:0376b97b4b55 164
Jeej 25:aac250164497 165 FPRINT("(fid:%d, offset:%d, length:%d)\r\n", fid, offset, length);
Jeej 30:d775c1409849 166 DPRINT("Notify %d.\r\n", fid);
Jeej 30:d775c1409849 167
Jeej 25:aac250164497 168 notify_file_param_t nfp = {
Jeej 25:aac250164497 169 .bf.fid = fid,
Jeej 25:aac250164497 170 .bf.offset = offset,
Jeej 25:aac250164497 171 .bf.size = length
Jeej 25:aac250164497 172 };
Jeej 25:aac250164497 173
Jeej 25:aac250164497 174 d7a_modem_msg(WM_CMD_NOTIFY_FILE,(uint8_t*)&nfp,sizeof(notify_file_param_t));
Jeej 30:d775c1409849 175 WARNING(d7a_modem_wait_ready(TO_FS), "Notification Timeout on FID:%d\r\n", fid);
Jeej 28:0376b97b4b55 176
Jeej 32:1e8d2d1c2946 177 //Thread::wait(100); // XXX: To avoid lost packets
Jeej 28:0376b97b4b55 178
Jeej 30:d775c1409849 179 DPRINT("Notify %d done.\r\n", fid);
Jeej 33:f9a542d3efaa 180 //g_modem_ctx.ressource->release();
Jeej 25:aac250164497 181 }
Jeej 25:aac250164497 182
Jeej 30:d775c1409849 183 void d7a_modem_print_infos( void )
Jeej 27:934ab7455115 184 {
Jeej 27:934ab7455115 185 uint8_t uid[8];
Jeej 27:934ab7455115 186 revision_t rev;
Jeej 27:934ab7455115 187
Jeej 33:f9a542d3efaa 188 //g_modem_ctx.ressource->wait();
Jeej 30:d775c1409849 189
Jeej 27:934ab7455115 190 d7a_fs_read(0, uid, 0, 8);
Jeej 30:d775c1409849 191 d7a_fs_wait_done(TO_FS);
Jeej 27:934ab7455115 192
Jeej 27:934ab7455115 193 d7a_fs_read(2, &rev, 0, sizeof(revision_t));
Jeej 30:d775c1409849 194 d7a_fs_wait_done(TO_FS);
Jeej 27:934ab7455115 195
Jeej 31:ab9bfdbc6b44 196 PRINT("------------ D7A Modem infos ------------\r\n");
Jeej 31:ab9bfdbc6b44 197 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 198 PRINT("| Manufacturer ID: %08X |\r\n", rev.manufacturer_id);
Jeej 31:ab9bfdbc6b44 199 PRINT("| Device ID: %08X |\r\n", rev.device_id);
Jeej 31:ab9bfdbc6b44 200 PRINT("| Hardware version: %08X |\r\n", rev.hw_version);
Jeej 31:ab9bfdbc6b44 201 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 202 PRINT("| File system CRC: 0x%08x |\r\n", rev.fs_crc);
Jeej 31:ab9bfdbc6b44 203 PRINT("-----------------------------------------\r\n");
Jeej 30:d775c1409849 204
Jeej 33:f9a542d3efaa 205 //g_modem_ctx.ressource->release();
Jeej 27:934ab7455115 206 }
Jeej 27:934ab7455115 207
Jeej 27:934ab7455115 208
Jeej 25:aac250164497 209 void d7a_modem_thread(const void *p)
Jeej 25:aac250164497 210 {
Jeej 25:aac250164497 211 FPRINT("\r\n");
Jeej 25:aac250164497 212 d7a_com_rx_msg_t* pkt;
Jeej 25:aac250164497 213
Jeej 25:aac250164497 214 while (true)
Jeej 25:aac250164497 215 {
Jeej 25:aac250164497 216 pkt = d7a_modem_wait_pkt();
Jeej 25:aac250164497 217 ASSERT(pkt != NULL, "MODEM NULL pkt\r\n");
Jeej 25:aac250164497 218
Jeej 25:aac250164497 219 switch(pkt->id)
Jeej 25:aac250164497 220 {
Jeej 25:aac250164497 221 case KAL_COM_FLOW_CMD:
Jeej 25:aac250164497 222 uint8_t cmd = pkt->buffer[0];
Jeej 25:aac250164497 223 if (cmd == WM_CMD_READY)
Jeej 25:aac250164497 224 {
Jeej 30:d775c1409849 225 g_modem_ctx.waiting_count--;
Jeej 30:d775c1409849 226 DPRINT("Modem ready (%d)\r\n", g_modem_ctx.waiting_count);
Jeej 26:9f0b9833cac6 227 g_modem_ctx.ready.put(NULL);
Jeej 26:9f0b9833cac6 228 }
Jeej 26:9f0b9833cac6 229 else if (cmd == WM_CMD_BOOT)
Jeej 26:9f0b9833cac6 230 {
Jeej 32:1e8d2d1c2946 231 ASSERT(g_modem_ctx.booted == false, "Modem rebooted.\r\n");
Jeej 26:9f0b9833cac6 232 DPRINT("Modem booted\r\n");
Jeej 26:9f0b9833cac6 233 g_modem_ctx.boot.put(NULL);
Jeej 25:aac250164497 234 }
Jeej 25:aac250164497 235 else
Jeej 25:aac250164497 236 {
Jeej 25:aac250164497 237 EPRINT("MODEM Unknown cmd %d\r\n", cmd);
Jeej 25:aac250164497 238 }
Jeej 25:aac250164497 239 break;
Jeej 25:aac250164497 240 default:
Jeej 25:aac250164497 241 EPRINT("MODEM Unknown Flow ID 0x%02X\r\n", pkt->id);
Jeej 25:aac250164497 242 break;
Jeej 25:aac250164497 243 }
Jeej 25:aac250164497 244
Jeej 25:aac250164497 245 FREE(pkt);
Jeej 25:aac250164497 246 }
Jeej 25:aac250164497 247 }