|
-
- #include "fnet_user_config.h"
- #include "fnet.h"
- #include "fnet_config.h"
- #include "fnet_usb.h"
- #include "stack/fnet_eth_prv.h"
-
- //#if !defined(ARDUINO_TEENSY41)
-
- /************************************************************************
- * NAME: inits
- *
- * DESCRIPTION: Ethernet Physical Transceiver initialization and/or reset.
- *************************************************************************/
- fnet_return_t fnet_usb_init(fnet_netif_t *netif){
- (void) netif;
- return FNET_OK;
- }
-
- void fnet_usb_release(fnet_netif_t *netif) {
- (void) netif;
- }
-
-
- /************************************************************************
- * NAME: fnet_usb_get_hw_addr
- *
- * DESCRIPTION: This function reads MAC address.
- *************************************************************************/
- fnet_return_t fnet_usb_get_hw_addr(fnet_netif_t *netif, uint8_t * hw_addr){
- fnet_return_t result;
-
- if(netif && (netif->netif_api->netif_type == FNET_NETIF_TYPE_ETHERNET)
- && (hw_addr) )
- {
- // Get MAC adress here
- if(_handleGetMACAddress != NULL){
- _handleGetMACAddress((fnet_mac_addr_t *)hw_addr);
- }
- result = FNET_OK;
- }
- else
- {
- result = FNET_ERR;
- }
-
- return result;
- }
-
- fnet_return_t fnet_usb_set_hw_addr(fnet_netif_t *netif, uint8_t * hw_addr){
- fnet_return_t result;
-
- /* Set the source address for the controller. */
- if(netif
- && (netif->netif_api->netif_type == FNET_NETIF_TYPE_ETHERNET)
- && hw_addr
- && (fnet_memcmp(hw_addr, fnet_eth_null_addr, sizeof(fnet_mac_addr_t)) != 0)
- && (fnet_memcmp(hw_addr, fnet_eth_broadcast, sizeof(fnet_mac_addr_t)) != 0)
- && ((hw_addr[0] & 0x01U) == 0x00U)) /* Most significant nibble should be always even.*/
- {
- // Set MAC adress here
- if(_handleSetMACAddress != NULL){
- _handleSetMACAddress(hw_addr);
- }
- _fnet_eth_change_addr_notify(netif);
-
- result = FNET_OK;
- }
- else
- {
- result = FNET_ERR;
- }
-
- return result;
- }
-
- fnet_return_t fnet_usb_get_statistics(struct fnet_netif *netif, struct fnet_netif_statistics * statistics){ //Number of rx and tx packets
- (void) netif;
- (void) statistics;
- return FNET_OK;
- }
-
- fnet_bool_t fnet_usb_is_connected(fnet_netif_t *netif){
- if (_handleIsConnected != NULL) {
- return _handleIsConnected();
- }
- return false;
- }
-
- /************************************************************************
- * NAME: fnet_usb_output
- *
- * DESCRIPTION: Ethernet low-level output function.
- *************************************************************************/
- void fnet_usb_eth_output(fnet_netif_t *netif, fnet_netbuf_t *nb){
- // fnet_uint8_t *tx_buffer;
- //
- // if(nb && (nb->total_length >= FNET_ETH_HDR_SIZE))
- // {
- // _fnet_netbuf_to_buf(nb, 0u, FNET_NETBUF_COPYALL, tx_buffer);
- // }
- if(_handleOutput != NULL){
- _handleOutput(netif, nb);
- }
- _fnet_netbuf_free_chain(nb);
- }
-
- void fnet_usb_stop(fnet_netif_t *netif) {
- (void) netif;
- }
-
- void fnet_usb_resume(fnet_netif_t *netif) {
- (void) netif;
- }
-
-
- /************************************************************************
- * DESCRIPTION: Read a value from a PHY's MII register.
- * reg_addr < address of the register in the PHY
- * data < Pointer to storage for the Data to be read from the PHY register (passed by reference)
- * Return FNET_ERR on failure, FNET_OK on success
- *************************************************************************/
- fnet_return_t _fnet_usb_phy_read(fnet_netif_t *netif, fnet_uint32_t reg_addr, fnet_uint16_t *data) {
- // fnet_return_t result;
- // fnet_eth_if_t *eth_if = (fnet_eth_if_t *)(netif->netif_prv);
-
- //Read phy into data pointer
- if(_handlePHYRead != NULL){
- _handlePHYRead(reg_addr, data);
- }
-
- return FNET_OK; //Or FNET_OK
- }
-
- /************************************************************************
- * DESCRIPTION: Write a value to a PHY's MII register.
- * reg_addr = address of the register in the PHY
- * data = Data to be writen to the PHY register (passed by reference)
- * Return FNET_ERR on failure (timeout), FNET_OK on success
- *************************************************************************/
- fnet_return_t _fnet_usb_phy_write(fnet_netif_t *netif, fnet_uint32_t reg_addr, fnet_uint16_t data) {
- // fnet_return_t result;
- // fnet_eth_if_t *eth_if = (fnet_eth_if_t *)(netif->netif_prv);
- if(_handlePHYWrite != NULL){
- _handlePHYWrite(reg_addr, data);
- }
- return FNET_OK; //Or FNET_OK
- }
-
- /*******************************************************************************
- * Ethernet interface API structure for PHY.
- ******************************************************************************/
- const fnet_eth_api_t fnet_usb_eth_api = {
- .phy_read = _fnet_usb_phy_read,
- .phy_write = _fnet_usb_phy_write,
- };
-
- #if FNET_CFG_MULTICAST
- /************************************************************************
- * DESCRIPTION: Joins a multicast group on USB interface.
- *************************************************************************/
- fnet_uint32_t fnet_usb_crc_hash(fnet_mac_addr_t multicast_addr) {
- fnet_uint32_t crc = 0xFFFFFFFFu;
- fnet_index_t i;
- fnet_index_t j;
-
- for (i = 0u; i < 6u; i++)
- {
- fnet_uint8_t c = multicast_addr[i];
- for (j = 0u; j < 8u; j++)
- {
- if (((c ^ crc) & 1u) != 0u)
- {
- crc >>= 1;
- c >>= 1;
- crc ^= 0xEDB88320u;
- }
- else
- {
- crc >>= 1;
- c >>= 1;
- }
- }
- }
- return crc;
- }
- void fnet_usb_multicast_join(fnet_netif_t *netif, fnet_mac_addr_t multicast_addr) {
- // fnet_uint32_t reg_value;
- // fnet_uint32_t crc;
- //
- // /* Set the appropriate bit in the hash table */
- // crc = fnet_usb_crc_hash(multicast_addr );
- // crc >>= 26;
- // crc &= 0x3FU;
- //
- // reg_value = (fnet_uint32_t)(0x1U << (crc & 0x1FU));
- if(_handleMulticastJoin != NULL){
- _handleMulticastJoin(netif, multicast_addr);
- }
- }
-
- /************************************************************************
- * DESCRIPTION: Leavess a multicast group on USB interface.
- *************************************************************************/
- void fnet_usb_multicast_leave(fnet_netif_t *netif, fnet_mac_addr_t multicast_addr) {
- // fnet_uint32_t reg_value;
- // fnet_uint32_t crc;
- //
- // /* Set the appropriate bit in the hash table */
- // crc = fnet_usb_crc_hash(multicast_addr );
- // crc >>= 26;
- // crc &= 0x3FU;
- //
- // reg_value = (fnet_uint32_t)(0x1U << (crc & 0x1FU));
- if(_handleMulticastLeave != NULL){
- _handleMulticastLeave(netif, multicast_addr);
- }
- }
- #endif /* FNET_CFG_MULTICAST */
-
- /*****************************************************************************
- * network-interface general API structure.
- ******************************************************************************/
-
- const fnet_netif_api_t fnet_usb_mac_api = {
- .netif_type = FNET_NETIF_TYPE_ETHERNET, /* Data-link type. */
- .netif_hw_addr_size = 6,
- .netif_init = fnet_usb_init, /* Initialization function.*/
- .netif_release = fnet_usb_release, /* Shutdown function.*/
- #if FNET_CFG_IP4
- .netif_output_ip4 = _fnet_eth_output_ip4, /* IPv4 Transmit function.*/
- #endif
- .netif_change_addr_notify = _fnet_eth_change_addr_notify, /* Address change notification function.*/
- .netif_drain = _fnet_eth_drain, /* Drain function.*/
- .netif_get_hw_addr = fnet_usb_get_hw_addr,
- .netif_set_hw_addr = fnet_usb_set_hw_addr,
- .netif_is_connected = fnet_usb_is_connected,
- .netif_get_statistics = fnet_usb_get_statistics,
- #if FNET_CFG_MULTICAST
- #if FNET_CFG_IP4
- .netif_multicast_join_ip4 = _fnet_eth_multicast_join_ip4,
- .netif_multicast_leave_ip4 = _fnet_eth_multicast_leave_ip4,
- #endif
- #if FNET_CFG_IP6
- .netif_multicast_join_ip6 = _fnet_eth_multicast_join_ip6,
- .netif_multicast_leave_ip6 = _fnet_eth_multicast_leave_ip6,
- #endif
- #endif
- #if FNET_CFG_IP6
- .netif_output_ip6 = _fnet_eth_output_ip6, /* IPv6 Transmit function.*/
- #endif
- .eth_api = &fnet_usb_eth_api,
- };
-
- /*****************************************************************************
- * Ethernet Control data structure
- ******************************************************************************/
- static fnet_eth_if_t fnet_usb_usb0_if = {
- // .eth_prv = NULL, /* Points to Ethernet driver-specific control data structure. */
- .eth_mac_number = 0, /* MAC module number. */
- .eth_output = fnet_usb_eth_output, /* Ethernet driver output.*/
- .eth_phy_addr = 0x10, /* Set default PHY address */
- #if FNET_CFG_MULTICAST
- .eth_multicast_join = fnet_usb_multicast_join, /* Ethernet driver join multicast group.*/
- .eth_multicast_leave = fnet_usb_multicast_leave /* Ethernet driver leave multicast group.*/
- #endif
- };
-
- /************************************************************************
- * Network interface structure.
- * DESCRIPTION: Indexes ethernet interface and network API structures. See
- * fnet_netif_prv.h for full specification of this struct.
- *************************************************************************/
- fnet_netif_t fnet_usb0_if = {
- .netif_name = {'e','t','h','0'}, /* Network interface name.*/
- .netif_mtu = 1500, /* Maximum transmission unit.*/
- .netif_prv = &fnet_usb_usb0_if, /* Points to interface specific data structure.*/
- .netif_api = &fnet_usb_mac_api /* Interface API */
- };
-
- fnet_netif_t * fnet_usb_get_netif() {
- return &fnet_usb0_if;
- }
-
- //#endif // !ARDUINO_TEENSY41
|