Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:a2de37bf5f3d, committed 2015-06-09
- Comitter:
- Marcomissyou
- Date:
- Tue Jun 09 06:04:13 2015 +0000
- Commit message:
- update to WIFI_API_20150524e
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/EthernetInterface/EthernetInterface.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,98 @@
+/* EthernetInterface.h */
+/* Copyright (C) 2012 mbed.org, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef ETHERNETINTERFACE_H_
+#define ETHERNETINTERFACE_H_
+/*Tsungta
+#if !defined(TARGET_LPC1768) && !defined(TARGET_LPC4088) && !defined(TARGET_K64F) && !defined(TARGET_RZ_A1H)
+#error The Ethernet Interface library is not supported on this target
+#endif
+
+#include "rtos.h"
+#include "lwip/netif.h"
+*/
+ /** Interface using Ethernet to connect to an IP-based network
+ *
+ */
+class EthernetInterface {
+public:
+ /** Initialize the interface with DHCP.
+ * Initialize the interface and configure it to use DHCP (no connection at this point).
+ * \return 0 on success, a negative number on failure
+ */
+ static int init(); //With DHCP
+
+ /** Initialize the interface with a static IP address.
+ * Initialize the interface and configure it with the following static configuration (no connection at this point).
+ * \param ip the IP address to use
+ * \param mask the IP address mask
+ * \param gateway the gateway to use
+ * \return 0 on success, a negative number on failure
+ */
+ static int init(const char* ip, const char* mask, const char* gateway);
+
+ /** Connect
+ * Bring the interface up, start DHCP if needed.
+ * \param timeout_ms timeout in ms (default: (15)s).
+ * \return 0 on success, a negative number on failure
+ */
+ static int connect(unsigned int timeout_ms=35000);
+
+ /** Disconnect
+ * Bring the interface down
+ * \return 0 on success, a negative number on failure
+ */
+ static int disconnect();
+
+ /** Get the MAC address of your Ethernet interface
+ * \return a pointer to a string containing the MAC address
+ */
+ static char* getMACAddress();
+
+ /** Get the IP address of your Ethernet interface
+ * \return a pointer to a string containing the IP address
+ */
+ static char* getIPAddress();
+
+ /** Get the Gateway address of your Ethernet interface
+ * \return a pointer to a string containing the Gateway address
+ */
+ static char* getGateway();
+
+ /** Get the Network mask of your Ethernet interface
+ * \return a pointer to a string containing the Network mask
+ */
+ static char* getNetworkMask();
+};
+
+#include "TCPSocketConnection.h"
+#include "TCPSocketServer.h"
+
+#include "Endpoint.h"
+#include "UDPSocket.h"
+
+// following are added by Tsungta
+#include "stdint.h"
+#include "string.h"
+typedef struct ip_addr ip_addr_t;
+struct ip_addr {
+ uint32_t addr;
+};
+
+#endif /* ETHERNETINTERFACE_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/EthernetInterface/Socket/Endpoint.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,84 @@
+/* Copyright (C) 2012 mbed.org, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#ifndef ENDPOINT_H
+#define ENDPOINT_H
+
+//following are added by Tsungta
+#include "stdint.h"
+/* For compatibility with BSD code */
+struct in_addr {
+ uint32_t s_addr;
+};
+
+struct sockaddr_in {
+ uint8_t sin_len;
+ uint8_t sin_family;
+ uint16_t sin_port;
+ struct in_addr sin_addr;
+ char sin_zero[8];
+};
+//Tsungta
+class UDPSocket;
+
+/*
+IP Endpoint (address, port)
+*/
+class Endpoint {
+ friend class UDPSocket;
+
+private:
+ char UDP_host[15];
+ int UDP_port;
+
+public:
+ /* IP Endpoint (address, port)
+ */
+ Endpoint(void);
+
+ ~Endpoint(void);
+
+ /* Reset the address of this endpoint
+ */
+ void reset_address(void);
+
+ /* Set the address of this endpoint
+ \param host The endpoint address (it can either be an IP Address or a hostname that will be resolved with DNS).
+ \param port The endpoint port
+ \return 0 on success, -1 on failure (when an hostname cannot be resolved by DNS).
+ */
+ int set_address(const char* host, const int port);
+
+ /* Get the IP address of this endpoint
+ \return The IP address of this endpoint.
+ */
+ char* get_address(void);
+
+ /* Get the port of this endpoint
+ \return The port of this endpoint
+ */
+ int get_port(void);
+
+protected:
+ char _ipAddress[17];
+ struct sockaddr_in _remoteHost;
+
+};
+
+
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/EthernetInterface/Socket/Socket.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,118 @@
+/* Copyright (C) 2012 mbed.org, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#ifndef SOCKET_H_
+#define SOCKET_H_
+
+//#include "lwip/sockets.h"
+//#include "lwip/netdb.h"
+
+//following are added by Tsungta
+#include <stddef.h> /* for size_t */
+#include "stdint.h"
+#define socklen_t uint32_t
+//Tsungta
+
+struct timeval {
+ long tv_sec; /* seconds */
+ long tv_usec; /* and microseconds */
+};
+
+//DNS
+inline struct hostent *gethostbyname(const char *name) {
+// return lwip_gethostbyname(name);
+ return 0;
+}
+
+inline int gethostbyname_r(const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop) {
+// return lwip_gethostbyname_r(name, ret, buf, buflen, result, h_errnop);
+ return 0;
+
+}
+
+class TimeInterval;
+
+/** Socket file descriptor and select wrapper
+ */
+class Socket {
+public:
+ /** Socket
+ */
+ Socket();
+
+ /** Set blocking or non-blocking mode of the socket and a timeout on
+ blocking socket operations
+ \param blocking true for blocking mode, false for non-blocking mode.
+ \param timeout timeout in ms [Default: (1500)ms].
+ */
+ void set_blocking(bool blocking, unsigned int timeout=1500);
+
+// /** Set socket options
+// \param level stack level (see: lwip/sockets.h)
+// \param optname option ID
+// \param optval option value
+// \param socklen_t length of the option value
+// \return 0 on success, -1 on failure
+// */
+// int set_option(int level, int optname, const void *optval, socklen_t optlen);
+//
+// /** Get socket options
+// \param level stack level (see: lwip/sockets.h)
+// \param optname option ID
+// \param optval buffer pointer where to write the option value
+// \param socklen_t length of the option value
+// \return 0 on success, -1 on failure
+// */
+// int get_option(int level, int optname, void *optval, socklen_t *optlen);
+
+ /** Close the socket
+ \param shutdown free the left-over data in message queues
+ */
+ int close(bool shutdown=true);
+
+ ~Socket();
+
+protected:
+ int _sock_fd;
+ int init_socket(int type);
+
+ int wait_readable(TimeInterval& timeout);
+ int wait_writable(TimeInterval& timeout);
+
+ bool _blocking;
+ unsigned int _timeout;
+
+private:
+ int select(struct timeval *timeout, bool read, bool write);
+};
+
+/** Time interval class used to specify timeouts
+ */
+class TimeInterval {
+ friend class Socket;
+
+public:
+ /** Time Interval
+ \param ms time interval expressed in milliseconds
+ */
+ TimeInterval(unsigned int ms);
+
+private:
+ struct timeval _time;
+};
+
+#endif /* SOCKET_H_ */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/EthernetInterface/Socket/TCPSocketConnection.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,81 @@
+/* Copyright (C) 2012 mbed.org, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef TCPSOCKET_H
+#define TCPSOCKET_H
+
+#include "Socket.h"
+#include "Endpoint.h"
+
+/**
+TCP socket connection
+*/
+class TCPSocketConnection : public Socket, public Endpoint {
+ friend class TCPSocketServer;
+
+public:
+ /** TCP socket connection
+ */
+ TCPSocketConnection();
+
+ /** Connects this TCP socket to the server
+ \param host The host to connect to. It can either be an IP Address or a hostname that will be resolved with DNS.
+ \param port The host's port to connect to.
+ \return 0 on success, -1 on failure.
+ */
+ int connect(const char* host, const int port);
+
+ /** Check if the socket is connected
+ \return true if connected, false otherwise.
+ */
+ bool is_connected(void);
+
+ /** Send data to the remote host.
+ \param data The buffer to send to the host.
+ \param length The length of the buffer to send.
+ \return the number of written bytes on success (>=0) or -1 on failure
+ */
+ int send(char* data, int length);
+
+ /** Send all the data to the remote host.
+ \param data The buffer to send to the host.
+ \param length The length of the buffer to send.
+ \return the number of written bytes on success (>=0) or -1 on failure
+ */
+ int send_all(char* data, int length);
+
+ /** Receive data from the remote host.
+ \param data The buffer in which to store the data received from the host.
+ \param length The maximum length of the buffer.
+ \return the number of received bytes on success (>=0) or -1 on failure
+ */
+ int receive(char* data, int length);
+
+ /** Receive all the data from the remote host.
+ \param data The buffer in which to store the data received from the host.
+ \param length The maximum length of the buffer.
+ \return the number of received bytes on success (>=0) or -1 on failure
+ */
+ int receive_all(char* data, int length);
+
+private:
+ bool _is_connected;
+
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/EthernetInterface/Socket/TCPSocketServer.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,52 @@
+/* Copyright (C) 2012 mbed.org, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+#ifndef TCPSOCKETSERVER_H
+#define TCPSOCKETSERVER_H
+
+#include "Socket.h"
+#include "TCPSocketConnection.h"
+
+/** TCP Server.
+ */
+class TCPSocketServer : public Socket {
+ public:
+ /** Instantiate a TCP Server.
+ */
+ TCPSocketServer();
+
+ /** Bind a socket to a specific port.
+ \param port The port to listen for incoming connections on.
+ \return 0 on success, -1 on failure.
+ */
+ int bind(int port);
+
+ /** Start listening for incoming connections.
+ \param backlog number of pending connections that can be queued up at any
+ one time [Default: 1].
+ \return 0 on success, -1 on failure.
+ */
+ int listen(int backlog=1);
+
+ /** Accept a new connection.
+ \param connection A TCPSocketConnection instance that will handle the incoming connection.
+ \return 0 on success, -1 on failure.
+ */
+ int accept(TCPSocketConnection& connection);
+};
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/EthernetInterface/Socket/UDPSocket.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,75 @@
+/* Copyright (C) 2012 mbed.org, MIT License
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
+ * and associated documentation files (the "Software"), to deal in the Software without restriction,
+ * including without limitation the rights to use, copy, modify, merge, publish, distribute,
+ * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all copies or
+ * substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
+ * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef UDPSOCKET_H
+#define UDPSOCKET_H
+
+#include "Socket.h"
+#include "Endpoint.h"
+
+/**
+UDP Socket
+*/
+class UDPSocket : public Socket {
+
+public:
+ /** Instantiate an UDP Socket.
+ */
+ UDPSocket();
+
+ /** Init the UDP Client Socket without binding it to any specific port
+ \return 0 on success, -1 on failure.
+ */
+ int init(void);
+
+ /** Bind a UDP Server Socket to a specific port
+ \param port The port to listen for incoming connections on
+ \return 0 on success, -1 on failure.
+ */
+ int bind(int port);
+
+// /** Join the multicast group at the given address
+// \param address The address of the multicast group
+// \return 0 on success, -1 on failure.
+// */
+// int join_multicast_group(const char* address);
+
+ /** Set the socket in broadcasting mode
+ \return 0 on success, -1 on failure.
+ */
+ int set_broadcasting(bool broadcast=true);
+
+ /** Send a packet to a remote endpoint
+ \param remote The remote endpoint
+ \param packet The packet to be sent
+ \param length The length of the packet to be sent
+ \return the number of written bytes on success (>=0) or -1 on failure
+ */
+ int sendTo(Endpoint &remote, char *packet, int length);
+
+ /** Receive a packet from a remote endpoint
+ \param remote The remote endpoint
+ \param buffer The buffer for storing the incoming packet data. If a packet
+ is too long to fit in the supplied buffer, excess bytes are discarded
+ \param length The length of the buffer
+ \return the number of received bytes on success (>=0) or -1 on failure
+ */
+ int receiveFrom(Endpoint &remote, char *buffer, int length);
+};
+
+#endif
Binary file EthernetInterface/Socket/endpoint.o has changed
Binary file EthernetInterface/Socket/socket.o has changed
Binary file EthernetInterface/Socket/tcpsocketconnection.o has changed
Binary file EthernetInterface/Socket/tcpsocketserver.o has changed
Binary file EthernetInterface/Socket/udpsocket.o has changed
Binary file EthernetInterface/ethernetinterface.o has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/README.md Tue Jun 09 06:04:13 2015 +0000 @@ -0,0 +1,42 @@ +# NNN40 WI-FI SDK version 20150524, release at 2015/5/24 +This is the export repo for the WIFI_API provided by Delta Electronics, Inc. + +# Fixed bug in previous version +* Fix wifi inti fail (timing issue) issue +* Change type of ap_ssid and ap_pw to char* +* Command getNetworkMask() and getGateway() +* Bug fix: is_connect() return 0 when close() function is called +* Bug fix: listen() return 0 +* Change TCP ERROR retry to 3 times +* WIFI SPI interface change to SPI0 +* WIFI MAC Address readout from Flash +* UART conflict bug fix +* Fix is_connect return error when ethernet is disconnected +* Set TCP maximum payload to 512 bytes +* Set UDP maximum payload to 256 bytes +* Fix UDP send_to length issue +* Fix send_to return error when client socket is colsed +* Set IP 255.255.255.255 as reserved +* Fix Switch return error when ethernet is init +* Fix bug in spi_flash.c for data access +* Fix bind return error + +# Fixed bug in this version +* Support DNS client for TCP/UDP +* Fast AP re-connection is performed automatically, user can call EthernetInterface.disconnect() to have lowest power consumption of 4uA, then call init and connected to previous AP for less than 4 sec + +# Supported functionalities +Currently supported functionalities include: +* IEEE 802.11 b/g/n connectivity +* Station (STA) infrastructure mode +* WEP/WPA/WPA2 security +* DHCP Client and Static IPv4 addressing +* TCP Server/Client +* UDP Server/Client + +# Getting Started +This WIFI API is meant to be used on Delta NNN40 EVB. +A good starting point are these pages: +* [WI-FI SDK User Guide](document come with WI-FI SDK deliver) for system overview, APIs summary and sample code +* [EthernetInterface - Handbook](http://developer.mbed.org/handbook/Ethernet-Interface) a simple API that you will need to connect to the internet. +* [Socket - Handbook](http://developer.mbed.org/handbook/Socket) a simple and consistent way to communicate using bsd-like TCP and UDP sockets over WI-FI \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFIDevice.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,73 @@
+#ifndef WIFIDEVICE_H_
+#define WIFIDEVICE_H_
+
+#include "nmi_wlan_if.h"
+#include "nmi_wlan.h"
+
+ /** Interface using WI-FI to connect to Ethernet
+ *
+ */
+class WIFIDevice {
+public:
+
+ /** Set WIFI in sleep mode.
+ * Disable WIFI and set into sleep mode to conserve energy (no WIFI function is available at this point).
+ * \return 0 on success, a negative number on failure
+ */
+ int sleep(void);
+
+ /** Set the position of embedded RF switch.
+ * Set the position of RF switch between WIFI and BLE.
+ * \param position set 1 on WIFI to use, set 0 on BLE to use.
+ * \return 0 on success, a negative number on failure
+ */
+ int setSwitch(int position);
+
+ /** Get the position of embedded RF switch.
+ * Get the current position of RF switch
+ * \return get 1 on WIFI to use, get 0 on BLE to use
+ */
+ int getSwitch(void);
+
+// /** Perform one time WIFI scan.
+// * Scan for available access point on all channels.
+// * \return number of scanned WIFI access point
+// */
+// int oneTimeScan(void);
+//
+// /** Get the scanned access point information.
+// * Get the scanned associated access point information table on least oneTimeScan.
+// * \param index query the information of result table in index number [0~19]
+// * \param SSID access point SSID name on query index
+// * \param RSSI access point RSSI (Received Signal Strength Indicator) on query index
+// * \param security access point security type on query index, get 0 on no security, 1 on WEP, 2 on WPA, 3 on WPA2
+// * \return 0 on success, a negative number on failure when empty
+// */
+// int getScanResult(uint8_t index, uint8_t* SSID, int* RSSI, uint8_t security);
+
+ /** Set network connection in priority.
+ * Set SSID, password and priority to connect.
+ * \param SSID name of access point to connect
+ * \param PW password of the given SSID
+ * \param priority range from 0 to 2, set 0 for the highest priority
+ */
+ void setNetwork(char* SSID, char* PW, uint8_t priority);
+
+// /** Get the status of embedded WIFI chipset.
+// * Get the current status of embedded WIFI chipset
+// * \return get 1 on WIFI to use, get 0 on BLE to use
+// */
+// int getStatus(void);
+
+// /** Set WIFI output power.
+// * Set WIFI output power level
+// * \param output power level
+// * \return 0 on success, a negative number on failure
+// */
+// int setTxPower(uint8_t powerIndex);
+
+};
+
+//#include "EthernetInterface.h"
+
+#endif /* WIFIDEVICE_H_ */
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/nmc/cyntec_dns.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,150 @@
+#ifndef CYNTEC_DNS_H
+#define CYNTEC_DNS_H
+
+#include <stdint.h>
+
+class DnsClient
+{
+private:
+
+// class Hander {
+// private:
+
+// uint16_t *handerMsg = 0;
+// uint16_t *transactionId = 0; //A 16 bit identifier assigned by the program that generates any kind of query.
+// uint16_t *handerSecondRow = 0;
+// uint16_t *qdCount = 0;
+// uint16_t *anCount = 0;
+// uint16_t *nsCount = 0;
+// uint16_t *arCount = 0;
+
+// public:
+// Hander();
+// Hander(uint16_t *msg);
+// uint16_t getTransactionId();
+// uint8_t getQueryOrRespone();
+// uint8_t getOpCode();
+// uint8_t getAuthoritativeAnswer();
+// uint8_t getTrunCation();
+// uint8_t getRecursionDesired();
+// uint8_t getRecursionAvailable();
+// uint8_t getZ();
+// uint8_t getResponseCode();
+// uint16_t *getQdCountget();
+// uint16_t *getAnCount();
+// uint16_t *getNsCount();
+// uint16_t *getArCount();
+// };
+
+// class Question {
+// private:
+// Question(char *msg);
+// char *questionMsg = 0;
+// char *QName = 0; // a domain name represented as a sequence of labels.
+// char *QType[2]; //a two octet code which specifies the type of the query.
+// char *QClass[2]; //a two octet code that specifies the class of the query.
+// public:
+// const char* getQName();
+// const char* getQType();
+// const char* getQClass();
+// };
+
+// class RRecord{
+// private:
+// RRecord(char *msg);
+// char *rRecordMsg;
+// char *RRName; // a domain name to which this resource record pertains.
+// char *RRType[2]; //two octets containing one of the RR type codes
+// char *RRClass[2]; //two octets which specify the class of the data in the RDATA field.
+// char *RRTll[4]; // a domain name represented as a sequence of labels.
+// char *RdLength[2]; //an unsigned 16 bit integer that specifies the length in octets of the RDATA field.
+// char *RData[2]; //a variable length string of octets that describes the resource.
+// public:
+// const char* getRRName();
+// const char* getRRType();
+// const char* getRRClass();
+// const char* getRRTll();
+// const char* getRdLength();
+// const char* getRData();
+// };
+
+ const char *queryMsg;
+ char *queryEcMsg;
+ short queryId;
+ int querySize;
+
+ char *answerMsg;
+ short answerId;
+ int iPCounters;
+ char **answerIPs;
+// Hander *ptrHander = 0;
+// Question *ptrQuestion = 0;
+// RRecord *ptrRRcoed = 0;
+
+ /**
+ * QR (1 bit)
+ * query (0), or a response (1).
+ *
+ * OpCode (4 bits)
+ * 0 a standard query (QUERY)
+ * 1 an inverse query (IQUERY)
+ * 2 a server status request (STATUS)
+ * 3-15 reserved for future use
+ *
+ * Authoritative Answer (1 bit)
+ * this bit is valid in responses,
+ * and specifies that the responding name server is an
+ * authority for the domain name in question section.
+ *
+ * TrunCation (1 bit)
+ * specifies that this message was truncated
+ * due to length greater than that permitted on the
+ * transmission channel.
+ *
+ * Recursion Desired (1 bit)
+ * this bit may be set in a query and is copied into the response.
+ *
+ * Recursion Available (1 bit)
+ * this be is set or cleared in a
+ * response, and denotes whether recursive query support is
+ * available in the name server.
+ *
+ * Z (3 bits)
+ * Reserved for future use.
+ *
+ * Response code (4 bits)
+ * this 4 bit field is set as part of responses.
+ */
+
+ char *queryEncode();
+ void queryAddHeader(char *startChar);
+ void queryAddQuestion(char *startChar);
+// void queryAddRRFrom(char *dst);
+
+ short parseAnswerId(char *answerMsg);
+ char **parseAnswerIPs(char *answerMsg);
+
+
+public:
+ DnsClient(const char *msg);
+ ~DnsClient();
+
+ int getQuerySize();
+ char *getQueryEncode();
+ short getQueryID();
+
+ void *answerDecode(char *msg);
+ short getAnswerId();
+ int getIpCounters();
+ const char** getAnswerIPs();
+
+// void *responseDecode();
+// Hander *getHander();
+// Question *getQuestion();
+// RRecord *getRRecord();
+
+};
+
+#endif // CYNTEC_DNS_H
+
+
Binary file WIFI_Driver/nmc/cyntec_dns.o has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/nmc/nmi_config.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,16 @@
+#ifndef __NMI_CONFIG_H__
+#define __NMI_CONFIG_H__
+
+
+#define NMI_WLAN_DRIVER_DBG
+#define NMI_WLAN_MGMT_DBG
+
+
+typedef struct{
+ uint8_t *au8Ssid;
+ uint8_t *pu8AuthCred;
+ uint8_t u8AuthType;
+} tstrM2mAp;
+
+
+#endif /* __NMI_CONFIG_H__ */
Binary file WIFI_Driver/nmc/nmi_spi.o has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WIFI_Driver/nmc/nmi_type.h Tue Jun 09 06:04:13 2015 +0000 @@ -0,0 +1,42 @@ +//////////////////////////////////////////////////////////////////////////// +// +// Copyright (c) Newport Media Inc. All rights reserved. +// +// Module Name: nmi_type.h +// +// +////////////////////////////////////////////////////////////////////////////// +#ifndef NMI_TYPE_H +#define NMI_TYPE_H + +/******************************************** + + Type Defines + +********************************************/ + +#if defined(_LINUX_) + +#include <asm/types.h> + +#else + +typedef unsigned char u8; +typedef signed char s8; +typedef unsigned short u16; +typedef short s16; +typedef unsigned int u32; +typedef int s32; + + +#endif + + +#include <stdint.h>//Ryan +#include <stdio.h>//Ryan +#include <stdarg.h>//Ryan +#include <string.h>//Ryan +#include <stdlib.h>//Ryan + + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/nmc/nmi_wifi_adapter.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,638 @@
+/*
+ * wpa_supplicant/hostapd / OS specific functions
+ * Copyright (c) 2005-2006, Jouni Malinen <j@w1.fi>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * Alternatively, this software may be distributed under the terms of BSD
+ * license.
+ *
+ * See README and COPYING for more details.
+ */
+
+#ifndef __NMI_WIFI_ADAPER_H__
+#define __NMI_WIFI_ADAPER_H__
+
+#include <stddef.h>
+#include <stdarg.h>
+
+//#include "os_api.h"
+
+//#include "wifisupp_api.h" //ksong 2012.8.28
+
+#include <stdbool.h>
+#include <stdint.h>
+ /* exact-width signed integer types */
+typedef signed char int8;
+typedef signed short int int16;
+typedef signed int int32;
+typedef signed __int64 int64;
+
+typedef signed char sint8;
+typedef signed short int sint16;
+typedef signed int sint32;
+typedef signed __int64 sint64;
+
+ /* exact-width unsigned integer types */
+typedef unsigned char uint8;
+typedef unsigned short int uint16;
+typedef unsigned int uint32;
+typedef unsigned __int64 uint64;
+
+//#include "nmi_wlan_if.h" command by Tsungta
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*******************************************************************************/
+//#define GPIO_WIFI_IRQ_ID 0
+
+
+#define NMI_INVALID_THREAD_ID SCI_INVALID_BLOCK_ID
+
+
+/********************************************
+
+ Debug Flags
+
+********************************************/
+#define NMI_INIT 0x00000001
+#define NMI_ERR 0x00000002
+#define NMI_TX 0x00000004
+#define NMI_INTR 0x00000008
+#define NMI_RX 0x00000010
+#define NMI_SCAN 0x00000020
+#define NMI_JOIN 0x00000040
+#define NMI_STATUS 0x00000080
+#define NMI_POLL 0x00000100
+#define NMI_IF 0x00000200
+#define NMI_ALL 0xffffffff
+
+/*******************************************************************************/
+
+typedef unsigned char BOOLEAN;
+typedef long os_time_t;
+typedef unsigned long NMI_TCPIP_IP_ADDR_T;
+typedef unsigned long NMI_TCPIP_NET_ID_T;
+typedef unsigned char NMI_BOOLEAN_T;
+typedef unsigned long NMI_BLOCK_ID;
+typedef void * NMI_SCI_EVENT_GROUP_PTR;
+typedef void * NMI_SCI_MUTEX_PTR;
+typedef void * NMI_SCI_SEMAPHORE_PTR;
+
+#if 0//Ryan
+typedef enum
+{
+ NMI_MESSAGE_START = WIFISUPP_SIG_CUSTOM_START,
+ NMI_MESSAGE_RESTART_MAC,
+ NMI_MESSAGE_POWER_SAVE,
+ NMI_MESSAGE_SLEEP,
+ NMI_MESSAGE_MAX = WIFISUPP_SIG_CUSTOM_END
+}NMI_MESSAGE_E;
+#endif
+
+//#define CFLWCHAR unsigned short // uni-code char
+#define SFS_MAX_PATH 255
+
+// EAPOL data receive upcall function
+typedef void (*NMI_TCPIP_EAPOL_RX_CALLBACK_FPTR)(
+ const unsigned char* data_ptr, /* EAPOL data pointer */
+ unsigned int data_len, /* EAPOL data length */
+ const unsigned char* src_mac_ptr, /* source mac address pointer */
+ unsigned int src_mac_len, /* source mac length, unit: byte for ethernet, it should be 6 */
+ NMI_TCPIP_NET_ID_T net_id ); /* net interface ID */
+
+
+// TCPIP interface error enum
+typedef enum
+{
+ NMI_TCPIP_ERROR_OK = 0, /* no error */
+ NMI_TCPIP_ERROR_INVALPARAM, /* invalid parameter */
+ NMI_TCPIP_ERROR_INVALNETID, /* invalid net id */
+ NMI_TCPIP_ERROR_MEMALLOC, /* memory alloc fail */
+ NMI_TCPIP_ERROR_LOGICAL, /* calling or running logical error */
+ NMI_TCPIP_ERROR_TIMEOUT, /* time out */
+ NMI_TCPIP_ERROR_MAX
+} NMI_TCPIP_ERROR_E;
+
+
+typedef enum
+{
+ NMI_TCPIP_PKTTYPE_NULL = 0,
+ NMI_TCPIP_PKTTYPE_IP, /* packet is encapsulated as IP */
+ NMI_TCPIP_PKTTYPE_ETHER, /* packet is encapsulated as Ethernet */
+ NMI_TCPIP_PKTTYPE_MAX
+} NMI_TCPIP_PACKET_TYPE_E;
+
+
+// TCPIP net interface IP addresses
+// NOTES : IP addresses should be in Big-Ending
+typedef struct _netif_ipaddr_tag
+{
+ NMI_TCPIP_IP_ADDR_T ipaddr; /* host IP */
+ NMI_TCPIP_IP_ADDR_T snmask; /* subnet mask */
+ NMI_TCPIP_IP_ADDR_T gateway; /* gateway */
+ NMI_TCPIP_IP_ADDR_T dns1; /* primary DNS */
+ NMI_TCPIP_IP_ADDR_T dns2; /* secondary DNS */
+} NMI_TCPIP_NETIF_IPADDR_T;
+
+// TCPIP net interface hardware address
+typedef struct _netif_haddr_tag
+{
+ unsigned char* addr_ptr; /* hard address pointer */
+ unsigned int addr_len; /* hard address length, unit: byte */
+} NMI_TCPIP_NETIF_HADDR_T;
+
+
+// TCPIP packet info struct
+typedef struct _packet_info_tag
+{
+ unsigned char* data_ptr; /* data pointer */
+ unsigned int data_len; /* data length - full packet encapsulation length */
+ NMI_TCPIP_NET_ID_T net_id; /* net interface ID */
+} NMI_TCPIP_PACKET_INFO_T;
+
+
+typedef unsigned int (*NMI_TCPIP_TX_REQ_FPTR)(
+ const NMI_TCPIP_PACKET_INFO_T* pkt_info_ptr );
+
+// TCPIP receive flow control setting function
+typedef void (*NMI_TCPIP_RX_FLCTRL_FPTR)(
+ NMI_BOOLEAN_T is_set, /* flow control flag: TRUE - set; FALSE - not set */
+ NMI_TCPIP_NET_ID_T net_id ); /* net interface ID */
+
+
+
+// TCPIP net interface configuration struct
+typedef struct _netif_cfg_tag
+{
+ NMI_TCPIP_PACKET_TYPE_E pkt_type; /* packet type between tcpip and low layer */
+ NMI_TCPIP_TX_REQ_FPTR tx_req_fptr; /* tx function pointer for data sending from tcpip to low layer */
+ NMI_BOOLEAN_T is_async_tx; /* tx mode: TRUE - async send; FALSE - sync send */
+ NMI_TCPIP_NETIF_IPADDR_T saddr; /* soft (IP) address */
+ NMI_TCPIP_NETIF_HADDR_T haddr; /* hard (MAC) address */
+ unsigned int mtu; /* MTU of the low layer */
+ unsigned int tx_rate; /* max tx send rate - it's useful in tx flow control */
+ NMI_TCPIP_RX_FLCTRL_FPTR rx_flctrl_fptr; /* rx flow control function pointer, this is optional, can be NULL */
+ char* netif_name_ptr; /* net interface name, given by low layer, it can be NULL, but we recommend caller set one for better debug */
+} NMI_TCPIP_NETIF_CFG_T;
+
+
+/*******************************************************************************/
+
+/**--------------------------------------------------------------------------*
+ ** MACRO DEFINITION *
+ **--------------------------------------------------------------------------*/
+#define NMI_WIFISUPP_BSSID_LEN 6 //the length of BSSID in bytes
+#define NMI_WIFISUPP_SSID_MAX_LEN 32 //the MAX length of SSID in bytes
+#define NMI_WIFISUPP_WEP_IV_LEN 3 //the length of IV in WEP
+#define NMI_WIFISUPP_WEP_64BITS_KEY_LEN 8 //the length of 64bits WEP key
+#define NMI_WIFISUPP_WEP_128BITS_KEY_LEN 16 //the length of 128bits WEP key
+#define NMI_WIFISUPP_WPA_PSK_LEN 64 //the length of WPA PSK
+#ifdef WLAN_SUPPORT
+#define NMI_WIFISUPP_WAPI_PSK_LEN 64 //the length of WAPI PSK
+#endif
+#define NMI_WIFISUPP_MAX_FILE_PATH_LEN SFS_MAX_PATH //the MAX file path supported
+#define NMI_WIFISUPP_WEP_KEY_ID_MAX 4 //the max WEP key ID
+
+#define NMI_WIFISUPP_MAX_USERNAME_LEN 32
+#define NMI_WIFISUPP_MAX_PSW_LEN 32
+/**--------------------------------------------------------------------------*
+ ** typedef *
+ **--------------------------------------------------------------------------*/
+/*---------------------------------------------------------------------------*/
+/* Enum */
+/*---------------------------------------------------------------------------*/
+typedef enum
+{
+ NMI_WIFISUPP_NETWORK_MODE_INFRASTRUCTURE, //infrastructure
+ NMI_WIFISUPP_NETWORK_MODE_ADHOC, //ad-hoc
+ NMI_WIFISUPP_NETWORK_MODE_MAX
+} NMI_WIFISUPP_NETWORK_MODE_E;
+
+typedef enum
+{
+ NMI_WIFISUPP_RESULT_SUCC, //success
+ NMI_WIFISUPP_RESULT_FAIL, //fail
+ NMI_WIFISUPP_RESULT_NOT_FOUND, //the AP is not found
+ NMI_WIFISUPP_RESULT_TIMEOUT, //operation time out
+ NMI_WIFISUPP_RESULT_RESTRICTED, //connection is restricted
+ NMI_WIFISUPP_WRONG_PASSPHRASE,
+ NMI_WIFISUPP_RESULT_MAX
+} NMI_WIFISUPP_RESULT_E;
+
+typedef enum
+{
+ NMI_WIFISUPP_ENCRYP_PROTOCOL_OPENSYS, //open system
+ NMI_WIFISUPP_ENCRYP_PROTOCOL_WEP, //WEP
+ NMI_WIFISUPP_ENCRYP_PROTOCOL_WPA, //WPA
+ NMI_WIFISUPP_ENCRYP_PROTOCOL_WPA2, //WPA2
+ NMI_WIFISUPP_ENCRYP_PROTOCOL_WAPI, //WAPI
+ NMI_WIFISUPP_ENCRYP_PROTOCOL_MAX
+}NMI_WIFISUPP_ENCRYP_PROTOCOL_E;
+
+typedef enum
+{
+ NMI_WIFISUPP_CIPHER_TKIP, //TKIP
+ NMI_WIFISUPP_CIPHER_CCMP, //CCMP
+ NMI_WIFISUPP_CIPHER_WEP, //wep
+ NMI_WIFISUPP_CIPHER_SMS4, //WAPI SMS4
+ NMI_WIFISUPP_CIPHER_MAX
+}NMI_WIFISUPP_CIPHER_E;
+
+typedef enum
+{
+ NMI_WIFISUPP_WEP_KEY_TYPE_64BITS, //64bits_type WEP Key
+ NMI_WIFISUPP_WEP_KEY_TYPE_128BITS, //128bits_type WEP Key
+ NMI_WIFISUPP_WEP_KEY_TYPE_MAX
+}NMI_WIFISUPP_WEP_KEY_TYPE_E;
+
+typedef enum
+{
+ NMI_WIFISUPP_WPA_CREDENTIAL_TYPE_PSK, //WPA using PSK
+ NMI_WIFISUPP_WPA_CREDENTIAL_TYPE_EAP, //WPA using EAP 802.1X
+ NMI_WIFISUPP_WPA_CREDENTIAL_TYPE_MAX
+}NMI_WIFISUPP_WPA_CREDENTIAL_TYPE_E;
+
+typedef enum
+{
+ NMI_WIFISUPP_WAPI_CREDENTIAL_TYPE_PSK, //WAPI using PSK
+ NMI_WIFISUPP_WAPI_CREDENTIAL_TYPE_CER, //WAPI using certificate
+ NMI_WIFISUPP_WAPI_CREDENTIAL_TYPE_MAX
+}NMI_WIFISUPP_WAPI_CREDENTIAL_TYPE_E;
+
+typedef enum
+{
+ NMI_WIFISUPP_CREDENTIAL_TYPE_PSK,
+ NMI_WIFISUPP_CREDENTIAL_TYPE_RADIUS,
+ NMI_WIFISUPP_CREDENTIAL_TYPE_CER,
+ NMI_WIFISUPP_CREDENTIAL_TYPE_MAX
+}NMI_WIFISUPP_CREDENTIAL_TYPE_E;
+
+
+typedef enum
+{
+ NMI_WIFISUPP_WPA_EAP_TYPE_TLS, //EAP using TLS
+ NMI_WIFISUPP_WPA_EAP_TYPE_TTLS, //EAP using TTLS
+ NMI_WIFISUPP_WPA_EAP_TYPE_PEAP, //EAP using PEAP
+ NMI_WIFISUPP_WPA_EAP_TYPE_LEAP, //EAP using LEAP
+ NMI_WIFISUPP_WPA_EAP_TYPE_SIM, //EAP using SIM
+ NMI_WIFISUPP_WPA_EAP_TYPE_AKA, //EAP using AKA
+ NMI_WIFISUPP_WPA_EAP_TYPE_FAST, //EAP using FAST
+ NMI_WIFISUPP_WPA_EAP_TYPE_MAX
+} NMI_WIFISUPP_WPA_EAP_TYPE_E;
+
+typedef enum
+{
+ NMI_WIFISUPP_INNER_CREDENTIAL_TYPE_CHAP, //CHAP credential
+ NMI_WIFISUPP_INNER_CREDENTIAL_TYPE_PAP, //PAP credential
+ NMI_WIFISUPP_INNER_CREDENTIAL_TYPE_MSCHAP, //MSCHAP credential
+ NMI_WIFISUPP_INNER_CREDENTIAL_TYPE_MSCHAP_V2, //MACHAP_V2 credential
+ NMI_WIFISUPP_INNER_CREDENTIAL_TYPE_GTC, //GTC credential
+ NMI_WIFISUPP_INNER_CREDENTIAL_TYPE_MAX
+} NMI_WIFISUPP_INNER_CREDENTIAL_TYPE_E;
+
+//bruce add for coexistence: DHCP notice
+typedef enum
+{
+ NMI_WIFISUPP_DHCP_NOTICE_START, //APP begin to do dhcp
+ NMI_WIFISUPP_DHCP_NOTICE_END, //APP end dhcp
+ NMI_WIFISUPP_DHCP_NOTICE_MAX
+}NMI_WIFISUPP_DHCP_NOTICE_E;
+
+/*---------------------------------------------------------------------------*/
+/* Struct */
+/*---------------------------------------------------------------------------*/
+typedef struct
+{
+ unsigned char ssid[NMI_WIFISUPP_SSID_MAX_LEN];
+ unsigned char ssid_len;
+} NMI_WIFISUPP_SSID_T; //SSID
+
+typedef struct
+{
+ unsigned char bssid[NMI_WIFISUPP_BSSID_LEN];
+} NMI_WIFISUPP_BSSID_T; //BSSID
+
+typedef struct
+{
+ NMI_WIFISUPP_SSID_T ssid;
+ NMI_WIFISUPP_BSSID_T bssid_info;
+ signed int signal_qua; //signal quality: RSSI
+ unsigned int noise; //SNR: signal noise ratio
+ unsigned int beacon_interval; //the BEACON interval
+ unsigned int channel; //the channel using
+ NMI_WIFISUPP_ENCRYP_PROTOCOL_E encryp_protocol; //the protocol used by encryption
+ unsigned int rate; //the rate
+ NMI_WIFISUPP_NETWORK_MODE_E network_mode; //network mode
+
+ NMI_WIFISUPP_CIPHER_E pairwise_cipher;
+ NMI_WIFISUPP_CIPHER_E group_cipher;
+
+ NMI_WIFISUPP_CREDENTIAL_TYPE_E credential_type; //AKM type
+} NMI_WIFISUPP_SCAN_AP_INFO_T; //the AP info scanned
+
+
+typedef struct
+{
+ unsigned char psk[NMI_WIFISUPP_WPA_PSK_LEN];
+}NMI_WIFISUPP_WPA_PSK_T; //WPA Pre_shared Key
+
+typedef struct
+{
+ BOOLEAN is_use_file;
+ unsigned short certificate_file_path[NMI_WIFISUPP_MAX_FILE_PATH_LEN]; //the tls certificate file path, this MAY NOT available when using buffer
+ unsigned char *certificate_buf_ptr; //the tls certificate buffer, this MAY NOT available when using file
+ unsigned int certificate_buf_len; //the tls certificate buffer length, this MAY NOT available when using file
+} NMI_WIFISUPP_WPA_EAP_TLS_T; //EAP_TLS information
+
+typedef struct
+{
+ NMI_WIFISUPP_INNER_CREDENTIAL_TYPE_E inner_credential_type;
+ char username_arr[NMI_WIFISUPP_MAX_USERNAME_LEN+1];
+ char psw_arr[NMI_WIFISUPP_MAX_PSW_LEN+1];
+} NMI_WIFISUPP_WPA_EAP_TTLS_PEAP_T; //EAP_TTLS/EAP_PEAP information
+
+typedef struct
+{
+ char username_arr[NMI_WIFISUPP_MAX_USERNAME_LEN+1];
+ char psw_arr[NMI_WIFISUPP_MAX_PSW_LEN+1];
+}NMI_WIFISUPP_WPA_EAP_LEAP_T; //EAP_LEAP information
+
+typedef struct
+{
+ BOOLEAN is_use_file;
+ unsigned short pac_file_path[NMI_WIFISUPP_MAX_FILE_PATH_LEN];//the FAST PAC file path, this MAY NOT available when using buffer
+ unsigned char *pac_buf_ptr; //the FAST PAC buffer, this MAY NOT available when using file
+ unsigned int pac_buf_len; //the FAST PAC buffer length, this MAY NOT available when using file
+ char username_arr[NMI_WIFISUPP_MAX_USERNAME_LEN+1];
+ char psw_arr[NMI_WIFISUPP_MAX_PSW_LEN+1];
+}NMI_WIFISUPP_WPA_EAP_FAST_T; //EAP_FAST information
+
+typedef struct
+{
+ NMI_WIFISUPP_SSID_T ssid;
+}NMI_WIFISUPP_DISCONNECT_REQ_INFO_T; //information in the request for disconnecting a connection
+
+typedef struct
+{
+ NMI_WIFISUPP_WPA_EAP_TYPE_E eap_type;
+ union
+ {
+ NMI_WIFISUPP_WPA_EAP_TLS_T tls_info;
+ NMI_WIFISUPP_WPA_EAP_TTLS_PEAP_T ttls_info;
+ NMI_WIFISUPP_WPA_EAP_TTLS_PEAP_T peap_info;
+ NMI_WIFISUPP_WPA_EAP_LEAP_T leap_info;
+ NMI_WIFISUPP_WPA_EAP_FAST_T fast_info;
+ }eap_info;
+} NMI_WIFISUPP_WPA_EAP_T; //WPA EAP information
+
+#ifdef WLAN_SUPPORT
+typedef struct
+{
+ unsigned char psk[NMI_WIFISUPP_WAPI_PSK_LEN];
+}NMI_WIFISUPP_WAPI_PSK_T;
+
+typedef struct
+{
+ unsigned char *as_certificate_buf_ptr;
+ unsigned int as_certificate_buf_len;
+ unsigned char *asue_certificate_buf_ptr;
+ unsigned int asue_certificate_buf_len;
+}NMI_WIFISUPP_WAPI_CER_T;
+
+typedef struct
+{
+ NMI_WIFISUPP_WAPI_CREDENTIAL_TYPE_E credential_type;
+ union
+ {
+ NMI_WIFISUPP_WAPI_PSK_T wapi_psk_info;
+ NMI_WIFISUPP_WAPI_CER_T wapi_cer_info;
+ }credential_info;
+}NMI_WIFISUPP_WAPI_CREDENTIAL_T;
+#endif
+
+typedef struct
+{
+ NMI_WIFISUPP_WPA_CREDENTIAL_TYPE_E credential_type;
+ union
+ {
+ NMI_WIFISUPP_WPA_PSK_T wpa_psk_info;
+ NMI_WIFISUPP_WPA_EAP_T wpa_eap_info;
+ }credential_info;
+} NMI_WIFISUPP_WPA_CREDENTIAL_T; //WPA credential information
+
+typedef struct
+{
+ NMI_WIFISUPP_WEP_KEY_TYPE_E key_type;
+ BOOLEAN is_open_mode;
+ unsigned int key_in_use;
+ union
+ {
+ unsigned char key_64bits_arr[NMI_WIFISUPP_WEP_KEY_ID_MAX][NMI_WIFISUPP_WEP_64BITS_KEY_LEN - NMI_WIFISUPP_WEP_IV_LEN];
+ unsigned char key_128bits_arr[NMI_WIFISUPP_WEP_KEY_ID_MAX][NMI_WIFISUPP_WEP_128BITS_KEY_LEN - NMI_WIFISUPP_WEP_IV_LEN];
+ }key;
+} NMI_WIFISUPP_WEP_CREDENTIAL_T; //WEP credential information
+
+typedef struct
+{
+ NMI_WIFISUPP_SSID_T ssid;
+ NMI_WIFISUPP_BSSID_T bssid_info;
+ NMI_WIFISUPP_NETWORK_MODE_E network_mode;
+ NMI_WIFISUPP_ENCRYP_PROTOCOL_E encryp_protocol;
+ unsigned int channel;
+ union
+ {
+ NMI_WIFISUPP_WEP_CREDENTIAL_T wep_credential;
+ NMI_WIFISUPP_WPA_CREDENTIAL_T wpa_credential;
+ #ifdef WLAN_SUPPORT
+ NMI_WIFISUPP_WAPI_CREDENTIAL_T wapi_credential;
+ #endif
+ }credential;
+
+ NMI_WIFISUPP_CIPHER_E pairwise_cipher;
+ NMI_WIFISUPP_CIPHER_E group_cipher;
+} NMI_WIFISUPP_SSID_CONFIG_T; //the config of a SSID
+
+typedef struct
+{
+ NMI_WIFISUPP_RESULT_E result;
+ NMI_WIFISUPP_SSID_T ssid;
+ NMI_WIFISUPP_BSSID_T bssid_info;
+ unsigned int channel;
+ signed int rssi;
+} NMI_WIFISUPP_CONNECT_RESULT_T; //connect result
+
+typedef struct
+{
+ NMI_WIFISUPP_RESULT_E result;
+ NMI_WIFISUPP_SSID_T ssid;
+} NMI_WIFISUPP_DISCONNECT_RESULT_T; //disconnect result
+
+typedef struct
+{
+ NMI_WIFISUPP_SSID_T ssid;
+} NMI_WIFISUPP_DISCONNECT_INFO_T; //disconnect information
+
+typedef struct
+{
+ // _ATH_SIGNAL_VARS
+ NMI_WIFISUPP_DISCONNECT_INFO_T disc_info;
+} NMI_WIFISUPP_DISCONNECT_IND_T; //disconnect indication
+
+typedef struct
+{
+ NMI_WIFISUPP_SSID_T ssid;
+ NMI_WIFISUPP_BSSID_T new_bssid_info;
+ unsigned int channel; //the channel using
+} NMI_WIFISUPP_BSSID_CHANGED_INFO_T; //new bssid information
+
+typedef struct
+{
+ //_ATH_SIGNAL_VARS
+ NMI_WIFISUPP_BSSID_CHANGED_INFO_T bssid_changed_info;
+} NMI_WIFISUPP_BSSID_CHANGED_IND_T; //BSSID changed indication
+
+typedef struct
+{
+ NMI_WIFISUPP_SSID_T ssid;
+ NMI_WIFISUPP_BSSID_T bssid_info;
+ signed int new_signal_qua;
+} NMI_WIFISUPP_RSSI_CHANGED_INFO_T; //RSSI information
+
+typedef struct
+{
+ //_ATH_SIGNAL_VARS
+ NMI_WIFISUPP_RSSI_CHANGED_INFO_T rssi_changed_info;
+} NMI_WIFISUPP_RSSI_CHANGED_IND_T; //RSSI changed indication
+
+typedef struct
+{
+ NMI_WIFISUPP_RESULT_E wifi_on_result;
+ unsigned int net_id; //the net id got from TCP/IP
+ BOOLEAN is_support_roam; //wether support roam
+ BOOLEAN is_support_protocol[NMI_WIFISUPP_ENCRYP_PROTOCOL_MAX]; //the encrypt protocol supported
+ BOOLEAN is_support_eap[NMI_WIFISUPP_WPA_EAP_TYPE_MAX]; //the EAP methods supported
+ BOOLEAN is_support_inner_eap[NMI_WIFISUPP_INNER_CREDENTIAL_TYPE_MAX]; //the inner eap methos supported
+} NMI_WIFISUPP_ON_RESULT_T; // wifi on result
+
+typedef struct
+{
+ NMI_WIFISUPP_RESULT_E wifi_off_result;
+} NMI_WIFISUPP_OFF_RESULT_T; //wifi off result
+
+#ifdef WLAN_SUPPORT
+typedef struct
+{
+ NMI_WIFISUPP_SSID_T ssid;
+} NMI_WIFISUPP_SCAN_REQ_INFO_T;
+
+typedef struct
+{
+ unsigned int is_enter;
+ unsigned int threshold;
+}NMI_WIFISUPP_DEEPSLEEP_CMD_INFO_T;
+
+typedef struct
+{
+ unsigned int is_enable;
+ unsigned int interval;
+}NMI_WIFISUPP_AUTOSCAN_REQ_INFO_T;
+
+typedef struct
+{
+ NMI_WIFISUPP_RESULT_E wifi_autoscan_result;
+} NMI_WIFISUPP_AUTOSCAN_RESULT_T;
+
+typedef struct
+{
+ //_ATH_SIGNAL_VARS
+ NMI_WIFISUPP_AUTOSCAN_RESULT_T autoscan_result;
+} NMI_WIFISUPP_AUTOSCAN_CNF_T;
+
+typedef struct
+{
+ // _ATH_SIGNAL_VARS
+} NMI_WIFISUPP_SCAN_BEGIN_IND_T;
+
+#else
+typedef struct NMI_WIFISUPP_SCAN_REQ_INFO_tag
+{
+ NMI_WIFISUPP_SSID_T ssid;
+} NMI_WIFISUPP_SCAN_REQ_INFO_T;
+#endif
+
+#if 0//Ryan
+typedef struct
+{
+ _SIGNAL_VARS
+ void *msg_body;
+} NMI_WIFISUPP_CUST_MSG_T;
+#endif
+
+typedef enum{
+ NMI_DISCONNECTTED = 0,
+ NMI_CONNECTTING = 1,
+ NMI_CONNECTTED = 2,
+ NMI_DISCONNECTTING = 3,
+ NMI_MAX
+}NMI_STATE_T;
+/*---------------------------------------------------------------------------*/
+unsigned char ath_set_eut_mode(uint8 is_enter);
+int ath_set_eut_rxtx_channel(int channel);
+int ath_set_eut_tx_rate(int ratio);
+int ath_set_eut_tx_pwr(int pwr);
+unsigned char ath_eut_set_TX_para(unsigned char on_off, int tx_packet_mode);
+unsigned char ath_eut_set_RX_para(int rx_command);
+unsigned char ath_eut_get_RX_packets(unsigned long *tatal_packets_ptr, unsigned long *err_packets_ptr);
+unsigned char ath_eut_set_crystallcap(unsigned char CrystalcapIn,unsigned char CrystalcapOut);
+
+unsigned char ath_eut_get_cal_data(char* pBuf, unsigned int len);
+unsigned char ath_eut_update_cal_data(const char* pBuf, unsigned int len);
+
+
+void nmi_os_trace(char *log);
+void nmi_TraceLow(const char * x_format,...);
+
+unsigned int nmi_os_get_ms(void);
+
+unsigned int nmi_os_getSystemTickCount(void);
+
+void nmi_os_sleep_ms(unsigned int msecs);
+
+int nmi_spi_interface_init(void* spi_dma_isr);
+
+
+uint32 nmi_spi_interface_read( uint8 * buf_ptr, uint32 lenght);
+
+
+uint32 nmi_spi_interface_write( uint8 * buf_ptr, uint32 lenght);
+
+
+uint32 nmi_spi_interface_deinit(void* spi_dma_isr);
+
+#ifdef SPI_RW_SEPARATE
+uint32 nmi_spi_interface_writeread(uint8 * out_buf_ptr, uint32 out_buf_len, uint8 * in_buf_ptr, uint32 in_buf_len); //kyu
+#else
+uint32 nmi_spi_interface_writeread(uint8 * out_buf_ptr, uint8 * in_buf_ptr, uint32 length); //ksong 2012.7.12
+#endif
+
+
+BOOLEAN nmc1000_wifi_on(void);
+BOOLEAN nmc1000_wifi_off(void);
+
+void wifi_handle_event(uint8_t * event);//added by Tsungta
+void ap_disconnect();//added by Tsungta
+void nmc1000_pmk_info_callback(unsigned int ptr, unsigned int len);
+void nmc1000_set_pmk_cache_info(uint8_t reset);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __NMC1000_WIFI_ADAPER_H__ */
+
+
Binary file WIFI_Driver/nmc/nmi_wifi_adapter.o has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/nmc/nmi_wlan.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,635 @@
+#ifndef NMI_WLAN_H
+#define NMI_WLAN_H
+
+#include "nmi_type.h"
+
+/********************************************
+
+ Endian Conversion
+
+********************************************/
+
+#define BYTE_SWAP(val) ((((val) & 0x000000FF) << 24) + \
+ (((val) & 0x0000FF00) << 8) + \
+ (((val) & 0x00FF0000) >> 8) + \
+ (((val) & 0xFF000000) >> 24))
+
+
+/********************************************
+
+ Macro Defines
+
+********************************************/
+#define SINGLE_TX_QUEUE
+#define HOST_PS
+#define STATIC_TX_BUFFER
+
+/********************************************
+
+ Register Defines
+
+********************************************/
+#define NMI_PERIPH_REG_BASE 0x1000
+#define NMI_CHIPID (NMI_PERIPH_REG_BASE)
+#define NMI_GLB_RESET_0 (NMI_PERIPH_REG_BASE + 0x400)
+#define NMI_PIN_MUX_0 (NMI_PERIPH_REG_BASE + 0x408)
+#define NMI_MISC (NMI_PERIPH_REG_BASE+0x428)
+#define NMI_INTR_REG_BASE (NMI_PERIPH_REG_BASE+0xa00)
+#define NMI_INTR_ENABLE (NMI_INTR_REG_BASE)
+#define NMI_INTR_POLARITY (NMI_INTR_REG_BASE+0x10)
+#define NMI_INTR_TYPE (NMI_INTR_REG_BASE+0x20)
+#define NMI_INTR_CLEAR (NMI_INTR_REG_BASE+0x30)
+#define NMI_INTR_STATUS (NMI_INTR_REG_BASE+0x40)
+
+#define NMI_VMM_TBL_SIZE 64
+#define NMI_VMM_TX_TBL_BASE (0x150400)
+#define NMI_VMM_RX_TBL_BASE (0x150500)
+
+#define NMI_VMM_BASE 0x150000
+#define NMI_VMM_CORE_CTL (NMI_VMM_BASE)
+#define NMI_VMM_TBL_CTL (NMI_VMM_BASE+0x4)
+#define NMI_VMM_TBL_ENTRY (NMI_VMM_BASE+0x8)
+#define NMI_VMM_TBL0_SIZE (NMI_VMM_BASE+0xc)
+#define NMI_VMM_TO_HOST_SIZE (NMI_VMM_BASE+0x10)
+#define NMI_VMM_CORE_CFG (NMI_VMM_BASE+0x14)
+#define NMI_VMM_TBL_ACTIVE (NMI_VMM_BASE+040)
+#define NMI_VMM_TBL_STATUS (NMI_VMM_BASE+0x44)
+
+#define NMI_SPI_REG_BASE 0xe800
+#define NMI_SPI_CTL (NMI_SPI_REG_BASE)
+#define NMI_SPI_MASTER_DMA_ADDR (NMI_SPI_REG_BASE+0x4)
+#define NMI_SPI_MASTER_DMA_COUNT (NMI_SPI_REG_BASE+0x8)
+#define NMI_SPI_SLAVE_DMA_ADDR (NMI_SPI_REG_BASE+0xc)
+#define NMI_SPI_SLAVE_DMA_COUNT (NMI_SPI_REG_BASE+0x10)
+#define NMI_SPI_TX_MODE (NMI_SPI_REG_BASE+0x20)
+#define NMI_SPI_PROTOCOL_CONFIG (NMI_SPI_REG_BASE+0x24)
+#define NMI_SPI_INTR_CTL (NMI_SPI_REG_BASE+0x2c)
+
+#define NMI_SPI_PROTOCOL_OFFSET (NMI_SPI_PROTOCOL_CONFIG-NMI_SPI_REG_BASE)
+
+#define NMI_AHB_DATA_MEM_BASE 0x30000
+#define NMI_AHB_SHARE_MEM_BASE 0xd0000
+#define NMI_AHB_DMA_ADDR (NMI_AHB_DATA_MEM_BASE + 0xe000)
+
+#define NMI_CLR_RX_INTR_REG (NMI_PERIPH_REG_BASE+0xc8)
+#define NMI_TX_SET_INTR_REG (NMI_PERIPH_REG_BASE+0x78) /*0xa8*/
+
+#define NMI_SDIO_INTR_TYPE_REG (NMI_PERIPH_REG_BASE+0x8c)
+
+/********************************************
+
+ FW State Defines
+
+********************************************/
+
+#define FW_TX_OK 0x1
+#define FW_SYNC 0x2
+#define FW_SLEEP 0x4
+/********************************************
+
+ Size
+
+********************************************/
+
+#define CFG_MSG_HDR_LEN 4
+#define N_MAX_TX_SIZE (2*1024)//(8*1024)
+#define N_HDR_SIZE 4
+#define N_ALIGN_SIZE 4
+#define N_GRP_HDR_SIZE 4
+
+/********************************************
+
+ List Helper
+
+********************************************/
+
+struct wl_list {
+ struct wl_list *prev;
+ struct wl_list *next;
+};
+
+#define wl_get_list_entry(ptr, type, member) \
+ ((type *)((char *)(ptr)-(unsigned long)(&((type *)0)->member)))
+
+#define wl_list_for_each(pos, head) \
+ for (pos = (head)->next; pos != (head); pos = pos->next)
+
+#define wl_list_for_each_prev(pos, head) \
+ for (pos = (head)->prev; pos != (head); pos = pos->prev)
+
+#define wl_list_for_each_safe(pos, n, head) \
+ for (pos = (head)->next, n = pos->next; pos != (head); pos = n, n = pos->next)
+
+#if defined(_LINUX_)
+static inline void wl_init_list_head(struct wl_list *list)
+{
+ list->next = list;
+ list->prev = list;
+}
+
+static inline void wl_list_add(struct wl_list *ne, struct wl_list *prev, struct wl_list *next)
+{
+ next->prev = ne;
+ ne->next = next;
+ ne->prev = prev;
+ prev->next = ne;
+}
+
+static inline void wl_list_add_head(struct wl_list *ne, struct wl_list *head)
+{
+ wl_list_add(ne, head, head->next);
+}
+
+static inline void wl_list_add_tail(struct wl_list *ne, struct wl_list *head)
+{
+ wl_list_add(ne, head->prev, head);
+}
+
+static inline void wl_list_del(struct wl_list *entry)
+{
+ struct wl_list *prev = entry->prev;
+ struct wl_list *next = entry->next;
+
+ next->prev = prev;
+ prev->next = next;
+}
+
+static inline int wl_list_empty(const struct wl_list *head)
+{
+ return head->next == head;
+}
+
+#else
+static void wl_init_list_head(struct wl_list *list);
+static void wl_list_add(struct wl_list *ne, struct wl_list *prev, struct wl_list *next);
+static void wl_list_add_head(struct wl_list *ne, struct wl_list *head);
+static void wl_list_add_tail(struct wl_list *ne, struct wl_list *head);
+static void wl_list_del(struct wl_list *entry);
+static int wl_list_empty(const struct wl_list *head);
+
+
+#endif
+/********************************************
+
+ Mac State Defines
+
+********************************************/
+
+typedef enum {
+ MAC_DISCONNECTED = 1, //0, /* ksong 2013.5.9 */
+ MAC_CONNECTED,
+ MAC_ALIVE, //MAC_UPDATE_PLL,
+ MAC_UPDATE_PLL_DONE,
+ MAC_SLEEP,
+ MAC_WAKE,
+ MAC_READY,
+ MAC_TX_DONE,
+ MAC_TX_STOP,
+} MAC_STATUS_T;
+
+typedef enum {
+ MLME_SCAN_RSP = 0,
+ MLME_START_RSP = 1,
+ MLME_JOIN_RSP = 2,
+ MLME_AUTH_RSP = 3,
+ MLME_ASOC_RSP = 4,
+ MLME_EAPOL_RSP = 5, /* Atmel: 1-15-2015 */
+ MLME_UNEXPECT_RSP = 6, /* ksong 2013-8-9 */
+} MLME_RSP_TYPE_T;
+
+/********************************************
+
+ Comamnd Parameters
+
+********************************************/
+
+typedef enum {
+ B_ONLY_MODE = 0, /* basic rate: 1, 2 Mbps, otherwise: 5, 11 Mbps */
+ G_ONLY_MODE, /* basic rate: 6, 12, 24 Mbps, otherwise: 9, 18, 36, 48, 54 Mbps */
+ G_MIXED_11B_1_MODE, /* basic rate: 1, 2, 5.5, 11 Mbps, otherwise: all on */
+ G_MIXED_11B_2_MODE, /* basic rate: 1, 2, 5, 11, 6, 12, 24 Mbps, otherwise: all on */
+} G_OPERATING_MODE_T;
+
+typedef enum{
+ RATE_AUTO = 0,
+ RATE_1MB = 1,
+ RATE_2MB = 2,
+ RATE_5MB = 5,
+ RATE_6MB = 6,
+ RATE_9MB = 9,
+ RATE_11MB = 11,
+ RATE_12MB = 12,
+ RATE_18MB = 18,
+ RATE_24MB = 24,
+ RATE_26MB = 36,
+ RATE_48MB = 48,
+ RATE_54MB = 54
+} TX_RATE_T;
+
+typedef enum {
+ G_SHORT_PREAMBLE = 0, /* Short Preamble */
+ G_LONG_PREAMBLE = 1, /* Long Preamble */
+ G_AUTO_PREAMBLE = 2, /* Auto Preamble Selection */
+} G_PREAMBLE_T;
+
+typedef enum {
+ AUTO_PROT = 0, /* Auto */
+ NO_PROT, /* Do not use any protection */
+ ERP_PROT, /* Protect all ERP frame exchanges */
+ HT_PROT, /* Protect all HT frame exchanges */
+ GF_PROT, /* Protect all GF frame exchanges */
+} N_PROTECTION_MODE_T;
+
+typedef enum {
+ SITE_SURVEY_1CH = 0,
+ SITE_SURVEY_ALL_CH = 1,
+ SITE_SURVEY_OFF = 2
+} SITE_SURVEY_T;
+
+typedef enum {
+ NORMAL_ACK = 0,
+ NO_ACK,
+} ACK_POLICY_T;
+
+typedef enum {
+ G_SELF_CTS_PROT,
+ G_RTS_CTS_PROT,
+} G_PROTECTION_MODE_T;
+
+typedef enum {
+ HT_MIXED_MODE = 1,
+ HT_ONLY_20MHZ_MODE,
+ HT_ONLY_20_40MHZ_MODE,
+} N_OPERATING_MODE_T;
+
+/********************************************
+
+ Command ID Defines
+
+********************************************/
+
+typedef enum {
+ WID_CHAR = 0,
+ WID_SHORT = 1,
+ WID_INT = 2,
+ WID_STR = 3,
+ WID_BIN = 4
+} WID_TYPE_T;
+
+typedef enum {
+WID_NIL = -1,
+
+ /* Character WID list */
+ WID_BSS_TYPE = 0x0000,
+ WID_CURRENT_TX_RATE = 0x0001,
+ WID_CURRENT_CHANNEL = 0x0002,
+ WID_PREAMBLE = 0x0003,
+ WID_11G_OPERATING_MODE = 0x0004,
+ WID_STATUS = 0x0005,
+ WID_SCAN_TYPE = 0x0007,
+ WID_PRIVACY_INVOKED = 0x0008,
+ WID_KEY_ID = 0x0009,
+ WID_QOS_ENABLE = 0x000A,
+ WID_POWER_MANAGEMENT = 0x000B,
+ WID_11I_MODE = 0x000C,
+ WID_AUTH_TYPE = 0x000D,
+ WID_SITE_SURVEY = 0x000E,
+ WID_LISTEN_INTERVAL = 0x000F,
+ WID_DTIM_PERIOD = 0x0010,
+ WID_ACK_POLICY = 0x0011,
+ WID_RESET = 0x0012,
+ WID_BCAST_SSID = 0x0015,
+ WID_DISCONNECT = 0x0016,
+ WID_READ_ADDR_SDRAM = 0x0017,
+ WID_TX_POWER_LEVEL_11A = 0x0018,
+ WID_REKEY_POLICY = 0x0019,
+ WID_SHORT_SLOT_ALLOWED = 0x001A,
+ WID_PHY_ACTIVE_REG = 0x001B,
+ WID_TX_POWER_LEVEL_11B = 0x001D,
+ WID_START_SCAN_REQ = 0x001E,
+ WID_RSSI = 0x001F,
+ WID_JOIN_REQ = 0x0020,
+#ifdef MAC_ANTENNA_DIVERSITY_FEATURE
+ WID_ANTENNA_SELECTION = 0x0021,
+#endif /* MAC_ANTENNA_DIVERSITY_FEATURE */
+ WID_USER_CONTROL_ON_TX_POWER = 0x0027,
+ WID_MEMORY_ACCESS_8BIT = 0x0029,
+ WID_UAPSD_SUPPORT_AP = 0x002A,
+ WID_CURRENT_MAC_STATUS = 0x0031,
+ WID_AUTO_RX_SENSITIVITY = 0x0032,
+ WID_DATAFLOW_CONTROL = 0x0033,
+ WID_SCAN_FILTER = 0x0036,
+ WID_LINK_LOSS_THRESHOLD = 0x0037,
+ WID_AUTORATE_TYPE = 0x0038,
+ WID_802_11H_DFS_MODE = 0x003B,
+ WID_802_11H_TPC_MODE = 0x003C,
+
+ /* Character WID list */
+ WID_11N_PROT_MECH = 0x0080,
+ WID_11N_ERP_PROT_TYPE = 0x0081,
+ WID_11N_ENABLE = 0x0082,
+ WID_11N_OPERATING_MODE = 0x0083,
+ WID_11N_OBSS_NONHT_DETECTION = 0x0084,
+ WID_11N_HT_PROT_TYPE = 0x0085,
+ WID_11N_RIFS_PROT_ENABLE = 0x0086,
+ WID_11N_SMPS_MODE = 0x0087,
+ WID_11N_CURRENT_TX_MCS = 0x0088,
+ WID_11N_PRINT_STATS = 0x0089,
+ WID_HUT_FCS_CORRUPT_MODE = 0x008A,
+ WID_HUT_RESTART = 0x008B,
+ WID_HUT_TX_FORMAT = 0x008C,
+ WID_11N_SHORT_GI_ENABLE = 0x008D,
+ WID_HUT_BANDWIDTH = 0x008E,
+ WID_HUT_OP_BAND = 0x008F,
+ WID_HUT_STBC = 0x0090,
+ WID_HUT_ESS = 0x0091,
+ WID_HUT_ANTSET = 0x0092,
+ WID_HUT_HT_OP_MODE = 0x0093,
+ WID_RIFS_MODE = 0x0094,
+ WID_HUT_SMOOTHING_REC = 0x0095,
+ WID_HUT_SOUNDING_PKT = 0x0096,
+ WID_HUT_HT_CODING = 0x0097,
+ WID_HUT_TEST_DIR = 0x0098,
+ WID_HUT_PHY_TEST_MODE = 0x009A,
+ WID_HUT_PHY_TEST_RATE_HI = 0x009B,
+ WID_HUT_PHY_TEST_RATE_LO = 0x009C,
+ WID_HUT_DISABLE_RXQ_REPLENISH = 0x009D,
+ WID_HUT_KEY_ORIGIN = 0x009E,
+ WID_HUT_BCST_PERCENT = 0x009F,
+ WID_HUT_GROUP_CIPHER_TYPE = 0x00A0,
+ WID_TX_ABORT_CONFIG = 0x00A1,
+ WID_HOST_DATA_IF_TYPE = 0x00A2,
+ WID_HOST_CONFIG_IF_TYPE = 0x00A3,
+ WID_HUT_TSF_TEST_MODE = 0x00A4,
+ WID_HUT_PKT_TSSI_VALUE = 0x00A5,
+ WID_REG_TSSI_11B_VALUE = 0x00A6,
+ WID_REG_TSSI_11G_VALUE = 0x00A7,
+ WID_REG_TSSI_11N_VALUE = 0x00A8,
+ WID_TX_CALIBRATION = 0x00A9,
+ WID_DSCR_TSSI_11B_VALUE = 0x00AA,
+ WID_DSCR_TSSI_11G_VALUE = 0x00AB,
+ WID_DSCR_TSSI_11N_VALUE = 0x00AC,
+ WID_HUT_RSSI_EX = 0x00AD,
+ WID_HUT_ADJ_RSSI_EX = 0x00AE,
+ WID_11N_IMMEDIATE_BA_ENABLED = 0x00AF,
+ WID_11N_TXOP_PROT_DISABLE = 0x00B0,
+ WID_TX_POWER_LEVEL_11N = 0x00B1,
+ WID_USER_SEC_CHANNEL_OFFSET = 0x00C0,
+ WID_2040_COEXISTENCE = 0x00C1,
+ WID_HUT_FC_TXOP_MOD = 0x00C2,
+ WID_HUT_FC_PROT_TYPE = 0x00C3,
+ WID_HUT_SEC_CCA_ASSERT = 0x00C4,
+ WID_2040_ENABLE = 0x00C5,
+ WID_2040_CURR_CHANNEL_OFFSET = 0x00C6,
+ WID_2040_40MHZ_INTOLERANT = 0x00C7,
+ WID_HOST_PLATFORM = 0x00C8, /* ykk */
+ WID_MLME_RSP = 0x00C9, /* ykk */
+ WID_RX_TEST = 0x00CA, /* ksong 2013-7-16 */
+ WID_DOZE_TIME = 0x00CB, /* ksong 2013-7-22 */
+ /* Character WID list */
+
+ /* Short WID list */
+ WID_RTS_THRESHOLD = 0x1000,
+ WID_FRAG_THRESHOLD = 0x1001,
+ WID_SHORT_RETRY_LIMIT = 0x1002,
+ WID_LONG_RETRY_LIMIT = 0x1003,
+ WID_BEACON_INTERVAL = 0x1006,
+ WID_MEMORY_ACCESS_16BIT = 0x1008,
+ WID_RX_SENSE = 0x100B,
+ WID_ACTIVE_SCAN_TIME = 0x100C,
+ WID_PASSIVE_SCAN_TIME = 0x100D,
+ WID_SITE_SURVEY_SCAN_TIME = 0x100E,
+ WID_JOIN_START_TIMEOUT = 0x100F,
+ WID_AUTH_TIMEOUT = 0x1010,
+ WID_ASOC_TIMEOUT = 0x1011,
+ WID_11I_PROTOCOL_TIMEOUT = 0x1012,
+ WID_EAPOL_RESPONSE_TIMEOUT = 0x1013,
+
+ /* Short WID list */
+ WID_11N_RF_REG_VAL = 0x1080,
+ WID_HUT_FRAME_LEN = 0x1081,
+ WID_HUT_TXOP_LIMIT = 0x1082,
+ WID_HUT_SIG_QUAL_AVG = 0x1083,
+ WID_HUT_SIG_QUAL_AVG_CNT = 0x1084,
+ WID_11N_SIG_QUAL_VAL = 0x1085,
+ WID_HUT_RSSI_EX_COUNT = 0x1086,
+ WID_CCA_THRESHOLD = 0x1087,
+ WID_CLK_26M_SETTLE_TIME = 0x1088, /* ksong */
+
+ /* Short WID list */
+
+ /* Integer WID list */
+ WID_FAILED_COUNT = 0x2000,
+ WID_RETRY_COUNT = 0x2001,
+ WID_MULTIPLE_RETRY_COUNT = 0x2002,
+ WID_FRAME_DUPLICATE_COUNT = 0x2003,
+ WID_ACK_FAILURE_COUNT = 0x2004,
+ WID_RECEIVED_FRAGMENT_COUNT = 0x2005,
+ WID_MCAST_RECEIVED_FRAME_COUNT = 0x2006,
+ WID_FCS_ERROR_COUNT = 0x2007,
+ WID_SUCCESS_FRAME_COUNT = 0x2008,
+ WID_HUT_TX_COUNT = 0x200A,
+ WID_TX_FRAGMENT_COUNT = 0x200B,
+ WID_TX_MULTICAST_FRAME_COUNT = 0x200C,
+ WID_RTS_SUCCESS_COUNT = 0x200D,
+ WID_RTS_FAILURE_COUNT = 0x200E,
+ WID_WEP_UNDECRYPTABLE_COUNT = 0x200F,
+ WID_REKEY_PERIOD = 0x2010,
+ WID_REKEY_PACKET_COUNT = 0x2011,
+ WID_1X_SERV_ADDR = 0x2012,
+ WID_STACK_IP_ADDR = 0x2013,
+ WID_STACK_NETMASK_ADDR = 0x2014,
+ WID_HW_RX_COUNT = 0x2015,
+ WID_MEMORY_ADDRESS = 0x201E,
+ WID_MEMORY_ACCESS_32BIT = 0x201F,
+ WID_RF_REG_VAL = 0x2021,
+
+ /* Integer WID list */
+ WID_11N_PHY_ACTIVE_REG_VAL = 0x2080,
+ WID_HUT_NUM_TX_PKTS = 0x2081,
+ WID_HUT_TX_TIME_TAKEN = 0x2082,
+ WID_HUT_TX_TEST_TIME = 0x2083,
+
+ /* Integer WID list */
+ WID_FW_DEBUG_FLAG = 0x2084,
+
+ /* String WID list */
+ WID_SSID = 0x3000,
+ WID_FIRMWARE_VERSION = 0x3001,
+ WID_OPERATIONAL_RATE_SET = 0x3002,
+ WID_BSSID = 0x3003,
+ WID_WEP_KEY_VALUE = 0x3004,
+ WID_11I_PSK = 0x3008,
+ WID_11E_P_ACTION_REQ = 0x3009,
+ WID_1X_KEY = 0x300A,
+ WID_HARDWARE_VERSION = 0x300B,
+ WID_MAC_ADDR = 0x300C,
+ WID_HUT_DEST_ADDR = 0x300D,
+ WID_MISC_TEST_MODES = 0x300E,
+ WID_PHY_VERSION = 0x300F,
+ WID_SUPP_USERNAME = 0x3010,
+ WID_SUPP_PASSWORD = 0x3011,
+ WID_SITE_SURVEY_RESULTS = 0x3012,
+ WID_RX_POWER_LEVEL = 0x3013,
+ WID_ADD_WEP_KEY = 0x3019,
+ WID_REMOVE_WEP_KEY = 0x301A,
+ WID_ADD_PTK = 0x301B,
+ WID_ADD_RX_GTK = 0x301C,
+ WID_ADD_TX_GTK = 0x301D,
+ WID_REMOVE_KEY = 0x301E,
+ WID_ASSOC_REQ_INFO = 0x301F,
+ WID_ASSOC_RES_INFO = 0x3020,
+ WID_UPDATE_RF_SUPPORTED_INFO = 0x3021,
+
+ /* String WID list */
+ WID_11N_P_ACTION_REQ = 0x3080,
+ WID_HUT_TEST_ID = 0x3081,
+ WID_PMKID_INFO = 0x3082,
+ WID_FIRMWARE_INFO = 0x3083,
+ WID_HOST_SCAN_SSID = 0x3084,
+
+ /* String WID list */
+ WID_FIXED_IP_ADDR = 0x3090,//Ryan
+
+ /* Binary WID list */
+ WID_UAPSD_CONFIG = 0x4001,
+ WID_UAPSD_STATUS = 0x4002,
+ WID_WMM_AP_AC_PARAMS = 0x4003,
+ WID_WMM_STA_AC_PARAMS = 0x4004,
+ WID_NETWORK_INFO = 0x4005,
+ WID_STA_JOIN_INFO = 0x4006,
+ WID_CONNECTED_STA_LIST = 0x4007,
+ WID_SCAN_BSS_INFO = 0x4008,
+
+ /* Binary WID list */
+ WID_11N_AUTORATE_TABLE = 0x4080,
+ WID_HUT_TX_PATTERN = 0x4081,
+ WID_HUT_STATS = 0x4082,
+ WID_HUT_LOG_STATS = 0x4083,
+
+ WID_HOST_PROBE_IE = 0x4084,
+ WID_HOST_SCAN_CHANNEL = 0x4085,
+
+ /* Atmel, 1-15-2015*/
+ WID_PMK_CACHE_INFO = 0x4088,
+
+
+ /* Miscellaneous WIDs */
+ WID_ALL = 0x7FFE,
+ WID_MAX = 0xFFFF
+} WID_T;
+
+/********************************************
+
+ Tx/Rx Queue Structure
+
+********************************************/
+
+#ifdef SINGLE_TX_QUEUE
+typedef enum {
+ CFG_W = 1,
+ CFG_Q,
+ NET_D,
+} TX_PACKET_ID_T;
+#endif
+
+typedef struct que_h {
+ int bytes_in_queue;
+ int count;
+ LOCK_ID_T lock_id;
+ struct wl_list list;
+} que_hdr_t;
+
+typedef struct que_e {
+ u8 *buffer;
+ u32 buffer_size;
+ struct wl_list list;
+} que_e_common_t;
+
+#ifdef SINGLE_TX_QUEUE
+typedef struct tx_que_common {
+ u8 *buffer;
+ u32 buffer_size;
+ struct wl_list list;
+ TX_PACKET_ID_T id;
+} tx_que_common_t;
+#endif
+
+typedef struct txq_e {
+ u8 *buffer;
+ u32 buffer_size;
+ struct wl_list list;
+#ifdef SINGLE_TX_QUEUE
+ TX_PACKET_ID_T id;
+#endif
+ void *priv;
+ free_txb_cb_fun_t free_txb_cb;
+} txq_e_t;
+
+typedef struct rxq_e {
+ u8 *buffer;
+ u32 buffer_size;
+ struct wl_list list;
+} rxq_e_t;
+
+typedef struct set_cfg_e {
+ u8 *buffer;
+ u32 buffer_size;
+ struct wl_list list;
+#ifdef SINGLE_TX_QUEUE
+ TX_PACKET_ID_T id;
+#endif
+} cfg_w_e_t;
+
+typedef struct query_cfg_e {
+ u8 *buffer;
+ u32 buffer_size;
+ struct wl_list list;
+#ifdef SINGLE_TX_QUEUE
+ TX_PACKET_ID_T id;
+#endif
+} cfg_q_e_t;
+
+/* Atmel: 1-15-2015
+ Move to nmi_wlan_if.h
+*/
+//typedef void (*query_cb_fun_t)(u32, u32);
+
+typedef struct query_rsp_e {
+ u16 wid;
+ query_cb_fun_t query_cb;
+ struct wl_list list;
+} cfg_q_rsp_e_t;
+
+typedef struct {
+ u8 type;
+ u8 id;
+ u16 len;
+} cfg_msg_hdr_t;
+
+
+typedef struct {
+ int (*read_reg)(u32, u32 *);
+ int (*write_reg)(u32, u32);
+ int (*block_rx)(u32, u8 *, u32);
+ int (*block_tx)(u32, u8 *, u32);
+ int (*hw_cfg)(void);
+ int (*clear_intr)(void);
+} nmi_wl_if_t;
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+extern int nmi_hif_init(nmi_wl_io_t *, nmi_wl_if_t *);
+extern void DPRINT(u32, char *fmt, ...);
+extern void DPRINT_HEX(u32 grp, char *title, u8 *buf, u32 len);
+void set_FW_TX_OK(void);//Tsungta
+void get_FW_TX_OK(void);//Tsungta
+u32 FW_TX_is_OK(void);
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
Binary file WIFI_Driver/nmc/nmi_wlan.o has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/nmc/nmi_wlan_if.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,428 @@
+////////////////////////////////////////////////////////////////////////////
+//
+// Copyright (c) Newport Media Inc. All rights reserved.
+//
+// Module Name: nmi_wlan_if.h
+//
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef NMI_WLAN_IF_H
+#define NMI_WLAN_IF_H
+
+#if defined(_LINUX_)
+
+#include <linux/slab.h>
+#include <linux/sched.h>
+#include <linux/delay.h>
+#include <linux/workqueue.h>
+#include <linux/interrupt.h>
+#include <linux/irq.h>
+#include <asm/gpio.h>
+#include <linux/kthread.h>
+#include <linux/firmware.h>
+#include <linux/string.h>
+#include <linux/delay.h>
+
+#include <linux/init.h>
+#include <linux/netdevice.h>
+#include <linux/etherdevice.h>
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/skbuff.h>
+#include <linux/version.h>
+#include <linux/semaphore.h>
+
+#else
+
+#define SPI_RW_SEPARATE//Ryan
+//#include "os_api.h"
+//#include "IN_Message.h"
+//#include "tcpip_types.h"
+//#include "tcpip_api.h"
+//#include "app_tcp_if.h"
+//#include "wifisupp_api.h"
+#include "nmi_wifi_adapter.h"
+//#include "wifi_drv.h"
+//#include "nmi_os.h"
+//#include "nmi_config.h"//command by Tsungta
+
+#endif
+
+#include "nmi_type.h"
+
+#ifdef __SC6800H__
+#define BIG_ENDIAN
+#endif
+
+/********************************************
+
+ Debug Flags
+
+********************************************/
+
+#define N_INIT 0x00000001
+#define N_ERR 0x00000002
+#define N_TXQ 0x00000004
+#define N_INTR 0x00000008
+#define N_RXQ 0x00000010
+#define N_TRACE 0x00000020
+#define N_LIST 0x00000040
+#define N_SCAN 0x00000080
+#define N_JOIN 0x00000100
+#define N_WARN 0x00000200
+#define N_HIF 0x00000400
+#define N_BUS 0x00000800
+#define N_FW_STATE 0x00001000
+#define N_ALL 0xffffffff
+
+
+/********************************************
+
+ Host SDIO Bus Interface Defines
+
+********************************************/
+
+#define N_SDIO 0
+/**
+ Note:
+ Set the SDIO block size here. The max is 2k.
+**/
+#define NMI_SDIO_BLOCK_SIZE 512
+
+typedef struct {
+ u32 read_write:1;
+ u32 function:3;
+ u32 raw:1;
+ u32 address:17;
+ u32 data:8;
+} sdio_cmd52_t;
+
+typedef struct {
+ struct {
+ u32 read_write:1;
+ u32 function:3;
+ u32 block_mode:1;
+ u32 increment:1;
+ u32 address:17;
+ u32 count:9;
+ } bit;
+ u8 *buffer;
+ u32 block_size;
+} sdio_cmd53_t;
+
+/********************************************
+
+ Host SPI Bus Interface Defines
+
+********************************************/
+
+//#define SPI_RW_SEPARATE
+#define N_SPI 1
+#define SPI_DATA_PKT_SZ_256 256
+#define SPI_DATA_PKT_SZ_512 512
+#define SPI_DATA_PKT_SZ_1K 1024
+#define SPI_DATA_PKT_SZ_2K (2 * 1024)
+#define SPI_DATA_PKT_SZ_4K (4 * 1024)
+#define SPI_DATA_PKT_SZ_8K (8 * 1024)
+/**
+
+ Note:
+ Set the SPI transfer size here. See above
+**/
+#define SPI_DATA_PKT_SZ SPI_DATA_PKT_SZ_4K//SPI_DATA_PKT_SZ_8K
+
+/********************************************
+
+ Wlan Interfaces Defines
+
+********************************************/
+
+#define MAX_SSID_LEN 33
+
+typedef enum {
+ NO_SECURITY = 0,
+ WEP_40 = 0x3,
+ WEP_104 = 0x7,
+ WPA_AES = 0x29,
+ WPA_TKIP = 0x49,
+ WPA_AES_TKIP = 0x69, /* Aes or Tkip */
+ WPA2_AES = 0x31,
+ WPA2_TKIP = 0x51,
+ WPA2_AES_TKIP = 0x71, /* Aes or Tkip */
+ WP2_WPA_AES = 0x39, /* ksong add 2013.5.21 it is a wired value */
+ WPA2_WPA_AES_TKIP = 0x79, /* ksong add 2013.5.13 */
+} SECURITY_T;
+
+typedef enum {
+ INFRASTRUCTURE = 1,
+ INDEPENDENT = 2,
+ ANY_BSS = 3
+} BSSTYPE_T;
+
+typedef enum{
+ PASSIVE_SCAN = 0,
+ ACTIVE_SCAN = 1,
+ NUM_SCANTYPE
+} SCANTYPE_T;
+
+typedef enum{
+ OPEN_SYSTEM = 1,
+ SHARED_KEY = 2,
+ ANY = 3
+} AUTHTYPE_T;
+
+typedef enum {
+ NO_POWERSAVE = 0,
+ MIN_FAST_PS = 1,
+ MAX_FAST_PS = 2,
+ MIN_PSPOLL_PS = 3,
+ MAX_PSPOLL_PS = 4
+} USER_PS_MODE_T;
+
+typedef enum{
+ SUCCESS_MLMESTATUS = 0,
+ INVALID_MLMESTATUS = 1,
+ TIMEOUT = 2,
+ REFUSED = 3,
+ TOMANY_REQ = 4,
+ ALREADY_BSS = 5
+} MLMESTATUS_T;
+
+typedef struct {
+ int status;
+ u8 bssid[6];
+ u16 asoc_req_len;
+ u8 *asoc_req;
+ u16 asoc_rsp_len;
+ u8 *asoc_rsp;
+} nmi_wl_join_rsp_t;
+
+typedef struct {
+ int chan_no;
+ u8 bssid[6];
+ //u16 ssid_len;
+ u8 ssid[33];
+ BSSTYPE_T bss_type;
+ AUTHTYPE_T auth_type;
+ SECURITY_T sec_type;
+ u8 *key;
+ u8 key_len, key_idx;
+ u16 beacon_period;
+ void *priv;
+ void (*join_callback_fun)(void *, nmi_wl_join_rsp_t *);
+ void (*disconnect_callback_fun)(void *);
+} nmi_wl_join_t;
+
+typedef struct
+{
+ u32 bss_type;
+ u32 chan_no;
+ u32 beacon_period;
+ u32 cap_info;
+ u8 bssid[8];
+ u8 ssid[36];
+ s32 rssi;
+ u32 dot11i_info;
+ u32 ht_capable;
+ u32 max_rate;
+ //u8 *ie;
+ //u16 ie_len;
+} nmi_wl_bss_t;
+
+typedef struct {
+ void *priv;
+ SCANTYPE_T scan_type;
+ BSSTYPE_T bss_type;
+ u32 ssid_len;
+ u8 ssid[32];
+ u16 n_channel;
+ u8 channel[14];
+ u32 active_scan_time;
+ u32 passive_scan_time;
+ unsigned char *ie;
+ u32 ie_len;
+ void (*scan_callback_fun)(void *, nmi_wl_bss_t *, int, int);
+} nmi_wl_scan_t;
+
+typedef struct {
+ SECURITY_T sec_type;
+ u8 bssid[6];
+ u8 key_index;
+ int seq_len;
+ u8 *seq;
+ int key_len;
+ u8 *key;
+ int grp;
+
+} nmi_add_key_t;
+
+/* Atmel: 1-15-2015 */
+typedef struct {
+ u8 password[64];
+ u8 ssid[MAX_SSID_LEN];
+ u8 psk[40];
+} pmk_cache_info_t;
+
+/********************************************
+
+ Platform Interface Defines
+
+********************************************/
+
+#define HOST_ID_ANDROID 0
+#define HOST_ID_RTOS 1
+
+typedef enum {
+ TXQ_LOCK = 1,
+ RXQ_LOCK,
+ CFQ_LOCK,
+ QRQ_LOCK,
+ QSQ_LOCK,
+ IO_LOCK,
+} LOCK_ID_T;
+
+typedef enum {
+ HIF_WAIT = 1,
+ RXQ_WAIT,
+ SYNC_WAIT,
+} WAIT_ID_T;
+
+typedef struct {
+ int type;
+ union {
+ struct {
+ int external_intr_pin;
+ int (*sdio_cmd52)(sdio_cmd52_t *);
+ int (*sdio_cmd53)(sdio_cmd53_t *);
+ } sdio;
+ struct {
+#ifdef SPI_RW_SEPARATE
+ int (*spi_io)(u8 *, u32, u8 *, u32);
+#else
+ int (*spi_io)(u8 *, u8 *, u32);
+#endif
+ } spi;
+ } u;
+} nmi_wl_io_t;
+
+typedef struct {
+ void (*print)(char *);
+ void (*msleep)(u32);
+ void *(*malloc)(u32);
+ void (*free)(void *);
+ void (*lock)(void *, LOCK_ID_T);
+ void (*unlock)(void *, LOCK_ID_T);
+ int (*wait)(void *, WAIT_ID_T, u32);
+ void (*signal)(void *, WAIT_ID_T);
+ u32 (*net_rx)(void *, u8 *, u32);
+ void (*net_enable_irq)(void *);
+ void (*net_tx_resume)(void *);
+ void (*net_tx_stop)(void *);
+ void (*net_link_up)(void *);
+ void (*net_link_down)(void *);
+ void (*power_up)(void *);
+ void (*power_down)(void *);
+ void (*rssi_fun)(s8);
+} nmi_wl_plat_func_t;
+
+typedef struct {
+ void *priv;
+ u32 dbgflag;
+ u32 host_id;
+ nmi_wl_plat_func_t fun;
+ nmi_wl_io_t io;
+} nmi_wl_platform_t;
+
+typedef void (*free_txb_cb_fun_t)(void *, u8 *, u32);
+/* Atmel: 1-15-2015 */
+typedef void (*query_cb_fun_t)(u32, u32);
+
+typedef struct {
+// int (*firmware_download)(u8 *, u32);
+ int (*firmware_download)(const u8 *, u32);//Ryan
+ int (*hw_start)(void);
+ void (*hw_stop)(void);
+ void (*host_trans)(void);
+ void (*host_indicate_rx_isr)(void);
+ void (*host_rx_trans)(void);
+ void (*host_tx_trans)(void);
+ int (*net_que_tx_frame)(void *, u8 *, u32, free_txb_cb_fun_t);
+ void (*net_disp_rx_frame)(void);
+ int (*wl_scan)(nmi_wl_scan_t *);
+ int (*wl_join)(nmi_wl_join_t *);
+ int (*wl_leave)(void);
+ int (*wl_add_key)(nmi_add_key_t *);
+ int (*wl_del_key)(nmi_add_key_t *);
+ int (*wl_get_mac_addr)(void *);
+ int (*wl_power_save_enable)(int);
+ void (*wl_clean)(void); /* ksong add 2013.5.9 */
+ void (*wl_sleep)(u32); /* ksong add 2013-6-26 */
+ void (*wl_wakeup)(void); /* ksong add 2013-6-26 */
+} nmi_wl_core_func_t;
+
+#if 1//Ryan
+typedef uint32 TCPIP_NETID_T;//Ryan
+
+struct nmi_wl_adp_t {
+
+// void *hif_event;
+// void *rxq_event;
+// void *sync_event;
+
+ nmi_wl_core_func_t core;
+
+ uint8 mac_address[6];
+
+ TCPIP_NETID_T net_id;
+
+ int quit;
+
+ uint32 hif_thread_id;
+ uint32 rxq_thread_id ;
+
+ uint8 disconnect_req; /* disconnect request */
+ uint8 already_on; /*avoid re-enter the init and deinit function. */
+ uint8 not_inform_app; /* sometimes we do not need to inform app that connection is fail */
+ NMI_WIFISUPP_SSID_CONFIG_T connect_info; /* Store the connect info */
+ NMI_STATE_T state; /* record the state */
+ void *poll_dhcp_timer; /* dhcp poll timer */
+};
+#endif
+
+extern int nmi_wl_core_init(nmi_wl_platform_t *, nmi_wl_core_func_t *, u8 *);
+
+/* Definitions for error constants. */
+
+#define ERR_OK 0 /* No error, everything OK. */
+#define ERR_MEM -1 /* Out of memory error. */
+#define ERR_BUF -2 /* Buffer error. */
+#define ERR_TIMEOUT -3 /* Timeout. */
+#define ERR_RTE -4 /* Routing problem. */
+#define ERR_INPROGRESS -5 /* Operation in progress */
+#define ERR_VAL -6 /* Illegal value. */
+#define ERR_WOULDBLOCK -7 /* Operation would block. */
+#define ERR_USE -8 /* Address in use. */
+#define ERR_ISCONN -9 /* Already connected. */
+
+#define ERR_IS_FATAL(e) ((e) < ERR_ISCONN)
+
+#define ERR_ABRT -10 /* Connection aborted. */
+#define ERR_RST -11 /* Connection reset. */
+#define ERR_CLSD -12 /* Connection closed. */
+#define ERR_CONN -13 /* Not connected. */
+
+#define ERR_ARG -14 /* Illegal argument. */
+
+#define ERR_IF -15 /* Low-level netif error */
+
+#define NMI_PRINTF(...) DPRINT(N_ERR, __VA_ARGS__);//vDebugPrintf("\r\n"); vDebugPrintf(__VA_ARGS__); vDebugPrintf("\r\n");// vTaskDelay( 5 / portTICK_RATE_MS );//printk(__VA_ARGS__)
+
+typedef enum{
+ WIFI_SCAN_DONE = 1,
+ WIFI_CONNECTED,
+ WIFI_MAC_READY,
+ WIFI_DISCONNECTED,//Tsungta
+}tenuWiFiEventType;//Ryan
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/nmc/socket_internal.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,226 @@
+/*
+@file
+ socket_internal.h
+
+@brief
+*/
+#ifndef __SOCKET_INTERNAL_H__
+#define __SOCKET_INTERNAL_H__
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
+INCLUDES
+*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
+
+#include "socket_nmc.h"
+
+
+/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
+MACROS
+*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
+
+
+#define SOCKET_CMD_INVALID 0x00
+/*< Invlaid Socket command value.
+*/
+#define SOCKET_CMD_BIND 0x41
+/*< Socket Binding command value.
+*/
+#define SOCKET_CMD_LISTEN 0x42
+/*< Socket Listening command value.
+*/
+#define SOCKET_CMD_ACCEPT 0x43
+/*< Socket Accepting command value.
+*/
+#define SOCKET_CMD_CONNECT 0x44
+/*< Socket Connecting command value.
+*/
+#define SOCKET_CMD_SEND 0x45
+/*< Socket send command value.
+*/
+#define SOCKET_CMD_RECV 0x46
+/*< Socket Recieve command value.
+*/
+#define SOCKET_CMD_SENDTO 0x47
+/*< Socket sendTo command value.
+*/
+#define SOCKET_CMD_RECVFROM 0x48
+/*< Socket RecieveFrom command value.
+*/
+#define SOCKET_CMD_CLOSE 0x49
+/*< Socket Close command value.
+*/
+#define SOCKET_CMD_DNS_RESOLVE 0x4A
+/*< Socket DNS Resolve command value.
+*/
+#define SOCKET_CMD_SSL_CONNECT 0x4B
+/*< SSL-Socket Connect command value.
+*/
+#define SOCKET_CMD_SSL_SEND 0x4C
+/*< SSL-Socket Send command value.
+*/
+#define SOCKET_CMD_SSL_RECV 0x4D
+/*< SSL-Socket Recieve command value.
+*/
+#define SOCKET_CMD_SSL_CLOSE 0x4E
+/*< SSL-Socket Close command value.
+*/
+#define SOCKET_CMD_DHCP_CLIENT 0x4F
+/*< DHCP Client command value.
+*/
+#define SOCKET_CMD_TCP_ERROR 0x50
+/*!< TCP Error command value.
+*/
+
+
+/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
+DATA TYPES
+*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
+
+
+/*
+* @brief
+*/
+typedef struct{
+ uint16 u16Family;
+ uint16 u16Port;
+ uint32 u32IPAddr;
+}tstrSockAddr;
+
+
+
+/*
+@struct \
+ tstrDnsReply
+
+@brief
+ DNS Reply, contains hostName and HostIP.
+*/
+typedef struct{
+ char acHostName[HOSTNAME_MAX_SIZE];
+ uint32 u32HostIP;
+}tstrDnsReply;
+
+
+/*
+@struct \
+ tstrDhcpClientReply
+
+@brief
+ DHCP Client Reply, contains OfferIP.
+*/
+typedef struct{
+ uint32 u32OfferIP;
+ uint32 u32GatewayIP;
+}tstrDhcpClientReply;
+
+/*
+@struct \
+ tstrConnectReply
+
+@brief
+ Connect Reply, contains sock number and error value
+*/
+typedef struct{
+ SOCKET sock;
+ sint8 s8Error;
+ uint16 u16Void;
+}tstrConnectReply;
+
+
+/*
+@struct \
+ tstrTCPErrorReply
+
+@brief
+ Connect Reply, contains sock number and error value
+*/
+typedef struct{
+ SOCKET sock;
+ sint8 s8Error;
+ uint16 u16Void;
+}tstrTCPErrorReply;
+
+/*
+* @brief
+*/
+typedef struct{
+ tstrSockAddr strAddr;
+ SOCKET sListenSock;
+ SOCKET sConnectedSock;
+ uint16 u16Void;
+}tstrAcceptReply;
+
+
+/*
+@brief
+*/
+typedef struct{
+ SOCKET sock;
+ sint8 s8Status;
+ uint16 u16Void;
+}tstrBindReply;
+
+
+/*
+@struct \
+ tstrSocketRecvMsg
+
+@brief Socket recv status.
+
+ It is passed to the APPSocketEventHandler with SOCKET_MSG_RECV or SOCKET_MSG_RECVFROM message type
+ in a response to a user call to the recv or recvfrom.
+ If the received data from the remote peer is larger than the USER Buffer size (given at recv call), the data is
+ delivered to the user in a number of consecutive chunks according to the USER Buffer size.
+*/
+typedef struct{
+ SOCKET sock;
+ sint8 s8Status;
+ uint16 u16Void;
+}tstrListenReply;
+
+
+/*
+@struct \
+ tstrSendReply
+
+@brief
+ Send Reply, contains socket number and number of sent bytes.
+*/
+typedef struct{
+ SOCKET sock;
+ uint8 u8Void;
+ sint16 s16SentBytes;
+}tstrSendReply;
+
+
+/*
+@struct
+@brief
+*/
+typedef struct{
+ tstrSockAddr strRemoteAddr;
+ sint16 s16RecvStatus;
+ uint16 u16DataOffset;
+ SOCKET sock;
+ uint8 u8Void;
+ uint16 u16Void;
+}tstrRecvReply;
+
+/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
+FUNCTION PROTOTYPES
+*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
+
+NMI_API void Socket_ReadSocketData(SOCKET sock, tstrSocketRecvMsg *pstrRecv,uint8 u8SocketMsg,
+ uint32 u32StartAddress,uint16 u16ReadCount, uint8 u8Skip);
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __SOCKET_H__ */
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/nmc/socket_nmc.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,759 @@
+/*
+@file
+ socket.h
+
+@brief Socket Interface APIs
+
+ The file defines APIs and types of socket layer for the NMC1500 IoT solution. The APIs are very similar
+ to the standard POSIX sockets APIs. The socket layer operates in asynchronus mode which means socket
+ functions are non-blocking functions, requiring the result of a socket operation (eg. bind) is delivered later
+ in a callback function [APPSocketEventHandler](@ref APPSocketEventHandler).
+*/
+#ifndef __SOCKET_NMC_H__
+#define __SOCKET_NMC_H__
+
+#include "nmi_wlan_if.h"
+#include "nmi_wlan.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
+INCLUDES
+*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
+
+//#include "common\include\nm_common.h"
+
+#define NMI_API
+
+/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
+MACROS
+*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
+
+
+#define HOSTNAME_MAX_SIZE 64
+/*< Maximum allowed size for a host domain name.
+*/
+
+
+
+#define SOCKET_BUFFER_MAX_LENGTH 1400
+/*< Maximum allowed size for a socket Data buffer.
+*/
+
+
+#define AF_INET 2
+/*< Supported socket family.
+*/
+
+
+#define SOCK_STREAM 1
+/*< This is the identifier of TCP socket type.
+*/
+
+
+#define SOCK_DGRAM 2
+/*< This is the identifier of UDP socket type.
+*/
+
+
+#define SOCKET_FLAGS_SSL 0x01
+/*< This flag shall be passed to the
+ socket API for SSL session.
+*/
+
+
+#define TCP_SOCK_MAX 2//(7)
+/*< Maximum number of simultaneous TCP sockets.
+*/
+
+
+#define UDP_SOCK_MAX 2//4
+/*< Maximum number of simultaneous UDP sockets.
+*/
+
+
+#define MAX_SOCKET (TCP_SOCK_MAX + UDP_SOCK_MAX)
+/*< Maximum number of Sockets.
+*/
+
+
+/**************
+Socket Errors
+**************/
+
+#define SOCK_ERR_NO_ERROR 0
+/*< Every thing is OK.
+*/
+
+
+#define SOCK_ERR_INVALID_ADDRESS -1
+/*< Socket address is invalid. The socket operation cannot
+ be completed without address is specified. For example,
+ Bind is called without specifying a port number.
+*/
+
+
+#define SOCK_ERR_ADDR_ALREADY_IN_USE -2
+/*< Cannot bind on the given address. It is already bound
+ by another opened socket.
+*/
+
+
+#define SOCK_ERR_MAX_TCP_SOCK -3
+/*< The maximum number of TCP sockets is reached. Socket
+ creation failed.
+*/
+
+
+#define SOCK_ERR_MAX_UDP_SOCK -4
+/*< The maximum number of UDP sockets is reached. Socket
+ creation failed.
+*/
+
+
+#define SOCK_ERR_INVALID_ARG -6
+/*< An invalid arguement is passed to a function.
+*/
+
+
+#define SOCK_ERR_MAX_LISTEN_SOCK -7
+/*< The maximum number of TCP passive listening sockets is
+ reached. Listen function fails.
+*/
+
+
+#define SOCK_ERR_INVALID -9
+/*< The requested socket operation is not valid in the
+ current socket state. For Example, accept is called on a
+ TCP socket before bind or listen.
+*/
+
+
+#define SOCK_ERR_ADDR_IS_REQUIRED -11
+/*< The socket address is required for the operation to
+ be completed. It is generated from sendto when there is
+ no valid address found to send the data to.
+*/
+
+
+#define SOCK_ERR_CONN_ABORTED -12
+/*< The socket is closed by the peer. The local socket is
+ closed also.
+*/
+
+
+#define SOCK_ERR_TIMEOUT -13
+/*< The socket pending operation has been timedout.
+*/
+
+
+#define SOCK_ERR_BUFFER_FULL -14
+/*< The send operation could not be performed before the
+ transmission buffer corresponding to this socket is busy.
+*/
+
+#ifndef _NM_BSP_BIG_END
+
+#define _htonl(m) (m)
+#define _htons(A) (A)
+
+#else
+
+#define _htonl(m) \
+ (uint32)(((uint32)(m << 24)) | ((uint32)((m & 0x0000FF00) << 8)) | ((uint32)((m & 0x00FF0000) >> 8)) | ((uint32)(m >> 24)))
+/*< Convert a 4-byte integer from the host representation to the Network byte order representation.
+*/
+
+
+#define _htons(A) (uint16)((((uint16) (A)) << 8) | (((uint16) (A)) >> 8))
+/*< Convert a 2-byte integer (short) from the host representation to the Network byte order representation.
+*/
+
+
+#endif
+
+
+#define _ntohl _htonl
+/*< Convert a 4-byte integer from the Network byte order representation to the host representation .
+*/
+
+
+#define _ntohs _htons
+/*< Convert a 2-byte integer from the Network byte order representation to the host representation .
+*/
+
+
+/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
+DATA TYPES
+*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
+
+/*
+@typedef \
+ SOCKET
+
+@brief
+ Data type definition for socket handlers.
+*/
+typedef sint8 SOCKET;
+
+
+/*
+@struct \
+ in_addr
+
+@brief
+ IPv4 address representation.
+*/
+typedef struct{
+ uint32 s_addr;
+ /*< Network Byte Order representation of the IPv4 address.
+ */
+}in_addr_nmc;//Tsungta
+
+
+/*
+@struct \
+ sockaddr
+
+@brief
+ Generic socket address structure.
+*/
+struct sockaddr{
+ uint16 sa_family;
+ uint8 sa_data[14];
+};
+
+
+/*
+@struct \
+ sockaddr_in
+
+@brief
+ Socket address structure for IPV4 addresses.
+*/
+struct sockaddr_in_nmc{//Tsungta
+ uint16 sin_family;
+ /*< The only supported value for this is AF_INET.
+ */
+ uint16 sin_port;
+ /*< Port number of the socket address. It must be set in the
+ Network Byte Order format (e.g. _htons(80)).
+ */
+ in_addr_nmc sin_addr; //Tsungta
+ /*< IP Address [in_addr].
+ */
+ uint8 sin_zero[8];
+ /*< Dummy bytes.
+ */
+};
+
+
+/*******************************************
+Specific Definitions for Asynchronous implementation
+*******************************************/
+
+/*
+@enum \
+ tenuSocketCallbackMsgType
+
+@brief
+ Socket message types for socket callback notifications.
+*/
+typedef enum{
+ SOCKET_MSG_BIND = 1,
+ SOCKET_MSG_LISTEN,
+ SOCKET_MSG_DNS_RESOLVE,
+ SOCKET_MSG_ACCEPT,
+ SOCKET_MSG_CONNECT,
+ SOCKET_MSG_RECV,
+ SOCKET_MSG_SEND,
+ SOCKET_MSG_SENDTO,
+ SOCKET_MSG_RECVFROM,
+ SOCKET_MSG_DHCP_OFFER,
+ SOCKET_MSG_TCPERROR
+}tenuSocketCallbackMsgType;
+
+/*
+@struct \
+ tstrSocketBindMsg
+
+@brief Socket bind status.
+
+ It is passed to the APPSocketEventHandler with SOCKET_MSG_BIND message type
+ in a response to a user call to bind.
+*/
+typedef struct{
+ sint8 status;
+ /*< The result of the bind operation.
+ */
+}tstrSocketBindMsg;
+
+
+/*
+@struct \
+ tstrSocketListenMsg
+
+@brief Socket listen status.
+
+ It is passed to the APPSocketEventHandler with SOCKET_MSG_LISTEN message type
+ in a response to a user call to listen.
+*/
+typedef struct{
+ sint8 status;
+ /*< Result of the listen operation.
+ */
+}tstrSocketListenMsg;
+
+
+
+/*
+@struct \
+ tstrSocketAcceptMsg
+
+@brief Socket accept status.
+
+ It is passed to the APPSocketEventHandler with SOCKET_MSG_ACCEPT message type
+ in a response to a user call to accept.
+*/
+typedef struct{
+ SOCKET sock;
+ /*< Socket ID for the accepted connection with a remote peer. If it is a negative value, it refers to
+ an accept error (accept failed).
+ */
+ struct sockaddr_in_nmc strAddr;//Tsungta
+ /*< Socket address structure for the remote peer.
+ */
+}tstrSocketAcceptMsg;
+
+
+/*
+@struct \
+ tstrSocketConnectMsg
+
+@brief Socket connect status.
+
+ It is passed to the APPSocketEventHandler with SOCKET_MSG_CONNECT message type
+ in a response to a user call to connect.
+*/
+typedef struct{
+ SOCKET sock;
+ /*< Socket ID referring to the socket passed to the connect function call.
+ */
+ sint8 s8Error;
+ /*< Connect error code. It shall be ZERO for successful connect and a negative number otherwise.
+ */
+}tstrSocketConnectMsg;
+
+
+/*
+@struct \
+ tstrSocketTCPErrorMsg
+
+@brief Socket connect status.
+
+ It is passed to the APPSocketEventHandler with SOCKET_MSG_TCPERROR message type
+ in a response for TCP socket error.
+*/
+typedef struct{
+ SOCKET sock;
+ /*< Socket ID referring to the socket passed to the TCP socket control function call.
+ */
+ sint8 s8Error;
+ /*< Connect error code. TCP socket handling errors.
+ */
+}tstrSocketTCPErrorMsg;
+
+/*
+@struct \
+
+ tstrSocketRecvMsg
+
+@brief Socket recv status.
+
+ It is passed to the APPSocketEventHandler with SOCKET_MSG_RECV or SOCKET_MSG_RECVFROM message type
+ in a response to a user call to the recv or recvfrom.
+ If the received data from the remote peer is larger than the USER Buffer size (given at recv call), the data is
+ delivered to the user in a number of consecutive chunks according to the USER Buffer size.
+*/
+typedef struct{
+ uint8 *pu8Buffer;
+ /*< Pointer to the USER buffer (passed to recv or recvfrom) containing a received data chunk.
+ */
+ sint16 s16BufferSize;
+ /*< The recevied data chunk size. It will be negative value if there is a recv error.
+ */
+ uint16 u16RemainingSize;
+ /*< The number of bytes remaining in the current recv operation.
+ */
+ struct sockaddr_in_nmc strRemoteAddr;//Tsungta
+ /*< Socket address structure for the remote peer.
+ */
+}tstrSocketRecvMsg;
+
+
+/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*
+FUNCTION PROTOTYPES
+*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/
+
+/*
+@fn \
+ NMI_API void socketInit(void);
+
+@brief Socket Layer Initialization
+
+ The function performs the necessary initializations for the socket library.
+ It must be invoked before any socket operation is performed.
+*/
+NMI_API void socketInit(void);
+
+
+/*
+@fn \
+ NMI_API SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags);
+
+@brief
+ Creates a socket with a given type.
+
+@param [in] u16Domain
+ Socket family. The only allowed value is AF_INET for TCP/UDP sockets.
+
+@param [in] u8Type
+ Socket type. Allowed values are:
+ - [SOCK_STREAM](@ref SOCK_STREAM)
+ - [SOCK_DGRAM](@ref SOCK_DGRAM)
+
+@param [in] u8Flags
+ Used to specify the socket creation flags. It shall be set to zero for normal TCP/UDP sockets.
+ If could be SOCKET_FLAGS_SSL if the socket is used for SSL session. The use of the flag
+ [SOCKET_FLAGS_SSL](@ref SOCKET_FLAGS_SSL) has no meaning in case of UDP sockets.
+
+@return
+ The function shall return a negative value for socket creation failed and a nonnegative value
+ representing the socket ID otherwise.
+*/
+NMI_API SOCKET socket(uint16 u16Domain, uint8 u8Type, uint8 u8Flags);
+
+
+/*
+@fn \
+ NMI_API sint8 bind(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen);
+
+@brief
+ Binds a socket on a local port.
+
+@param [in] sock
+ Socket ID.
+
+@param [in] pstrAddr
+ Socket address for the address to be bound.
+
+@param [in] u8AddrLen
+ Size of the given address in bytes.
+
+@return
+ The function shall return ZERO for successful operation and a negative value otherwise.
+*/
+NMI_API sint8 bind(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen);
+
+
+/*
+@fn \
+ NMI_API sint8 listen(SOCKET sock, uint8 backlog);
+
+@brief
+ Start listening on a passive socket for incoming connections. The socket must be bound on a local port
+ or the listen fails. The listen function must be called at receiving [SOCKET_MSG_BIND](@ref SOCKET_MSG_BIND)
+ in the socket callback.
+
+@param [in] sock
+ Socket ID.
+
+@param [in] backlog
+ Number of maximum allowed connections that will be accepted on the given socket.
+ It is not used by the current implementation.
+
+@return
+ The function shall return ZERO for successful operation and a negative value otherwise.
+*/
+NMI_API sint8 listen(SOCKET sock, uint8 backlog);
+
+
+/*
+@fn \
+ NMI_API sint8 accept(SOCKET sock, struct sockaddr *addr, uint8 *addrlen);
+
+@brief
+ Retrieve a successful connection .
+
+@param [in] sock
+ Socket ID.
+
+@param [in] addr
+ It is not used in the current implementation.
+
+@param [in] addrlen
+ It is not used in the current implementation.
+
+@return
+ The function shall return ZERO for successful operation and a negative value otherwise.
+*/
+NMI_API sint8 accept(SOCKET sock, struct sockaddr *addr, uint8 *addrlen);
+
+
+/*
+@fn \
+ NMI_API sint8 connect(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen);
+
+@brief
+ Establishes a TCP connection with a remote server.
+
+@param [in] sock
+ Socket ID.
+
+@param [in] pstrAddr
+ Address of the remote server.
+
+@param [in] u8AddrLen
+ Address length in bytes.
+
+@return
+ The function shall return ZERO for successful operation and a negative value otherwise.
+*/
+NMI_API sint8 connect(SOCKET sock, struct sockaddr *pstrAddr, uint8 u8AddrLen);
+
+
+/*
+@fn \
+ NMI_API sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32TimeoutSeconds);
+
+@brief
+ Recieves data from a TCP Scoket.
+
+@param [in] sock
+ Socket handler.
+
+@param [in] pvRecvBuf
+ Pointer to a buffer that will hold the received data. The buffer shall be used
+ in the recv callback to deliver the received data to the caller. The buffer must
+ be resident in memory (heap or global buffer).
+
+@param [in] u16BufLen
+ The buffer size in bytes.
+
+@param [in] u32Timeoutmsec
+ Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout
+ will be set to infinite (the recv function waits forever). If the timeout period is
+ elapsed with no data received, the socket will get a timeout error in the function
+ [APPSocketEventHandler](@ref APPSocketEventHandler).
+
+@return
+ - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR)
+ - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG)
+*/
+NMI_API sint16 recv(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec);
+
+
+/*
+@fn \
+ NMI_API sint16 recvfrom(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32TimeoutSeconds);
+
+@brief
+ Recieves data from a UDP Scoket.
+
+@param [in] sock
+ Socket handler.
+
+@param [in] pvRecvBuf
+ Pointer to a buffer that will hold the received data. The buffer shall be used
+ in the recv callback to deliver the received data to the caller. The buffer must
+ be resident in memory (heap or global buffer).
+
+@param [in] u16BufLen
+ The buffer size in bytes.
+
+@param [in] u32TimeoutSeconds
+ Timeout for the recv function in milli-seconds. If the value is set to ZERO, the timeout
+ will be set to infinite (the recv function waits forever).
+
+@return
+ - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR)
+ - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG)
+*/
+NMI_API sint16 recvfrom(SOCKET sock, void *pvRecvBuf, uint16 u16BufLen, uint32 u32Timeoutmsec);
+
+
+/*
+@fn \
+ NMI_API sint16 send(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 u16Flags);
+
+@brief
+ Sends data on a TCP Scoket.
+
+@param [in] sock
+ Socket handler.
+
+@param [in] pvSendBuffer
+ Pointer to a buffer that holding data to be transmitted.
+
+@param [in] u16SendLength
+ The buffer size in bytes. It must not exceed [SOCKET_BUFFER_MAX_LENGTH](@ref SOCKET_BUFFER_MAX_LENGTH).
+
+@param [in] u16Flags
+ It is not used in the current implementation
+
+@return
+ The function shall return ZERO for successful operation and a negative value otherwise.
+*/
+NMI_API sint16 send_nmc(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 u16Flags);
+
+
+/*
+@fn \
+ NMI_API sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, struct sockaddr *pstrDestAddr, uint8 u8AddrLen);
+
+@brief
+ Sends data on a UDP Scoket.
+
+@param [in] sock
+ Socket handler.
+
+@param [in] pvSendBuffer
+ Pointer to a buffer that holding data to be transmitted.
+
+@param [in] u16SendLength
+ The buffer size in bytes. It must not exceed [SOCKET_BUFFER_MAX_LENGTH](@ref SOCKET_BUFFER_MAX_LENGTH).
+
+@param [in] flags
+ It is not used in the current implementation
+
+@param [in] pstrDestAddr
+ The destination address.
+
+@param [in] u8AddrLen
+ Destination address length in bytes.
+
+@return
+ The function shall return ZERO for successful operation and a negative value otherwise.
+*/
+NMI_API sint16 sendto(SOCKET sock, void *pvSendBuffer, uint16 u16SendLength, uint16 flags, struct sockaddr *pstrDestAddr, uint8 u8AddrLen);
+
+
+/*
+@fn \
+ NMI_API sint8 close(SOCKET sock);
+
+@brief
+ Closes a socket.
+
+@param [in] sock
+ Socket handler.
+
+@return
+ The function shall return ZERO for successful operation and a negative value otherwise.
+*/
+NMI_API sint8 close_nmc(SOCKET sock);
+
+
+/*
+@fn \
+ NMI_API sint8 gethostbyname(uint8 * pcHostName);
+
+@brief
+ Use DNS to resolve a domain name into the corresponding IP Address.
+
+@param [in] pcHostName
+ NULL terminated string containing the domain name for the remote host.
+ Its size must not exceed [HOSTNAME_MAX_SIZE](@ref HOSTNAME_MAX_SIZE).
+
+@return
+ - [SOCK_ERR_NO_ERROR](@ref SOCK_ERR_NO_ERROR)
+ - [SOCK_ERR_INVALID_ARG](@ref SOCK_ERR_INVALID_ARG)
+*/
+NMI_API sint8 gethostbyname(uint8 * pcHostName);
+
+
+/*
+@fn \
+ NMI_API uint32 nmi_inet_addr(char *pcIpAddr);
+
+@brief
+ Convert the IPv4 from the dotted decimal notation to an integer represented in Network Byte Order.
+
+@param [in] pcIpAddr
+ NULL terminated string containing the dotted decimal notation for an IP "a.b.c.d".
+
+@return
+ The integer representation of the IPv4 address in network byte order.
+*/
+NMI_API uint32 nmi_inet_addr(char *pcIpAddr);
+
+
+/*
+@fn \
+ NMI_API void APPSocketEventHandler(SOCKET sock, uint8 u8Msg, void * pvMsg);
+
+@brief Socket Callback Function
+
+ A function used by the socket layer to convey a socket operation callback to the user. This function MUST be
+ implemeneted by the application developer.
+
+@param [in] sock
+ Socket ID.
+
+@param [in] u8Msg
+ Socket message type [tenuSocketCallbackMsgType](@ref tenuSocketCallbackMsgType).
+
+@param [in] pvMsg
+ Msg parameters corresponding to the message type.
+
+@sa tstrSocketBindMsg
+ tstrSocketListenMsg
+ tstrSocketAcceptMsg
+ tstrSocketConnectMsg
+ tstrSocketRecvMsg
+*/
+NMI_API void APPSocketEventHandler(SOCKET sock, uint8 u8Msg, void * pvMsg);
+
+
+/*
+@fn \
+ NMI_API void AppServerCb(uint8* pu8DomainName, uint32 u32ServerIP);
+
+@brief
+ DNS host name resolution callback.
+
+@param [in] pu8DomainName
+ NULL terminated string containing the Domain name of a host (eg. "www.Google.com").
+
+@param [in] u32ServerIP
+ IP Address corresponding to the domain name. It is formatted in network byte order.
+*/
+NMI_API void AppServerCb(uint8* pu8DomainName, uint32 u32ServerIP);
+
+//Ryan
+typedef void (*tf_APPSocketEventHandler)(SOCKET sock, uint8 u8Msg, void * pvMsg);
+
+NMI_API void m2m_set_app(tf_APPSocketEventHandler str);
+
+#define M2M_HIF_HDR_OFFSET (sizeof(tstrHifHdr))
+
+/*
+* @struct tstrHifHdr
+* @brief Structure to hold HIF header
+* @author Mahfouz Sheref
+* @version 1.0
+*/
+typedef struct
+{
+ uint8 u8Gid; /*< Group ID */
+ uint8 u8Opcode; /*< OP code */
+ uint16 u16Length; /*< Payload length */
+}tstrHifHdr;
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* __SOCKET_H__ */
Binary file WIFI_Driver/nmc/socket_nmc.o has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/nmc/strc.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,70 @@
+#include "nmi_wlan.h"
+#include "nmi_wlan_if.h"
+
+#ifndef __STRC_H__
+ #define __STRC_H__
+
+typedef struct {
+ void *priv;
+ void (*scan_callback)(void *, nmi_wl_bss_t *, int, int);
+} scan_session_t;
+
+typedef struct {
+ int bss_type;
+ int connect;
+ void *priv;
+ u8 sa[6];
+ u8 bssid[6];
+ void (*join_callback)(void *, nmi_wl_join_rsp_t *);
+ void (*disconnect_callback)(void *);
+ int dhcp_check;
+
+} join_session_t;
+
+typedef struct wlan_t {
+
+ u32 chipid;
+ u32 fw_state;
+
+ /**
+ **/
+ nmi_wl_platform_t plat;
+ nmi_wl_if_t hif;
+
+ /**
+ TX queue
+ **/
+ que_hdr_t txq_h;
+
+ /**
+ RX queue
+ **/
+ que_hdr_t rxq_h;
+
+ /**
+ CFG queue
+ **/
+ que_hdr_t cfg_w_h;
+ que_hdr_t cfg_q_h;
+ que_hdr_t cfg_q_rsp_h;
+ u32 cfg_id;
+
+ scan_session_t scan_sess;
+ join_session_t join_sess;
+
+ int rx_isr;
+ int sleep;
+ int fw_en_sleep;
+
+ u8 mac_addr[6]; /* ksong add 2013.5.16 */
+
+ u32 scan_cmd_cnt; /* ksong 2013-8-9 */
+ u32 join_cmd_cnt; /* ksong 2013-8-9 */
+
+#ifdef STATIC_TX_BUFFER
+ u8 tx_buffer[600];//[8*1024];
+#endif
+
+} nmi_wlan_t;
+
+#endif
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WIFI_Driver/nordic/boards.h Tue Jun 09 06:04:13 2015 +0000 @@ -0,0 +1,29 @@ +/* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved. + * + * The information contained herein is property of Nordic Semiconductor ASA. + * Terms and conditions of usage are described in detail in NORDIC + * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. + * + * Licensees are granted free, non-transferable use of the information. NO + * WARRANTY of ANY KIND is provided. This heading must NOT be removed from + * the file. + * + */ +#ifndef BOARDS_H +#define BOARDS_H + +#define BOARD_PCA10001//Tsungta + +#if defined(BOARD_NRF6310) + #include "boards/nrf6310.h" +#elif defined(BOARD_PCA10000) + #include "boards/pca10000.h" +#elif defined(BOARD_PCA10001) + #include "pca10001.h"//Tsungta +#elif defined(BOARD_PCA10003) + #include "boards/pca10003.h" +#else +#error "Board is not defined" +#endif + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/nordic/nrf_ecb.c Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,73 @@
+/* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
+*
+* The information contained herein is property of Nordic Semiconductor ASA.
+* Terms and conditions of usage are described in detail in NORDIC
+* SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
+*
+* Licensees are granted free, non-transferable use of the information. NO
+* WARRANTY of ANY KIND is provided. This heading must NOT be removed from
+* the file.
+*
+* $LastChangedRevision: 25419 $
+*/
+
+/**
+ * @file
+ * @brief Implementation of AES ECB driver
+ */
+
+
+//lint -e438
+
+#include <stdlib.h>
+#include <stdbool.h>
+#include <string.h>
+#include "nrf51.h" // Tsungta
+#include "nrf_ecb.h"
+
+static uint8_t ecb_data[48]; ///< ECB data structure for RNG peripheral to access.
+static uint8_t* ecb_key; ///< Key: Starts at ecb_data
+static uint8_t* ecb_cleartext; ///< Cleartext: Starts at ecb_data + 16 bytes.
+static uint8_t* ecb_ciphertext; ///< Ciphertext: Starts at ecb_data + 32 bytes.
+
+bool nrf_ecb_init(void)
+{
+ ecb_key = ecb_data;
+ ecb_cleartext = ecb_data + 16;
+ ecb_ciphertext = ecb_data + 32;
+
+ NRF_ECB->ECBDATAPTR = (uint32_t)ecb_data;
+ return true;
+}
+
+
+bool nrf_ecb_crypt(uint8_t * dest_buf, const uint8_t * src_buf)
+{
+ uint32_t counter = 0x1000000;
+ if(src_buf != ecb_cleartext)
+ {
+ memcpy(ecb_cleartext,src_buf,16);
+ }
+ NRF_ECB->EVENTS_ENDECB = 0;
+ NRF_ECB->TASKS_STARTECB = 1;
+ while(NRF_ECB->EVENTS_ENDECB == 0)
+ {
+ counter--;
+ if(counter == 0)
+ {
+ return false;
+ }
+ }
+ NRF_ECB->EVENTS_ENDECB = 0;
+ if(dest_buf != ecb_ciphertext)
+ {
+ memcpy(dest_buf,ecb_ciphertext,16);
+ }
+ return true;
+}
+
+void nrf_ecb_set_key(const uint8_t * key)
+{
+ memcpy(ecb_key,key,16);
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/nordic/nrf_ecb.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,66 @@
+/* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved.
+ *
+ * The information contained herein is confidential property of Nordic
+ * Semiconductor ASA.Terms and conditions of usage are described in detail
+ * in NORDIC SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
+ *
+ * Licensees are granted free, non-transferable use of the information. NO
+ * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
+ * the file.
+ *
+ * $LastChangedRevision: 13999 $
+ */
+
+/**
+ * @file
+ * @brief ECB driver API.
+ */
+
+#ifndef NRF_ECB_H__
+#define NRF_ECB_H__
+
+/**
+ * @defgroup nrf_ecb AES ECB encryption
+ * @{
+ * @ingroup nrf_drivers
+ * @brief Driver for the nRF51 AES Electronic Code Book (ECB) peripheral.
+ *
+ * In order to encrypt and decrypt data the peripheral must be powered on
+ * using nrf_ecb_init() and then the key set using nrf_ecb_set_key.
+ */
+
+#include <stdint.h>
+
+/**
+ * Initialize and power on the ECB peripheral.
+ *
+ * Allocates memory for the ECBDATAPTR.
+ * @retval true Initialization was successful.
+ * @retval false Powering up failed.
+ */
+bool nrf_ecb_init(void);
+
+/**
+ * Encrypt/decrypt 16-byte data using current key.
+ *
+ * The function avoids unnecessary copying of data if the point to the
+ * correct locations in the ECB data structure.
+ *
+ * @param dst Result of encryption/decryption. 16 bytes will be written.
+ * @param src Source with 16-byte data to be encrypted/decrypted.
+ *
+ * @retval true If the encryption operation completed.
+ * @retval false If the encryption operation did not complete.
+ */
+bool nrf_ecb_crypt(uint8_t * dst, const uint8_t * src);
+//
+/**
+ * Set the key to be used for encryption/decryption.
+ *
+ * @param key Pointer to key. 16 bytes will be read.
+ */
+void nrf_ecb_set_key(const uint8_t * key);
+
+#endif // NRF_ECB_H__
+
+/** @} */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/nordic/nrf_gpio.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,422 @@
+#ifndef NRF_GPIO_H__
+#define NRF_GPIO_H__
+
+#include "nrf51.h"
+#include "nrf51_bitfields.h"
+
+/**
+ * @defgroup nrf_gpio GPIO abstraction
+ * @{
+ * @ingroup nrf_drivers
+ * @brief GPIO pin abstraction and port abstraction for reading and writing byte-wise to GPIO ports.
+ *
+ * Here, the GPIO ports are defined as follows:
+ * - Port 0 -> pin 0-7
+ * - Port 1 -> pin 8-15
+ * - Port 2 -> pin 16-23
+ * - Port 3 -> pin 24-31
+ */
+
+/**
+ * @enum nrf_gpio_port_dir_t
+ * @brief Enumerator used for setting the direction of a GPIO port.
+ */
+typedef enum
+{
+ NRF_GPIO_PORT_DIR_OUTPUT, ///< Output
+ NRF_GPIO_PORT_DIR_INPUT ///< Input
+} nrf_gpio_port_dir_t;
+
+/**
+ * @enum nrf_gpio_pin_dir_t
+ * Pin direction definitions.
+ */
+typedef enum
+{
+ NRF_GPIO_PIN_DIR_INPUT, ///< Input
+ NRF_GPIO_PIN_DIR_OUTPUT ///< Output
+} nrf_gpio_pin_dir_t;
+
+/**
+ * @enum nrf_gpio_port_select_t
+ * @brief Enumerator used for selecting between port 0 - 3.
+ */
+typedef enum
+{
+ NRF_GPIO_PORT_SELECT_PORT0 = 0, ///< Port 0 (GPIO pin 0-7)
+ NRF_GPIO_PORT_SELECT_PORT1, ///< Port 1 (GPIO pin 8-15)
+ NRF_GPIO_PORT_SELECT_PORT2, ///< Port 2 (GPIO pin 16-23)
+ NRF_GPIO_PORT_SELECT_PORT3, ///< Port 3 (GPIO pin 24-31)
+} nrf_gpio_port_select_t;
+
+/**
+ * @enum nrf_gpio_pin_pull_t
+ * @brief Enumerator used for selecting the pin to be pulled down or up at the time of pin configuration
+ */
+typedef enum
+{
+ NRF_GPIO_PIN_NOPULL = GPIO_PIN_CNF_PULL_Disabled, ///< Pin pullup resistor disabled
+ NRF_GPIO_PIN_PULLDOWN = GPIO_PIN_CNF_PULL_Pulldown, ///< Pin pulldown resistor enabled
+ NRF_GPIO_PIN_PULLUP = GPIO_PIN_CNF_PULL_Pullup, ///< Pin pullup resistor enabled
+} nrf_gpio_pin_pull_t;
+
+/**
+ * @enum nrf_gpio_pin_sense_t
+ * @brief Enumerator used for selecting the pin to sense high or low level on the pin input.
+ */
+typedef enum
+{
+ NRF_GPIO_PIN_NOSENSE = GPIO_PIN_CNF_SENSE_Disabled, ///< Pin sense level disabled.
+ NRF_GPIO_PIN_SENSE_LOW = GPIO_PIN_CNF_SENSE_Low, ///< Pin sense low level.
+ NRF_GPIO_PIN_SENSE_HIGH = GPIO_PIN_CNF_SENSE_High, ///< Pin sense high level.
+} nrf_gpio_pin_sense_t;
+
+/**
+ * @brief Function for configuring the GPIO pin range as outputs with normal drive strength.
+ * This function can be used to configure pin range as simple output with gate driving GPIO_PIN_CNF_DRIVE_S0S1 (normal cases).
+ *
+ * @param pin_range_start specifies the start number (inclusive) in the range of pin numbers to be configured (allowed values 0-30)
+ *
+ * @param pin_range_end specifies the end number (inclusive) in the range of pin numbers to be configured (allowed values 0-30)
+ *
+ * @note For configuring only one pin as output use @ref nrf_gpio_cfg_output
+ * Sense capability on the pin is disabled, and input is disconnected from the buffer as the pins are configured as output.
+ */
+static __INLINE void nrf_gpio_range_cfg_output(uint32_t pin_range_start, uint32_t pin_range_end)
+{
+ /*lint -e{845} // A zero has been given as right argument to operator '|'" */
+ for (; pin_range_start <= pin_range_end; pin_range_start++)
+ {
+ NRF_GPIO->PIN_CNF[pin_range_start] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
+ | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
+ | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
+ | (GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos)
+ | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
+ }
+}
+
+/**
+ * @brief Function for configuring the GPIO pin range as inputs with given initial value set, hiding inner details.
+ * This function can be used to configure pin range as simple input.
+ *
+ * @param pin_range_start specifies the start number (inclusive) in the range of pin numbers to be configured (allowed values 0-30)
+ *
+ * @param pin_range_end specifies the end number (inclusive) in the range of pin numbers to be configured (allowed values 0-30)
+ *
+ * @param pull_config State of the pin range pull resistor (no pull, pulled down or pulled high)
+ *
+ * @note For configuring only one pin as input use @ref nrf_gpio_cfg_input
+ * Sense capability on the pin is disabled, and input is connected to buffer so that the GPIO->IN register is readable
+ */
+static __INLINE void nrf_gpio_range_cfg_input(uint32_t pin_range_start, uint32_t pin_range_end, nrf_gpio_pin_pull_t pull_config)
+{
+ /*lint -e{845} // A zero has been given as right argument to operator '|'" */
+ for (; pin_range_start <= pin_range_end; pin_range_start++)
+ {
+ NRF_GPIO->PIN_CNF[pin_range_start] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
+ | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
+ | (pull_config << GPIO_PIN_CNF_PULL_Pos)
+ | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
+ | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos);
+ }
+}
+
+/**
+ * @brief Function for configuring the given GPIO pin number as output with given initial value set, hiding inner details.
+ * This function can be used to configure pin range as simple input with gate driving GPIO_PIN_CNF_DRIVE_S0S1 (normal cases).
+ *
+ * @param pin_number specifies the pin number of gpio pin numbers to be configured (allowed values 0-30)
+ *
+ * @note Sense capability on the pin is disabled, and input is disconnected from the buffer as the pins are configured as output.
+ */
+static __INLINE void nrf_gpio_cfg_output(uint32_t pin_number)
+{
+ /*lint -e{845} // A zero has been given as right argument to operator '|'" */
+ NRF_GPIO->PIN_CNF[pin_number] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
+ | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
+ | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
+ | (GPIO_PIN_CNF_INPUT_Disconnect << GPIO_PIN_CNF_INPUT_Pos)
+ | (GPIO_PIN_CNF_DIR_Output << GPIO_PIN_CNF_DIR_Pos);
+}
+
+/**
+ * @brief Function for configuring the given GPIO pin number as input with given initial value set, hiding inner details.
+ * This function can be used to configure pin range as simple input with gate driving GPIO_PIN_CNF_DRIVE_S0S1 (normal cases).
+ *
+ * @param pin_number specifies the pin number of gpio pin numbers to be configured (allowed values 0-30)
+ *
+ * @param pull_config State of the pin range pull resistor (no pull, pulled down or pulled high)
+ *
+ * @note Sense capability on the pin is disabled, and input is connected to buffer so that the GPIO->IN register is readable
+ */
+static __INLINE void nrf_gpio_cfg_input(uint32_t pin_number, nrf_gpio_pin_pull_t pull_config)
+{
+ /*lint -e{845} // A zero has been given as right argument to operator '|'" */
+ NRF_GPIO->PIN_CNF[pin_number] = (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
+ | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
+ | (pull_config << GPIO_PIN_CNF_PULL_Pos)
+ | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
+ | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos);
+}
+
+/**
+ * @brief Function for configuring the given GPIO pin number as input with given initial value set, hiding inner details.
+ * This function can be used to configure pin range as simple input with gate driving GPIO_PIN_CNF_DRIVE_S0S1 (normal cases).
+ * Sense capability on the pin is configurable, and input is connected to buffer so that the GPIO->IN register is readable.
+ *
+ * @param pin_number specifies the pin number of gpio pin numbers to be configured (allowed values 0-30).
+ *
+ * @param pull_config state of the pin pull resistor (no pull, pulled down or pulled high).
+ *
+ * @param sense_config sense level of the pin (no sense, sense low or sense high).
+ */
+static __INLINE void nrf_gpio_cfg_sense_input(uint32_t pin_number, nrf_gpio_pin_pull_t pull_config, nrf_gpio_pin_sense_t sense_config)
+{
+ /*lint -e{845} // A zero has been given as right argument to operator '|'" */
+ NRF_GPIO->PIN_CNF[pin_number] = (sense_config << GPIO_PIN_CNF_SENSE_Pos)
+ | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
+ | (pull_config << GPIO_PIN_CNF_PULL_Pos)
+ | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
+ | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos);
+}
+
+/**
+ * @brief Function for setting the direction for a GPIO pin.
+ *
+ * @param pin_number specifies the pin number [0:31] for which to
+ * set the direction.
+ *
+ * @param direction specifies the direction
+ */
+static __INLINE void nrf_gpio_pin_dir_set(uint32_t pin_number, nrf_gpio_pin_dir_t direction)
+{
+ if(direction == NRF_GPIO_PIN_DIR_INPUT)
+ {
+ NRF_GPIO->PIN_CNF[pin_number] =
+ (GPIO_PIN_CNF_SENSE_Disabled << GPIO_PIN_CNF_SENSE_Pos)
+ | (GPIO_PIN_CNF_DRIVE_S0S1 << GPIO_PIN_CNF_DRIVE_Pos)
+ | (GPIO_PIN_CNF_PULL_Disabled << GPIO_PIN_CNF_PULL_Pos)
+ | (GPIO_PIN_CNF_INPUT_Connect << GPIO_PIN_CNF_INPUT_Pos)
+ | (GPIO_PIN_CNF_DIR_Input << GPIO_PIN_CNF_DIR_Pos);
+ }
+ else
+ {
+ NRF_GPIO->DIRSET = (1UL << pin_number);
+ }
+}
+
+/**
+ * @brief Function for setting a GPIO pin.
+ *
+ * Note that the pin must be configured as an output for this
+ * function to have any effect.
+ *
+ * @param pin_number specifies the pin number [0:31] to
+ * set.
+ */
+static __INLINE void nrf_gpio_pin_set(uint32_t pin_number)
+{
+ NRF_GPIO->OUTSET = (1UL << pin_number);
+}
+
+/**
+ * @brief Function for clearing a GPIO pin.
+ *
+ * Note that the pin must be configured as an output for this
+ * function to have any effect.
+ *
+ * @param pin_number specifies the pin number [0:31] to
+ * clear.
+ */
+static __INLINE void nrf_gpio_pin_clear(uint32_t pin_number)
+{
+ NRF_GPIO->OUTCLR = (1UL << pin_number);
+}
+
+/**
+ * @brief Function for toggling a GPIO pin.
+ *
+ * Note that the pin must be configured as an output for this
+ * function to have any effect.
+ *
+ * @param pin_number specifies the pin number [0:31] to
+ * toggle.
+ */
+static __INLINE void nrf_gpio_pin_toggle(uint32_t pin_number)
+{
+ const uint32_t pin_bit = 1UL << pin_number;
+ const uint32_t pin_state = ((NRF_GPIO->OUT >> pin_number) & 1UL);
+
+ if (pin_state == 0)
+ {
+ // Current state low, set high.
+ NRF_GPIO->OUTSET = pin_bit;
+ }
+ else
+ {
+ // Current state high, set low.
+ NRF_GPIO->OUTCLR = pin_bit;
+ }
+}
+
+/**
+ * @brief Function for writing a value to a GPIO pin.
+ *
+ * Note that the pin must be configured as an output for this
+ * function to have any effect.
+ *
+ * @param pin_number specifies the pin number [0:31] to
+ * write.
+ *
+ * @param value specifies the value to be written to the pin.
+ * @arg 0 clears the pin
+ * @arg >=1 sets the pin.
+ */
+static __INLINE void nrf_gpio_pin_write(uint32_t pin_number, uint32_t value)
+{
+ if (value == 0)
+ {
+ nrf_gpio_pin_clear(pin_number);
+ }
+ else
+ {
+ nrf_gpio_pin_set(pin_number);
+ }
+}
+
+/**
+ * @brief Function for reading the input level of a GPIO pin.
+ *
+ * Note that the pin must have input connected for the value
+ * returned from this function to be valid.
+ *
+ * @param pin_number specifies the pin number [0:31] to
+ * read.
+ *
+ * @return
+ * @retval 0 if the pin input level is low.
+ * @retval 1 if the pin input level is high.
+ * @retval > 1 should never occur.
+ */
+static __INLINE uint32_t nrf_gpio_pin_read(uint32_t pin_number)
+{
+ return ((NRF_GPIO->IN >> pin_number) & 1UL);
+}
+
+/**
+ * @brief Generic function for writing a single byte of a 32 bit word at a given
+ * address.
+ *
+ * This function should not be called from outside the nrf_gpio
+ * abstraction layer.
+ *
+ * @param word_address is the address of the word to be written.
+ *
+ * @param byte_no is the the word byte number (0-3) to be written.
+ *
+ * @param value is the value to be written to byte "byte_no" of word
+ * at address "word_address"
+ */
+static __INLINE void nrf_gpio_word_byte_write(volatile uint32_t * word_address, uint8_t byte_no, uint8_t value)
+{
+ *((volatile uint8_t*)(word_address) + byte_no) = value;
+}
+
+/**
+ * @brief Generic function for reading a single byte of a 32 bit word at a given
+ * address.
+ *
+ * This function should not be called from outside the nrf_gpio
+ * abstraction layer.
+ *
+ * @param word_address is the address of the word to be read.
+ *
+ * @param byte_no is the the byte number (0-3) of the word to be read.
+ *
+ * @return byte "byte_no" of word at address "word_address".
+ */
+static __INLINE uint8_t nrf_gpio_word_byte_read(const volatile uint32_t* word_address, uint8_t byte_no)
+{
+ return (*((const volatile uint8_t*)(word_address) + byte_no));
+}
+
+/**
+ * @brief Function for setting the direction of a port.
+ *
+ * @param port is the port for which to set the direction.
+ *
+ * @param dir direction to be set for this port.
+ */
+static __INLINE void nrf_gpio_port_dir_set(nrf_gpio_port_select_t port, nrf_gpio_port_dir_t dir)
+{
+ if (dir == NRF_GPIO_PORT_DIR_OUTPUT)
+ {
+ nrf_gpio_word_byte_write(&NRF_GPIO->DIRSET, port, 0xFF);
+ }
+ else
+ {
+ nrf_gpio_range_cfg_input(port*8, (port+1)*8-1, NRF_GPIO_PIN_NOPULL);
+ }
+}
+
+/**
+ * @brief Function for reading a GPIO port.
+ *
+ * @param port is the port to read.
+ *
+ * @return the input value on this port.
+ */
+static __INLINE uint8_t nrf_gpio_port_read(nrf_gpio_port_select_t port)
+{
+ return nrf_gpio_word_byte_read(&NRF_GPIO->IN, port);
+}
+
+/**
+ * @brief Function for writing to a GPIO port.
+ *
+ * @param port is the port to write.
+ *
+ * @param value is the value to write to this port.
+ *
+ * @sa nrf_gpio_port_dir_set()
+ */
+static __INLINE void nrf_gpio_port_write(nrf_gpio_port_select_t port, uint8_t value)
+{
+ nrf_gpio_word_byte_write(&NRF_GPIO->OUT, port, value);
+}
+
+/**
+ * @brief Function for setting individual pins on GPIO port.
+ *
+ * @param port is the port for which to set the pins.
+ *
+ * @param set_mask is a mask specifying which pins to set. A bit
+ * set to 1 indicates that the corresponding port pin shall be
+ * set.
+ *
+ * @sa nrf_gpio_port_dir_set()
+ */
+static __INLINE void nrf_gpio_port_set(nrf_gpio_port_select_t port, uint8_t set_mask)
+{
+ nrf_gpio_word_byte_write(&NRF_GPIO->OUTSET, port, set_mask);
+}
+
+/**
+ * @brief Function for clearing individual pins on GPIO port.
+ *
+ * @param port is the port for which to clear the pins.
+ *
+ * @param clr_mask is a mask specifying which pins to clear. A bit
+ * set to 1 indicates that the corresponding port pin shall be
+ * cleared.
+ *
+ * @sa nrf_gpio_port_dir_set()
+ */
+static __INLINE void nrf_gpio_port_clear(nrf_gpio_port_select_t port, uint8_t clr_mask)
+{
+ nrf_gpio_word_byte_write(&NRF_GPIO->OUTCLR, port, clr_mask);
+}
+
+/** @} */
+
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WIFI_Driver/nordic/pca10001.h Tue Jun 09 06:04:13 2015 +0000 @@ -0,0 +1,69 @@ +/* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved. + * + * The information contained herein is property of Nordic Semiconductor ASA. + * Terms and conditions of usage are described in detail in NORDIC + * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. + * + * Licensees are granted free, non-transferable use of the information. NO + * WARRANTY of ANY KIND is provided. This heading must NOT be removed from + * the file. + * + *//* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved. + * + * The information contained herein is property of Nordic Semiconductor ASA. + * Terms and conditions of usage are described in detail in NORDIC + * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. + * + * Licensees are granted free, non-transferable use of the information. NO + * WARRANTY of ANY KIND is provided. This heading must NOT be removed from + * the file. + * + */ +#ifndef PCA10001_H +#define PCA10001_H + +#include "nrf_gpio.h" + +#define LED_START 18 +#define LED_0 18 +#define LED_1 19 +#define LED_STOP 19 + +#define BUTTON_START 16 +#define BUTTON_0 16 +#define BUTTON_1 17 +#define BUTTON_STOP 17 +#define BUTTON_PULL NRF_GPIO_PIN_PULLUP + +#define RX_PIN_NUMBER 23//22//0//11 // modified by Tsungta +#define TX_PIN_NUMBER 25//2//9 // modified by Tsungta +#define CTS_PIN_NUMBER 10 +#define RTS_PIN_NUMBER 8 +#define HWFC false//true + +#endif + +#ifndef PCA10001_H +#define PCA10001_H + +#define LED_START 18 +#define LED0 18 +#define LED_STOP 19 +#define LED1 19 +#define LED_PORT NRF_GPIO_PORT_SELECT_PORT2 +#define LED_OFFSET 2 + +#define BUTTON_START 16 +#define BUTTON0 16 +#define BUTTON_STOP 17 +#define BUTTON1 17 + +#define RX_PIN_NUMBER 11 +#define TX_PIN_NUMBER 9 +#define CTS_PIN_NUMBER 10 +#define RTS_PIN_NUMBER 8 +#define HWFC false + +#define BLINKY_STATE_MASK 0x01 + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/nordic/simple_uart.c Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,112 @@
+/* Copyright (c) 2009 Nordic Semiconductor. All Rights Reserved.
+ *
+ * The information contained herein is property of Nordic Semiconductor ASA.
+ * Terms and conditions of usage are described in detail in NORDIC
+ * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
+ *
+ * Licensees are granted free, non-transferable use of the information. NO
+ * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
+ * the file.
+ *
+ */
+
+#include <stdint.h>
+
+//#include "nrf.h" //command by Tsungta @12/12 when trying to porting on mbed online compilier
+#include "simple_uart.h"
+//#include "nrf_delay.h"
+#include "nrf_gpio.h"
+
+extern uint8_t rx_isr;
+extern uint8_t hif;
+extern uint8_t udp_client_test;
+uint8_t simple_uart_get(void)
+{
+ while (NRF_UART0->EVENTS_RXDRDY != 1 && rx_isr == 0 && hif == 0 && udp_client_test == 0)
+ {
+ // Wait for RXD data to be received
+ }
+
+ NRF_UART0->EVENTS_RXDRDY = 0;
+ return (uint8_t)NRF_UART0->RXD;
+}
+
+//bool simple_uart_get_with_timeout(int32_t timeout_ms, uint8_t *rx_data)
+//{
+// bool ret = true;
+//
+// while (NRF_UART0->EVENTS_RXDRDY != 1)
+// {
+// if (timeout_ms-- >= 0)
+// {
+// // wait in 1ms chunk before checking for status
+// nrf_delay_us(1000);
+// }
+// else
+// {
+// ret = false;
+// break;
+// }
+// } // Wait for RXD data to be received
+//
+// if (timeout_ms >= 0)
+// {
+// // clear the event and set rx_data with received byte
+// NRF_UART0->EVENTS_RXDRDY = 0;
+// *rx_data = (uint8_t)NRF_UART0->RXD;
+// }
+//
+// return ret;
+//}
+
+void simple_uart_put(uint8_t cr)
+{
+ NRF_UART0->TXD = (uint8_t)cr;
+
+ while (NRF_UART0->EVENTS_TXDRDY!=1)
+ {
+ // Wait for TXD data to be sent
+ }
+
+ NRF_UART0->EVENTS_TXDRDY=0;
+}
+
+void simple_uart_putstring(const uint8_t *str)
+{
+ uint_fast8_t i = 0;
+ uint8_t ch = str[i++];
+ while (ch != '\0')
+ {
+ simple_uart_put(ch);
+ ch = str[i++];
+ }
+}
+
+void simple_uart_config( uint8_t rts_pin_number,
+ uint8_t txd_pin_number,
+ uint8_t cts_pin_number,
+ uint8_t rxd_pin_number,
+ bool hwfc)
+{
+ nrf_gpio_cfg_output(txd_pin_number);
+ nrf_gpio_cfg_input(rxd_pin_number, NRF_GPIO_PIN_NOPULL);
+
+ NRF_UART0->PSELTXD = txd_pin_number;
+ NRF_UART0->PSELRXD = rxd_pin_number;
+
+ if (hwfc)
+ {
+ nrf_gpio_cfg_output(rts_pin_number);
+ nrf_gpio_cfg_input(cts_pin_number, NRF_GPIO_PIN_NOPULL);
+ NRF_UART0->PSELCTS = cts_pin_number;
+ NRF_UART0->PSELRTS = rts_pin_number;
+ NRF_UART0->CONFIG = (UART_CONFIG_HWFC_Enabled << UART_CONFIG_HWFC_Pos);
+ }
+
+// NRF_UART0->BAUDRATE = (UART_BAUDRATE_BAUDRATE_Baud38400 << UART_BAUDRATE_BAUDRATE_Pos);
+ NRF_UART0->BAUDRATE = (UART_BAUDRATE_BAUDRATE_Baud115200 << UART_BAUDRATE_BAUDRATE_Pos);
+ NRF_UART0->ENABLE = (UART_ENABLE_ENABLE_Enabled << UART_ENABLE_ENABLE_Pos);
+ NRF_UART0->TASKS_STARTTX = 1;
+ NRF_UART0->TASKS_STARTRX = 1;
+ NRF_UART0->EVENTS_RXDRDY = 0;
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/nordic/simple_uart.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,72 @@
+ /* Copyright (c) 2009 Nordic Semiconductor. All Rights Reserved.
+ *
+ * The information contained herein is property of Nordic Semiconductor ASA.
+ * Terms and conditions of usage are described in detail in NORDIC
+ * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
+ *
+ * Licensees are granted free, non-transferable use of the information. NO
+ * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
+ * the file.
+ *
+ */
+
+#ifndef SIMPLE_UART_H
+#define SIMPLE_UART_H
+
+/*lint ++flb "Enter library region" */
+
+#include <stdbool.h>
+#include <stdint.h>
+
+/* @file
+* @brief Simple UART driver
+*
+*
+* @defgroup nrf_drivers_simple_uart Simple UART driver
+* @{
+* @ingroup nrf_drivers
+* @brief Simple UART driver
+*/
+
+/** Reads a character from UART.
+Execution is blocked until UART peripheral detects character has been received.
+\return cr Received character.
+*/
+uint8_t simple_uart_get(void);
+
+/** Reads a character from UART with timeout on how long to wait for the byte to be received
+Execution is blocked until UART peripheral detects character has been received or until the timeout expires, which even occurs first
+\return bool True, if byte is received before timeout, else returns False.
+@param timeout_ms maximum time to wait for the data.
+@param rx_data pointer to the memory where the received data is stored.
+*/
+bool simple_uart_get_with_timeout(int32_t timeout_ms, uint8_t *rx_data);
+
+/** Sends a character to UART.
+Execution is blocked until UART peripheral reports character to have been send.
+@param cr Character to send.
+*/
+void simple_uart_put(uint8_t cr);
+
+/** Sends a string to UART.
+Execution is blocked until UART peripheral reports all characters to have been send.
+Maximum string length is 254 characters including null character in the end.
+@param str Null terminated string to send.
+*/
+void simple_uart_putstring(const uint8_t *str);
+
+/** Configures UART to use 38400 baud rate.
+@param rts_pin_number Chip pin number to be used for UART RTS
+@param txd_pin_number Chip pin number to be used for UART TXD
+@param cts_pin_number Chip pin number to be used for UART CTS
+@param rxd_pin_number Chip pin number to be used for UART RXD
+@param hwfc Enable hardware flow control
+*/
+void simple_uart_config(uint8_t rts_pin_number, uint8_t txd_pin_number, uint8_t cts_pin_number, uint8_t rxd_pin_number, bool hwfc);
+
+/**
+ *@}
+ **/
+
+/*lint --flb "Leave library region" */
+#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/nordic/spi_flash.c Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,462 @@
+/*
+ * Generated for windbond flash
+ */
+
+#include <string.h>
+#include <spi_flash.h>
+//#include "nrf_delay.h"
+#include "nrf_gpio.h"
+//#include "common.h"
+#include "spi_master_config.h" // This file must be in the application folder
+
+#include "simple_uart.h"
+
+#include "spi_master.h"
+
+#include "wait_api.h"
+
+#if 1 //marcus add for flash read/write
+#define MFG_ID_WINBOND (0xEF)
+#define DEVICE_ID_WINBOND_8M (0x5014)
+
+#define CMD_POWER_UP (0xAB)
+#define CMD_JEDEC_ID (0x9F)
+#define CMD_POWER_DOWN (0xB9)
+#define CMD_READ_STATUS (0x05)
+#define CMD_WRITE_ENABLE (0x06)
+#define CMD_PAGE_PROG (0x02)
+#define CMD_READ_DATA (0x03)
+#define CMD_ERASE_4K (0x20)
+#define CMD_ERASE_64K (0xD8)
+#define CMD_DUMMY (0xFF)
+
+// added by Tsungta
+#define CMD_READ_UNIQUE_ID (0x4B)
+#define CMD_ERASE_SECU (0x44)
+#define CMD_PAGE_PROG_SECU (0x42)
+#define CMD_READ_SECU (0x48)
+
+#define THREE_BYTE_LENGTH 3
+#define WIFIDRI_LENGTH (136568)
+#define ERASEWIFI_LENGTH (2696)
+#define DEVICE_PAGE_SIZE (256)
+#define DEVICE_SECTOR_SIZE (4096)
+#define DEVICE_BLOCK_SIZE (65536)
+#ifdef WIFI_BOOT_NORDIC
+extern const unsigned char wifi_firmware[];
+#endif
+#endif
+
+#if 1 //marcus add for flash read/write
+static bool spi_flash_writeOneByte(uint32_t *spi_base_address, uint8_t DataBuffer)
+{
+ uint8_t rx_data;
+ uint32_t counter = 0;
+ /*lint -e{826} //Are too small pointer conversion */
+ NRF_SPI_Type *spi_base = (NRF_SPI_Type *)spi_base_address;
+
+ spi_base->TXD = (uint32_t) DataBuffer;
+
+ /* Wait for the transaction complete or timeout (about 10ms - 20 ms) */
+ while ((spi_base->EVENTS_READY == 0U) && (counter < TIMEOUT_COUNTER))
+ {
+ counter++;
+ }
+
+ if (counter == TIMEOUT_COUNTER)
+ {
+ /* timed out, disable slave (slave select active low) and return with error */
+ return false;
+ } else {
+ /* clear the event to be ready to receive next messages */
+ spi_base->EVENTS_READY = 0U;
+ }
+
+ /* Marcus, need to move RXD to get the next transaction*/
+ rx_data = (uint8_t)spi_base->RXD;
+
+ return true;
+}
+
+static uint8_t spi_flash_readOneByte(uint32_t *spi_base_address)
+{
+ uint32_t counter = 0;
+ /*lint -e{826} //Are too small pointer conversion */
+ NRF_SPI_Type *spi_base = (NRF_SPI_Type *)spi_base_address;
+
+ spi_base->TXD = 0xFF; //put dont case data
+
+ /* Wait for the transaction complete or timeout (about 10ms - 20 ms) */
+ while ((spi_base->EVENTS_READY == 0U) && (counter < TIMEOUT_COUNTER))
+ {
+ counter++;
+ }
+
+ if (counter == TIMEOUT_COUNTER)
+ {
+ return 0;
+ } else {
+ /* clear the event to be ready to receive next messages */
+ spi_base->EVENTS_READY = 0U;
+ }
+
+ return (uint8_t)spi_base->RXD;
+}
+
+//#if !defined(TARGET_DELTA_DFCM_NNN40)
+bool spi_flash_init(void)
+{
+ uint8_t mfgId;
+ uint16_t deviceID;
+
+ uint32_t * p_spi_base_address = spi_master_init(SPI0, SPI_MODE0, false);
+ if (p_spi_base_address == NULL)
+ {
+ return false;
+ }
+
+ nrf_gpio_pin_clear(SPI_PSELSS1_flash);
+ spi_flash_writeOneByte(p_spi_base_address, CMD_POWER_UP);
+ nrf_gpio_pin_set(SPI_PSELSS1_flash);
+
+ //wait for wake up
+ wait_us(30);//nrf_delay_us(30);
+
+ nrf_gpio_pin_clear(SPI_PSELSS1_flash);
+
+ spi_flash_writeOneByte(p_spi_base_address, CMD_JEDEC_ID);
+
+ mfgId = spi_flash_readOneByte(p_spi_base_address);
+ deviceID = (uint16_t)(spi_flash_readOneByte(p_spi_base_address) << 8);
+ deviceID |= spi_flash_readOneByte(p_spi_base_address);
+
+ nrf_gpio_pin_set(SPI_PSELSS1_flash);
+
+ if (mfgId != MFG_ID_WINBOND || deviceID != DEVICE_ID_WINBOND_8M) {
+ return false;
+ }
+
+ return true;
+}
+
+bool spi_flash_powerDown(void)
+{
+ uint32_t * p_spi_base_address = spi_master_init(SPI0, SPI_MODE0, false);
+ if (p_spi_base_address == NULL)
+ {
+ return false;
+ }
+
+ nrf_gpio_pin_clear(SPI_PSELSS1_flash);
+ spi_flash_writeOneByte(p_spi_base_address, CMD_POWER_DOWN);
+ nrf_gpio_pin_set(SPI_PSELSS1_flash);
+
+ //wait for sleep
+ wait_us(3);//nrf_delay_us(3);
+
+ return true;
+}
+//#endif
+
+bool spi_flash_waitBusy(void)
+{
+ uint8_t status;
+ uint32_t * p_spi_base_address = spi_master_init(SPI0, SPI_MODE0, false);
+ if (p_spi_base_address == NULL)
+ {
+ return false;
+ }
+
+ nrf_gpio_pin_clear(SPI_PSELSS1_flash);
+ spi_flash_writeOneByte(p_spi_base_address, CMD_READ_STATUS);
+ status = spi_flash_readOneByte(p_spi_base_address);
+ nrf_gpio_pin_set(SPI_PSELSS1_flash);
+
+ if ( (status & 0x01) == 0x01 )
+ {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+void spi_flash_setWEL(void)
+{
+ uint32_t * p_spi_base_address = spi_master_init(SPI0, SPI_MODE0, false);
+ if (p_spi_base_address == NULL)
+ {
+ return;
+ }
+
+ nrf_gpio_pin_clear(SPI_PSELSS1_flash);
+ spi_flash_writeOneByte(p_spi_base_address, CMD_WRITE_ENABLE);
+ nrf_gpio_pin_set(SPI_PSELSS1_flash);
+}
+
+void spi_flash_writePage(uint32_t address, const uint8_t *data, uint16_t len)
+{
+ //wait busy
+ while(spi_flash_waitBusy()) {};
+
+ //setWEL
+ spi_flash_setWEL();
+
+ uint32_t * p_spi_base_address = spi_master_init(SPI0, SPI_MODE0, false);
+ if (p_spi_base_address == NULL)
+ {
+ return;
+ }
+
+ nrf_gpio_pin_clear(SPI_PSELSS1_flash);
+
+ spi_flash_writeOneByte(p_spi_base_address, CMD_PAGE_PROG);
+
+ spi_flash_writeOneByte(p_spi_base_address, ((address >> 16) & 0xFF));
+ spi_flash_writeOneByte(p_spi_base_address, ((address >> 8) & 0xFF));
+ spi_flash_writeOneByte(p_spi_base_address, (address & 0xFF));
+
+ /* write data */
+ while(len--) {
+ spi_flash_writeOneByte(p_spi_base_address, *data++);
+ }
+
+ nrf_gpio_pin_set(SPI_PSELSS1_flash);
+
+ return;
+}
+
+void spi_flash_eraseCmd(uint8_t command, uint32_t address)
+{
+ uint32_t * p_spi_base_address = spi_master_init(SPI0, SPI_MODE0, false);
+ if (p_spi_base_address == NULL)
+ {
+ return;
+ }
+
+ nrf_gpio_pin_clear(SPI_PSELSS1_flash);
+
+ spi_flash_writeOneByte(p_spi_base_address, command);
+
+ spi_flash_writeOneByte(p_spi_base_address, ((address >> 16) & 0xFF));
+ spi_flash_writeOneByte(p_spi_base_address, ((address >> 8) & 0xFF));
+ spi_flash_writeOneByte(p_spi_base_address, (address & 0xFF));
+
+ nrf_gpio_pin_set(SPI_PSELSS1_flash);
+}
+
+void spi_flash_erase(void)
+{
+ uint32_t address = 0;
+ uint32_t totalLength = WIFIDRI_LENGTH + ERASEWIFI_LENGTH; //To map SECTOR size
+
+ //wait busy
+ while(spi_flash_waitBusy()) {};
+
+ //setWEL
+ spi_flash_setWEL();
+
+ // handle any full blocks
+ while(totalLength >= DEVICE_BLOCK_SIZE) {
+ spi_flash_eraseCmd(CMD_ERASE_64K, address);
+ address += DEVICE_BLOCK_SIZE;
+ totalLength -= DEVICE_BLOCK_SIZE;
+ }
+
+ // finally handle any trailing partial blocks
+ while(totalLength) {
+ spi_flash_eraseCmd(CMD_ERASE_4K, address);
+ address += DEVICE_SECTOR_SIZE;
+ totalLength -= DEVICE_SECTOR_SIZE;
+ }
+
+ return;
+}
+
+static bool m_spi_result = true;
+
+void spi_flash_readpage(uint32_t address, uint8_t *data, uint16_t len)
+{
+
+ uint16_t i = 0;
+
+ //wait busy
+ while(spi_flash_waitBusy()) {};
+
+ uint32_t * p_spi_base_address = spi_master_init(SPI0, SPI_MODE0, false);
+ if (p_spi_base_address == NULL)
+ {
+ m_spi_result = false;
+ return;
+ }
+
+ nrf_gpio_pin_clear(SPI_PSELSS1_flash);
+
+ spi_flash_writeOneByte(p_spi_base_address, CMD_READ_DATA);
+
+ spi_flash_writeOneByte(p_spi_base_address, ((address >> 16) & 0xFF));
+ spi_flash_writeOneByte(p_spi_base_address, ((address >> 8) & 0xFF));
+ spi_flash_writeOneByte(p_spi_base_address, (address & 0xFF));
+
+ /* read data */
+
+ for (i=0; i < len; i++){ // only totalLength bytes (<4096) left
+ *data++ = spi_flash_readOneByte(p_spi_base_address);
+ }
+
+ nrf_gpio_pin_set(SPI_PSELSS1_flash);
+}
+ #ifdef WIFI_BOOT_NORDIC
+void spi_flash_write(void)
+{
+ uint32_t totalLength = WIFIDRI_LENGTH;
+ uint32_t address = 0;
+ uint16_t len = DEVICE_PAGE_SIZE;
+
+ const uint8_t *data = wifi_firmware;
+
+
+ while(totalLength) {
+ spi_flash_writePage(address, data, len);
+ totalLength -= len;
+ address += len;
+ data += len;
+ len = (totalLength>DEVICE_PAGE_SIZE)? DEVICE_PAGE_SIZE : totalLength;
+ }
+}
+#endif
+#endif
+
+// added by Tsungta
+void spi_flash_read_uniqueID(uint8_t *data)
+{
+ uint8_t dummy_len = 4;
+ uint8_t id_len = 8;
+ //wait busy
+ while(spi_flash_waitBusy()) {};
+
+ uint32_t * p_spi_base_address = spi_master_init(SPI0, SPI_MODE0, false);
+ if (p_spi_base_address == NULL)
+ {
+ return;
+ }
+
+ nrf_gpio_pin_clear(SPI_PSELSS1_flash);
+
+ spi_flash_writeOneByte(p_spi_base_address, CMD_READ_UNIQUE_ID);
+ while(dummy_len--)
+ spi_flash_readOneByte(p_spi_base_address); // there is four dummy bytes before real data
+ /* id data */
+ while(id_len--)
+ *data++ = spi_flash_readOneByte(p_spi_base_address);
+
+ nrf_gpio_pin_set(SPI_PSELSS1_flash);
+}
+
+// added by Tsungta
+void spi_flash_erase_security(uint32_t address)
+{
+ //wait busy
+ while(spi_flash_waitBusy()) {};
+
+ //setWEL
+ spi_flash_setWEL();
+
+ uint32_t * p_spi_base_address = spi_master_init(SPI0, SPI_MODE0, false);
+ if (p_spi_base_address == NULL)
+ {
+ return;
+ }
+
+ nrf_gpio_pin_clear(SPI_PSELSS1_flash);
+
+ spi_flash_writeOneByte(p_spi_base_address, CMD_ERASE_SECU);
+
+ spi_flash_writeOneByte(p_spi_base_address, ((address >> 16) & 0xFF));
+ spi_flash_writeOneByte(p_spi_base_address, ((address >> 8) & 0xFF));
+ spi_flash_writeOneByte(p_spi_base_address, (address & 0xFF));
+
+ nrf_gpio_pin_set(SPI_PSELSS1_flash);
+}
+
+// added by Tsungta
+void spi_flash_writePage_security(uint32_t address, const uint8_t *data, uint16_t len)
+{
+ //wait busy
+ while(spi_flash_waitBusy()) {};
+
+ //setWEL
+ spi_flash_setWEL();
+
+ uint32_t * p_spi_base_address = spi_master_init(SPI0, SPI_MODE0, false);
+ if (p_spi_base_address == NULL)
+ {
+ return;
+ }
+
+ nrf_gpio_pin_clear(SPI_PSELSS1_flash);
+
+ spi_flash_writeOneByte(p_spi_base_address, CMD_PAGE_PROG_SECU);
+
+ spi_flash_writeOneByte(p_spi_base_address, ((address >> 16) & 0xFF));
+ spi_flash_writeOneByte(p_spi_base_address, ((address >> 8) & 0xFF));
+ spi_flash_writeOneByte(p_spi_base_address, (address & 0xFF));
+
+ /* write data */
+ while(len--) {
+ spi_flash_writeOneByte(p_spi_base_address, *data++);
+ }
+
+ nrf_gpio_pin_set(SPI_PSELSS1_flash);
+
+ return;
+}
+
+// added by Tsungta
+void spi_flash_read_security(uint32_t address, uint8_t *data, uint16_t len)
+{
+
+#ifdef FLASHDEBUG
+ uint8_t data = 0;
+ uint8_t i = 1;
+#endif
+
+ //wait busy
+ while(spi_flash_waitBusy()) {};
+
+// //setWEL
+// spi_flash_setWEL();
+
+ uint32_t * p_spi_base_address = spi_master_init(SPI0, SPI_MODE0, false);
+ if (p_spi_base_address == NULL)
+ {
+ return;
+ }
+
+ nrf_gpio_pin_clear(SPI_PSELSS1_flash);
+
+ spi_flash_writeOneByte(p_spi_base_address, CMD_READ_SECU);
+
+ spi_flash_writeOneByte(p_spi_base_address, ((address >> 16) & 0xFF));
+ spi_flash_writeOneByte(p_spi_base_address, ((address >> 8) & 0xFF));
+ spi_flash_writeOneByte(p_spi_base_address, (address & 0xFF));
+
+ spi_flash_readOneByte(p_spi_base_address); // there is a dummy byte before real data
+ /* read data */
+ while(len--) {
+#ifdef FLASHDEBUG
+ data = spi_flash_readOneByte(p_spi_base_address);
+ uint8_t buf[30];
+ sprintf(buf,"0x%02X ",data);
+ simple_uart_putstring(buf);
+ if(i == 11)
+ {
+ simple_uart_put('\n');
+ i = 0;
+ }
+ i++;
+#else
+ *data++ = spi_flash_readOneByte(p_spi_base_address);
+#endif
+ }
+ nrf_gpio_pin_set(SPI_PSELSS1_flash);
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WIFI_Driver/nordic/spi_flash.h Tue Jun 09 06:04:13 2015 +0000 @@ -0,0 +1,35 @@ + /* + * Generated for windbond flash + */ + +#ifndef SPI_FLASH_H +#define SPI_FLASH_H + +#include <stdbool.h> +#include <stdint.h> + + +#if 1 //marcus + +//#if !defined(TARGET_DELTA_DFCM_NNN40) +bool spi_flash_init(void); +bool spi_flash_powerDown(void); +//#endif + +void spi_flash_erase(void); +void spi_flash_readpage(uint32_t address, uint8_t *data, uint16_t len); +void spi_flash_write(void); + +void spi_flash_eraseCmd(uint8_t command, uint32_t address); +void spi_flash_writePage(uint32_t address, const uint8_t *data, uint16_t len); + +bool spi_flash_waitBusy(void); +void spi_flash_setWEL(void); + +// added by Tsungta +void spi_flash_read_uniqueID(uint8_t *data); +void spi_flash_erase_security(uint32_t address); +void spi_flash_writePage_security(uint32_t address, const uint8_t *data, uint16_t len); +void spi_flash_read_security(uint32_t address, uint8_t *data, uint16_t len); +#endif +#endif /* SPI_MASTER_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/nordic/spi_master.c Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,183 @@
+/* Copyright (c) 2009 Nordic Semiconductor. All Rights Reserved.
+ *
+ * The information contained herein is property of Nordic Semiconductor ASA.
+ * Terms and conditions of usage are described in detail in NORDIC
+ * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
+ *
+ * Licensees are granted free, non-transferable use of the information. NO
+ * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
+ * the file.
+ *
+ */
+
+#include <spi_master.h>
+//#include "nrf_delay.h"
+#include "nrf_gpio.h"
+//#include "common.h"
+#include "spi_master_config.h" // This file must be in the application folder
+
+uint32_t* spi_master_init(SPIModuleNumber module_number, SPIMode mode, bool lsb_first)
+{
+ uint32_t config_mode;
+
+ NRF_SPI_Type *spi_base_address = (SPI0 == module_number)? NRF_SPI0 : (NRF_SPI_Type *)NRF_SPI1;
+
+ if(SPI0 == module_number)
+ {
+ /* Configure GPIO pins used for pselsck, pselmosi, pselmiso and pselss for SPI0 */
+ nrf_gpio_cfg_output(SPI_PSELSCK0);
+ nrf_gpio_cfg_output(SPI_PSELMOSI0);
+ nrf_gpio_cfg_input(SPI_PSELMISO0, NRF_GPIO_PIN_PULLUP);
+ nrf_gpio_cfg_output(SPI_PSELSS0);
+ nrf_gpio_cfg_output(SPI_PSELSS1_flash); //added by Tsungta
+
+ /* Configure pins, frequency and mode */
+ spi_base_address->PSELSCK = SPI_PSELSCK0;
+ spi_base_address->PSELMOSI = SPI_PSELMOSI0;
+ spi_base_address->PSELMISO = SPI_PSELMISO0;
+ nrf_gpio_pin_set(SPI_PSELSS0); /* disable Set slave select (inactive high) */
+ nrf_gpio_pin_set(SPI_PSELSS1_flash); //added by Tsungta
+ }
+ else
+ {
+ /* Configure GPIO pins used for pselsck, pselmosi, pselmiso and pselss for SPI1*/
+ nrf_gpio_cfg_output(SPI_PSELSCK1);
+ nrf_gpio_cfg_output(SPI_PSELMOSI1);
+ nrf_gpio_cfg_input(SPI_PSELMISO1, NRF_GPIO_PIN_PULLUP);
+ nrf_gpio_cfg_output(SPI_PSELSS1);
+ nrf_gpio_cfg_output(SPI_PSELSS1_flash); //added by Tsungta
+
+ /* Configure pins, frequency and mode */
+ spi_base_address->PSELSCK = SPI_PSELSCK1;
+ spi_base_address->PSELMOSI = SPI_PSELMOSI1;
+ spi_base_address->PSELMISO = SPI_PSELMISO1;
+ nrf_gpio_pin_set(SPI_PSELSS1); /* disable Set slave select (inactive high) */
+ nrf_gpio_pin_set(SPI_PSELSS1_flash); //added by Tsungta
+ }
+ spi_base_address->FREQUENCY = (uint32_t) SPI_OPERATING_FREQUENCY_4M; //modified by Tsungta, 4MHz is max. speed for 1.8V
+
+ /*lint -e845 -save // A zero has been given as right argument to operator '!'" */
+ /** @snippet [SPI Select mode] */
+ switch (mode )
+ {
+
+ case SPI_MODE0:
+ config_mode = (SPI_CONFIG_CPHA_Leading << SPI_CONFIG_CPHA_Pos) | (SPI_CONFIG_CPOL_ActiveHigh << SPI_CONFIG_CPOL_Pos);
+ break;
+ case SPI_MODE1:
+ config_mode = (SPI_CONFIG_CPHA_Trailing << SPI_CONFIG_CPHA_Pos) | (SPI_CONFIG_CPOL_ActiveHigh << SPI_CONFIG_CPOL_Pos);
+ break;
+ case SPI_MODE2:
+ config_mode = (SPI_CONFIG_CPHA_Leading << SPI_CONFIG_CPHA_Pos) | (SPI_CONFIG_CPOL_ActiveLow << SPI_CONFIG_CPOL_Pos);
+ break;
+ case SPI_MODE3:
+ config_mode = (SPI_CONFIG_CPHA_Trailing << SPI_CONFIG_CPHA_Pos) | (SPI_CONFIG_CPOL_ActiveLow << SPI_CONFIG_CPOL_Pos);
+ break;
+ default:
+ config_mode = 0;
+ break;
+
+ }
+ /** @snippet [SPI Select mode] */
+ /*lint -restore */
+
+ /*lint -e845 -save // A zero has been given as right argument to operator '!'" */
+ /** @snippet [SPI Select endianess] */
+ if (lsb_first)
+ {
+ spi_base_address->CONFIG = (config_mode | (SPI_CONFIG_ORDER_LsbFirst << SPI_CONFIG_ORDER_Pos));
+ }
+ else
+ {
+ spi_base_address->CONFIG = (config_mode | (SPI_CONFIG_ORDER_MsbFirst << SPI_CONFIG_ORDER_Pos));
+ }
+ /** @snippet [SPI Select endianess] */
+ /*lint -restore */
+
+ spi_base_address->EVENTS_READY = 0U;
+#if 1
+
+ /* Enable */
+ if(SPI0 == module_number)
+ spi_base_address->ENABLE = (SPI_ENABLE_ENABLE_Enabled << SPI_ENABLE_ENABLE_Pos);
+#endif
+ return (uint32_t *)spi_base_address;
+}
+
+//bool spi_master_tx_rx(uint32_t *spi_base_address, uint16_t transfer_size, const uint8_t *tx_data, uint8_t *rx_data)
+bool spi_master_tx_rx(SPIModuleNumber module_number, uint16_t transfer_size, const uint8_t *tx_data, uint8_t *rx_data)
+{
+ uint32_t counter = 0;
+ uint16_t number_of_txd_bytes = 0;
+ uint32_t SEL_SS_PINOUT;
+ /*lint -e{826} //Are too small pointer conversion */
+// NRF_SPI_Type *spi_base = (NRF_SPI_Type *)spi_base_address;
+ NRF_SPI_Type *spi_base = (SPI0 == module_number)? NRF_SPI0 : (NRF_SPI_Type *)NRF_SPI1;
+ volatile uint32_t dummyread;
+
+ if(NRF_SPI0 == spi_base)
+ spi_base->ENABLE = (SPI_ENABLE_ENABLE_Enabled << SPI_ENABLE_ENABLE_Pos);
+// nrf_delay_ms(10);
+
+// if( (uint32_t *)NRF_SPI0 == spi_base_address)
+ if(NRF_SPI0 == spi_base)
+ {
+ SEL_SS_PINOUT = SPI_PSELSS0;
+ }
+ else
+ {
+ SEL_SS_PINOUT = SPI_PSELSS1;
+ }
+
+ /* enable slave (slave select active low) */
+ if (SEL_SS_PINOUT == SPI_PSELSS0)
+ nrf_gpio_pin_clear(SEL_SS_PINOUT);
+
+ while(number_of_txd_bytes < transfer_size)
+ {
+ counter = 0;//Tsungta; FIXED for 4MHz issue
+ if(tx_data == 0)
+ {
+ spi_base->TXD = 0x0;//0xFF;
+ }
+ else
+ spi_base->TXD = (uint32_t)(tx_data[number_of_txd_bytes]);
+
+ /* Wait for the transaction complete or timeout (about 10ms - 20 ms) */
+ while ((spi_base->EVENTS_READY == 0U) && (counter < TIMEOUT_COUNTER))
+ {
+ counter++;
+ }
+
+ if (counter == TIMEOUT_COUNTER)
+ {
+ /* timed out, disable slave (slave select active low) and return with error */
+ if (SEL_SS_PINOUT == SPI_PSELSS0)
+ nrf_gpio_pin_set(SEL_SS_PINOUT);
+ return false;
+ }
+ else
+ { /* clear the event to be ready to receive next messages */
+ spi_base->EVENTS_READY = 0U;
+ }
+
+ if(rx_data == 0)
+ {
+ dummyread = spi_base->RXD;
+ }
+ else
+ rx_data[number_of_txd_bytes] = (uint8_t)spi_base->RXD;
+ number_of_txd_bytes++;
+ };
+
+ /* disable slave (slave select active low) */
+ if (SEL_SS_PINOUT == SPI_PSELSS0)
+ nrf_gpio_pin_set(SEL_SS_PINOUT);
+
+ if(NRF_SPI0 == spi_base)
+ spi_base->ENABLE = (SPI_ENABLE_ENABLE_Disabled << SPI_ENABLE_ENABLE_Pos);
+// nrf_delay_ms(10);
+
+ return true;
+}
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/nordic/spi_master.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,110 @@
+ /* Copyright (c) 2009 Nordic Semiconductor. All Rights Reserved.
+ *
+ * The information contained herein is property of Nordic Semiconductor ASA.
+ * Terms and conditions of usage are described in detail in NORDIC
+ * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
+ *
+ * Licensees are granted free, non-transferable use of the information. NO
+ * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
+ * the file.
+ *
+ */
+
+#ifndef SPI_MASTER_H
+#define SPI_MASTER_H
+
+#include <stdbool.h>
+#include <stdint.h>
+
+/* @file
+* @brief Software controlled SPI Master driver.
+*
+*
+* @defgroup lib_driver_spi_master Software controlled SPI Master driver
+* @{
+* @ingroup nrf_drivers
+* @brief Software controlled SPI Master driver.
+*
+* Supported features:
+* - Operate two SPI masters independently or in parallel.
+* - Transmit and Receive given size of data through SPI.
+* - configure each SPI module separately through @ref spi_master_init.
+*/
+
+/**
+ * SPI master operating frequency
+ */
+typedef enum
+{
+ Freq_125Kbps = 0, /*!< drive SClk with frequency 125Kbps */
+ Freq_250Kbps, /*!< drive SClk with frequency 250Kbps */
+ Freq_500Kbps, /*!< drive SClk with frequency 500Kbps */
+ Freq_1Mbps, /*!< drive SClk with frequency 1Mbps */
+ Freq_2Mbps, /*!< drive SClk with frequency 2Mbps */
+ Freq_4Mbps, /*!< drive SClk with frequency 4Mbps */
+ Freq_8Mbps /*!< drive SClk with frequency 8Mbps */
+} SPIFrequency_t;
+
+/**
+ * SPI master module number
+ */
+typedef enum
+{
+ SPI0 = 0, /*!< SPI module 0 */
+ SPI1 /*!< SPI module 1 */
+} SPIModuleNumber;
+
+/**
+ * SPI mode
+ */
+typedef enum
+{
+ //------------------------Clock polarity 0, Clock starts with level 0-------------------------------------------
+ SPI_MODE0 = 0, /*!< Sample data at rising edge of clock and shift serial data at falling edge */
+ SPI_MODE1, /*!< sample data at falling edge of clock and shift serial data at rising edge */
+ //------------------------Clock polarity 1, Clock starts with level 1-------------------------------------------
+ SPI_MODE2, /*!< sample data at falling edge of clock and shift serial data at rising edge */
+ SPI_MODE3 /*!< Sample data at rising edge of clock and shift serial data at falling edge */
+} SPIMode;
+
+
+/**
+ * @brief Function for initializing given SPI master with given configuration.
+ *
+ * After initializing the given SPI master with given configuration, this function also test if the
+ * SPI slave is responding with the configurations by transmitting few test bytes. If the slave did not
+ * respond then error is returned and contents of the rx_data are invalid.
+ *
+ * @param module_number SPI master number (SPIModuleNumber) to initialize.
+ * @param mode SPI master mode (mode 0, 1, 2 or 3 from SPIMode)
+ * @param lsb_first true if lsb is first bit to shift in/out as serial data on MISO/MOSI pins.
+ * @return
+ * @retval pointer to direct physical address of the requested SPI module if init was successful
+ * @retval 0, if either init failed or slave did not respond to the test transfer
+ */
+uint32_t* spi_master_init(SPIModuleNumber module_number, SPIMode mode, bool lsb_first);
+
+/**
+ * @brief Function for transferring/receiving data over SPI bus.
+ *
+ * If TWI master detects even one NACK from the slave or timeout occurs, STOP condition is issued
+ * and the function returns false.
+ *
+ * @note Make sure at least transfer_size number of bytes is allocated in tx_data/rx_data.
+ *
+ * @param spi_base_address register base address of the selected SPI master module
+ * @param transfer_size number of bytes to transmit/receive over SPI master
+ * @param tx_data pointer to the data that needs to be transmitted
+ * @param rx_data pointer to the data that needs to be received
+ * @return
+ * @retval true if transmit/reveive of transfer_size were completed.
+ * @retval false if transmit/reveive of transfer_size were not complete and tx_data/rx_data points to invalid data.
+ */
+//bool spi_master_tx_rx(uint32_t *spi_base_address, uint16_t transfer_size, const uint8_t *tx_data, uint8_t *rx_data);
+bool spi_master_tx_rx(SPIModuleNumber module_number, uint16_t transfer_size, const uint8_t *tx_data, uint8_t *rx_data);
+
+/**
+ *@}
+ **/
+
+#endif /* SPI_MASTER_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WIFI_Driver/nordic/spi_master_config.h Tue Jun 09 06:04:13 2015 +0000 @@ -0,0 +1,59 @@ +/* Copyright (c) 2012 Nordic Semiconductor. All Rights Reserved. + * + * The information contained herein is property of Nordic Semiconductor ASA. + * Terms and conditions of usage are described in detail in NORDIC + * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT. + * + * Licensees are granted free, non-transferable use of the information. NO + * WARRANTY of ANY KIND is provided. This heading must NOT be removed from + * the file. + * + */ +#ifndef SPI_MASTER_CONFIG_H +#define SPI_MASTER_CONFIG_H + +#define SPI_OPERATING_FREQUENCY_8M ( 0x02000000UL << (uint32_t)Freq_8Mbps ) /*!< Slave clock frequency. */ +#define SPI_OPERATING_FREQUENCY_4M ( 0x02000000UL << (uint32_t)Freq_4Mbps ) /*!< Slave clock frequency. */ +#define SPI_OPERATING_FREQUENCY_1M ( 0x02000000UL << (uint32_t)Freq_1Mbps ) /*!< Slave clock frequency. */ + +/* SPI0 */ + //modified by Tsungta, SCK/MOSI/MISO are shared +#define SPI_PSELSCK0 11//25//31 /*!< GPIO pin number for SPI clock (note that setting this to 31 will only work for loopback purposes as it not connected to a pin) */ +#define SPI_PSELMOSI0 15//24//20 /*!< GPIO pin number for Master Out Slave In */ +#define SPI_PSELMISO0 9//29//22 /*!< GPIO pin number for Master In Slave Out */ +#define SPI_PSELSS0 12//30 /*!< GPIO pin number for Slave Select */ + +/* SPI1 */ +#define SPI_PSELSCK1 11//29 /*!< GPIO pin number for SPI clock */ +#define SPI_PSELMOSI1 15//21 /*!< GPIO pin number for Master Out Slave In */ +#define SPI_PSELMISO1 9//23 /*!< GPIO pin number for Master In Slave Out */ +#define SPI_PSELSS1 28//28 /*!< GPIO pin number for Slave Select */ +#define SPI_PSELSS1_flash 28 // added by Tsungta +//#define DEBUG +#ifdef DEBUG +#define DEBUG_EVENT_READY_PIN0 10 /*!< when DEBUG is enabled, this GPIO pin is toggled everytime READY_EVENT is set for SPI0, no toggling means something has gone wrong */ +#define DEBUG_EVENT_READY_PIN1 11 /*!< when DEBUG is enabled, this GPIO pin is toggled everytime READY_EVENT is set for SPI1, no toggling means something has gone wrong */ +#endif + +#define NUMBER_OF_TEST_BYTES 2 /*!< number of bytes to send to slave to test if Initialization was successful */ +#define TEST_BYTE 0xBB /*!< Randomly chosen test byte to transmit to spi slave */ +#define TIMEOUT_COUNTER 0x3000UL /*!< timeout for getting rx bytes from slave */ + +/** @def TX_RX_MSG_LENGTH + * number of bytes to transmit and receive. This amount of bytes will also be tested to see that + * the received bytes from slave are the same as the transmitted bytes from the master */ +#define TX_RX_MSG_LENGTH 100 + +/** @def ERROR_PIN_SPI0 + * This pin is set active high when there is an error either in TX/RX for SPI0 or if the received bytes does not totally match the transmitted bytes. + * This functionality can be tested by temporarily disconnecting the MISO pin while running this example. + */ +#define ERROR_PIN_SPI0 8UL + +/** @def ERROR_PIN_SPI1 + * This pin is set active high when there is an error either in TX/RX for SPI1 or if the received bytes does not totally match the transmitted bytes. + * This functionality can be tested by temporarily disconnecting the MISO pin while running this example. + */ +#define ERROR_PIN_SPI1 9UL + +#endif /* SPI_MASTER_CONFIG_H */
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/wifi_api.h Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,64 @@
+
+
+#ifndef WIFI_API_H
+#define WIFI_API_H
+
+#include <stdbool.h>
+#include <stdint.h>
+
+/* @file
+* @brief Wi-Fi Connection API for NNN40.
+*
+*
+* @defgroup lib_driver_spi_master Software controlled SPI Master driver
+* @{
+* @ingroup nrf_drivers
+* @brief Software controlled SPI Master driver.
+*
+* Supported features:
+* - Operate two SPI masters independently or in parallel.
+* - Transmit and Receive given size of data through SPI.
+* - configure each SPI module separately through @ref spi_master_init.
+*/
+
+#define SSID_MAX_LENGTH 32
+#define SCAN_SSID_MAX_NUM 20
+
+#define ticker_internal 20
+#define wait_ms_internal 1
+
+/**
+ * Wi-Fi Init
+ */
+int wifi_init(void);
+int wifi_apConnect(void);
+void wifi_ssid_pw_set(uint8_t* SSID, uint8_t* PW, uint8_t priority);
+uint8_t wifi_scan(void);
+int wifi_connect(unsigned int timeout_ms);
+int wifi_static_ip_set(const char * ip, const char * netmask, const char * gateway);
+int wifi_disconnect(void);
+
+int wifi_UDP_server_init(const int port);
+int wifi_TCP_server_init(const int port);
+int wifi_UDP_client_init(void);
+int wifi_TCP_client_init(const char *ipv4_addr, const int port, bool new_socket);
+int wifi_send_UDP(char *data, int length, uint8_t cid, const char *ipv4_addr, const int port);
+int wifi_send_TCP(char *data, uint8_t cid);
+
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+void start_socket_routine(void);
+int wifi_receive_UDP_callback(uint8_t *data, uint8_t cid);
+int wifi_receive_TCP_callback(uint8_t *data, uint8_t cid);
+void Socket_Close_All(void);
+int wifi_ipconfig(unsigned int timeout_ms);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
Binary file WIFI_Driver/wifi_api.o has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/WIFI_Driver/wifi_core.c Tue Jun 09 06:04:13 2015 +0000
@@ -0,0 +1,132 @@
+/* Copyright (c) Cyntec Inc. All Rights Reserved.
+ *
+ *
+ */
+
+#include "wait_api.h"
+
+#if WIFI_API_DEBUG_LOG
+#include "simple_uart.h"
+#endif
+
+#include "nrf_gpio.h"
+#include "boards.h"
+#include "nmi_wlan_if.h"
+#include "nmi_wlan.h"//Ryan
+
+#include "spi_flash.h" //added by Tsungta
+#include "wifi_core.h"
+
+extern u8 wifi_event;//Ryan
+extern uint8_t nmi_macaddress[6];
+extern bool start_routine;
+
+
+
+void wifi_pin_CFG(void)
+{
+ //followings are added by Tsungta
+ nrf_gpio_cfg_output(19); // SWIO
+ nrf_gpio_cfg_output(18); //WLAN_Wake
+ nrf_gpio_cfg_output(8); //Chip_En
+ nrf_gpio_cfg_output(10); //Reset_n
+ nrf_gpio_pin_set(19);
+ nrf_gpio_pin_set(18);
+ nrf_gpio_pin_set(8);
+ nrf_gpio_pin_clear(10);
+ wait_ms(1);
+ nrf_gpio_pin_set(10);
+}
+
+extern u8 hif;//Ryan
+uint8_t rx_isr = 0;//Ryan
+extern struct nmi_wl_adp_t adp;//Ryan
+extern u8 bCfgScanning;//Ryan
+extern u8 mac_ready;//Ryan
+extern u8 scan_done;//Ryan
+u8 MacStatus;//Ryan
+
+void notify_Connect_Status(MAC_STATUS_T connect_status) {
+ MacStatus = connect_status;
+ if (connect_status == MAC_CONNECTED)
+ wifi_event = WIFI_CONNECTED;
+ else if (connect_status == MAC_DISCONNECTED)
+ wifi_event = WIFI_DISCONNECTED;
+ DPRINT(N_ERR, "notify_Connect_Status: %d\r\n", connect_status);
+}
+
+void check_rx_int(void)
+{
+ if (rx_isr)// == 1)
+ {
+ rx_isr--;//= 0;
+// adp.core.host_indicate_rx_isr();
+ adp.core.host_rx_trans();
+ }
+}
+
+u8 get_rx_int(void)
+{
+ return rx_isr+2;
+}
+
+
+extern u8 scanned_match_index;
+
+int wifi_core_start(void)
+{
+
+ uint8_t i;
+ MacStatus = MAC_DISCONNECTED;//Ryan
+
+if (!start_routine) {
+ start_routine = true;
+
+#if WIFI_API_DEBUG_LOG
+ simple_uart_config(RTS_PIN_NUMBER, TX_PIN_NUMBER, CTS_PIN_NUMBER, RX_PIN_NUMBER, HWFC);
+#endif
+
+ spi_flash_init();
+ spi_flash_read_security(0x002000, nmi_macaddress, 6);
+}
+
+
+
+ wifi_pin_CFG();
+
+ nmc1000_wifi_reset();
+ nmc1000_wifi_on();
+
+
+
+}
+
+int wait_wifi_event(void)
+{
+ DPRINT(N_ERR, "wait_wifi_event!!\n");
+ while(!wifi_event)
+ {
+ if (rx_isr)// == 1)
+ {
+ rx_isr--;// = 0;
+// adp.core.host_indicate_rx_isr();
+ adp.core.host_rx_trans();
+ continue;
+ }
+ if (hif == 1)
+ {
+ hif = 0;
+ adp.core.host_trans();
+ continue;
+ }
+ //wifi_handle_event
+ }
+}
+
+void nmi_os_trace(char *log)
+{
+#if WIFI_API_DEBUG_LOG
+ simple_uart_putstring((const uint8_t *)log);
+#endif
+// SCI_TraceLow("%s", log);
+}
\ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WIFI_Driver/wifi_core.h Tue Jun 09 06:04:13 2015 +0000 @@ -0,0 +1,15 @@ +#define WIFI_API_DEBUG_LOG 1 + +#ifndef WIFI_CORE_H +#define WIFI_CORE_H + +#include <stdbool.h> +#include <stdint.h> + + +int wifi_core_start(void); +int wait_wifi_event(void); +void GPIOTE_IRQHandler_Ext(void); + +void check_rx_int(void); +#endif
Binary file wifidevice.o has changed