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
Diff: src/d7a_modem.cpp
- Revision:
- 30:d775c1409849
- Parent:
- 29:8e7c5c1e9aab
- Child:
- 31:ab9bfdbc6b44
diff -r 8e7c5c1e9aab -r d775c1409849 src/d7a_modem.cpp --- a/src/d7a_modem.cpp Tue May 03 16:53:52 2016 +0000 +++ b/src/d7a_modem.cpp Wed May 25 08:23:15 2016 +0000 @@ -15,7 +15,7 @@ Queue<d7a_com_rx_msg_t, 16> pkt_queue; int8_t status; DigitalInOut* reset; - uint8_t waiting_count; + int16_t waiting_count; uint8_t ready_count; } d7a_modem_ctx_t; @@ -28,41 +28,56 @@ FPRINT("\r\n"); g_modem_ctx.ressource = new Semaphore(1); - g_modem_ctx.thread = new Thread(d7a_modem_thread, NULL, osPriorityBelowNormal, DEFAULT_STACK_SIZE*2); - g_modem_ctx.reset = new DigitalInOut(reset_pin, PIN_OUTPUT, OpenDrain, 0); + g_modem_ctx.thread = new Thread(d7a_modem_thread, NULL, osPriorityBelowNormal, DEFAULT_STACK_SIZE); g_modem_ctx.waiting_count = 0; g_modem_ctx.ready_count = 0; + if (reset_pin == NC) + { + g_modem_ctx.reset = NULL; + } + else + { + g_modem_ctx.reset = new DigitalInOut(reset_pin, PIN_OUTPUT, OpenDrain, 0); + } + Thread::wait(10); - // Release reset pin - *(g_modem_ctx.reset) = 1; + d7a_modem_reset(); // Wait for modem ready - - //Thread::wait(100); - //ASSERT(d7a_sys_ping_modem(), "MODEM BOOT Timeout\r\n"); - - osEvent evt = g_modem_ctx.boot.get(1000); + osEvent evt = g_modem_ctx.boot.get(5000); ASSERT(evt.status == osEventMessage, "MODEM BOOT Timeout\r\n"); + IPRINT("MODEM Boot OK.\r\n"); + ASSERT(d7a_modem_wait_ready(2000), "MODEM READY Timeout\r\n"); + IPRINT("MODEM Ready.\r\n"); } - -int32_t d7a_modem_wait_ready( uint32_t millisec ) +void d7a_modem_reset( void ) { - FPRINT("(%d)\r\n", ++g_modem_ctx.waiting_count); - int32_t ret; - osEvent evt = g_modem_ctx.ready.get(millisec); - if (evt.status == osEventMessage) + if (g_modem_ctx.reset == NULL) { - ret = (int32_t)evt.value.p; + // Try software reset + d7a_sys_software_reset(); } else { - ret = (int32_t)0xFFFFFFFF; - EPRINT("MODEM Wait Timeout!\r\n"); + // Use hardware reset + // Assert reset pin + *(g_modem_ctx.reset) = 0; + Thread::wait(10); + // Release reset pin + *(g_modem_ctx.reset) = 1; + Thread::wait(10); } - return ret; +} + +bool d7a_modem_wait_ready( uint32_t millisec ) +{ + g_modem_ctx.waiting_count++; + FPRINT("(%d)\r\n", g_modem_ctx.waiting_count); + osEvent evt = g_modem_ctx.ready.get(millisec); + return (evt.status == osEventMessage)? true: false; } void d7a_modem_new_pkt(d7a_com_rx_msg_t* pkt) @@ -73,12 +88,12 @@ d7a_com_rx_msg_t* d7a_modem_wait_pkt( uint32_t millisec ) { - FPRINT("\r\n"); + FPRINT("(millisec:%d)\r\n", millisec); osEvent evt = g_modem_ctx.pkt_queue.get(millisec); return (evt.status == osEventMessage)? (d7a_com_rx_msg_t*)evt.value.p : NULL; } -static void d7a_modem_msg(uint8_t value, uint8_t* buf, uint8_t len) +void d7a_modem_msg(uint8_t value, uint8_t* buf, uint8_t len) { FPRINT("(value:0x%02X, buf:0x%08x, len:%d)\r\n", value, buf, len); d7a_com_tx_msg_t msg; @@ -91,22 +106,23 @@ d7a_com_send_msg(&msg); } -void d7a_modem_register_file(uint8_t fid, uint8_t fifo_size, uint8_t flush_policy) +bool d7a_modem_register_file(uint8_t fid, uint8_t retry_policy) { g_modem_ctx.ressource->wait(); - FPRINT("(fid:%d, fifo_size:%d, flush_policy:0x%02X)\r\n", fid, fifo_size, flush_policy); + bool ret = true; + + FPRINT("(fid:%d, retry_policy:0x%02X)\r\n", fid, retry_policy); register_file_param_t rparams = { .bf.fid = fid , - .bf.fifo_size = fifo_size, - .bf.flush_policy = flush_policy + .bf.retry_policy = retry_policy }; // Check If modem already has it - DPRINT("Register: %d\n", rparams.bf.fid); + DPRINT("Register: %d\r\n", rparams.bf.fid); d7a_fs_distant_stat(rparams.bf.fid, NULL); g_modem_ctx.status = (int32_t)d7a_fs_wait_done(TO_FS); - if(g_modem_ctx.status < 0) + if (g_modem_ctx.status < 0) { d7a_fs_properties_t props; // retrieve local properties @@ -117,14 +133,21 @@ g_modem_ctx.status = (int32_t)d7a_fs_wait_done(TO_FS); } - if(g_modem_ctx.status == 0) + if (g_modem_ctx.status == 0) { // Distant file is ready, lets register a D7A Interface for it d7a_modem_msg(WM_CMD_REGISTER_FILE,(uint8_t*)&rparams,sizeof(register_file_param_t)); - d7a_modem_wait_ready(); + ret = d7a_modem_wait_ready(TO_FS); + } + else + { + ret = false; } + DPRINT("Register done.\r\n"); g_modem_ctx.ressource->release(); + + return ret; } void d7a_modem_notify_file(uint8_t fid, uint32_t offset, uint32_t length) @@ -132,6 +155,8 @@ g_modem_ctx.ressource->wait(); FPRINT("(fid:%d, offset:%d, length:%d)\r\n", fid, offset, length); + DPRINT("Notify %d.\r\n", fid); + notify_file_param_t nfp = { .bf.fid = fid, .bf.offset = offset, @@ -139,23 +164,26 @@ }; d7a_modem_msg(WM_CMD_NOTIFY_FILE,(uint8_t*)&nfp,sizeof(notify_file_param_t)); - WARNING(d7a_modem_wait_ready(1000) != 0xFFFFFFFF, "Notification Timeout\r\n"); + WARNING(d7a_modem_wait_ready(TO_FS), "Notification Timeout on FID:%d\r\n", fid); - //Thread::wait(100); // XXX: To avoid concurrent file access + Thread::wait(100); // XXX: To avoid lost packets + DPRINT("Notify %d done.\r\n", fid); g_modem_ctx.ressource->release(); } -void d7a_modem_infos( void ) +void d7a_modem_print_infos( void ) { uint8_t uid[8]; revision_t rev; + g_modem_ctx.ressource->wait(); + d7a_fs_read(0, uid, 0, 8); - d7a_fs_wait_done(); + d7a_fs_wait_done(TO_FS); d7a_fs_read(2, &rev, 0, sizeof(revision_t)); - d7a_fs_wait_done(); + d7a_fs_wait_done(TO_FS); IPRINT("--- D7A Modem infos ---\r\n"); 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]); @@ -164,7 +192,9 @@ IPRINT("Hardware version: %08X\r\n", rev.hw_version); 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); IPRINT("File system CRC: 0x%08x\r\n", rev.fs_crc); - IPRINT("-----------------------\r\n"); + IPRINT("-----------------------\r\n"); + + g_modem_ctx.ressource->release(); } @@ -184,7 +214,8 @@ uint8_t cmd = pkt->buffer[0]; if (cmd == WM_CMD_READY) { - FPRINT("(Modem ready (%d))\r\n", --g_modem_ctx.waiting_count); + g_modem_ctx.waiting_count--; + DPRINT("Modem ready (%d)\r\n", g_modem_ctx.waiting_count); g_modem_ctx.ready.put(NULL); } else if (cmd == WM_CMD_BOOT)