diff options
author | Nicholas Corgan <nick.corgan@ettus.com> | 2014-08-15 12:57:10 -0700 |
---|---|---|
committer | Nicholas Corgan <nick.corgan@ettus.com> | 2014-08-20 09:42:26 -0700 |
commit | 2de96cd57c3f19bfa778ccad280ad19170af0967 (patch) | |
tree | 88e5235bbbc1df0dd5d6ce1883203a09f3e07ea3 /firmware/octoclock/octoclock_r4 | |
parent | 9fb6c2919ad9e7e736c837186861b362ba80cdfa (diff) | |
download | uhd-2de96cd57c3f19bfa778ccad280ad19170af0967.tar.gz uhd-2de96cd57c3f19bfa778ccad280ad19170af0967.tar.bz2 uhd-2de96cd57c3f19bfa778ccad280ad19170af0967.zip |
OctoClock: bugfixes/improvements
* Fixed Ethernet initialization problem
* Improved external reference detection
* Added gratuitous ARP, sent upon power-up
* Tweaked host-side timing for initialization and firmware burning
* Fixed logic for dealing with firmware incompatibility
* Misc efficiency/reliability improvements to firmware's network code
Diffstat (limited to 'firmware/octoclock/octoclock_r4')
-rw-r--r-- | firmware/octoclock/octoclock_r4/CMakeLists.txt | 3 | ||||
-rw-r--r-- | firmware/octoclock/octoclock_r4/octoclock_r4_main.c | 71 |
2 files changed, 12 insertions, 62 deletions
diff --git a/firmware/octoclock/octoclock_r4/CMakeLists.txt b/firmware/octoclock/octoclock_r4/CMakeLists.txt index a030d3249..c3559d8d4 100644 --- a/firmware/octoclock/octoclock_r4/CMakeLists.txt +++ b/firmware/octoclock/octoclock_r4/CMakeLists.txt @@ -17,6 +17,9 @@ add_executable(octoclock_r4_fw.elf octoclock_r4_main.c) target_link_libraries(octoclock_r4_fw.elf octoclock) +set_target_properties(octoclock_r4_fw.elf PROPERTIES + LINK_FLAGS "-Wl,--relax,-Map=octoclock_r4_fw.map,--cref" +) add_custom_command( OUTPUT ${CMAKE_BINARY_DIR}/octoclock_r4_fw.bin diff --git a/firmware/octoclock/octoclock_r4/octoclock_r4_main.c b/firmware/octoclock/octoclock_r4/octoclock_r4_main.c index f80c7d188..5e8e6d09b 100644 --- a/firmware/octoclock/octoclock_r4/octoclock_r4_main.c +++ b/firmware/octoclock/octoclock_r4/octoclock_r4_main.c @@ -72,23 +72,21 @@ int main(void){ - #ifdef DEBUG asm("cli"); - #else - asm("sei"); - #endif - - bool old_global_ext_ref_is_present = false; - switch_pos_t old_switch_pos, current_switch_pos; setup_atmel_io_ports(); - network_init(); + + #ifndef DEBUG + asm("sei"); + #endif + init_udp_listeners(); register_udp_listener(OCTOCLOCK_UDP_CTRL_PORT, handle_udp_ctrl_packet); register_udp_listener(OCTOCLOCK_UDP_GPSDO_PORT, handle_udp_gpsdo_packet); DEBUG_INIT(); // Does nothing when not in debug mode + DEBUG_LOG(" "); //Force a newline between runs usart_init(); //Set initial ClkDist and front panel settings @@ -98,61 +96,10 @@ int main(void){ led(Top,true); PORTA |= (1<<PA6); // PPS from Internal source - /* - * DO THIS FOREVER: - * - * get_switch_state - * - * if SWITCH_CHANGED: - * - * if PREFER_INTERNAL: - * if INTERNAL_PRESENT do_internal - * else if EXTERNAL_PRESENT do_external - * else LEDs OFF - * - * if PREFER_EXTERNAL: - * if EXTERNAL_PRESENT do_external - * else if INTERNAL_PRESENT do_internal - * else LEDs OFF - * - * check Ethernet port for incoming packets - * - * if packets seen: - * pass to appropriate handler - * - * check if told to monitor GPSDO output - * - * if send flag is set: - * check if interrupt routine has filled buffer with full sentence - * if so, send to host (last machine to use this port) - */ - - check_what_is_present(); - old_global_ext_ref_is_present = !global_ext_ref_is_present; - old_switch_pos = (get_switch_pos() == UP) ? DOWN : UP; + TIMER0_INIT(); + TIMER1_INIT(); - // Because down below, we use this to get state swap So we arbitrarily set - // the PREVIOUS state to be the "other" state so that, below, we trigger - // what happens when the switch changes This first "change" is therefore - // artificial to keep the logic, below, cleaner while(true) { - // Set "global_ext_ref_is_present" and "global_gps_present" - check_what_is_present(); - - current_switch_pos = get_switch_pos(); - - if( (current_switch_pos != old_switch_pos) || - (global_ext_ref_is_present != old_global_ext_ref_is_present) ) { - - old_switch_pos = current_switch_pos; - old_global_ext_ref_is_present = global_ext_ref_is_present; - - if(current_switch_pos == UP) prefer_internal(); - else prefer_external(); - } - - //With OctoClock state verified, pass raw packet to handlers for processing - size_t recv_len = enc28j60PacketReceive(512, buf_in); - if(recv_len > 0) handle_eth_packet(recv_len); + network_check(); } } |