Commit c1782ac0 authored by Dean Camera's avatar Dean Camera
Browse files

Added new stream creation function to the CDC Class drivers, to easily make...

Added new stream creation function to the CDC Class drivers, to easily make standard streams from CDC Class driver instances.
parent d6edfe35
...@@ -60,27 +60,10 @@ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface = ...@@ -60,27 +60,10 @@ USB_ClassInfo_CDC_Device_t VirtualSerial_CDC_Interface =
}, },
}; };
#if 0 /** Standard file stream for the CDC interface when set up, so that the virtual CDC COM port can be
/* NOTE: Here you can set up a standard stream using the created virtual serial port, so that the standard stream functions in * used like any regular character stream in the C APIs
* <stdio.h> can be used on the virtual serial port (e.g. fprintf(&USBSerial, "Test"); to print a string).
*/ */
static FILE USBSerialStream;
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
/** Main program entry point. This routine contains the overall program flow, including initial /** Main program entry point. This routine contains the overall program flow, including initial
* setup of all components and the main program loop. * setup of all components and the main program loop.
...@@ -89,6 +72,9 @@ int main(void) ...@@ -89,6 +72,9 @@ int main(void)
{ {
SetupHardware(); 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); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
for (;;) for (;;)
...@@ -144,7 +130,11 @@ void CheckJoystickMovement(void) ...@@ -144,7 +130,11 @@ void CheckJoystickMovement(void)
{ {
ActionSent = true; 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));
} }
} }
......
...@@ -41,6 +41,7 @@ ...@@ -41,6 +41,7 @@
#include <avr/wdt.h> #include <avr/wdt.h>
#include <avr/power.h> #include <avr/power.h>
#include <string.h> #include <string.h>
#include <stdio.h>
#include "Descriptors.h" #include "Descriptors.h"
......
...@@ -55,28 +55,6 @@ USB_ClassInfo_CDC_Host_t VirtualSerial_CDC_Interface = ...@@ -55,28 +55,6 @@ USB_ClassInfo_CDC_Host_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).
*/
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 /** Main program entry point. This routine configures the hardware required by the application, then
* enters a loop to run the application tasks in sequence. * enters a loop to run the application tasks in sequence.
*/ */
......
...@@ -234,4 +234,24 @@ void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDC ...@@ -234,4 +234,24 @@ void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDC
Endpoint_ClearIN(); 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 #endif
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include "../../USB.h" #include "../../USB.h"
#include "../Common/CDC.h" #include "../Common/CDC.h"
#include <stdio.h>
#include <string.h> #include <string.h>
/* Enable C linkage for C++ Compilers: */ /* Enable C linkage for C++ Compilers: */
...@@ -209,10 +210,24 @@ ...@@ -209,10 +210,24 @@
*/ */
void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); 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: */ /* Private Interface - For use in library only: */
#if !defined(__DOXYGEN__) #if !defined(__DOXYGEN__)
/* Function Prototypes: */ /* Function Prototypes: */
#if defined(INCLUDE_FROM_CDC_CLASS_DEVICE_C) #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 CDC_Device_Event_Stub(void);
void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) 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); ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Device_Event_Stub);
......
...@@ -334,6 +334,26 @@ uint8_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ...@@ -334,6 +334,26 @@ uint8_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo)
return ReceivedByte; 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) void CDC_Host_Event_Stub(void)
{ {
......
...@@ -48,6 +48,9 @@ ...@@ -48,6 +48,9 @@
#include "../../USB.h" #include "../../USB.h"
#include "../Common/CDC.h" #include "../Common/CDC.h"
#include <stdio.h>
#include <string.h>
/* Enable C linkage for C++ Compilers: */ /* Enable C linkage for C++ Compilers: */
#if defined(__cplusplus) #if defined(__cplusplus)
extern "C" { extern "C" {
...@@ -205,6 +208,17 @@ ...@@ -205,6 +208,17 @@
*/ */
uint8_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); 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 /** 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 * 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 * user program by declaring a handler function with the same name and parameters listed here. The new control line states
...@@ -231,6 +245,9 @@ ...@@ -231,6 +245,9 @@
/* Function Prototypes: */ /* Function Prototypes: */
#if defined(INCLUDE_FROM_CDC_CLASS_HOST_C) #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 CDC_Host_Event_Stub(void);
void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) 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); ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Host_Event_Stub);
......
...@@ -13,12 +13,12 @@ ...@@ -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 * - 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 * Report protocol is not needed
* - Added new MIDI LowLevel and ClassDriver Host demo, add new MIDI Host Class driver * - 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 CDC/Mouse ClassDriver device demo
* - Added new Joystick Host ClassDriver and LowLevel demos * - Added new Joystick Host ClassDriver and LowLevel demos
* - Added new Printer Host mode Class driver * - Added new Printer Host mode Class driver
* - Added new Printer Host mode ClassDriver demo * - Added new Printer Host mode ClassDriver demo
* - Added optional support for double banked endpoints in the Device mode Class drivers * - 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> * <b>Changed:</b>
* - Removed mostly useless "TestApp" demo, as it was mainly useful only for checking for sytax errors in the library * - Removed mostly useless "TestApp" demo, as it was mainly useful only for checking for sytax errors in the library
......
...@@ -11,8 +11,8 @@ ...@@ -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 * 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. * used by future LUFA demo projects.
* *
* These VID/PID values should not be used in commercial designs under any circumstances. Private projects may * <b>These VID/PID values should not be used in commercial designs under any circumstances.>/b> Private projects
* use the following values freely, but must accept any collisions due to other LUFA derived 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 * sharing identical values. It is suggested that private projects using interfaces compatible with existing
* demos share the save VID/PID value. * demos share the save VID/PID value.
* *
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment