USB: compile-time endpoints allocation
authorarighi <arighi@38d2e660-2303-0410-9eaa-f027e97ec537>
Thu, 30 Sep 2010 10:47:06 +0000 (10:47 +0000)
committerarighi <arighi@38d2e660-2303-0410-9eaa-f027e97ec537>
Thu, 30 Sep 2010 10:47:06 +0000 (10:47 +0000)
If we want to use many USB device drivers at the same time, we need to
properly allocate the endpoints among different drivers to avoid
conflicts (different drivers using the same endpoint).

Perform this allocation at compile-time according to the drivers enabled
in the project's configuration.

git-svn-id: https://src.develer.com/svnoss/bertos/trunk@4377 38d2e660-2303-0410-9eaa-f027e97ec537

bertos/cfg/cfg_usbkbd.h
bertos/cfg/cfg_usbmouse.h
bertos/cfg/cfg_usbser.h
bertos/cpu/cortex-m3/drv/usb_stm32.c
bertos/drv/usb_endpoint.h [new file with mode: 0644]
bertos/drv/usbkbd.c
bertos/drv/usbmouse.c
bertos/drv/usbser.c

index f7ade6eb41d05cdde1f02c9778e20eabbd6e76b8..967b541fc2080b53c0128ff0f429e435eba03196 100644 (file)
 #ifndef CFG_USBKBD_H
 #define CFG_USBKBD_H
 
+/**
+ * Enable the usbkbd module.
+ *
+ * $WIZ$ type = "autoenabled"
+ */
+#define CONFIG_USBKBD 0
+
 /**
  * Module logging level.
  *
index c3b0971935b864b5efc16a32aed1d661d2950dac..89ff4c531ddab571251b1722770b0f0d88fe33b8 100644 (file)
 #ifndef CFG_USBMOUSE_H
 #define CFG_USBMOUSE_H
 
+/**
+ * Enable the usbmouse module.
+ *
+ * $WIZ$ type = "autoenabled"
+ */
+#define CONFIG_USBMOUSE 0
+
 /**
  * Module logging level.
  *
index 88fcd1904f8c7edd057218dbc1a1230e950833ea..6e47012a6a012787a41a9a1b4f18c65ddcdbdce3 100644 (file)
 #ifndef CFG_USBSER_H
 #define CFG_USBSER_H
 
+/**
+ * Enable the usb-serial module.
+ *
+ * $WIZ$ type = "autoenabled"
+ */
+#define CONFIG_USBSER 0
+
 /**
  * Module logging level.
  *
index 7c802d600ffd26f06ece450897f6e7c3dd30685a..0aa4c188ee8a74a171b6e7aa2d63e9cd9fb73c9e 100644 (file)
 
 #include "usb_stm32.h"
 
+/* XXX: consider to move this to cfg/compiler.h */
 #define ALIGNED(x)     __attribute__ ((__aligned__(x)))
+
+/* XXX: consider to move this to cfg/macros.h */
 #define ALIGN_UP(value, align) (((value) & ((align) - 1)) ? \
                                (((value) + ((align) - 1)) & ~((align) - 1)) : \
                                (value))
diff --git a/bertos/drv/usb_endpoint.h b/bertos/drv/usb_endpoint.h
new file mode 100644 (file)
index 0000000..7af79c0
--- /dev/null
@@ -0,0 +1,62 @@
+/**
+ * \file
+ * <!--
+ * This file is part of BeRTOS.
+ *
+ * Bertos is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ *
+ * As a special exception, you may use this file as part of a free software
+ * library without restriction.  Specifically, if other files instantiate
+ * templates or use macros or inline functions from this file, or you compile
+ * this file and link it with other files to produce an executable, this
+ * file does not by itself cause the resulting executable to be covered by
+ * the GNU General Public License.  This exception does not however
+ * invalidate any other reasons why the executable file might be covered by
+ * the GNU General Public License.
+ *
+ * Copyright 2010 Develer S.r.l. (http://www.develer.com/)
+ *
+ * -->
+ *
+ * \author Andrea Righi <arighi@develer.com>
+ *
+ * \brief USB endpoint allocations
+ *
+ * This file defines how the endpoints are allocated among the supported USB
+ * device drivers in BeRTOs.
+ *
+ */
+
+#ifndef USB_ENDPOINT_H
+#define USB_ENDPOINT_H
+
+/* Enpoint allocation (according to the compile-time options) */
+enum {
+       USB_CTRL_ENDPOINT = 0, /* This must be always allocated */
+#if (defined(CONFIG_USBSER) && CONFIG_USBSER)
+       USB_SERIAL_EP_REPORT,
+       USB_SERIAL_EP_OUT,
+       USB_SERIAL_EP_IN,
+#endif
+#if (defined(CONFIG_USBKBD) && CONFIG_USBKBD)
+       USB_KBD_EP_REPORT,
+#endif
+#if (defined(CONFIG_USBMOUSE) && CONFIG_USBMOUSE)
+       USB_MOUSE_EP_REPORT,
+#endif
+       USB_EP_MAX, /* Number of allocated endpoints */
+};
+
+#endif /* USB_ENDPOINT_H */
index 24608770c91fbad5ff168de67239254e5d9274a8..02d1c7d9304b1f4d7c1b59e8df984102c1df8b99 100644 (file)
@@ -50,6 +50,7 @@
 #include <cpu/power.h> // cpu_relax()
 
 #include <drv/usb.h>
