Chibios: add more guards for transmitting (fix a deadlock bug).
authorflabbergast <s3+flabbergast@sdfeu.org>
Fri, 22 Jan 2016 22:19:02 +0000 (22:19 +0000)
committerflabbergast <s3+flabbergast@sdfeu.org>
Fri, 22 Jan 2016 22:19:02 +0000 (22:19 +0000)
keyboard/infinity_chibios/halconf.h
keyboard/stm32_f072_onekey/halconf.h
keyboard/stm32_f103_onekey/halconf.h
keyboard/teensy_lc_onekey/halconf.h
tmk_core/protocol/chibios/usb_main.c

index 61a9ac0a6f459c2bb0810cb21d5af7237c89beec..53538de149bd2e05339b1b7550f56d2b8f344fb1 100644 (file)
 #define SPI_USE_MUTUAL_EXCLUSION    TRUE\r
 #endif\r
 \r
+/*===========================================================================*/\r
+/* USB driver related settings.                                              */\r
+/*===========================================================================*/\r
+\r
+/**\r
+ * @brief   Enables synchronous APIs.\r
+ * @note    Disabling this option saves both code and data space.\r
+ */\r
+#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)\r
+#define USB_USE_WAIT                TRUE\r
+#endif\r
+\r
 #endif /* _HALCONF_H_ */\r
 \r
 /** @} */\r
index e75c1c367959b771ad8e66a651e1aac716b67193..1a450d632733ad9fa9ec83d36d64712bc7c78ce4 100644 (file)
 #define SPI_USE_MUTUAL_EXCLUSION    TRUE
 #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_ */
 
 /** @} */
index e75c1c367959b771ad8e66a651e1aac716b67193..1a450d632733ad9fa9ec83d36d64712bc7c78ce4 100644 (file)
 #define SPI_USE_MUTUAL_EXCLUSION    TRUE
 #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_ */
 
 /** @} */
index 868391666427f995ceaee911fb02d5140628cfbd..b1d2cd5502a83392452513f462495a3f471a1dbb 100644 (file)
 #define HAL_USE_WDG                 FALSE\r
 #endif\r
 \r
+/*===========================================================================*/\r
+/* USB driver related settings.                                              */\r
+/*===========================================================================*/\r
+\r
+/**\r
+ * @brief   Enables synchronous APIs.\r
+ * @note    Disabling this option saves both code and data space.\r
+ */\r
+#if !defined(USB_USE_WAIT) || defined(__DOXYGEN__)\r
+#define USB_USE_WAIT                TRUE\r
+#endif\r
+\r
 #endif /* _HALCONF_H_ */\r
 \r
 /** @} */\r
index 9097d4e844ca58c075088bc504ac9c0113bb8de1..d248b447deb1396e18c053dca2615fa0074e8318 100644 (file)
@@ -1094,7 +1094,9 @@ static void keyboard_idle_timer_cb(void *arg) {
   if(keyboard_idle) {
 #endif /* NKRO_ENABLE */
     /* 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 */
     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 */
     /* busy wait, should be short and not very common */
     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));
     osalSysUnlock();
   } else
@@ -1137,8 +1144,13 @@ void send_keyboard(report_keyboard_t *report) {
     /* need to wait until the previous packet has made it through */
     /* busy wait, should be short and not very common */
     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);
     osalSysUnlock();
   }
Imprint / Impressum