CI: Build on Arch (bleeding-ege) and Ubuntu (stable) AVR-GCC toolchains.
[pub/USBasp.git] / LUFA / Drivers / USB / Class / Device / CDCClassDevice.c
index ff0f9bb..8b6b48c 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2012.
+     Copyright (C) Dean Camera, 2018.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2018  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
@@ -74,7 +74,7 @@ void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* const CDCInter
                                        if (USB_DeviceState == DEVICE_STATE_Unattached)
                                          return;
                                }
-                               
+
                                CDCInterfaceInfo->State.LineEncoding.BaudRateBPS = Endpoint_Read_32_LE();
                                CDCInterfaceInfo->State.LineEncoding.CharFormat  = Endpoint_Read_8();
                                CDCInterfaceInfo->State.LineEncoding.ParityType  = Endpoint_Read_8();
@@ -138,7 +138,10 @@ void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
          return;
 
        #if !defined(NO_CLASS_DRIVER_AUTOFLUSH)
-       CDC_Device_Flush(CDCInterfaceInfo);
+       Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address);
+
+       if (Endpoint_IsINReady())
+         CDC_Device_Flush(CDCInterfaceInfo);
        #endif
 }
 
@@ -153,7 +156,7 @@ uint8_t CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo
 }
 
 uint8_t CDC_Device_SendData(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
-                            const char* const Buffer,
+                            const void* const Buffer,
                             const uint16_t Length)
 {
        if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
@@ -163,6 +166,29 @@ uint8_t CDC_Device_SendData(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
        return Endpoint_Write_Stream_LE(Buffer, Length, NULL);
 }
 
+#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE)
+       uint8_t CDC_Device_SendString_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                                       const char* const String)
+       {
+               if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+                 return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+               Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address);
+               return Endpoint_Write_PStream_LE(String, strlen_P(String), NULL);
+       }
+
+       uint8_t CDC_Device_SendData_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                                     const void* const Buffer,
+                                     const uint16_t Length)
+       {
+               if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS))
+                 return ENDPOINT_RWSTREAM_DeviceDisconnected;
+
+               Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address);
+               return Endpoint_Write_PStream_LE(Buffer, Length, NULL);
+       }
+#endif
+
 uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
                             const uint8_t Data)
 {
@@ -282,58 +308,62 @@ void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDC
 }
 
 #if defined(FDEV_SETUP_STREAM)
-void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
-                             FILE* const Stream)
-{
-       *Stream = (FILE)FDEV_SETUP_STREAM(CDC_Device_putchar, CDC_Device_getchar, _FDEV_SETUP_RW);
-       fdev_set_udata(Stream, CDCInterfaceInfo);
-}
-
-void CDC_Device_CreateBlockingStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
-                                     FILE* const Stream)
-{
-       *Stream = (FILE)FDEV_SETUP_STREAM(CDC_Device_putchar, CDC_Device_getchar_Blocking, _FDEV_SETUP_RW);
-       fdev_set_udata(Stream, CDCInterfaceInfo);
-}
+       void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                                    FILE* const Stream)
+       {
+               *Stream = (FILE)FDEV_SETUP_STREAM(CDC_Device_putchar, CDC_Device_getchar, _FDEV_SETUP_RW);
+               fdev_set_udata(Stream, CDCInterfaceInfo);
+       }
 
-static int CDC_Device_putchar(char c,
-                              FILE* Stream)
-{
-       return CDC_Device_SendByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream), c) ? _FDEV_ERR : 0;
-}
+       void CDC_Device_CreateBlockingStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo,
+                                            FILE* const Stream)
+       {
+               *Stream = (FILE)FDEV_SETUP_STREAM(CDC_Device_putchar, CDC_Device_getchar_Blocking, _FDEV_SETUP_RW);
+               fdev_set_udata(Stream, CDCInterfaceInfo);
+       }
 
-static int CDC_Device_getchar(FILE* Stream)
-{
-       int16_t ReceivedByte = CDC_Device_ReceiveByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream));
+       static int CDC_Device_putchar(char c,
+                                     FILE* Stream)
+       {
+               return CDC_Device_SendByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream), c) ? _FDEV_ERR : c;
+       }
 
-       if (ReceivedByte < 0)
-         return _FDEV_EOF;
+       static int CDC_Device_getchar(FILE* Stream)
+       {
+               int16_t ReceivedByte = CDC_Device_ReceiveByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream));
 
-       return ReceivedByte;
-}
+               if (ReceivedByte < 0)
+                 return _FDEV_EOF;
 
-static int CDC_Device_getchar_Blocking(FILE* Stream)
-{
-       int16_t ReceivedByte;
+               return ReceivedByte;
+       }
 
-       while ((ReceivedByte = CDC_Device_ReceiveByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream))) < 0)
+       static int CDC_Device_getchar_Blocking(FILE* Stream)
        {
-               if (USB_DeviceState == DEVICE_STATE_Unattached)
-                 return _FDEV_EOF;
+               int16_t ReceivedByte;
 
-               CDC_Device_USBTask((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream));
-               USB_USBTask();
-       }
+               while ((ReceivedByte = CDC_Device_ReceiveByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream))) < 0)
+               {
+                       if (USB_DeviceState == DEVICE_STATE_Unattached)
+                         return _FDEV_EOF;
 
-       return ReceivedByte;
-}
+                       CDC_Device_USBTask((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream));
+                       USB_USBTask();
+               }
+
+               return ReceivedByte;
+       }
 #endif
 
-// cppcheck-suppress unusedFunction
-void CDC_Device_Event_Stub(void)
+void CDC_Device_Event_Stub(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
 {
 
 }
 
+void CDC_Device_Event_Stub_2(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, const uint8_t _1)
+{
+       CDC_Device_Event_Stub(CDCInterfaceInfo);
+}
+
 #endif