From c1782ac024a42c06680f511c939e653aacdb411d Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Tue, 10 Nov 2009 06:22:03 +0000 Subject: Added new stream creation function to the CDC Class drivers, to easily make standard streams from CDC Class driver instances. --- Demos/Device/ClassDriver/CDC/CDC.c | 34 +++++++++++--------------------- Demos/Device/ClassDriver/CDC/CDC.h | 1 + Demos/Host/ClassDriver/CDCHost/CDCHost.c | 22 --------------------- LUFA/Drivers/USB/Class/Device/CDC.c | 20 +++++++++++++++++++ LUFA/Drivers/USB/Class/Device/CDC.h | 15 ++++++++++++++ LUFA/Drivers/USB/Class/Host/CDC.c | 20 +++++++++++++++++++ LUFA/Drivers/USB/Class/Host/CDC.h | 17 ++++++++++++++++ LUFA/ManPages/ChangeLog.txt | 2 +- LUFA/ManPages/VIDAndPIDValues.txt | 4 ++-- 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 - * 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 #include #include + #include #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 - * 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 #include /* 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 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 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 + #include /* 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 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 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 * * Changed: * - 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 + * 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. * -- cgit v1.2.3