Trond Enger / d7a_1x

Fork of d7a_1x by WizziLab

Committer:
Jeej
Date:
Fri Apr 01 10:55:30 2016 +0000
Revision:
27:934ab7455115
Parent:
26:9f0b9833cac6
Child:
28:0376b97b4b55
Read file function.

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 25:aac250164497 7 #include "d7a_common.h"
Jeej 25:aac250164497 8
Jeej 25:aac250164497 9 typedef struct {
Jeej 25:aac250164497 10 Thread* thread;
Jeej 26:9f0b9833cac6 11 Queue<void, 8> ready;
Jeej 26:9f0b9833cac6 12 Queue<void, 2> boot;
Jeej 25:aac250164497 13 Queue<d7a_com_rx_msg_t, 16> pkt_queue;
Jeej 26:9f0b9833cac6 14 int8_t status;
Jeej 26:9f0b9833cac6 15 DigitalInOut* reset;
Jeej 25:aac250164497 16 } d7a_modem_ctx_t;
Jeej 25:aac250164497 17
Jeej 25:aac250164497 18 d7a_modem_ctx_t g_modem_ctx;
Jeej 25:aac250164497 19
Jeej 25:aac250164497 20 void d7a_modem_thread(const void *p);
Jeej 25:aac250164497 21
Jeej 26:9f0b9833cac6 22 void d7a_modem_open( PinName reset_pin )
Jeej 25:aac250164497 23 {
Jeej 25:aac250164497 24 FPRINT("\r\n");
Jeej 25:aac250164497 25 g_modem_ctx.thread = new Thread(d7a_modem_thread, NULL, osPriorityBelowNormal, DEFAULT_STACK_SIZE*2);
Jeej 26:9f0b9833cac6 26 g_modem_ctx.reset = new DigitalInOut(reset_pin, PIN_OUTPUT, OpenDrain, 0);
Jeej 26:9f0b9833cac6 27
Jeej 26:9f0b9833cac6 28 Thread::wait(10);
Jeej 25:aac250164497 29
Jeej 26:9f0b9833cac6 30 // Release reset pin
Jeej 26:9f0b9833cac6 31 *(g_modem_ctx.reset) = 1;
Jeej 26:9f0b9833cac6 32
Jeej 26:9f0b9833cac6 33 // Wait for modem ready
Jeej 26:9f0b9833cac6 34 osEvent evt = g_modem_ctx.boot.get(1000);
Jeej 26:9f0b9833cac6 35 ASSERT(evt.status == osEventMessage, "MODEM BOOT Timeout\r\n");
Jeej 25:aac250164497 36 }
Jeej 25:aac250164497 37
Jeej 26:9f0b9833cac6 38
Jeej 26:9f0b9833cac6 39 int32_t d7a_modem_wait_ready( uint32_t millisec )
Jeej 25:aac250164497 40 {
Jeej 25:aac250164497 41 FPRINT("\r\n");
Jeej 26:9f0b9833cac6 42 int32_t ret;
Jeej 26:9f0b9833cac6 43 osEvent evt = g_modem_ctx.ready.get(millisec);
Jeej 26:9f0b9833cac6 44 if (evt.status == osEventMessage)
Jeej 26:9f0b9833cac6 45 {
Jeej 26:9f0b9833cac6 46 ret = (int32_t)evt.value.p;
Jeej 26:9f0b9833cac6 47 }
Jeej 26:9f0b9833cac6 48 else
Jeej 26:9f0b9833cac6 49 {
Jeej 26:9f0b9833cac6 50 ret = (int32_t)0xFFFFFFFF;
Jeej 26:9f0b9833cac6 51 EPRINT("MODEM Wait Timeout!\r\n");
Jeej 26:9f0b9833cac6 52 }
Jeej 26:9f0b9833cac6 53 return ret;
Jeej 25:aac250164497 54 }
Jeej 25:aac250164497 55
Jeej 25:aac250164497 56 void d7a_modem_new_pkt(d7a_com_rx_msg_t* pkt)
Jeej 25:aac250164497 57 {
Jeej 25:aac250164497 58 FPRINT("\r\n");
Jeej 25:aac250164497 59 ASSERT(g_modem_ctx.pkt_queue.put(pkt) == osOK, "MODEM queue full!\r\n");
Jeej 25:aac250164497 60 }
Jeej 25:aac250164497 61
Jeej 25:aac250164497 62 d7a_com_rx_msg_t* d7a_modem_wait_pkt( uint32_t millisec )
Jeej 25:aac250164497 63 {
Jeej 25:aac250164497 64 FPRINT("\r\n");
Jeej 25:aac250164497 65 osEvent evt = g_modem_ctx.pkt_queue.get(millisec);
Jeej 25:aac250164497 66 return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL;
Jeej 25:aac250164497 67 }
Jeej 25:aac250164497 68
Jeej 25:aac250164497 69 static void d7a_modem_msg(uint8_t value, uint8_t* buf, uint8_t len)
Jeej 25:aac250164497 70 {
Jeej 25:aac250164497 71 FPRINT("(value:0x%02X, buf:0x%08x, len:%d)\r\n", value, buf, len);
Jeej 25:aac250164497 72 d7a_com_tx_msg_t msg;
Jeej 25:aac250164497 73 uint8_t val=value;
Jeej 25:aac250164497 74 msg.id = KAL_COM_FLOW_CMD;
Jeej 25:aac250164497 75 msg.pbuf = &val;
Jeej 25:aac250164497 76 msg.abuf = buf;
Jeej 25:aac250164497 77 msg.plen = 1;
Jeej 25:aac250164497 78 msg.alen = len;
Jeej 25:aac250164497 79 d7a_com_send_msg(&msg);
Jeej 25:aac250164497 80 }
Jeej 25:aac250164497 81
Jeej 25:aac250164497 82 void d7a_modem_register_file(uint8_t fid, uint8_t fifo_size, uint8_t flush_policy)
Jeej 25:aac250164497 83 {
Jeej 25:aac250164497 84 FPRINT("(fid:%d, fifo_size:%d, flush_policy:0x%02X)\r\n", fid, fifo_size, flush_policy);
Jeej 25:aac250164497 85 register_file_param_t rparams = {
Jeej 25:aac250164497 86 .bf.fid = fid ,
Jeej 25:aac250164497 87 .bf.fifo_size = fifo_size,
Jeej 25:aac250164497 88 .bf.flush_policy = flush_policy
Jeej 25:aac250164497 89 };
Jeej 25:aac250164497 90
Jeej 26:9f0b9833cac6 91 // Check If modem already has it
Jeej 26:9f0b9833cac6 92 DPRINT("Register: %d\n", rparams.bf.fid);
Jeej 26:9f0b9833cac6 93 d7a_fs_distant_stat(rparams.bf.fid, NULL);
Jeej 26:9f0b9833cac6 94 g_modem_ctx.status = (int32_t)d7a_fs_wait_done(TO_FS);
Jeej 26:9f0b9833cac6 95 if(g_modem_ctx.status < 0)
Jeej 25:aac250164497 96 {
Jeej 26:9f0b9833cac6 97 d7a_fs_properties_t props;
Jeej 26:9f0b9833cac6 98 // retrieve local properties
Jeej 26:9f0b9833cac6 99 d7a_fs_get_properties(rparams.bf.fid, KAL_FS_PROP_ALL, &props);
Jeej 25:aac250164497 100 // create a remote Host file matching our local one
Jeej 25:aac250164497 101 props.type = HOST;
Jeej 26:9f0b9833cac6 102 d7a_fs_distant_create(rparams.bf.fid, &props);
Jeej 26:9f0b9833cac6 103 g_modem_ctx.status = (int32_t)d7a_fs_wait_done(TO_FS);
Jeej 25:aac250164497 104 }
Jeej 26:9f0b9833cac6 105 if(g_modem_ctx.status == 0)
Jeej 26:9f0b9833cac6 106 {
Jeej 26:9f0b9833cac6 107 // Distant file is ready, lets register a D7A Interface for it
Jeej 26:9f0b9833cac6 108 d7a_modem_msg(WM_CMD_REGISTER_FILE,(uint8_t*)&rparams,sizeof(register_file_param_t));
Jeej 26:9f0b9833cac6 109 d7a_modem_wait_ready();
Jeej 26:9f0b9833cac6 110 }
Jeej 25:aac250164497 111 }
Jeej 25:aac250164497 112
Jeej 25:aac250164497 113 void d7a_modem_notify_file(uint8_t fid, uint32_t offset, uint32_t length)
Jeej 25:aac250164497 114 {
Jeej 25:aac250164497 115 FPRINT("(fid:%d, offset:%d, length:%d)\r\n", fid, offset, length);
Jeej 25:aac250164497 116 notify_file_param_t nfp = {
Jeej 25:aac250164497 117 .bf.fid = fid,
Jeej 25:aac250164497 118 .bf.offset = offset,
Jeej 25:aac250164497 119 .bf.size = length
Jeej 25:aac250164497 120 };
Jeej 25:aac250164497 121
Jeej 25:aac250164497 122 d7a_modem_msg(WM_CMD_NOTIFY_FILE,(uint8_t*)&nfp,sizeof(notify_file_param_t));
Jeej 25:aac250164497 123 d7a_modem_wait_ready();
Jeej 25:aac250164497 124 }
Jeej 25:aac250164497 125
Jeej 27:934ab7455115 126 void d7a_modem_infos( void )
Jeej 27:934ab7455115 127 {
Jeej 27:934ab7455115 128 uint8_t uid[8];
Jeej 27:934ab7455115 129 revision_t rev;
Jeej 27:934ab7455115 130
Jeej 27:934ab7455115 131 d7a_fs_read(0, uid, 0, 8);
Jeej 27:934ab7455115 132 d7a_fs_wait_done();
Jeej 27:934ab7455115 133
Jeej 27:934ab7455115 134 d7a_fs_read(2, &rev, 0, sizeof(revision_t));
Jeej 27:934ab7455115 135 d7a_fs_wait_done();
Jeej 27:934ab7455115 136
Jeej 27:934ab7455115 137 IPRINT("--- D7A Modem infos ---\r\n");
Jeej 27:934ab7455115 138 IPRINT("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 27:934ab7455115 139 IPRINT("Manufacturer ID: %08X\r\n", rev.manufacturer_id);
Jeej 27:934ab7455115 140 IPRINT("Device ID: %08X\r\n", rev.device_id);
Jeej 27:934ab7455115 141 IPRINT("Hardware version: %08X\r\n", rev.hw_version);
Jeej 27:934ab7455115 142 IPRINT("Firmware version: %d-%d.%d.%d-%08x\r\n", rev.fw_version.id, rev.fw_version.major, rev.fw_version.minor, rev.fw_version.patch, rev.fw_version.hash);
Jeej 27:934ab7455115 143 IPRINT("File system CRC: 0x%08x\r\n", rev.fs_crc);
Jeej 27:934ab7455115 144 IPRINT("-----------------------\r\n");
Jeej 27:934ab7455115 145 }
Jeej 27:934ab7455115 146
Jeej 27:934ab7455115 147
Jeej 25:aac250164497 148 void d7a_modem_thread(const void *p)
Jeej 25:aac250164497 149 {
Jeej 25:aac250164497 150 FPRINT("\r\n");
Jeej 25:aac250164497 151 d7a_com_rx_msg_t* pkt;
Jeej 25:aac250164497 152
Jeej 25:aac250164497 153 while (true)
Jeej 25:aac250164497 154 {
Jeej 25:aac250164497 155 pkt = d7a_modem_wait_pkt();
Jeej 25:aac250164497 156 ASSERT(pkt != NULL, "MODEM NULL pkt\r\n");
Jeej 25:aac250164497 157
Jeej 25:aac250164497 158 switch(pkt->id)
Jeej 25:aac250164497 159 {
Jeej 25:aac250164497 160 case KAL_COM_FLOW_CMD:
Jeej 25:aac250164497 161 uint8_t cmd = pkt->buffer[0];
Jeej 25:aac250164497 162 if (cmd == WM_CMD_READY)
Jeej 25:aac250164497 163 {
Jeej 26:9f0b9833cac6 164 DPRINT("Modem ready\r\n");
Jeej 26:9f0b9833cac6 165 g_modem_ctx.ready.put(NULL);
Jeej 26:9f0b9833cac6 166 }
Jeej 26:9f0b9833cac6 167 else if (cmd == WM_CMD_BOOT)
Jeej 26:9f0b9833cac6 168 {
Jeej 26:9f0b9833cac6 169 DPRINT("Modem booted\r\n");
Jeej 26:9f0b9833cac6 170 g_modem_ctx.boot.put(NULL);
Jeej 25:aac250164497 171 }
Jeej 25:aac250164497 172 else
Jeej 25:aac250164497 173 {
Jeej 25:aac250164497 174 EPRINT("MODEM Unknown cmd %d\r\n", cmd);
Jeej 25:aac250164497 175 }
Jeej 25:aac250164497 176 break;
Jeej 25:aac250164497 177 default:
Jeej 25:aac250164497 178 EPRINT("MODEM Unknown Flow ID 0x%02X\r\n", pkt->id);
Jeej 25:aac250164497 179 break;
Jeej 25:aac250164497 180 }
Jeej 25:aac250164497 181
Jeej 25:aac250164497 182 FREE(pkt);
Jeej 25:aac250164497 183 }
Jeej 25:aac250164497 184 }