aboutsummaryrefslogtreecommitdiffstats
path: root/firmware/octoclock/octoclock_r4
diff options
context:
space:
mode:
authorNicholas Corgan <nick.corgan@ettus.com>2014-07-17 11:50:50 -0700
committerNicholas Corgan <nick.corgan@ettus.com>2014-07-23 07:37:32 -0700
commita6e18604befdb6a954542f7722c8d55424065621 (patch)
tree22168e6f4c41c931e38ccd07ff8881b56c8cd88a /firmware/octoclock/octoclock_r4
parent7423d1691fff3af08f8e42e3e09d8c8d9ec99fe8 (diff)
downloaduhd-a6e18604befdb6a954542f7722c8d55424065621.tar.gz
uhd-a6e18604befdb6a954542f7722c8d55424065621.tar.bz2
uhd-a6e18604befdb6a954542f7722c8d55424065621.zip
OctoClock firmware upgrade, added host driver
* OctoClock can communicate with UHD over Ethernet * Can read NMEA strings from GPSDO and send to host * Added multi_usrp_clock class for clock devices * uhd::device can now filter to return only USRP devices or clock devices * New OctoClock bootloader can accept firmware download over Ethernet * Added octoclock_burn_eeprom,octoclock_firmware_burner utilities * Added test_clock_synch example to show clock API
Diffstat (limited to 'firmware/octoclock/octoclock_r4')
-rw-r--r--firmware/octoclock/octoclock_r4/CMakeLists.txt47
-rw-r--r--firmware/octoclock/octoclock_r4/octoclock_r4_main.c158
2 files changed, 205 insertions, 0 deletions
diff --git a/firmware/octoclock/octoclock_r4/CMakeLists.txt b/firmware/octoclock/octoclock_r4/CMakeLists.txt
new file mode 100644
index 000000000..a030d3249
--- /dev/null
+++ b/firmware/octoclock/octoclock_r4/CMakeLists.txt
@@ -0,0 +1,47 @@
+#
+# Copyright 2014 Ettus Research LLC
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+#
+
+add_executable(octoclock_r4_fw.elf octoclock_r4_main.c)
+target_link_libraries(octoclock_r4_fw.elf octoclock)
+
+add_custom_command(
+ OUTPUT ${CMAKE_BINARY_DIR}/octoclock_r4_fw.bin
+ DEPENDS octoclock_r4_fw.elf
+ COMMENT "Generating octoclock_r4_fw.bin"
+ COMMAND ${AVR_OBJCOPY} -O binary ${CMAKE_CURRENT_BINARY_DIR}/octoclock_r4_fw.elf ${CMAKE_BINARY_DIR}/octoclock_r4_fw.bin
+)
+add_custom_target(
+ octoclock_r4_fw_bin ALL
+ DEPENDS ${CMAKE_BINARY_DIR}/octoclock_r4_fw.bin
+)
+add_custom_command(
+ OUTPUT ${CMAKE_BINARY_DIR}/octoclock_r4_fw.hex
+ DEPENDS octoclock_r4_fw.elf
+ COMMENT "Generating octoclock_r4_fw.hex"
+ COMMAND ${AVR_OBJCOPY} -O ihex ${CMAKE_CURRENT_BINARY_DIR}/octoclock_r4_fw.elf ${CMAKE_BINARY_DIR}/octoclock_r4_fw.hex
+)
+add_custom_target(
+ octoclock_r4_fw_hex ALL
+ DEPENDS ${CMAKE_BINARY_DIR}/octoclock_r4_fw.hex
+)
+add_custom_target(
+ upload_r4
+ ${AVRDUDE} -p atmega128 -c ${PROGRAMMER} -P usb -U efuse:w:0xFF:m -U hfuse:w:0x81:m -U lfuse:w:0xFF:m -U flash:w:octoclock_r4_fw.hex:i
+ WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+ DEPENDS octoclock_r4_fw_hex
+ COMMENT "Uploading OctoClock firmware to device with ${PROGRAMMER}"
+)
diff --git a/firmware/octoclock/octoclock_r4/octoclock_r4_main.c b/firmware/octoclock/octoclock_r4/octoclock_r4_main.c
new file mode 100644
index 000000000..f80c7d188
--- /dev/null
+++ b/firmware/octoclock/octoclock_r4/octoclock_r4_main.c
@@ -0,0 +1,158 @@
+/*
+ * Copyright 2013-2014 Ettus Research LLC
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * Welcome to the firmware code for the USRP Octoclock accessory product!
+ *
+ * Notes regarding this firmware:
+ * NOT in M103 compatibility mode
+ * CKOPT full rail-to-rail
+ * xtal osc
+ * 16K CK (16K clock cycles)
+ * additional delay 65ms for Crystal Oscillator
+ * slowly rising power
+ * persistent EEPROM
+ *
+ * These settings are very conservative. If a lower power oscillator is
+ * required, change CKOPT to '1' (UNPROGRAMMED).
+ *
+ * M103C = [ ]
+ * WDTON = [ ]
+ * OCDEN = [ ]
+ * JTAGEN = [X]
+ * SPIEN = [X]
+ * EESAVE = [X]
+ * BOOTSZ = 4096W_F000
+ * BOOTRST = [ ]
+ * CKOPT = [X]
+ * BODLEVEL = 2V7
+ * BODEN = [ ]
+ * SUT_CKSEL = EXTHIFXTALRES_16KCK_64MS
+ *
+ * EXTENDED = 0xFF (valid)
+ * HIGH = 0x81 (valid)
+ * LOW = 0xFF (valid)
+ *
+ */
+
+#include <string.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+#include <avr/eeprom.h>
+#include <avr/io.h>
+
+#include <octoclock.h>
+#include <clkdist.h>
+#include <debug.h>
+#include <state.h>
+#include <network.h>
+#include <usart.h>
+#include <gpsdo.h>
+#include <net/enc28j60.h>
+#include <net/udp_handlers.h>
+
+/*******************************************************************************
+* Main Routine
+*******************************************************************************/
+
+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();
+ 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
+ usart_init();
+
+ //Set initial ClkDist and front panel settings
+ led(Middle,true);
+ setup_TI_CDCE18005(Primary_GPS); // 10 MHz from Internal Source
+
+ 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;
+
+ // 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);
+ }
+}