W5500 driver for mbed OS 5
Dependents: http-webserver-example mbed-os-example-sockets
Fork of W5500Interface by
Diff: W5500Interface.h
- Revision:
- 6:e2ab76b2be07
- Parent:
- 2:06b6f9f7c071
- Child:
- 8:c71c66d43703
diff -r 41393623ead4 -r e2ab76b2be07 W5500Interface.h --- a/W5500Interface.h Thu Jul 06 05:46:17 2017 +0000 +++ b/W5500Interface.h Thu Aug 09 08:10:27 2018 +0000 @@ -1,265 +1,271 @@ -/* W5500 implementation of NetworkInterfaceAPI - * Copyright (c) 2015 ARM Limited - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#ifndef W5500_INTERFACE_H -#define W5500_INTERFACE_H - -#include "NetworkStack.h" -#include "EthInterface.h" - -#include "rtos.h" -#include "WIZnet/W5500.h" - -/** w5500_socket struct - * W5500 socket - */ - -struct w5500_socket { - int fd; - nsapi_protocol_t proto; - void (*callback)(void *); - void *callback_data; - bool connected; -}; - -/** W5500Interface class - * Implementation of the NetworkStack for the W5500 - */ - -class W5500Interface : public NetworkStack, public EthInterface, public WIZnet_Chip -{ -public: - W5500Interface(SPI* spi, PinName cs, PinName reset); - W5500Interface(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset); - - int init(); - int init(uint8_t * mac); - int init(const char* ip, const char* mask, const char* gateway); - int init(uint8_t * mac, const char* ip, const char* mask, const char* gateway); - - /** Start the interface - * @return 0 on success, negative on failure - */ - virtual int connect(); - - /** Stop the interface - * @return 0 on success, negative on failure - */ - virtual int disconnect(); - - /** Get the internally stored IP address - * @return IP address of the interface or null if not yet connected - */ - virtual const char *get_ip_address(); - - /** Get MAC address and fill mac with it. - */ - void get_mac(uint8_t mac[6]) ; - - /** Get the internally stored MAC address - * @return MAC address of the interface - */ - virtual const char *get_mac_address(); - -protected: - /** Opens a socket - * - * Creates a network socket and stores it in the specified handle. - * The handle must be passed to following calls on the socket. - * - * A stack may have a finite number of sockets, in this case - * NSAPI_ERROR_NO_SOCKET is returned if no socket is available. - * - * @param handle Destination for the handle to a newly created socket - * @param proto Protocol of socket to open, NSAPI_TCP or NSAPI_UDP - * @return 0 on success, negative error code on failure - */ - virtual nsapi_error_t socket_open(nsapi_socket_t *handle, nsapi_protocol_t proto); - - /** Close the socket - * - * Closes any open connection and deallocates any memory associated - * with the socket. - * - * @param handle Socket handle - * @return 0 on success, negative error code on failure - */ - virtual nsapi_error_t socket_close(nsapi_socket_t handle); - - /** Bind a specific address to a socket - * - * Binding a socket specifies the address and port on which to recieve - * data. If the IP address is zeroed, only the port is bound. - * - * @param handle Socket handle - * @param address Local address to bind - * @return 0 on success, negative error code on failure. - */ - virtual nsapi_error_t socket_bind(nsapi_socket_t handle, const SocketAddress &address); - - /** Listen for connections on a TCP socket - * - * Marks the socket as a passive socket that can be used to accept - * incoming connections. - * - * @param handle Socket handle - * @param backlog Number of pending connections that can be queued - * simultaneously - * @return 0 on success, negative error code on failure - */ - virtual nsapi_error_t socket_listen(nsapi_socket_t handle, int backlog); - - /** Connects TCP socket to a remote host - * - * Initiates a connection to a remote server specified by the - * indicated address. - * - * @param handle Socket handle - * @param address The SocketAddress of the remote host - * @return 0 on success, negative error code on failure - */ - virtual nsapi_error_t socket_connect(nsapi_socket_t handle, const SocketAddress &address); - - /** Accepts a connection on a TCP socket - * - * The server socket must be bound and set to listen for connections. - * On a new connection, creates a network socket and stores it in the - * specified handle. The handle must be passed to following calls on - * the socket. - * - * A stack may have a finite number of sockets, in this case - * NSAPI_ERROR_NO_SOCKET is returned if no socket is available. - * - * This call is non-blocking. If accept would block, - * NSAPI_ERROR_WOULD_BLOCK is returned immediately. - * - * @param server Socket handle to server to accept from - * @param handle Destination for a handle to the newly created socket - * @param address Destination for the remote address or NULL - * @return 0 on success, negative error code on failure - */ - virtual nsapi_error_t socket_accept(nsapi_socket_t server, - nsapi_socket_t *handle, SocketAddress *address=0); - - /** Send data over a TCP socket - * - * The socket must be connected to a remote host. Returns the number of - * bytes sent from the buffer. - * - * This call is non-blocking. If send would block, - * NSAPI_ERROR_WOULD_BLOCK is returned immediately. - * - * @param handle Socket handle - * @param data Buffer of data to send to the host - * @param size Size of the buffer in bytes - * @return Number of sent bytes on success, negative error - * code on failure - */ - virtual nsapi_size_or_error_t socket_send(nsapi_socket_t handle, - const void *data, nsapi_size_t size); - - /** Receive data over a TCP socket - * - * The socket must be connected to a remote host. Returns the number of - * bytes received into the buffer. - * - * This call is non-blocking. If recv would block, - * NSAPI_ERROR_WOULD_BLOCK is returned immediately. - * - * @param handle Socket handle - * @param data Destination buffer for data received from the host - * @param size Size of the buffer in bytes - * @return Number of received bytes on success, negative error - * code on failure - */ - virtual nsapi_size_or_error_t socket_recv(nsapi_socket_t handle, - void *data, nsapi_size_t size); - - /** Send a packet over a UDP socket - * - * Sends data to the specified address. Returns the number of bytes - * sent from the buffer. - * - * This call is non-blocking. If sendto would block, - * NSAPI_ERROR_WOULD_BLOCK is returned immediately. - * - * @param handle Socket handle - * @param address The SocketAddress of the remote host - * @param data Buffer of data to send to the host - * @param size Size of the buffer in bytes - * @return Number of sent bytes on success, negative error - * code on failure - */ - virtual nsapi_size_or_error_t socket_sendto(nsapi_socket_t handle, const SocketAddress &address, - const void *data, nsapi_size_t size); - - /** Receive a packet over a UDP socket - * - * Receives data and stores the source address in address if address - * is not NULL. Returns the number of bytes received into the buffer. - * - * This call is non-blocking. If recvfrom would block, - * NSAPI_ERROR_WOULD_BLOCK is returned immediately. - * - * @param handle Socket handle - * @param address Destination for the source address or NULL - * @param data Destination buffer for data received from the host - * @param size Size of the buffer in bytes - * @return Number of received bytes on success, negative error - * code on failure - */ - virtual nsapi_size_or_error_t socket_recvfrom(nsapi_socket_t handle, SocketAddress *address, - void *buffer, nsapi_size_t size); - - /** Register a callback on state change of the socket - * - * The specified callback will be called on state changes such as when - * the socket can recv/send/accept successfully and on when an error - * occurs. The callback may also be called spuriously without reason. - * - * The callback may be called in an interrupt context and should not - * perform expensive operations such as recv/send calls. - * - * @param handle Socket handle - * @param callback Function to call on state change - * @param data Argument to pass to callback - */ - virtual void socket_attach(nsapi_socket_t handle, void (*callback)(void *), void *data); - - virtual NetworkStack* get_stack() {return this;} - -private: - char ip_string[20]; - char mask_string[20]; - char gw_string[20]; - char mac_string[20]; - bool ip_set; - - int listen_port; - - void signal_event(nsapi_socket_t handle); - - //w5500 socket management - struct w5500_socket w5500_sockets[MAX_SOCK_NUM]; - w5500_socket* get_sock(int fd); - void init_socks(); - - Thread *_daemon; - void daemon(); - -}; - -#endif +/** + ****************************************************************************** + * @file W5500Interface.h + * @author Bongjun Hur (modified version from Sergei G (https://os.mbed.com/users/sgnezdov/)) + * @brief Header file of the NetworkStack for the W5500 Device + ****************************************************************************** + * @attention + * + * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS + * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE + * TIME. AS A RESULT, WIZnet SHALL NOT BE HELD LIABLE FOR ANY + * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING + * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE + * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS. + * + * <h2><center>© COPYRIGHT 2017,2018 WIZnet Co.,Ltd.</center></h2> + ****************************************************************************** + */ + +#ifndef W5500_INTERFACE_H +#define W5500_INTERFACE_H + +#include "mbed.h" +#include "W5500.h" +//#include "rtos.h" + +/** w5500_socket struct + * W5500 socket + */ + +struct w5500_socket { + int fd; + nsapi_protocol_t proto; + bool connected; + void (*callback)(void *); + void *callback_data; +}; + +/** W5500Interface class + * Implementation of the NetworkStack for the W5500 + */ + +class W5500Interface : public NetworkStack, public EthInterface +{ +public: + W5500Interface(SPI* spi, PinName cs, PinName reset); + W5500Interface(PinName mosi, PinName miso, PinName sclk, PinName cs, PinName reset); + + int init(); + int init(uint8_t * mac); + int init(const char* ip, const char* mask, const char* gateway); + int init(uint8_t * mac, const char* ip, const char* mask, const char* gateway); + + /** Start the interface + * @return 0 on success, negative on failure + */ + virtual int connect(); + + /** Stop the interface + * @return 0 on success, negative on failure + */ + virtual int disconnect(); + + /** Get the internally stored IP address + * @return IP address of the interface or null if not yet connected + */ + virtual const char *get_ip_address(); + + /** Get MAC address and fill mac with it. + */ + void get_mac(uint8_t mac[6]) ; + + /** Get the internally stored MAC address + * @return MAC address of the interface + */ + virtual const char *get_mac_address(); + +protected: + /** Opens a socket + * + * Creates a network socket and stores it in the specified handle. + * The handle must be passed to following calls on the socket. + * + * A stack may have a finite number of sockets, in this case + * NSAPI_ERROR_NO_SOCKET is returned if no socket is available. + * + * @param handle Destination for the handle to a newly created socket + * @param proto Protocol of socket to open, NSAPI_TCP or NSAPI_UDP + * @return 0 on success, negative error code on failure + */ + virtual nsapi_error_t socket_open(nsapi_socket_t *handle, nsapi_protocol_t proto); +// virtual int socket_open(void **handle, nsapi_protocol_t proto); + + /** Close the socket + * + * Closes any open connection and deallocates any memory associated + * with the socket. + * + * @param handle Socket handle + * @return 0 on success, negative error code on failure + */ + virtual nsapi_error_t socket_close(nsapi_socket_t handle); + + /** Bind a specific address to a socket + * + * Binding a socket specifies the address and port on which to recieve + * data. If the IP address is zeroed, only the port is bound. + * + * @param handle Socket handle + * @param address Local address to bind + * @return 0 on success, negative error code on failure. + */ + virtual nsapi_error_t socket_bind(nsapi_socket_t handle, const SocketAddress &address); + + /** Listen for connections on a TCP socket + * + * Marks the socket as a passive socket that can be used to accept + * incoming connections. + * + * @param handle Socket handle + * @param backlog Number of pending connections that can be queued + * simultaneously + * @return 0 on success, negative error code on failure + */ + virtual nsapi_error_t socket_listen(nsapi_socket_t handle, int backlog); + + /** Connects TCP socket to a remote host + * + * Initiates a connection to a remote server specified by the + * indicated address. + * + * @param handle Socket handle + * @param address The SocketAddress of the remote host + * @return 0 on success, negative error code on failure + */ + virtual nsapi_error_t socket_connect(nsapi_socket_t handle, const SocketAddress &address); + + /** Accepts a connection on a TCP socket + * + * The server socket must be bound and set to listen for connections. + * On a new connection, creates a network socket and stores it in the + * specified handle. The handle must be passed to following calls on + * the socket. + * + * A stack may have a finite number of sockets, in this case + * NSAPI_ERROR_NO_SOCKET is returned if no socket is available. + * + * This call is non-blocking. If accept would block, + * NSAPI_ERROR_WOULD_BLOCK is returned immediately. + * + * @param server Socket handle to server to accept from + * @param handle Destination for a handle to the newly created socket + * @param address Destination for the remote address or NULL + * @return 0 on success, negative error code on failure + */ + virtual nsapi_error_t socket_accept(nsapi_socket_t server, + nsapi_socket_t *handle, SocketAddress *address=0); + + /** Send data over a TCP socket + * + * The socket must be connected to a remote host. Returns the number of + * bytes sent from the buffer. + * + * This call is non-blocking. If send would block, + * NSAPI_ERROR_WOULD_BLOCK is returned immediately. + * + * @param handle Socket handle + * @param data Buffer of data to send to the host + * @param size Size of the buffer in bytes + * @return Number of sent bytes on success, negative error + * code on failure + */ + virtual nsapi_size_or_error_t socket_send(nsapi_socket_t handle, + const void *data, nsapi_size_t size); + + /** Receive data over a TCP socket + * + * The socket must be connected to a remote host. Returns the number of + * bytes received into the buffer. + * + * This call is non-blocking. If recv would block, + * NSAPI_ERROR_WOULD_BLOCK is returned immediately. + * + * @param handle Socket handle + * @param data Destination buffer for data received from the host + * @param size Size of the buffer in bytes + * @return Number of received bytes on success, negative error + * code on failure + */ + virtual nsapi_size_or_error_t socket_recv(nsapi_socket_t handle, + void *data, nsapi_size_t size); + + /** Send a packet over a UDP socket + * + * Sends data to the specified address. Returns the number of bytes + * sent from the buffer. + * + * This call is non-blocking. If sendto would block, + * NSAPI_ERROR_WOULD_BLOCK is returned immediately. + * + * @param handle Socket handle + * @param address The SocketAddress of the remote host + * @param data Buffer of data to send to the host + * @param size Size of the buffer in bytes + * @return Number of sent bytes on success, negative error + * code on failure + */ + virtual nsapi_size_or_error_t socket_sendto(nsapi_socket_t handle, const SocketAddress &address, + const void *data, nsapi_size_t size); + + /** Receive a packet over a UDP socket + * + * Receives data and stores the source address in address if address + * is not NULL. Returns the number of bytes received into the buffer. + * + * This call is non-blocking. If recvfrom would block, + * NSAPI_ERROR_WOULD_BLOCK is returned immediately. + * + * @param handle Socket handle + * @param address Destination for the source address or NULL + * @param data Destination buffer for data received from the host + * @param size Size of the buffer in bytes + * @return Number of received bytes on success, negative error + * code on failure + */ + virtual nsapi_size_or_error_t socket_recvfrom(nsapi_socket_t handle, SocketAddress *address, + void *buffer, nsapi_size_t size); + + /** Register a callback on state change of the socket + * + * The specified callback will be called on state changes such as when + * the socket can recv/send/accept successfully and on when an error + * occurs. The callback may also be called spuriously without reason. + * + * The callback may be called in an interrupt context and should not + * perform expensive operations such as recv/send calls. + * + * @param handle Socket handle + * @param callback Function to call on state change + * @param data Argument to pass to callback + */ + virtual void socket_attach(nsapi_socket_t handle, void (*callback)(void *), void *data); + + virtual NetworkStack* get_stack() {return this;} + +private: + WIZnet_Chip _w5500; + + char ip_string[20]; + char mask_string[20]; + char gw_string[20]; + char mac_string[20]; + bool ip_set; + + int listen_port; + + //void signal_event(nsapi_socket_t handle); + //void event(); + + //w5500 socket management + struct w5500_socket w5500_sockets[MAX_SOCK_NUM]; + w5500_socket* get_sock(int fd); + void init_socks(); +/* + Thread *_daemon; + void daemon(); +*/ + +}; + +#endif