Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Thu Jun 16 12:10:10 2016 +0000
Revision:
32:1e8d2d1c2946
Parent:
31:ab9bfdbc6b44
Child:
33:f9a542d3efaa
update

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