/** * @brief Notification of data removed from the input queue. * * @param[in] qp the queue pointer. */ static void inotify(io_queue_t *qp) { size_t n, maxsize; SerialUSBDriver *sdup = qGetLink(qp); /* If the USB driver is not in the appropriate state then transactions must not be started.*/ if ((usbGetDriverStateI(sdup->config->usbp) != USB_ACTIVE) || (sdup->state != SDU_READY)) { return; } /* If there is in the queue enough space to hold at least one packet and a transaction is not yet started then a new transaction is started for the available space.*/ maxsize = sdup->config->usbp->epc[sdup->config->bulk_out]->out_maxsize; if (!usbGetReceiveStatusI(sdup->config->usbp, sdup->config->bulk_out)) { if ((n = iqGetEmptyI(&sdup->iqueue)) >= maxsize) { osalSysUnlock(); n = (n / maxsize) * maxsize; usbPrepareQueuedReceive(sdup->config->usbp, sdup->config->bulk_out, &sdup->iqueue, n); osalSysLock(); (void) usbStartReceiveI(sdup->config->usbp, sdup->config->bulk_out); } } }
/** * @brief Notification of data inserted into the output queue. * * @param[in] qp the queue pointer. */ static void onotify(io_queue_t *qp) { size_t n; SerialUSBDriver *sdup = qGetLink(qp); /* If the USB driver is not in the appropriate state then transactions must not be started.*/ if ((usbGetDriverStateI(sdup->config->usbp) != USB_ACTIVE) || (sdup->state != SDU_READY)) { return; } /* If there is not an ongoing transaction and the output queue contains data then a new transaction is started.*/ if (!usbGetTransmitStatusI(sdup->config->usbp, sdup->config->bulk_in)) { if ((n = oqGetFullI(&sdup->oqueue)) > 0U) { osalSysUnlock(); usbPrepareQueuedTransmit(sdup->config->usbp, sdup->config->bulk_in, &sdup->oqueue, n); osalSysLock(); (void) usbStartTransmitI(sdup->config->usbp, sdup->config->bulk_in); } } }
/** * @brief Notification of data inserted into the output queue. * * @param[in] qp the queue pointer. */ static void onotify(io_queue_t *qp) { size_t n; HIDDebugDriver *hiddp = qGetLink(qp); /* If the USB driver is not in the appropriate state then transactions * must not be started.*/ if((usbGetDriverStateI(hiddp->config->usbp) != USB_ACTIVE) || (hiddp->state != HIDDEBUG_READY)) { return; } /* If there is not an ongoing transaction and the output queue contains * enough data then a new transaction is started.*/ if(!usbGetTransmitStatusI(hiddp->config->usbp, hiddp->config->ep_in)) { if((n = oqGetFullI(&hiddp->oqueue)) >= DEBUG_TX_SIZE) { osalSysUnlock(); usbPrepareQueuedTransmit(hiddp->config->usbp, hiddp->config->ep_in, &hiddp->oqueue, DEBUG_TX_SIZE); osalSysLock(); (void)usbStartTransmitI(hiddp->config->usbp, hiddp->config->ep_in); } } }