diff options
Diffstat (limited to 'firmware/zpu/lib')
| -rw-r--r-- | firmware/zpu/lib/memory_map.h | 125 | ||||
| -rw-r--r-- | firmware/zpu/lib/net_common.c | 99 | ||||
| -rw-r--r-- | firmware/zpu/lib/net_common.h | 21 | 
3 files changed, 123 insertions, 122 deletions
diff --git a/firmware/zpu/lib/memory_map.h b/firmware/zpu/lib/memory_map.h index e08136053..132fdb6f6 100644 --- a/firmware/zpu/lib/memory_map.h +++ b/firmware/zpu/lib/memory_map.h @@ -187,22 +187,24 @@ typedef struct {  // 1KB of address space (== 256 32-bit write-only regs)  //////////////////////////////////////////////////// -#define SR_MISC 0 -#define SR_TX_PROT_ENG 32 -#define SR_RX_PROT_ENG 48 -#define SR_ROUTER_CTRL 64 -#define SR_UDP_SM 96 -#define SR_TX_DSP 208 -#define SR_TX_CTRL 224 -#define SR_RX_DSP0 160 -#define SR_RX_DSP1 240 -#define SR_RX_CTRL0 176 -#define SR_RX_CTRL1 32 -#define SR_TIME64 192 -#define SR_SIMTIMER 198 -#define SR_LAST 255 - -#define	_SR_ADDR(sr)	(MISC_OUTPUT_BASE + (sr) * sizeof(uint32_t)) +#define SR_MISC       0   // 7 regs +#define SR_SIMTIMER   8   // 2 +#define SR_TIME64    10   // 6 +#define SR_BUF_POOL  16   // 4 + +#define SR_RX_FRONT  24   // 5 +#define SR_RX_CTRL0  32   // 9 +#define SR_RX_DSP0   48   // 7 +#define SR_RX_CTRL1  80   // 9 +#define SR_RX_DSP1   96   // 7 + +#define SR_TX_FRONT 128   // ? +#define SR_TX_CTRL  144   // 6 +#define SR_TX_DSP   160   // 5 + +#define SR_UDP_SM   192   // 64 + +#define	_SR_ADDR(sr) (MISC_OUTPUT_BASE + (sr) * sizeof(uint32_t))  #define SR_ADDR_BLDRDONE _SR_ADDR(5) @@ -215,20 +217,19 @@ typedef struct {    volatile uint32_t iface_ctrl;  } router_ctrl_t; -#define router_ctrl ((router_ctrl_t *) _SR_ADDR(SR_ROUTER_CTRL)) +#define router_ctrl ((router_ctrl_t *) _SR_ADDR(SR_BUF_POOL))  // --- misc outputs ---  typedef struct { -  volatile uint32_t	clk_ctrl; -  volatile uint32_t	serdes_ctrl; -  volatile uint32_t	adc_ctrl; -  volatile uint32_t	leds; -  volatile uint32_t	phy_ctrl;	// LSB is reset line to eth phy -  volatile uint32_t	debug_mux_ctrl; -  volatile uint32_t     ram_page;       // FIXME should go somewhere else... -  volatile uint32_t     flush_icache;   // Flush the icache -  volatile uint32_t     led_src;        // HW or SW control for LEDs +  volatile uint32_t clk_ctrl; +  volatile uint32_t serdes_ctrl; +  volatile uint32_t adc_ctrl; +  volatile uint32_t leds; +  volatile uint32_t phy_ctrl;        // LSB is reset line to eth phy +  volatile uint32_t debug_mux_ctrl; +  volatile uint32_t led_src;         // HW or SW control for LEDs +  volatile uint32_t flush_icache;    // Flush the icache  } output_regs_t;  #define CLK_RESET  (1<<4) @@ -255,71 +256,15 @@ typedef struct {  #define output_regs ((output_regs_t *) MISC_OUTPUT_BASE) -// --- udp tx regs --- +// --- protocol framer regs --- -typedef struct { -  // Bits 19:16 are control info; bits 15:0 are data (see below) -  // First two words are unused. -  volatile uint32_t _nope[2]; -  //--- ethernet header - 14 bytes--- -  volatile struct{ -    uint32_t mac_dst_0_1; //word 2 -    uint32_t mac_dst_2_3; -    uint32_t mac_dst_4_5; -    uint32_t mac_src_0_1; -    uint32_t mac_src_2_3; -    uint32_t mac_src_4_5; -    uint32_t ether_type; //word 8 -  } eth_hdr; -  //--- ip header - 20 bytes --- -  volatile struct{ -    uint32_t ver_ihl_tos; //word 9 -    uint32_t total_length; -    uint32_t identification; -    uint32_t flags_frag_off; -    uint32_t ttl_proto; -    uint32_t checksum; -    uint32_t src_addr_high; -    uint32_t src_addr_low; -    uint32_t dst_addr_high; -    uint32_t dst_addr_low; //word 18 -  } ip_hdr; -  //--- udp header - 8 bytes --- -  volatile struct{ -    uint32_t src_port; //word 19 -    uint32_t dst_port; -    uint32_t length; -    uint32_t checksum; //word 22 -  } udp_hdr; -  volatile uint32_t _pad[1]; -  volatile uint32_t dsp0_port; -  volatile uint32_t err0_port; -  volatile uint32_t dsp1_port; -  volatile uint32_t err1_port; -} sr_udp_sm_t; - -// control bits (all expect UDP_SM_LAST_WORD are mutually exclusive) - -// Insert a UDP source port from the table -#define UDP_SM_INS_UDP_SRC_PORT     (1 << 21) - -// Insert a UDP dest port from the table -#define UDP_SM_INS_UDP_DST_PORT     (1 << 20) - -// This is the last word of the header -#define	UDP_SM_LAST_WORD		(1 << 19) - -// Insert IP header checksum here.  Data is the xor of 16'hFFFF and -// the values written into regs 9-13 and 15-18. -#define	UDP_SM_INS_IP_HDR_CHKSUM	(1 << 18) - -// Insert IP Length here (data ignored) -#define	UDP_SM_INS_IP_LEN		(1 << 17) - -// Insert UDP Length here (data ignore) -#define	UDP_SM_INS_UDP_LEN		(1 << 16) - -#define sr_udp_sm ((sr_udp_sm_t *) _SR_ADDR(SR_UDP_SM)) +typedef struct{ +    struct{ +        volatile uint32_t entry[16]; +    } table[4]; +} sr_proto_framer_t; + +#define sr_proto_framer_regs ((sr_proto_framer_t *) _SR_ADDR(SR_UDP_SM))  // --- VITA TX CTRL regs --- diff --git a/firmware/zpu/lib/net_common.c b/firmware/zpu/lib/net_common.c index f70f279ac..895b7b942 100644 --- a/firmware/zpu/lib/net_common.c +++ b/firmware/zpu/lib/net_common.c @@ -36,17 +36,40 @@  #include <string.h>  #include "pkt_ctrl.h" +/*********************************************************************** + * Constants + Globals + **********************************************************************/  static const bool debug = false; -  static const size_t out_buff_size = 2048; -  static const eth_mac_addr_t BCAST_MAC_ADDR = {{0xff, 0xff, 0xff, 0xff, 0xff, 0xff}}; +#define MAX_UDP_LISTENERS 6  //used in the top level application...  uint16_t dsp0_dst_port, err0_dst_port, dsp1_dst_port; -// ------------------------------------------------------------------------ +/*********************************************************************** + * Checksum routines + **********************************************************************/ +static unsigned int CHKSUM(unsigned int x, unsigned int *chksum){ +  *chksum += x; +  *chksum = (*chksum & 0xffff) + (*chksum>>16); +  *chksum = (*chksum & 0xffff) + (*chksum>>16); +  return x; +} + +static unsigned int chksum_buffer( +    unsigned short *buf, int nshorts, +    unsigned int initial_chksum +){ +    unsigned int chksum = initial_chksum; +    for (int i = 0; i < nshorts; i++) CHKSUM(buf[i], &chksum); + +    return chksum; +} +/*********************************************************************** + * Listener registry + **********************************************************************/  static eth_mac_addr_t _local_mac_addr;  static struct ip_addr _local_ip_addr;  void register_addrs(const eth_mac_addr_t *mac_addr, const struct ip_addr *ip_addr){ @@ -54,10 +77,6 @@ void register_addrs(const eth_mac_addr_t *mac_addr, const struct ip_addr *ip_add      _local_ip_addr = *ip_addr;  } -//------------------------------------------------------------------------- - -#define	MAX_UDP_LISTENERS	6 -  struct listener_entry {    unsigned short	port;    udp_receiver_t	rcvr; @@ -104,9 +123,55 @@ register_udp_listener(int port, udp_receiver_t rcvr)    }  } -// ------------------------------------------------------------------------ +/*********************************************************************** + * Protocol framer + **********************************************************************/ +void setup_framer( +    eth_mac_addr_t eth_dst, +    eth_mac_addr_t eth_src, +    struct socket_address sock_dst, +    struct socket_address sock_src, +    size_t which +){ +    struct { +        padded_eth_hdr_t eth; +        struct ip_hdr ip; +        struct udp_hdr udp; +    } frame; + +    //-- load Ethernet header --// +    frame.eth.dst = eth_dst; +    frame.eth.src = eth_src; +    frame.eth.ethertype = ETHERTYPE_IPV4; + +    //-- load IPv4 header --// +    IPH_VHLTOS_SET(&frame.ip, 4, 5, 0); +    IPH_LEN_SET(&frame.ip, 0); +    IPH_ID_SET(&frame.ip, 0); +    IPH_OFFSET_SET(&frame.ip, IP_DF); // don't fragment +    const int ttl = 32; +    frame.ip._ttl_proto = (ttl << 8) | (IP_PROTO_UDP & 0xff); +    frame.ip._chksum = 0; +    frame.ip.src = sock_src.addr; +    frame.ip.dest = sock_dst.addr; +    frame.ip._chksum = ~chksum_buffer( +        (unsigned short *) &frame.ip, +        sizeof(frame.ip)/sizeof(short), 0 +    ); + +    //-- load UDP header --// +    frame.udp.src = sock_src.port; +    frame.udp.dest = sock_dst.port; +    frame.udp.len = 0; +    frame.udp.chksum = 0; +    //copy into the framer table registers +    memcpy_wa((void *)(sr_proto_framer_regs->table[which].entry + 1), &frame, sizeof(frame)); +} +/*********************************************************************** + * Slow-path packet framing and transmission + **********************************************************************/  /*!   * low level routine to assembly an ethernet frame and send it.   * @@ -164,24 +229,6 @@ send_pkt(      if (debug) printf("sent %d bytes\n", (int)total_len);  } -unsigned int CHKSUM(unsigned int x, unsigned int *chksum) -{ -  *chksum += x; -  *chksum = (*chksum & 0xffff) + (*chksum>>16); -  *chksum = (*chksum & 0xffff) + (*chksum>>16); -  return x; -} - -static unsigned int -chksum_buffer(unsigned short *buf, int nshorts, unsigned int initial_chksum) -{ -  unsigned int chksum = initial_chksum; -  for (int i = 0; i < nshorts; i++) -    CHKSUM(buf[i], &chksum); - -  return chksum; -} -  void  send_ip_pkt(struct ip_addr dst, int protocol,  	    const void *buf0, size_t len0, diff --git a/firmware/zpu/lib/net_common.h b/firmware/zpu/lib/net_common.h index 409022352..3cbc5c514 100644 --- a/firmware/zpu/lib/net_common.h +++ b/firmware/zpu/lib/net_common.h @@ -1,6 +1,5 @@ -/* -*- c++ -*- */  /* - * Copyright 2009,2010 Ettus Research LLC + * Copyright 2009-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 @@ -23,12 +22,22 @@  #include <net/socket_address.h>  #include <net/eth_mac_addr.h> -/* - * 1's complement sum for IP and UDP headers +/*! + * Setup an entry in the protocol framer for a UDP socket.   * - * init chksum to zero to start. + * \param eth_dst ethernet destination mac addr + * \param eth_src ethernet source mac addr + * \param sock_dst udp/ip socket destination + * \param sock_src udp/ip socket source + * \param which the index into the table   */ -unsigned int CHKSUM(unsigned int x, unsigned int *chksum); +void setup_framer( +    eth_mac_addr_t eth_dst, +    eth_mac_addr_t eth_src, +    struct socket_address sock_dst, +    struct socket_address sock_src, +    size_t which +);  typedef void (*udp_receiver_t)(struct socket_address src, struct socket_address dst,  			       unsigned char *payload, int payload_len);  | 
