Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of d7a_1x by
src/d7a_modem.cpp@31:ab9bfdbc6b44, 2016-06-02 (annotated)
- 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?
User | Revision | Line number | New 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 | } |