diff options
| -rw-r--r-- | firmware/usrp3/x300/x300_main.c | 41 | ||||
| -rw-r--r-- | host/lib/usrp/x300/x300_fw_common.h | 16 | 
2 files changed, 56 insertions, 1 deletions
| diff --git a/firmware/usrp3/x300/x300_main.c b/firmware/usrp3/x300/x300_main.c index 459f7b0b1..3de9283eb 100644 --- a/firmware/usrp3/x300/x300_main.c +++ b/firmware/usrp3/x300/x300_main.c @@ -1,4 +1,4 @@ -// Copyright 2013-2014 Ettus Research LLC +// Copyright 2013-2017 Ettus Research  #include "x300_init.h"  #include "x300_defs.h" @@ -188,6 +188,44 @@ void handle_udp_fpga_prog(  }  /*********************************************************************** + * Handler for FPGA image reading packets + **********************************************************************/ +void handle_udp_fpga_read( +    const uint8_t ethno, +    const struct ip_addr *src, const struct ip_addr *dst, +    const uint16_t src_port, const uint16_t dst_port, +    const void *buff, const size_t num_bytes +) +{ +    const x300_fpga_read_t *request = (const x300_fpga_read_t *) buff; +    x300_fpga_read_reply_t reply = {0}; +    bool status = true; + +    if (buff == NULL) { +        return; +    } else if (num_bytes < offsetof(x300_fpga_read_t, size)) { +        reply.flags |= X300_FPGA_READ_FLAGS_ERROR; +    } else { +        if (request->flags & X300_FPGA_READ_FLAGS_INIT) { +            STATUS_MERGE(chinch_flash_init(), status); +        } else if (request->flags & X300_FPGA_READ_FLAGS_CLEANUP) { +            chinch_flash_cleanup(); +        } else { +            reply.flags |= X300_FPGA_READ_FLAGS_ACK; +            reply.sector = request->sector; +            reply.index  = request->index; +            reply.size   = request->size; + +            STATUS_MERGE(chinch_flash_select_sector(request->sector), status); +            STATUS_MERGE(chinch_flash_read_buf(request->index*2, reply.data, request->size), status); +        } +    } + +    if (!status) reply.flags |= X300_FPGA_READ_FLAGS_ERROR; +    u3_net_stack_send_udp_pkt(ethno, src, dst_port, src_port, &reply, sizeof(reply)); +} + +/***********************************************************************   * Handler for MTU detection   **********************************************************************/  void handle_udp_mtu_detect( @@ -411,6 +449,7 @@ int main(void)      u3_net_stack_register_udp_handler(X300_FW_COMMS_UDP_PORT, &handle_udp_fw_comms);      u3_net_stack_register_udp_handler(X300_VITA_UDP_PORT, &handle_udp_prog_framer);      u3_net_stack_register_udp_handler(X300_FPGA_PROG_UDP_PORT, &handle_udp_fpga_prog); +    u3_net_stack_register_udp_handler(X300_FPGA_READ_UDP_PORT, &handle_udp_fpga_read);      u3_net_stack_register_udp_handler(X300_MTU_DETECT_UDP_PORT, &handle_udp_mtu_detect);      uint32_t last_cronjob = 0; diff --git a/host/lib/usrp/x300/x300_fw_common.h b/host/lib/usrp/x300/x300_fw_common.h index b83449666..56b457791 100644 --- a/host/lib/usrp/x300/x300_fw_common.h +++ b/host/lib/usrp/x300/x300_fw_common.h @@ -61,6 +61,7 @@ extern "C" {  #define X300_GPSDO_UDP_PORT 49156  #define X300_FPGA_PROG_UDP_PORT 49157  #define X300_MTU_DETECT_UDP_PORT 49158 +#define X300_FPGA_READ_UDP_PORT 49159  #define X300_DEFAULT_MAC_ADDR_0         {0x00, 0x50, 0xC2, 0x85, 0x3f, 0xff}  #define X300_DEFAULT_MAC_ADDR_1         {0x00, 0x50, 0xC2, 0x85, 0x3f, 0x33} @@ -91,6 +92,11 @@ extern "C" {  #define X300_FPGA_PROG_CONFIGURE       (1 << 6)  #define X300_FPGA_PROG_CONFIG_STATUS   (1 << 7) +#define X300_FPGA_READ_FLAGS_ACK       (1 << 0) +#define X300_FPGA_READ_FLAGS_ERROR     (1 << 1) +#define X300_FPGA_READ_FLAGS_INIT      (1 << 2) +#define X300_FPGA_READ_FLAGS_CLEANUP   (1 << 3) +  #define X300_MTU_DETECT_ECHO_REQUEST (1 << 0)  #define X300_MTU_DETECT_ECHO_REPLY (1 << 1)  #define X300_MTU_DETECT_ERROR (1 << 2) @@ -144,6 +150,16 @@ typedef struct  typedef struct  {      uint32_t flags; +    uint32_t sector; +    uint32_t index; +    uint32_t size; +} x300_fpga_read_t; + +typedef x300_fpga_prog_t x300_fpga_read_reply_t; + +typedef struct +{ +    uint32_t flags;      uint32_t size;  } x300_mtu_t; | 
