/** * @brief USB device configured handler. * * @param[in] usbp pointer to the @p USBDriver object * * @iclass */ void sduConfigureHookI(USBDriver *usbp) { SerialUSBDriver *sdup = usbp->param; sdup->flags = CHN_NO_ERROR; chIQResetI(&sdup->iqueue); chOQResetI(&sdup->oqueue); chnAddFlagsI(sdup, CHN_CONNECTED); }
/** * @brief USB device configured handler. * * @param[in] bdup pointer to a @p BulkUSBDriver object * * @iclass */ void bduConfigureHookI(BulkUSBDriver *bdup) { USBDriver *usbp = bdup->config->usbp; chIQResetI(&bdup->iqueue); chOQResetI(&bdup->oqueue); chnAddFlagsI(bdup, CHN_CONNECTED); /* Starts the first OUT transaction immediately.*/ usbPrepareQueuedReceive(usbp, bdup->config->bulk_out, &bdup->iqueue, usbp->epc[bdup->config->bulk_out]->out_maxsize); usbStartReceiveI(usbp, bdup->config->bulk_out); }
/** * @brief Shell termination handler. * * @param[in] id event id. */ static void termination_handler(eventid_t id) { (void)id; if (shelltp1 && chThdTerminated(shelltp1)) { chThdWait(shelltp1); shelltp1 = NULL; chThdSleepMilliseconds(10); cputs("Init: shell on SD1 terminated"); chSysLock(); chOQResetI(&SD1.oqueue); chSysUnlock(); } if (shelltp2 && chThdTerminated(shelltp2)) { chThdWait(shelltp2); shelltp2 = NULL; chThdSleepMilliseconds(10); cputs("Init: shell on SD2 terminated"); chSysLock(); chOQResetI(&SD2.oqueue); chSysUnlock(); } }
static void queues2_execute(void) { unsigned i; size_t n; /* Initial empty state */ test_assert_lock(1, chOQIsEmptyI(&oq), "not empty"); /* Queue filling */ for (i = 0; i < TEST_QUEUES_SIZE; i++) chOQPut(&oq, 'A' + i); test_assert_lock(2, chOQIsFullI(&oq), "still has space"); /* Queue emptying */ for (i = 0; i < TEST_QUEUES_SIZE; i++) { char c; chSysLock(); c = chOQGetI(&oq); chSysUnlock(); test_emit_token(c); } test_assert_lock(3, chOQIsEmptyI(&oq), "still full"); test_assert_sequence(4, "ABCD"); test_assert_lock(5, chOQGetI(&oq) == Q_EMPTY, "failed to report Q_EMPTY"); /* Writing the whole thing */ n = chOQWriteTimeout(&oq, wa[1], TEST_QUEUES_SIZE * 2, TIME_IMMEDIATE); test_assert(6, n == TEST_QUEUES_SIZE, "wrong returned size"); test_assert_lock(7, chOQIsFullI(&oq), "not full"); threads[0] = chThdCreateStatic(wa[0], WA_SIZE, chThdGetPriorityX()+1, thread2, NULL); test_assert_lock(8, chOQGetFullI(&oq) == TEST_QUEUES_SIZE, "not empty"); test_wait_threads(); /* Testing reset */ chSysLock(); chOQResetI(&oq); chSysUnlock(); test_assert_lock(9, chOQGetFullI(&oq) == 0, "still full"); /* Partial writes */ n = chOQWriteTimeout(&oq, wa[1], TEST_QUEUES_SIZE / 2, TIME_IMMEDIATE); test_assert(10, n == TEST_QUEUES_SIZE / 2, "wrong returned size"); n = chOQWriteTimeout(&oq, wa[1], TEST_QUEUES_SIZE / 2, TIME_IMMEDIATE); test_assert(11, n == TEST_QUEUES_SIZE / 2, "wrong returned size"); test_assert_lock(12, chOQIsFullI(&oq), "not full"); /* Timeout */ test_assert(13, chOQPutTimeout(&oq, 0, 10) == Q_TIMEOUT, "wrong timeout 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] sdp pointer to a @p SerialDriver object * * @api */ void sdStop(SerialDriver *sdp) { chDbgCheck(sdp != NULL, "sdStop"); chSysLock(); chDbgAssert((sdp->state == SD_STOP) || (sdp->state == SD_READY), "sdStop(), #1", "invalid state"); sd_lld_stop(sdp); sdp->state = SD_STOP; chOQResetI(&sdp->oqueue); chIQResetI(&sdp->iqueue); chSchRescheduleS(); chSysUnlock(); }
/* * Handles the USB driver global events. */ static void usb_event(USBDriver *usbp, usbevent_t event) { extern SerialUSBDriver SDU2; switch (event) { case USB_EVENT_RESET: return; case USB_EVENT_ADDRESS: return; case USB_EVENT_CONFIGURED: chSysLockFromISR(); /* Enables the endpoints specified into the configuration. Note, this callback is invoked from an ISR so I-Class functions must be used.*/ usbInitEndpointI(usbp, USBD2_DATA_REQUEST_EP, &ep1config); usbInitEndpointI(usbp, USBD2_INTERRUPT_REQUEST_EP, &ep2config); /* Resetting the state of the CDC subsystem.*/ sduConfigureHookI(&SDU2); chSysUnlockFromISR(); return; case USB_EVENT_SUSPEND: if (usbp->state == USB_ACTIVE) { // USB cable unplugged chSysLockFromISR(); _usb_reset(usbp); // Reset queues and unlock waiting threads chIQResetI(&SDU2.iqueue); chOQResetI(&SDU2.oqueue); chSysUnlockFromISR(); } return; case USB_EVENT_WAKEUP: return; case USB_EVENT_STALLED: return; } return; }
/** * @brief Shell termination handler. * * @param[in] id event id. */ static void termination_handler(eventid_t id) { chThdSleepMilliseconds(10); cputs("Init: shell on SD1 terminated"); chSysLock(); chOQResetI(&SD1.oqueue); chSysUnlock(); // todo: 2nd port for TS // if (shelltp2 && chThdTerminated(shelltp2)) { // chThdWait(shelltp2); // shelltp2 = NULL; // chThdSleepMilliseconds(10); // cputs("Init: shell on SD2 terminated"); // chSysLock(); // chOQResetI(&SD2.oqueue); // chSysUnlock(); // } }
/** * @brief Stops the driver. * @details Any thread waiting on the driver's queues will be awakened with * the message @p Q_RESET. * * @param[in] bdup pointer to a @p BulkUSBDriver object * * @api */ void bduStop(BulkUSBDriver *bdup) { USBDriver *usbp = bdup->config->usbp; chDbgCheck(bdup != NULL, "sdStop"); chSysLock(); chDbgAssert((bdup->state == BDU_STOP) || (bdup->state == BDU_READY), "bduStop(), #1", "invalid state"); /* Driver in stopped state.*/ usbp->in_params[bdup->config->bulk_in - 1] = NULL; usbp->out_params[bdup->config->bulk_out - 1] = NULL; bdup->state = BDU_STOP; /* Queues reset in order to signal the driver stop to the application.*/ chnAddFlagsI(bdup, CHN_DISCONNECTED); chIQResetI(&bdup->iqueue); chOQResetI(&bdup->oqueue); chSchRescheduleS(); chSysUnlock(); }
void OutQueue::resetI(void) { chOQResetI(&oq); }