aboutsummaryrefslogtreecommitdiffstats
path: root/libmaple/usb/stm32f1/usb_cdcacm.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmaple/usb/stm32f1/usb_cdcacm.c')
-rw-r--r--libmaple/usb/stm32f1/usb_cdcacm.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/libmaple/usb/stm32f1/usb_cdcacm.c b/libmaple/usb/stm32f1/usb_cdcacm.c
index 75bbc4f..ee3c8e3 100644
--- a/libmaple/usb/stm32f1/usb_cdcacm.c
+++ b/libmaple/usb/stm32f1/usb_cdcacm.c
@@ -354,6 +354,22 @@ USER_STANDARD_REQUESTS User_Standard_Requests = {
};
/*
+ * User hooks
+ */
+
+static void (*rx_hook)(unsigned, void*) = 0;
+static void (*iface_setup_hook)(unsigned, void*) = 0;
+
+void usb_cdcacm_set_hooks(unsigned hook_flags, void (*hook)(unsigned, void*)) {
+ if (hook_flags & USB_CDCACM_HOOK_RX) {
+ rx_hook = hook;
+ }
+ if (hook_flags & USB_CDCACM_HOOK_IFACE_SETUP) {
+ iface_setup_hook = hook;
+ }
+}
+
+/*
* CDC ACM interface
*/
@@ -522,6 +538,10 @@ static void vcomDataRxCb(void) {
}
usb_copy_from_pma(vcomBufferRx, newBytes, USB_CDCACM_RX_ADDR);
+
+ if (rx_hook) {
+ rx_hook(USB_CDCACM_HOOK_RX, 0);
+ }
}
static uint8* vcomGetSetLineCoding(uint16 length) {
@@ -607,6 +627,12 @@ static RESULT usbDataSetup(uint8 request) {
CopyRoutine = NULL;
if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) {
+ /* Call the user hook first. */
+ if (iface_setup_hook) {
+ uint8 req_copy = request;
+ iface_setup_hook(USB_CDCACM_HOOK_IFACE_SETUP, &req_copy);
+ }
+
switch (request) {
case (USB_CDCACM_GET_LINE_CODING):
CopyRoutine = vcomGetSetLineCoding;
@@ -636,6 +662,11 @@ static RESULT usbNoDataSetup(uint8 request) {
/* we support set com feature but dont handle it */
if (Type_Recipient == (CLASS_REQUEST | INTERFACE_RECIPIENT)) {
+ /* Call the user hook first. */
+ if (iface_setup_hook) {
+ uint8 req_copy = request;
+ iface_setup_hook(USB_CDCACM_HOOK_IFACE_SETUP, &req_copy);
+ }
switch (request) {
case (USB_CDCACM_SET_COMM_FEATURE):