Chibios: add more guards for transmitting (fix a deadlock bug).
This commit is contained in:
parent
b1b30f1675
commit
72c52d30c8
@ -336,6 +336,18 @@
|
|||||||
#define SPI_USE_MUTUAL_EXCLUSION TRUE
|
#define SPI_USE_MUTUAL_EXCLUSION TRUE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* USB driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables synchronous APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
|
||||||
|
#define USB_USE_WAIT TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _HALCONF_H_ */
|
#endif /* _HALCONF_H_ */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
@ -336,6 +336,18 @@
|
|||||||
#define SPI_USE_MUTUAL_EXCLUSION TRUE
|
#define SPI_USE_MUTUAL_EXCLUSION TRUE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* USB driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables synchronous APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
|
||||||
|
#define USB_USE_WAIT TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _HALCONF_H_ */
|
#endif /* _HALCONF_H_ */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
@ -336,6 +336,18 @@
|
|||||||
#define SPI_USE_MUTUAL_EXCLUSION TRUE
|
#define SPI_USE_MUTUAL_EXCLUSION TRUE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* USB driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables synchronous APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
|
||||||
|
#define USB_USE_WAIT TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _HALCONF_H_ */
|
#endif /* _HALCONF_H_ */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
@ -170,6 +170,18 @@
|
|||||||
#define HAL_USE_WDG FALSE
|
#define HAL_USE_WDG FALSE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*===========================================================================*/
|
||||||
|
/* USB driver related settings. */
|
||||||
|
/*===========================================================================*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Enables synchronous APIs.
|
||||||
|
* @note Disabling this option saves both code and data space.
|
||||||
|
*/
|
||||||
|
#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)
|
||||||
|
#define USB_USE_WAIT TRUE
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* _HALCONF_H_ */
|
#endif /* _HALCONF_H_ */
|
||||||
|
|
||||||
/** @} */
|
/** @} */
|
||||||
|
@ -1094,7 +1094,9 @@ static void keyboard_idle_timer_cb(void *arg) {
|
|||||||
if(keyboard_idle) {
|
if(keyboard_idle) {
|
||||||
#endif /* NKRO_ENABLE */
|
#endif /* NKRO_ENABLE */
|
||||||
/* TODO: are we sure we want the KBD_ENDPOINT? */
|
/* TODO: are we sure we want the KBD_ENDPOINT? */
|
||||||
usbStartTransmitI(usbp, KBD_ENDPOINT, (uint8_t *)&keyboard_report_sent, sizeof(keyboard_report_sent));
|
if(!usbGetTransmitStatusI(usbp, KBD_ENDPOINT)) {
|
||||||
|
usbStartTransmitI(usbp, KBD_ENDPOINT, (uint8_t *)&keyboard_report_sent, KBD_EPSIZE);
|
||||||
|
}
|
||||||
/* rearm the timer */
|
/* rearm the timer */
|
||||||
chVTSetI(&keyboard_idle_timer, 4*MS2ST(keyboard_idle), keyboard_idle_timer_cb, (void *)usbp);
|
chVTSetI(&keyboard_idle_timer, 4*MS2ST(keyboard_idle), keyboard_idle_timer_cb, (void *)usbp);
|
||||||
}
|
}
|
||||||
@ -1127,8 +1129,13 @@ void send_keyboard(report_keyboard_t *report) {
|
|||||||
* this is more efficient */
|
* this is more efficient */
|
||||||
/* busy wait, should be short and not very common */
|
/* busy wait, should be short and not very common */
|
||||||
osalSysLock();
|
osalSysLock();
|
||||||
while(usbGetTransmitStatusI(&USB_DRIVER, NKRO_ENDPOINT))
|
if(usbGetTransmitStatusI(&USB_DRIVER, NKRO_ENDPOINT)) {
|
||||||
;
|
/* Need to either suspend, or loop and call unlock/lock during
|
||||||
|
* every iteration - otherwise the system will remain locked,
|
||||||
|
* no interrupts served, so USB not going through as well.
|
||||||
|
* Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */
|
||||||
|
osalThreadSuspendS(&(&USB_DRIVER)->epc[NKRO_ENDPOINT]->in_state->thread);
|
||||||
|
}
|
||||||
usbStartTransmitI(&USB_DRIVER, NKRO_ENDPOINT, (uint8_t *)report, sizeof(report_keyboard_t));
|
usbStartTransmitI(&USB_DRIVER, NKRO_ENDPOINT, (uint8_t *)report, sizeof(report_keyboard_t));
|
||||||
osalSysUnlock();
|
osalSysUnlock();
|
||||||
} else
|
} else
|
||||||
@ -1137,8 +1144,13 @@ void send_keyboard(report_keyboard_t *report) {
|
|||||||
/* need to wait until the previous packet has made it through */
|
/* need to wait until the previous packet has made it through */
|
||||||
/* busy wait, should be short and not very common */
|
/* busy wait, should be short and not very common */
|
||||||
osalSysLock();
|
osalSysLock();
|
||||||
while(usbGetTransmitStatusI(&USB_DRIVER, KBD_ENDPOINT))
|
if(usbGetTransmitStatusI(&USB_DRIVER, KBD_ENDPOINT)) {
|
||||||
;
|
/* Need to either suspend, or loop and call unlock/lock during
|
||||||
|
* every iteration - otherwise the system will remain locked,
|
||||||
|
* no interrupts served, so USB not going through as well.
|
||||||
|
* Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */
|
||||||
|
osalThreadSuspendS(&(&USB_DRIVER)->epc[KBD_ENDPOINT]->in_state->thread);
|
||||||
|
}
|
||||||
usbStartTransmitI(&USB_DRIVER, KBD_ENDPOINT, (uint8_t *)report, KBD_EPSIZE);
|
usbStartTransmitI(&USB_DRIVER, KBD_ENDPOINT, (uint8_t *)report, KBD_EPSIZE);
|
||||||
osalSysUnlock();
|
osalSysUnlock();
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user