[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commit-gnuradio] r7594 - in usrp2/trunk/firmware: apps lib
From: |
eb |
Subject: |
[Commit-gnuradio] r7594 - in usrp2/trunk/firmware: apps lib |
Date: |
Wed, 6 Feb 2008 19:59:53 -0700 (MST) |
Author: eb
Date: 2008-02-06 19:59:52 -0700 (Wed, 06 Feb 2008)
New Revision: 7594
Modified:
usrp2/trunk/firmware/apps/app_common.c
usrp2/trunk/firmware/apps/rx_only.c
usrp2/trunk/firmware/apps/tx_only.c
usrp2/trunk/firmware/lib/dbsm.c
usrp2/trunk/firmware/lib/dbsm.h
Log:
revised error, underrun and overrun handling
Modified: usrp2/trunk/firmware/apps/app_common.c
===================================================================
--- usrp2/trunk/firmware/apps/app_common.c 2008-02-07 00:40:57 UTC (rev
7593)
+++ usrp2/trunk/firmware/apps/app_common.c 2008-02-07 02:59:52 UTC (rev
7594)
@@ -120,7 +120,7 @@
eth_pkt_inspector(dbsm_t *sm, int bufno)
{
u2_eth_packet_t *pkt = (u2_eth_packet_t *) buffer_ram(bufno);
- size_t byte_len = (buffer_pool_status->last_line[bufno] - 1) * 4;
+ size_t byte_len = (buffer_pool_status->last_line[bufno] - 3) * 4;
// hal_toggle_leds(0x1);
Modified: usrp2/trunk/firmware/apps/rx_only.c
===================================================================
--- usrp2/trunk/firmware/apps/rx_only.c 2008-02-07 00:40:57 UTC (rev 7593)
+++ usrp2/trunk/firmware/apps/rx_only.c 2008-02-07 02:59:52 UTC (rev 7594)
@@ -43,10 +43,6 @@
static int fw_seqno; // used when f/w is filling in sequence numbers
#endif
-
-
-static int timer_delta = MASTER_CLK_RATE/1000; // tick at 1kHz
-
/*
* This program can respond to queries from the host
* and stream rx samples.
@@ -102,24 +98,6 @@
void
-timer_irq_handler(unsigned irq)
-{
- hal_set_timeout(timer_delta); // schedule next timeout
-}
-
-
-// Rx DSP overrun
-void
-overrun_irq_handler(unsigned irq)
-{
- dsp_rx_regs->clear_state = 1;
- dbsm_stop(&dsp_rx_sm);
- // dbsm_start(&dsp_rx_sm); // restart in start_rx_cmd
-
- putstr("\nirq: overrun\n");
-}
-
-void
start_rx_cmd(const u2_mac_addr_t *host, op_start_rx_t *p)
{
host_mac_addr = *host; // remember who we're sending to
@@ -169,17 +147,15 @@
{
uint32_t status = buffer_pool_status->status;
- if (status & BPS_ERROR_ALL){
- // FIXME rare path, handle error conditions
- }
-
- // FIXME probably ought to round-robin the check for done
-
if (status & BPS_DONE(CPU_RX_BUF)){ // we've rcvd a frame from ethernet
bp_clear_buf(CPU_RX_BUF);
eth_pkt_inspector(0, CPU_RX_BUF);
bp_receive_to_buf(CPU_RX_BUF, PORT_ETH, 1, 0, BP_LAST_LINE);
}
+ if (status & BPS_ERROR(CPU_RX_BUF)){ // error from ethernet
+ bp_clear_buf(CPU_RX_BUF);
+ bp_receive_to_buf(CPU_RX_BUF, PORT_ETH, 1, 0, BP_LAST_LINE);
+ }
dbsm_process_status(&dsp_rx_sm, status);
@@ -213,28 +189,38 @@
#endif
+static void
+simulate_start_cmd(void)
+{
+ // If we're simulating, pretend that we got a start command from the host
+
+ int rx_scale = 256;
+ int decim = 64;
+
+ u2_mac_addr_t host = {{ 0x00, 0x0A, 0xE4, 0x3E, 0xD2, 0xD5 }};
+ op_start_rx_t def_config;
+ memset(&def_config, 0, sizeof(def_config));
+ def_config.phase_inc = 0;
+ def_config.scale_iq = (rx_scale << 16) | rx_scale;
+ def_config.decim = decim;
+ def_config.samples_per_frame = DSP_RX_SAMPLES_PER_FRAME;
+ def_config.total_samples = 10000 * DSP_RX_SAMPLES_PER_FRAME;
+
+ start_rx_cmd(&host, &def_config);
+}
+
+
int
main(void)
{
u2_init();
- // setup tx gpio bits for GPIOM_FPGA_1 -- fpga debug output
hal_gpio_set_tx_mode(15, 0, GPIOM_FPGA_1);
- hal_gpio_set_rx_mode(15, 0, GPIOM_FPGA_1); // no printing...
+ hal_gpio_set_rx_mode(15, 0, GPIOM_FPGA_1);
putstr("\nrx_only\n");
-
- // Control LEDs
- hal_set_leds(0x0, 0x3);
- pic_register_handler(IRQ_OVERRUN, overrun_irq_handler);
- // pic_register_handler(IRQ_UNDERRUN, underrun_irq_handler);
-
- //pic_register_handler(IRQ_TIMER, timer_irq_handler);
- //hal_set_timeout(timer_delta);
-
ethernet_register_link_changed_callback(link_changed_callback);
-
ethernet_init();
// initialize double buffering state machine for DSP RX -> Ethernet
@@ -249,29 +235,21 @@
dbsm_nop_inspector);
}
-
// setup receive from ETH
bp_receive_to_buf(CPU_RX_BUF, PORT_ETH, 1, 0, BP_LAST_LINE);
- if (hwconfig_simulation_p()){
- // If we're simulating, pretend that we got a start command from the host
+ if (hwconfig_simulation_p())
+ simulate_start_cmd();
- int rx_scale = 256;
- int decim = 64;
+ while(1){
+ buffer_irq_handler(0);
- u2_mac_addr_t host = {{ 0x00, 0x0A, 0xE4, 0x3E, 0xD2, 0xD5 }};
- op_start_rx_t def_config;
- memset(&def_config, 0, sizeof(def_config));
- def_config.phase_inc = 0;
- def_config.scale_iq = (rx_scale << 16) | rx_scale;
- def_config.decim = decim;
- def_config.samples_per_frame = DSP_RX_SAMPLES_PER_FRAME;
- def_config.total_samples = 10000 * DSP_RX_SAMPLES_PER_FRAME;
+ int pending = pic_regs->pending; // poll for under or overrun
- start_rx_cmd(&host, &def_config);
+ if (pending & PIC_OVERRUN_INT){
+ dbsm_handle_rx_overrun(&dsp_rx_sm);
+ pic_regs->pending = PIC_OVERRUN_INT; // clear pending interrupt
+ putchar('O');
+ }
}
-
- while(1){
- buffer_irq_handler(0);
- }
}
Modified: usrp2/trunk/firmware/apps/tx_only.c
===================================================================
--- usrp2/trunk/firmware/apps/tx_only.c 2008-02-07 00:40:57 UTC (rev 7593)
+++ usrp2/trunk/firmware/apps/tx_only.c 2008-02-07 02:59:52 UTC (rev 7594)
@@ -36,8 +36,6 @@
#include <string.h>
-static int timer_delta = MASTER_CLK_RATE/1000; // tick at 1kHz
-
/*
* This program can respond to queries from the host
* and stream rx samples.
@@ -92,26 +90,6 @@
void
-timer_irq_handler(unsigned irq)
-{
- hal_set_timeout(timer_delta); // schedule next timeout
-}
-
-// Tx DSP underrun
-void
-underrun_irq_handler(unsigned irq)
-{
- putchar('U');
-
- dbsm_stop(&dsp_tx_sm);
- dsp_tx_regs->clear_state = 1;
- dbsm_start(&dsp_tx_sm); // restart sm so we're listening to ethernet again
-
- // putstr("\nirq: underrun\n");
-}
-
-
-void
start_rx_cmd(const u2_mac_addr_t *host, op_start_rx_t *p)
{
}
@@ -128,7 +106,6 @@
bp_clear_buf(DSP_TX_BUF_0);
bp_clear_buf(DSP_TX_BUF_1);
-#if 1
int tx_scale = 256;
int interp = 32;
@@ -140,7 +117,6 @@
// setup Tx DSP regs
config_tx_cmd(&def_config);
-#endif
}
@@ -151,23 +127,6 @@
uint32_t status = buffer_pool_status->status;
- if (status & BPS_ERROR_ALL){
- // FIXME rare path, handle error conditions
- putstr("ERR = ");
- puthex32_nl(status);
-
- int r = ethernet_check_errors();
- putstr("RME = ");
- puthex8_nl(r);
-
- if (status & (BPS_ERROR(DSP_TX_BUF_0) | BPS_ERROR(DSP_TX_BUF_1))){
- dbsm_stop(&dsp_tx_sm);
- dsp_tx_regs->clear_state = 1; // try to restart
- dbsm_start(&dsp_tx_sm);
- return;
- }
- }
-
dbsm_process_status(&dsp_tx_sm, status);
if (status & BPS_DONE(CPU_TX_BUF)){
@@ -185,18 +144,8 @@
hal_gpio_set_rx_mode(15, 0, GPIOM_FPGA_1); // no printing...
putstr("\ntx_only\n");
-
- // Control LEDs
- hal_set_leds(0x0, 0x3);
- // pic_register_handler(IRQ_OVERRUN, overrun_irq_handler);
- pic_register_handler(IRQ_UNDERRUN, underrun_irq_handler);
-
- //pic_register_handler(IRQ_TIMER, timer_irq_handler);
- //hal_set_timeout(timer_delta);
-
ethernet_register_link_changed_callback(link_changed_callback);
-
ethernet_init();
// initialize double buffering state machine for ethernet -> DSP Tx
@@ -213,6 +162,14 @@
while(1){
buffer_irq_handler(0);
+
+ int pending = pic_regs->pending; // poll for under or overrun
+
+ if (pending & PIC_UNDERRUN_INT){
+ dbsm_handle_tx_underrun(&dsp_tx_sm);
+ pic_regs->pending = PIC_UNDERRUN_INT; // clear interrupt
+ putchar('U');
+ }
}
}
Modified: usrp2/trunk/firmware/lib/dbsm.c
===================================================================
--- usrp2/trunk/firmware/lib/dbsm.c 2008-02-07 00:40:57 UTC (rev 7593)
+++ usrp2/trunk/firmware/lib/dbsm.c 2008-02-07 02:59:52 UTC (rev 7594)
@@ -147,6 +147,7 @@
}
static void dbsm_process_helper(dbsm_t *sm, int buf_this);
+static void dbsm_error_helper(dbsm_t *sm, int buf_this);
void
dbsm_process_status(dbsm_t *sm, uint32_t status)
@@ -154,6 +155,15 @@
if (!sm->running)
return;
+ if (status & (BPS_ERROR(sm->buf0) | BPS_ERROR(sm->buf0 ^ 1))){
+ // Most likely an ethernet Rx error. We just restart the transfer.
+ if (status & (BPS_ERROR(sm->buf0)))
+ dbsm_error_helper(sm, sm->buf0);
+
+ if (status & (BPS_ERROR(sm->buf0 ^ 1)))
+ dbsm_error_helper(sm, sm->buf0 ^ 1);
+ }
+
if (status & BPS_DONE(sm->buf0))
dbsm_process_helper(sm, sm->buf0);
@@ -213,3 +223,57 @@
}
}
+static void
+dbsm_error_helper(dbsm_t *sm, int buf_this)
+{
+ bp_clear_buf(buf_this); // clears ERROR flag
+
+ if (buffer_state[buf_this] == BS_FILLING){
+ dbsm_receive_to_buf(sm, buf_this); // restart the xfer
+ }
+ else { // buffer was emptying
+ dbsm_send_from_buf(sm, buf_this); // restart the xfer
+ }
+}
+
+/*
+ * Handle DSP Tx underrun
+ */
+void
+dbsm_handle_tx_underrun(dbsm_t *sm)
+{
+ // clear the DSP Tx state machine
+ dsp_tx_regs->clear_state = 1;
+
+ // If there's a buffer that's empyting (unlikely), clear it & restart xfer
+
+ if (buffer_state[sm->buf0] == BS_EMPTYING){
+ bp_clear_buf(sm->buf0);
+ dbsm_send_from_buf(sm, sm->buf0);
+ }
+
+ if (buffer_state[sm->buf0 ^ 1] == BS_EMPTYING){
+ bp_clear_buf(sm->buf0 ^ 1);
+ dbsm_send_from_buf(sm, sm->buf0 ^ 1);
+ }
+}
+
+/*
+ * Handle DSP Rx overrun
+ */
+void
+dbsm_handle_rx_overrun(dbsm_t *sm)
+{
+ dsp_rx_regs->clear_state = 1;
+
+ // If there's a buffer that's filling, clear it.
+ // Any restart will be the job of the caller.
+
+ if (buffer_state[sm->buf0] == BS_FILLING)
+ bp_clear_buf(sm->buf0);
+
+ if (buffer_state[sm->buf0 ^1] == BS_FILLING)
+ bp_clear_buf(sm->buf0 ^ 1);
+
+ putchar('O');
+}
Modified: usrp2/trunk/firmware/lib/dbsm.h
===================================================================
--- usrp2/trunk/firmware/lib/dbsm.h 2008-02-07 00:40:57 UTC (rev 7593)
+++ usrp2/trunk/firmware/lib/dbsm.h 2008-02-07 02:59:52 UTC (rev 7594)
@@ -71,5 +71,7 @@
void dbsm_start(dbsm_t *sm);
void dbsm_stop(dbsm_t *sm);
void dbsm_process_status(dbsm_t *sm, uint32_t status);
+void dbsm_handle_tx_underrun(dbsm_t *sm);
+void dbsm_handle_rx_overrun(dbsm_t *sm);
#endif /* INCLUDED_DBSM_H */
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r7594 - in usrp2/trunk/firmware: apps lib,
eb <=