aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2009-11-10 06:22:03 +0000
committerDean Camera <dean@fourwalledcubicle.com>2009-11-10 06:22:03 +0000
commitc1782ac024a42c06680f511c939e653aacdb411d (patch)
tree339e55e1aea49b719bfe8f31f4a9892791375a0d
parentd6edfe35c8a9490407e4a5e34f8e5108c6a260a3 (diff)
downloadlufa-c1782ac024a42c06680f511c939e653aacdb411d.tar.gz
lufa-c1782ac024a42c06680f511c939e653aacdb411d.tar.bz2
lufa-c1782ac024a42c06680f511c939e653aacdb411d.zip
Added new stream creation function to the CDC Class drivers, to easily make standard streams from CDC Class driver instances.
-rw-r--r--Demos/Device/ClassDriver/CDC/CDC.c34
-rw-r--r--Demos/Device/ClassDriver/CDC/CDC.h1
-rw-r--r--Demos/Host/ClassDriver/CDCHost/CDCHost.c22
-rw-r--r--LUFA/Drivers/USB/Class/Device/CDC.c20
-rw-r--r--LUFA/Drivers/USB/Class/Device/CDC.h15
-rw-r--r--LUFA/Drivers/USB/Class/Host/CDC.c20
-rw-r--r--LUFA/Drivers/USB/Class/Host/CDC.h17
-rw-r--r--LUFA/ManPages/ChangeLog.txt2
-rw-r--r--LUFA/ManPages/VIDAndPIDValues.txt4
9 files changed, 88 insertions, 47 deletions
diff --git a/Demos/Device/ClassDriver/CDC/CDC.c b/Demos/Device/ClassDriver/CDC/CDC.c
index 90cbaf0bc..5d74cb1a5 100644
--- a/Demos/Device/ClassDriver/CDC/CDC.c
+++ b/Demos/Device/ClassDriver/CDC/CDC.c
@@ -60,27 +60,10 @@ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
},
};
-#if 0
-/* NOTE: Here you can set up a standard stream using the created virtual serial port, so that the standard stream functions in
- * <stdio.h> can be used on the virtual serial port (e.g. fprintf(&USBSerial, "Test"); to print a string).
+/** Standard file stream for the CDC interface when set up, so that the virtual CDC COM port can be
+ * used like any regular character stream in the C APIs
*/
-
-static int CDC_putchar(char c, FILE *stream)
-{
- CDC_Device_SendByte(&VirtualSerial_CDC_Interface, c);
- return 0;
-}
-
-static int CDC_getchar(FILE *stream)
-{
- if (!(CDC_Device_BytesReceived(&VirtualSerial_CDC_Interface)))
- return -1;
-
- return CDC_Device_ReceiveByte(&VirtualSerial_CDC_Interface);
-}
-
-static FILE USBSerial = FDEV_SETUP_STREAM(CDC_putchar, CDC_getchar, _FDEV_SETUP_RW);
-#endif
+static FILE USBSerialStream;
/** Main program entry point. This routine contains the overall program flow, including initial
* setup of all components and the main program loop.
@@ -89,6 +72,9 @@ int main(void)
{
SetupHardware();
+ /* Create a regular character stream for the interface so that it can be used with the stdio.h functions */
+ CDC_Device_CreateStream(&VirtualSerial_CDC_Interface, &USBSerialStream);
+
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
for (;;)
@@ -143,8 +129,12 @@ void CheckJoystickMovement(void)
if ((ReportString != NULL) && (ActionSent == false))
{
ActionSent = true;
-
- CDC_Device_SendString(&VirtualSerial_CDC_Interface, ReportString, strlen(ReportString));
+
+ // Write the string to the virtual COM port via the created character stream
+ fputs(ReportString, &USBSerialStream);
+
+ // Alternatively, without the stream:
+ // CDC_Device_SendString(&VirtualSerial_CDC_Interface, ReportString, strlen(ReportString));
}
}
diff --git a/Demos/Device/ClassDriver/CDC/CDC.h b/Demos/Device/ClassDriver/CDC/CDC.h
index ee375a466..9cc72487c 100644
--- a/Demos/Device/ClassDriver/CDC/CDC.h
+++ b/Demos/Device/ClassDriver/CDC/CDC.h
@@ -41,6 +41,7 @@
#include <avr/wdt.h>
#include <avr/power.h>
#include <string.h>
+ #include <stdio.h>
#include "Descriptors.h"
diff --git a/Demos/Host/ClassDriver/CDCHost/CDCHost.c b/Demos/Host/ClassDriver/CDCHost/CDCHost.c
index ded3e4c10..e28f2f9e5 100644
--- a/Demos/Host/ClassDriver/CDCHost/CDCHost.c
+++ b/Demos/Host/ClassDriver/CDCHost/CDCHost.c
@@ -54,28 +54,6 @@ USB_ClassInfo_CDC_Host_t VirtualSerial_CDC_Interface =
.NotificationPipeDoubleBank = false,
},
};
-
-#if 0
-/* NOTE: Here you can set up a standard stream using the created virtual serial port, so that the standard stream functions in
- * <stdio.h> can be used on the virtual serial port (e.g. fprintf(&USBSerial, "Test"); to print a string).
- */
-
-static int CDC_putchar(char c, FILE *stream)
-{
- CDC_Host_SendByte(&VirtualSerial_CDC_Interface, c);
- return 0;
-}
-
-static int CDC_getchar(FILE *stream)
-{
- if (!(CDC_Host_BytesReceived(&VirtualSerial_CDC_Interface)))
- return -1;
-
- return CDC_Host_ReceiveByte(&VirtualSerial_CDC_Interface);
-}
-
-static FILE USBSerial = FDEV_SETUP_STREAM(CDC_putchar, CDC_getchar, _FDEV_SETUP_RW);
-#endif
/** Main program entry point. This routine configures the hardware required by the application, then
* enters a loop to run the application tasks in sequence.
diff --git a/LUFA/Drivers/USB/Class/Device/CDC.c b/LUFA/Drivers/USB/Class/Device/CDC.c
index dfee2bb1b..d0cb29ecf 100644
--- a/LUFA/Drivers/USB/Class/Device/CDC.c
+++ b/LUFA/Drivers/USB/Class/Device/CDC.c
@@ -234,4 +234,24 @@ void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDC
Endpoint_ClearIN();
}
+void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo, FILE* 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)
+{
+ CDC_Device_SendByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream), c);
+ return 0;
+}
+
+static int CDC_Device_getchar(FILE* Stream)
+{
+ if (!(CDC_Device_BytesReceived((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream))))
+ return -1;
+
+ return CDC_Device_ReceiveByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream));
+}
+
#endif
diff --git a/LUFA/Drivers/USB/Class/Device/CDC.h b/LUFA/Drivers/USB/Class/Device/CDC.h
index 1691857cd..857d07335 100644
--- a/LUFA/Drivers/USB/Class/Device/CDC.h
+++ b/LUFA/Drivers/USB/Class/Device/CDC.h
@@ -48,6 +48,7 @@
#include "../../USB.h"
#include "../Common/CDC.h"
+ #include <stdio.h>
#include <string.h>
/* Enable C linkage for C++ Compilers: */
@@ -209,10 +210,24 @@
*/
void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+ /** Creates a standard characer stream for the given CDC Device instance so that it can be used with all the regular
+ * functions in the avr-libc <stdio.h> library that accept a FILE stream as a destination (e.g. fprintf).
+ *
+ * \note The created stream can be given as stdout if desired to direct the standard output from all <stdio.h> functions
+ * to the given CDC interface.
+ *
+ * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state
+ * \param[in,out] Stream Pointer to a FILE structure where the created stream should be placed
+ */
+ void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo, FILE* Stream);
+
/* Private Interface - For use in library only: */
#if !defined(__DOXYGEN__)
/* Function Prototypes: */
#if defined(INCLUDE_FROM_CDC_CLASS_DEVICE_C)
+ static int CDC_Device_putchar(char c, FILE* Stream);
+ static int CDC_Device_getchar(FILE* Stream);
+
void CDC_Device_Event_Stub(void);
void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)
ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Device_Event_Stub);
diff --git a/LUFA/Drivers/USB/Class/Host/CDC.c b/LUFA/Drivers/USB/Class/Host/CDC.c
index db2f72183..6aceccaf1 100644
--- a/LUFA/Drivers/USB/Class/Host/CDC.c
+++ b/LUFA/Drivers/USB/Class/Host/CDC.c
@@ -334,6 +334,26 @@ uint8_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
return ReceivedByte;
}
+void CDC_Host_CreateStream(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, FILE* Stream)
+{
+ *Stream = (FILE)FDEV_SETUP_STREAM(CDC_Host_putchar, CDC_Host_getchar, _FDEV_SETUP_RW);
+ fdev_set_udata(Stream, CDCInterfaceInfo);
+}
+
+static int CDC_Host_putchar(char c, FILE* Stream)
+{
+ CDC_Host_SendByte((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream), c);
+ return 0;
+}
+
+static int CDC_Host_getchar(FILE* Stream)
+{
+ if (!(CDC_Host_BytesReceived((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream))))
+ return -1;
+
+ return CDC_Host_ReceiveByte((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream));
+}
+
void CDC_Host_Event_Stub(void)
{
diff --git a/LUFA/Drivers/USB/Class/Host/CDC.h b/LUFA/Drivers/USB/Class/Host/CDC.h
index 6b3a320f0..0ee24be48 100644
--- a/LUFA/Drivers/USB/Class/Host/CDC.h
+++ b/LUFA/Drivers/USB/Class/Host/CDC.h
@@ -47,6 +47,9 @@
/* Includes: */
#include "../../USB.h"
#include "../Common/CDC.h"
+
+ #include <stdio.h>
+ #include <string.h>
/* Enable C linkage for C++ Compilers: */
#if defined(__cplusplus)
@@ -205,6 +208,17 @@
*/
uint8_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1);
+ /** Creates a standard characer stream for the given CDC Device instance so that it can be used with all the regular
+ * functions in the avr-libc <stdio.h> library that accept a FILE stream as a destination (e.g. fprintf).
+ *
+ * \note The created stream can be given as stdout if desired to direct the standard output from all <stdio.h> functions
+ * to the given CDC interface.
+ *
+ * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state
+ * \param[in,out] Stream Pointer to a FILE structure where the created stream should be placed
+ */
+ void CDC_Host_CreateStream(USB_ClassInfo_CDC_Host_t* CDCInterfaceInfo, FILE* Stream);
+
/** CDC class driver event for a control line state change on a CDC host interface. This event fires each time the device notifies
* the host of a control line state change (containing the virtual serial control line states, such as DCD) and may be hooked in the
* user program by declaring a handler function with the same name and parameters listed here. The new control line states
@@ -231,6 +245,9 @@
/* Function Prototypes: */
#if defined(INCLUDE_FROM_CDC_CLASS_HOST_C)
+ static int CDC_Host_putchar(char c, FILE* Stream);
+ static int CDC_Host_getchar(FILE* Stream);
+
void CDC_Host_Event_Stub(void);
void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Host_Event_Stub);
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 0dd349655..aaa811f6d 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -13,12 +13,12 @@
* - Added new HID_HOST_BOOT_PROTOCOL_ONLY compile time token to reduce the size of the HID Host Class driver when
* Report protocol is not needed
* - Added new MIDI LowLevel and ClassDriver Host demo, add new MIDI Host Class driver
- * - Added stdio.h stream examples for the virtual CDC UART in the CDC host demos
* - Added new CDC/Mouse ClassDriver device demo
* - Added new Joystick Host ClassDriver and LowLevel demos
* - Added new Printer Host mode Class driver
* - Added new Printer Host mode ClassDriver demo
* - Added optional support for double banked endpoints in the Device mode Class drivers
+ * - Added new stream creation function to the CDC Class drivers, to easily make standard streams from CDC Class driver instances
*
* <b>Changed:</b>
* - Removed mostly useless "TestApp" demo, as it was mainly useful only for checking for sytax errors in the library
diff --git a/LUFA/ManPages/VIDAndPIDValues.txt b/LUFA/ManPages/VIDAndPIDValues.txt
index bfa493ff3..f1d66d2fb 100644
--- a/LUFA/ManPages/VIDAndPIDValues.txt
+++ b/LUFA/ManPages/VIDAndPIDValues.txt
@@ -11,8 +11,8 @@
* are used within the LUFA demos, and thus may be re-used by derivations of each demo. Free PID values may be
* used by future LUFA demo projects.
*
- * These VID/PID values should not be used in commercial designs under any circumstances. Private projects may
- * use the following values freely, but must accept any collisions due to other LUFA derived private projects
+ * <b>These VID/PID values should not be used in commercial designs under any circumstances.>/b> Private projects
+ * may use the following values freely, but must accept any collisions due to other LUFA derived private projects
* sharing identical values. It is suggested that private projects using interfaces compatible with existing
* demos share the save VID/PID value.
*