|

楼主 |
发表于 2004-5-22 08:32:28
|
显示全部楼层
[下载]AUDC812 的 tcpip 源代码 - 8019
//赚点小钱!
//给出main 函数源代码以供参考
//不错的说
#include <aduc812.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "reg_8019.h"
#include "depend.h"
#include "global.h"
#include "proto.h"
/*****************************************************************************/
/*Debug Mode */
/*****************************************************************************/
//#define STRING_TEST /* sizeof(data type) */
//#define RECEIVE_STATUS
//#define RTL8019AS_ID_CHECK
#define RECEIVE_TEST
/*****************************************************************************/
/*Global variable */
/*****************************************************************************/
byte EthRxBuf[NBUF][SBUFSIZ];
byte EthTxBuf[BUFSIZ];
union t {/* time out variable for interrupt */
word hl;
byte reg[2];
word watchdog_counter;
}time[2];
/*****************************************************************************/
/*Main routine start */
/*****************************************************************************/
void main(void)
{
system_init();
ethernet_init();
print_logo();
print("\n\rInitialize OK ..");
while(1){
//EN_CMD = EN_PAGE0 + EN_NODMA + EN_START;
print("\n\r'Y2K.11.20:\\>");
switch(get_serial_echo()){
case '0': output_port0();break;
case '1': output_port1();break;
case '2': output_port2();break;
case '3': output_port3();break;
case '4': ethernet_register_test();break;
case '5': ethernet_packet_tx_test();break;
//case 'a':
//case 'S': alter_memory();
case 'c':
case 'C': clear_external_ram();break;
case 'd': dump_auto = 1;
dump_memory();break;
case 'D': dump_auto = 0;
dump_memory();break;
//case 'e':
//case 'E': break;
case 'H':
case 'h':
case '?': help_message();break;
case 'i':
case 'I': input_port1();break;
case ':': loading_ready = 1;
case 'L':
case 'l': loading_program();break;
case 'q':
case 'Q': quit_program();break;
case 'r':
case 'R': reset();break;
case 't':
case 'T': tiny_tcp_main();break;
case 'Z':
case 'z': DoS();break;
case '$': alter_memory();
ethernet_test();break;
default : break;
}
}
}
/*****************************************************************************/
/* INTERRUPT SERVICE ROUTINE */
/*****************************************************************************/
void RTL8019AS_INT0() interrupt 0 /* External Interrupt 0 */
{
/* you have to use data(Internal RAM) to access faster */
/* ENISR_ALL value must be modified when you detect error or success and so on.. */
byte e_isr;
disable();/*EA = 0 global interrupt flag disable */
e_isr = EN0_ISR;
P1_1 = !P1_1;/* When it go into interrupt routine, this bit changes 1 and 0 */
time[0].watchdog_counter = 0;/* clear to zero to inhibit watchdog */
EN_CMD = EN_PAGE0 + EN_NODMA;
if ( e_isr & ( ENISR_OVER ) ) {/* Receiver overwrote the ring */
ei_rx_overrun();
}
else if ( e_isr & (ENISR_RX) ) {/* Receive without error */
#ifdef RECEIVE_TEST
ei_receive();
#elif
receive_test();
#endif
EN0_ISR = ENISR_RX;
}
if ( e_isr & ENISR_RX_ERR ) {
/* Receiver with error(CRC, frame aligement,FIFO overflow, receive packet failure */
//print_int("\n\rReceive error..");
EN0_ISR = ENISR_RX_ERR;
}
if ( e_isr & ( ENISR_TX ) ) {/* Transmit without error */
//print_int("\n\rTx OK!");
EN0_ISR = ENISR_TX;
}
if ( e_isr & ( ENISR_TX_ERR ) ) {/* Transmit with error(collision, FIFO underrun) */
//print_int("\n\rTx error..");
EN0_ISR = ENISR_TX_ERR; /* ? */
}
if ( e_isr & ( ENISR_COUNTERS ) ) {
//print_int("\n\rCounter error..");
rx_frame_errors += EN0_COUNTER0;
rx_crc_errors += EN0_COUNTER1;
rx_missed_errors += EN0_COUNTER2;
EN0_ISR = ENISR_COUNTERS;/* Counters need emptying */
}
if ( e_isr & ( ENISR_RDC ) ) {/* Remote DMA complete */
EN0_ISR = ENISR_RDC;
}
EN_CMD = EN_PAGE0 + EN_NODMA + EN_START;
EN0_ISR = 0xff;
//EN0_ISR = ENISR_ALL;
enable();/*EA = 1 global interrupt flag enable */
}
void TIMEOUT_T0_INT() interrupt 1
{
T0 = !T0;/* T0 pin*/
clock_MS++;/* I don't know yet ??*/
TH0 = time[0].reg[0];/* <-- TIMER0_INTERVAL_HIGH_BYTE */
TL0 = time[0].reg[1];/* <-- TIMER0_INTERVAL_LOW_BYTE */
if (time[0].watchdog_counter > WATCHDOG){
time[0].watchdog_counter = 0;
//print_int("S");
//ethernet_init();
//print_int("\n\rWatchDog bowwow~!!");
}
else{
time[0].watchdog_counter += 1;
}
}
|
|