00001
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #define INFO "Isa ethernet board firmware, version 0071"
00035
00036 #include <config.h>
00037 #include "NE2000.h"
00038 #include "oscp.h"
00039
00040
00041 #include <avr/io.h>
00042 #include "util.h"
00043 #include "debug.h"
00044 #include "isa_bus.h"
00045 #include "uip.h"
00046 #include "uip_arp.h"
00047 #include "config.h"
00048
00049 #define BUF ((struct uip_eth_hdr *)&uip_buf[0])
00050
00051
00052 #if UIP_UDP
00053 void uip_udp_listen(u16_t port)
00054 {
00055 u8_t c;
00056 for(c = 0; c < UIP_UDP_CONNS; ++c) {
00057 if(0==uip_udp_conns[c].lport){
00058 uip_udp_conns[c].lport = port;
00059 }
00060 }
00061 }
00062 #endif
00063
00064 #define FRAME_HEADER ((struct frame_header *)&uip_appdata[0])
00065 #define FRAME_BUFFER ((unsigned char *)&uip_appdata[sizeof(struct frame_header)])
00066 #define FRAME_CHKSUM *((unsigned char *)&uip_appdata[sizeof(struct frame_header)+FRAME_HEADER->n])
00067
00068 struct frame_header * m_frame_hdr;
00069 struct frame rxframe;
00070
00071
00072
00082 void udp_app(){
00083
00084 if( uip_newdata() ){
00085
00086 m_frame_hdr = FRAME_HEADER;
00087
00088
00089 memcpy( &rxframe,m_frame_hdr, sizeof(struct frame_header));
00090
00091 rxframe.data = FRAME_BUFFER;
00092
00093 rxframe.checksum = FRAME_CHKSUM;
00094
00095 TxFrame(&rxframe);
00096
00097
00098
00099 RxFrame(&rxframe);
00100
00101
00102 memcpy( m_frame_hdr, &rxframe, sizeof(struct frame_header));
00103 FRAME_CHKSUM=rxframe.checksum;
00104
00105 uip_udp_send(sizeof(struct frame_header)+m_frame_hdr->n+1 );
00106 }
00107
00108 }
00120 int main(void)
00121 {
00122
00123
00124
00125 USART_Init(BAUD,DATA_SIZE8|PARITY_DISABLE|STOP_BITS1);
00126
00127
00128 TxEol();
00129 TxStr_P(INFO);
00130 TxEol();
00131
00132 rtl8019SetupPorts();
00133
00134
00135 SetBits(CNTRL_PORT, RESET_PIN);
00136 delay(15);
00137 RstBits(CNTRL_PORT, RESET_PIN);
00138
00139 uint16_t i;
00140
00141 #ifdef NE_PROBE
00142 if( !ne_probe() ){
00143 TxStr_P("Error detecting card!");
00144 while(1) ;
00145 }
00146 #endif
00147 #ifdef NE_LOOPBACK
00148 if(!loopback_test()){
00149 TxStr_P("Error on Loopback!");
00150 while(1) ;
00151 }
00152 #endif
00153
00154 TxStr_P("Initiating NE2000:...");
00155 ei_init();
00156 TxStr_P("Ok!");TxEol();
00157
00158 TxStr_P("Testing memory.");TxEol();
00159 nic_mem_test();
00160 TxEol();
00161
00162
00163
00164 uip_init();
00165
00166
00167 uip_arp_init();
00168
00169 uip_udp_listen(HTONS(486));
00170
00171
00172 while(1) {
00173
00174
00175
00176
00177
00178 uip_len = ei_poll();
00179 if(uip_len == 0) {
00180
00181 #ifdef LINUX
00182 usleep(100000);
00183 #else
00184 delay(100);
00185 #endif
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204 } else {
00205 if(BUF->type == htons(UIP_ETHTYPE_IP)) {
00206 uip_arp_ipin();
00207 uip_input();
00208
00209
00210
00211 if(uip_len > 0) {
00212 uip_arp_out();
00213 ei_transmit(uip_buf,uip_len);
00214 }
00215 }else if(BUF->type == htons(UIP_ETHTYPE_ARP)) {
00216 uip_arp_arpin();
00217
00218
00219
00220 if(uip_len > 0) {
00221 ei_transmit(uip_buf,uip_len);
00222 }
00223 }
00224 }
00225 }
00226
00227
00228
00229 }