Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Erik Strand
lufa
Commits
65204211
Commit
65204211
authored
Nov 12, 2009
by
Dean Camera
Browse files
Add blocking versions of the CDC Class driver streams, for applications requiring blocking reads.
parent
6a46f002
Changes
4
Hide whitespace changes
Inline
Side-by-side
LUFA/Drivers/USB/Class/Device/CDC.c
View file @
65204211
...
...
@@ -240,6 +240,12 @@ void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* CDCInterfaceInfo, FILE*
fdev_set_udata
(
Stream
,
CDCInterfaceInfo
);
}
void
CDC_Device_CreateBlockingStream
(
USB_ClassInfo_CDC_Device_t
*
CDCInterfaceInfo
,
FILE
*
Stream
)
{
*
Stream
=
(
FILE
)
FDEV_SETUP_STREAM
(
CDC_Device_putchar
,
CDC_Device_getchar_Blocking
,
_FDEV_SETUP_RW
);
fdev_set_udata
(
Stream
,
CDCInterfaceInfo
);
}
static
int
CDC_Device_putchar
(
char
c
,
FILE
*
Stream
)
{
return
CDC_Device_SendByte
((
USB_ClassInfo_CDC_Device_t
*
)
fdev_get_udata
(
Stream
),
c
)
?
_FDEV_ERR
:
0
;
...
...
@@ -253,4 +259,15 @@ static int CDC_Device_getchar(FILE* Stream)
return
CDC_Device_ReceiveByte
((
USB_ClassInfo_CDC_Device_t
*
)
fdev_get_udata
(
Stream
));
}
static
int
CDC_Device_getchar_Blocking
(
FILE
*
Stream
)
{
while
(
!
(
CDC_Device_BytesReceived
((
USB_ClassInfo_CDC_Device_t
*
)
fdev_get_udata
(
Stream
))))
{
CDC_Device_USBTask
((
USB_ClassInfo_CDC_Device_t
*
)
fdev_get_udata
(
Stream
));
USB_USBTask
();
}
return
CDC_Device_ReceiveByte
((
USB_ClassInfo_CDC_Device_t
*
)
fdev_get_udata
(
Stream
));
}
#endif
LUFA/Drivers/USB/Class/Device/CDC.h
View file @
65204211
...
...
@@ -213,6 +213,11 @@
/** 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).
*
* Reading data from this stream is non-blocking, i.e. in most instances, complete strings cannot be read in by a single
* fetch, as the endpoint will not be ready at some point in the transmission, aborting the transfer. However, this may
* be used when the read data is processed byte-per-bye (via getc()) or when the user application will implement its own
* line buffering.
*
* \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.
*
...
...
@@ -221,12 +226,21 @@
*/
void
CDC_Device_CreateStream
(
USB_ClassInfo_CDC_Device_t
*
CDCInterfaceInfo
,
FILE
*
Stream
);
/** Identical to CDC_Device_CreateStream(), except that reads are blocking until the calling stream function terminates
* the transfer. While blocking, the USB and CDC service tasks are called repeatedly to maintain USB communications.
*
* \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_CreateBlockingStream
(
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
);
static
int
CDC_Device_getchar_Blocking
(
FILE
*
Stream
);
void
CDC_Device_Event_Stub
(
void
);
void
EVENT_CDC_Device_LineEncodingChanged
(
USB_ClassInfo_CDC_Device_t
*
const
CDCInterfaceInfo
)
...
...
LUFA/Drivers/USB/Class/Host/CDC.c
View file @
65204211
...
...
@@ -353,6 +353,17 @@ static int CDC_Host_getchar(FILE* Stream)
return
CDC_Host_ReceiveByte
((
USB_ClassInfo_CDC_Host_t
*
)
fdev_get_udata
(
Stream
));
}
static
int
CDC_Host_getchar_Blocking
(
FILE
*
Stream
)
{
while
(
!
(
CDC_Host_BytesReceived
((
USB_ClassInfo_CDC_Host_t
*
)
fdev_get_udata
(
Stream
))))
{
CDC_Host_USBTask
((
USB_ClassInfo_CDC_Host_t
*
)
fdev_get_udata
(
Stream
));
USB_USBTask
();
}
return
CDC_Host_ReceiveByte
((
USB_ClassInfo_CDC_Host_t
*
)
fdev_get_udata
(
Stream
));
}
void
CDC_Host_Event_Stub
(
void
)
{
...
...
LUFA/Drivers/USB/Class/Host/CDC.h
View file @
65204211
...
...
@@ -219,6 +219,14 @@
*/
void
CDC_Host_CreateStream
(
USB_ClassInfo_CDC_Host_t
*
CDCInterfaceInfo
,
FILE
*
Stream
);
/** Identical to CDC_Host_CreateStream(), except that reads are blocking until the calling stream function terminates
* the transfer. While blocking, the USB and CDC service tasks are called repeatedly to maintain USB communications.
*
* \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_CreateBlockingStream
(
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
...
...
@@ -247,6 +255,7 @@
#if defined(INCLUDE_FROM_CDC_CLASS_HOST_C)
static
int
CDC_Host_putchar
(
char
c
,
FILE
*
Stream
);
static
int
CDC_Host_getchar
(
FILE
*
Stream
);
static
int
CDC_Host_getchar_Blocking
(
FILE
*
Stream
);
void
CDC_Host_Event_Stub
(
void
);
void
EVENT_CDC_Host_ControLineStateChanged
(
USB_ClassInfo_CDC_Host_t
*
const
CDCInterfaceInfo
)
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment