CC3000HostDriver for device TI CC3000 some changes were made due to mbed compiler and the use of void*

Dependents:   CC3000Test

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers netapp.cpp Source File

netapp.cpp

00001 /*****************************************************************************
00002 *
00003 *  netapp.c  - CC3000 Host Driver Implementation.
00004 *  Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
00005 *
00006 *  Redistribution and use in source and binary forms, with or without
00007 *  modification, are permitted provided that the following conditions
00008 *  are met:
00009 *
00010 *    Redistributions of source code must retain the above copyright
00011 *    notice, this list of conditions and the following disclaimer.
00012 *
00013 *    Redistributions in binary form must reproduce the above copyright
00014 *    notice, this list of conditions and the following disclaimer in the
00015 *    documentation and/or other materials provided with the   
00016 *    distribution.
00017 *
00018 *    Neither the name of Texas Instruments Incorporated nor the names of
00019 *    its contributors may be used to endorse or promote products derived
00020 *    from this software without specific prior written permission.
00021 *
00022 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
00023 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
00024 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
00025 *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
00026 *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
00027 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 
00028 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00029 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00030 *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
00031 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 
00032 *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00033 *
00034 *****************************************************************************/
00035 #include <string.h>
00036 #include "netapp.h"
00037 #include "hci.h"
00038 #include "socket.h"
00039 #include "evnt_handler.h"
00040 #include "nvmem.h"
00041 
00042 #define MIN_TIMER_VAL_SECONDS      20
00043 #define MIN_TIMER_SET(t)    if ((0 != t) && (t < MIN_TIMER_VAL_SECONDS)) \
00044                             { \
00045                                 t = MIN_TIMER_VAL_SECONDS; \
00046                             }
00047 
00048 
00049 #define NETAPP_DHCP_PARAMS_LEN                 (20)
00050 #define NETAPP_SET_TIMER_PARAMS_LEN         (20)
00051 #define NETAPP_SET_DEBUG_LEVEL_PARAMS_LEN    (4)
00052 #define NETAPP_PING_SEND_PARAMS_LEN            (16)
00053 
00054 
00055 //*****************************************************************************
00056 //
00057 //!  netapp_config_mac_adrress
00058 //!
00059 //!  @param  mac   device mac address, 6 bytes. Saved: yes 
00060 //!
00061 //!  @return       return on success 0, otherwise error.
00062 //!
00063 //!  @brief        Configure device MAC address and store it in NVMEM. 
00064 //!                The value of the MAC address configured through the API will
00065 //!                     be stored in CC3000 non volatile memory, thus preserved 
00066 //!                over resets.
00067 //
00068 //*****************************************************************************
00069 long netapp_config_mac_adrress(unsigned char * mac)
00070 {
00071     return  nvmem_set_mac_address(mac);
00072 }
00073 
00074 //*****************************************************************************
00075 //
00076 //!  netapp_dhcp
00077 //!
00078 //!  @param  aucIP               device mac address, 6 bytes. Saved: yes 
00079 //!  @param  aucSubnetMask       device mac address, 6 bytes. Saved: yes 
00080 //!  @param  aucDefaultGateway   device mac address, 6 bytes. Saved: yes 
00081 //!  @param  aucDNSServer        device mac address, 6 bytes. Saved: yes 
00082 //!
00083 //!  @return       return on success 0, otherwise error.
00084 //!
00085 //!  @brief       netapp_dhcp is used to configure the network interface, 
00086 //!               static or dynamic (DHCP).\n In order to activate DHCP mode, 
00087 //!               aucIP, aucSubnetMask, aucDefaultGateway must be 0.
00088 //!               The default mode of CC3000 is DHCP mode.
00089 //!               Note that the configuration is saved in non volatile memory
00090 //!               and thus preserved over resets.
00091 //!     
00092 //! @note         If the mode is altered a reset of CC3000 device is required 
00093 //!               in order to apply changes.\nAlso note that asynchronous event 
00094 //!               of DHCP_EVENT, which is generated when an IP address is 
00095 //!               allocated either by the DHCP server or due to static 
00096 //!               allocation is generated only upon a connection to the 
00097 //!               AP was established. 
00098 //!
00099 //*****************************************************************************
00100 long netapp_dhcp(unsigned long *aucIP, unsigned long *aucSubnetMask,unsigned long *aucDefaultGateway, unsigned long *aucDNSServer)
00101 {
00102     signed char scRet;
00103     unsigned char *ptr;
00104     unsigned char *args;
00105     
00106     scRet = EFAIL;
00107     ptr = tSLInformation.pucTxCommandBuffer;
00108     args = (ptr + HEADERS_SIZE_CMD);
00109     
00110     // Fill in temporary command buffer
00111     ARRAY_TO_STREAM(args,aucIP,4);
00112     ARRAY_TO_STREAM(args,aucSubnetMask,4);
00113     ARRAY_TO_STREAM(args,aucDefaultGateway,4);
00114     args = UINT32_TO_STREAM(args, 0);
00115     ARRAY_TO_STREAM(args,aucDNSServer,4);
00116     
00117     // Initiate a HCI command
00118     hci_command_send(HCI_NETAPP_DHCP, ptr, NETAPP_DHCP_PARAMS_LEN);
00119     
00120     // Wait for command complete event
00121     SimpleLinkWaitEvent(HCI_NETAPP_DHCP, (long*)&scRet);
00122     
00123     return(scRet);
00124 }
00125 
00126 
00127 //*****************************************************************************
00128 //
00129 //!  netapp_timeout_values
00130 //!
00131 //!  @param  aucDHCP    DHCP lease time request, also impact 
00132 //!                     the DHCP renew timeout. Range: [0-0xffffffff] seconds,
00133 //!                     0 or 0xffffffff == infinity lease timeout.
00134 //!                     Resolution:10 seconds. Influence: only after 
00135 //!                     reconnecting to the AP. 
00136 //!                     Minimal bound value: MIN_TIMER_VAL_SECONDS - 20 seconds.
00137 //!                     The parameter is saved into the CC3000 NVMEM. 
00138 //!                     The default value on CC3000 is 14400 seconds.
00139 //!     
00140 //!  @param  aucARP     ARP refresh timeout, if ARP entry is not updated by
00141 //!                     incoming packet, the ARP entry will be  deleted by
00142 //!                     the end of the timeout. 
00143 //!                     Range: [0-0xffffffff] seconds, 0 == infinity ARP timeout
00144 //!                     Resolution: 10 seconds. Influence: on runtime.
00145 //!                     Minimal bound value: MIN_TIMER_VAL_SECONDS - 20 seconds
00146 //!                     The parameter is saved into the CC3000 NVMEM. 
00147 //!                        The default value on CC3000 is 3600 seconds.
00148 //!
00149 //!  @param  aucKeepalive   Keepalive event sent by the end of keepalive timeout
00150 //!                         Range: [0-0xffffffff] seconds, 0 == infinity timeout
00151 //!                         Resolution: 10 seconds.
00152 //!                         Influence: on runtime.
00153 //!                         Minimal bound value: MIN_TIMER_VAL_SECONDS - 20 sec
00154 //!                         The parameter is saved into the CC3000 NVMEM. 
00155 //!                         The default value on CC3000 is 10 seconds.
00156 //!
00157 //!  @param  aucInactivity   Socket inactivity timeout, socket timeout is
00158 //!                          refreshed by incoming or outgoing packet, by the
00159 //!                          end of the socket timeout the socket will be closed
00160 //!                          Range: [0-0xffffffff] sec, 0 == infinity timeout.
00161 //!                          Resolution: 10 seconds. Influence: on runtime.
00162 //!                          Minimal bound value: MIN_TIMER_VAL_SECONDS - 20 sec
00163 //!                          The parameter is saved into the CC3000 NVMEM. 
00164 //!                             The default value on CC3000 is 60 seconds.
00165 //!
00166 //!  @return       return on success 0, otherwise error.
00167 //!
00168 //!  @brief       Set new timeout values. Function set new timeout values for: 
00169 //!               DHCP lease timeout, ARP  refresh timeout, keepalive event 
00170 //!               timeout and socket inactivity timeout 
00171 //!     
00172 //! @note         If a parameter set to non zero value which is less than 20s,
00173 //!               it will be set automatically to 20s.
00174 //!
00175 //*****************************************************************************
00176 
00177 #ifndef CC3000_TINY_DRIVER
00178 long 
00179 netapp_timeout_values(unsigned long *aucDHCP, unsigned long *aucARP,unsigned long *aucKeepalive,    unsigned long *aucInactivity)
00180 {
00181     signed char scRet;
00182     unsigned char *ptr;
00183     unsigned char *args;
00184     
00185     scRet = EFAIL;
00186     ptr = tSLInformation.pucTxCommandBuffer;
00187     args = (ptr + HEADERS_SIZE_CMD);
00188     
00189     // Set minimal values of timers 
00190     MIN_TIMER_SET(*aucDHCP)
00191     MIN_TIMER_SET(*aucARP)
00192     MIN_TIMER_SET(*aucKeepalive)
00193     MIN_TIMER_SET(*aucInactivity)
00194                     
00195     // Fill in temporary command buffer
00196     args = UINT32_TO_STREAM(args, *aucDHCP);
00197     args = UINT32_TO_STREAM(args, *aucARP);
00198     args = UINT32_TO_STREAM(args, *aucKeepalive);
00199     args = UINT32_TO_STREAM(args, *aucInactivity);
00200     
00201     // Initiate a HCI command
00202     hci_command_send(HCI_NETAPP_SET_TIMERS, ptr, NETAPP_SET_TIMER_PARAMS_LEN);
00203     
00204     // Wait for command complete event
00205     SimpleLinkWaitEvent(HCI_NETAPP_SET_TIMERS, (long*)&scRet);
00206     
00207     return(scRet);
00208 }
00209 #endif
00210 
00211 
00212 //*****************************************************************************
00213 //
00214 //!  netapp_ping_send
00215 //!
00216 //!  @param  ip              destination IP address
00217 //!  @param  pingAttempts    number of echo requests to send
00218 //!  @param  pingSize        send buffer size which may be up to 1400 bytes 
00219 //!  @param  pingTimeout     Time to wait for a response,in milliseconds.
00220 //!
00221 //!  @return       return on success 0, otherwise error.
00222 //!
00223 //!  @brief       send ICMP ECHO_REQUEST to network hosts 
00224 //!     
00225 //! @note         If an operation finished successfully asynchronous ping report 
00226 //!               event will be generated. The report structure is as defined
00227 //!               by structure netapp_pingreport_args_t.
00228 //!
00229 //! @warning      Calling this function while a previous Ping Requests are in 
00230 //!               progress will stop the previous ping request.
00231 //*****************************************************************************
00232 
00233 #ifndef CC3000_TINY_DRIVER
00234 long
00235 netapp_ping_send(unsigned long *ip, unsigned long ulPingAttempts, unsigned long ulPingSize, unsigned long ulPingTimeout)
00236 {
00237     signed char scRet;
00238     unsigned char *ptr, *args;
00239     
00240     scRet = EFAIL;
00241     ptr = tSLInformation.pucTxCommandBuffer;
00242     args = (ptr + HEADERS_SIZE_CMD);
00243     
00244     // Fill in temporary command buffer
00245     args = UINT32_TO_STREAM(args, *ip);
00246     args = UINT32_TO_STREAM(args, ulPingAttempts);
00247     args = UINT32_TO_STREAM(args, ulPingSize);
00248     args = UINT32_TO_STREAM(args, ulPingTimeout);
00249     
00250     // Initiate a HCI command
00251     hci_command_send(HCI_NETAPP_PING_SEND, ptr, NETAPP_PING_SEND_PARAMS_LEN);
00252     
00253     // Wait for command complete event
00254     SimpleLinkWaitEvent(HCI_NETAPP_PING_SEND, (long*)&scRet);
00255     
00256     return(scRet);
00257 }
00258 #endif
00259 
00260 //*****************************************************************************
00261 //
00262 //!  netapp_ping_report
00263 //!
00264 //!  @param  none
00265 //!
00266 //!  @return  none
00267 //!
00268 //!  @brief   Request for ping status. This API triggers the CC3000 to send 
00269 //!           asynchronous events: HCI_EVNT_WLAN_ASYNC_PING_REPORT.
00270 //!           This event will carry  the report structure:
00271 //!           netapp_pingreport_args_t. This structure is filled in with ping
00272 //!           results up till point of triggering API.
00273 //!           netapp_pingreport_args_t:\n packets_sent - echo sent,
00274 //!           packets_received - echo reply, min_round_time - minimum
00275 //!           round time, max_round_time - max round time,
00276 //!           avg_round_time - average round time
00277 //!     
00278 //! @note     When a ping operation is not active, the returned structure 
00279 //!           fields are 0.
00280 //!
00281 //*****************************************************************************
00282 
00283 
00284 #ifndef CC3000_TINY_DRIVER
00285 void netapp_ping_report()
00286 {
00287     unsigned char *ptr;
00288     ptr = tSLInformation.pucTxCommandBuffer;
00289     signed char scRet;
00290     
00291     scRet = EFAIL;
00292     
00293     // Initiate a HCI command
00294     hci_command_send(HCI_NETAPP_PING_REPORT, ptr, 0);
00295     
00296     // Wait for command complete event
00297     SimpleLinkWaitEvent(HCI_NETAPP_PING_REPORT, (long*)&scRet); 
00298 }
00299 #endif
00300 
00301 //*****************************************************************************
00302 //
00303 //!  netapp_ping_stop
00304 //!
00305 //!  @param  none
00306 //!
00307 //!  @return  On success, zero is returned. On error, -1 is returned.      
00308 //!
00309 //!  @brief   Stop any ping request.
00310 //!     
00311 //!
00312 //*****************************************************************************
00313 
00314 #ifndef CC3000_TINY_DRIVER
00315 long netapp_ping_stop()
00316 {
00317     signed char scRet;
00318     unsigned char *ptr;
00319     
00320     scRet = EFAIL;
00321     ptr = tSLInformation.pucTxCommandBuffer;
00322     
00323     // Initiate a HCI command
00324     hci_command_send(HCI_NETAPP_PING_STOP, ptr, 0);
00325     
00326     // Wait for command complete event
00327     SimpleLinkWaitEvent(HCI_NETAPP_PING_STOP, (long*)&scRet);
00328     
00329     return(scRet);
00330 }
00331 #endif
00332 
00333 //*****************************************************************************
00334 //
00335 //!  netapp_ipconfig
00336 //!
00337 //!  @param[out]  ipconfig  This argument is a pointer to a 
00338 //!                         tNetappIpconfigRetArgs structure. This structure is
00339 //!                         filled in with the network interface configuration.
00340 //!                         tNetappIpconfigRetArgs:\n aucIP - ip address,
00341 //!                         aucSubnetMask - mask, aucDefaultGateway - default
00342 //!                         gateway address, aucDHCPServer - dhcp server address
00343 //!                         aucDNSServer - dns server address, uaMacAddr - mac
00344 //!                         address, uaSSID - connected AP ssid
00345 //!
00346 //!  @return  none
00347 //!
00348 //!  @brief   Obtain the CC3000 Network interface information.
00349 //!           Note that the information is available only after the WLAN
00350 //!               connection was established. Calling this function before
00351 //!           associated, will cause non-defined values to be returned.
00352 //!     
00353 //! @note     The function is useful for figuring out the IP Configuration of
00354 //!               the device when DHCP is used and for figuring out the SSID of
00355 //!               the Wireless network the device is associated with.
00356 //!
00357 //*****************************************************************************
00358 
00359 #ifndef CC3000_TINY_DRIVER
00360 void netapp_ipconfig( tNetappIpconfigRetArgs * ipconfig )
00361 {
00362     unsigned char *ptr;
00363     
00364     ptr = tSLInformation.pucTxCommandBuffer;
00365     
00366     // Initiate a HCI command
00367     hci_command_send(HCI_NETAPP_IPCONFIG, ptr, 0);
00368     
00369     // Wait for command complete event
00370     SimpleLinkWaitEvent(HCI_NETAPP_IPCONFIG, (long*)ipconfig );
00371     
00372 }
00373 #else
00374 void netapp_ipconfig( tNetappIpconfigRetArgs * ipconfig )
00375 {
00376 
00377 }
00378 #endif
00379 
00380 //*****************************************************************************
00381 //
00382 //!  netapp_arp_flush
00383 //!
00384 //!  @param  none
00385 //!
00386 //!  @return  none
00387 //!
00388 //!  @brief  Flushes ARP table
00389 //!
00390 //*****************************************************************************
00391 
00392 #ifndef CC3000_TINY_DRIVER
00393 long netapp_arp_flush(void)
00394 {
00395     signed char scRet;
00396     unsigned char *ptr;
00397     
00398     scRet = EFAIL;
00399     ptr = tSLInformation.pucTxCommandBuffer;
00400     
00401     // Initiate a HCI command
00402     hci_command_send(HCI_NETAPP_ARP_FLUSH, ptr, 0);
00403     
00404     // Wait for command complete event
00405     SimpleLinkWaitEvent(HCI_NETAPP_ARP_FLUSH, (long*)&scRet);
00406     
00407     return(scRet);
00408 }
00409 #endif
00410 
00411 //*****************************************************************************
00412 //
00413 //!  netapp_set_debug_level
00414 //!
00415 //!  @param[in]      level    debug level. Bitwise [0-8],
00416 //!                         0(disable)or 1(enable).\n Bitwise map: 0 - Critical
00417 //!                         message, 1 information message, 2 - core messages, 3 -
00418 //!                         HCI messages, 4 - Network stack messages, 5 - wlan
00419 //!                         messages, 6 - wlan driver messages, 7 - epprom messages,
00420 //!                         8 - general messages. Default: 0x13f. Saved: no
00421 //!
00422 //!  @return  On success, zero is returned. On error, -1 is returned
00423 //!
00424 //!  @brief   Debug messages sent via the UART debug channel, this function
00425 //!              enable/disable the debug level
00426 //!
00427 //*****************************************************************************
00428 
00429 
00430 #ifndef CC3000_TINY_DRIVER
00431 long netapp_set_debug_level(unsigned long ulLevel)
00432 {
00433     signed char scRet;
00434     unsigned char *ptr, *args;
00435 
00436     scRet = EFAIL;
00437     ptr = tSLInformation.pucTxCommandBuffer;
00438     args = (ptr + HEADERS_SIZE_CMD);
00439 
00440     //
00441     // Fill in temporary command buffer
00442     //
00443     args = UINT32_TO_STREAM(args, ulLevel);
00444 
00445 
00446     //
00447     // Initiate a HCI command
00448     //
00449     hci_command_send(HCI_NETAPP_SET_DEBUG_LEVEL, ptr, NETAPP_SET_DEBUG_LEVEL_PARAMS_LEN);
00450 
00451     //
00452     // Wait for command complete event
00453     //
00454     SimpleLinkWaitEvent(HCI_NETAPP_SET_DEBUG_LEVEL, (long*)&scRet);
00455 
00456     return(scRet);
00457 
00458 }
00459 #endif
00460