DHCP Client for WIZ820io(W5200)
Dependencies: EthernetNetIf mbed
MyEthernetNetIf.cpp@0:db4242c89949, 2012-04-10 (annotated)
- Committer:
- va009039
- Date:
- Tue Apr 10 03:38:22 2012 +0000
- Revision:
- 0:db4242c89949
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
va009039 | 0:db4242c89949 | 1 | // MyEthernetNetIf.h 2012/4/10 |
va009039 | 0:db4242c89949 | 2 | // EthernetNetIf for WIZ820io(W5200) |
va009039 | 0:db4242c89949 | 3 | #include "mbed.h" |
va009039 | 0:db4242c89949 | 4 | #include "MyEthernetNetIf.h" |
va009039 | 0:db4242c89949 | 5 | #include "DHCPClient.h" |
va009039 | 0:db4242c89949 | 6 | #include "w5100.h" |
va009039 | 0:db4242c89949 | 7 | |
va009039 | 0:db4242c89949 | 8 | extern W5100Class W5100; // w5100.cpp |
va009039 | 0:db4242c89949 | 9 | |
va009039 | 0:db4242c89949 | 10 | bool wait_linkup(int timeout = 3000) { |
va009039 | 0:db4242c89949 | 11 | Timer link_t; |
va009039 | 0:db4242c89949 | 12 | link_t.start(); |
va009039 | 0:db4242c89949 | 13 | while(link_t.read_ms() < timeout) { |
va009039 | 0:db4242c89949 | 14 | if (0x20 & W5100.readPHYSTATUS()) { |
va009039 | 0:db4242c89949 | 15 | return true; |
va009039 | 0:db4242c89949 | 16 | } |
va009039 | 0:db4242c89949 | 17 | wait_ms(50); |
va009039 | 0:db4242c89949 | 18 | } |
va009039 | 0:db4242c89949 | 19 | return false; |
va009039 | 0:db4242c89949 | 20 | } |
va009039 | 0:db4242c89949 | 21 | |
va009039 | 0:db4242c89949 | 22 | void MyEthernetNetIf::hardware_setup(){ |
va009039 | 0:db4242c89949 | 23 | W5100.hardware_reset(); |
va009039 | 0:db4242c89949 | 24 | W5100.init(); |
va009039 | 0:db4242c89949 | 25 | wait_linkup(); |
va009039 | 0:db4242c89949 | 26 | } |
va009039 | 0:db4242c89949 | 27 | |
va009039 | 0:db4242c89949 | 28 | MyEthernetNetIf::MyEthernetNetIf(IpAddr ip, IpAddr netmask, IpAddr gateway, IpAddr dns) { |
va009039 | 0:db4242c89949 | 29 | m_ip = ip; |
va009039 | 0:db4242c89949 | 30 | m_netmask = netmask; |
va009039 | 0:db4242c89949 | 31 | m_gateway = gateway; |
va009039 | 0:db4242c89949 | 32 | m_dns = dns; |
va009039 | 0:db4242c89949 | 33 | m_useDhcp = false; |
va009039 | 0:db4242c89949 | 34 | } |
va009039 | 0:db4242c89949 | 35 | |
va009039 | 0:db4242c89949 | 36 | MyEthernetNetIf:: MyEthernetNetIf() { |
va009039 | 0:db4242c89949 | 37 | m_useDhcp = true; |
va009039 | 0:db4242c89949 | 38 | } |
va009039 | 0:db4242c89949 | 39 | |
va009039 | 0:db4242c89949 | 40 | EthernetErr MyEthernetNetIf::setup(int timeout_ms) |
va009039 | 0:db4242c89949 | 41 | { |
va009039 | 0:db4242c89949 | 42 | hardware_setup(); |
va009039 | 0:db4242c89949 | 43 | uint8_t mac[6] = {0x00,0x00,0x5e,0x00,0x01,0x01}; |
va009039 | 0:db4242c89949 | 44 | W5100.setMACAddress(mac); |
va009039 | 0:db4242c89949 | 45 | printf("HW Addr is : %02x:%02x:%02x:%02x:%02x:%02x.\n", mac[0],mac[1],mac[2],mac[3],mac[4],mac[5]); |
va009039 | 0:db4242c89949 | 46 | uint8_t u[4]; |
va009039 | 0:db4242c89949 | 47 | u[0] = m_ip[0]; |
va009039 | 0:db4242c89949 | 48 | u[1] = m_ip[1]; |
va009039 | 0:db4242c89949 | 49 | u[2] = m_ip[2]; |
va009039 | 0:db4242c89949 | 50 | u[3] = m_ip[3]; |
va009039 | 0:db4242c89949 | 51 | W5100.setIPAddress(u); |
va009039 | 0:db4242c89949 | 52 | u[0] = m_netmask[0]; |
va009039 | 0:db4242c89949 | 53 | u[1] = m_netmask[1]; |
va009039 | 0:db4242c89949 | 54 | u[2] = m_netmask[2]; |
va009039 | 0:db4242c89949 | 55 | u[3] = m_netmask[3]; |
va009039 | 0:db4242c89949 | 56 | W5100.setSubnetMask(u); |
va009039 | 0:db4242c89949 | 57 | u[0] = m_gateway[0]; |
va009039 | 0:db4242c89949 | 58 | u[1] = m_gateway[1]; |
va009039 | 0:db4242c89949 | 59 | u[2] = m_gateway[2]; |
va009039 | 0:db4242c89949 | 60 | u[3] = m_gateway[3]; |
va009039 | 0:db4242c89949 | 61 | W5100.setGatewayIp(u); |
va009039 | 0:db4242c89949 | 62 | if (! m_useDhcp) { |
va009039 | 0:db4242c89949 | 63 | return ETH_OK; |
va009039 | 0:db4242c89949 | 64 | } |
va009039 | 0:db4242c89949 | 65 | printf("DHCP Started, waiting for IP...\n"); |
va009039 | 0:db4242c89949 | 66 | DHCPClient* dhcp; |
va009039 | 0:db4242c89949 | 67 | EthernetErr err; |
va009039 | 0:db4242c89949 | 68 | dhcp = new DHCPClient; |
va009039 | 0:db4242c89949 | 69 | int r = dhcp->setup(timeout_ms); |
va009039 | 0:db4242c89949 | 70 | if (r == (-1)) { |
va009039 | 0:db4242c89949 | 71 | printf("Timeout.\n"); |
va009039 | 0:db4242c89949 | 72 | err = ETH_TIMEOUT; |
va009039 | 0:db4242c89949 | 73 | } else { |
va009039 | 0:db4242c89949 | 74 | W5100.writeSIPR(dhcp->yiaddr); |
va009039 | 0:db4242c89949 | 75 | W5100.writeSUBR(dhcp->netmask); |
va009039 | 0:db4242c89949 | 76 | W5100.writeGAR(dhcp->gateway); |
va009039 | 0:db4242c89949 | 77 | m_ip = IpAddr(dhcp->yiaddr[0],dhcp->yiaddr[1],dhcp->yiaddr[2],dhcp->yiaddr[3]); |
va009039 | 0:db4242c89949 | 78 | m_dns = IpAddr(dhcp->dnsaddr[0],dhcp->dnsaddr[1],dhcp->dnsaddr[2],dhcp->dnsaddr[3]); |
va009039 | 0:db4242c89949 | 79 | printf("Connected, IP: %d.%d.%d.%d\n", dhcp->yiaddr[0], dhcp->yiaddr[1], dhcp->yiaddr[2], dhcp->yiaddr[3]); |
va009039 | 0:db4242c89949 | 80 | err = ETH_OK; |
va009039 | 0:db4242c89949 | 81 | } |
va009039 | 0:db4242c89949 | 82 | delete dhcp; |
va009039 | 0:db4242c89949 | 83 | return err; |
va009039 | 0:db4242c89949 | 84 | } |