Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Thu Jun 02 09:24:52 2016 +0000
Revision:
31:ab9bfdbc6b44
Parent:
30:d775c1409849
Child:
32:1e8d2d1c2946
New process for TX commands in d7a_com.

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