- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Can someone please tell me a way to receive Ethernet traffic on a DE-4 board? I've gone through the example provided in the tutorial, using TSE on DE-4, and it works fine. Now I need to receive actual network traffic on the DE-4. What is the easiest way to do this?
Thanks a lot in advance. :DLink Copied
2 Replies
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Your question isn't clear: if TSE on DE-4 is working fine, what more would you like to accomplish?
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
I'm sorry my qiestion wasn't so clear. What I've got working is the example provided in the TSE in DE-4 tutorial, the one where you have a loopback set on eth0 port. What I want to do now is to get Ethernet packets from another source (like a separate PC).
Following code is the one I've got working now.#include <altera_avalon_sgdma.h>
# include <altera_avalon_sgdma_descriptor.h>
# include <altera_avalon_sgdma_regs.h>
# include "sys/alt_stdio.h"
# include "sys/alt_irq.h"
# include <unistd.h>
// Function Prototypes
void rx_ethernet_isr (void *context);
volatile char *onchip_control = (char *) 0x00000FFF;
volatile char *onchip_data_rx = (char *) 0x00001000;
volatile char *onchip_data_tx = (char *) 0x00008000;
// Global Variables
unsigned int text_length;
// Create a transmit frame
unsigned char tx_frame = {
0x00,0x00, // for 32-bit alignment
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // destination address (broadcast)
0x01,0x60,0x6E,0x11,0x02,0x0F, // source address
0x03,0xF0, // length or type of the payload data
'\0' // payload data (ended with termination character)
};
// Create a receive frame
unsigned char rx_frame = { 0 };
// Create sgdma transmit and receive devices
alt_sgdma_dev * sgdma_tx_dev;
alt_sgdma_dev * sgdma_rx_dev;
// Allocate descriptors in the descriptor_memory (onchip memory)
alt_sgdma_descriptor tx_descriptor __attribute__ (( section ( ".descriptor_memory" )));
alt_sgdma_descriptor tx_descriptor_end __attribute__ (( section ( ".descriptor_memory" )));
alt_sgdma_descriptor rx_descriptor __attribute__ (( section ( ".descriptor_memory" )));
alt_sgdma_descriptor rx_descriptor_end __attribute__ (( section ( ".descriptor_memory" )));
/********************************************************************************
* This program demonstrates use of the Ethernet in the DE4 board.
*
* It performs the following:
* 1. Records input text and transmits the text via Ethernet after Enter is
* pressed
* 2. Displays text received via Ethernet frame on the JTAG UART
********************************************************************************/
int main(void)
{
// Open the sgdma transmit device
sgdma_tx_dev = alt_avalon_sgdma_open ("/dev/sgdma_tx");
if (sgdma_tx_dev == NULL) {
alt_printf ("Error: could not open scatter-gather dma transmit device\n");
return -1;
} else alt_printf ("Opened scatter-gather dma transmit device\n");
// Open the sgdma receive device
sgdma_rx_dev = alt_avalon_sgdma_open ("/dev/sgdma_rx");
if (sgdma_rx_dev == NULL) {
alt_printf ("Error: could not open scatter-gather dma receive device\n");
return -1;
} else alt_printf ("Opened scatter-gather dma receive device\n");
// Set interrupts for the sgdma receive device
alt_avalon_sgdma_register_callback( sgdma_rx_dev, (alt_avalon_sgdma_callback) rx_ethernet_isr, 0x00000014, NULL );
// Create sgdma receive descriptor
alt_avalon_sgdma_construct_stream_to_mem_desc( &rx_descriptor, &rx_descriptor_end, (alt_u32 *)rx_frame, 0, 0 );
// Set up non-blocking transfer of sgdma receive descriptor
alt_avalon_sgdma_do_async_transfer( sgdma_rx_dev, &rx_descriptor );
// Triple-speed Ethernet MegaCore base address
volatile int * tse = (int *) 0x00083000; //tse.control_port at Qsys address map
// Initialize the MAC address
*(tse + 3) = 0x116E6001;
*(tse + 4) = 0x00000F02;
// Specify the addresses of the PHY devices to be accessed through MDIO interface
*(tse + 0x0F) = 0x10;
*(tse + 0x10) = 0x00;
// Write to register 20 of the PHY chip for Ethernet port 0 to set up line loopback
*(tse + 0xB4) = 0x4000;
// Set the PCS to operate at SGMII mode and enable SGMII auto-negotiation
*(tse + 0x94) = *(tse + 0x94) | 0x0003;
// Set PHY address for accessing the PHY chip for Ethernet port 1
*(tse + 0x10) = 0x01;
// Write to register 16 of the PHY to enable automatic crossover for all modes
*(tse + 0xB0) = *(tse + 0xB0) | 0x0060;
// Software reset the PHY chip and wait
*(tse + 0xA0) = *(tse + 0xA0) | 0x8000;
while ( *(tse + 0xA0) & 0x8000 )
;
// Enable read and write transfers, gigabit Ethernet operation, and CRC forwarding
*(tse + 2) = *(tse + 2) | 0x0000004B;
alt_printf( "send> " );
text_length = 0;
while (1) {
char new_char;
tx_frame = '\0';
//Read the PCIe received data
int i;
while( *onchip_control != 'B' ) ;// polling the control byte
i = 0;
while( (new_char = *(onchip_data_tx + i) ) != '\n' ) {
if (text_length < 1007) {
// Add the new character to the output text
if ( new_char >= 'a' && new_char <= 'z' )
tx_frame = new_char - 'a' + 'A';
else if ( new_char >= 'A' && new_char <= 'Z' )
tx_frame = new_char - 'A' + 'a';
else
tx_frame = '#';
text_length++;
// Maintain the terminal character after the text
tx_frame = '\0';
}
i++;
}
*onchip_control = 'K' ; // keep the control in the board until receive
// Create transmit sgdma descriptor
alt_avalon_sgdma_construct_mem_to_stream_desc( &tx_descriptor, &tx_descriptor_end, (alt_u32 *)tx_frame, 1024, 0, 1, 1, 0 );
// Set up non-blocking transfer of sgdma transmit descriptor
alt_avalon_sgdma_do_async_transfer( sgdma_tx_dev, &tx_descriptor );
// Wait until transmit descriptor transfer is complete
while (alt_avalon_sgdma_check_descriptor_status(&tx_descriptor) != 0)
;
}
return 0;
}
/****************************************************************************************
* Subroutine to read incoming Ethernet frames
****************************************************************************************/
void rx_ethernet_isr (void *context)
{
int i;
// Wait until receive descriptor transfer is complete
while (alt_avalon_sgdma_check_descriptor_status(&rx_descriptor) != 0)
;
// Clear input line before writing
for (i = 0; i < (6 + text_length); i++) {
alt_printf( "%c", 0x08 ); // 0x08 --> backspace
}
// Output received text
alt_printf( "\nreceive> %s\n", rx_frame + 16 );
while( *onchip_control != 'K' ) ;// polling the control byte
for (i = 0; i < (6 + text_length); i++) {
*(onchip_data_rx + i) = rx_frame;
}
*onchip_control = 'H' ; // pass the control right to the host PC
// Reprint current input line after the output
alt_printf( "\nsend> %s", tx_frame + 16 );
// Create new receive sgdma descriptor
alt_avalon_sgdma_construct_stream_to_mem_desc( &rx_descriptor, &rx_descriptor_end, (alt_u32 *)rx_frame, 0, 0 );
// Set up non-blocking transfer of sgdma receive descriptor
alt_avalon_sgdma_do_async_transfer( sgdma_rx_dev, &rx_descriptor );
text_length = 0;
}
Thanks a lot for your time and suggestions Ted! :D
Reply
Topic Options
- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Printer Friendly Page