int ethernetext_init(ethernet_cfg_t *p_ethcfg) { int32_t i; uint16_t val; CPGSTBCR7 &= ~(CPG_STBCR7_BIT_MSTP74); /* enable ETHER clock */ /* P4_2(PHY Reset) */ GPIOP4 &= ~0x0004; /* Outputs low level */ GPIOPMC4 &= ~0x0004; /* Port mode */ GPIOPM4 &= ~0x0004; /* Output mode */ /* GPIO P1 P1_14(ET_COL) */ GPIOPMC1 |= 0x4000; GPIOPFCAE1 &= ~0x4000; GPIOPFCE1 |= 0x4000; GPIOPFC1 |= 0x4000; /* P3_0(ET_TXCLK), P3_3(ET_MDIO), P3_4(ET_RXCLK), P3_5(ET_RXER), P3_6(ET_RXDV) */ GPIOPMC3 |= 0x0079; GPIOPFCAE3 &= ~0x0079; GPIOPFCE3 &= ~0x0079; GPIOPFC3 |= 0x0079; GPIOPIPC3 |= 0x0079; /* P5_9(ET_MDC) */ GPIOPMC5 |= 0x0200; GPIOPFCAE5 &= ~0x0200; GPIOPFCE5 &= ~0x0200; GPIOPFC5 |= 0x0200; GPIOPIPC5 |= 0x0200; /* P10_1(ET_TXER), P10_2(ET_TXEN), P10_3(ET_CRS), P10_4(ET_TXD0), P10_5(ET_TXD1) */ /* P10_6(ET_TXD2), P10_7(ET_TXD3), P10_8(ET_RXD0), P10_9(ET_RXD1), P10_10(ET_RXD2), P10_11(ET_RXD3) */ GPIOPMC10 |= 0x0FFE; GPIOPFCAE10 &= ~0x0FFE; GPIOPFCE10 |= 0x0FFE; GPIOPFC10 |= 0x0FFE; GPIOPIPC10 |= 0x0FFE; /* Resets the E-MAC,E-DMAC */ lan_reg_reset(); /* PHY Reset */ GPIOP4 &= ~0x0004; /* P4_2 Outputs low level */ wait_100us(250); /* 25msec */ GPIOP4 |= 0x0004; /* P4_2 Outputs high level */ wait_100us(100); /* 10msec */ /* Resets the PHY-LSI */ phy_reg_write(BASIC_MODE_CONTROL_REG, 0x8000); for (i = 10000; i > 0; i--) { val = phy_reg_read(BASIC_MODE_CONTROL_REG); if (((uint32_t)val & 0x8000uL) == 0) { break; /* Reset complete */ } } phy_id = ((uint32_t)phy_reg_read(PHY_IDENTIFIER1_REG) << 16) | (uint32_t)phy_reg_read(PHY_IDENTIFIER2_REG); Interrupt_priority = p_ethcfg->int_priority; p_recv_cb_fnc = p_ethcfg->recv_cb; start_stop = 1; if (p_ethcfg->ether_mac != NULL) { (void)memcpy(mac_addr, p_ethcfg->ether_mac, sizeof(mac_addr)); } else { ethernet_address(mac_addr); /* Get MAC Address */ } return 0; }
/*---------------------------------------------------------------------------- Ethernet Device initialize *----------------------------------------------------------------------------*/ int ethernet_init() { int regv, tout; char mac[ETHERNET_ADDR_SIZE]; unsigned int clock = clockselect(); LPC_SC->PCONP |= 0x40000000; /* Power Up the EMAC controller. */ LPC_PINCON->PINSEL2 = 0x50150105; /* Enable P1 Ethernet Pins. */ LPC_PINCON->PINSEL3 = (LPC_PINCON->PINSEL3 & ~0x0000000F) | 0x00000005; /* Reset all EMAC internal modules. */ LPC_EMAC->MAC1 = MAC1_RES_TX | MAC1_RES_MCS_TX | MAC1_RES_RX | MAC1_RES_MCS_RX | MAC1_SIM_RES | MAC1_SOFT_RES; LPC_EMAC->Command = CR_REG_RES | CR_TX_RES | CR_RX_RES | CR_PASS_RUNT_FRM; for(tout = 100; tout; tout--) __NOP(); /* A short delay after reset. */ LPC_EMAC->MAC1 = MAC1_PASS_ALL; /* Initialize MAC control registers. */ LPC_EMAC->MAC2 = MAC2_CRC_EN | MAC2_PAD_EN; LPC_EMAC->MAXF = ETH_MAX_FLEN; LPC_EMAC->CLRT = CLRT_DEF; LPC_EMAC->IPGR = IPGR_DEF; LPC_EMAC->Command = CR_RMII | CR_PASS_RUNT_FRM; /* Enable Reduced MII interface. */ LPC_EMAC->MCFG = (clock << 0x2) & MCFG_CLK_SEL; /* Set clock */ LPC_EMAC->MCFG |= MCFG_RES_MII; /* and reset */ for(tout = 100; tout; tout--) __NOP(); /* A short delay */ LPC_EMAC->MCFG = (clock << 0x2) & MCFG_CLK_SEL; LPC_EMAC->MCMD = 0; LPC_EMAC->SUPP = SUPP_RES_RMII; /* Reset Reduced MII Logic. */ for (tout = 100; tout; tout--) __NOP(); /* A short delay */ LPC_EMAC->SUPP = 0; phy_write(PHY_REG_BMCR, PHY_BMCR_RESET); /* perform PHY reset */ for(tout = 0x20000; ; tout--) { /* Wait for hardware reset to end. */ regv = phy_read(PHY_REG_BMCR); if(regv < 0 || tout == 0) { return -1; /* Error */ } if(!(regv & PHY_BMCR_RESET)) { break; /* Reset complete. */ } } phy_id = (phy_read(PHY_REG_IDR1) << 16); phy_id |= (phy_read(PHY_REG_IDR2) & 0XFFF0); if (phy_id != DP83848C_ID && phy_id != LAN8720_ID) { error("Unknown Ethernet PHY (%x)", (unsigned int)phy_id); } ethernet_set_link(-1, 0); /* Set the Ethernet MAC Address registers */ ethernet_address(mac); LPC_EMAC->SA0 = ((uint32_t)mac[5] << 8) | (uint32_t)mac[4]; LPC_EMAC->SA1 = ((uint32_t)mac[3] << 8) | (uint32_t)mac[2]; LPC_EMAC->SA2 = ((uint32_t)mac[1] << 8) | (uint32_t)mac[0]; txdscr_init(); /* initialize DMA TX Descriptor */ rxdscr_init(); /* initialize DMA RX Descriptor */ LPC_EMAC->RxFilterCtrl = RFC_UCAST_EN | RFC_MCAST_EN | RFC_BCAST_EN | RFC_PERFECT_EN; /* Receive Broadcast, Perfect Match Packets */ LPC_EMAC->IntEnable = INT_RX_DONE | INT_TX_DONE; /* Enable EMAC interrupts. */ LPC_EMAC->IntClear = 0xFFFF; /* Reset all interrupts */ LPC_EMAC->Command |= (CR_RX_EN | CR_TX_EN); /* Enable receive and transmit mode of MAC Ethernet core */ LPC_EMAC->MAC1 |= MAC1_REC_EN; #if NEW_LOGIC rx_consume_offset = -1; tx_produce_offset = -1; #else send_doff = 0; send_idx = -1; send_size = 0; receive_soff = 0; receive_idx = -1; #endif return 0; }
void windows_tap_adapter::open(const std::string& _name, boost::system::error_code& ec) { ec = boost::system::error_code(); if (_name.empty()) { open(ec); return; } PIP_ADAPTER_INFO piai = NULL; ULONG size = 0; DWORD status; status = GetAdaptersInfo(piai, &size); if (status != ERROR_BUFFER_OVERFLOW) { ec = boost::system::error_code(status, boost::system::system_category()); return; } std::vector<unsigned char> piai_data(size); piai = reinterpret_cast<PIP_ADAPTER_INFO>(&piai_data[0]); status = GetAdaptersInfo(piai, &size); if (status != ERROR_SUCCESS) { ec = boost::system::error_code(status, boost::system::system_category()); return; } piai_data.resize(size); try { const guid_pair_type adapter = find_tap_adapter_by_guid(_name); for (PIP_ADAPTER_INFO pi = piai; pi; pi = pi->Next) { if (adapter.first == std::string(pi->AdapterName)) { const HANDLE handle = CreateFileA( (USERMODEDEVICEDIR + adapter.first + TAPSUFFIX).c_str(), GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED, 0 ); if (handle == INVALID_HANDLE_VALUE) { ec = boost::system::error_code(::GetLastError(), boost::system::system_category()); return; } if (descriptor().assign(handle, ec)) { return; } set_name(adapter.first); m_display_name = adapter.second; m_interface_index = pi->Index; if (::ConvertInterfaceIndexToLuid(m_interface_index, &m_interface_luid) != NO_ERROR) { ec = boost::system::error_code(::GetLastError(), boost::system::system_category()); return; } if (pi->AddressLength != ethernet_address().data().size()) { if (close(ec)) { return; } ec = make_error_code(asiotap_error::no_ethernet_address); return; } osi::ethernet_address _ethernet_address; std::memcpy(_ethernet_address.data().data(), pi->Address, pi->AddressLength); set_ethernet_address(_ethernet_address); DWORD read_mtu; DWORD len; if (!DeviceIoControl(descriptor().native_handle(), TAP_IOCTL_GET_MTU, &read_mtu, sizeof(read_mtu), &read_mtu, sizeof(read_mtu), &len, NULL)) { ec = boost::system::error_code(::GetLastError(), boost::system::system_category()); return; } set_mtu(static_cast<size_t>(read_mtu)); break; } } } catch (const boost::system::system_error& ex) { ec = ex.code(); return; } if (!is_open()) { ec = make_error_code(asiotap_error::no_such_tap_adapter); } }