/* * Handles the USB driver global events. */ static void usb_event(USBDriver *usbp, usbevent_t event) { extern SerialUSBDriver SDU1; extern SerialUSBDriver SDU2; switch (event) { case USB_EVENT_RESET: return; case USB_EVENT_ADDRESS: return; case USB_EVENT_CONFIGURED: chSysLockFromISR(); if (usbp->state == USB_ACTIVE) { /* Enables the endpoints specified into the configuration. Note, this callback is invoked from an ISR so I-Class functions must be used.*/ usbInitEndpointI(usbp, USB_INTERRUPT_REQUEST_EP_A, &ep1config); usbInitEndpointI(usbp, USB_DATA_REQUEST_EP_A, &ep2config); usbInitEndpointI(usbp, USB_INTERRUPT_REQUEST_EP_B, &ep3config); usbInitEndpointI(usbp, USB_DATA_REQUEST_EP_B, &ep4config); /* Resetting the state of the CDC subsystem.*/ sduConfigureHookI(&SDU1); sduConfigureHookI(&SDU2); } else if (usbp->state == USB_SELECTED) { usbDisableEndpointsI(usbp); } chSysUnlockFromISR(); return; case USB_EVENT_UNCONFIGURED: return; case USB_EVENT_SUSPEND: chSysLockFromISR(); /* Disconnection event on suspend.*/ sduDisconnectI(&SDU1); sduDisconnectI(&SDU2); chSysUnlockFromISR(); return; case USB_EVENT_WAKEUP: return; case USB_EVENT_STALLED: return; } return; }
/* * Handles the USB driver global events. */ static void usb_event(USBDriver *usbp, usbevent_t event) { switch(event) { case USB_EVENT_RESET: return; case USB_EVENT_ADDRESS: return; case USB_EVENT_CONFIGURED: osalSysLockFromISR(); /* Enables the endpoints specified into the configuration. Note, this callback is invoked from an ISR so I-Class functions must be used.*/ usbInitEndpointI(usbp, USBD1_DATA_REQUEST_EP, &ep1config); usbInitEndpointI(usbp, USBD1_INTERRUPT_REQUEST_EP, &ep2config); /* Resetting the state of the CDC subsystem.*/ sduConfigureHookI(&OUTPUT_CHANNEL); osalSysUnlockFromISR(); return; case USB_EVENT_SUSPEND: osalSysLockFromISR(); /* Disconnection event on suspend.*/ sduDisconnectI(&OUTPUT_CHANNEL); osalSysUnlockFromISR(); return; case USB_EVENT_WAKEUP: return; case USB_EVENT_STALLED: return; } return; }
/** * @brief Stops the driver. * @details Any thread waiting on the driver's queues will be awakened with * the message @p Q_RESET. * * @param[in] sdup pointer to a @p SerialUSBDriver object * * @api */ void sduStop(SerialUSBDriver *sdup) { USBDriver *usbp = sdup->config->usbp; osalDbgCheck(sdup != NULL); osalSysLock(); osalDbgAssert((sdup->state == SDU_STOP) || (sdup->state == SDU_READY), "invalid state"); /* Driver in stopped state.*/ usbp->in_params[sdup->config->bulk_in - 1U] = NULL; usbp->out_params[sdup->config->bulk_out - 1U] = NULL; if (sdup->config->int_in > 0U) { usbp->in_params[sdup->config->int_in - 1U] = NULL; } sdup->state = SDU_STOP; /* Enforces a disconnection.*/ sduDisconnectI(sdup); osalOsRescheduleS(); osalSysUnlock(); }