URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [tags/] [nog_patch_35/] [or1ksim/] [testbench/] [eth.c] - Rev 997
Go to most recent revision | Compare with Previous | Blame | View Log
/* Ethernet test */ #include "spr_defs.h" #include "support.h" #include "board.h" typedef long off_t; #include "../peripheral/fields.h" #include "../peripheral/ethernet.h" typedef volatile unsigned long *REGISTER; REGISTER eth_moder = (unsigned long *)(ETH_BASE + ETH_MODER), eth_int_source = (unsigned long *)(ETH_BASE + ETH_INT_SOURCE), eth_int_mask = (unsigned long *)(ETH_BASE + ETH_INT_MASK), eth_ipgt = (unsigned long *)(ETH_BASE + ETH_IPGT), eth_ipgr1 = (unsigned long *)(ETH_BASE + ETH_IPGR1), eth_ipgr2 = (unsigned long *)(ETH_BASE + ETH_IPGR2), eth_packetlen = (unsigned long *)(ETH_BASE + ETH_PACKETLEN), eth_collconf = (unsigned long *)(ETH_BASE + ETH_COLLCONF), eth_tx_bd_num = (unsigned long *)(ETH_BASE + ETH_TX_BD_NUM), eth_controlmoder = (unsigned long *)(ETH_BASE + ETH_CTRLMODER), eth_miimoder = (unsigned long *)(ETH_BASE + ETH_MIIMODER), eth_miicommand = (unsigned long *)(ETH_BASE + ETH_MIICOMMAND), eth_miiaddress = (unsigned long *)(ETH_BASE + ETH_MIIADDRESS), eth_miitx_data = (unsigned long *)(ETH_BASE + ETH_MIITX_DATA), eth_miirx_data = (unsigned long *)(ETH_BASE + ETH_MIIRX_DATA), eth_miistatus = (unsigned long *)(ETH_BASE + ETH_MIISTATUS), eth_mac_addr0 = (unsigned long *)(ETH_BASE + ETH_MAC_ADDR0), eth_mac_addr1 = (unsigned long *)(ETH_BASE + ETH_MAC_ADDR1), eth_bd_base = (unsigned long *)(ETH_BASE + ETH_BD_BASE); volatile unsigned int_happend; unsigned char r_packet[2000]; unsigned char s_packet[1003]; unsigned tx_bindex; unsigned rx_bindex; void interrupt_handler() { unsigned i,len; PRINTF ("Int\n"); switch (*eth_int_source & 0x7f) { case 0x2 : PRINTF ("Transmit Error.\n"); *eth_int_source = 0x2; break; case 0x8 : PRINTF ("Receive Error\n"); *eth_int_source = 0x8; break; case 0x4 : PRINTF ("Receive Frame\n"); *eth_int_source = 0x4; CLEAR_FLAG(*eth_moder, ETH_MODER, RXEN); len = GET_FIELD(eth_bd_base[*eth_tx_bd_num + 2], ETH_RX_BD, LENGTH); for (i=0; i<len; i++) if (r_packet[i] != (unsigned char)i) { PRINTF("Failed at byte %d. expect %d, received %d\n", i, i, r_packet[i]); exit(1); } break; case 0x10: PRINTF ("Busy\n"); *eth_int_source = 0x10; break; case 0x1 : PRINTF ("Transmit Frame.\n"); *eth_int_source = 0x1; CLEAR_FLAG(*eth_moder, ETH_MODER, TXEN); break; default: PRINTF ("Invalid int @ %0x\n", (unsigned int)*eth_int_source & 0x7f); *eth_int_source = 0x7f; exit (1); } mtspr(SPR_PICSR, 0); int_happend = 1; } static void set_mac( void ) { *eth_mac_addr0 = 0x04030201LU; *eth_mac_addr1 = 0x00000605LU; } static void transmit_one_packet( void ) { unsigned i; /* Initialize packet */ for ( i = 0; i < sizeof(s_packet); ++ i ) s_packet[i] = (unsigned char)i; /* Set Ethernet BD */ SET_FIELD(eth_bd_base[tx_bindex], ETH_TX_BD, LENGTH, sizeof(s_packet)); eth_bd_base[tx_bindex + 1] = (unsigned long)s_packet; /* Start Ethernet */ SET_FLAG(eth_bd_base[tx_bindex], ETH_TX_BD, READY); SET_FLAG(*eth_moder, ETH_MODER, TXEN); /* Now wait till sent */ while ( TEST_FLAG( eth_bd_base[tx_bindex], ETH_TX_BD, READY ) ); CLEAR_FLAG(*eth_moder, ETH_MODER, TXEN); *eth_int_source = 0x7f; } static void transmit_one_packet_int( void ) { unsigned i; int_happend = 0; /* Initialize packet */ PRINTF("Init\n"); for ( i = 0; i < sizeof(s_packet); ++ i ) s_packet[i] = (unsigned char)i; /* Set Ethernet BD */ PRINTF("Set BD\n"); SET_FIELD(eth_bd_base[tx_bindex], ETH_TX_BD, LENGTH, sizeof(s_packet)); eth_bd_base[tx_bindex + 1] = (unsigned long)s_packet; /* Start Ethernet */ PRINTF("Set Flags\n"); SET_FLAG(eth_bd_base[tx_bindex], ETH_TX_BD, IRQ); SET_FLAG(eth_bd_base[tx_bindex], ETH_TX_BD, READY); SET_FLAG(*eth_moder, ETH_MODER, TXEN); } static void receive_one_packet(void) { unsigned int i; unsigned int len; eth_bd_base[rx_bindex + 1] = (unsigned long)r_packet; SET_FLAG(eth_bd_base[rx_bindex], ETH_RX_BD, READY); SET_FLAG(*eth_moder, ETH_MODER, RXEN); while ( TEST_FLAG( eth_bd_base[rx_bindex], ETH_RX_BD, READY ) ); CLEAR_FLAG(*eth_moder, ETH_MODER, RXEN); *eth_int_source = 0x7f; len = GET_FIELD(eth_bd_base[rx_bindex], ETH_RX_BD, LENGTH); for (i=0; i<len; i++) if (r_packet[i] != (unsigned char)i) { PRINTF("Failed at byte %d. expect %d, received %d\n", i, i, r_packet[i]); exit(1); } } static void receive_one_packet_int(void) { int_happend = 0; PRINTF("Set BD\n"); eth_bd_base[rx_bindex + 1] = (unsigned long)r_packet; PRINTF("SetFlags\n"); SET_FLAG(eth_bd_base[rx_bindex], ETH_RX_BD, IRQ); SET_FLAG(eth_bd_base[rx_bindex], ETH_RX_BD, READY); SET_FLAG(*eth_moder, ETH_MODER, RXEN); } int main() { PRINTF( "Starting Ethernet test\n" ); tx_bindex = 0; rx_bindex = *eth_tx_bd_num; set_mac(); /*-------------------*/ /* non iterrupt test */ transmit_one_packet(); tx_bindex += 2; receive_one_packet(); rx_bindex += 2; transmit_one_packet(); tx_bindex += 2; receive_one_packet(); rx_bindex += 2; /*-------------------*/ /* interrupt test */ excpt_int = (unsigned long)interrupt_handler; /* Enable interrup ts */ PRINTF("enable ints\n"); mtspr (SPR_SR, mfspr(SPR_SR) | SPR_SR_IEE); mtspr (SPR_PICMR, mfspr(SPR_PICMR) | (0x00000001L << ETH_IRQ)); PRINTF("set mask flags TX\n"); SET_FLAG(*eth_int_mask, ETH_INT_MASK, TXB_M); transmit_one_packet_int(); tx_bindex += 2; PRINTF("waiting for int\n"); while (!int_happend); CLEAR_FLAG(*eth_int_mask, ETH_INT_MASK, TXB_M); PRINTF("seting mask flag RX\n"); SET_FLAG(*eth_int_mask, ETH_INT_MASK, RXB_M); receive_one_packet_int(); rx_bindex += 2; PRINTF("waiting for int\n"); while (!int_happend); CLEAR_FLAG(*eth_int_mask, ETH_INT_MASK, RXB_M); PRINTF( "Ending Ethernet test\n" ); report (0xdeaddead); exit(0); }
Go to most recent revision | Compare with Previous | Blame | View Log