[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r8011 - in usrp2/trunk/firmware: apps lib
From: |
eb |
Subject: |
[Commit-gnuradio] r8011 - in usrp2/trunk/firmware: apps lib |
Date: |
Wed, 12 Mar 2008 21:17:19 -0600 (MDT) |
Author: eb
Date: 2008-03-12 21:17:17 -0600 (Wed, 12 Mar 2008)
New Revision: 8011
Modified:
usrp2/trunk/firmware/apps/sd_bounce.c
usrp2/trunk/firmware/lib/dbsm.c
Log:
sd_bounce reads packets from serdes and writes them to
serdes using the standard double-buffering state machine.
Checks received packets for expected content, prints 'r' for received
OK, or 'P' for received with payload error. Errors from the serdes
are reported with 'E'.
Modified: usrp2/trunk/firmware/apps/sd_bounce.c
===================================================================
--- usrp2/trunk/firmware/apps/sd_bounce.c 2008-03-12 23:28:38 UTC (rev
8010)
+++ usrp2/trunk/firmware/apps/sd_bounce.c 2008-03-13 03:17:17 UTC (rev
8011)
@@ -27,44 +27,45 @@
#include "bool.h"
#include "nonstdio.h"
#include "memset_wa.h"
+#include <dbsm.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <ad9510.h>
+
// ----------------------------------------------------------------
-int packet_number = 0;
-volatile bool send_packet_now = 0;
+#define SERDES_RX_BUF_0 0
+#define SERDES_RX_BUF_1 1
-#define SERDES_TX_BUF 0
-#define SERDES_RX_BUF 1
+/*
+ * ================================================================
+ * configure SD RX double buffering state machine
+ * ================================================================
+ */
+// receive from SERDES
+buf_cmd_args_t sd_recv_args = {
+ PORT_SERDES,
+ 0,
+ BP_LAST_LINE
+};
-#define NLINES_PER_PKT 380
+// send to SERDES
+buf_cmd_args_t sd_send_args = {
+ PORT_SERDES,
+ 0, // starts with packet in line 0
+ 0, // filled in from list_line register
+};
+dbsm_t sd_sm; // the state machine
-// ----------------------------------------------------------------
-static int timer_delta = (int)(MASTER_CLK_RATE * 100e-6);
-void
-timer_irq_handler(unsigned irq)
-{
- hal_set_timeout(timer_delta); // schedule next timeout
- send_packet_now = true;
-}
+// ----------------------------------------------------------------
-static void
-init_packet(int *buf)
-{
- int i = 0;
- for (i = 0; i < BP_NLINES; i++){
- buf[i] = ((2*i + 0) << 16) | (2*i+1);
- }
-}
-
static bool
check_packet(int *buf, int nlines)
{
@@ -86,13 +87,32 @@
memset_wa(buffer_ram(bufno), 0, BP_NLINES * 4);
}
-static void
-init_packets(void)
+
+bool
+sd_rx_inspector(dbsm_t *sm, int buf_this)
{
- // init just the one we're using
- init_packet(buffer_ram(SERDES_TX_BUF));
+ hal_toggle_leds(0x2);
+
+ int last_line = buffer_pool_status->last_line[buf_this];
+ bool ok = check_packet(buffer_ram(buf_this), last_line);
+
+ if (ok)
+ putchar('r');
+ else
+ putchar('P');
+
+ return false;
}
+
+inline static void
+buffer_irq_handler(void)
+{
+ uint32_t status = buffer_pool_status->status;
+ dbsm_process_status(&sd_sm, status);
+}
+
+
int
main(void)
{
@@ -121,92 +141,15 @@
//output_regs->serdes_ctrl = (SERDES_ENABLE | SERDES_RXEN | SERDES_LOOPEN);
output_regs->serdes_ctrl = (SERDES_ENABLE | SERDES_RXEN);
- init_packets();
+
+ dbsm_init(&sd_sm, SERDES_RX_BUF_0,
+ &sd_recv_args, &sd_send_args,
+ sd_rx_inspector);
- // pic_register_handler(IRQ_TIMER, timer_irq_handler);
+ // kick off the state machine
+ dbsm_start(&sd_sm);
- //if (hwconfig_simulation_p())
- // timer_delta = sim_timer_delta;
-
- // start a receive from sd
- zero_buffer(SERDES_RX_BUF);
- bp_receive_to_buf(SERDES_RX_BUF, PORT_SERDES, 1, 0, BP_LAST_LINE);
-
- // fire off the first packet
- //bp_send_from_buf(SERDES_TX_BUF, PORT_SERDES, 1, 0, NLINES_PER_PKT);
- //hal_set_timeout(timer_delta);
-
-
- int counter = 0;
-
-#define EXPECTING_PKT() ((counter & 0x1) == 0)
-#define SEND_PKT() ((counter & 0x1) != 0)
-
- bool got_packet = false;
-
while(1){
- uint32_t status = buffer_pool_status->status;
-
- if (status & (BPS_DONE(SERDES_RX_BUF))){
- if(EXPECTING_PKT()) {
- hal_toggle_leds(0x2);
-
- // check packet
- int last_line = buffer_pool_status->last_line[SERDES_RX_BUF]-1;
- bool ok = check_packet(buffer_ram(SERDES_RX_BUF), last_line);
-
- if (ok)
- putchar('r');
- else
- putchar('P');
-
- bp_clear_buf(SERDES_RX_BUF);
- got_packet = true;
-
- bp_send_from_buf(SERDES_RX_BUF, PORT_SERDES, 1, 0, last_line);
- counter++;
- }
- else {
- // start a receive from sd
- bp_clear_buf(SERDES_RX_BUF);
- zero_buffer(SERDES_RX_BUF);
- bp_receive_to_buf(SERDES_RX_BUF, PORT_SERDES, 1, 0, BP_LAST_LINE);
- counter++;
- }
- }
- else if (status & (BPS_ERROR(SERDES_RX_BUF))){
- bp_clear_buf(SERDES_RX_BUF);
- got_packet = true;
-
- putchar('E');
-
- // start a receive from sd
- zero_buffer(SERDES_RX_BUF);
- bp_receive_to_buf(SERDES_RX_BUF, PORT_SERDES, 1, 0, BP_LAST_LINE);
- counter = 0;
- }
-
-#if 0
- int pending = pic_regs->pending;
- if (pending & PIC_TIMER_INT){
- hal_set_timeout(timer_delta);
-
- if (EXPECTING_PKT()){
- if (!got_packet)
- putchar('T');
- got_packet = false;
- }
-
- if (SEND_PKT()){
- if (status & BPS_IDLE(SERDES_TX_BUF))
- bp_send_from_buf(SERDES_TX_BUF, PORT_SERDES, 1, 0, NLINES_PER_PKT);
- }
- counter++;
-
- pic_regs->pending = PIC_TIMER_INT; // clear pending interrupt
- }
-#endif
+ buffer_irq_handler();
}
-
- return 1;
}
Modified: usrp2/trunk/firmware/lib/dbsm.c
===================================================================
--- usrp2/trunk/firmware/lib/dbsm.c 2008-03-12 23:28:38 UTC (rev 8010)
+++ usrp2/trunk/firmware/lib/dbsm.c 2008-03-13 03:17:17 UTC (rev 8011)
@@ -156,7 +156,7 @@
return;
if (status & (BPS_ERROR(sm->buf0) | BPS_ERROR(sm->buf0 ^ 1))){
- // putchar('E');
+ putchar('E');
// Most likely an ethernet Rx error. We just restart the transfer.
if (status & (BPS_ERROR(sm->buf0)))
dbsm_error_helper(sm, sm->buf0);
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r8011 - in usrp2/trunk/firmware: apps lib,
eb <=