📄 ethernet_mini_driver.c
字号:
ipaddrascii[1]+= 1;
}while(binarynumber >= 10);
}
ipaddrascii[2]+= binarynumber;
}
//******************************************************************
//* Read the transmit buffer
//* This routine reads the contents of the transmit buffer
//* Uncomment debuggc array definition to use
//******************************************************************
/*
void read_xmit_buffer(void)
{
unsigned int i;
//banksel(ERDPTL);
ERDPTL= LOW_BYTE(TXSTART);
ERDPTH= HIGH_BYTE(TXSTART);
for(i=0;i<300;++i)
debuggc[i]= rd_sram();
}
*/
//******************************************************************
//* SEND DHCP BOUND MESSAGE VIA BROADCAST UDP
//******************************************************************
void send_dhcp_bound_datagram()
{
char *bufferptr,temp;
unsigned int i,j;
char msg[];
tx_end = 0;
//load beginning page for transmit buffer
//banksel(EWRPTL);
EWRPTL = LOW_BYTE(TXSTART);
EWRPTH = HIGH_BYTE(TXSTART);
i = 6;
while(i--) //write destination MAC address
{
EDATA = 0xFF;
//i--;
};
bufferptr = macaddrc;
i = 6;
while(i--) //write source MAC address
{
EDATA = *bufferptr++;
// bufferptr++;
// i--;
};
EDATA = 0x08; //write 0800 type field
EDATA = 0x00;
tx_end += 15;
//BEGIN IP HEADER
EDATA = 0x45; //write 4500 vers/len field
EDATA = 0x00;
EDATA = 0x00; //write packet length 0x0114
EDATA = 0x00;
EDATA = 0x00; //write id field
EDATA = 0x01;
EDATA = 0x00; //write flags/frag offset
EDATA = 0x00;
EDATA = 0x64; //write time to live
EDATA = 0x11; //write protocol type (UDP)
EDATA = 0x00; //write IP hdr checksum (0x0000)
EDATA = 0x00;
i = 4;
bufferptr = ipaddrc;
while(i--) //write source IP address
{
EDATA = *bufferptr++;
//i--;
};
i = 4;
bufferptr = broadcastipaddrc;
while(i--) //write destination IP address
{
EDATA = *bufferptr++;
//i--;
};
tx_end += 20;
//END IP HEADER
//START UPD HEADER
EDATA = HIGH_BYTE(MY_PORT_ADDRESS); //write UDP source port (8088 decimal)
EDATA = LOW_BYTE(MY_PORT_ADDRESS);
EDATA = HIGH_BYTE(MCHP_UDP_PORT_ADDRESS); //write UDP destination port (30303 decimal)
EDATA = LOW_BYTE(MCHP_UDP_PORT_ADDRESS);
EDATA = 0x00; //write UDP length
EDATA = 0x00;
EDATA = 0x00; //write UDP checksum (no checksum)
EDATA = 0x00;
tx_end += 8;
//END UDP HEADER
//START UDP DATA
//write MAC address message
i = 36;
tx_end += i;
msgpointer = dhcpmacmsg;
while(i--)
{
EDATA = *msgpointer++;
//i--;
};
//write IP address message
i = 19;
tx_end += i;
msgpointer = dhcpipmsg;
while(i--)
{
EDATA = *msgpointer++;
// i--;
};
for(i=0;i<4;++i)
{
binary_to_ascii(ipaddrc[i]);
bufferptr = ipaddrascii;
j = sizeof(ipaddrascii);
tx_end += j;
if(ipaddrascii[0] == 0x30)
{
tx_end--;
j--;
bufferptr++;
}
if(ipaddrascii[1] == 0x30 && ipaddrascii[0] == 0x30)
{
tx_end--;
j--;
bufferptr++;
}
while(j--) //write FTII IP address
{
EDATA = *bufferptr++;
//j--;
};
if(i<3)
{
EDATA = 0x2E; //write . period
tx_end += 1;
}
}
//write gateway address message
i = 27;
tx_end += i;
msgpointer = dhcpgwaymsg;
while(i--) //write gateway address message
{
EDATA = *msgpointer++;
//i--;
};
for(i=0;i<4;++i)
{
binary_to_ascii(gwayipaddrc[i]);
bufferptr = ipaddrascii;
j = sizeof(ipaddrascii);
tx_end += j;
if(ipaddrascii[0] == 0x30)
{
tx_end--;
j--;
bufferptr++;
}
if(ipaddrascii[1] == 0x30 && ipaddrascii[0] == 0x30)
{
tx_end--;
j--;
bufferptr++;
}
while(j--) //write FTII gateway IP address
{
EDATA = *bufferptr++;
//j--;
};
if(i<3)
{
EDATA = 0x2E; //write . period
tx_end += 1;
}
}
//write subnet mask address message
i = 20;
tx_end += i;
msgpointer = dhcpsubnetmaskmsg;
while(i--) //write gateway address message
{
EDATA = *msgpointer++;
//i--;
};
for(i=0;i<4;++i)
{
binary_to_ascii(subnetmaskc[i]);
bufferptr = ipaddrascii;
j = sizeof(ipaddrascii);
tx_end += j;
if(ipaddrascii[0] == 0x30)
{
tx_end--;
j--;
bufferptr++;
}
if(ipaddrascii[1] == 0x30 && ipaddrascii[0] == 0x30)
{
tx_end--;
j--;
bufferptr++;
}
while(j--) //write subnet mask
{
EDATA = *bufferptr++;
//j--;
};
if(i<3)
{
EDATA = 0x2E; //write . period
tx_end += 1;
}
}
//read_xmit_buffer();
//++i;
// write ip header total length
//banksel(EWRPTL);
EWRPTL = LOW_BYTE(TXSTART+0x11);
EWRPTH = HIGH_BYTE(TXSTART+0x00);
i = tx_end - 15;
EDATA = HIGH_BYTE(i);
EDATA = LOW_BYTE(i);
// write udp header total length
//banksel(EWRPTL);
EWRPTL = LOW_BYTE(TXSTART+0x27);
EWRPTH = HIGH_BYTE(TXSTART+0x00);
i = tx_end - 35;
EDATA = HIGH_BYTE(i);
//compute ip header checksum
hdrlen = (0x45 & 0x0F) * 4; //hdrlen = 20 bytes
offsetval = TXSTART+15; //beginning of IP header
EDMASTL = LOW_BYTE(offsetval);
EDMASTH = HIGH_BYTE(offsetval);
offsetval += (hdrlen-1);
EDMANDL = LOW_BYTE(offsetval);
EDMANDH = HIGH_BYTE(offsetval);
ECON1 |= (ECON1_CSUMEN | ECON1_DMAST);
// while(ECON1 & ECON1_DMAST);
while(DMAST);
chksum_lo = EDMACSL;
chksum_hi = EDMACSH;
//write ip checksum values to TX buffer
offsetval = TXSTART+25;
EWRPTL = LOW_BYTE(offsetval);
EWRPTH = HIGH_BYTE(offsetval);
EDATA = chksum_hi;
EDATA = chksum_lo;
tx_end += (TXSTART-1);
//banksel(ETXNDL);
ETXNDL = LOW_BYTE(tx_end);
ETXNDH = HIGH_BYTE(tx_end);
//send the contents of the transmit buffer onto the network
//temp = EIR;
//if((temp & EIR_TXERIF) == 1)
if(TXERIF)
{
TXERIF = 0;
TXRTS = 1;
TXRTS = 0;
}
TXIF = 0;
TXRTS = 1;
//while(1 == (ECON1 & ECON1_TXRTS));
while(TXRTS);
}
//******************************************************************
//* INITIALIZE DHCP STATE MACHINE
//******************************************************************
void init_DHCP(void)
{
if(DHCPSTATE == DHCP_DISABLED)
return;
DHCPSTATE = DHCP_ENTRY;
dhcpflags = 0;
}
//******************************************************************
//* DHCP STATE MACHINE
//******************************************************************
void dhcp_state_engine(void)
{
unsigned int i;
switch(DHCPSTATE)
{
case DHCP_ENTRY:
printf("\r\nDHCP RESET..");
for(i=0;i<4;++i)
tempipaddrc[i] = 0x00;
DHCPSTATE = DHCP_INIT;
case DHCP_INIT:
printf("\r\nDHCP INIT..");
for(i=0;i<6;++i)
svrmacaddrc[i] = 0xFF;
for(i=0;i<4;++i)
svridc[i] = 0xFF;
msecs_timer = 0;
DHCPSTATE = DHCP_WAIT;
case DHCP_WAIT:
if(msecs_timer >= 2000)
DHCPSTATE = DHCP_BROADCAST;
break;
case DHCP_BROADCAST:
leasetime = 60;
if(bbound)
{
DHCPSTATE = DHCP_REQUEST;
}
else
{
send_dhcp(DHCP_DISCOVER_MESSAGE);
msecs_timer = 0;
DHCPSTATE = DHCP_DISCOVER;
printf("\r\nSENT DISCOVER MESSAGE..");
}
break;
case DHCP_DISCOVER:
if(msecs_timer >= 2000)
{
DHCPSTATE = DHCP_BROADCAST;
return;
}
if(bnewdhcppkt)
{
if(receive_dhcp() == DHCP_OFFER_MESSAGE)
{
DHCPSTATE = DHCP_REQUEST;
printf("\r\nRECEIVED DHCP OFFER MESSAGE..");
}
clr_newdhcppkt;
}
break;
case DHCP_REQUEST:
send_dhcp(DHCP_REQUEST_MESSAGE);
msecs_timer = 0;
DHCPSTATE = DHCP_BIND;
printf("\r\nSENT DHCP REQUEST MESSAGE..");
break;
case DHCP_BIND:
if(bnewdhcppkt)
{
dhcpreturncode = receive_dhcp();
clr_newdhcppkt;
}
if(dhcpreturncode == DHCP_NAK_MESSAGE)
{
printf("\r\nRECEIVED DHCP NAK MESSAGE..");
init_DHCP();
return;
}
else if(dhcpreturncode == DHCP_ACK_MESSAGE)
{
printf("\r\nRECEIVED DHCP ACK MESSAGE..");
lease_timer = 0;
DHCPSTATE = DHCP_BOUND;
for(i=0;i<4;++i)
{
ipaddrc[i] = tempipaddrc[i];
subnetmaskc[i] = tempsubnetmaskc[i];
gwayipaddrc[i] = tempgwayipaddrc[i];
}
set_bound;
printf("\r\nNEW IP ADDRESS IS %d.%d.%d.%d..",ipaddrc[0],ipaddrc[1],ipaddrc[2],ipaddrc[3]);
printf("\r\nNEW GATEWAY ADDRESS IS %d.%d.%d.%d..",gwayipaddrc[0],gwayipaddrc[1],gwayipaddrc[2],gwayipaddrc[3]);
printf("\r\nNEW SUBNET MASK IS %d.%d.%d.%d..",subnetmaskc[0],subnetmaskc[1],subnetmaskc[2],subnetmaskc[3]);
send_dhcp_bound_datagram();
return;
}
else if(msecs_timer >= 2000)
DHCPSTATE = DHCP_BROADCAST;
break;
case DHCP_BOUND:
if(lease_timer >= leasetime)
{
printf("\r\nDHCP LEASE TIME EXPIRED..");
DHCPSTATE = DHCP_INIT;
}
break;
}
}
//******************************************************************
//* SEND A DHCP MESSAGE ROUTINE
//******************************************************************
void send_dhcp(char dhcpmsgtype)
{
char *bufferptr,temp;
unsigned int i;
tx_end = 0;
//load beginning page for transmit buffer
//banksel(EWRPTL);
EWRPTL = LOW_BYTE(TXSTART);
EWRPTH = HIGH_BYTE(TXSTART);
EDATA = 0x0E; //write control byte
i = 6;
while(i) //write destination MAC address
{
EDATA = 0xFF;
i--;
};
bufferptr = macaddrc;
i = 6;
while(i) //write source MAC address
{
EDATA = *bufferptr;
bufferptr++;
i--;
};
EDATA = 0x08; //write 0800 type field
EDATA = 0x00;
tx_end += 15;
//BEGIN IP HEADER
EDATA = 0x45; //write 4500 vers/len field
EDATA = 0x00;
EDATA = 0x00; //write packet length 0x0114
EDATA = 0x00;
EDATA = 0x00; //write id field
EDATA = 0x01;
EDATA = 0x00; //write flags/frag offset
EDATA = 0x00;
EDATA = 0x64; //write time to live
EDATA = 0x11; //write protocol type (UDP)
EDATA = 0x00; //write IP hdr checksum (0x0000)
EDATA = 0x00;
i = 4;
while(i) //write source IP address
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -