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
|
/** 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…
Reference in New Issue