summaryrefslogtreecommitdiffstats
path: root/firmware
diff options
context:
space:
mode:
authorNick Foster <nick@nerdnetworks.org>2010-08-18 14:38:50 -0700
committerNick Foster <nick@nerdnetworks.org>2010-08-18 14:38:50 -0700
commit42547a0be8e52758d340fd1eba51a2dd5274a652 (patch)
tree5233f8799ff73adab77e17840c7604fb3a1aced7 /firmware
parent00ee9dddb649881c715012c48eed13d001ad5318 (diff)
downloaduhd-42547a0be8e52758d340fd1eba51a2dd5274a652.tar.gz
uhd-42547a0be8e52758d340fd1eba51a2dd5274a652.tar.bz2
uhd-42547a0be8e52758d340fd1eba51a2dd5274a652.zip
Moved UDP firmware update stuff out of fw_common.h into udp_fw_update.h.
This stuff should only go back into fw_common.h if we decide to integrate firmware update into the UHD code. Right now it's a separate Python script. Also moved udp_fw_update.h to lib/ because it's the same between USRP2 and USRP2P.
Diffstat (limited to 'firmware')
-rw-r--r--firmware/microblaze/Makefile.common9
-rw-r--r--firmware/microblaze/lib/udp_fw_update.h71
-rw-r--r--firmware/microblaze/usrp2/udp_fw_update.c4
-rw-r--r--firmware/microblaze/usrp2/udp_fw_update.h22
-rw-r--r--firmware/microblaze/usrp2p/Makefile.am2
-rw-r--r--firmware/microblaze/usrp2p/udp_fw_update.c20
-rw-r--r--firmware/microblaze/usrp2p/udp_fw_update.h22
7 files changed, 86 insertions, 64 deletions
diff --git a/firmware/microblaze/Makefile.common b/firmware/microblaze/Makefile.common
index ceb6a553a..4e726edab 100644
--- a/firmware/microblaze/Makefile.common
+++ b/firmware/microblaze/Makefile.common
@@ -59,8 +59,13 @@ COMMON_LFLAGS = \
########################################################################
# Common stuff for building top level microblaze images
########################################################################
+#we use COMMON_IHX_ARGS to relocate the reset and interrupt vectors to
+#just below the start of code. upon creating the BIN, any leading padding
+#is thrown out, so the .bin file is valid for uploading to USRP2P. this
+#does not affect USRP2 because the USRP2 already starts at 0x0000, and
+#because the relocate_args are not defined for USRP2's Makefile.am.
.elf.bin:
- $(MB_OBJCOPY) -O binary $< $@
+ $(MB_OBJCOPY) -O binary $(RELOCATE_ARGS) $< $@
.elf.dump:
$(MB_OBJDUMP) -DSC $< > $@
@@ -69,7 +74,7 @@ COMMON_LFLAGS = \
$(HEXDUMP) -v -e'1/1 "%.2X\n"' $< > $@
.elf.ihx:
- $(MB_OBJCOPY) -O ihex $(COMMON_IHX_ARGS) $< $@
+ $(MB_OBJCOPY) -O ihex $(RELOCATE_ARGS) $< $@
_generated_from_elf = \
$(noinst_PROGRAMS:.elf=.map) \
diff --git a/firmware/microblaze/lib/udp_fw_update.h b/firmware/microblaze/lib/udp_fw_update.h
new file mode 100644
index 000000000..d25525bd2
--- /dev/null
+++ b/firmware/microblaze/lib/udp_fw_update.h
@@ -0,0 +1,71 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2010 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/>.
+ */
+
+#include "net_common.h"
+
+#define USRP2_UDP_UPDATE_PORT 49154
+
+typedef enum {
+ USRP2_FW_UPDATE_ID_WAT = ' ',
+
+ USRP2_FW_UPDATE_ID_OHAI_LOL = 'a',
+ USRP2_FW_UPDATE_ID_OHAI_OMG = 'A',
+
+ USRP2_FW_UPDATE_ID_WATS_TEH_FLASH_INFO_LOL = 'f',
+ USRP2_FW_UPDATE_ID_HERES_TEH_FLASH_INFO_OMG = 'F',
+
+ USRP2_FW_UPDATE_ID_ERASE_TEH_FLASHES_LOL = 'e',
+ USRP2_FW_UPDATE_ID_ERASING_TEH_FLASHES_OMG = 'E',
+
+ USRP2_FW_UPDATE_ID_R_U_DONE_ERASING_LOL = 'd',
+ USRP2_FW_UPDATE_ID_IM_DONE_ERASING_OMG = 'D',
+ USRP2_FW_UPDATE_ID_NOPE_NOT_DONE_ERASING_OMG = 'B',
+
+ USRP2_FW_UPDATE_ID_WRITE_TEH_FLASHES_LOL = 'w',
+ USRP2_FW_UPDATE_ID_WROTE_TEH_FLASHES_OMG = 'W',
+
+ USRP2_FW_UPDATE_ID_READ_TEH_FLASHES_LOL = 'r',
+ USRP2_FW_UPDATE_ID_KK_READ_TEH_FLASHES_OMG = 'R',
+
+ USRP2_FW_UPDATE_ID_RESET_MAH_COMPUTORZ_LOL = 's',
+ USRP2_FW_UPDATE_ID_RESETTIN_TEH_COMPUTORZ_OMG = 'S',
+
+ USRP2_FW_UPDATE_ID_KTHXBAI = '~'
+
+} usrp2_fw_update_id_t;
+
+typedef struct {
+ uint32_t proto_ver;
+ uint32_t id;
+ uint32_t seq;
+ union {
+ uint32_t ip_addr;
+ struct {
+ uint32_t flash_addr;
+ uint32_t length;
+ uint8_t data[256];
+ } flash_args;
+ struct {
+ uint32_t sector_size_bytes;
+ uint32_t memory_size_bytes;
+ } flash_info_args;
+ } data;
+} usrp2_fw_update_data_t;
+
+void handle_udp_fw_update_packet(struct socket_address src, struct socket_address dst,
+ unsigned char *payload, int payload_len);
diff --git a/firmware/microblaze/usrp2/udp_fw_update.c b/firmware/microblaze/usrp2/udp_fw_update.c
index bd62aed85..14eb0b1ee 100644
--- a/firmware/microblaze/usrp2/udp_fw_update.c
+++ b/firmware/microblaze/usrp2/udp_fw_update.c
@@ -20,14 +20,14 @@
#include "net_common.h"
#include "usrp2/fw_common.h"
-#include "udp_fw_update.h"
#include <nonstdio.h>
+#include "udp_fw_update.h"
//Firmware update packet handler
void handle_udp_fw_update_packet(struct socket_address src, struct socket_address dst,
unsigned char *payload, int payload_len) {
- udp_fw_update_data_t update_data_out;
+ usrp2_fw_update_data_t update_data_out;
update_data_out.id = USRP2_FW_UPDATE_ID_WAT;
send_udp_pkt(USRP2_UDP_UPDATE_PORT, src, &update_data_out, sizeof(update_data_out));
diff --git a/firmware/microblaze/usrp2/udp_fw_update.h b/firmware/microblaze/usrp2/udp_fw_update.h
deleted file mode 100644
index dcf44bc42..000000000
--- a/firmware/microblaze/usrp2/udp_fw_update.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2010 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/>.
- */
-
-#include "net_common.h"
-
-void handle_udp_fw_update_packet(struct socket_address src, struct socket_address dst,
- unsigned char *payload, int payload_len);
diff --git a/firmware/microblaze/usrp2p/Makefile.am b/firmware/microblaze/usrp2p/Makefile.am
index c9ed3b99b..e6bff2dbc 100644
--- a/firmware/microblaze/usrp2p/Makefile.am
+++ b/firmware/microblaze/usrp2p/Makefile.am
@@ -27,7 +27,7 @@ AM_LDFLAGS = \
-Wl,-defsym -Wl,_STACK_SIZE=3072
#all of this here is to relocate the hardware vectors to somewhere normal.
-COMMON_IHX_ARGS = \
+RELOCATE_ARGS = \
--change-section-address .vectors.sw_exception+0x8000 \
--change-section-address .vectors.hw_exception+0x8000 \
--change-section-address .vectors.interrupt+0x8000 \
diff --git a/firmware/microblaze/usrp2p/udp_fw_update.c b/firmware/microblaze/usrp2p/udp_fw_update.c
index 6b860007a..9242242e7 100644
--- a/firmware/microblaze/usrp2p/udp_fw_update.c
+++ b/firmware/microblaze/usrp2p/udp_fw_update.c
@@ -22,28 +22,18 @@
#include "usrp2/fw_common.h"
#include "spi.h"
#include "spi_flash.h"
-#include "udp_fw_update.h"
#include <nonstdio.h>
#include <string.h>
#include "ethernet.h"
+#include "udp_fw_update.h"
//Firmware update packet handler
void handle_udp_fw_update_packet(struct socket_address src, struct socket_address dst,
unsigned char *payload, int payload_len) {
-//okay, we can do this ANY NUMBER of ways. we have up to ~1500 bytes to play with -- we don't handle
-//fragmentation, so limit it to <MTU. let's say 1K. remember that SPI Flash page writes can only be up to 256B(?) long,
-//so if your SPI Flash write routine doesn't handle that, you will have to on the host side (or in here).
-//so here are your options:
-
-//IHEX -- 16 bytes at a time, relocated for you. parser is already written. possibly extra slow due to the small packet size.
-//custom struct -- addr, data, len. you can checksum this if you like, but it is already checksummed in UDP (as well as on the wire).
-// this option needs minimal parsing on the device side and is a straight Flash write. no interpretation required. all the brains
-// go on the host side. how is relocation handled? well, your fw images are supposed to be "fully relocated" such that you can just
-// stick 'em anywhere, so a .bin (provided it's relocated to 0 for the wire) plus a location is good enough. let's go this route.
- const udp_fw_update_data_t *update_data_in = (udp_fw_update_data_t *) payload;
+ const usrp2_fw_update_data_t *update_data_in = (usrp2_fw_update_data_t *) payload;
- udp_fw_update_data_t update_data_out;
+ usrp2_fw_update_data_t update_data_out;
usrp2_fw_update_id_t update_data_in_id = update_data_in->id;
//ensure that the protocol versions match
@@ -55,9 +45,9 @@ void handle_udp_fw_update_packet(struct socket_address src, struct socket_addres
}
//ensure that this is not a short packet
- if (payload_len < sizeof(udp_fw_update_data_t)){
+ if (payload_len < sizeof(usrp2_fw_update_data_t)){
printf("!Error in update packet handler: Expected payload length %d, but got %d\n",
- (int)sizeof(udp_fw_update_data_t), payload_len
+ (int)sizeof(usrp2_fw_update_data_t), payload_len
);
update_data_in_id = USRP2_FW_UPDATE_ID_WAT;
}
diff --git a/firmware/microblaze/usrp2p/udp_fw_update.h b/firmware/microblaze/usrp2p/udp_fw_update.h
deleted file mode 100644
index dcf44bc42..000000000
--- a/firmware/microblaze/usrp2p/udp_fw_update.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/* -*- c++ -*- */
-/*
- * Copyright 2010 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/>.
- */
-
-#include "net_common.h"
-
-void handle_udp_fw_update_packet(struct socket_address src, struct socket_address dst,
- unsigned char *payload, int payload_len);