void EtherShield::ES_enc28j60Init(uint8_t* macaddr){ /*initialize enc28j60*/ enc28j60Init(macaddr); enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz timerPause(10); /* Magjack leds configuration, see enc28j60 datasheet, page 11 */ // LEDA=greed LEDB=yellow // // 0x880 is PHLCON LEDB=on, LEDA=on // enc28j60PhyWrite(PHLCON,0b0000 1000 1000 00 00); enc28j60PhyWrite(PHLCON,0x880); delay(500); // // 0x990 is PHLCON LEDB=off, LEDA=off // enc28j60PhyWrite(PHLCON,0b0000 1001 1001 00 00); enc28j60PhyWrite(PHLCON,0x990); delay(500); // // 0x880 is PHLCON LEDB=on, LEDA=on // enc28j60PhyWrite(PHLCON,0b0000 1000 1000 00 00); enc28j60PhyWrite(PHLCON,0x880); delay(500); // // 0x990 is PHLCON LEDB=off, LEDA=off // enc28j60PhyWrite(PHLCON,0b0000 1001 1001 00 00); enc28j60PhyWrite(PHLCON,0x990); delay(500); // // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10); enc28j60PhyWrite(PHLCON,0x476); delay(100); }
void EtherShield::ES_enc28j60Init( uint8_t* macaddr, uint8_t csPin ) { /*initialize enc28j60*/ enc28j60InitWithCs( macaddr, csPin ); enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz delay(10); // 0x880 is PHLCON LEDB=on, LEDA=on // enc28j60PhyWrite(PHLCON,0b0000 1000 1000 00 00); enc28j60PhyWrite(PHLCON,0x880); delay(500); // // 0x990 is PHLCON LEDB=off, LEDA=off // enc28j60PhyWrite(PHLCON,0b0000 1001 1001 00 00); enc28j60PhyWrite(PHLCON,0x990); delay(500); // // 0x880 is PHLCON LEDB=on, LEDA=on // enc28j60PhyWrite(PHLCON,0b0000 1000 1000 00 00); enc28j60PhyWrite(PHLCON,0x880); delay(500); // // 0x990 is PHLCON LEDB=off, LEDA=off // enc28j60PhyWrite(PHLCON,0b0000 1001 1001 00 00); enc28j60PhyWrite(PHLCON,0x990); delay(500); // // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10); enc28j60PhyWrite(PHLCON,0x476); delay(100); }
static void _eth_spi_configure() { DBG(D_ETH, D_DEBUG, "ethspi spigen init\n"); SPI_DEV_GEN_init( &_enc28j60_spi_dev, SPIDEV_CONFIG_CPHA_1E | SPIDEV_CONFIG_CPOL_LO | SPIDEV_CONFIG_FBIT_MSB | SPIDEV_CONFIG_SPEED_9M, _SPI_BUS(1), SPI_ETH_GPIO_PORT, SPI_ETH_GPIO_PIN); DBG(D_ETH, D_DEBUG, "ethspi spigen open\n"); SPI_DEV_GEN_open(&_enc28j60_spi_dev); DBG(D_ETH, D_DEBUG, "ethspi enc28j60 init\n"); enc28j60Init(mac_address, EIE_PKTIE | EIE_TXIE | EIE_RXERIE | EIE_TXERIE); DBG(D_ETH, D_DEBUG, "ethspi enc28j60 init done, chip rev %02x\n", enc28j60getrev()); DBG(D_ETH, D_DEBUG, "ethspi mac readback: %02x:%02x:%02x:%02x:%02x:%02x\n", enc28j60Read(MAADR5), enc28j60Read(MAADR4), enc28j60Read(MAADR3), enc28j60Read(MAADR2), enc28j60Read(MAADR1), enc28j60Read(MAADR0) ); SYS_hardsleep_ms(20); enc28j60PhyWrite(PHLCON,0x476); SYS_hardsleep_ms(20); // init eth/ip layer init_ip_arp_udp_tcp(mac_address, ip_address, 80); DBG(D_ETH, D_INFO, "ethspi setup finished, ip %i.%i.%i.%i @ mac %02x.%02x.%02x.%02x.%02x.%02x\n", ip_address[0], ip_address[1], ip_address[2], ip_address[3], mac_address[0], mac_address[1], mac_address[2], mac_address[3], mac_address[4], mac_address[5]); }
void EthernetInit() { _delay_loop_1(50); // 12ms /* enable PD4, as input */ DDRD&= ~(1<<DDRD4); /*initialize enc28j60*/ enc28j60Init(mymac); enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz _delay_loop_1(50); // 12ms /* Magjack leds configuration, see enc28j60 datasheet, page 11 */ // LEDB=yellow LEDA=green // // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10); enc28j60PhyWrite(PHLCON,0x476); _delay_loop_1(50); // 12ms /* set output to GND, red LED on */ //PORTB &= ~(1<<PORTB1); //i=1; // //init the ethernet/ip layer: init_ip_arp_udp_tcp(mymac,myip,80); }
int simple_client(eAdrGD* fADRGD,uint8_t* fSostEth,uint8_t* nBlock, uint8_t* fIPAddr,uint8_t* fMACAddr,uint8_t* fPORTNUMBER) { SPI1_Init(); pADRGD=fADRGD; EthSost=fSostEth; EthBlock=nBlock; PORTNUMBER=fPORTNUMBER; MACAddr=fMACAddr; IPAddr=fIPAddr; enc28j60Init(MACAddr); enc28j60PhyWrite(PHLCON,0x476); init_ip_arp_udp_tcp(MACAddr,fIPAddr,*PORTNUMBER); //dat_p=packetloop_arp_icmp_tcp(buf,enc28j60PacketReceive(BUFFER_SIZE, buf)); buf[UDP_DATA_P]='H'; buf[UDP_DATA_P+1]='E'; buf[UDP_DATA_P+2]='L'; buf[UDP_DATA_P+3]='L'; buf[UDP_DATA_P+4]='O'; buf[UDP_DATA_P+5]=' '; buf[UDP_DATA_P+6]='W'; buf[UDP_DATA_P+7]='O'; buf[UDP_DATA_P+8]='R'; buf[UDP_DATA_P+9]='L'; buf[UDP_DATA_P+10]='D'; //Sockets[0].IP_PHASE=0; //make_tcp_ack_from_any(fbuf); // send ack for http get //make_tcp_ack_with_data(fbuf,plen,0); // send data send_udp_prepare(buf,5001,dis_ip,5001,dis_mac); send_udp_transmit(buf,11); }
void UDPSend(void) { int countSensorInPack = 0; if (UDPstartSend == 0) return; int len, nSens; enc28j60PhyWrite(PHLCON,0x476); len = 0; buf[UDP_DATA_P] = UDPzoneOut; len++; for(nSens=0;nSens<cConfSSens;nSens++) { if (GD.Hot.Tepl[UDPzoneOut].InTeplSens[nSens].RCS == 0) { UDPout3 = GD.Hot.Tepl[UDPzoneOut].InTeplSens[nSens].Value; buf[UDP_DATA_P+len] = (uint8_t)GD.Hot.Tepl[UDPzoneOut].InTeplSens[nSens].Value; if (UDPzoneOut == 0) UDPout1 = GD.Hot.Tepl[UDPzoneOut].InTeplSens[0].Value; len++; buf[UDP_DATA_P+len] = GD.Hot.Tepl[UDPzoneOut].InTeplSens[nSens].Value>>8; if (UDPzoneOut == 0) UDPout2 = GD.Hot.Tepl[UDPzoneOut].InTeplSens[0].Value>>8; len++; } else {
/****************************************************************************** * Function: void MACOpen(void) * * PreCondition: none * * Input: none * * Output: None * * Side Effects: none * * Overview: Open ENC28J60 hardware * * Note: None *****************************************************************************/ void MACOpen(void) { // 4. // Set the MAC and PHY into the proper duplex state //enc28j60PhyWrite(PHCON1, PHCON1_PDPXMD); enc28j60PhyWrite(PHCON1, 0x0000); // Disable half duplex loopback in PHY. Bank bits changed to Bank 2 as a // side effect. // no loopback of transmitted frames enc28j60PhyWrite(PHCON2, PHCON2_HDLDIS); // switch to bank 0 enc28j60SetBank(ECON1); }
/*---------------------------------------------------------------------------*/ int main(void) { uint16_t plen; init_serial(); init_mac(mymac); init_udp_or_www_server(mymac,myip); enc28j60Init(mymac); enc28j60PhyWrite(PHLCON,0x476); enc28j60EnableBroadcast(); xprintf(PSTR("Hello World!\r\n")); /* main loop */ while(1) { /* poll hardware ethernet buffer */ plen = enc28j60PacketReceive(BUFFER_SIZE,buf); /* any new message? */ if(plen > 0) { checkBootloaderCondition(buf); } } return 0; }
int main(void){ uint16_t dat_p; // set the clock speed to 8MHz // set the clock prescaler. First write CLKPCE to enable setting of clock the // next four instructions. CLKPR=(1<<CLKPCE); CLKPR=0; // 8 MHZ _delay_loop_1(0); // 60us //initialize the hardware driver for the enc28j60 enc28j60Init(mymac); //enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz _delay_loop_1(0); // 60us enc28j60PhyWrite(PHLCON,0x476); PORTB = 0xff; DDRB = 0xff; uart_init(); sei(); xfunc_out = (void (*)(char))uart_put; xputs(PSTR("AVR-Ethernet test monitor\n")); xprintf(PSTR("ENC28J60 Rev.%d\n"), enc28j60getrev()); //init the ethernet/ip layer: init_ip_arp_udp_tcp(mymac,myip,MYWWWPORT); while(1){ // read packet, handle ping and wait for a tcp packet: dat_p=packetloop_icmp_tcp(buf,enc28j60PacketReceive(BUFFER_SIZE, buf)); /* dat_p will be unequal to zero if there is a valid * http get */ if(dat_p==0){ // no http request continue; } // tcp port 80 begin if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0){ // head, post and other methods: dat_p=http200ok(); dat_p=fill_tcp_data_p(buf,dat_p,PSTR("<h1>200 OK</h1>")); goto SENDTCP; } // just one web page in the "root directory" of the web server if (strncmp("/ ",(char *)&(buf[dat_p+4]),2)==0){ dat_p=print_webpage(buf); goto SENDTCP; }else{ dat_p=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 401 Unauthorized\r\nContent-Type: text/html\r\n\r\n<h1>401 Unauthorized</h1>")); goto SENDTCP; } SENDTCP: www_server_reply(buf,dat_p); // send web page data // tcp port 80 end } return (0); }
void Init_EtherNet(void) { enc28j60Init(mymac) ; delay_ms(20) ; enc28j60PhyWrite(PHLCON,0x476) ; // 配置指示灯 delay_ms(20) ; init_ip_arp_udp(mymac,myip) ; }
void network_init(void) { //Initialise the device enc28j60Init(); //Configure leds enc28j60PhyWrite(PHLCON,0x476); }
void network_init_mac(const uint8_t* macaddr) { //Initialise the device enc28j60Init(macaddr); //Configure leds enc28j60PhyWrite(PHLCON,0x476); }
/** * Initialize ENC28J60 Chip **/ void mb_init(void) { //initialize the hardware driver for the enc28j60 enc28j60Init((uint8_t*)mymac); enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz _delay_us(60); // 60us /* Magjack leds configuration, see enc28j60 datasheet, page 11 */ // LEDB=yellow LEDA=green // // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10); enc28j60PhyWrite(PHLCON,0x476); }
static void network_init(void) { struct uip_eth_addr macaddr; net_event = process_alloc_event(); #if CONFIG_DRIVERS_ENC28J60 // Set our MAC address memcpy_P(&macaddr, &mac, sizeof(mac)); // Set up ethernet enc28j60Init(&macaddr); enc28j60Write(ECOCON, 0 & 0x7); // Disable clock output _delay_ms(10); /* Magjack leds configuration, see enc28j60 datasheet, page 11 */ // LEDA=green LEDB=yellow // // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit enc28j60PhyWrite(PHLCON, 0x476); _delay_ms(100); #endif #if CONFIG_DRIVERS_ENC424J600 // Initialise the hardware enc424j600Init(); // Disable clock output and set up LED stretch uint16_t econ2 = enc424j600ReadReg(ECON2); econ2 |= ECON2_STRCH; // stretch LED duration econ2 &= ~(ECON2_COCON3 | ECON2_COCON2 | ECON2_COCON1 | ECON2_COCON0); enc424j600WriteReg(ECON2, econ2); // Set up LEDs uint16_t eidled = enc424j600ReadReg(EIDLED); eidled &= 0x00ff; // and-out the high byte (LED config) eidled |= EIDLED_LACFG1 | EIDLED_LBCFG2 | EIDLED_LBCFG1; enc424j600WriteReg(EIDLED, eidled); // Get the MAC address enc424j600GetMACAddr(macaddr.addr); #endif #if !CONFIG_LIB_CONTIKI_IPV6 // Set up timers timer_set(&arp_timer, CLOCK_SECOND * 10); #endif uip_setethaddr(macaddr); }
/******************************************************************************* * 函数名: etherdev_init * 参 数: 无 * 返 回: 无 * 功 能: uIP 接口函数,初始化网卡 */ void etherdev_init(void) { u8 i; /*initialize enc28j60*/ enc28j60Init(mymac); //把IP地址和MAC地址写入各自的缓存区 ipaddr[] macaddr[] init_ip_arp_udp_tcp(mymac,myip,mywwwport); for (i = 0; i < 6; i++) { uip_ethaddr.addr[i] = mymac[i]; } //指示灯状态:0x476 is PHLCON LEDA(绿)=links status, LEDB(红)=receive/transmit //enc28j60PhyWrite(PHLCON,0x7a4); //PHLCON:PHY 模块LED 控制寄存器 enc28j60PhyWrite(PHLCON,0x0476); enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz }
/** * @brief task who manage ethernet communication * @param None * @retval None */ void ethernet_task(void *pdata) { #if 1 pdata=pdata; // initialize enc28j60 ES_enc28j60Init(&mymac[0]); /* Magjack leds configuration, see enc28j60 datasheet, page 11 */ // LEDB=yellow LEDA=green // // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10); enc28j60PhyWrite(PHLCON,0x476); init_udp_or_www_server(&mymac[0],&myip[0]); //ES_init_ip_arp_udp_tcp(mymac,myip,80); if( ES_enc28j60Revision() <= 0 ) { // Failed to access ENC28J60 while(1); // Just loop here } // Get IP Address details #if 0 if( allocateIPAddress(buf, BUFFER_SIZE, mymac, 80, myip, mynetmask, gwip, dhcpsvrip, dnsip ) > 0 ) { // Display the results: } else { // Failed to get IP address" while(1); } #endif #endif for(;;) { #if 1 ethernet_process(); #endif } }
int simple_server(eAdrGD* fADRGD,uint8_t* fSostEth,uint8_t* nBlock, uint8_t* fIPAddr,uint8_t* fMACAddr,uint8_t* fPORTNUMBER) { SPI1_Init(); // Del_1ms(100); /*initialize enc28j60*/ pADRGD=fADRGD; EthSost=fSostEth; EthBlock=nBlock; PORTNUMBER=fPORTNUMBER; MACAddr=fMACAddr; IPAddr=fIPAddr; enc28j60Init(MACAddr); init_ip_arp_udp_tcp(MACAddr,IPAddr,*PORTNUMBER); //ָʾµÆ״̬:0x476 is PHLCON LEDA(ÂÌ)=links status, LEDB(ºì)=receive/transmit enc28j60PhyWrite(PHLCON,0x7a4); enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz // Del_1ms(20); Sockets[0].IP_PHASE=0; //init the ethernet/ip layer: // return (0); }
int main(void){ uint16_t dat_p,plen; int8_t cmd; // Set the clock speed to "no pre-scaler" (8MHz with internal osc or // full external speed) // set the clock prescaler. First write CLKPCE to enable setting // of clock the next four instructions. // Note that the CKDIV8 Fuse determines the initial // value of the CKKPS bits. CLKPR=(1<<CLKPCE); // change enable CLKPR=0; // "no pre-scaler" _delay_loop_1(0); // 60us /*initialize enc28j60*/ enc28j60Init(mymac); enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz _delay_loop_1(0); // 60us /* Magjack leds configuration, see enc28j60 datasheet, page 11 */ // LEDB=yellow LEDA=green // // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10); enc28j60PhyWrite(PHLCON,0x476); DDRB|= (1<<DDB1); // LED, enable PB1, LED as output LEDOFF; DDRD&= ~(1<<DDD6); // enable PB6, as input PORTD|= (1<<PIND6); // internal pullup resistor on init_cnt2(); sei(); //init the web server ethernet/ip layer: init_ip_arp_udp_tcp(mymac,myip,MYWWWPORT); // init the web client: client_set_gwip(gwip); // e.g internal IP of dsl router // while(1){ // handle ping and wait for a tcp packet plen=enc28j60PacketReceive(BUFFER_SIZE, buf); dat_p=packetloop_icmp_tcp(buf,plen); if(plen==0){ // we are idle here if (client_waiting_gw() ){ continue; } if (dns_state==0){ sec=0; dns_state=1; dnslkup_request(buf,PSTR(WEBSERVER_VHOST)); continue; } if (dns_state==1 && dnslkup_haveanswer()){ dns_state=2; client_set_wwwip(dnslkup_getip()); } if (dns_state!=2){ // retry every minute if dns-lookup failed: if (sec > 60){ dns_state=0; } // don't try to use web client before // we have a result of dns-lookup continue; } //---------- if (start_web_client==1){ LEDON; start_web_client=2; sec=0; web_client_attempts++; // the identi.ca line is status=Url_encoded_string strcat(statusstr,"status="); // the text to send to identi.ca (append after status=): //urlencode("Meals are ready",&(statusstr[7])); urlencode("I like tuxgraphics eth boards, ",&(statusstr[7])); // append a number: itoa(web_client_attempts,&(statusstr[strlen(statusstr)]),10); // The BLOGGACCOUNT Authorization code can be generated from // username and password of your identi.ca account // by using this encoder: http://tuxgraphics.org/~guido/javascript/base64-javascript.html client_http_post(PSTR("/api/statuses/update.xml"),PSTR(WEBSERVER_VHOST),PSTR(BLOGGACCOUNT),statusstr,&browserresult_callback); } // count how often the switch was triggered at all: if (contact_debounce==0 && bit_is_clear(PIND,PIND6)){ contact_onoff_cnt++; contact_debounce=1; } // we send only a request if we are in the right state (do // not flood with request): if (start_web_client==0 && bit_is_clear(PIND,PIND6)){ resend=1; // resend once if it failed start_web_client=1; } // Reset after a delay of 3 min to prevent email sending. // We reset only if the contact on PD6 was released. if (start_web_client<=3 && sec==180 && !bit_is_clear(PIND,PIND6)){ start_web_client=0; } // Resend the message if it failed: if (start_web_client==2 && sec==7 && resend){ start_web_client=1; resend--; } continue; } if(dat_p==0){ // plen!=0 // check for incomming messages not processed // as part of packetloop_icmp_tcp, e.g udp messages udp_client_check_for_dns_answer(buf,plen); continue; } if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0){ // head, post and other methods: // // for possible status codes see: // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html dat_p=http200ok(); dat_p=fill_tcp_data_p(buf,dat_p,PSTR("<h1>200 OK</h1>")); goto SENDTCP; } cmd=analyse_get_url((char *)&(buf[dat_p+4])); // for possible status codes see: // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html if (cmd==-1){ dat_p=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 401 Unauthorized\r\nContent-Type: text/html\r\n\r\n<h1>401 Unauthorized</h1>")); goto SENDTCP; } if (cmd==1 && start_web_client==4){ // email was off, switch on start_web_client=0; } if (cmd==0 ){ start_web_client=4; // email off } dat_p=http200ok(); dat_p=print_webpage(buf); // SENDTCP: www_server_reply(buf,dat_p); // send data } return (0); }
int main(void){ uint16_t dat_p; int8_t cmd; // Set the clock speed to "no pre-scaler" (8MHz with internal osc or // full external speed) // set the clock prescaler. First write CLKPCE to enable setting // of clock the next four instructions. // Note that the CKDIV8 Fuse determines the initial // value of the CKKPS bits. CLKPR=(1<<CLKPCE); // change enable CLKPR=0; // "no pre-scaler" _delay_loop_1(0); // 60us /*initialize enc28j60*/ enc28j60Init(mymac); enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz _delay_loop_1(0); // 60us /* Magjack leds configuration, see enc28j60 datasheet, page 11 */ // LEDB=yellow LEDA=green // // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10); enc28j60PhyWrite(PHLCON,0x476); DDRB|= (1<<DDB1); // LED, enable PB1, LED as output LEDOFF; DDRD&= ~(1<<DDD6); // enable PB6, as input PORTD|= (1<<PIND6); // internal pullup resistor on init_cnt2(); sei(); //init the web server ethernet/ip layer: init_ip_arp_udp_tcp(mymac,myip,MYWWWPORT); // init the web client: client_set_gwip(gwip); // e.g internal IP of dsl router client_set_wwwip(websrvip); // while(1){ // handle ping and wait for a tcp packet dat_p=packetloop_icmp_tcp(buf,enc28j60PacketReceive(BUFFER_SIZE, buf)); if(dat_p==0){ if (start_web_client==1){ LEDON; start_web_client=2; sec=0; web_client_attempts++; // the text to send in the body of the mail: urlencode("The door is open",urlvarstr); // The string "test+emailnotify" is the subject line // of the email. A plus sign translates into a space character. // The MMaccountID is gus123, edit and replace by your own. client_browse_url(PSTR("/cgi-bin/mm?a=gus123&s=test+emailnotify&d="),urlvarstr,PSTR(WEBSERVER_VHOST),&browserresult_callback); } // count how often the switch was triggered at all: if (contact_debounce==0 && bit_is_clear(PIND,PIND6)){ contact_onoff_cnt++; contact_debounce=1; } // we send only an email if we are in the right state (do // not flood with email): if (start_web_client==0 && bit_is_clear(PIND,PIND6)){ resend=1; // resend once if it failed start_web_client=1; } // Reset after a delay of 3 min to prevent email sending. // We reset only if the contact on PD6 was released. if (start_web_client<=3 && sec==180 && !bit_is_clear(PIND,PIND6)){ start_web_client=0; } // Resend the email if it failed: if (start_web_client==2 && sec==7 && resend){ start_web_client=1; resend--; } continue; } if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0){ // head, post and other methods: // // for possible status codes see: // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html dat_p=http200ok(); dat_p=fill_tcp_data_p(buf,dat_p,PSTR("<h1>200 OK</h1>")); goto SENDTCP; } cmd=analyse_get_url((char *)&(buf[dat_p+4])); // for possible status codes see: // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html if (cmd==-1){ dat_p=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 401 Unauthorized\r\nContent-Type: text/html\r\n\r\n<h1>401 Unauthorized</h1>")); goto SENDTCP; } if (cmd==1 && start_web_client==4){ // email was off, switch on start_web_client=0; } if (cmd==0 ){ start_web_client=4; // email off } dat_p=http200ok(); dat_p=print_webpage(buf); // SENDTCP: www_server_reply(buf,dat_p); // send data } return (0); }
int main(void){ uint16_t plen; uint16_t dat_p; uint8_t i=0; uint8_t payloadlen=0; // set the clock speed to 8MHz // set the clock prescaler. First write CLKPCE to enable setting of clock the // next four instructions. //CLKPR=(1<<CLKPCE); //CLKPR=0; // 8 MHZ _delay_loop_1(50); // 12ms // LED /* enable PB1, LED as output */ DDRB|= (1<<DDB1); /* one blink for indicate of start programm */ cbi(PORTB, PORTB1); // on _delay_ms(100); sbi(PORTB,PORTB1); // off _delay_ms(100); cbi(PORTB,PORTB1); // on /*initialize enc28j60*/ enc28j60Init(mymac); enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz _delay_loop_1(50); // 12ms /* Magjack leds configuration, see enc28j60 datasheet, page 11 */ // LEDB=yellow LEDA=green // // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10); enc28j60PhyWrite(PHLCON,0x476); _delay_loop_1(50); // 12ms /* set output to GND, red LED on */ PORTB &= ~(1<<PORTB1); i=1; //init the ethernet/ip layer: init_ip_arp_udp_tcp(mymac,myip,MYWWWPORT); while(1){ // get the next new packet: plen = enc28j60PacketReceive(BUFFER_SIZE, buf); /*plen will ne unequal to zero if there is a valid * packet (without crc error) */ if(plen==0){ continue; } // arp is broadcast if unknown but a host may also // verify the mac address by sending it to // a unicast address. if(eth_type_is_arp_and_my_ip(buf,plen)){ make_arp_answer_from_request(buf); continue; } // check if ip packets (icmp or udp) are for us: if(eth_type_is_ip_and_my_ip(buf,plen)==0){ continue; } if (i){ /* set output to Vcc, LED off */ PORTB|= (1<<PORTB1); i=0; }else{ /* set output to GND, LED on */ PORTB &= ~(1<<PORTB1); i=1; } if(buf[IP_PROTO_P]==IP_PROTO_ICMP_V && buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V){ // a ping packet, let's send pong make_echo_reply_from_request(buf,plen); continue; } // tcp port www start, compare only the lower byte if (buf[IP_PROTO_P]==IP_PROTO_TCP_V&&buf[TCP_DST_PORT_H_P]==0&&buf[TCP_DST_PORT_L_P]==MYWWWPORT){ if (buf[TCP_FLAGS_P] & TCP_FLAGS_SYN_V){ make_tcp_synack_from_syn(buf); // make_tcp_synack_from_syn does already send the syn,ack continue; } if (buf[TCP_FLAGS_P] & TCP_FLAGS_ACK_V){ init_len_info(buf); // init some data structures // we can possibly have no data, just ack: dat_p=get_tcp_data_pointer(); if (dat_p==0){ if (buf[TCP_FLAGS_P] & TCP_FLAGS_FIN_V){ // finack, answer with ack make_tcp_ack_from_any(buf); } // just an ack with no data, wait for next packet continue; } if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0){ // head, post and other methods: // // for possible status codes see: // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html plen=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>200 OK</h1>")); }else{ // the "get" method plen=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<p>OK, it works</p>")); } make_tcp_ack_from_any(buf); // send ack for http get make_tcp_ack_with_data(buf,plen); // send data continue; } } // udp interface: if (buf[IP_PROTO_P]==IP_PROTO_UDP_V){ payloadlen=buf[UDP_LEN_L_P]-UDP_HEADER_LEN; // the received command has to start with t and be 4 char long // e.g "test\0" if (buf[UDP_DATA_P]=='t' && payloadlen==5){ make_udp_reply_from_request(buf,"hello",6,MYUDPPORT); } } } return (0); }
int simple_server(void) { unsigned int plen; unsigned int dat_p; unsigned char i=0; unsigned char cmd_pos=0; unsigned char cmd; unsigned char payloadlen=0; char str[30]; char cmdval; // Del_1ms(100); /*initialize enc28j60*/ enc28j60Init(mymac); init_ip_arp_udp_tcp(mymac,myip,mywwwport); //ָʾµÆ״̬:0x476 is PHLCON LEDA(ÂÌ)=links status, LEDB(ºì)=receive/transmit enc28j60PhyWrite(PHLCON,0x7a4); enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz // Del_1ms(20); //init the ethernet/ip layer: while(1) { // OSTimeDlyHMSM(0, 0, 0, 50); // get the next new packet: plen = enc28j60PacketReceive(BUFFER_SIZE, buf); //USART_DMASendData(USART1,buf,plen); /*plen will ne unequal to zero if there is a valid packet (without crc error) */ if(plen==0) { continue; } // arp is broadcast if unknown but a host may also // verify the mac address by sending it to // a unicast address. if(eth_type_is_arp_and_my_ip(buf,plen)) { make_arp_answer_from_request(buf); //USART_DMASendText(USART1,"make_arp_answer_from_request\n"); continue; } // check if ip packets are for us: if(eth_type_is_ip_and_my_ip(buf,plen)==0) { continue; } if(buf[IP_PROTO_P]==IP_PROTO_ICMP_V && buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V) { // a ping packet, let's send pong make_echo_reply_from_request(buf, plen); //USART_DMASendText(USART1,"make_echo_reply_from_request\n"); continue; } // tcp port www start, compare only the lower byte if (buf[IP_PROTO_P]==IP_PROTO_TCP_V&&buf[TCP_DST_PORT_H_P]==0&&buf[TCP_DST_PORT_L_P]==mywwwport) { if (buf[TCP_FLAGS_P] & TCP_FLAGS_SYN_V) { make_tcp_synack_from_syn(buf); // make_tcp_synack_from_syn does already send the syn,ack continue; } if (buf[TCP_FLAGS_P] & TCP_FLAGS_ACK_V) { init_len_info(buf); // init some data structures // we can possibly have no data, just ack: dat_p=get_tcp_data_pointer(); if (dat_p==0) { if (buf[TCP_FLAGS_P] & TCP_FLAGS_FIN_V) { // finack, answer with ack make_tcp_ack_from_any(buf); } // just an ack with no data, wait for next packet continue; } if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0) { // head, post and other methods: // // for possible status codes see: // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html plen=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>200 OK</h1>")); goto SENDTCP; } if (strncmp("/ ",(char *)&(buf[dat_p+4]),2)==0) { plen=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n")); plen=fill_tcp_data_p(buf,plen,PSTR("<p>Usage: ")); plen=fill_tcp_data(buf,plen,baseurl); plen=fill_tcp_data_p(buf,plen,PSTR("password</p>")); goto SENDTCP; } cmd=analyse_get_url((char *)&(buf[dat_p+5])); // for possible status codes see: // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html if (cmd==-1) { plen=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 401 Unauthorized\r\nContent-Type: text/html\r\n\r\n<h1>401 Unauthorized</h1>")); goto SENDTCP; } if (cmd==1) { //PORTD|= (1<<PD7);// transistor on //IOCLR |= (1<<26); // LED1ON(); i=1; } if (cmd==0) { //PORTD &= ~(1<<PD7);// transistor off //IOSET |= (1<<26); // LED1OFF(); i=0; } // if (cmd==-2) or any other value // just display the status: plen=print_webpage(buf,(i)); SENDTCP: make_tcp_ack_from_any(buf); // send ack for http get make_tcp_ack_with_data(buf,plen); // send data continue; } } // tcp port www end // // udp start, we listen on udp port 1200=0x4B0 if (buf[IP_PROTO_P]==IP_PROTO_UDP_V&&buf[UDP_DST_PORT_H_P]==4&&buf[UDP_DST_PORT_L_P]==0xb0) { payloadlen=buf[UDP_LEN_L_P]-UDP_HEADER_LEN; // you must sent a string starting with v // e.g udpcom version 10.0.0.24 if (verify_password((char *)&(buf[UDP_DATA_P]))) { // find the first comma which indicates // the start of a command: cmd_pos=0; while(cmd_pos<payloadlen) { cmd_pos++; if (buf[UDP_DATA_P+cmd_pos]==',') { cmd_pos++; // put on start of cmd break; } } // a command is one char and a value. At // least 3 characters long. It has an '=' on // position 2: if (cmd_pos<2 || cmd_pos>payloadlen-3 || buf[UDP_DATA_P+cmd_pos+1]!='=') { strcpy(str,"e=no_cmd"); goto ANSWER; } // supported commands are // t=1 t=0 t=? if (buf[UDP_DATA_P+cmd_pos]=='t') { cmdval=buf[UDP_DATA_P+cmd_pos+2]; if(cmdval=='1') { //PORTD|= (1<<PD7);// transistor on //IOCLR |= (1<<26); //LED1ON(); strcpy(str,"t=1"); goto ANSWER; } else if(cmdval=='0') { //PORTD &= ~(1<<PD7);// transistor off //IOSET |= (1<<26); //LED1OFF(); strcpy(str,"t=0"); goto ANSWER; } else if(cmdval=='?') { /* if (IOPIN & (1<<26)) { strcpy(str,"t=1"); goto ANSWER; } */ strcpy(str,"t=0"); goto ANSWER; } } strcpy(str,"e=no_such_cmd"); goto ANSWER; } strcpy(str,"e=invalid_pw"); ANSWER: make_udp_reply_from_request(buf,str,strlen(str),myudpport); } } // return (0); }
int main(void) { static uint8_t buffer[BufferSize + 1]; int8_t i; uint8_t message[4] = { 0, 0, CID, P2CID }; uint16_t received; snesIO port0 = 0xffff, port1 = 0xffff; // Initialise basic I/O. initLed(); initInput(); initOutput(); // Switched mode: B + Y. port0 = recvInput(); if (port0 == 0xfffc) { switchedMode = Enabled; ledSignal(5); } ledOnRed(); // Initialise network interface. enc28j60Init(mymac); _delay_ms(100); // Magjack leds configuration, see enc28j60 datasheet, page 11 // LEDB=yellow LEDA=green // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10); enc28j60PhyWrite(PHLCON, 0x476); _delay_ms(100); // Get the initial IP via DHCP and configure network. init_mac(mymac); while (i != 1) { received = enc28j60PacketReceive(BufferSize, buffer); buffer[BufferSize] = '\0'; i = packetloop_dhcp_initial_ip_assignment(buffer, received, mymac[5]); } dhcp_get_my_ip(myip, netmask, gwip); client_ifconfig(myip, netmask); // Resolve MAC address from server IP. if (route_via_gw(serverip)) // Must be routed via gateway. get_mac_with_arp(gwip, TransNumGwmac, &arpresolverResultCallback); else // Server is on local network. get_mac_with_arp(serverip, TransNumGwmac, &arpresolverResultCallback); while (get_mac_with_arp_wait()) { received = enc28j60PacketReceive(BufferSize, buffer); // Call packetloop to process ARP reply. packetloop_arp_icmp_tcp(buffer, received); } // Lookup DNS of the server hostname. while (dnslkup_haveanswer() != 1) { uint16_t tmp; received = enc28j60PacketReceive(BufferSize, buffer); tmp = packetloop_arp_icmp_tcp(buffer, received); if (received == 0) { if (!enc28j60linkup()) continue; dnslkup_request(buffer, ServerVHost, gwmac); _delay_ms(100); continue; } if (tmp == 0) udp_client_check_for_dns_answer(buffer, received); } dnslkup_get_ip(serverip); ledOnGreen(); // Connected. while (1) { // Main loop start. received = enc28j60PacketReceive(BufferSize, buffer); // Software reset: L + R + Select + Start. if (port0 == 0xf3f3) reset(); // Do something while no packet in queue. if (received == 0) { port0 = recvInput(); // Prepare message and send it to the server. for (i = 0; i < 8; i++) { // Lo-Byte. char *c = message; *c = port0 & (1 << i) ? *c | (1 << i) : *c & ~(1 << i); } for (i = 0; i < 8; i++) { // Hi-Byte. char *c = message + 1; *c = port0 & (1 << i + 8) ? *c | (1 << i) : *c & ~(1 << i); } send_udp(buffer, message, sizeof(message), 57351, serverip, 57350, gwmac); // Send controller data to SNES. if (switchedMode == Disabled) sendOutput(port0, port1); else sendOutput(port1, port0); continue; } // Answer to ARP requests. if (eth_type_is_arp_and_my_ip(buffer, received)) { make_arp_answer_from_request(buffer, received); continue; } // Check if IP packets (ICMP or UDP) are for us. if (eth_type_is_ip_and_my_ip(buffer, received) == 0) continue; // Answer ping with pong. if ( buffer[IP_PROTO_P] == IP_PROTO_ICMP_V && buffer[ICMP_TYPE_P] == ICMP_TYPE_ECHOREQUEST_V) { make_echo_reply_from_request(buffer, received); continue; } // Listen for UDP packets on port 57351 (0xe007) and process // received data. if ( buffer[IP_PROTO_P] == IP_PROTO_UDP_V && buffer[UDP_DST_PORT_H_P] == 0xe0 && buffer[UDP_DST_PORT_L_P] == 0x07) { for (i = 0; i < 8; i++) { uint16_t *c = &port1; *c = buffer[UDP_DATA_P] & (1 << i) ? *c | (1 << i) : *c & ~(1 << i); } for (i = 0; i < 8; i++) { uint16_t *c = &port1; *c = buffer[UDP_DATA_P + 1] & (1 << i) ? *c | (1 << i + 8) : *c & ~(1 << i + 8); } } } // Main loop end. return (0); }
int main(void){ uint16_t dat_p; // Set the clock speed to "no pre-scaler" (8MHz with internal osc or // full external speed) // set the clock prescaler. First write CLKPCE to enable setting // of clock the next four instructions. // Note that the CKDIV8 Fuse determines the initial // value of the CKKPS bits. #if 0 CLKPR=(1<<CLKPCE); CLKPR=0; // 8 MHZ #endif _delay_loop_1(0); // 60us /*initialize enc28j60*/ enc28j60Init(mymac); enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz _delay_loop_1(0); // 60us // Magjack leds configuration, see enc28j60 datasheet, page 11 // LEDB=yellow LEDA=green // // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10); enc28j60PhyWrite(PHLCON,0x476); //init the ethernet/ip layer: init_udp_or_www_server(mymac,myip); www_server_port(MYWWWPORT); while(1){ // handle ping and wait for a tcp packet: dat_p=packetloop_arp_icmp_tcp(buf,enc28j60PacketReceive(BUFFER_SIZE, buf)); // dat_p will be unequal to zero if there is a valid http get if(dat_p==0){ // do nothing continue; } // tcp port 80 begin if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0){ // head, post and other methods: // // for possible status codes see: // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html dat_p=http200ok(); dat_p=fill_tcp_data_p(buf,dat_p,PSTR("<h1>200 OK</h1>")); goto SENDTCP; } if (strncmp("/ ",(char *)&(buf[dat_p+4]),2)==0){ dat_p=http200ok(); dat_p=fill_tcp_data_p(buf,dat_p,PSTR("<p>OK, works great!</p>\n")); goto SENDTCP; } // all other URLs: dat_p=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 401 Unauthorized\r\nContent-Type: text/html\r\n\r\n<h1>401 Unauthorized</h1>")); SENDTCP: www_server_reply(buf,dat_p); // send web page data } return (0); }
int main(void){ uint16_t plen; uint16_t dat_p; uint8_t cmd; // set the clock speed to "no pre-scaler" (8MHz with internal osc or // full external speed) // set the clock prescaler. First write CLKPCE to enable setting of clock the // next four instructions. CLKPR=(1<<CLKPCE); // change enable CLKPR=0; // "no pre-scaler" uartInit(); uartSetBaudRate(9600); _delay_loop_1(50); // 12ms /* enable PD2/INT0, as input */ DDRD&= ~(1<<DDD2); // test button cbi(DDRD,PIND6); sbi(PORTD,PIND6); // internal pullup resistor on _delay_loop_1(50); // 12ms // read eeprom values unless, the PD6 pin is connected to GND during bootup // PD6 is used to reset to factory default. Note that factory default is // not stored back to eeprom. if (eeprom_read_byte((uint8_t *)0x0) == 19 && ! bit_is_clear(PIND,PIND6)){ // ok magic number matches accept values eeprom_read_block((uint8_t *)myip,(void *)1,sizeof(myip)); eeprom_read_block((uint8_t *)monitoredhost,(void *)6,sizeof(monitoredhost)); pinginterval=eeprom_read_byte((uint8_t *)11); sendping=eeprom_read_byte((uint8_t *)12); eeprom_read_block((char *)password,(void *)13,sizeof(password)); password[7]='\0'; // make sure it is terminated, should not be necessary } /*initialize enc28j60*/ enc28j60Init(mymac); enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz _delay_loop_1(50); // 12ms // LED /* enable PB1, LED as output */ //DDRB|= (1<<DDB1); /* set output to Vcc, LED off */ //LEDOFF; // the transistor on PD7 DDRD|= (1<<DDD7); PORTD &= ~(1<<PIND7);// transistor off /* Magjack leds configuration, see enc28j60 datasheet, page 11 */ // LEDB=yellow LEDA=green // // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10); enc28j60PhyWrite(PHLCON,0x476); _delay_loop_1(50); // 12ms //init the ethernet/ip layer: init_ip_arp_udp_tcp(mymac,myip,MYWWWPORT); timer_init(); _delay_ms(1000); uartFlushReceiveBuffer(); sei(); // interrupt enable while(1){ //uartSendByte('a'); //checkForEthPacket(ethPacket); stop_timer=2; if (checkForEthPacket(ethPacket)) { sendEthPacket(time, sm); time.hr = 99; } stop_timer=0; // wait_data++; // if (wait_data>40) // wait_data=0; //_delay_ms(500); // spontanious messages must not interfer with // web pages if (pagelock==0 && enc28j60hasRxPkt()==0){ if (sendping && havemac==0){ client_arp_whohas(buf,monitoredhost); havemac=2; } if (sendping && havemac==1 && pingnow){ pingnow=0; client_icmp_request(buf,monitoredhost,PINGPATTERN); pingtimer++; // otheweise we would call this function again hoststatus++; if (hoststatus==0xff){ hoststatus=1; // wrap to 1 } } } // get the next new packet: plen = enc28j60PacketReceive(BUFFER_SIZE, buf); /*plen will be unequal to zero if there is a valid * packet (without crc error) */ if(plen==0){ continue; } // arp is broadcast if unknown but a host may also // verify the mac address by sending it to // a unicast address. if(eth_type_is_arp_and_my_ip(buf,plen)){ if (eth_type_is_arp_req(buf)){ make_arp_answer_from_request(buf); } if (eth_type_is_arp_reply(buf)){ if (client_store_gw_mac(buf,monitoredhost)){ havemac=1; } } continue; } // check if ip packets are for us: if(eth_type_is_ip_and_my_ip(buf,plen)==0){ continue; } if(buf[IP_PROTO_P]==IP_PROTO_ICMP_V && buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREPLY_V){ if (buf[ICMP_DATA_P]== PINGPATTERN){ if (check_ip_message_is_from(buf,monitoredhost)){ // ping reply is from monitored host and ping was from us hoststatus=0; hostbackafterreboot=1; } } } if(buf[IP_PROTO_P]==IP_PROTO_ICMP_V && buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V){ if (check_ip_message_is_from(buf,monitoredhost)){ // ping is from monitored host hoststatus=0; hostbackafterreboot=1; } // a ping packet, let's send pong make_echo_reply_from_request(buf,plen); continue; } // tcp port www start, compare only the lower byte if (buf[IP_PROTO_P]==IP_PROTO_TCP_V&&buf[TCP_DST_PORT_H_P]==0&&buf[TCP_DST_PORT_L_P]==MYWWWPORT){ if (buf[TCP_FLAGS_P] & TCP_FLAGS_SYN_V){ make_tcp_synack_from_syn(buf); // make_tcp_synack_from_syn does already send the syn,ack continue; } if (buf[TCP_FLAGS_P] & TCP_FLAGS_ACK_V){ init_len_info(buf); // init some data structures // we can possibly have no data, just ack: dat_p=get_tcp_data_pointer(); if (dat_p==0){ if (buf[TCP_FLAGS_P] & TCP_FLAGS_FIN_V){ // finack, answer with ack make_tcp_ack_from_any(buf); } // just an ack with no data, wait for next packet continue; } if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0){ // head, post and other methods: // // for possible status codes see: // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html plen=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>200 OK</h1>")); goto SENDTCP; } if (strncmp("/ ",(char *)&(buf[dat_p+4]),2)==0){ plen=print_webpage(buf); goto SENDTCP; } cmd=analyse_get_url((char *)&(buf[dat_p+5])); pagelock=1; // stop automatic actions until webpage is displayed // // error, default, will get overwritte in case // something else is selected: plen=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n<h1>Error</h1>")); plen=fill_tcp_data(buf,plen,errmsg); plen=fill_tcp_data_p(buf,plen,PSTR("<br><br><a href=/>->continue</a>\n")); // for possible status codes see: // http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html if (cmd==1){ resethost(); plen=print_webpage_confirm(buf); } if (cmd==2){ store_in_eeprom(); plen=print_webpage_confirm(buf); } if (cmd==7){ store_in_eeprom(); plen=print_webpage_confirm(buf); reinitmac=1; } // start and stop of wd, this is not store in eeprom if (cmd==5){ pingtimer=1; // wd on plen=print_webpage_confirm(buf); } if (cmd==4){ pingtimer=0; // wd off plen=print_webpage_confirm(buf); } if (cmd==3){ plen=print_webpage_now(buf); } if (cmd==6){ plen=print_webpage_config(buf); } // testing the temp OK / NOK if (cmd==20){ sm[0].temp= atoi(strbuf); plen=print_webpage_confirm(buf); } if (cmd==21){ sm[1].temp= atoi(strbuf); plen=print_webpage_confirm(buf); } // on / off - slave-modules // ON slave-module-1 if (cmd==34){ sm[0].status = atoi(strbuf); plen=print_webpage_confirmrm1(buf); } // OFF slave-module-1 if (cmd==31){ sm[0].status = atoi(strbuf); plen=print_webpage_confirmrm1(buf); } // ON slave-module-2 if (cmd==32){ sm[1].status = atoi(strbuf); plen=print_webpage_confirmrm2(buf); } // OFF slave-module-2 if (cmd==33){ sm[1].status = atoi(strbuf); plen=print_webpage_confirmrm2(buf); } if (cmd==35){ plen=print_webpage_confirmclk(buf); } if (cmd==36){ plen=print_webpage_confirmclk(buf); } // Room-1 if (cmd==10){ plen=print_webpage_room1(buf); } // ROom-2 if (cmd==11){ plen=print_webpage_room2(buf); } // Clock & date if (cmd==12){ plen=print_webpage_clk(buf); } // SENDTCP: make_tcp_ack_from_any(buf); // send ack for http get make_tcp_ack_with_data(buf,plen); // send data continue; } } // tcp port www end // // udp not implemented } return (0); }
/* * Main entry point */ int main(void) { //=====init green led LEDInit(); LEDSet(1); //=====setup eth interface uint16_t plen = 0, dat_p = 0; //initialize enc28j60 enc28j60Init(mymac); _delay_ms(100); // Magjack leds configuration, see enc28j60 datasheet, page 11 // LEDB=yellow LEDA=green // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10); enc28j60PhyWrite(PHLCON,0x476); _delay_ms(100); //init the ethernet/ip layer: init_udp_or_www_server(mymac,myip); www_server_port(MYWWWPORT); register_ping_rec_callback(PingCallback); while(1){ // handle ping and wait for a tcp packet: dat_p = packetloop_arp_icmp_tcp(buf, enc28j60PacketReceive(BUFFER_SIZE, buf)); // dat_p will be unequal to zero if there is a valid http get if(dat_p==0){ // do nothing continue; } // tcp port 80 begin if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0){ dat_p = fill_tcp_data_p(buf, 0, PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n")); dat_p = fill_tcp_data_p(buf, dat_p, PSTR("<h1>200 OK</h1>")); goto SENDTCP; } if (strncmp("/ ",(char *) & (buf[ dat_p + 4] ), 2) == 0 ){ nAccessCount++; dat_p = fill_tcp_data_p(buf, 0, PSTR("HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n")); // webcontent char szWebText[130] = {0}; sprintf(szWebText, "<b>ATmega8 Webserver / ENC28J60</b><br><br>Server stats:<br>Acc:%d Png:%d<br><br>(C) Radu Motisan 2012, www.pocketmagic.net<br/>Tomasz Jokiel", nAccessCount, nPingCount); dat_p = fill_tcp_data(buf, dat_p, szWebText); // goto SENDTCP; } // all other URLs: dat_p = fill_tcp_data_p(buf, 0, PSTR("HTTP/1.0 401 Unauthorized\r\nContent-Type: text/html\r\n\r\n<h1>401 Unauthorized</h1>")); SENDTCP: www_server_reply(buf, dat_p); // send web page data } return (0); }
void network_init(void) { enc28j60Init(); enc28j60PhyWrite(PHLCON, 0x476); //setup led }
int main(void) { uint16_t dat_p; ADC_init(); _delay_ms ( 100 ); //DDRB |= (1<<PB0); initTimer(); //initialize the hardware driver for the enc28j60 enc28j60Init(mymac); enc28j60clkout(2); // change clkout from 6.25MHz to 12.5MHz _delay_loop_1(0); // 60us enc28j60PhyWrite(PHLCON,0x476); //init the ethernet/ip layer: init_udp_or_www_server(mymac,myip); www_server_port(MYWWWPORT); while(1) { // read packet, handle ping and wait for a tcp packet: dat_p=packetloop_arp_icmp_tcp(buf,enc28j60PacketReceive(BUFFER_SIZE, buf)); // dat_p will be unequal to zero if there is a valid http get if(dat_p==0) { // no http request continue; } // tcp port 80 begin if (strncmp("GET ",(char *)&(buf[dat_p]),4)!=0) { // head, post and other methods: dat_p=http200ok(); dat_p=fill_tcp_data_p(buf,dat_p,PSTR("<h1>200 OK</h1>")); www_server_reply(buf,dat_p); continue; } // just one web page in the "root directory" of the web server if (strncmp("/ ",(char *)&(buf[dat_p+4]),2)==0) { //dat_p=print_webpage(buf); dat_p=printIndex(buf); www_server_reply(buf,dat_p); } else if (strncmp("/now.htm", (char *)&(buf[dat_p+4]),8) == 0 ) { dat_p = printNowHTML ( buf ); www_server_reply( buf, dat_p ); } else if (strncmp("/min0.htm", (char *)&(buf[dat_p+4]),9) == 0 ) { dat_p = printMinHTML ( buf, 0 ); www_server_reply( buf, dat_p ); } else if (strncmp("/min1.htm", (char *)&(buf[dat_p+4]),9) == 0 ) { dat_p = printMinHTML ( buf, 1 ); www_server_reply( buf, dat_p ); } else if (strncmp("/wlcm.htm", (char *)&(buf[dat_p+4]),9) == 0 ) { dat_p = printWelcomeHTML ( buf ); www_server_reply( buf, dat_p ); } else { dat_p=fill_tcp_data_p(buf,0,PSTR("HTTP/1.0 401 Unauthorized\r\nContent-Type: text/html\r\n\r\n<h1>401 Unauthorized</h1>")); www_server_reply(buf,dat_p); } } return (0); }
void Initialize() { lineNum = 0; pixNum = 0; ///Set PORTA as an input DDRA = 0x00; ///Set External interrupt pins as inputs DDRD = DDRD | (1 << PIND2); DDRC = DDRC | (1 << PINC2) | (1 << PINC3); ///Set Stepper output ports C[4:7], D[4:7] DDRD = DDRD | (0xf << PORTD4); DDRC = DDRC | (0xf << PORTC4); ///Set up i2c communcation i2c_init(); //Setup ethernet communication /* enable PB0, reset as output */ ETHERNET_RESET_PORT_DD |= (1<<ETHERNET_RESET_PIN); /* set output to gnd, reset the ethernet chip */ ETHERNET_RESET_PORT &= ~(1<<ETHERNET_RESET_PIN); _delay_ms(10); /* set output to Vcc, reset inactive */ ETHERNET_RESET_PORT |= (1<<ETHERNET_RESET_PIN); _delay_ms(300); /*initialize enc28j60*/ enc28j60Init(mymac); _delay_ms(20); /* Magjack leds configuration, see enc28j60 datasheet, page 11 */ // LEDB=yellow LEDA=green // // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10); enc28j60PhyWrite(PHLCON,0x476); _delay_ms(20); //init the ethernet/ip layer: init_ip_arp_udp(mymac,myip,mypcip,mypcmac, sendBuffer); _delay_ms(100); //send out a test packet char str[10] = "hello ryan"; send_udp_packet(sendBuffer, str, 10); //Enable Internal pull up resistors DDRC = DDRC & ~(1<< PORTC0); DDRC = DDRC & ~(1<< PORTC1); PORTC = PORTC | (1<< PORTC0); PORTC = PORTC | (1<< PORTC1); cameraOn = 0; }
void EtherShield::ES_enc28j60PhyWrite(uint8_t address, uint16_t data){ enc28j60PhyWrite(address, data); }
int main(void){ uint16_t plen; uint8_t i=0; uint8_t cmd_pos=0; uint8_t payloadlen=0; char str[30]; char cmdval; // set the clock speed to 8MHz // set the clock prescaler. First write CLKPCE to enable setting of clock the // next four instructions. CLKPR=(1<<CLKPCE); CLKPR=0; // 8 MHZ delay_ms(10); /* enable PB0, reset as output */ DDRB|= (1<<DDB0); /* enable PD2/INT0, as input */ DDRD&= ~(1<<DDD2); /* set output to gnd, reset the ethernet chip */ PORTB &= ~(1<<PB0); delay_ms(10); /* set output to Vcc, reset inactive */ PORTB|= (1<<PB0); delay_ms(200); /*initialize enc28j60*/ enc28j60Init(mymac); delay_ms(20); // LED /* enable PB1, LED as output */ DDRB|= (1<<DDB1); /* set output to Vcc, LED off */ PORTB|= (1<<PB1); // the transistor on PD7 DDRD|= (1<<DDD7); PORTD &= ~(1<<PD7);// transistor off /* Magjack leds configuration, see enc28j60 datasheet, page 11 */ // LEDB=yellow LEDA=green // // 0x476 is PHLCON LEDA=links status, LEDB=receive/transmit // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10); enc28j60PhyWrite(PHLCON,0x476); delay_ms(20); /* set output to GND, red LED on */ PORTB &= ~(1<<PB1); i=1; //init the ethernet/ip layer: init_ip_arp_udp(mymac,myip); while(1){ // get the next new packet: plen = enc28j60PacketReceive(BUFFER_SIZE, buf); /*plen will ne unequal to zero if there is a valid * packet (without crc error) */ if(plen==0){ continue; } // led---------- if (i){ /* set output to Vcc, LED off */ PORTB|= (1<<PB1); i=0; }else{ /* set output to GND, LED on */ PORTB &= ~(1<<PB1); i=1; } // arp is broadcast if unknown but a host may also // verify the mac address by sending it to // a unicast address. if(eth_type_is_arp_and_my_ip(buf,plen)){ make_arp_answer_from_request(buf,plen); continue; } // check if ip packets (icmp or udp) are for us: if(eth_type_is_ip_and_my_ip(buf,plen)==0){ continue; } if(buf[IP_PROTO_P]==IP_PROTO_ICMP_V && buf[ICMP_TYPE_P]==ICMP_TYPE_ECHOREQUEST_V){ // a ping packet, let's send pong make_echo_reply_from_request(buf,plen); continue; } // we listen on port 1200=0x4B0 if (buf[IP_PROTO_P]==IP_PROTO_UDP_V&&buf[UDP_DST_PORT_H_P]==4&&buf[UDP_DST_PORT_L_P]==0xb0){ payloadlen=buf[UDP_LEN_L_P]-UDP_HEADER_LEN; // you must sent a string starting with v // e.g udpcom version 10.0.0.24 if (verify_password((char *)&(buf[UDP_DATA_P]))){ // find the first comma which indicates // the start of a command: cmd_pos=0; while(cmd_pos<payloadlen){ cmd_pos++; if (buf[UDP_DATA_P+cmd_pos]==','){ cmd_pos++; // put on start of cmd break; } } // a command is one char and a value. At // least 3 characters long. It has an '=' on // position 2: if (cmd_pos<2 || cmd_pos>payloadlen-3 || buf[UDP_DATA_P+cmd_pos+1]!='='){ strcpy(str,"e=no_cmd"); goto ANSWER; } // supported commands are // t=1 t=0 t=? if (buf[UDP_DATA_P+cmd_pos]=='t'){ cmdval=buf[UDP_DATA_P+cmd_pos+2]; if(cmdval=='1'){ PORTD|= (1<<PD7);// transistor on strcpy(str,"t=1"); goto ANSWER; }else if(cmdval=='0'){ PORTD &= ~(1<<PD7);// transistor off strcpy(str,"t=0"); goto ANSWER; }else if(cmdval=='?'){ if (PORTD & (1<<PD7)){ strcpy(str,"t=1"); goto ANSWER; } strcpy(str,"t=0"); goto ANSWER; } } strcpy(str,"e=no_such_cmd"); goto ANSWER; } strcpy(str,"e=invalid_pw"); ANSWER: make_udp_reply_from_request(buf,str,strlen(str),myport); } } return (0); }