#define BASE 0xfff000 #define VCP(X) (*(volatile unsigned char *)(X)) #define VSP(X) (*(volatile unsigned short *)(X)) #define VLP(X) (*(volatile unsigned long *)(X)) #define PBCNT VSP(BASE + 0x824) #define PBDDR VSP(BASE + 0x826) #define PBDAT VSP(BASE + 0x828) #define I_VEC VLP(0x140) #define ECNTRL VSP(0xffe800) #define EDMA VSP(0xffe802) #define EMRBLR VSP(0xffe804) #define INTR_VECT VSP(0xffe806) #define INTR_EVENT VSP(0xffe808) #define INTR_MASK VSP(0xffe80a) #define ECNFIG VSP(0xffe80c) #define ETHER_TEST VSP(0xffe80e) #define AR_CNTRL VSP(0xffe810) #define E_RXBD VSP(0xffec40) #define E_RXBDL VSP(0xffec42) #define E_RXBDPTR VLP(0xffec44) #define E_RXBDN VSP(0xffec48) #define E_TXBD VSP(0xffec00) #define E_TXBDL VSP(0xffec02) #define E_TXBDPTR VLP(0xffec04) #define E_TXBDN VSP(0xffec08) #define TXBD VSP(0xfff440) #define TXBDL VSP(0xfff442) #define RXBD VSP(0xfff400) #define RXBDL VSP(0xfff402) #define RBD VCP(0xfff487) #define SCCE1 VCP(0xfff888) #define SCM1 VSP(0xfff884) #define ISR VSP(0xfff818) #define IPR VSP(0xfff814) extern void isr_ethernet(void); extern void int_ethernet(void); char input = 'a'; char flag = 0; char str; char *rxbf = (char *)0xfff180; char *txbf = (char *)0xfff000; char rcv_buf[1536]; char trm_buf[1536]; void start(void) { int i; char *d_addr; ECNTRL = 0x0001; /* reset */ EDMA = 0x002b; EMRBLR = 0x0600; INTR_VECT = 0x0050; INTR_MASK = 0x0018; ECNFIG = 0x0000; ETHER_TEST = 0x0000; AR_CNTRL = 0x4000; /* accept multicast, broadcast */ d_addr = (unsigned char *)0xffea00; /* device address assign */ *d_addr++ = 0x08; *d_addr++ = 0x00; *d_addr++ = 0x3e; *d_addr++ = 0x46; *d_addr++ = 0x81; *d_addr++ = 0x02; d_addr = (unsigned char *)0xffea08; for(; d_addr < 0xffec00; d_addr++) { if(((long)d_addr % 8) < 6) *d_addr = 0xff; } /* BD initialization */ E_RXBD = 0xb000; E_RXBDPTR = rcv_buf; E_RXBDPTR &= 0x00ffffff; E_RXBDN = 0x0000; E_TXBD = 0x2c00; E_TXBDPTR = trm_buf; E_TXBDN = 0x0000; /* Vector initialization */ I_VEC = (volatile unsigned long *)int_ethernet; ECNTRL = 0x0003; PBCNT &= 0xffbf; PBDDR |= 0x0040; PBDAT |= 0x0040; str = 0; flag = 0; while(1) { unsigned short len, tmp; if(flag == 0) continue; flag = 0; len = E_RXBDL; for(i = 0; i < len; i++) { unsigned char tmp, digit; tmp = rcv_buf[i]; while((TXBD & 0x8000) != 0); TXBDL = 3; digit = (tmp & 0xf0) >> 4; if(digit > 9) digit = digit - 10 + 'a'; else digit = digit + '0'; *txbf = digit; digit = tmp & 0x0f; if(digit > 9) digit = digit - 10 + 'a'; else digit = digit + '0'; *(txbf + 1) = digit; *(txbf + 2) = ' '; TXBD |= 0x8000; str++; if(str == 16) { str = 0; while((TXBD & 0x8000) != 0); *txbf = 0x0a; *(txbf + 1) = 0x0d; TXBDL = 2; TXBD |= 0x8000; } } E_RXBD |= 0x8000; str = 0; while((TXBD & 0x8000) != 0); *txbf = 0x0a; *(txbf + 1) = 0x0d; TXBDL = 2; TXBD |= 0x8000; } } void isr_ethernet(void) { unsigned short intr_event; intr_event = INTR_EVENT; INTR_EVENT = 0xffff; if((intr_event & 0x0008) != 0) { /* receive */ PBDAT ^= 0x0040; flag = 1; E_RXBD |= 0x8000; } if((intr_event & 0x0010) != 0) { /* transmit */ while((TXBD & 0x8000) != 0); TXBDL = 1; *txbf = 'T'; TXBD |= 0x8000; } if((intr_event & 0x0400) != 0) { /* heartbeet error */ while((TXBD & 0x8000) != 0); TXBDL = 1; *txbf = 'H'; TXBD |= 0x8000; } if((intr_event & 0x0200) != 0) { /* babbling receive error */ while((TXBD & 0x8000) != 0); TXBDL = 1; *txbf = 'B'; TXBD |= 0x8000; } if((intr_event & 0x0100) != 0) { /* babbling transmit error */ while((TXBD & 0x8000) != 0); TXBDL = 1; *txbf = 'A'; TXBD |= 0x8000; } if((intr_event & 0x0080) != 0) { /* graceful stop error */ while((TXBD & 0x8000) != 0); TXBDL = 1; *txbf = 'G'; TXBD |= 0x8000; } if((intr_event & 0x0040) != 0) { /* Backoff done */ while((TXBD & 0x8000) != 0); TXBDL = 1; *txbf = 'F'; TXBD |= 0x8000; } if((intr_event & 0x0020) != 0) { /* Ethernet bus error */ while((TXBD & 0x8000) != 0); TXBDL = 1; *txbf = 'E'; TXBD |= 0x8000; } if((intr_event & 0x0004) != 0) { /* busy error */ while((TXBD & 0x8000) != 0); TXBDL = 1; *txbf = 'S'; TXBD |= 0x8000; } }