aboutsummaryrefslogtreecommitdiffstats
path: root/firmware/octoclock/octoclock_r4
diff options
context:
space:
mode:
authorNicholas Corgan <nick.corgan@ettus.com>2014-08-15 12:57:10 -0700
committerNicholas Corgan <nick.corgan@ettus.com>2014-08-20 09:42:26 -0700
commit2de96cd57c3f19bfa778ccad280ad19170af0967 (patch)
tree88e5235bbbc1df0dd5d6ce1883203a09f3e07ea3 /firmware/octoclock/octoclock_r4
parent9fb6c2919ad9e7e736c837186861b362ba80cdfa (diff)
downloaduhd-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.txt3
-rw-r--r--firmware/octoclock/octoclock_r4/octoclock_r4_main.c71
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();
}
}