+#include <drv/usb_endpoint.h>
 
 #include "drv/usb_hid.h"
 #include "drv/usbkbd.h"
@@ -66,7 +67,7 @@
 #define USB_STRING_MANUFACTURER 1
 #define USB_STRING_PRODUCT     2
 
-#define USB_HID_REPORT_EP      (USB_DIR_IN | 1)
+#define USB_HID_REPORT_EP      (USB_DIR_IN | USB_KBD_EP_REPORT)
 
 static UsbDeviceDesc usb_hid_device_descriptor =
 {
index b725a8f46c8a667fc095bc9201631a11c7c62367..a562f58287feaa0da985811d9dd81298cbc92448 100644 (file)
@@ -50,6 +50,7 @@
 #include <cpu/power.h> // cpu_relax()
 
 #include <drv/usb.h>
+#include <drv/usb_endpoint.h>
 
 #include "drv/usb_hid.h"
 #include "drv/usbmouse.h"
@@ -66,7 +67,7 @@
 #define USB_STRING_MANUFACTURER 1
 #define USB_STRING_PRODUCT     2
 
-#define USB_HID_REPORT_EP      (USB_DIR_IN | 1)
+#define USB_HID_REPORT_EP      (USB_DIR_IN | USB_MOUSE_EP_REPORT)
 
 static UsbDeviceDesc usb_hid_device_descriptor =
 {
index b6c7161fda4af59b7bbdc766b7e5101873c8939a..78444b136b66446e59087283b03844b838887421 100644 (file)
@@ -52,6 +52,7 @@
 #include <cpu/power.h> /* cpu_relax() */
 
 #include <drv/usb.h>
+#include <drv/usb_endpoint.h>
 
 #include <string.h> /* memcpy() */
 
@@ -112,7 +113,7 @@ static const UsbEndpointDesc usb_serial_ep_report_descriptor =
 {
        .bLength = sizeof(usb_serial_ep_report_descriptor),
        .bDescriptorType = USB_DT_ENDPOINT,
-       .bEndpointAddress = USB_DIR_IN | 1,
+       .bEndpointAddress = USB_DIR_IN | USB_SERIAL_EP_REPORT,
        .bmAttributes = USB_ENDPOINT_XFER_INT,
        .wMaxPacketSize = usb_cpu_to_le16((uint16_t)8),
        .bInterval = 1,
@@ -122,7 +123,7 @@ static const UsbEndpointDesc usb_serial_ep_in_descriptor =
 {
        .bLength = sizeof(usb_serial_ep_in_descriptor),
        .bDescriptorType = USB_DT_ENDPOINT,
-       .bEndpointAddress = USB_DIR_IN | 3,
+       .bEndpointAddress = USB_DIR_IN | USB_SERIAL_EP_IN,
        .bmAttributes = USB_ENDPOINT_XFER_BULK,
        .wMaxPacketSize = usb_cpu_to_le16((uint16_t)64),
        .bInterval = 0,
@@ -132,7 +133,7 @@ static const UsbEndpointDesc usb_serial_ep_out_descriptor =
 {
        .bLength = sizeof(usb_serial_ep_in_descriptor),
        .bDescriptorType = USB_DT_ENDPOINT,
-       .bEndpointAddress = USB_DIR_OUT | 2,
+       .bEndpointAddress = USB_DIR_OUT | USB_SERIAL_EP_OUT,
        .bmAttributes = USB_ENDPOINT_XFER_BULK,
        .wMaxPacketSize = usb_cpu_to_le16((uint16_t)64),
        .bInterval = 0,