Added new stream creation function to the CDC Class drivers, to easily make standard streams from CDC Class driver instances.

pull/1469/head
Dean Camera 15 years ago
parent d6edfe35c8
commit c1782ac024

@ -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)
{ {
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)
{ {
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 @@
#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 =
}, },
}; };
#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
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 @@
#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 @@
*/ */
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)
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 @@
#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 @@
*/ */
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 @@
/* 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 @@
* - 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 @@
* 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.
* *

Loading…
Cancel
Save