Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Tue Aug 23 08:49:15 2016 +0000
Revision:
36:67cfe82526e6
Parent:
34:1311cc53201a
Child:
37:e04613e021f2
Assert on notification timeout

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 26:9f0b9833cac6 15 int8_t status;
Jeej 26:9f0b9833cac6 16 DigitalInOut* reset;
Jeej 32:1e8d2d1c2946 17 bool booted;
Jeej 25:aac250164497 18 } d7a_modem_ctx_t;
Jeej 25:aac250164497 19
Jeej 25:aac250164497 20 d7a_modem_ctx_t g_modem_ctx;
Jeej 25:aac250164497 21
Jeej 25:aac250164497 22 void d7a_modem_thread(const void *p);
Jeej 25:aac250164497 23
Jeej 26:9f0b9833cac6 24 void d7a_modem_open( PinName reset_pin )
Jeej 25:aac250164497 25 {
Jeej 25:aac250164497 26 FPRINT("\r\n");
Jeej 28:0376b97b4b55 27
Jeej 31:ab9bfdbc6b44 28 g_modem_ctx.thread = new Thread(d7a_modem_thread, NULL, osPriorityHigh, DEFAULT_STACK_SIZE);
Jeej 32:1e8d2d1c2946 29 g_modem_ctx.booted = false;
Jeej 26:9f0b9833cac6 30
Jeej 30:d775c1409849 31 if (reset_pin == NC)
Jeej 30:d775c1409849 32 {
Jeej 30:d775c1409849 33 g_modem_ctx.reset = NULL;
Jeej 30:d775c1409849 34 }
Jeej 30:d775c1409849 35 else
Jeej 30:d775c1409849 36 {
Jeej 34:1311cc53201a 37 g_modem_ctx.reset = new DigitalInOut(reset_pin, PIN_OUTPUT, OpenDrain, 1);
Jeej 30:d775c1409849 38 }
Jeej 30:d775c1409849 39
Jeej 34:1311cc53201a 40 d7a_com_start();
Jeej 30:d775c1409849 41 d7a_modem_reset();
Jeej 34:1311cc53201a 42 ASSERT(d7a_sys_ping_modem(30000), "Modem does not respond\r\n");
Jeej 34:1311cc53201a 43 }
Jeej 34:1311cc53201a 44
Jeej 34:1311cc53201a 45 static bool d7a_modem_wait_boot( uint32_t millisec )
Jeej 34:1311cc53201a 46 {
Jeej 34:1311cc53201a 47 FPRINT("(%d)\r\n", millisec);
Jeej 34:1311cc53201a 48 osEvent evt = g_modem_ctx.boot.get(millisec);
Jeej 34:1311cc53201a 49 return (evt.status == osEventMessage)? true: false;
Jeej 34:1311cc53201a 50 }
Jeej 34:1311cc53201a 51
Jeej 34:1311cc53201a 52
Jeej 34:1311cc53201a 53 static bool d7a_modem_wait_ready( uint32_t millisec )
Jeej 34:1311cc53201a 54 {
Jeej 34:1311cc53201a 55 FPRINT("(%d)\r\n", millisec);
Jeej 34:1311cc53201a 56 osEvent evt = g_modem_ctx.ready.get(millisec);
Jeej 34:1311cc53201a 57 return (evt.status == osEventMessage)? true: false;
Jeej 34:1311cc53201a 58 }
Jeej 34:1311cc53201a 59
Jeej 34:1311cc53201a 60 static void d7a_modem_soft_reset(void)
Jeej 34:1311cc53201a 61 {
Jeej 34:1311cc53201a 62 FPRINT("\r\n");
Jeej 34:1311cc53201a 63 IPRINT("MODEM Soft Reset.\r\n");
Jeej 26:9f0b9833cac6 64
Jeej 34:1311cc53201a 65 // Try software reset
Jeej 34:1311cc53201a 66 d7a_sys_software_reset();
Jeej 34:1311cc53201a 67
Jeej 34:1311cc53201a 68 // Clean buffer and queues
Jeej 34:1311cc53201a 69 d7a_com_restart();
Jeej 34:1311cc53201a 70 }
Jeej 34:1311cc53201a 71
Jeej 34:1311cc53201a 72 static void d7a_modem_hard_reset(void)
Jeej 34:1311cc53201a 73 {
Jeej 34:1311cc53201a 74 FPRINT("\r\n");
Jeej 34:1311cc53201a 75
Jeej 34:1311cc53201a 76 ASSERT(g_modem_ctx.reset != NULL, "No reset PIN specified\r\n");
Jeej 34:1311cc53201a 77
Jeej 34:1311cc53201a 78 IPRINT("MODEM Hard Reset.\r\n");
Jeej 34:1311cc53201a 79
Jeej 34:1311cc53201a 80 // Use hardware reset
Jeej 34:1311cc53201a 81 // Assert reset pin
Jeej 34:1311cc53201a 82 *(g_modem_ctx.reset) = 0;
Jeej 34:1311cc53201a 83
Jeej 34:1311cc53201a 84 // Clean buffer and queues
Jeej 34:1311cc53201a 85 d7a_com_restart();
Jeej 34:1311cc53201a 86 Thread::wait(100);
Jeej 34:1311cc53201a 87
Jeej 34:1311cc53201a 88 // Release reset pin
Jeej 34:1311cc53201a 89 *(g_modem_ctx.reset) = 1;
Jeej 34:1311cc53201a 90
Jeej 25:aac250164497 91 }
Jeej 25:aac250164497 92
Jeej 30:d775c1409849 93 void d7a_modem_reset( void )
Jeej 25:aac250164497 94 {
Jeej 34:1311cc53201a 95 FPRINT("\r\n");
Jeej 34:1311cc53201a 96 bool reset_ok = false;
Jeej 34:1311cc53201a 97 g_modem_ctx.booted = false;
Jeej 34:1311cc53201a 98
Jeej 34:1311cc53201a 99 d7a_modem_soft_reset();
Jeej 34:1311cc53201a 100 reset_ok = d7a_modem_wait_boot(5000);
Jeej 34:1311cc53201a 101
Jeej 34:1311cc53201a 102 if (!reset_ok)
Jeej 26:9f0b9833cac6 103 {
Jeej 34:1311cc53201a 104 d7a_modem_hard_reset();
Jeej 34:1311cc53201a 105 reset_ok = d7a_modem_wait_boot(5000);
Jeej 26:9f0b9833cac6 106 }
Jeej 34:1311cc53201a 107 ASSERT(reset_ok, "MODEM BOOT Timeout\r\n");
Jeej 34:1311cc53201a 108 g_modem_ctx.booted = true;
Jeej 34:1311cc53201a 109
Jeej 34:1311cc53201a 110 ASSERT(d7a_modem_wait_ready(5000), "MODEM READY Timeout\r\n");
Jeej 34:1311cc53201a 111 IPRINT("MODEM Ready.\r\n");
Jeej 25:aac250164497 112 }
Jeej 25:aac250164497 113
Jeej 25:aac250164497 114 void d7a_modem_new_pkt(d7a_com_rx_msg_t* pkt)
Jeej 25:aac250164497 115 {
Jeej 25:aac250164497 116 FPRINT("\r\n");
Jeej 25:aac250164497 117 ASSERT(g_modem_ctx.pkt_queue.put(pkt) == osOK, "MODEM queue full!\r\n");
Jeej 25:aac250164497 118 }
Jeej 25:aac250164497 119
Jeej 25:aac250164497 120 d7a_com_rx_msg_t* d7a_modem_wait_pkt( uint32_t millisec )
Jeej 25:aac250164497 121 {
Jeej 30:d775c1409849 122 FPRINT("(millisec:%d)\r\n", millisec);
Jeej 25:aac250164497 123 osEvent evt = g_modem_ctx.pkt_queue.get(millisec);
Jeej 25:aac250164497 124 return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
Jeej 25:aac250164497 125 }
Jeej 25:aac250164497 126
Jeej 30:d775c1409849 127 void d7a_modem_msg(uint8_t value, uint8_t* buf, uint8_t len)
Jeej 25:aac250164497 128 {
Jeej 25:aac250164497 129 FPRINT("(value:0x%02X, buf:0x%08x, len:%d)\r\n", value, buf, len);
Jeej 25:aac250164497 130 d7a_com_tx_msg_t msg;
Jeej 25:aac250164497 131 uint8_t val=value;
Jeej 25:aac250164497 132 msg.id = KAL_COM_FLOW_CMD;
Jeej 25:aac250164497 133 msg.pbuf = &val;
Jeej 25:aac250164497 134 msg.abuf = buf;
Jeej 25:aac250164497 135 msg.plen = 1;
Jeej 25:aac250164497 136 msg.alen = len;
Jeej 34:1311cc53201a 137 d7a_com_post_msg(&msg);
Jeej 25:aac250164497 138 }
Jeej 25:aac250164497 139
Jeej 30:d775c1409849 140 bool d7a_modem_register_file(uint8_t fid, uint8_t retry_policy)
Jeej 25:aac250164497 141 {
Jeej 33:f9a542d3efaa 142 //g_modem_ctx.ressource->wait();
Jeej 28:0376b97b4b55 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 25:aac250164497 147 register_file_param_t rparams = {
Jeej 25:aac250164497 148 .bf.fid = fid ,
Jeej 30:d775c1409849 149 .bf.retry_policy = retry_policy
Jeej 25:aac250164497 150 };
Jeej 25:aac250164497 151
Jeej 26:9f0b9833cac6 152 // Check If modem already has it
Jeej 30:d775c1409849 153 DPRINT("Register: %d\r\n", rparams.bf.fid);
Jeej 34:1311cc53201a 154
Jeej 34:1311cc53201a 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 26:9f0b9833cac6 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 25:aac250164497 162 props.type = HOST;
Jeej 34:1311cc53201a 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 26:9f0b9833cac6 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 30:d775c1409849 179 DPRINT("Register done.\r\n");
Jeej 33:f9a542d3efaa 180 //g_modem_ctx.ressource->release();
Jeej 30:d775c1409849 181
Jeej 30:d775c1409849 182 return ret;
Jeej 25:aac250164497 183 }
Jeej 25:aac250164497 184
Jeej 25:aac250164497 185 void d7a_modem_notify_file(uint8_t fid, uint32_t offset, uint32_t length)
Jeej 25:aac250164497 186 {
Jeej 33:f9a542d3efaa 187 //g_modem_ctx.ressource->wait();
Jeej 28:0376b97b4b55 188
Jeej 25:aac250164497 189 FPRINT("(fid:%d, offset:%d, length:%d)\r\n", fid, offset, length);
Jeej 30:d775c1409849 190 DPRINT("Notify %d.\r\n", fid);
Jeej 30:d775c1409849 191
Jeej 25:aac250164497 192 notify_file_param_t nfp = {
Jeej 25:aac250164497 193 .bf.fid = fid,
Jeej 25:aac250164497 194 .bf.offset = offset,
Jeej 25:aac250164497 195 .bf.size = length
Jeej 25:aac250164497 196 };
Jeej 25:aac250164497 197
Jeej 25:aac250164497 198 d7a_modem_msg(WM_CMD_NOTIFY_FILE,(uint8_t*)&nfp,sizeof(notify_file_param_t));
Jeej 36:67cfe82526e6 199 ASSERT(d7a_modem_wait_ready(TO_FS), "Notification Timeout on FID:%d\r\n", fid);
Jeej 28:0376b97b4b55 200
Jeej 32:1e8d2d1c2946 201 //Thread::wait(100); // XXX: To avoid lost packets
Jeej 28:0376b97b4b55 202
Jeej 30:d775c1409849 203 DPRINT("Notify %d done.\r\n", fid);
Jeej 33:f9a542d3efaa 204 //g_modem_ctx.ressource->release();
Jeej 25:aac250164497 205 }
Jeej 25:aac250164497 206
Jeej 30:d775c1409849 207 void d7a_modem_print_infos( void )
Jeej 27:934ab7455115 208 {
Jeej 27:934ab7455115 209 uint8_t uid[8];
Jeej 27:934ab7455115 210 revision_t rev;
Jeej 27:934ab7455115 211
Jeej 33:f9a542d3efaa 212 //g_modem_ctx.ressource->wait();
Jeej 30:d775c1409849 213
Jeej 34:1311cc53201a 214 D7A_FS_READ(0, uid, 0, 8);
Jeej 34:1311cc53201a 215 D7A_FS_READ(2, &rev, 0, sizeof(revision_t));
Jeej 27:934ab7455115 216
Jeej 31:ab9bfdbc6b44 217 PRINT("------------ D7A Modem infos ------------\r\n");
Jeej 31:ab9bfdbc6b44 218 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 219 PRINT("| Manufacturer ID: %08X |\r\n", rev.manufacturer_id);
Jeej 31:ab9bfdbc6b44 220 PRINT("| Device ID: %08X |\r\n", rev.device_id);
Jeej 31:ab9bfdbc6b44 221 PRINT("| Hardware version: %08X |\r\n", rev.hw_version);
Jeej 31:ab9bfdbc6b44 222 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 223 PRINT("| File system CRC: 0x%08x |\r\n", rev.fs_crc);
Jeej 31:ab9bfdbc6b44 224 PRINT("-----------------------------------------\r\n");
Jeej 30:d775c1409849 225
Jeej 33:f9a542d3efaa 226 //g_modem_ctx.ressource->release();
Jeej 27:934ab7455115 227 }
Jeej 27:934ab7455115 228
Jeej 27:934ab7455115 229
Jeej 25:aac250164497 230 void d7a_modem_thread(const void *p)
Jeej 25:aac250164497 231 {
Jeej 25:aac250164497 232 FPRINT("\r\n");
Jeej 25:aac250164497 233 d7a_com_rx_msg_t* pkt;
Jeej 25:aac250164497 234
Jeej 25:aac250164497 235 while (true)
Jeej 25:aac250164497 236 {
Jeej 25:aac250164497 237 pkt = d7a_modem_wait_pkt();
Jeej 25:aac250164497 238 ASSERT(pkt != NULL, "MODEM NULL pkt\r\n");
Jeej 25:aac250164497 239
Jeej 25:aac250164497 240 switch(pkt->id)
Jeej 25:aac250164497 241 {
Jeej 25:aac250164497 242 case KAL_COM_FLOW_CMD:
Jeej 25:aac250164497 243 uint8_t cmd = pkt->buffer[0];
Jeej 25:aac250164497 244 if (cmd == WM_CMD_READY)
Jeej 25:aac250164497 245 {
Jeej 34:1311cc53201a 246 DPRINT("Modem ready\r\n");
Jeej 26:9f0b9833cac6 247 g_modem_ctx.ready.put(NULL);
Jeej 26:9f0b9833cac6 248 }
Jeej 26:9f0b9833cac6 249 else if (cmd == WM_CMD_BOOT)
Jeej 26:9f0b9833cac6 250 {
Jeej 32:1e8d2d1c2946 251 ASSERT(g_modem_ctx.booted == false, "Modem rebooted.\r\n");
Jeej 34:1311cc53201a 252 DPRINT("Modem booted CAUSE:%d NB_BOOT:%d\r\n", pkt->buffer[1], ((uint16_t)pkt->buffer[4])<<8 & pkt->buffer[3]);
Jeej 26:9f0b9833cac6 253 g_modem_ctx.boot.put(NULL);
Jeej 25:aac250164497 254 }
Jeej 25:aac250164497 255 else
Jeej 25:aac250164497 256 {
Jeej 25:aac250164497 257 EPRINT("MODEM Unknown cmd %d\r\n", cmd);
Jeej 25:aac250164497 258 }
Jeej 25:aac250164497 259 break;
Jeej 25:aac250164497 260 default:
Jeej 25:aac250164497 261 EPRINT("MODEM Unknown Flow ID 0x%02X\r\n", pkt->id);
Jeej 25:aac250164497 262 break;
Jeej 25:aac250164497 263 }
Jeej 25:aac250164497 264
Jeej 25:aac250164497 265 FREE(pkt);
Jeej 25:aac250164497 266 }
Jeej 25:aac250164497 267 }