URL
https://opencores.org/ocsvn/turbo8051/turbo8051/trunk
Subversion Repositories turbo8051
Compare Revisions
- This comparison shows the changes necessary to convert path
/
- from Rev 60 to Rev 61
- ↔ Reverse comparison
Rev 60 → Rev 61
/turbo8051/trunk/rtl/gmac/mac/g_rx_fsm.v
621,7 → 621,7
else if(cf2rx_rcv_runt_pkt_en && first_dword) |
begin |
rx_fsm_nxt_st = rx_fsm_chkval_st; |
case(rcv_byte_count[2:0]) //synopsys full_case parallel_case |
case(rcv_byte_count[2:0]) |
3'd1: |
begin |
if(shift_counter == 3'd4) |
/turbo8051/trunk/rtl/gmac/mac/g_cfg_mgmt.v
421,7 → 421,7
|
generic_register #(8,0 ) u_mac_cntrl_reg_3 ( |
.we ({8{sw_wr_en_0 & wr_be[2] }}), |
.data_in (reg_wdata[7:0] ), |
.data_in (reg_wdata[23:16] ), |
.reset_n (app_reset_n ), |
.clk (app_clk ), |
|
/turbo8051/trunk/rtl/gmac/ctrl/eth_parser.v
136,7 → 136,7
reg pkt_drop_ind ; |
|
|
always @(s_reset_n or posedge app_clk) begin |
always @(negedge s_reset_n or posedge app_clk) begin |
if(s_reset_n == 1'b0) begin |
bcnt <= 0; |
pkt_len <= 0; |
173,7 → 173,7
reg ip_da_match ; // ip4 da matches to local IP Address |
reg[15:0] pkt_status ; // Packet Status |
|
always @(s_reset_n or posedge app_clk) begin |
always @(negedge s_reset_n or posedge app_clk) begin |
if(s_reset_n == 1'b0) begin |
mac_da_bc <= 0; |
mac_da_mc <= 0; |
287,6 → 287,10
mac_sa_mc <= 0; |
mac_da_bc <= 0; |
mac_da_mc <= 0; |
tcpf <= 0; |
udpf <= 0; |
arpf <= 0; |
ipv4f <= 0; |
end |
end |
end |
/turbo8051/trunk/rtl/core/core.v
4,6 → 4,7
// synopsys translate_on |
|
|
`include "oc8051_defines.v" |
module turbo8051 ( |
|
reset_n , |
278,6 → 279,9
wire rx_qcnt_inc = (cfg_rx_buf_qbase_addr == wb_xram_adr[15:6]) & wb_xram_stb & wb_xram_wr & wb_xram_ack && (wb_xram_be[3] == 1'b1); |
wire rx_qcnt_dec = (cfg_rx_buf_qbase_addr == wb_xram_adr[15:6]) & wb_xram_stb & !wb_xram_wr & wb_xram_ack && (wb_xram_be[3] == 1'b1); |
|
assign reg_mac_addr[1:0] = 2'b0; |
assign reg_uart_addr[1:0] = 2'b0; |
assign reg_spi_addr[1:0] = 2'b0; |
//------------------------------------------- |
// clock-gen instantiation |
//------------------------------------------- |
650,8 → 654,6
|
|
|
`include "oc8051_defines.v" |
|
oc8051_top u_8051_core ( |
. wb_rst_i (risc_reset ), |
. wb_clk_i (app_clk ), |
/turbo8051/trunk/rtl/8051/oc8051_top.v
818,5 → 818,37
`endif |
|
|
// synopsys translate_on |
// Debug Purpose only |
// Stack Pointer Push & Pop analysis |
reg [7:0] StackMem[$]; |
reg [7:0] stack_pop; |
reg [7:0] pushpop_cnt; |
|
// Assumption, Both Write and Read access will not be |
// possbile in single clock cycle |
always @(posedge wb_clk_i or posedge wb_rst_i) |
begin |
if(wb_rst_i) begin |
pushpop_cnt = 0; |
end |
else begin |
if(ram_wr_sel==`OC8051_RWS_SP) begin |
StackMem.push_back(wr_dat); |
pushpop_cnt = pushpop_cnt + 1; |
end |
if(ram_rd_sel==`OC8051_RRS_SP) begin |
stack_pop = StackMem.pop_back(); |
pushpop_cnt = pushpop_cnt - 1; |
#2 // Add 1ns Delay to take care of Ram Dealy |
if(stack_pop != ram_data) begin |
$display("ERROR: Invalid Stack Pointer Pop Detected, Exp: %x,Rxd:%x",stack_pop,ram_data); |
$stop; |
end |
end |
end |
end |
|
// synopsys translate_off |
|
endmodule |
/turbo8051/trunk/apps/webserver/enc28j60.c
43,10 → 43,10
//}enc28j60_flag; |
static BYTE Enc28j60Bank; |
static WORD_BYTES next_packet_ptr; |
unsigned int iRxFrmCnt = 0; |
unsigned int iTxFrmCnt = 0; |
unsigned int iRxDescPtr= 0; |
unsigned int iTxDescPtr= 0; |
extern unsigned int iRxFrmCnt ; |
extern unsigned int iTxFrmCnt ; |
extern unsigned int iRxDescPtr; |
extern unsigned int iTxDescPtr; |
|
//******************************************************************************************* |
// |
148,58 → 148,45
// Description : Send packet to network. |
// |
//******************************************************************************************* |
void enc28j60_packet_send ( XBYTE *buffer, WORD length ) |
void enc28j60_packet_send ( BYTE **buffer, WORD length ) |
{ |
WORD_BYTES iRxFrmStatus, data_length; |
__xdata __at (0xA030) unsigned int iMacRxFrmCnt; |
XDWORD *pTxDesPtr; |
__xdata unsigned int tDataPtr; // Temp DataPointer |
|
XDWORD iWrData; |
XWORD iTxNextPtr; |
pTxDesPtr = (XDWORD *) (0x7040 | iTxDescPtr); |
//*pTxDesPtr = (length & 0xFFF) ; |
*pTxDesPtr = (XDWORD ) buffer ; |
*pTxDesPtr = (*pTxDesPtr >> 2); // Aligned 32 bit addressing |
*pTxDesPtr = (*pTxDesPtr << 12); // Move to Address Position |
*pTxDesPtr |= (length & 0xFFF); |
iWrData = (XDWORD) *buffer; |
iWrData = iWrData >> 2; // Aligned 32bit Addressing |
iWrData = iWrData << 12; // Move the Address |
iWrData |= (length & 0xFFF); |
*pTxDesPtr = iWrData; |
// *pTxDesPtr |= ((buffer << 12) & 0x3FFF000); |
iTxDescPtr = (iTxDescPtr+4) & 0x3F; |
iTxFrmCnt = iRxFrmCnt+1; |
|
iTxNextPtr = (WORD) *buffer; |
iTxNextPtr = iTxNextPtr+length; // 32 Bit Aligned |
iTxNextPtr &= 0x3FFC; // 4K Aligned, Last 2 bit Zero, 32 Bit Aligned |
*buffer = (BYTE *)iTxNextPtr; |
} |
//******************************************************************************************* |
// |
// Function : enc28j60_mac_is_linked |
// Description : return MAC link status. |
// |
/******************************************************************************************* |
/* |
BYTE enc28j60_mac_is_linked(void) |
|
WORD enc28j60_packet_receive ( BYTE **rxtx_buffer, WORD max_length ) |
{ |
if ( (enc28j60_read_phyreg(PHSTAT1) & PHSTAT1_LLSTAT ) ) |
return 1; |
else |
return 0; |
} |
*/ |
//******************************************************************************************* |
// |
// Function : ethPakcetReceive |
// Description : check received packet and return length of data |
// |
//******************************************************************************************* |
//WORD data_length; |
WORD enc28j60_packet_receive ( BYTE *rxtx_buffer, WORD max_length ) |
{ |
WORD_BYTES iRxFrmStatus, data_length; |
__xdata __at (0xA030) unsigned int iMacRxFrmCnt; |
__xdata unsigned long *pRxDesPtr; |
|
data_length.word = 0; // init |
|
// check if a packet has been received and buffered |
if((iMacRxFrmCnt & 0xF) != 0) { // Check the Rx Q Counter |
pRxDesPtr = (__xdata unsigned long *) (0x7000 | iRxDescPtr); |
data_length.word = *pRxDesPtr & 0xFFF; // Last 12 bit indicate the Length of the Packet |
rxtx_buffer = ((*pRxDesPtr >> 12) & 0x3FFF) << 2 ; // 32 bit Aligned Address |
*rxtx_buffer = (BYTE*) (((*pRxDesPtr >> 12) & 0x3FFF) << 2) ; // 32 bit Aligned Address |
iRxFrmStatus.word= *pRxDesPtr >> 26; // Upper 6 Bit Inidcate the Rx Status |
iRxDescPtr = (iRxDescPtr+4) & 0x3F; |
iRxFrmCnt = iRxFrmCnt+1; |
/turbo8051/trunk/apps/webserver/menu.c
64,6 → 64,31
"ADC0 & Temp" |
}; |
|
extern union flag1 |
{ |
BYTE byte; |
struct |
{ |
unsigned char key_is_executed:1; |
unsigned char update_display:1; |
unsigned char lcd_busy:1; |
unsigned char key_press:1; |
unsigned char send_temp:1; |
unsigned char syn_is_sent:1; |
unsigned char syn_is_received:1; |
unsigned char send_temp_timeout:1; |
}bits; |
}flag1; |
|
extern union flag2 |
{ |
BYTE byte; |
struct |
{ |
unsigned char key_hold:1; |
unsigned char unuse:7; |
}bits; |
}flag2; |
//***************************************************************************************** |
// |
// Function : my_memcpy |
/turbo8051/trunk/apps/webserver/enc28j60.h
282,16 → 282,16
|
// functions |
extern BYTE enc28j60ReadOp(BYTE op, BYTE address); |
extern void enc28j60WriteOp(BYTE op, BYTE address, BYTE data); |
extern void enc28j60WriteOp(BYTE op, BYTE address, BYTE datap); |
extern void enc28j60SetBank(BYTE address); |
extern BYTE enc28j60Read(BYTE address); |
extern void enc28j60Write(BYTE address, BYTE data); |
extern void enc28j60Write(BYTE address, BYTE datap); |
extern WORD enc28j60_read_phyreg(BYTE address); |
extern void enc28j60PhyWrite(BYTE address, WORD data); |
extern void enc28j60PhyWrite(BYTE address, WORD datap); |
extern void enc28j60_init( BYTE *avr_mac); |
extern BYTE enc28j60getrev(void); |
extern void enc28j60_packet_send ( XBYTE *buffer, WORD length ); |
extern void enc28j60_packet_send ( BYTE **buffer, WORD length ); |
extern BYTE enc28j60_mac_is_linked(void); |
extern WORD enc28j60_tx_checksum( WORD offset, WORD len ); |
extern WORD enc28j60_packet_receive ( BYTE *rxtx_buffer, WORD max_length ); |
extern WORD enc28j60_packet_receive ( BYTE **rxtx_buffer, WORD max_length ); |
|
/turbo8051/trunk/apps/webserver/ip.c
50,7 → 50,8
// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |
// |
//******************************************************************************************** |
static WORD ip_identfier=1; |
//static WORD ip_identfier=1; |
WORD ip_identfier; |
//******************************************************************************************** |
// |
// Function : ip_generate_packet |
114,10 → 115,12
{ |
unsigned char i; |
|
cDebugReg = 0x30; // Debug 1 */ |
// if ethernet type is not ip |
if ( rxtx_buffer[ ETH_TYPE_H_P ] != ETH_TYPE_IP_H_V || rxtx_buffer[ ETH_TYPE_L_P ] != ETH_TYPE_IP_L_V) |
return 0; |
|
cDebugReg = 0x31; // Debug 1 */ |
// if ip packet not send to avr |
for ( i=0; i<sizeof(IP_ADDR); i++ ) |
{ |
124,6 → 127,7
if ( rxtx_buffer[ IP_DST_IP_P + i ] != avr_ip.byte[i] ) |
return 0; |
} |
cDebugReg = 0x32; // Debug 1 */ |
|
// destination ip address match with avr ip address |
return 1; |
/turbo8051/trunk/apps/webserver/includes.h
77,3 → 77,8
//******************************************************************************************** |
extern void initial_system( void ); |
|
|
__sfr __at (0x80) cDebugReg; // Debug Reg set to Port-0 |
|
// IP Frame Numbering |
//WORD ip_identfier; |
/turbo8051/trunk/apps/webserver/http.c
25,6 → 25,23
// |
//******************************************************************************************** |
#include "includes.h" |
|
extern union flag1 |
{ |
BYTE byte; |
struct |
{ |
unsigned char key_is_executed:1; |
unsigned char update_display:1; |
unsigned char lcd_busy:1; |
unsigned char key_press:1; |
unsigned char send_temp:1; |
unsigned char syn_is_sent:1; |
unsigned char syn_is_received:1; |
unsigned char send_temp_timeout:1; |
}bits; |
}flag1; |
|
//******************************************************************************************** |
// |
// Global variable for http.c |
40,22 → 57,26
// Description : Initial connection to web server |
// |
//******************************************************************************************** |
void http_webserver_process ( BYTE *rxtx_buffer, BYTE *dest_mac, BYTE *dest_ip ) |
void http_webserver_process ( BYTE *rx_buffer, BYTE **tx_buffer, BYTE *dest_mac, BYTE *dest_ip ) |
{ |
WORD dlength, dest_port; |
BYTE count_time_temp[3]; |
BYTE generic_buf[64]; |
|
dest_port = (rxtx_buffer[TCP_SRC_PORT_H_P]<<8)|rxtx_buffer[TCP_SRC_PORT_L_P]; |
dest_port = (rx_buffer[TCP_SRC_PORT_H_P]<<8)|rx_buffer[TCP_SRC_PORT_L_P]; |
|
cDebugReg = 0x40; |
// tcp port 80 start for web server |
if ( rxtx_buffer [ IP_PROTO_P ] == IP_PROTO_TCP_V && rxtx_buffer[ TCP_DST_PORT_H_P ] == 0 && rxtx_buffer[ TCP_DST_PORT_L_P ] == 80 ) |
if ( rx_buffer [ IP_PROTO_P ] == IP_PROTO_TCP_V && rx_buffer[ TCP_DST_PORT_H_P ] == 0 && rx_buffer[ TCP_DST_PORT_L_P ] == 80 ) |
{ |
cDebugReg = 0x41; |
// received packet with flags "SYN", let's send "SYNACK" |
if ( (rxtx_buffer[ TCP_FLAGS_P ] & TCP_FLAG_SYN_V) ) |
if ( (rx_buffer[ TCP_FLAGS_P ] & TCP_FLAG_SYN_V) ) |
{ |
// tcp_send_synack ( rxtx_buffer, dest_mac, dest_ip ); |
cDebugReg = 0x42; |
// tcp_send_synack ( tx_buffer, dest_mac, dest_ip ); |
tcp_send_packet ( |
rxtx_buffer, |
*tx_buffer, |
dest_port, |
80, // source port |
TCP_FLAG_SYN_V|TCP_FLAG_ACK_V, // flag |
65,22 → 86,27
0, // tcp data length |
dest_mac, // server mac address |
dest_ip ); // server ip address |
cDebugReg = 0x43; |
flag1.bits.syn_is_received = 1; |
return; |
} |
|
if ( (rxtx_buffer [ TCP_FLAGS_P ] & TCP_FLAG_ACK_V) ) |
if ( (rx_buffer [ TCP_FLAGS_P ] & TCP_FLAG_ACK_V) ) |
{ |
cDebugReg = 0x44; |
// get tcp data length |
dlength = tcp_get_dlength( rxtx_buffer ); |
dlength = tcp_get_dlength( rx_buffer ); |
cDebugReg = 0x45; |
if ( dlength == 0 ) |
{ |
cDebugReg = 0x46; |
// finack, answer with ack |
if ( (rxtx_buffer[TCP_FLAGS_P] & TCP_FLAG_FIN_V) ) |
if ( (rx_buffer[TCP_FLAGS_P] & TCP_FLAG_FIN_V) ) |
{ |
// tcp_send_ack ( rxtx_buffer, dest_mac, dest_ip ); |
cDebugReg = 0x47; |
// tcp_send_ack ( tx_buffer, dest_mac, dest_ip ); |
tcp_send_packet ( |
rxtx_buffer, |
*tx_buffer, |
dest_port, |
80, // source port |
TCP_FLAG_ACK_V, // flag |
90,26 → 116,28
0, // tcp data length |
dest_mac, // server mac address |
dest_ip ); // server ip address |
cDebugReg = 0x48; |
} |
return; |
} |
// get avr ip address from request and set to new avr ip address |
// get send temparature to server configuration |
if ( http_get_variable ( rxtx_buffer, dlength, "tc", generic_buf ) ) |
if ( http_get_variable ( rx_buffer, dlength, "tc", generic_buf ) ) |
{ |
cDebugReg = 0x49; |
// enable or disable send temparature |
if ( http_get_variable ( rxtx_buffer, dlength, "en", generic_buf ) ) |
if ( http_get_variable ( rx_buffer, dlength, "en", generic_buf ) ) |
count_time_temp[0] = 1; |
else |
count_time_temp[0] = 0; |
// get hour |
if ( http_get_variable ( rxtx_buffer, dlength, "h", generic_buf ) ) |
if ( http_get_variable ( rx_buffer, dlength, "h", generic_buf ) ) |
{ |
count_time_temp[1] = (generic_buf[0] - '0') * 10; |
count_time_temp[1] = count_time_temp[1] + (generic_buf[1] - '0'); |
} |
// get minute |
if ( http_get_variable ( rxtx_buffer, dlength, "m", generic_buf ) ) |
if ( http_get_variable ( rx_buffer, dlength, "m", generic_buf ) ) |
{ |
count_time_temp[2] = (generic_buf[0] - '0') * 10; |
count_time_temp[2] = count_time_temp[2] + (generic_buf[1] - '0'); |
120,12 → 148,13
count_time[3] = 0; |
} |
|
cDebugReg = 0x4A; |
// print webpage |
dlength = http_home( rxtx_buffer ); |
dlength = http_home( rx_buffer ); |
// send ack before send data |
// tcp_send_ack ( rxtx_buffer, dest_mac, dest_ip ); |
// tcp_send_ack ( tx_buffer, dest_mac, dest_ip ); |
tcp_send_packet ( |
rxtx_buffer, |
*tx_buffer, |
dest_port, |
80, // source port |
TCP_FLAG_ACK_V, // flag |
135,10 → 164,11
0, // tcp data length |
dest_mac, // server mac address |
dest_ip ); // server ip address |
cDebugReg = 0x4B; |
// send tcp data |
// tcp_send_data ( rxtx_buffer, dest_mac, dest_ip, dlength ); |
// tcp_send_data ( tx_buffer, dest_mac, dest_ip, dlength ); |
tcp_send_packet ( |
rxtx_buffer, |
*tx_buffer, |
dest_port, |
80, // source port |
TCP_FLAG_ACK_V | TCP_FLAG_PSH_V | TCP_FLAG_FIN_V, // flag |
148,6 → 178,7
dlength, // tcp data length |
dest_mac, // server mac address |
dest_ip ); // server ip address |
cDebugReg = 0x4C; |
flag1.bits.syn_is_received = 0; |
} |
} |
213,6 → 244,7
// get data position |
data_p = tcp_get_hlength( rxtx_buffer ) + sizeof(ETH_HEADER) + sizeof(IP_HEADER); |
|
cDebugReg = 0x4D; |
// Find '?' in rx buffer, if found '?' in rx buffer then let's find variable key (val_key) |
for ( ; data_p<dlength; data_p++ ) |
{ |
223,6 → 255,8
if ( data_p == dlength ) |
return 0; |
|
cDebugReg = 0x4E; |
|
// find variable key in buffer |
for ( ; data_p<dlength; data_p++ ) |
{ |
251,6 → 285,7
} |
} |
|
cDebugReg = 0x4F; |
// if found variable keyword, then store variable value in destination buffer ( dest ) |
if ( match != 0 ) |
{ |
/turbo8051/trunk/apps/webserver/arp.c
129,9 → 129,12
rxtx_buffer[ ARP_OPCODE_H_P ] = ARP_OPCODE_REQUEST_H_V; |
rxtx_buffer[ ARP_OPCODE_L_P ] = ARP_OPCODE_REQUEST_L_V; |
arp_generate_packet ( rxtx_buffer, (BYTE*)&dest_mac, dest_ip ); |
|
cDebugReg = 0x10; // Debug 1 |
|
// send arp packet to network |
enc28j60_packet_send ( rxtx_buffer, sizeof(ETH_HEADER) + sizeof(ARP_PACKET) ); |
enc28j60_packet_send ( &rxtx_buffer, sizeof(ETH_HEADER) + sizeof(ARP_PACKET) ); |
cDebugReg = 0x11; // Debug 1 |
} |
//******************************************************************************************* |
// |
146,10 → 149,14
// if packet type is not arp packet exit from function |
if( rxtx_buffer[ ETH_TYPE_H_P ] != ETH_TYPE_ARP_H_V || rxtx_buffer[ ETH_TYPE_L_P ] != ETH_TYPE_ARP_L_V) |
return 0; |
|
cDebugReg = 0x12; // Debug 1 |
// check arp request opcode |
if ( rxtx_buffer[ ARP_OPCODE_H_P ] != ((opcode >> 8) & 0xFF) || |
rxtx_buffer[ ARP_OPCODE_L_P ] != (opcode & 0xFF) ) |
return 0; |
|
cDebugReg = 0x13; // Debug 1 |
// if destination ip address in arp packet not match with avr ip address |
for ( i=0; i<sizeof(IP_ADDR); i++ ) |
{ |
156,6 → 163,7
if ( rxtx_buffer[ ARP_DST_IP_P + i] != avr_ip.byte[i] ) |
return 0; |
} |
cDebugReg = 0x14; // Debug 1 |
return 1; |
} |
//******************************************************************************************* |
164,18 → 172,21
// Description : Send reply if recieved packet is ARP and IP address is match with avr_ip |
// |
//******************************************************************************************* |
void arp_send_reply ( BYTE *rxtx_buffer, BYTE *dest_mac ) |
void arp_send_reply ( BYTE *rx_buffer, BYTE **tx_buffer, BYTE *dest_mac ) |
{ |
// generate ethernet header |
eth_generate_header ( rxtx_buffer, ETH_TYPE_ARP_V, dest_mac ); |
eth_generate_header ( *tx_buffer, ETH_TYPE_ARP_V, dest_mac ); |
|
cDebugReg = 0x15; // Debug 1 |
// change packet type to echo reply |
rxtx_buffer[ ARP_OPCODE_H_P ] = ARP_OPCODE_REPLY_H_V; |
rxtx_buffer[ ARP_OPCODE_L_P ] = ARP_OPCODE_REPLY_L_V; |
arp_generate_packet ( rxtx_buffer, dest_mac, &rxtx_buffer[ ARP_SRC_IP_P ] ); |
*tx_buffer[ARP_OPCODE_H_P] = ARP_OPCODE_REPLY_H_V; |
*tx_buffer[ARP_OPCODE_L_P] = ARP_OPCODE_REPLY_L_V; |
cDebugReg = 0x16; // Debug 1 |
arp_generate_packet ( *tx_buffer, dest_mac, rx_buffer[ ARP_SRC_IP_P ] ); |
|
cDebugReg = 0x17; // Debug 1 |
// send arp packet |
enc28j60_packet_send ( rxtx_buffer, sizeof(ETH_HEADER) + sizeof(ARP_PACKET) ); |
enc28j60_packet_send ( &(*tx_buffer), sizeof(ETH_HEADER) + sizeof(ARP_PACKET) ); |
} |
//******************************************************************************************* |
// |
191,12 → 202,13
|
// send arp request packet to network |
arp_send_request ( rxtx_buffer, dest_ip ); |
cDebugReg = 0x18; // Debug 1 |
|
for ( i=0; i<10; i++ ) |
{ |
// Time out 10x10ms = 100ms |
_delay_ms ( 10 ); |
dlength = enc28j60_packet_receive( rxtx_buffer, MAX_RXTX_BUFFER ); |
dlength = enc28j60_packet_receive( &rxtx_buffer, MAX_RXTX_BUFFER ); |
|
// destination ip address was found on network |
if ( dlength ) |
209,6 → 221,7
} |
} |
} |
cDebugReg = 0x19; // Debug 1 |
|
// destination ip was not found on network |
return 0; |
/turbo8051/trunk/apps/webserver/main.c
42,7 → 42,34
MAC_ADDR server_mac; |
IP_ADDR server_ip; |
|
extern WORD ip_identfier; |
|
union flag1 |
{ |
BYTE byte; |
struct |
{ |
unsigned char key_is_executed:1; |
unsigned char update_display:1; |
unsigned char lcd_busy:1; |
unsigned char key_press:1; |
unsigned char send_temp:1; |
unsigned char syn_is_sent:1; |
unsigned char syn_is_received:1; |
unsigned char send_temp_timeout:1; |
}bits; |
}flag1; |
|
union flag2 |
{ |
BYTE byte; |
struct |
{ |
unsigned char key_hold:1; |
unsigned char unuse:7; |
}bits; |
}flag2; |
|
//BYTE generic_buf[128]; |
|
// Change your avr and server ip address here |
50,8 → 77,24
BYTE ee_avr_ip[4] = { 10, 1, 1, 1 }; |
BYTE ee_server_ip[4] = { 10, 1, 1, 76 }; |
|
unsigned int iRxFrmCnt = 0; |
unsigned int iTxFrmCnt = 0; |
unsigned int iRxDescPtr= 0; |
unsigned int iTxDescPtr= 0; |
|
|
|
void _delay_ms( int iDelay ); |
//-------------------------- |
// Data Memory MAP |
//------------------------- |
// 0x0000 to 0x0FFF - 4K - Processor Data Memory |
// 0x1000 to 0x1FFF - 4K - Gmac Rx Data Memory |
// 0x2000 to 0x2FFF - 4K - Reserved for Rx |
// 0x3000 to 0x3FFF - 4K - Gmac Tx Data Memory |
// 0x4000 to 0x4FFF - 4K - Reserved for Tx |
// 0x7000 to 0x703F - 64 - Rx Descriptor |
// 0x7040 to 0x707F - 64 - Tx Descripto |
//***************************************************************************************** |
// |
// Function : server_process |
58,56 → 101,75
// Description : Run web server and listen on port 80 |
// |
//***************************************************************************************** |
void server_process ( void ) |
void server_process ( BYTE **tx_buffer ) |
{ |
MAC_ADDR client_mac; |
IP_ADDR client_ip; |
// you can change rx,tx buffer size in includes.h |
BYTE *rxtx_buffer; |
BYTE *rx_buffer; |
WORD plen; |
|
if ( flag1.bits.syn_is_sent ) |
return; |
|
cDebugReg = 0x1; // Debug 1 |
//if ( flag1.bits.syn_is_sent ) |
// return; |
// get new packet |
plen = enc28j60_packet_receive( (BYTE*)&rxtx_buffer, MAX_RXTX_BUFFER ); |
plen = enc28j60_packet_receive( &rx_buffer, MAX_RXTX_BUFFER); |
|
cDebugReg = 0x2; // Debug 1 |
|
//plen will ne unequal to zero if there is a valid packet (without crc error) |
if(plen==0) |
return; |
|
cDebugReg = 0x3; // Debug 1 |
|
// copy client mac address from buffer to client mac variable |
memcpy ( (BYTE*)&client_mac, &rxtx_buffer[ ETH_SRC_MAC_P ], sizeof(MAC_ADDR) ); |
memcpy ( (BYTE*)client_mac, &rx_buffer[ ETH_SRC_MAC_P ], sizeof(MAC_ADDR) ); |
|
cDebugReg = 0x4; // Debug 1 |
|
// check arp packet if match with avr ip let's send reply |
if ( arp_packet_is_arp( rxtx_buffer, ARP_OPCODE_REQUEST_V ) ) |
if ( arp_packet_is_arp( rx_buffer, ARP_OPCODE_REQUEST_V ) ) |
{ |
arp_send_reply ( (BYTE*)&rxtx_buffer, (BYTE*)&client_mac ); |
cDebugReg = 0x5; // Debug 1 |
arp_send_reply ( rx_buffer, &(*tx_buffer), (BYTE*)&client_mac ); |
cDebugReg = 0x6; // Debug 1 |
return; |
} |
|
cDebugReg = 0x7; // Debug 1 |
// get client ip address |
memcpy ( (BYTE*)&client_ip, &rxtx_buffer[ IP_SRC_IP_P ], sizeof(IP_ADDR) ); |
memcpy ( (BYTE*)&client_ip, &rx_buffer[ IP_SRC_IP_P ], sizeof(IP_ADDR) ); |
cDebugReg = 0x8; // Debug 1 |
// check ip packet send to avr or not? |
if ( ip_packet_is_ip ( (BYTE*)&rxtx_buffer ) == 0 ) |
if ( ip_packet_is_ip ( rx_buffer ) == 0 ) |
{ |
cDebugReg = 0x9; // Debug 1 |
return; |
} |
|
// check ICMP packet, if packet is icmp packet let's send icmp echo reply |
if ( icmp_send_reply ( (BYTE*)&rxtx_buffer, (BYTE*)&client_mac, (BYTE*)&client_ip ) ) |
cDebugReg = 0xA; // Debug 1 */ |
if ( icmp_send_reply ( rx_buffer, &(*tx_buffer), (BYTE*)&client_mac, (BYTE*)&client_ip ) ) |
{ |
cDebugReg = 0xB; // Debug 1 |
return; |
} |
|
cDebugReg = 0xC; // Debug 1 |
// check UDP packet |
if (udp_receive ( (BYTE *)&rxtx_buffer, (BYTE *)&client_mac, (BYTE *)&client_ip )) |
if (udp_receive ( rx_buffer, (BYTE *)&client_mac, (BYTE *)&client_ip )) |
{ |
cDebugReg = 0xD; // Debug 1 |
return; |
} |
|
cDebugReg = 0xE; // Debug 1 |
// tcp start here |
// start web server at port 80, see http.c |
http_webserver_process ( (BYTE*)rxtx_buffer, (BYTE*)&client_mac, (BYTE*)&client_ip ); |
http_webserver_process ( rx_buffer, &(*tx_buffer),(BYTE*)&client_mac, (BYTE*)&client_ip ); |
cDebugReg = 0xF; // Debug 1 |
} |
//***************************************************************************************** |
// |
129,6 → 191,8
//***************************************************************************************** |
int main (void) |
{ |
BYTE i; |
BYTE *tx_buffer; |
// change your mac address here |
avr_mac.byte[0] = 'A'; |
avr_mac.byte[1] = 'V'; |
136,9 → 200,25
avr_mac.byte[3] = 'P'; |
avr_mac.byte[4] = 'O'; |
avr_mac.byte[5] = 'R'; |
|
// change your IP address here |
avr_ip.byte[0] = 10; |
avr_ip.byte[1] = 1; |
avr_ip.byte[2] = 1; |
avr_ip.byte[3] = 1; |
|
// read avr and server ip from eeprom |
iRxFrmCnt = 0; |
iTxFrmCnt = 0; |
iRxDescPtr= 0; |
iTxDescPtr= 0; |
|
ip_identfier=1; |
|
// Initialise Transmit Data Pointer |
tx_buffer = 0x3000; // GMAC Tx Data Memory, 4K Size |
//eeprom_read_block ( &avr_ip, ee_avr_ip, 4 ); |
|
|
//eeprom_read_block ( &server_ip, ee_server_ip, 4 ); |
|
// setup port as input and enable pull-up |
155,8 → 235,8
//TCCR1B = 0x01; // clk/1 no prescaling |
|
// initial lcd, and menu |
lcd_init (); |
menu_init (); |
//lcd_init (); |
//menu_init (); |
|
// set LED1, LED2 as output */ |
//LED_DDR |= _BV( LED_PIN1_DDR ) | _BV( LED_PIN2_DDR ); |
176,10 → 256,10
|
// general time base, generate by timer1 |
// overflow every 1/250 seconds |
time_base (); |
//time_base (); |
|
// server process response for arp, icmp, http |
server_process (); |
server_process (&tx_buffer); |
|
// send temparature to web server unsing http protocol |
// disable by default. |
/turbo8051/trunk/apps/webserver/http.h
34,5 → 34,5
extern BYTE http_get_variable ( BYTE *rxtx_buffer, WORD dlength, BYTE *val_key, BYTE *dest ); |
extern BYTE http_get_ip ( BYTE *buf, BYTE *dest ); |
extern void urldecode( BYTE *urlbuf); |
extern void http_webserver_process ( BYTE *rxtx_buffer, BYTE *dest_mac, BYTE *dest_ip ); |
extern void http_webserver_process ( BYTE *rx_buffer, BYTE **tx_buffer, BYTE *dest_mac, BYTE *dest_ip ); |
extern WORD http_put_request ( BYTE *rxtx_buffer ); |
/turbo8051/trunk/apps/webserver/tcp.c
67,6 → 67,7
{ |
int dlength, hlength; |
|
cDebugReg = 0x50; |
dlength = ( rxtx_buffer[ IP_TOTLEN_H_P ] <<8 ) | ( rxtx_buffer[ IP_TOTLEN_L_P ] ); |
dlength -= sizeof(IP_HEADER); |
hlength = (rxtx_buffer[ TCP_HEADER_LEN_P ]>>4) * 4; // generate len in bytes; |
74,6 → 75,7
if ( dlength <= 0 ) |
dlength=0; |
|
cDebugReg = 0x51; |
return ((WORD)dlength); |
} |
//***************************************************************************************** |
84,6 → 86,7
//***************************************************************************************** |
BYTE tcp_get_hlength ( BYTE *rxtx_buffer ) |
{ |
cDebugReg = 0x52; |
return ((rxtx_buffer[ TCP_HEADER_LEN_P ]>>4) * 4); // generate len in bytes; |
} |
//******************************************************************************************** |
96,6 → 99,7
{ |
BYTE ch; |
|
cDebugReg = 0x53; |
while(ch = *datap++) |
{ |
rxtx_buffer[ TCP_DATA_P + offset ] = ch; |
112,6 → 116,7
//******************************************************************************************** |
WORD tcp_puts_data ( BYTE *rxtx_buffer, BYTE *datap, WORD offset ) |
{ |
cDebugReg = 0x54; |
while( *datap ) |
{ |
rxtx_buffer[ TCP_DATA_P + offset ] = *datap++; |
141,8 → 146,10
BYTE i, tseq; |
WORD ck; |
|
cDebugReg = 0x55; |
// generate ethernet header |
eth_generate_header ( rxtx_buffer, ETH_TYPE_IP_V, dest_mac ); |
cDebugReg = 0x56; |
|
// sequence numbers: |
// add the rel ack num to SEQACK |
161,6 → 168,7
} |
} |
|
cDebugReg = 0x57; |
// initial tcp sequence number |
// setup maximum segment size |
// require to setup first packet is receive or transmit only |
187,9 → 195,11
// no options: 20 bytes: 5*32/8 = 20 |
rxtx_buffer[ TCP_HEADER_LEN_P ] = 0x50; |
} |
cDebugReg = 0x58; |
|
// generate ip header and checksum |
ip_generate_header ( rxtx_buffer, (sizeof(IP_HEADER) + sizeof(TCP_HEADER) + dlength), IP_PROTO_TCP_V, dest_ip ); |
cDebugReg = 0x59; |
|
// clear sequence ack number before send tcp SYN packet |
if ( clear_seqack ) |
200,6 → 210,7
rxtx_buffer[ TCP_SEQACK_P + 3 ] = 0; |
} |
|
cDebugReg = 0x5A; |
// setup tcp flags |
rxtx_buffer [ TCP_FLAGS_P ] = flags; |
|
222,6 → 233,7
// clear old checksum and calculate new checksum |
rxtx_buffer[ TCP_CHECKSUM_H_P ] = 0; |
rxtx_buffer[ TCP_CHECKSUM_L_P ] = 0; |
cDebugReg = 0x5B; |
// This is computed as the 16-bit one's complement of the one's complement |
// sum of a pseudo header of information from the |
// IP header, the TCP header, and the data, padded |
237,10 → 249,13
// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |
// + 0 + IP Protocol + Total length + |
// +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |
ck = software_checksum( &rxtx_buffer[IP_SRC_IP_P], sizeof(TCP_HEADER)+dlength+8, IP_PROTO_TCP_V + sizeof(TCP_HEADER) + dlength ); |
ck = software_checksum( rxtx_buffer[IP_SRC_IP_P], sizeof(TCP_HEADER)+dlength+8, IP_PROTO_TCP_V + sizeof(TCP_HEADER) + dlength ); |
rxtx_buffer[ TCP_CHECKSUM_H_P ] = (ck >> 8) & 0xFF; |
rxtx_buffer[ TCP_CHECKSUM_L_P ] = ck & 0xFF; |
|
cDebugReg = 0x5C; |
|
// send packet to ethernet media |
enc28j60_packet_send ( rxtx_buffer, sizeof(ETH_HEADER)+sizeof(IP_HEADER)+sizeof(TCP_HEADER)+dlength ); |
enc28j60_packet_send ( &rxtx_buffer, sizeof(ETH_HEADER)+sizeof(IP_HEADER)+sizeof(TCP_HEADER)+dlength ); |
cDebugReg = 0x5D; |
} |
/turbo8051/trunk/apps/webserver/arp.h
29,7 → 29,7
#define ARP_OPCODE_REQUEST_V 0x0001 |
#define ARP_OPCODE_REQUEST_H_V 0x00 |
#define ARP_OPCODE_REQUEST_L_V 0x01 |
#define ARP_OPCODE_REPLY_V 0x0002 |
#define ARP_OPCODE_REPLY_V 0x0002 |
#define ARP_OPCODE_REPLY_H_V 0x00 |
#define ARP_OPCODE_REPLY_L_V 0x02 |
|
60,6 → 60,6
//******************************************************************************************** |
extern void arp_generate_packet ( BYTE *rxtx_buffer, BYTE *dest_mac, BYTE *dest_ip ); |
extern void arp_send_request ( BYTE *rxtx_buffer, BYTE *dest_ip ); |
extern void arp_send_reply ( BYTE *rxtx_buffer, BYTE *dest_mac ); |
extern void arp_send_reply ( BYTE *rx_buffer, BYTE **tx_buffer, BYTE *dest_mac ); |
extern BYTE arp_packet_is_arp ( BYTE *rxtx_buffer, WORD opcode ); |
extern BYTE arp_who_is ( BYTE *rxtx_buffer, BYTE *dest_mac, BYTE *dest_ip ); |
/turbo8051/trunk/apps/webserver/icmp.c
60,29 → 60,32
// Description : Send ARP reply packet from ARP request packet |
// |
//******************************************************************************************* |
void icmp_generate_packet ( BYTE *rxtx_buffer ) |
void icmp_generate_packet ( BYTE *rx_buffer, BYTE *tx_buffer ) |
{ |
BYTE i; |
WORD ck; |
|
// In send ICMP request case, generate new ICMP data. |
if ( rxtx_buffer[ ICMP_TYPE_P ] == ICMP_TYPE_ECHOREQUEST_V ) |
if ( rx_buffer[ ICMP_TYPE_P ] == ICMP_TYPE_ECHOREQUEST_V ) |
{ |
cDebugReg = 0x20; // Debug 1 */ |
for ( i=0; i<ICMP_MAX_DATA; i++ ) |
{ |
rxtx_buffer[ ICMP_DATA_P + i ] = 'A' + i; |
tx_buffer[ ICMP_DATA_P + i ] = 'A' + i; |
} |
} |
cDebugReg = 0x21; // Debug 1 */ |
// clear icmp checksum |
rxtx_buffer[ ICMP_CHECKSUM_H_P ] = 0; |
rxtx_buffer[ ICMP_CHECKSUM_L_P ] = 0; |
tx_buffer[ ICMP_CHECKSUM_H_P ] = 0; |
tx_buffer[ ICMP_CHECKSUM_L_P ] = 0; |
|
// calculate new checksum. |
// ICMP checksum calculation begin at ICMP type to ICMP data. |
// Before calculate new checksum the checksum field must be zero. |
ck = software_checksum ( &rxtx_buffer[ ICMP_TYPE_P ], sizeof(ICMP_PACKET), 0 ); |
rxtx_buffer[ ICMP_CHECKSUM_H_P ] = (ck >> 8 ) & 0xFF; |
rxtx_buffer[ ICMP_CHECKSUM_L_P ] = ck & 0xFF; |
ck = software_checksum ( tx_buffer[ ICMP_TYPE_P ], sizeof(ICMP_PACKET), 0 ); |
cDebugReg = 0x22; // Debug 1 */ |
tx_buffer[ ICMP_CHECKSUM_H_P ] = (ck >> 8 ) & 0xFF; |
tx_buffer[ ICMP_CHECKSUM_L_P ] = ck & 0xFF; |
} |
//******************************************************************************************* |
// |
90,27 → 93,27
// Description : Send ARP request packet to destination. |
// |
//******************************************************************************************* |
void icmp_send_request ( BYTE *rxtx_buffer, BYTE *dest_mac, BYTE *dest_ip ) |
void icmp_send_request ( BYTE *rx_buffer, BYTE **tx_buffer, BYTE *dest_mac, BYTE *dest_ip ) |
{ |
// set ethernet header |
eth_generate_header ( rxtx_buffer, ETH_TYPE_IP_V, dest_mac ); |
eth_generate_header ( *tx_buffer, ETH_TYPE_IP_V, dest_mac ); |
|
// generate ip header and checksum |
ip_generate_header ( rxtx_buffer, sizeof(IP_HEADER) + sizeof(ICMP_PACKET), IP_PROTO_ICMP_V, dest_ip ); |
ip_generate_header ( *tx_buffer, sizeof(IP_HEADER) + sizeof(ICMP_PACKET), IP_PROTO_ICMP_V, dest_ip ); |
|
// generate icmp packet and checksum |
rxtx_buffer[ ICMP_TYPE_P ] = ICMP_TYPE_ECHOREQUEST_V; |
rxtx_buffer[ ICMP_CODE_P ] = 0; |
rxtx_buffer[ ICMP_IDENTIFIER_H_P ] = icmp_id; |
rxtx_buffer[ ICMP_IDENTIFIER_L_P ] = 0; |
rxtx_buffer[ ICMP_SEQUENCE_H_P ] = icmp_seq; |
rxtx_buffer[ ICMP_SEQUENCE_L_P ] = 0; |
*tx_buffer[ ICMP_TYPE_P ] = ICMP_TYPE_ECHOREQUEST_V; |
*tx_buffer[ ICMP_CODE_P ] = 0; |
*tx_buffer[ ICMP_IDENTIFIER_H_P ] = icmp_id; |
*tx_buffer[ ICMP_IDENTIFIER_L_P ] = 0; |
*tx_buffer[ ICMP_SEQUENCE_H_P ] = icmp_seq; |
*tx_buffer[ ICMP_SEQUENCE_L_P ] = 0; |
icmp_id++; |
icmp_seq++; |
icmp_generate_packet ( rxtx_buffer ); |
icmp_generate_packet ( rx_buffer, *tx_buffer ); |
|
// send packet to ethernet media |
enc28j60_packet_send ( rxtx_buffer, sizeof(ETH_HEADER) + sizeof(IP_HEADER) + sizeof(ICMP_PACKET) ); |
enc28j60_packet_send ( &(*tx_buffer), sizeof(ETH_HEADER) + sizeof(IP_HEADER) + sizeof(ICMP_PACKET) ); |
} |
//******************************************************************************************* |
// |
118,29 → 121,36
// Description : Send ARP reply packet to destination. |
// |
//******************************************************************************************* |
BYTE icmp_send_reply ( BYTE *rxtx_buffer, BYTE *dest_mac, BYTE *dest_ip ) |
BYTE icmp_send_reply ( BYTE *rx_buffer, BYTE **tx_buffer, BYTE *dest_mac, BYTE *dest_ip ) |
{ |
|
// check protocol is icmp or not? |
if ( rxtx_buffer [ IP_PROTO_P ] != IP_PROTO_ICMP_V ) |
if ( rx_buffer [ IP_PROTO_P ] != IP_PROTO_ICMP_V ) |
return 0; |
|
cDebugReg = 0x23; // Debug 1 */ |
// check icmp packet type is echo request or not? |
if ( rxtx_buffer [ ICMP_TYPE_P ] != ICMP_TYPE_ECHOREQUEST_V ) |
if ( rx_buffer [ ICMP_TYPE_P ] != ICMP_TYPE_ECHOREQUEST_V ) |
return 0; |
cDebugReg = 0x24; // Debug 1 */ |
|
// set ethernet header |
eth_generate_header ( rxtx_buffer, ETH_TYPE_IP_V, dest_mac ); |
eth_generate_header ( *tx_buffer, ETH_TYPE_IP_V, dest_mac ); |
|
cDebugReg = 0x25; // Debug 1 */ |
|
// generate ip header and checksum |
ip_generate_header ( rxtx_buffer, (rxtx_buffer[IP_TOTLEN_H_P]<<8)|rxtx_buffer[IP_TOTLEN_L_P], IP_PROTO_ICMP_V, dest_ip ); |
ip_generate_header ( *tx_buffer, (rx_buffer[IP_TOTLEN_H_P]<<8)|rx_buffer[IP_TOTLEN_L_P], IP_PROTO_ICMP_V, dest_ip ); |
|
cDebugReg = 0x26; // Debug 1 */ |
// generate icmp packet |
rxtx_buffer[ ICMP_TYPE_P ] = ICMP_TYPE_ECHOREPLY_V; |
icmp_generate_packet ( rxtx_buffer ); |
*tx_buffer[ ICMP_TYPE_P ] = ICMP_TYPE_ECHOREPLY_V; |
icmp_generate_packet ( rx_buffer, *tx_buffer ); |
|
cDebugReg = 0x27; // Debug 1 */ |
// send packet to ethernet media |
enc28j60_packet_send ( rxtx_buffer, sizeof(ETH_HEADER) + sizeof(IP_HEADER) + sizeof(ICMP_PACKET) ); |
enc28j60_packet_send ( &(*tx_buffer), sizeof(ETH_HEADER) + sizeof(IP_HEADER) + sizeof(ICMP_PACKET) ); |
cDebugReg = 0x28; // Debug 1 */ |
return 1; |
} |
//******************************************************************************************* |
149,32 → 159,35
// Description : Send ARP reply packet to destination. |
// |
//******************************************************************************************* |
BYTE icmp_ping ( BYTE *rxtx_buffer, BYTE *dest_mac, BYTE *dest_ip ) |
BYTE icmp_ping ( BYTE *rx_buffer, BYTE **tx_buffer, BYTE *dest_mac, BYTE *dest_ip ) |
{ |
BYTE i; |
WORD dlength; |
|
// destination ip was not found on network. |
if ( arp_who_is ( rxtx_buffer, dest_mac, dest_ip ) == 0 ) |
if ( arp_who_is ( rx_buffer, dest_mac, dest_ip ) == 0 ) |
return 0; |
|
cDebugReg = 0x29; // Debug 1 */ |
// send icmp request packet (ping) to server |
icmp_send_request ( rxtx_buffer, (BYTE*)&server_mac, dest_ip ); |
icmp_send_request ( rx_buffer, &(*tx_buffer), (BYTE*)&server_mac, dest_ip ); |
|
for ( i=0; i<10; i++ ) |
{ |
_delay_ms( 10 ); |
dlength = enc28j60_packet_receive( rxtx_buffer, MAX_RXTX_BUFFER ); |
dlength = enc28j60_packet_receive( &(*tx_buffer), MAX_RXTX_BUFFER ); |
|
if ( dlength ) |
{ |
// check protocol is icmp or not? |
if ( rxtx_buffer [ IP_PROTO_P ] != IP_PROTO_ICMP_V ) |
if ( rx_buffer [ IP_PROTO_P ] != IP_PROTO_ICMP_V ) |
continue; |
cDebugReg = 0x2A; // Debug 1 */ |
|
// check icmp packet type is echo reply or not? |
if ( rxtx_buffer [ ICMP_TYPE_P ] != ICMP_TYPE_ECHOREPLY_V ) |
if ( rx_buffer [ ICMP_TYPE_P ] != ICMP_TYPE_ECHOREPLY_V ) |
continue; |
cDebugReg = 0x2B; // Debug 1 */ |
|
return 1; |
} |
/turbo8051/trunk/apps/webserver/udp.c
25,6 → 25,23
// |
//******************************************************************************************** |
#include "includes.h" |
|
extern union flag1 |
{ |
BYTE byte; |
struct |
{ |
unsigned char key_is_executed:1; |
unsigned char update_display:1; |
unsigned char lcd_busy:1; |
unsigned char key_press:1; |
unsigned char send_temp:1; |
unsigned char syn_is_sent:1; |
unsigned char syn_is_received:1; |
unsigned char send_temp_timeout:1; |
}bits; |
}flag1; |
|
//******************************************************************************************** |
// The User Datagram Protocol offers only a minimal transport service |
// -- non-guaranteed datagram delivery |
263,7 → 280,7
udp_generate_header (rxtx_buffer, (rxtx_buffer[UDP_SRC_PORT_H_P]<<8)|rxtx_buffer[UDP_SRC_PORT_L_P], sizeof(UDP_HEADER)+dlength.word); |
|
// send packet to ethernet media |
enc28j60_packet_send ( rxtx_buffer, sizeof(ETH_HEADER)+sizeof(IP_HEADER)+sizeof(UDP_HEADER)+dlength.word ); |
enc28j60_packet_send ( &rxtx_buffer, sizeof(ETH_HEADER)+sizeof(IP_HEADER)+sizeof(UDP_HEADER)+dlength.word ); |
|
return 1; |
} |
/turbo8051/trunk/apps/webserver/struct.h
174,13 → 174,13
{ |
WORD hardware_type; |
WORD protocol_type; |
BYTE hardware_length; |
BYTE protocol_length; |
BYTE hardware_length; |
BYTE protocol_length; |
WORD opcode; |
MAC_ADDR src_mac; |
IP_ADDR src_ip; |
MAC_ADDR dest_mac; |
IP_ADDR dest_ip; |
MAC_ADDR src_mac; |
IP_ADDR src_ip; |
MAC_ADDR dest_mac; |
IP_ADDR dest_ip; |
} ARP_PACKET; |
|
// ICMP packet structure |
246,28 → 246,3
WORD checksum; |
} UDP_HEADER; |
|
union flag1 |
{ |
BYTE byte; |
struct |
{ |
unsigned char key_is_executed:1; |
unsigned char update_display:1; |
unsigned char lcd_busy:1; |
unsigned char key_press:1; |
unsigned char send_temp:1; |
unsigned char syn_is_sent:1; |
unsigned char syn_is_received:1; |
unsigned char send_temp_timeout:1; |
}bits; |
}flag1; |
|
union flag2 |
{ |
BYTE byte; |
struct |
{ |
unsigned char key_hold:1; |
unsigned char unuse:7; |
}bits; |
}flag2; |
/turbo8051/trunk/apps/webserver/tcp.h
60,8 → 60,8
//******************************************************************************************** |
extern WORD tcp_get_dlength ( BYTE *rxtx_buffer ); |
extern BYTE tcp_get_hlength ( BYTE *rxtx_buffer ); |
extern WORD tcp_puts_data ( BYTE *rxtx_buffer, BYTE *data, WORD offset ); |
extern WORD tcp_puts_data_p ( BYTE *rxtx_buffer, BYTE *data, WORD offset ); |
extern WORD tcp_puts_data ( BYTE *rxtx_buffer, BYTE *datap, WORD offset ); |
extern WORD tcp_puts_data_p ( BYTE *rxtx_buffer, BYTE *datap, WORD offset ); |
|
extern void tcp_send_packet ( |
BYTE *rxtx_buffer, |
/turbo8051/trunk/apps/webserver/Makefile
1,24 → 1,24
# |
# |
# |
|
SHELL = /bin/sh |
SDCCFLAGS = --model-large -I /home/dinesha/download/sdcc/device/include/mcs51 -I /home/dinesha/download/sdcc/device/include/ -L /home/dinesha/download/sdcc/device/lib/build/large |
ASLINKFLAGS = --code-loc 0x80 --data-loc 0x0020 --stack-loc 0x4000 --xram-loc 0x8000 |
MODULES = main.rel menu.rel ip.rel lcd.rel tcp.rel udp.rel icmp.rel http.rel ethernet.rel arp.rel enc28j60.rel |
|
%.rel: %.c |
sdcc $(SDCCFLAGS) -c $< |
|
#main.rel: main.c |
# sdcc $(SDCCFLAGS) -c $< |
|
all: main.hex |
|
main.hex : $(MODULES) |
sdcc $(SDCCFLAGS) $(ASLINKFLAGS) $(MODULES) |
packihx main.ihx > turbo8051.hex |
|
clean: |
rm -f *.asm *.hex *.ihx *.lnk *.lst *.map *.rel *.rst *.sym *.mem |
|
# |
# |
# |
|
SHELL = /bin/sh |
SDCCFLAGS = --model-large -I /home/dinesha/download/sdcc/device/include/mcs51 -I /home/dinesha/download/sdcc/device/include/ -L /home/dinesha/download/sdcc/device/lib/build/large --debug |
ASLINKFLAGS = --code-loc 0x040 --data-loc 0x0000 --stack-loc 0x040 --xram-loc 0x0000 |
MODULES = main.rel menu.rel ip.rel lcd.rel tcp.rel udp.rel icmp.rel http.rel ethernet.rel arp.rel enc28j60.rel |
|
%.rel: %.c |
sdcc $(SDCCFLAGS) -c $< |
|
#main.rel: main.c |
# sdcc $(SDCCFLAGS) -c $< |
|
all: webserver.hex |
|
webserver.hex : $(MODULES) |
sdcc $(SDCCFLAGS) $(ASLINKFLAGS) $(MODULES) |
packihx main.ihx > webserver.hex |
|
clean: |
rm -f *.asm *.hex *.ihx *.lnk *.lst *.map *.rel *.rst *.sym *.mem |
|
/turbo8051/trunk/apps/webserver/icmp.h
44,7 → 44,7
// Prototype function |
// |
//******************************************************************************************** |
extern BYTE icmp_send_reply ( BYTE *rxtx_buffer, BYTE *dest_mac, BYTE *dest_ip ); |
extern void icmp_send_request ( BYTE *rxtx_buffer, BYTE *dest_mac, BYTE *dest_ip ); |
extern BYTE icmp_ping ( BYTE *rxtx_buffer, BYTE *dest_mac, BYTE *dest_ip ); |
extern BYTE icmp_send_reply ( BYTE *rx_buffer, BYTE **tx_buffer, BYTE *dest_mac, BYTE *dest_ip ); |
extern void icmp_send_request ( BYTE *rx_buffer, BYTE **tx_buffer, BYTE *dest_mac, BYTE *dest_ip ); |
extern BYTE icmp_ping ( BYTE *rx_buffer, BYTE **tx_buffer, BYTE *dest_mac, BYTE *dest_ip ); |
extern void _delay_ms( int iDelay ); |
/turbo8051/trunk/apps/webserver/udp.h
39,7 → 39,7
#define UDP_DATA_P 0x2A |
|
extern void udp_generate_header ( BYTE *rxtx_buffer, WORD dest_port, WORD length ); |
extern WORD udp_puts_data ( BYTE *rxtx_buffer, BYTE *data, WORD offset ); |
extern WORD udp_puts_data ( BYTE *rxtx_buffer, BYTE *datap, WORD offset ); |
// Need to find out alternative method for 8051 access constant from Program memory - Dinesh.A |
//extern WORD udp_puts_data_p ( BYTE *rxtx_buffer, PGM_P data, WORD offset ); |
extern BYTE udp_receive ( BYTE *rxtx_buffer, BYTE *dest_mac, BYTE *dest_ip ); |
/turbo8051/trunk/verif/model/oc8051_xram.v
84,7 → 84,7
reg ackw, ackr; |
reg [31:0] data_out; |
reg [2:0] cnt; |
|
integer i; |
// |
// buffer |
reg [7:0] buff [65535:0]; //64kb |
93,6 → 93,14
assign ack = ackw || ackr; |
|
|
// Intialise the memory |
|
initial |
begin |
for (i=0; i<65536; i=i+1) |
buff [i] = 8'h00; |
end |
|
// |
// writing to ram |
always @(posedge clk or posedge rst) |
/turbo8051/trunk/verif/agents/ethernet/tb_eth_conf.v
14,7 → 14,7
|
`define MAX_PKT_SIZE 8000 // Max packet size in bytes |
|
`define MAX_HEADER_SIZE 32 // Max size of user-defined packet headers |
`define MAX_HEADER_SIZE 42 // Max size of user-defined packet headers |
// (in bytes) |
`define IP_EXTENSION_HEADER_SIZE 256 // Max size of IP Extension Header |
|
/turbo8051/trunk/verif/run/filelist_rtl.f
44,6 → 44,10
//------------------------------------- |
$TURBO8051_PROJ/rtl/clkgen/clkgen.v |
$TURBO8051_PROJ/rtl/lib/clk_ctl.v |
|
//------------------------------------ |
// Core Level Files |
//----------------------------------- |
$TURBO8051_PROJ/rtl/lib/wb_crossbar.v |
$TURBO8051_PROJ/rtl/lib/wb_rd_mem2mem.v |
$TURBO8051_PROJ/rtl/lib/wb_wr_mem2mem.v |
/turbo8051/trunk/verif/run/dat/oc8051_xrom.in
1,257 → 1,248
02 |
00 |
08 |
12 |
00 |
64 |
80 |
FE |
75 |
81 |
07 |
12 |
00 |
E3 |
E5 |
82 |
60 |
03 |
02 |
00 |
03 |
79 |
00 |
E9 |
44 |
00 |
60 |
1B |
7A |
00 |
90 |
00 |
E7 |
78 |
00 |
75 |
A0 |
08 |
E4 |
93 |
F2 |
A3 |
08 |
B8 |
00 |
02 |
05 |
A0 |
D9 |
F4 |
DA |
F2 |
75 |
A0 |
FF |
E4 |
78 |
FF |
F6 |
D8 |
FD |
78 |
00 |
E8 |
44 |
00 |
60 |
0A |
79 |
00 |
75 |
A0 |
00 |
E4 |
F3 |
09 |
D8 |
FC |
78 |
00 |
E8 |
44 |
08 |
60 |
0C |
79 |
08 |
90 |
00 |
00 |
E4 |
F0 |
A3 |
D8 |
FC |
D9 |
FA |
02 |
00 |
03 |
90 |
00 |
00 |
74 |
01 |
F0 |
7A |
01 |
7B |
00 |
74 |
F8 |
2B |
40 |
2A |
EA |
24 |
00 |
FC |
EB |
34 |
00 |
FD |
EA |
24 |
FF |
FE |
EB |
34 |
FF |
FF |
EE |
24 |
00 |
F5 |
82 |
EF |
34 |
00 |
F5 |
83 |
E0 |
FE |
0E |
8C |
82 |
8D |
83 |
EE |
F0 |
0A |
BA |
00 |
D4 |
0B |
80 |
D1 |
7A |
00 |
7B |
00 |
7C |
00 |
74 |
F8 |
2C |
40 |
29 |
EB |
24 |
00 |
F5 |
82 |
EC |
34 |
00 |
F5 |
83 |
E0 |
FD |
74 |
01 |
2B |
FE |
E4 |
3C |
E4 |
FF |
F8 |
ED |
B5 |
06 |
06 |
E8 |
B5 |
07 |
02 |
80 |
03 |
0A |
8A |
80 |
0B |
BB |
00 |
D5 |
0C |
80 |
D2 |
EA |
60 |
07 |
75 |
A0 |
55 |
8A |
B0 |
80 |
06 |
75 |
A0 |
AA |
75 |
B0 |
AA |
80 |
FE |
75 |
82 |
00 |
22 |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
FF |
/// |
/// created by oc8051 rom maker |
/// author: Simon Teran (simont@opencores.org) |
/// |
/// source file: D:\gmac_loopback.hex |
/// date: 5/6/2011 |
/// time: 4:47:40 PM |
/// |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
02 |
00 |
18 |
12 |
00 |
74 |
80 |
FE |
75 |
81 |
31 |
12 |
00 |
EC |
E5 |
82 |
60 |
03 |
02 |
00 |
13 |
79 |
00 |
E9 |
44 |
00 |
60 |
1B |
7A |
00 |
90 |
00 |
F0 |
78 |
07 |
75 |
A0 |
00 |
E4 |
93 |
F2 |
A3 |
08 |
B8 |
00 |
02 |
05 |
A0 |
D9 |
F4 |
DA |
F2 |
75 |
A0 |
FF |
E4 |
78 |
FF |
F6 |
D8 |
FD |
78 |
00 |
E8 |
44 |
00 |
60 |
0A |
79 |
00 |
75 |
A0 |
00 |
E4 |
F3 |
09 |
D8 |
FC |
78 |
07 |
E8 |
44 |
00 |
60 |
0C |
79 |
01 |
90 |
00 |
00 |
E4 |
F0 |
A3 |
D8 |
FC |
D9 |
FA |
02 |
00 |
13 |
90 |
00 |
05 |
E4 |
F0 |
A3 |
F0 |
E4 |
F5 |
30 |
F5 |
31 |
90 |
A0 |
30 |
E0 |
FC |
A3 |
E0 |
FD |
EC |
54 |
0F |
60 |
F3 |
90 |
00 |
05 |
E0 |
FC |
A3 |
E0 |
FD |
8C |
06 |
74 |
70 |
4D |
FF |
90 |
00 |
01 |
EE |
F0 |
A3 |
EF |
F0 |
74 |
40 |
4C |
F8 |
74 |
70 |
4D |
F9 |
90 |
00 |
03 |
E8 |
F0 |
A3 |
E9 |
F0 |
8E |
82 |
8F |
83 |
E0 |
FE |
A3 |
E0 |
FF |
A3 |
E0 |
FA |
A3 |
E0 |
FB |
88 |
82 |
89 |
83 |
EE |
F0 |
A3 |
EF |
F0 |
A3 |
EA |
F0 |
A3 |
EB |
F0 |
74 |
04 |
2C |
FC |
E4 |
3D |
FD |
90 |
00 |
05 |
74 |
3F |
5C |
F0 |
A3 |
E4 |
F0 |
05 |
30 |
E4 |
B5 |
30 |
98 |
05 |
31 |
80 |
94 |
75 |
82 |
00 |
22 |
/turbo8051/trunk/verif/tb/tb_top.v
411,6 → 411,8
// test case, which has control before reset |
if ( $test$plusargs("gmac_test_2") ) |
gmac_test2(); |
else if ( $test$plusargs("webserver") ) |
webserver(); |
|
#1000 wait(reset_out_n == 1); |
|
421,7 → 423,8
uart_test1(); |
else if ( $test$plusargs("spi_test_1") ) |
spi_test1(); |
else if ( !$test$plusargs("gmac_test_2") ) begin |
else if ( !$test$plusargs("gmac_test_2") && |
!$test$plusargs("webserver")) begin |
// 8051 Test Cases |
#80000000 |
$display("time ",$time, "\n faulire: end of time\n \n"); |
457,6 → 460,7
|
`include "gmac_test1.v" |
`include "gmac_test2.v" |
`include "webserver.v" |
`include "uart_test1.v" |
`include "spi_test1.v" |
`include "tb_tasks.v" |