usb fix
[gnuk/neug.git] / src / usb_stm32f103.c
index df0c2f9..25c2808 100644 (file)
@@ -1,9 +1,9 @@
-#ifdef FREE_STANDING
-#include "types.h"
-#else
-#include "ch.h"
-#include "hal.h"
-#endif
+#include <stdint.h>
+#include <stdlib.h>
+
+#define TRUE  1
+#define FALSE 0
+
 #include "sys.h"
 #include "usb_lld.h"
 
@@ -74,29 +74,27 @@ struct DEVICE_INFO
 static struct CONTROL_INFO control_info;
 static struct DEVICE_INFO device_info;
 static struct DATA_INFO data_info;
-extern const struct usb_device_method Device_Method;
 
 static struct CONTROL_INFO *const ctrl_p = &control_info;
 static struct DEVICE_INFO *const dev_p = &device_info;
 static struct DATA_INFO *const data_p = &data_info;
-static const struct usb_device_method *const method_p = &Device_Method;
 
 #define REG_BASE  (0x40005C00UL) /* USB_IP Peripheral Registers base address */
 #define PMA_ADDR  (0x40006000UL) /* USB_IP Packet Memory Area base address   */
 
 /* Control register */
-#define CNTR    ((__IO uint16_t *)(REG_BASE + 0x40))
+#define CNTR    ((volatile uint16_t *)(REG_BASE + 0x40))
 /* Interrupt status register */
-#define ISTR    ((__IO uint16_t *)(REG_BASE + 0x44))
+#define ISTR    ((volatile uint16_t *)(REG_BASE + 0x44))
 /* Frame number register */
-#define FNR     ((__IO uint16_t *)(REG_BASE + 0x48))
+#define FNR     ((volatile uint16_t *)(REG_BASE + 0x48))
 /* Device address register */
-#define DADDR   ((__IO uint16_t *)(REG_BASE + 0x4C))
+#define DADDR   ((volatile uint16_t *)(REG_BASE + 0x4C))
 /* Buffer Table address register */
-#define BTABLE  ((__IO uint16_t *)(REG_BASE + 0x50))
+#define BTABLE  ((volatile uint16_t *)(REG_BASE + 0x50))
 
-#define ISTR_CTR    (0x8000) /* Correct TRansfer (clear-only bit) */
-#define ISTR_DOVR   (0x4000) /* DMA OVeR/underrun (clear-only bit) */
+#define ISTR_CTR    (0x8000) /* Correct TRansfer (read-only bit) */
+#define ISTR_OVR    (0x4000) /* OVeR/underrun (clear-only bit) */
 #define ISTR_ERR    (0x2000) /* ERRor (clear-only bit) */
 #define ISTR_WKUP   (0x1000) /* WaKe UP (clear-only bit) */
 #define ISTR_SUSP   (0x0800) /* SUSPend (clear-only bit) */
@@ -107,8 +105,7 @@ static const struct usb_device_method *const method_p = &Device_Method;
 #define ISTR_DIR    (0x0010)  /* DIRection of transaction (read-only bit)  */
 #define ISTR_EP_ID  (0x000F)  /* EndPoint IDentifier (read-only bit)  */
 
-#define CLR_CTR    (~ISTR_CTR)   /* clear Correct TRansfer bit */
-#define CLR_DOVR   (~ISTR_DOVR)  /* clear DMA OVeR/underrun bit*/
+#define CLR_OVR    (~ISTR_OVR)   /* clear OVeR/underrun bit*/
 #define CLR_ERR    (~ISTR_ERR)   /* clear ERRor bit */
 #define CLR_WKUP   (~ISTR_WKUP)  /* clear WaKe UP bit     */
 #define CLR_SUSP   (~ISTR_SUSP)  /* clear SUSPend bit     */
@@ -117,7 +114,7 @@ static const struct usb_device_method *const method_p = &Device_Method;
 #define CLR_ESOF   (~ISTR_ESOF)  /* clear Expected Start Of Frame bit */
 
 #define CNTR_CTRM   (0x8000) /* Correct TRansfer Mask */
-#define CNTR_DOVRM  (0x4000) /* DMA OVeR/underrun Mask */
+#define CNTR_OVRM   (0x4000) /* OVeR/underrun Mask */
 #define CNTR_ERRM   (0x2000) /* ERRor Mask */
 #define CNTR_WKUPM  (0x1000) /* WaKe UP Mask */
 #define CNTR_SUSPM  (0x0800) /* SUSPend Mask */
@@ -393,19 +390,19 @@ usb_interrupt_handler (void)
 {
   uint16_t istr_value = st103_get_istr ();
 
-  if (istr_value & ISTR_CTR)
+  if ((istr_value & ISTR_CTR))
     usb_handle_transfer ();
 
-  if (istr_value & ISTR_RESET)
+  if ((istr_value & ISTR_RESET))
     {
       st103_set_istr (CLR_RESET);
-      method_p->reset ();
+      usb_cb_device_reset ();
     }
 
-  if (istr_value & ISTR_DOVR)
-    st103_set_istr (CLR_DOVR);
+  if ((istr_value & ISTR_OVR))
+    st103_set_istr (CLR_OVR);
 
-  if (istr_value & ISTR_ERR)
+  if ((istr_value & ISTR_ERR))
     st103_set_istr (CLR_ERR);
 }
 
@@ -529,7 +526,7 @@ static int std_get_status (uint8_t req,
       if (dev_p->current_configuration == 0)
        return USB_UNSUPPORT;
 
-      r = (*method_p->interface) (USB_QUERY_INTERFACE, index, 0);
+      r = usb_cb_interface (USB_QUERY_INTERFACE, index, 0);
       if (r != USB_SUCCESS)
        return USB_UNSUPPORT;
 
@@ -541,7 +538,7 @@ static int std_get_status (uint8_t req,
       uint8_t endpoint = (index & 0x0f);
       uint16_t status;
 
-      if ((index & 0x70) != 0 || endpoint == ENDP0)
+      if ((index & 0x70) || endpoint == ENDP0)
        return USB_UNSUPPORT;
 
       if ((index & 0x80))
@@ -699,10 +696,7 @@ static int std_get_descriptor (uint8_t req, uint16_t value,
     return USB_UNSUPPORT;
 
   (void)length;
-  if (rcp == DEVICE_RECIPIENT)
-    return (*method_p->get_descriptor) ((value >> 8), index, value);
-
-  return USB_UNSUPPORT;
+  return usb_cb_get_descriptor (rcp, (value >> 8), (value & 0xff), index);
 }
 
 static int std_get_configuration (uint8_t req, uint16_t value,
@@ -736,7 +730,7 @@ static int std_set_configuration (uint8_t req, uint16_t value,
     {
       int r;
 
-      r = (*method_p->event) (USB_EVENT_CONFIG, value);
+      r = usb_cb_handle_event (USB_EVENT_CONFIG, value);
       if (r == USB_SUCCESS)
        return USB_SUCCESS;
     }
@@ -760,7 +754,7 @@ static int std_get_interface (uint8_t req, uint16_t value,
       if (dev_p->current_configuration == 0)
        return USB_UNSUPPORT;
 
-      return (*method_p->interface) (USB_GET_INTERFACE, index, 0);
+      return usb_cb_interface (USB_GET_INTERFACE, index, 0);
     }
 
   return USB_UNSUPPORT;
@@ -784,7 +778,7 @@ static int std_set_interface (uint8_t req, uint16_t value,
       if (dev_p->current_configuration != 0)
        return USB_UNSUPPORT;
 
-      r = (*method_p->interface) (USB_SET_INTERFACE, index, value);
+      r = usb_cb_interface (USB_SET_INTERFACE, index, value);
       if (r == USB_SUCCESS)
        return USB_SUCCESS;
     }
@@ -792,21 +786,6 @@ static int std_set_interface (uint8_t req, uint16_t value,
   return USB_UNSUPPORT;
 }
 
-static const HANDLER std_request_handler[TOTAL_REQUEST] = {
-  std_get_status,
-  std_clear_feature,
-  std_none,
-  std_set_feature,
-  std_none,
-  std_set_address,
-  std_get_descriptor,
-  std_none,                    /* set_descriptor is not supported */
-  std_get_configuration,
-  std_set_configuration,
-  std_get_interface,
-  std_set_interface,
-  std_none,                    /* sync_frame is not  supported (for now) */
-};
 
 static void handle_setup0 (void)
 {
@@ -836,14 +815,27 @@ static void handle_setup0 (void)
     {
       if (req < TOTAL_REQUEST)
        {
-         handler = std_request_handler[req];
+         switch (req)
+           {
+           case 0: handler = std_get_status;  break;
+           case 1: handler = std_clear_feature;  break;
+           case 3: handler = std_set_feature;  break;
+           case 5: handler = std_set_address;  break;
+           case 6: handler = std_get_descriptor;  break;
+           case 8: handler = std_get_configuration;  break;
+           case 9: handler = std_set_configuration;  break;
+           case 10: handler = std_get_interface;  break;
+           case 11: handler = std_set_interface;  break;
+           default: handler = std_none;  break;
+           }
+
          r = (*handler) (ctrl_p->bmRequestType,
                          ctrl_p->wValue, ctrl_p->wIndex, ctrl_p->wLength);
        }
     }
   else
-    r = (*method_p->setup) (ctrl_p->bmRequestType, req,
-                           ctrl_p->wValue, ctrl_p->wIndex, ctrl_p->wLength);
+    r = usb_cb_setup (ctrl_p->bmRequestType, req,
+                     ctrl_p->wValue, ctrl_p->wIndex, ctrl_p->wLength);
 
   if (r != USB_SUCCESS)
     dev_p->state = STALLED;
@@ -890,12 +882,12 @@ static void handle_in0 (void)
           == (STANDARD_REQUEST | DEVICE_RECIPIENT)))
        {
          st103_set_daddr (ctrl_p->wValue);
-         (*method_p->event) (USB_EVENT_ADDRESS, ctrl_p->wValue);
+         usb_cb_handle_event (USB_EVENT_ADDRESS, ctrl_p->wValue);
        }
       else
-       (*method_p->ctrl_write_finish)  (ctrl_p->bmRequestType,
-                                        ctrl_p->bRequest, ctrl_p->wValue,
-                                        ctrl_p->wIndex, ctrl_p->wLength);
+       usb_cb_ctrl_write_finish  (ctrl_p->bmRequestType,
+                                  ctrl_p->bRequest, ctrl_p->wValue,
+                                  ctrl_p->wIndex, ctrl_p->wLength);
 
       dev_p->state = STALLED;
     }
@@ -938,26 +930,6 @@ void WEAK EP5_OUT_Callback (void);
 void WEAK EP6_OUT_Callback (void);
 void WEAK EP7_OUT_Callback (void);
 
-void (*const ep_intr_handler_IN[7]) (void) = {
-  EP1_IN_Callback,
-  EP2_IN_Callback,
-  EP3_IN_Callback,
-  EP4_IN_Callback,
-  EP5_IN_Callback,
-  EP6_IN_Callback,
-  EP7_IN_Callback,
-};
-
-void (*const ep_intr_handler_OUT[7]) (void) = {
-  EP1_OUT_Callback,
-  EP2_OUT_Callback,
-  EP3_OUT_Callback,
-  EP4_OUT_Callback,
-  EP5_OUT_Callback,
-  EP6_OUT_Callback,
-  EP7_OUT_Callback,
-};
-
 static void
 usb_handle_transfer (void)
 {
@@ -965,35 +937,29 @@ usb_handle_transfer (void)
   uint16_t istr_value;
   uint8_t ep_index;
 
-  while (((istr_value = st103_get_istr ()) & ISTR_CTR) != 0)
+  while (((istr_value = st103_get_istr ()) & ISTR_CTR))
     {
       ep_index = (istr_value & ISTR_EP_ID);
+      /* Decode and service non control endpoints interrupt  */
+      /* process related endpoint register */
+      ep_value = st103_get_epreg (ep_index);
+
       if (ep_index == 0)
        {
-         if ((istr_value & ISTR_DIR) == 0)
-           {                           /* DIR = 0 */
-             /* DIR = 0      => IN  int */
-             /* DIR = 0 implies that (EP_CTR_TX = 1) always  */
-
-             st103_ep_clear_ctr_tx (ENDP0);
+         if ((ep_value & EP_CTR_TX))
+           {
+             st103_ep_clear_ctr_tx (ep_index);
              handle_in0 ();
            }
-         else
-           {                           /* DIR = 1 */
-             /* DIR = 1 & CTR_RX       => SETUP or OUT int */
-             /* DIR = 1 & (CTR_TX | CTR_RX) => 2 int pending */
 
-             ep_value = st103_get_epreg (ENDP0);
-             if ((ep_value & EP_SETUP) != 0)
-               {
-                 st103_ep_clear_ctr_rx (ENDP0);
-                 handle_setup0 ();
-               }
-             else if ((ep_value & EP_CTR_RX) != 0)
-               {
-                 st103_ep_clear_ctr_rx (ENDP0);
-                 handle_out0 ();
-               }
+         if ((ep_value & EP_CTR_RX))
+           {
+             st103_ep_clear_ctr_rx (ep_index);
+
+             if ((ep_value & EP_SETUP))
+               handle_setup0 ();
+             else
+               handle_out0 ();
            }
 
          if (dev_p->state == STALLED)
@@ -1001,20 +967,34 @@ usb_handle_transfer (void)
        }
       else
        {
-         /* Decode and service non control endpoints interrupt  */
-         /* process related endpoint register */
-         ep_value = st103_get_epreg (ep_index);
-
-         if ((ep_value & EP_CTR_RX) != 0)
+         if ((ep_value & EP_CTR_RX))
            {
              st103_ep_clear_ctr_rx (ep_index);
-             (*ep_intr_handler_OUT[ep_index-1]) ();
+             switch ((ep_index - 1))
+               {
+               case 0: EP1_OUT_Callback ();  break;
+               case 1: EP2_OUT_Callback ();  break;
+               case 2: EP3_OUT_Callback ();  break;
+               case 3: EP4_OUT_Callback ();  break;
+               case 4: EP5_OUT_Callback ();  break;
+               case 5: EP6_OUT_Callback ();  break;
+               case 6: EP7_OUT_Callback ();  break;
+               }
            }
 
-         if ((ep_value & EP_CTR_TX) != 0)
+         if ((ep_value & EP_CTR_TX))
            {
              st103_ep_clear_ctr_tx (ep_index);
-             (*ep_intr_handler_IN[ep_index-1]) ();
+             switch ((ep_index - 1))
+               {
+               case 0: EP1_IN_Callback ();  break;
+               case 1: EP2_IN_Callback ();  break;
+               case 2: EP3_IN_Callback ();  break;
+               case 3: EP4_IN_Callback ();  break;
+               case 4: EP5_IN_Callback ();  break;
+               case 5: EP6_IN_Callback ();  break;
+               case 6: EP7_IN_Callback ();  break;
+               }
            }
        }
     }