فهرست منبع

USBD_SOF_DISABLED flag added
ESOF event removed

Dmitry 8 سال پیش
والد
کامیت
46b4c989c9
8فایلهای تغییر یافته به همراه58 افزوده شده و 37 حذف شده
  1. 2 1
      Makefile
  2. 8 3
      inc/usbd_core.h
  3. 7 4
      src/usb_32v0.c
  4. 17 19
      src/usb_32v0A.S
  5. 7 4
      src/usb_32v1.c
  6. 6 2
      src/usb_32v1A.S
  7. 4 0
      src/usb_32v2.c
  8. 7 4
      src/usb_32v3.c

+ 2 - 1
Makefile

@@ -36,7 +36,8 @@ LDSCRIPT     = $(call fixpath, $(LDSCRIPT.$(MCU)))
 MODULE      ?= libusb_stm32.a
 CFLAGS      ?= $(CFLAGS.$(MCU))
 CFLAGS2      = -mthumb -Os -std=gnu99
-DEFINES     ?= $(DEFINES.$(MCU)) FORCE_C_DRIVER
+#DEFINES     ?= $(DEFINES.$(MCU)) FORCE_C_DRIVER
+DEFINES     ?= $(DEFINES.$(MCU))
 INCLUDES    ?= $(CMSISDEV) $(CMSISINC) .
 SOURCES      = $(wildcard src/*.c) $(wildcard src/*.S)
 OBJECTS      = $(addsuffix .o, $(basename $(SOURCES)))

+ 8 - 3
inc/usbd_core.h

@@ -21,7 +21,13 @@
 
 /**\addtogroup USBD_HW_CORE USB Device HW driver and core API
  * @{ */
-
+#if defined(__DOXYGEN__)
+/**\name Compile-time control macros
+ * @{ */
+#define USBD_SOF_DISABLED   /**<\brief Disables SOF handling.*/
+/** @} */
+#endif
+        
 /**\addtogroup USBD_HW USB hardware driver
  * \brief Contains HW driver API 
  * @{ */
@@ -36,8 +42,7 @@
 #define usbd_evt_eprx       5   /**<\brief Data packet received.*/
 #define usbd_evt_epsetup    6   /**<\brief Setup packet received.*/
 #define usbd_evt_error      7   /**<\brief Data error.*/
-#define usbd_evt_esof       8   /**<\brief Missed SOF.*/
-#define usbd_evt_count      9
+#define usbd_evt_count      8
 /** @} */
 
 /**\anchor USB_LANES_STATUS

+ 7 - 4
src/usb_32v0.c

@@ -145,7 +145,11 @@ void enable(bool enable) {
         RCC->APB1ENR  |=  RCC_APB1ENR_USBEN;
         RCC->APB1RSTR |= RCC_APB1RSTR_USBRST;
         RCC->APB1RSTR &= ~RCC_APB1RSTR_USBRST;
-        USB->CNTR = USB_CNTR_CTRM | USB_CNTR_RESETM | USB_CNTR_SOFM | USB_CNTR_ESOFM | USB_CNTR_ERRM | USB_CNTR_SUSPM | USB_CNTR_WKUPM;
+        USB->CNTR = USB_CNTR_CTRM | USB_CNTR_RESETM | USB_CNTR_ERRM |
+#if !defined(USBD_SOF_DISABLED)
+        USB_CNTR_SOFM |
+#endif
+        USB_CNTR_SUSPM | USB_CNTR_WKUPM;
     } else if (RCC->APB1ENR & RCC_APB1ENR_USBEN) {
         USB->BCDR = 0;
         RCC->APB1RSTR |= RCC_APB1RSTR_USBRST;
@@ -402,9 +406,11 @@ void evt_poll(usbd_device *dev, usbd_evt_callback callback) {
             ep_deconfig(i);
         }
         _ev = usbd_evt_reset;
+#if !defined(USBD_SOF_DISABLED)
     } else if (_istr & USB_ISTR_SOF) {
         _ev = usbd_evt_sof;
         USB->ISTR &= ~USB_ISTR_SOF;
+#endif
     } else if (_istr & USB_ISTR_WKUP) {
         _ev = usbd_evt_wkup;
         USB->CNTR &= ~USB_CNTR_FSUSP;
@@ -413,9 +419,6 @@ void evt_poll(usbd_device *dev, usbd_evt_callback callback) {
         _ev = usbd_evt_susp;
         USB->CNTR |= USB_CNTR_FSUSP;
         USB->ISTR &= ~USB_ISTR_SUSP;
-    } else if (_istr & USB_ISTR_ESOF) {
-        USB->ISTR &= ~USB_ISTR_ESOF;
-        _ev = usbd_evt_esof;
     } else if (_istr & USB_ISTR_ERR) {
         USB->ISTR &= ~USB_ISTR_ERR;
         _ev = usbd_evt_error;

+ 17 - 19
src/usb_32v0A.S

@@ -245,8 +245,12 @@ _enable:
     str     r0, [r2, #RCC_APB1RSTR]     //RCC->APB1RSTR |= USBRST
     bics    r0, r3
     str     r0, [r2, #RCC_APB1RSTR]     //RCC->APB1RSTR &= ~USBRST
-    movs    r0, #0xBE
-    lsls    r0, #0x08           // CTRM | ERRM | WKUPM | SUSPM | RESETM | SOFM
+#if !defined(USBD_SOF_DISABLED)
+    movs    r0, #0xBE                   // CTRM | ERRM | WKUPM | SUSPM | RESETM | SOFM
+#else
+    movs    r0, #0xBC                   // CTRM | ERRM | WKUPM | SUSPM | RESETM
+#endif
+    lsls    r0, #0x08
     strh    r0, [r1]            //set USB->CNTR
     bx      lr
 .L_disable:
@@ -722,20 +726,20 @@ _evt_poll:
     movs    r2, 0x07
     ands    r2, r0
 /* checking USB->ISTR for events */
-    lsls    r0, #17             //CTRM -> CF
+#if !defined(USBD_SOF_DISABLED)
+    lsrs    r1, r0, #10         //SOFM -> CF
+    bcs     .L_ep_sofm
+#endif
+    lsrs    r1, r0, #16         //CTRM -> CF
     bcs     .L_ep_ctrm
-    lsls    r0, #2              //ERRM -> CF
+    lsrs    r1, r0, #14         //ERRM -> CF
     bcs     .L_ep_errm
-    lsls    r0, #1              //WKUPM -> CF
+    lsrs    r1, r0, #13         //WKUPM -> CF
     bcs     .L_ep_wkupm
-    lsls    r0, #1              //SUSPM -> CF
+    lsrs    r1, r0, #12         //SUSPM -> CF
     bcs     .L_ep_suspm
-    lsls    r0, #1              //RESETM -> CF
+    lsrs    r1, r0, #11         //RESETM -> CF
     bcs     .L_ep_resetm
-    lsls    r0, #1              //SOFM -> CF
-    bcs     .L_ep_sofm
-    lsls    r0, #1
-    bcs     .L_ep_esofm
     /* exit with no callback */
     pop     {r0, r1, r4 , r5}
     bx      lr
@@ -770,17 +774,12 @@ _evt_poll:
     movs    r1, #usbd_evt_error
     movs    r4, #ISTRBIT(13)
     b      .L_ep_clristr
-
+#if !defined(USBD_SOF_DISABLED)
 .L_ep_sofm:
     movs    r1, #usbd_evt_sof
     movs    r4, #ISTRBIT(9)
     b       .L_ep_clristr
-
-.L_ep_esofm:
-    movs    r1, #usbd_evt_esof
-    movs    r4, #ISTRBIT(8)
-    b       .L_ep_clristr
-
+#endif
 .L_ep_wkupm:
     ldrh    r1, [r3, #USB_CNTR]     //R1 USB->CNTR
     movs    r5, #0x08
@@ -830,7 +829,6 @@ _evt_poll:
     bx      r3
     .size   _evt_poll, . - _evt_poll
 
-
     .pool
 
    .end

+ 7 - 4
src/usb_32v1.c

@@ -148,7 +148,11 @@ void enable(bool enable) {
         RCC->APB2ENR  |= RCC_APB2ENR_SYSCFGEN;
         RCC->APB1RSTR |= RCC_APB1RSTR_USBRST;
         RCC->APB1RSTR &= ~RCC_APB1RSTR_USBRST;
-        USB->CNTR = USB_CNTR_CTRM | USB_CNTR_RESETM | USB_CNTR_SOFM | USB_CNTR_ESOFM | USB_CNTR_ERRM | USB_CNTR_SUSPM | USB_CNTR_WKUPM ;
+        USB->CNTR = USB_CNTR_CTRM | USB_CNTR_RESETM | USB_CNTR_ERRM |
+#if !defined(USBD_SOF_DISABLED)
+        USB_CNTR_SOFM |
+#endif
+        USB_CNTR_SUSPM | USB_CNTR_WKUPM;
     } else if (RCC->APB1ENR & RCC_APB1ENR_USBEN) {
         SYSCFG->PMC &= ~SYSCFG_PMC_USB_PU;
         RCC->APB1RSTR |= RCC_APB1RSTR_USBRST;
@@ -392,9 +396,11 @@ void evt_poll(usbd_device *dev, usbd_evt_callback callback) {
             ep_deconfig(i);
         }
         _ev = usbd_evt_reset;
+#if !defined(USBD_SOF_DISABLED)
     } else if (_istr & USB_ISTR_SOF) {
         _ev = usbd_evt_sof;
         USB->ISTR &= ~USB_ISTR_SOF;
+#endif
     } else if (_istr & USB_ISTR_WKUP) {
         _ev = usbd_evt_wkup;
         USB->CNTR &= ~USB_CNTR_FSUSP;
@@ -403,9 +409,6 @@ void evt_poll(usbd_device *dev, usbd_evt_callback callback) {
         _ev = usbd_evt_susp;
         USB->CNTR |= USB_CNTR_FSUSP;
         USB->ISTR &= ~USB_ISTR_SUSP;
-    } else if (_istr & USB_ISTR_ESOF) {
-        USB->ISTR &= ~USB_ISTR_ESOF;
-        _ev = usbd_evt_esof;
     } else if (_istr & USB_ISTR_ERR) {
         USB->ISTR &= ~USB_ISTR_ERR;
         _ev = usbd_evt_error;

+ 6 - 2
src/usb_32v1A.S

@@ -231,8 +231,12 @@ _enable:
     orrs    r0, r3
     str     r0, [r2, #RCC_APB2ENR]
 /* setting up USB CNTR */
-    movs    r0, #0xBE
-    lsls    r0, #0x08                   // CTRM | ERRM | WKUPM | SUSPM | RESETM | SOFM
+#if !defined(USBD_SOF_DISABLED)
+    movs    r0, #0xBE                   // CTRM | ERRM | WKUPM | SUSPM | RESETM | SOFM
+#else
+    movs    r0, #0xBC                   // CTRM | ERRM | WKUPM | SUSPM | RESETM
+#endif
+    lsls    r0, #0x08
     strh    r0, [r1, #USB_CNTR]         //set USB->CNTR
     bx      lr
 .L_disable:

+ 4 - 0
src/usb_32v2.c

@@ -125,7 +125,9 @@ void enable(bool enable) {
         OTGD->DIEPMSK = USB_OTG_DIEPMSK_XFRCM;
         /* unmask core interrupts */
         OTG->GINTMSK  = USB_OTG_GINTMSK_USBRST | USB_OTG_GINTMSK_ENUMDNEM |
+#if !defined(USBD_SOF_DISABLED)
                         USB_OTG_GINTMSK_SOFM |
+#endif
                         USB_OTG_GINTMSK_USBSUSPM | USB_OTG_GINTMSK_WUIM |
                         USB_OTG_GINTMSK_IEPINT | USB_OTG_GINTMSK_RXFLVLM;
         /* clear pending interrupts */
@@ -434,9 +436,11 @@ void evt_poll(usbd_device *dev, usbd_evt_callback callback) {
                 OTG->GRXSTSP;
                 continue;
             }
+#if !defined(USBD_SOF_DISABLED)
         } else if (_t & USB_OTG_GINTSTS_SOF) {
             OTG->GINTSTS = USB_OTG_GINTSTS_SOF;
             evt = usbd_evt_sof;
+#endif
         } else if (_t & USB_OTG_GINTSTS_USBSUSP) {
             evt = usbd_evt_susp;
             OTG->GINTSTS = USB_OTG_GINTSTS_USBSUSP;

+ 7 - 4
src/usb_32v3.c

@@ -153,7 +153,11 @@ void enable(bool enable) {
         RCC->APB1ENR  |= RCC_APB1ENR_USBEN;
         RCC->APB1RSTR |= RCC_APB1RSTR_USBRST;
         RCC->APB1RSTR &= ~RCC_APB1RSTR_USBRST;
-        USB->CNTR = USB_CNTR_CTRM | USB_CNTR_RESETM | USB_CNTR_SOFM | USB_CNTR_ESOFM | USB_CNTR_ERRM | USB_CNTR_SUSPM | USB_CNTR_WKUPM ;
+        USB->CNTR = USB_CNTR_CTRM | USB_CNTR_RESETM | USB_CNTR_ERRM |
+#if !defined(USBD_SOF_DISABLED)
+        USB_CNTR_SOFM |
+#endif
+        USB_CNTR_SUSPM | USB_CNTR_WKUPM;
     } else if (RCC->APB1ENR & RCC_APB1ENR_USBEN) {
         RCC->APB1RSTR |= RCC_APB1RSTR_USBRST;
         RCC->APB1ENR &= ~RCC_APB1ENR_USBEN;
@@ -391,9 +395,11 @@ void evt_poll(usbd_device *dev, usbd_evt_callback callback) {
             ep_deconfig(i);
         }
         _ev = usbd_evt_reset;
+#if !defined(USBD_SOF_DISABLED)
     } else if (_istr & USB_ISTR_SOF) {
         _ev = usbd_evt_sof;
         USB->ISTR &= ~USB_ISTR_SOF;
+#endif
     } else if (_istr & USB_ISTR_WKUP) {
         _ev = usbd_evt_wkup;
         USB->CNTR &= ~USB_CNTR_FSUSP;
@@ -402,9 +408,6 @@ void evt_poll(usbd_device *dev, usbd_evt_callback callback) {
         _ev = usbd_evt_susp;
         USB->CNTR |= USB_CNTR_FSUSP;
         USB->ISTR &= ~USB_ISTR_SUSP;
-    } else if (_istr & USB_ISTR_ESOF) {
-        USB->ISTR &= ~USB_ISTR_ESOF;
-        _ev = usbd_evt_esof;
     } else if (_istr & USB_ISTR_ERR) {
         USB->ISTR &= ~USB_ISTR_ERR;
         _ev = usbd_evt_error;