diff options
Diffstat (limited to 'firmware/zpu/apps/txrx_uhd.c')
-rw-r--r-- | firmware/zpu/apps/txrx_uhd.c | 224 |
1 files changed, 82 insertions, 142 deletions
diff --git a/firmware/zpu/apps/txrx_uhd.c b/firmware/zpu/apps/txrx_uhd.c index 68c24e872..975ec58e2 100644 --- a/firmware/zpu/apps/txrx_uhd.c +++ b/firmware/zpu/apps/txrx_uhd.c @@ -1,8 +1,5 @@ -// -// Copyright 2010-2011 Ettus Research LLC -// /* - * Copyright 2007,2008 Free Software Foundation, Inc. + * Copyright 2010-2011 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 @@ -18,94 +15,65 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include <lwip/ip.h> -#include <lwip/udp.h> +//peripheral headers #include "u2_init.h" -#include "memory_map.h" #include "spi.h" +#include "i2c.h" #include "hal_io.h" #include "pic.h" -#include <stdbool.h> -#include "ethernet.h" + +//printf headers #include "nonstdio.h" -#include <net/padded_eth_hdr.h> -#include <net_common.h> -#include "memcpy_wa.h" -#include <stddef.h> -#include <stdlib.h> -#include <string.h> -#include "clocks.h" + +//network headers +#include "arp_cache.h" +#include "ethernet.h" +#include "net_common.h" #include "usrp2/fw_common.h" -#include <i2c.h> -#include <ethertype.h> -#include <arp_cache.h> #include "udp_fw_update.h" #include "pkt_ctrl.h" -#include "banal.h" -static void setup_network(void); +//standard headers +#include <stddef.h> +#include <stdlib.h> +#include <string.h> +#include <stdbool.h> + +#ifdef BOOTLOADER +#include <bootloader_utils.h> +#endif + +//virtual registers in the firmware to store persistent values +static uint32_t fw_regs[8]; -// ---------------------------------------------------------------- -// the fast-path setup global variables -// ---------------------------------------------------------------- -static eth_mac_addr_t fp_mac_addr_src, fp_mac_addr_dst; -struct socket_address fp_socket_src, fp_socket_dst; extern uint16_t dsp0_dst_port, err0_dst_port, dsp1_dst_port; -static void handle_udp_err0_packet( +static void handle_udp_data_packet( struct socket_address src, struct socket_address dst, unsigned char *payload, int payload_len ){ - sr_udp_sm->err0_port = (((uint32_t)dst.port) << 16) | src.port; - err0_dst_port = src.port; - printf("Storing for async error path:\n"); - printf(" source udp port: %d\n", dst.port); - printf(" destination udp port: %d\n", src.port); - newline(); -} + size_t which; + switch(dst.port){ + case USRP2_UDP_DSP0_PORT: + which = 0; + dsp0_dst_port = src.port; + break; -static void handle_udp_dsp1_packet( - struct socket_address src, struct socket_address dst, - unsigned char *payload, int payload_len -){ - sr_udp_sm->dsp1_port = (((uint32_t)dst.port) << 16) | src.port; - dsp1_dst_port = src.port; - printf("Storing for dsp1 path:\n"); - printf(" source udp port: %d\n", dst.port); - printf(" destination udp port: %d\n", src.port); - newline(); -} + case USRP2_UDP_DSP1_PORT: + which = 2; + dsp1_dst_port = src.port; + break; -static void handle_udp_dsp0_packet( - struct socket_address src, struct socket_address dst, - unsigned char *payload, int payload_len -){ - fp_mac_addr_src = *ethernet_mac_addr(); - arp_cache_lookup_mac(&src.addr, &fp_mac_addr_dst); - fp_socket_src = dst; - fp_socket_dst = src; - sr_udp_sm->dsp0_port = (((uint32_t)dst.port) << 16) | src.port; - dsp0_dst_port = src.port; - printf("Storing for dsp0 path:\n"); - printf(" source mac addr: "); - print_mac_addr(&fp_mac_addr_src); newline(); - printf(" source ip addr: "); - print_ip_addr(&fp_socket_src.addr); newline(); - printf(" source udp port: %d\n", fp_socket_src.port); - printf(" destination mac addr: "); - print_mac_addr(&fp_mac_addr_dst); newline(); - printf(" destination ip addr: "); - print_ip_addr(&fp_socket_dst.addr); newline(); - printf(" destination udp port: %d\n", fp_socket_dst.port); - newline(); - - //setup network - setup_network(); + case USRP2_UDP_ERR0_PORT: + which = 1; + err0_dst_port = src.port; + break; + default: return; + } + + eth_mac_addr_t eth_mac_host; arp_cache_lookup_mac(&src.addr, ð_mac_host); + setup_framer(eth_mac_host, *ethernet_mac_addr(), src, dst, which); } #define OTW_GPIO_BANK_TO_NUM(bank) \ @@ -202,40 +170,34 @@ static void handle_udp_ctrl_packet( /******************************************************************* * Peek and Poke Register ******************************************************************/ - case USRP2_CTRL_ID_POKE_THIS_REGISTER_FOR_ME_BRO: - switch(ctrl_data_in->data.poke_args.num_bytes){ - case sizeof(uint32_t): - *((uint32_t *) ctrl_data_in->data.poke_args.addr) = (uint32_t)ctrl_data_in->data.poke_args.data; - break; - - case sizeof(uint16_t): - *((uint16_t *) ctrl_data_in->data.poke_args.addr) = (uint16_t)ctrl_data_in->data.poke_args.data; - break; + case USRP2_CTRL_ID_GET_THIS_REGISTER_FOR_ME_BRO: + switch(ctrl_data_in->data.reg_args.action){ + case USRP2_REG_ACTION_FPGA_PEEK32: + ctrl_data_out.data.reg_args.data = *((uint32_t *) ctrl_data_in->data.reg_args.addr); + break; - case sizeof(uint8_t): - *((uint8_t *) ctrl_data_in->data.poke_args.addr) = (uint8_t)ctrl_data_in->data.poke_args.data; - break; + case USRP2_REG_ACTION_FPGA_PEEK16: + ctrl_data_out.data.reg_args.data = *((uint16_t *) ctrl_data_in->data.reg_args.addr); + break; - } - ctrl_data_out.id = USRP2_CTRL_ID_OMG_POKED_REGISTER_SO_BAD_DUDE; - break; + case USRP2_REG_ACTION_FPGA_POKE32: + *((uint32_t *) ctrl_data_in->data.reg_args.addr) = (uint32_t)ctrl_data_in->data.reg_args.data; + break; - case USRP2_CTRL_ID_PEEK_AT_THIS_REGISTER_FOR_ME_BRO: - switch(ctrl_data_in->data.poke_args.num_bytes){ - case sizeof(uint32_t): - ctrl_data_out.data.poke_args.data = *((uint32_t *) ctrl_data_in->data.poke_args.addr); - break; + case USRP2_REG_ACTION_FPGA_POKE16: + *((uint16_t *) ctrl_data_in->data.reg_args.addr) = (uint16_t)ctrl_data_in->data.reg_args.data; + break; - case sizeof(uint16_t): - ctrl_data_out.data.poke_args.data = *((uint16_t *) ctrl_data_in->data.poke_args.addr); - break; + case USRP2_REG_ACTION_FW_PEEK32: + ctrl_data_out.data.reg_args.data = fw_regs[(ctrl_data_in->data.reg_args.addr)]; + break; - case sizeof(uint8_t): - ctrl_data_out.data.poke_args.data = *((uint8_t *) ctrl_data_in->data.poke_args.addr); - break; + case USRP2_REG_ACTION_FW_POKE32: + fw_regs[(ctrl_data_in->data.reg_args.addr)] = ctrl_data_in->data.reg_args.data; + break; } - ctrl_data_out.id = USRP2_CTRL_ID_WOAH_I_DEFINITELY_PEEKED_IT_DUDE; + ctrl_data_out.id = USRP2_CTRL_ID_OMG_GOT_REGISTER_SO_BAD_DUDE; break; /******************************************************************* @@ -278,6 +240,7 @@ static void handle_udp_ctrl_packet( send_udp_pkt(USRP2_UDP_CTRL_PORT, src, &ctrl_data_out, sizeof(ctrl_data_out)); } +#include <net/padded_eth_hdr.h> static void handle_inp_packet(uint32_t *buff, size_t num_lines){ //test if its an ip recovery packet @@ -299,7 +262,6 @@ static void handle_inp_packet(uint32_t *buff, size_t num_lines){ handle_eth_packet(buff, num_lines); } - //------------------------------------------------------------------ /* @@ -318,50 +280,28 @@ void link_changed_callback(int speed){ } } -static void setup_network(void){ - - //setup ethernet header machine - sr_udp_sm->eth_hdr.mac_dst_0_1 = (fp_mac_addr_dst.addr[0] << 8) | fp_mac_addr_dst.addr[1]; - sr_udp_sm->eth_hdr.mac_dst_2_3 = (fp_mac_addr_dst.addr[2] << 8) | fp_mac_addr_dst.addr[3]; - sr_udp_sm->eth_hdr.mac_dst_4_5 = (fp_mac_addr_dst.addr[4] << 8) | fp_mac_addr_dst.addr[5]; - sr_udp_sm->eth_hdr.mac_src_0_1 = (fp_mac_addr_src.addr[0] << 8) | fp_mac_addr_src.addr[1]; - sr_udp_sm->eth_hdr.mac_src_2_3 = (fp_mac_addr_src.addr[2] << 8) | fp_mac_addr_src.addr[3]; - sr_udp_sm->eth_hdr.mac_src_4_5 = (fp_mac_addr_src.addr[4] << 8) | fp_mac_addr_src.addr[5]; - sr_udp_sm->eth_hdr.ether_type = ETHERTYPE_IPV4; - - //setup ip header machine - unsigned int chksum = 0; - sr_udp_sm->ip_hdr.ver_ihl_tos = CHKSUM(0x4500, &chksum); // IPV4, 5 words of header (20 bytes), TOS=0 - sr_udp_sm->ip_hdr.total_length = UDP_SM_INS_IP_LEN; // Don't checksum this line in SW - sr_udp_sm->ip_hdr.identification = CHKSUM(0x0000, &chksum); // ID - sr_udp_sm->ip_hdr.flags_frag_off = CHKSUM(0x4000, &chksum); // don't fragment - sr_udp_sm->ip_hdr.ttl_proto = CHKSUM(0x2011, &chksum); // TTL=32, protocol = UDP (17 decimal) - //sr_udp_sm->ip_hdr.checksum .... filled in below - uint32_t src_ip_addr = fp_socket_src.addr.addr; - uint32_t dst_ip_addr = fp_socket_dst.addr.addr; - sr_udp_sm->ip_hdr.src_addr_high = CHKSUM(src_ip_addr >> 16, &chksum); // IP src high - sr_udp_sm->ip_hdr.src_addr_low = CHKSUM(src_ip_addr & 0xffff, &chksum); // IP src low - sr_udp_sm->ip_hdr.dst_addr_high = CHKSUM(dst_ip_addr >> 16, &chksum); // IP dst high - sr_udp_sm->ip_hdr.dst_addr_low = CHKSUM(dst_ip_addr & 0xffff, &chksum); // IP dst low - sr_udp_sm->ip_hdr.checksum = UDP_SM_INS_IP_HDR_CHKSUM | (chksum & 0xffff); - - //setup the udp header machine - sr_udp_sm->udp_hdr.src_port = UDP_SM_INS_UDP_SRC_PORT; - sr_udp_sm->udp_hdr.dst_port = UDP_SM_INS_UDP_DST_PORT; - sr_udp_sm->udp_hdr.length = UDP_SM_INS_UDP_LEN; - sr_udp_sm->udp_hdr.checksum = UDP_SM_LAST_WORD; // zero UDP checksum -} - int main(void) { u2_init(); - +#ifdef BOOTLOADER + putstr("\nUSRP N210 UDP bootloader\n"); +#else putstr("\nTxRx-UHD-ZPU\n"); - print_mac_addr(ethernet_mac_addr()); newline(); - print_ip_addr(get_ip_addr()); newline(); +#endif printf("FPGA compatibility number: %d\n", USRP2_FPGA_COMPAT_NUM); printf("Firmware compatibility number: %d\n", USRP2_FW_COMPAT_NUM); + +#ifdef BOOTLOADER + //load the production FPGA image or firmware if appropriate + do_the_bootload_thing(); + //if we get here we've fallen through to safe firmware + set_default_mac_addr(); + set_default_ip_addr(); +#endif + + print_mac_addr(ethernet_mac_addr()); newline(); + print_ip_addr(get_ip_addr()); newline(); //1) register the addresses into the network stack register_addrs(ethernet_mac_addr(), get_ip_addr()); @@ -370,9 +310,9 @@ main(void) //2) register callbacks for udp ports we service init_udp_listeners(); register_udp_listener(USRP2_UDP_CTRL_PORT, handle_udp_ctrl_packet); - register_udp_listener(USRP2_UDP_DSP0_PORT, handle_udp_dsp0_packet); - register_udp_listener(USRP2_UDP_ERR0_PORT, handle_udp_err0_packet); - register_udp_listener(USRP2_UDP_DSP1_PORT, handle_udp_dsp1_packet); + register_udp_listener(USRP2_UDP_DSP0_PORT, handle_udp_data_packet); + register_udp_listener(USRP2_UDP_ERR0_PORT, handle_udp_data_packet); + register_udp_listener(USRP2_UDP_DSP1_PORT, handle_udp_data_packet); #ifdef USRP2P register_udp_listener(USRP2_UDP_UPDATE_PORT, handle_udp_fw_update_packet); #endif |