Add PROGMEM variant data send functions to the CDC host class driver.
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Device / RNDISClassDevice.h
index b4b4b2b..dbf51f4 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2012.
+     Copyright (C) Dean Camera, 2015.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2015  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
@@ -18,7 +18,7 @@
   advertising or publicity pertaining to distribution of the
   software without specific, written prior permission.
 
-  The author disclaim all warranties with regard to this
+  The author disclaims all warranties with regard to this
   software, including all implied warranties of merchantability
   and fitness.  In no event shall the author be liable for any
   special, indirect or consequential damages or any damages
 /** \ingroup Group_USBClassRNDIS
  *  \defgroup Group_USBClassRNDISDevice RNDIS Class Device Mode Driver
  *
- *  \section Sec_Dependencies Module Source Dependencies
+ *  \section Sec_USBClassRNDISDevice_Dependencies Module Source Dependencies
  *  The following files must be built with any user project that uses this module:
  *    - LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i>
  *
- *  \section Sec_ModDescription Module Description
+ *  \section Sec_USBClassRNDISDevice_ModDescription Module Description
  *  Device Mode USB Class driver framework interface, for the RNDIS USB Class driver.
  *
  *  @{
                         */
                        typedef struct
                        {
-                               const struct
+                               struct
                                {
                                        uint8_t  ControlInterfaceNumber; /**< Interface number of the RNDIS control interface within the device. */
 
-                                       uint8_t  DataINEndpointNumber; /**< Endpoint number of the RNDIS interface's IN data endpoint. */
-                                       uint16_t DataINEndpointSize; /**< Size in bytes of the RNDIS interface's IN data endpoint. */
-                                       bool     DataINEndpointDoubleBank; /**< Indicates if the RNDIS interface's IN data endpoint should use double banking. */
-
-                                       uint8_t  DataOUTEndpointNumber; /**< Endpoint number of the RNDIS interface's OUT data endpoint. */
-                                       uint16_t DataOUTEndpointSize;  /**< Size in bytes of the RNDIS interface's OUT data endpoint. */
-                                       bool     DataOUTEndpointDoubleBank; /**< Indicates if the RNDIS interface's OUT data endpoint should use double banking. */
-
-                                       uint8_t  NotificationEndpointNumber; /**< Endpoint number of the RNDIS interface's IN notification endpoint, if used. */
-                                       uint16_t NotificationEndpointSize;  /**< Size in bytes of the RNDIS interface's IN notification endpoint, if used. */
-                                       bool     NotificationEndpointDoubleBank; /**< Indicates if the RNDIS interface's notification endpoint should use double banking. */
+                                       USB_Endpoint_Table_t DataINEndpoint; /**< Data IN endpoint configuration table. */
+                                       USB_Endpoint_Table_t DataOUTEndpoint; /**< Data OUT endpoint configuration table. */
+                                       USB_Endpoint_Table_t NotificationEndpoint; /**< Notification IN Endpoint configuration table. */
 
                                        char*         AdapterVendorDescription; /**< String description of the adapter vendor. */
                                        MAC_Address_t AdapterMACAddress; /**< MAC address of the adapter. */
+
+                                       uint8_t*      MessageBuffer; /**< Buffer where RNDIS messages can be stored by the internal driver. This
+                                                                     *   should be at least 132 bytes in length for minimal functionality. */
+                                       uint16_t      MessageBufferLength; /**< Length in bytes of the \ref MessageBuffer RNDIS buffer. */
                                } Config; /**< Config data for the USB class interface within the device. All elements in this section
                                           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly.
                                           */
                                struct
                                {
-                                       uint8_t  RNDISMessageBuffer[RNDIS_MESSAGE_BUFFER_SIZE]; /**< Buffer to hold RNDIS messages to and from the host,
-                                                                                                                                                        *   managed by the class driver.
-                                                                                                                                                        */
                                        bool     ResponseReady; /**< Internal flag indicating if a RNDIS message is waiting to be returned to the host. */
                                        uint8_t  CurrRNDISState; /**< Current RNDIS state of the adapter, a value from the \ref RNDIS_States_t enum. */
                                        uint32_t CurrPacketFilter; /**< Current packet filter mode, used internally by the class driver. */
                         *
                         *  \return Boolean \c true if a packet is waiting to be read in by the host, \c false otherwise.
                         */
-                       bool RNDIS_Device_IsPacketReceived(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo);
+                       bool RNDIS_Device_IsPacketReceived(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
 
                        /** Retrieves the next pending packet from the device, discarding the remainder of the RNDIS packet header to leave
                         *  only the packet contents for processing by the device in the nominated buffer.
                         */
                        uint8_t RNDIS_Device_ReadPacket(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo,
                                                                                        void* Buffer,
-                                                                                       uint16_t* const PacketLength);
+                                                                                       uint16_t* const PacketLength) ATTR_NON_NULL_PTR_ARG(1);
 
                        /** Sends the given packet to the attached RNDIS device, after adding a RNDIS packet message header.
                         *
                         */
                        uint8_t RNDIS_Device_SendPacket(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo,
                                                                                        void* Buffer,
-                                                                                       const uint16_t PacketLength);
+                                                                                       const uint16_t PacketLength) ATTR_NON_NULL_PTR_ARG(1);
 
        /* Private Interface - For use in library only: */
        #if !defined(__DOXYGEN__)
+               /* Macros: */
+                       #define RNDIS_DEVICE_MIN_MESSAGE_BUFFER_LENGTH  sizeof(AdapterSupportedOIDList) + sizeof(RNDIS_Query_Complete_t)
+
                /* Function Prototypes: */
                #if defined(__INCLUDE_FROM_RNDIS_DEVICE_C)
                        static void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo)