/** * @brief Configures and activates the CAN peripheral. * @note Activating the CAN bus can be a slow operation this this function * is not atomic, it waits internally for the initialization to * complete. * * @param[in] canp pointer to the @p CANDriver object * @param[in] config pointer to the @p CANConfig object. Depending on * the implementation the value can be @p NULL. * * @api */ void canStart(CANDriver *canp, const CANConfig *config) { osalDbgCheck(canp != NULL); osalSysLock(); osalDbgAssert((canp->state == CAN_STOP) || (canp->state == CAN_STARTING) || (canp->state == CAN_READY), "invalid state"); while (canp->state == CAN_STARTING) osalThreadSleepS(1); if (canp->state == CAN_STOP) { canp->config = config; can_lld_start(canp); canp->state = CAN_READY; } osalSysUnlock(); }
/** * @brief Configures and activates the CAN peripheral. * @note Activating the CAN bus can be a slow operation this this function * is not atomic, it waits internally for the initialization to * complete. * * @param[in] canp pointer to the @p CANDriver object * @param[in] config pointer to the @p CANConfig object. Depending on * the implementation the value can be @p NULL. * * @api */ void canStart(CANDriver *canp, const CANConfig *config) { chDbgCheck(canp != NULL, "canStart"); chSysLock(); chDbgAssert((canp->state == CAN_STOP) || (canp->state == CAN_STARTING) || (canp->state == CAN_READY), "canStart(), #1", "invalid state"); while (canp->state == CAN_STARTING) chThdSleepS(1); if (canp->state == CAN_STOP) { canp->config = config; can_lld_start(canp); canp->state = CAN_READY; } chSysUnlock(); }
/** * @brief Configures and activates the CAN peripheral. * @note Activating the CAN bus can be a slow operation. * @note Unlike other drivers it is not possible to restart the CAN * driver without first stopping it using canStop(). * * @param[in] canp pointer to the @p CANDriver object * @param[in] config pointer to the @p CANConfig object. Depending on * the implementation the value can be @p NULL. * * @api */ void canStart(CANDriver *canp, const CANConfig *config) { osalDbgCheck(canp != NULL); osalSysLock(); osalDbgAssert(canp->state == CAN_STOP, "invalid state"); /* Entering initialization mode. */ canp->state = CAN_STARTING; canp->config = config; /* Low level initialization, could be a slow process and sleeps could be performed inside.*/ can_lld_start(canp); /* The driver finally goes into the ready state.*/ canp->state = CAN_READY; osalSysUnlock(); }