forked from mfulz_github/qmk_firmware
Added new stream creation function to the CDC Class drivers, to easily make standard streams from CDC Class driver instances.
This commit is contained in:
parent
d6edfe35c8
commit
c1782ac024
|
@ -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 (;;)
|
||||
|
@ -144,7 +130,11 @@ void CheckJoystickMovement(void)
|
|||
{
|
||||
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/power.h>
|
||||
#include <string.h>
|
||||
#include <stdio.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
|
||||
* 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();
|
||||
}
|
||||
|
||||
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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
||||
|
|
|
@ -48,6 +48,9 @@
|
|||
#include "../../USB.h"
|
||||
#include "../Common/CDC.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
/* Enable C linkage for C++ Compilers: */
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue