diff options
| author | Nick Foster <nick@nerdnetworks.org> | 2010-08-18 14:38:50 -0700 | 
|---|---|---|
| committer | Nick Foster <nick@nerdnetworks.org> | 2010-08-18 14:38:50 -0700 | 
| commit | 42547a0be8e52758d340fd1eba51a2dd5274a652 (patch) | |
| tree | 5233f8799ff73adab77e17840c7604fb3a1aced7 | |
| parent | 00ee9dddb649881c715012c48eed13d001ad5318 (diff) | |
| download | uhd-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.
| -rw-r--r-- | firmware/microblaze/Makefile.common | 9 | ||||
| -rw-r--r-- | firmware/microblaze/lib/udp_fw_update.h | 71 | ||||
| -rw-r--r-- | firmware/microblaze/usrp2/udp_fw_update.c | 4 | ||||
| -rw-r--r-- | firmware/microblaze/usrp2/udp_fw_update.h | 22 | ||||
| -rw-r--r-- | firmware/microblaze/usrp2p/Makefile.am | 2 | ||||
| -rw-r--r-- | firmware/microblaze/usrp2p/udp_fw_update.c | 20 | ||||
| -rw-r--r-- | firmware/microblaze/usrp2p/udp_fw_update.h | 22 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/fw_common.h | 48 | ||||
| -rwxr-xr-x | host/utils/usrp2p_fw_update.py | 2 | 
9 files changed, 87 insertions, 113 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); diff --git a/host/lib/usrp/usrp2/fw_common.h b/host/lib/usrp/usrp2/fw_common.h index 320ed7d77..4d3b62d6b 100644 --- a/host/lib/usrp/usrp2/fw_common.h +++ b/host/lib/usrp/usrp2/fw_common.h @@ -43,7 +43,6 @@ extern "C" {  // Dynamic and/or private ports: 49152-65535  #define USRP2_UDP_CTRL_PORT 49152  #define USRP2_UDP_DATA_PORT 49153 -#define USRP2_UDP_UPDATE_PORT 49154 //for firmware upgrade commands  ////////////////////////////////////////////////////////////////////////  // I2C addresses @@ -94,35 +93,6 @@ typedef enum{  } usrp2_ctrl_id_t; -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 enum{      USRP2_DIR_RX = 'r',      USRP2_DIR_TX = 't' @@ -167,24 +137,6 @@ typedef struct{      } data;  } usrp2_ctrl_data_t; -typedef struct { -  __stdint(uint32_t) proto_ver; -  __stdint(uint32_t) id; -  __stdint(uint32_t) seq; -  union { -      __stdint(uint32_t) ip_addr; -    struct { -      __stdint(uint32_t) flash_addr; -      __stdint(uint32_t) length; -      __stdint(uint8_t)  data[256]; -    } flash_args; -    struct { -      __stdint(uint32_t) sector_size_bytes; -      __stdint(uint32_t) memory_size_bytes; -    } flash_info_args; -  } data; -} udp_fw_update_data_t; -  #undef __stdint  #ifdef __cplusplus  } diff --git a/host/utils/usrp2p_fw_update.py b/host/utils/usrp2p_fw_update.py index b15542933..5eff83c07 100755 --- a/host/utils/usrp2p_fw_update.py +++ b/host/utils/usrp2p_fw_update.py @@ -36,7 +36,7 @@ UDP_MAX_XFER_BYTES = 1024  UDP_TIMEOUT = 3  UDP_POLL_INTERVAL = 0.10 #in seconds -USRP2_FW_PROTO_VERSION = 5 +USRP2_FW_PROTO_VERSION = 6  #from bootloader_utils.h  PROD_FPGA_IMAGE_LOCATION_ADDR = 0x00200000 | 
