//网卡初始化函数 static void low_level_init( struct netif *netif ) { /* set MAC hardware address length */ netif->hwaddr_len = 6; /* set MAC hardware address */ /* MAC地址 */ netif->hwaddr[0] = macaddress[0]; netif->hwaddr[1] = macaddress[1]; netif->hwaddr[2] = macaddress[2]; netif->hwaddr[3] = macaddress[3]; netif->hwaddr[4] = macaddress[4]; netif->hwaddr[5] = macaddress[5]; /* maximum transfer unit */ /* 最大传输单元 */ netif->mtu = netifMTU; /* broadcast capability */ netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP; /* Initialise the EMAC. This routine contains code that polls status bits. If the Ethernet cable is not plugged in then this can take a considerable time. To prevent this starving lower priority tasks of processing time we lower our priority prior to the call, then raise it back again once the initialisation is complete. */ enc28j60Init(netif->hwaddr); //初始化enc28j60 //enc28j60PhyWrite(PHLCON, 0x476); //设置PHY enc28j60clkout(1); // change clkout from 6.25MHz to 12.5MHz }
/*---------------------------------------------------------------------------*/ 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; }
/*----------------------------------------------------------*\ | MIAN ENTRY | \*----------------------------------------------------------*/ int main (void) { int rev = 0; stm32_Init (); // STM32 setup // GPIOD->ODR &= ~(1<<9);//GPIOA->BRR = ENC28J60_CS; // GPIOD->ODR |= 1<<9;//GPIOA->BSRR = ENC28J60_CS; printf ("SPI1_Init starting...\r\n"); SPI1_Init(); printf ("enc28j60 init...\r\n"); //enc28j60Init((unsigned char *)enc28j60_MAC); simple_server(); enc28j60Init((unsigned char *)enc28j60_MAC); rev = enc28j60getrev(); return rev; /* for(;;) { unsigned char c; printf ("Press a key. "); c = getchar (); printf ("\r\n"); printf ("You pressed '%c'.\r\n\r\n", c); } */ }
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); }
/** * In this function, the hardware should be initialized. * Called from enc28j60_if_init(). * * @param netif the already initialized lwip network interface structure * for this ethernetif */ static void low_level_init(struct netif *netif) { struct ethernetif *ethernetif = netif->state; /* set MAC hardware address length */ netif->hwaddr_len = ETHARP_HWADDR_LEN; /* set MAC hardware address */ netif->hwaddr[0] = mac_addr[0]; netif->hwaddr[1] = mac_addr[1]; netif->hwaddr[2] = mac_addr[2]; netif->hwaddr[3] = mac_addr[3]; netif->hwaddr[4] = mac_addr[4]; netif->hwaddr[5] = mac_addr[5]; /* maximum transfer unit */ netif->mtu = ETH_MAX_FRAMELEN; /* device capabilities */ /* don't set NETIF_FLAG_ETHARP if this device is not an ethernet one */ netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP | NETIF_FLAG_LINK_UP; /* Do whatever else is needed to initialize interface. */ enc28j60Init(netif->hwaddr,1); }
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 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); }
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 nic_init(uint8_t *eth_addr) { enc28j60Init(eth_addr,ENC28J60_ENABLE_DUPLEX); #ifdef ENC28J60_DEBUG enc28j60RegDump(); #endif }
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 }
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); }
/** * In this function, the hardware should be initialized. * Called from ethernetif_init(). * * @param netif the already initialized lwip network interface structure * for this ethernetif */ static void low_level_init(struct netif *netif) { /* set netif MAC hardware address length */ netif->hwaddr_len = ETHARP_HWADDR_LEN; /* set netif MAC hardware address */ netif->hwaddr[0] = MAC_ADDR0; netif->hwaddr[1] = MAC_ADDR1; netif->hwaddr[2] = MAC_ADDR2; netif->hwaddr[3] = MAC_ADDR3; netif->hwaddr[4] = MAC_ADDR4; netif->hwaddr[5] = MAC_ADDR5; /* set netif maximum transfer unit */ netif->mtu = 1500; /* Accept broadcast address and ARP traffic */ netif->flags = NETIF_FLAG_BROADCAST | NETIF_FLAG_ETHARP; s_pxNetIf =netif; /* create binary semaphore used for informing ethernetif of frame reception */ if (s_xSemaphore == NULL) { s_xSemaphore= xSemaphoreCreateCounting(20,0); } /* initialize MAC address in ethernet MAC */ enc28j60Init(netif->hwaddr, 1); /* create the task that handles the ETH_MAC */ xTaskCreate(ethernetif_input, (signed char*) "Eth_if", netifINTERFACE_TASK_STACK_SIZE, NULL, netifINTERFACE_TASK_PRIORITY,NULL); /* Enable MAC and DMA transmission and reception */ }
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); }
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; }
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); }
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); }
void EtherShield::ES_enc28j60Init(uint8_t* macaddr){ enc28j60Init(macaddr); }
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); }
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); }
/* * 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 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){ 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); }