[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r7102 - in usrp2/trunk/firmware: apps lib
From: |
eb |
Subject: |
[Commit-gnuradio] r7102 - in usrp2/trunk/firmware: apps lib |
Date: |
Mon, 10 Dec 2007 18:48:34 -0700 (MST) |
Author: eb
Date: 2007-12-10 18:48:34 -0700 (Mon, 10 Dec 2007)
New Revision: 7102
Added:
usrp2/trunk/firmware/apps/double_buffer_fragment.c
usrp2/trunk/firmware/lib/memcpy_wa.c
usrp2/trunk/firmware/lib/memcpy_wa.h
usrp2/trunk/firmware/lib/print_mac_addr.c
usrp2/trunk/firmware/lib/u2_eth_packet.h
Modified:
usrp2/trunk/firmware/apps/gen_eth_packets.c
usrp2/trunk/firmware/apps/gen_pause_frames.c
usrp2/trunk/firmware/apps/rcv_eth_packets.c
usrp2/trunk/firmware/apps/test_serdes.c
usrp2/trunk/firmware/lib/Makefile.am
usrp2/trunk/firmware/lib/nonstdio.h
Log:
work-in-progress on u2 firmware
Added: usrp2/trunk/firmware/apps/double_buffer_fragment.c
===================================================================
--- usrp2/trunk/firmware/apps/double_buffer_fragment.c
(rev 0)
+++ usrp2/trunk/firmware/apps/double_buffer_fragment.c 2007-12-11 01:48:34 UTC
(rev 7102)
@@ -0,0 +1,135 @@
+#if 0
+void
+double_buffering(int port) {
+ unsigned int localstatus = buffer_pool_status->status;
+
+ if(localstatus & BPS_DONE_0) {
+ bp_clear_buf(0);
+ if(buffer_state[0] == FILLING) {
+ buffer_state[0] = FULL;
+ if(buffer_state[1] == EMPTY) {
+ bp_receive_to_buf(1, 1, 1, 10, 509); // DSP_RX to buffer 1, use 500
lines
+ buffer_state[1] = FILLING;
+ }
+ else
+ dsp_rx_idle = 1;
+ if(serdes_tx_idle) {
+ serdes_tx_idle = 0;
+ bp_send_from_buf(0, port, 1, 10, 509); // SERDES_TX from buffer 0
+ buffer_state[0] = EMPTYING;
+ }
+ }
+ else { // buffer was emptying
+ buffer_state[0] = EMPTY;
+ if(dsp_rx_idle) {
+ dsp_rx_idle = 0;
+ bp_receive_to_buf(0, 1, 1, 10, 509); // DSP_RX to buffer 0, use 500
lines
+ buffer_state[0] = FILLING;
+ }
+ if(buffer_state[1] == FULL) {
+ bp_send_from_buf(1, port, 1, 10, 509); // SERDES_TX from buffer 1
+ buffer_state[1] = EMPTYING;
+ }
+ else
+ serdes_tx_idle = 1;
+ }
+ putstr("Int Proc'ed 0\n");
+ }
+ if(localstatus & BPS_DONE_1) {
+ bp_clear_buf(1);
+ if(buffer_state[1] == FILLING) {
+ buffer_state[1] = FULL;
+ if(buffer_state[0] == EMPTY) {
+ bp_receive_to_buf(0, 1, 1, 10, 509); // DSP_RX to buffer 1, use 500
lines
+ buffer_state[0] = FILLING;
+ }
+ else
+ dsp_rx_idle = 1;
+ if(serdes_tx_idle) {
+ serdes_tx_idle = 0;
+ bp_send_from_buf(1, port, 1, 10, 509); // SERDES_TX from buffer 1
+ buffer_state[1] = EMPTYING;
+ }
+ }
+ else { // buffer was emptying
+ buffer_state[1] = EMPTY;
+ if(dsp_rx_idle) {
+ dsp_rx_idle = 0;
+ bp_receive_to_buf(1, 1, 1, 10, 509); // DSP_RX to buffer 1, use 500
lines
+ buffer_state[1] = FILLING;
+ }
+ if(buffer_state[0] == FULL) {
+ bp_send_from_buf(0, port, 1, 10, 509); // SERDES_TX from buffer 0
+ buffer_state[0] = EMPTYING;
+ }
+ else
+ serdes_tx_idle = 1;
+ }
+ putstr("Int Proc'ed 1\n");
+ }
+ if(localstatus & BPS_DONE_2) {
+ bp_clear_buf(2);
+ if(buffer_state[2] == FILLING) {
+ buffer_state[2] = FULL;
+ if(buffer_state[3] == EMPTY) {
+ bp_receive_to_buf(3, port, 1, 5, 504); // SERDES_RX to buffer 3, use
500 lines
+ buffer_state[3] = FILLING;
+ }
+ else
+ serdes_rx_idle = 1;
+ if(dsp_tx_idle) {
+ dsp_tx_idle = 0;
+ bp_send_from_buf(2, 1, 1, 5, 504); // DSP_TX from buffer 2
+ buffer_state[2] = EMPTYING;
+ }
+ }
+ else { // buffer was emptying
+ buffer_state[2] = EMPTY;
+ if(serdes_rx_idle) {
+ serdes_rx_idle = 0;
+ bp_receive_to_buf(2, port, 1, 5, 504); // SERDES_RX to buffer 2
+ buffer_state[2] = FILLING;
+ }
+ if(buffer_state[3] == FULL) {
+ bp_send_from_buf(3, 1, 1, 5, 504); // DSP_TX from buffer 3
+ buffer_state[3] = EMPTYING;
+ }
+ else
+ dsp_tx_idle = 1;
+ }
+ putstr("Int Proc'ed 2\n");
+ }
+ if(localstatus & BPS_DONE_3) {
+ bp_clear_buf(3);
+ if(buffer_state[3] == FILLING) {
+ buffer_state[3] = FULL;
+ if(buffer_state[2] == EMPTY) {
+ bp_receive_to_buf(2, port, 1, 5, 504); // SERDES_RX to buffer 2, use
500 lines
+ buffer_state[2] = FILLING;
+ }
+ else
+ serdes_rx_idle = 1;
+ if(dsp_tx_idle) {
+ dsp_tx_idle = 0;
+ bp_send_from_buf(3, 1, 1, 5, 504); // DSP_TX from buffer 3
+ buffer_state[3] = EMPTYING;
+ }
+ }
+ else { // buffer was emptying
+ buffer_state[3] = EMPTY;
+ if(serdes_rx_idle) {
+ serdes_rx_idle = 0;
+ bp_receive_to_buf(3, port, 1, 5, 504); // SERDES_RX to buffer 3
+ buffer_state[3] = FILLING;
+ }
+ if(buffer_state[2] == FULL) {
+ bp_send_from_buf(2, 1, 1, 5, 504); // DSP_TX from buffer 2
+ buffer_state[2] = EMPTYING;
+ }
+ else
+ dsp_tx_idle = 1;
+ }
+ putstr("Int Proc'ed 3\n");
+ }
+}
+#endif
Property changes on: usrp2/trunk/firmware/apps/double_buffer_fragment.c
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: usrp2/trunk/firmware/apps/gen_eth_packets.c
===================================================================
--- usrp2/trunk/firmware/apps/gen_eth_packets.c 2007-12-10 22:35:17 UTC (rev
7101)
+++ usrp2/trunk/firmware/apps/gen_eth_packets.c 2007-12-11 01:48:34 UTC (rev
7102)
@@ -25,10 +25,11 @@
#include "eth_driver.h"
#include "eth_mac.h"
#include "nonstdio.h"
+#include "u2_eth_packet.h"
+#include "memcpy_wa.h"
+#include <stddef.h>
+#include <stdlib.h>
-typedef int intptr_t;
-typedef unsigned size_t;
-void exit(int status);
// ----------------------------------------------------------------
@@ -36,22 +37,7 @@
0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
-#define U2_ETHERTYPE 0xBEEF
-
-typedef struct {
- unsigned char dst_addr[6];
- unsigned char src_addr[6];
- unsigned short ethertype;
-} ethernet_hdr_t;
-
-typedef struct {
- ethernet_hdr_t ehdr;
- unsigned short pktno;
- unsigned char data[];
-} ethernet_packet_t; // gives us 32-bit aligned packet
-
-
// ----------------------------------------------------------------
// #define PACKET_SIZE 1500 // bytes
@@ -125,30 +111,9 @@
// FIXME
}
-/*
- * For copying to/from non-byte-adressable memory, such as
- * the buffers
- */
-void
-memcpy_wordaligned(void *dst, const void *src, size_t nbytes)
-{
- if (((intptr_t) dst & 0x3)
- || ((intptr_t) src & 0x3)
- || (nbytes & 0x3))
- exit(1); /* die! */
- int *dp = (int *) dst;
- int *sp = (int *) src;
- unsigned nw = nbytes/4;
-
- unsigned i;
- for (i = 0; i < nw; i++)
- dp[i] = sp[i];
-}
-
-
static void
-init_packet(int *buf, const ethernet_packet_t *pkt, int bufnum)
+init_packet(int *buf, const u2_eth_packet_t *pkt, int bufnum)
{
int i = 0;
int mark = ((bufnum & 0xff) << 24) | 0x005A0000;
@@ -167,7 +132,7 @@
{
int i;
- ethernet_packet_t pkt __attribute__((aligned (4)));
+ u2_eth_packet_t pkt __attribute__((aligned (4)));
for (i = 0; i < 6; i++){
pkt.ehdr.dst_addr[i] = dst_mac_addr[i];
@@ -229,139 +194,3 @@
hal_finish();
return 1;
}
-
-#if 0
-void
-double_buffering(int port) {
- unsigned int localstatus = buffer_pool_status->status;
-
- if(localstatus & BPS_DONE_0) {
- bp_clear_buf(0);
- if(buffer_state[0] == FILLING) {
- buffer_state[0] = FULL;
- if(buffer_state[1] == EMPTY) {
- bp_receive_to_buf(1, 1, 1, 10, 509); // DSP_RX to buffer 1, use 500
lines
- buffer_state[1] = FILLING;
- }
- else
- dsp_rx_idle = 1;
- if(serdes_tx_idle) {
- serdes_tx_idle = 0;
- bp_send_from_buf(0, port, 1, 10, 509); // SERDES_TX from buffer 0
- buffer_state[0] = EMPTYING;
- }
- }
- else { // buffer was emptying
- buffer_state[0] = EMPTY;
- if(dsp_rx_idle) {
- dsp_rx_idle = 0;
- bp_receive_to_buf(0, 1, 1, 10, 509); // DSP_RX to buffer 0, use 500
lines
- buffer_state[0] = FILLING;
- }
- if(buffer_state[1] == FULL) {
- bp_send_from_buf(1, port, 1, 10, 509); // SERDES_TX from buffer 1
- buffer_state[1] = EMPTYING;
- }
- else
- serdes_tx_idle = 1;
- }
- putstr("Int Proc'ed 0\n");
- }
- if(localstatus & BPS_DONE_1) {
- bp_clear_buf(1);
- if(buffer_state[1] == FILLING) {
- buffer_state[1] = FULL;
- if(buffer_state[0] == EMPTY) {
- bp_receive_to_buf(0, 1, 1, 10, 509); // DSP_RX to buffer 1, use 500
lines
- buffer_state[0] = FILLING;
- }
- else
- dsp_rx_idle = 1;
- if(serdes_tx_idle) {
- serdes_tx_idle = 0;
- bp_send_from_buf(1, port, 1, 10, 509); // SERDES_TX from buffer 1
- buffer_state[1] = EMPTYING;
- }
- }
- else { // buffer was emptying
- buffer_state[1] = EMPTY;
- if(dsp_rx_idle) {
- dsp_rx_idle = 0;
- bp_receive_to_buf(1, 1, 1, 10, 509); // DSP_RX to buffer 1, use 500
lines
- buffer_state[1] = FILLING;
- }
- if(buffer_state[0] == FULL) {
- bp_send_from_buf(0, port, 1, 10, 509); // SERDES_TX from buffer 0
- buffer_state[0] = EMPTYING;
- }
- else
- serdes_tx_idle = 1;
- }
- putstr("Int Proc'ed 1\n");
- }
- if(localstatus & BPS_DONE_2) {
- bp_clear_buf(2);
- if(buffer_state[2] == FILLING) {
- buffer_state[2] = FULL;
- if(buffer_state[3] == EMPTY) {
- bp_receive_to_buf(3, port, 1, 5, 504); // SERDES_RX to buffer 3, use
500 lines
- buffer_state[3] = FILLING;
- }
- else
- serdes_rx_idle = 1;
- if(dsp_tx_idle) {
- dsp_tx_idle = 0;
- bp_send_from_buf(2, 1, 1, 5, 504); // DSP_TX from buffer 2
- buffer_state[2] = EMPTYING;
- }
- }
- else { // buffer was emptying
- buffer_state[2] = EMPTY;
- if(serdes_rx_idle) {
- serdes_rx_idle = 0;
- bp_receive_to_buf(2, port, 1, 5, 504); // SERDES_RX to buffer 2
- buffer_state[2] = FILLING;
- }
- if(buffer_state[3] == FULL) {
- bp_send_from_buf(3, 1, 1, 5, 504); // DSP_TX from buffer 3
- buffer_state[3] = EMPTYING;
- }
- else
- dsp_tx_idle = 1;
- }
- putstr("Int Proc'ed 2\n");
- }
- if(localstatus & BPS_DONE_3) {
- bp_clear_buf(3);
- if(buffer_state[3] == FILLING) {
- buffer_state[3] = FULL;
- if(buffer_state[2] == EMPTY) {
- bp_receive_to_buf(2, port, 1, 5, 504); // SERDES_RX to buffer 2, use
500 lines
- buffer_state[2] = FILLING;
- }
- else
- serdes_rx_idle = 1;
- if(dsp_tx_idle) {
- dsp_tx_idle = 0;
- bp_send_from_buf(3, 1, 1, 5, 504); // DSP_TX from buffer 3
- buffer_state[3] = EMPTYING;
- }
- }
- else { // buffer was emptying
- buffer_state[3] = EMPTY;
- if(serdes_rx_idle) {
- serdes_rx_idle = 0;
- bp_receive_to_buf(3, port, 1, 5, 504); // SERDES_RX to buffer 3
- buffer_state[3] = FILLING;
- }
- if(buffer_state[2] == FULL) {
- bp_send_from_buf(2, 1, 1, 5, 504); // DSP_TX from buffer 2
- buffer_state[2] = EMPTYING;
- }
- else
- dsp_tx_idle = 1;
- }
- putstr("Int Proc'ed 3\n");
- }
-}
-#endif
Modified: usrp2/trunk/firmware/apps/gen_pause_frames.c
===================================================================
--- usrp2/trunk/firmware/apps/gen_pause_frames.c 2007-12-10 22:35:17 UTC
(rev 7101)
+++ usrp2/trunk/firmware/apps/gen_pause_frames.c 2007-12-11 01:48:34 UTC
(rev 7102)
@@ -25,10 +25,11 @@
#include "eth_driver.h"
#include "eth_mac.h"
#include "nonstdio.h"
+#include "u2_eth_packet.h"
+#include "memcpy_wa.h"
+#include <stddef.h>
+#include <stdlib.h>
-typedef int intptr_t;
-typedef unsigned size_t;
-void exit(int status);
// ----------------------------------------------------------------
@@ -36,22 +37,6 @@
0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
-#define U2_ETHERTYPE 0xBEEF
-
-
-typedef struct {
- unsigned char dst_addr[6];
- unsigned char src_addr[6];
- unsigned short ethertype;
-} ethernet_hdr_t;
-
-typedef struct {
- ethernet_hdr_t ehdr;
- unsigned short pktno;
- unsigned char data[];
-} ethernet_packet_t; // gives us 32-bit aligned packet
-
-
// ----------------------------------------------------------------
// #define PACKET_SIZE 1500 // bytes
@@ -125,30 +110,8 @@
// FIXME
}
-/*
- * For copying to/from non-byte-adressable memory, such as
- * the buffers
- */
-void
-memcpy_wordaligned(void *dst, const void *src, size_t nbytes)
-{
- if (((intptr_t) dst & 0x3)
- || ((intptr_t) src & 0x3)
- || (nbytes & 0x3))
- exit(1); /* die! */
-
- int *dp = (int *) dst;
- int *sp = (int *) src;
- unsigned nw = nbytes/4;
-
- unsigned i;
- for (i = 0; i < nw; i++)
- dp[i] = sp[i];
-}
-
-
static void
-init_packet(int *buf, const ethernet_packet_t *pkt, int bufnum)
+init_packet(int *buf, const u2_eth_packet_t *pkt, int bufnum)
{
int i = 0;
int mark = ((bufnum & 0xff) << 24) | 0x005A0000;
@@ -167,7 +130,7 @@
{
int i;
- ethernet_packet_t pkt __attribute__((aligned (4)));
+ u2_eth_packet_t pkt __attribute__((aligned (4)));
for (i = 0; i < 6; i++){
pkt.ehdr.dst_addr[i] = dst_mac_addr[i];
Modified: usrp2/trunk/firmware/apps/rcv_eth_packets.c
===================================================================
--- usrp2/trunk/firmware/apps/rcv_eth_packets.c 2007-12-10 22:35:17 UTC (rev
7101)
+++ usrp2/trunk/firmware/apps/rcv_eth_packets.c 2007-12-11 01:48:34 UTC (rev
7102)
@@ -25,34 +25,19 @@
#include "eth_driver.h"
#include "eth_mac.h"
#include "nonstdio.h"
+#include "u2_eth_packet.h"
+#include "memcpy_wa.h"
+#include <stddef.h>
+#include <stdlib.h>
-typedef int intptr_t;
-typedef unsigned size_t;
-void exit(int status);
-
// ----------------------------------------------------------------
unsigned char dst_mac_addr[6] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
-#define U2_ETHERTYPE 0xBEEF
-
-typedef struct {
- unsigned char dst_addr[6];
- unsigned char src_addr[6];
- unsigned short ethertype;
-} ethernet_hdr_t;
-
-typedef struct {
- ethernet_hdr_t ehdr;
- unsigned short pktno;
- unsigned char data[];
-} ethernet_packet_t; // gives us 32-bit aligned packet
-
-
// ----------------------------------------------------------------
#define PACKET_SIZE 1500 // bytes
@@ -126,56 +111,19 @@
// FIXME
}
-/*
- * For copying to/from non-byte-adressable memory, such as
- * the buffers
- */
-void
-memcpy_wordaligned(void *dst, const void *src, size_t nbytes)
+static void
+init_packet(int *buf, const u2_eth_packet_t *pkt, int bufnum)
{
- if (((intptr_t) dst & 0x3)
- || ((intptr_t) src & 0x3)
- || (nbytes & 0x3))
- exit(1); /* die! */
+ int i = 0;
+ int mark = ((bufnum & 0xff) << 24) | 0x005A0000;
- int *dp = (int *) dst;
- int *sp = (int *) src;
- unsigned nw = nbytes/4;
+ for (i = 0; i < BUFFER_POOL_BUFFER_SIZE; i++){
+ buf[i] = mark | i;
+ mark ^= 0x00FF0000;
+ }
- unsigned i;
- for (i = 0; i < nw; i++)
- dp[i] = sp[i];
-}
-
-
-static void
-init_packet(int *buf, const ethernet_packet_t *pkt)
-{
-#if 1
// copy header into buffer
memcpy_wordaligned(buf, pkt, sizeof(*pkt));
-#else
- buf[1] = 0xffff000A;
- buf[2] = 0x35987654;
- buf[3] = 0xBEEF0000;
-#endif
-
- union {
- int i;
- char c[4];
- } u;
-
- int *p = (int *)((char *) buf + sizeof(*pkt));
- int *end = buf + BUFFER_POOL_BUFFER_SIZE;
-
- int i = 0;
- for (; p < end; p++, i += 4){
- u.c[0] = i;
- u.c[1] = i+1;
- u.c[2] = i+2;
- u.c[3] = i+3;
- *p = u.i;
- }
}
static void
@@ -183,30 +131,19 @@
{
int i;
- ethernet_packet_t pkt __attribute__((aligned (4)));
+ u2_eth_packet_t pkt __attribute__((aligned (4)));
for (i = 0; i < 6; i++){
pkt.ehdr.dst_addr[i] = dst_mac_addr[i];
- pkt.ehdr.src_addr[i] = 0; // filled in by mac
+ pkt.ehdr.src_addr[i] = 0; // filled in by mac
}
pkt.ehdr.ethertype = U2_ETHERTYPE;
- init_packet((void *) buffer_ram(0), &pkt);
- init_packet((void *) buffer_ram(1), &pkt);
+ // fill ALL buffers for debugging
+ for (i = 0; i < 8; i++)
+ init_packet((void *)buffer_ram(i), &pkt, i);
}
-void
-print_mac_addr(const char *addr) /* 6-bytes */
-{
- puthex8(addr[0]); putchar(':');
- puthex8(addr[1]); putchar(':');
- puthex8(addr[2]); putchar(':');
- puthex8(addr[3]); putchar(':');
- puthex8(addr[4]); putchar(':');
- puthex8(addr[5]);
-}
-
-
int
main(void)
{
@@ -242,7 +179,7 @@
bp_receive_to_buf(2, PORT_ETH, 1, 0, 511);
while(1){
- ethernet_packet_t pkt __attribute__((aligned (4)));
+ u2_eth_packet_t pkt __attribute__((aligned (4)));
new_leds = 0;
if (link_is_up)
@@ -295,139 +232,3 @@
hal_finish();
return 1;
}
-
-#if 0
-void
-double_buffering(int port) {
- unsigned int localstatus = buffer_pool_status->status;
-
- if(localstatus & BPS_DONE_0) {
- bp_clear_buf(0);
- if(buffer_state[0] == FILLING) {
- buffer_state[0] = FULL;
- if(buffer_state[1] == EMPTY) {
- bp_receive_to_buf(1, 1, 1, 10, 509); // DSP_RX to buffer 1, use 500
lines
- buffer_state[1] = FILLING;
- }
- else
- dsp_rx_idle = 1;
- if(serdes_tx_idle) {
- serdes_tx_idle = 0;
- bp_send_from_buf(0, port, 1, 10, 509); // SERDES_TX from buffer 0
- buffer_state[0] = EMPTYING;
- }
- }
- else { // buffer was emptying
- buffer_state[0] = EMPTY;
- if(dsp_rx_idle) {
- dsp_rx_idle = 0;
- bp_receive_to_buf(0, 1, 1, 10, 509); // DSP_RX to buffer 0, use 500
lines
- buffer_state[0] = FILLING;
- }
- if(buffer_state[1] == FULL) {
- bp_send_from_buf(1, port, 1, 10, 509); // SERDES_TX from buffer 1
- buffer_state[1] = EMPTYING;
- }
- else
- serdes_tx_idle = 1;
- }
- putstr("Int Proc'ed 0\n");
- }
- if(localstatus & BPS_DONE_1) {
- bp_clear_buf(1);
- if(buffer_state[1] == FILLING) {
- buffer_state[1] = FULL;
- if(buffer_state[0] == EMPTY) {
- bp_receive_to_buf(0, 1, 1, 10, 509); // DSP_RX to buffer 1, use 500
lines
- buffer_state[0] = FILLING;
- }
- else
- dsp_rx_idle = 1;
- if(serdes_tx_idle) {
- serdes_tx_idle = 0;
- bp_send_from_buf(1, port, 1, 10, 509); // SERDES_TX from buffer 1
- buffer_state[1] = EMPTYING;
- }
- }
- else { // buffer was emptying
- buffer_state[1] = EMPTY;
- if(dsp_rx_idle) {
- dsp_rx_idle = 0;
- bp_receive_to_buf(1, 1, 1, 10, 509); // DSP_RX to buffer 1, use 500
lines
- buffer_state[1] = FILLING;
- }
- if(buffer_state[0] == FULL) {
- bp_send_from_buf(0, port, 1, 10, 509); // SERDES_TX from buffer 0
- buffer_state[0] = EMPTYING;
- }
- else
- serdes_tx_idle = 1;
- }
- putstr("Int Proc'ed 1\n");
- }
- if(localstatus & BPS_DONE_2) {
- bp_clear_buf(2);
- if(buffer_state[2] == FILLING) {
- buffer_state[2] = FULL;
- if(buffer_state[3] == EMPTY) {
- bp_receive_to_buf(3, port, 1, 5, 504); // SERDES_RX to buffer 3, use
500 lines
- buffer_state[3] = FILLING;
- }
- else
- serdes_rx_idle = 1;
- if(dsp_tx_idle) {
- dsp_tx_idle = 0;
- bp_send_from_buf(2, 1, 1, 5, 504); // DSP_TX from buffer 2
- buffer_state[2] = EMPTYING;
- }
- }
- else { // buffer was emptying
- buffer_state[2] = EMPTY;
- if(serdes_rx_idle) {
- serdes_rx_idle = 0;
- bp_receive_to_buf(2, port, 1, 5, 504); // SERDES_RX to buffer 2
- buffer_state[2] = FILLING;
- }
- if(buffer_state[3] == FULL) {
- bp_send_from_buf(3, 1, 1, 5, 504); // DSP_TX from buffer 3
- buffer_state[3] = EMPTYING;
- }
- else
- dsp_tx_idle = 1;
- }
- putstr("Int Proc'ed 2\n");
- }
- if(localstatus & BPS_DONE_3) {
- bp_clear_buf(3);
- if(buffer_state[3] == FILLING) {
- buffer_state[3] = FULL;
- if(buffer_state[2] == EMPTY) {
- bp_receive_to_buf(2, port, 1, 5, 504); // SERDES_RX to buffer 2, use
500 lines
- buffer_state[2] = FILLING;
- }
- else
- serdes_rx_idle = 1;
- if(dsp_tx_idle) {
- dsp_tx_idle = 0;
- bp_send_from_buf(3, 1, 1, 5, 504); // DSP_TX from buffer 3
- buffer_state[3] = EMPTYING;
- }
- }
- else { // buffer was emptying
- buffer_state[3] = EMPTY;
- if(serdes_rx_idle) {
- serdes_rx_idle = 0;
- bp_receive_to_buf(3, port, 1, 5, 504); // SERDES_RX to buffer 3
- buffer_state[3] = FILLING;
- }
- if(buffer_state[2] == FULL) {
- bp_send_from_buf(2, 1, 1, 5, 504); // DSP_TX from buffer 2
- buffer_state[2] = EMPTYING;
- }
- else
- dsp_tx_idle = 1;
- }
- putstr("Int Proc'ed 3\n");
- }
-}
-#endif
Modified: usrp2/trunk/firmware/apps/test_serdes.c
===================================================================
--- usrp2/trunk/firmware/apps/test_serdes.c 2007-12-10 22:35:17 UTC (rev
7101)
+++ usrp2/trunk/firmware/apps/test_serdes.c 2007-12-11 01:48:34 UTC (rev
7102)
@@ -25,10 +25,11 @@
#include "eth_driver.h"
#include "eth_mac.h"
#include "nonstdio.h"
+#include "u2_eth_packet.h"
+#include "memcpy_wa.h"
+#include <stddef.h>
+#include <stdlib.h>
-typedef int intptr_t;
-typedef unsigned size_t;
-void exit(int status);
// ----------------------------------------------------------------
@@ -36,22 +37,7 @@
0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
-#define U2_ETHERTYPE 0xBEEF
-
-typedef struct {
- unsigned char dst_addr[6];
- unsigned char src_addr[6];
- unsigned short ethertype;
-} ethernet_hdr_t;
-
-typedef struct {
- ethernet_hdr_t ehdr;
- unsigned short pktno;
- unsigned char data[];
-} ethernet_packet_t; // gives us 32-bit aligned packet
-
-
// ----------------------------------------------------------------
// #define PACKET_SIZE 1500 // bytes
@@ -125,30 +111,8 @@
// FIXME
}
-/*
- * For copying to/from non-byte-adressable memory, such as
- * the buffers
- */
-void
-memcpy_wordaligned(void *dst, const void *src, size_t nbytes)
-{
- if (((intptr_t) dst & 0x3)
- || ((intptr_t) src & 0x3)
- || (nbytes & 0x3))
- exit(1); /* die! */
-
- int *dp = (int *) dst;
- int *sp = (int *) src;
- unsigned nw = nbytes/4;
-
- unsigned i;
- for (i = 0; i < nw; i++)
- dp[i] = sp[i];
-}
-
-
static void
-init_packet(int *buf, const ethernet_packet_t *pkt, int bufnum)
+init_packet(int *buf, const u2_eth_packet_t *pkt, int bufnum)
{
int i = 0;
int mark = ((bufnum & 0xff) << 24) | 0x005A0000;
@@ -167,7 +131,7 @@
{
int i;
- ethernet_packet_t pkt __attribute__((aligned (4)));
+ u2_eth_packet_t pkt __attribute__((aligned (4)));
for (i = 0; i < 6; i++){
pkt.ehdr.dst_addr[i] = dst_mac_addr[i];
@@ -232,139 +196,3 @@
hal_finish();
return 1;
}
-
-#if 0
-void
-double_buffering(int port) {
- unsigned int localstatus = buffer_pool_status->status;
-
- if(localstatus & BPS_DONE_0) {
- bp_clear_buf(0);
- if(buffer_state[0] == FILLING) {
- buffer_state[0] = FULL;
- if(buffer_state[1] == EMPTY) {
- bp_receive_to_buf(1, 1, 1, 10, 509); // DSP_RX to buffer 1, use 500
lines
- buffer_state[1] = FILLING;
- }
- else
- dsp_rx_idle = 1;
- if(serdes_tx_idle) {
- serdes_tx_idle = 0;
- bp_send_from_buf(0, port, 1, 10, 509); // SERDES_TX from buffer 0
- buffer_state[0] = EMPTYING;
- }
- }
- else { // buffer was emptying
- buffer_state[0] = EMPTY;
- if(dsp_rx_idle) {
- dsp_rx_idle = 0;
- bp_receive_to_buf(0, 1, 1, 10, 509); // DSP_RX to buffer 0, use 500
lines
- buffer_state[0] = FILLING;
- }
- if(buffer_state[1] == FULL) {
- bp_send_from_buf(1, port, 1, 10, 509); // SERDES_TX from buffer 1
- buffer_state[1] = EMPTYING;
- }
- else
- serdes_tx_idle = 1;
- }
- putstr("Int Proc'ed 0\n");
- }
- if(localstatus & BPS_DONE_1) {
- bp_clear_buf(1);
- if(buffer_state[1] == FILLING) {
- buffer_state[1] = FULL;
- if(buffer_state[0] == EMPTY) {
- bp_receive_to_buf(0, 1, 1, 10, 509); // DSP_RX to buffer 1, use 500
lines
- buffer_state[0] = FILLING;
- }
- else
- dsp_rx_idle = 1;
- if(serdes_tx_idle) {
- serdes_tx_idle = 0;
- bp_send_from_buf(1, port, 1, 10, 509); // SERDES_TX from buffer 1
- buffer_state[1] = EMPTYING;
- }
- }
- else { // buffer was emptying
- buffer_state[1] = EMPTY;
- if(dsp_rx_idle) {
- dsp_rx_idle = 0;
- bp_receive_to_buf(1, 1, 1, 10, 509); // DSP_RX to buffer 1, use 500
lines
- buffer_state[1] = FILLING;
- }
- if(buffer_state[0] == FULL) {
- bp_send_from_buf(0, port, 1, 10, 509); // SERDES_TX from buffer 0
- buffer_state[0] = EMPTYING;
- }
- else
- serdes_tx_idle = 1;
- }
- putstr("Int Proc'ed 1\n");
- }
- if(localstatus & BPS_DONE_2) {
- bp_clear_buf(2);
- if(buffer_state[2] == FILLING) {
- buffer_state[2] = FULL;
- if(buffer_state[3] == EMPTY) {
- bp_receive_to_buf(3, port, 1, 5, 504); // SERDES_RX to buffer 3, use
500 lines
- buffer_state[3] = FILLING;
- }
- else
- serdes_rx_idle = 1;
- if(dsp_tx_idle) {
- dsp_tx_idle = 0;
- bp_send_from_buf(2, 1, 1, 5, 504); // DSP_TX from buffer 2
- buffer_state[2] = EMPTYING;
- }
- }
- else { // buffer was emptying
- buffer_state[2] = EMPTY;
- if(serdes_rx_idle) {
- serdes_rx_idle = 0;
- bp_receive_to_buf(2, port, 1, 5, 504); // SERDES_RX to buffer 2
- buffer_state[2] = FILLING;
- }
- if(buffer_state[3] == FULL) {
- bp_send_from_buf(3, 1, 1, 5, 504); // DSP_TX from buffer 3
- buffer_state[3] = EMPTYING;
- }
- else
- dsp_tx_idle = 1;
- }
- putstr("Int Proc'ed 2\n");
- }
- if(localstatus & BPS_DONE_3) {
- bp_clear_buf(3);
- if(buffer_state[3] == FILLING) {
- buffer_state[3] = FULL;
- if(buffer_state[2] == EMPTY) {
- bp_receive_to_buf(2, port, 1, 5, 504); // SERDES_RX to buffer 2, use
500 lines
- buffer_state[2] = FILLING;
- }
- else
- serdes_rx_idle = 1;
- if(dsp_tx_idle) {
- dsp_tx_idle = 0;
- bp_send_from_buf(3, 1, 1, 5, 504); // DSP_TX from buffer 3
- buffer_state[3] = EMPTYING;
- }
- }
- else { // buffer was emptying
- buffer_state[3] = EMPTY;
- if(serdes_rx_idle) {
- serdes_rx_idle = 0;
- bp_receive_to_buf(3, port, 1, 5, 504); // SERDES_RX to buffer 3
- buffer_state[3] = FILLING;
- }
- if(buffer_state[2] == FULL) {
- bp_send_from_buf(2, 1, 1, 5, 504); // DSP_TX from buffer 2
- buffer_state[2] = EMPTYING;
- }
- else
- dsp_tx_idle = 1;
- }
- putstr("Int Proc'ed 3\n");
- }
-}
-#endif
Modified: usrp2/trunk/firmware/lib/Makefile.am
===================================================================
--- usrp2/trunk/firmware/lib/Makefile.am 2007-12-10 22:35:17 UTC (rev
7101)
+++ usrp2/trunk/firmware/lib/Makefile.am 2007-12-11 01:48:34 UTC (rev
7102)
@@ -29,8 +29,10 @@
hal_uart.c \
i2c.c \
mdelay.c \
+ memcpy_wa.c \
nonstdio.c \
pic.c \
+ print_mac_addr.c \
printf.c \
spi.c \
u2_init.c
Added: usrp2/trunk/firmware/lib/memcpy_wa.c
===================================================================
--- usrp2/trunk/firmware/lib/memcpy_wa.c (rev 0)
+++ usrp2/trunk/firmware/lib/memcpy_wa.c 2007-12-11 01:48:34 UTC (rev
7102)
@@ -0,0 +1,42 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2007 Free Software Foundation, Inc.
+ *
+ * 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 "memcpy_wa.h"
+#include <stdint.h>
+#include <stdlib.h>
+
+/*
+ * For copying to/from non-byte-adressable memory, such as
+ * the buffers
+ */
+void
+memcpy_wordaligned(void *dst, const void *src, size_t nbytes)
+{
+ if (((intptr_t) dst & 0x3)
+ || ((intptr_t) src & 0x3)
+ || (nbytes & 0x3))
+ exit(1); /* die! */
+
+ int *dp = (int *) dst;
+ int *sp = (int *) src;
+ unsigned nw = nbytes/4;
+
+ unsigned i;
+ for (i = 0; i < nw; i++)
+ dp[i] = sp[i];
+}
Property changes on: usrp2/trunk/firmware/lib/memcpy_wa.c
___________________________________________________________________
Name: svn:eol-style
+ native
Added: usrp2/trunk/firmware/lib/memcpy_wa.h
===================================================================
--- usrp2/trunk/firmware/lib/memcpy_wa.h (rev 0)
+++ usrp2/trunk/firmware/lib/memcpy_wa.h 2007-12-11 01:48:34 UTC (rev
7102)
@@ -0,0 +1,32 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2007 Free Software Foundation, Inc.
+ *
+ * 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/>.
+ */
+
+#ifndef INCLUDED_MEMCPY_WA_H
+#define INCLUDED_MEMCPY_WA_H
+
+#include <stddef.h>
+
+/*
+ * For copying to/from non-byte-adressable memory, such as
+ * the buffers
+ */
+void memcpy_wordaligned(void *dst, const void *src, size_t nbytes);
+
+#endif /* INCLUDED_MEMCPY_WA_H */
+
+
Property changes on: usrp2/trunk/firmware/lib/memcpy_wa.h
___________________________________________________________________
Name: svn:eol-style
+ native
Modified: usrp2/trunk/firmware/lib/nonstdio.h
===================================================================
--- usrp2/trunk/firmware/lib/nonstdio.h 2007-12-10 22:35:17 UTC (rev 7101)
+++ usrp2/trunk/firmware/lib/nonstdio.h 2007-12-11 01:48:34 UTC (rev 7102)
@@ -34,4 +34,6 @@
#define puthex_nl puthex32_nl
void newline(); // putchar('\n')
+void print_mac_addr(const unsigned char addr[6]);
+
#endif /* INCLUDED_NONSTDIO_H */
Added: usrp2/trunk/firmware/lib/print_mac_addr.c
===================================================================
--- usrp2/trunk/firmware/lib/print_mac_addr.c (rev 0)
+++ usrp2/trunk/firmware/lib/print_mac_addr.c 2007-12-11 01:48:34 UTC (rev
7102)
@@ -0,0 +1,30 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2007 Free Software Foundation, Inc.
+ *
+ * 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 "nonstdio.h"
+
+void
+print_mac_addr(const unsigned char addr[6])
+{
+ puthex8(addr[0]); putchar(':');
+ puthex8(addr[1]); putchar(':');
+ puthex8(addr[2]); putchar(':');
+ puthex8(addr[3]); putchar(':');
+ puthex8(addr[4]); putchar(':');
+ puthex8(addr[5]);
+}
+
Property changes on: usrp2/trunk/firmware/lib/print_mac_addr.c
___________________________________________________________________
Name: svn:eol-style
+ native
Added: usrp2/trunk/firmware/lib/u2_eth_packet.h
===================================================================
--- usrp2/trunk/firmware/lib/u2_eth_packet.h (rev 0)
+++ usrp2/trunk/firmware/lib/u2_eth_packet.h 2007-12-11 01:48:34 UTC (rev
7102)
@@ -0,0 +1,114 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2007 Free Software Foundation, Inc.
+ *
+ * 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/>.
+ */
+
+#ifndef INCLUDED_U2_ETH_PACKET_H
+#define INCLUDED_U2_ETH_PACKET_H
+
+#include <stdint.h>
+
+#define U2_ETHERTYPE 0xBEEF // used in our frames
+#define MAC_CTRL_ETHERTYPE 0x8808 // used in PAUSE frames
+
+/*
+ * All these data structures are BIG-ENDIAN on the wire
+ */
+
+/* The classic 14-byte ethernet header */
+
+typedef struct {
+ uint8_t dst_addr[6];
+ uint8_t src_addr[6];
+ uint16_t ethertype;
+} u2_eth_hdr_t;
+
+/*
+ * The classic ethernet header + 2 bytes of pad so that our payload
+ * (at least inside the U2) is 32-bit aligned. (The buffer memory
+ * in the U2 is only word addressable...)
+ */
+typedef struct {
+ uint8_t dst_addr[6];
+ uint8_t src_addr[6];
+ uint16_t ethertype;
+ uint16_t _pad; // MBZ. force 32-bit alignment for payload
+} u2_eth_hdr_with_pad_t;
+
+
+/*
+ * The payload of a USRP2 ethernet packet...
+ *
+ * Basically there's 1 word of flags and routing info, and 1 word
+ * of timestamp that specifies when the data was received, or
+ * when it should be transmitted. The data samples follow immediately.
+ *
+ * Transmit packets (from host to U2)
+ *
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Chan | mbz |I|S|E|
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Timestamp |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ *
+ * Received packets (from U2 to host)
+ *
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Chan | mbz |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ * | Timestamp |
+ * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+typedef struct {
+ uint32_t word0; // flags etc
+ uint32_t timestamp; // time of rx or tx (100 MHz)
+ uint32_t samples[]; // samples, typically ((I << 16) | Q)
+} u2_eth_payload_t;
+
+
+#define U2P_CHAN_MASK 0x1f
+#define U2P_CHAN_SHIFT 27
+
+#define U2P_TX_IMMEDIATE 0x00000004 // send samples NOW, else at
timestamp
+#define U2P_TX_START_OF_BURST 0x00000002 // this frame is the start of a
burst
+#define U2P_TX_END_OF_BURST 0x00000001 // this frame is the end of
a burst
+
+#define U2P_ALL_FLAGS 0x00000007
+
+static inline int
+u2p_chan(u2_eth_payload_t *p)
+{
+ return (p->word0 >> U2P_CHAN_SHIFT) & U2P_CHAN_MASK;
+}
+
+inline static void
+u2p_set_word0(u2_eth_payload_t *p, int flags, int chan)
+{
+ p->word0 = ((flags & U2P_ALL_FLAGS)
+ | ((chan & U2P_CHAN_MASK) << U2P_CHAN_SHIFT));
+}
+
+/*
+ * consolidated packet: ethernet header + pad + payload
+ */
+typedef struct {
+ u2_eth_hdr_with_pad_t ehdr;
+ u2_eth_payload_t payload;
+} u2_eth_packet_t;
+
+#endif /* INCLUDED_U2_ETH_PACKET_H */
Property changes on: usrp2/trunk/firmware/lib/u2_eth_packet.h
___________________________________________________________________
Name: svn:eol-style
+ native
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r7102 - in usrp2/trunk/firmware: apps lib,
eb <=