summaryrefslogtreecommitdiff
path: root/firmware/src
diff options
context:
space:
mode:
authorlaforge <laforge@6dc7ffe9-61d6-0310-9af1-9938baff3ed1>2008-02-23 13:19:06 +0000
committerlaforge <laforge@6dc7ffe9-61d6-0310-9af1-9938baff3ed1>2008-02-23 13:19:06 +0000
commit4dc2cb5b49115f5376f27ff736a7939247deb111 (patch)
tree54cbcb1f570e6ab9b2d2250cba01547bf51a23f4 /firmware/src
parent3639a49edf440277793a608b251be4340c750b24 (diff)
* move usb descriptors into separate file (src/os/usb_descriptors_openpcd.h)
* add USB HID skeleton git-svn-id: https://svn.openpcd.org:2342/trunk@426 6dc7ffe9-61d6-0310-9af1-9938baff3ed1
Diffstat (limited to 'firmware/src')
-rw-r--r--firmware/src/os/pcd_enumerate.c101
-rw-r--r--firmware/src/os/usb_descriptors_hid.h112
-rw-r--r--firmware/src/os/usb_descriptors_openpcd.h110
-rw-r--r--firmware/src/os/usb_hid.c34
-rw-r--r--firmware/src/pcd/main_hid.c59
5 files changed, 319 insertions, 97 deletions
diff --git a/firmware/src/os/pcd_enumerate.c b/firmware/src/os/pcd_enumerate.c
index 5fc47a3..ab000c7 100644
--- a/firmware/src/os/pcd_enumerate.c
+++ b/firmware/src/os/pcd_enumerate.c
@@ -85,106 +85,13 @@ static const struct dfuapi *dfu = DFU_API_LOCATION;
#error non-DFU builds currently not supported (yet) again
#endif
-static struct udp_pcd upcd;
-
-const struct usb_device_descriptor dev_descriptor = {
- .bLength = USB_DT_DEVICE_SIZE,
- .bDescriptorType = USB_DT_DEVICE,
- .bcdUSB = 0x0100,
- .bDeviceClass = USB_CLASS_VENDOR_SPEC,
- .bDeviceSubClass = 0xff,
- .bDeviceProtocol = 0xff,
- .bMaxPacketSize0 = 0x08,
- .idVendor = USB_VENDOR_ID,
- .idProduct = USB_PRODUCT_ID,
- .bcdDevice = 0x0030, /* Version 0.3 */
-#ifdef CONFIG_USB_STRING
- .iManufacturer = 3,
- .iProduct = 4,
- .iSerialNumber = 0,
+#ifdef CONFIG_USB_HID
+#include "usb_descriptors_hid.h"
#else
- .iManufacturer = 0,
- .iProduct = 0,
- .iSerialNumber = 0,
-#endif
- .bNumConfigurations = 0x01,
-};
-
-struct _desc {
- struct usb_config_descriptor ucfg;
- struct usb_interface_descriptor uif;
- struct usb_endpoint_descriptor ep[3];
-#ifdef CONFIG_DFU
- struct usb_interface_descriptor uif_dfu[2];
+#include "usb_descriptors_openpcd.h"
#endif
-};
-const struct _desc cfg_descriptor = {
- .ucfg = {
- .bLength = USB_DT_CONFIG_SIZE,
- .bDescriptorType = USB_DT_CONFIG,
- .wTotalLength = USB_DT_CONFIG_SIZE +
-#ifdef CONFIG_DFU
- 3 * USB_DT_INTERFACE_SIZE +
- 3 * USB_DT_ENDPOINT_SIZE,
- .bNumInterfaces = 3,
-#else
- 1 * USB_DT_INTERFACE_SIZE +
- 3 * USB_DT_ENDPOINT_SIZE,
- .bNumInterfaces = 1,
-#endif
- .bConfigurationValue = 1,
-#ifdef CONFIG_USB_STRING
- .iConfiguration = 5,
-#else
- .iConfiguration = 0,
-#endif
- .bmAttributes = USB_CONFIG_ATT_ONE,
- .bMaxPower = 250, /* 500mA */
- },
- .uif = {
- .bLength = USB_DT_INTERFACE_SIZE,
- .bDescriptorType = USB_DT_INTERFACE,
- .bInterfaceNumber = 0,
- .bAlternateSetting = 0,
- .bNumEndpoints = 3,
- .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
- .bInterfaceSubClass = 0,
- .bInterfaceProtocol = 0xff,
-#ifdef CONFIG_SB_STRING
- .iInterface = 6,
-#else
- .iInterface = 0,
-#endif
- },
- .ep= {
- {
- .bLength = USB_DT_ENDPOINT_SIZE,
- .bDescriptorType = USB_DT_ENDPOINT,
- .bEndpointAddress = OPENPCD_OUT_EP,
- .bmAttributes = USB_ENDPOINT_XFER_BULK,
- .wMaxPacketSize = AT91C_EP_OUT_SIZE,
- .bInterval = 0x00,
- }, {
- .bLength = USB_DT_ENDPOINT_SIZE,
- .bDescriptorType = USB_DT_ENDPOINT,
- .bEndpointAddress = OPENPCD_IN_EP,
- .bmAttributes = USB_ENDPOINT_XFER_BULK,
- .wMaxPacketSize = AT91C_EP_IN_SIZE,
- .bInterval = 0x00,
- }, {
- .bLength = USB_DT_ENDPOINT_SIZE,
- .bDescriptorType = USB_DT_ENDPOINT,
- .bEndpointAddress = OPENPCD_IRQ_EP,
- .bmAttributes = USB_ENDPOINT_XFER_INT,
- .wMaxPacketSize = AT91C_EP_IN_SIZE,
- .bInterval = 0xff, /* FIXME */
- },
- },
-#ifdef CONFIG_DFU
- .uif_dfu = DFU_RT_IF_DESC,
-#endif
-};
+static struct udp_pcd upcd;
struct epstate {
u_int32_t state_busy;
diff --git a/firmware/src/os/usb_descriptors_hid.h b/firmware/src/os/usb_descriptors_hid.h
new file mode 100644
index 0000000..9399692
--- /dev/null
+++ b/firmware/src/os/usb_descriptors_hid.h
@@ -0,0 +1,112 @@
+#ifndef _USB_DESCRIPTORS_H
+#define _USB_DESCRIPTORS_H
+
+#include <usb_ch9.h>
+#include <usb_hid.h>
+#include <sys/types.h>
+#include <openpcd.h>
+#include <dfu/dfu.h>
+
+#include "../config.h"
+
+/* The USB descriptor set for emulating a HID device */
+
+const struct usb_device_descriptor dev_descriptor = {
+ .bLength = USB_DT_DEVICE_SIZE,
+ .bDescriptorType = USB_DT_DEVICE,
+ .bcdUSB = 0x0100,
+ .bDeviceClass = 0x00,
+ .bDeviceSubClass = 0x00,
+ .bDeviceProtocol = 0x00,
+ .bMaxPacketSize0 = 0x08,
+ .idVendor = USB_VENDOR_ID,
+ .idProduct = USB_PRODUCT_ID,
+ .bcdDevice = 0x0030, /* Version 0.3 */
+#ifdef CONFIG_USB_STRING
+ .iManufacturer = 3,
+ .iProduct = 4,
+ .iSerialNumber = 0,
+#else
+ .iManufacturer = 0,
+ .iProduct = 0,
+ .iSerialNumber = 0,
+#endif
+ .bNumConfigurations = 0x01,
+};
+
+struct _desc {
+ struct usb_config_descriptor ucfg;
+ struct usb_interface_descriptor uif;
+ struct usb_hid_descriptor hid;
+ struct usb_endpoint_descriptor ep[1];
+#ifdef CONFIG_DFU
+ struct usb_interface_descriptor uif_dfu[2];
+#endif
+};
+
+const struct _desc cfg_descriptor = {
+ .ucfg = {
+ .bLength = USB_DT_CONFIG_SIZE,
+ .bDescriptorType = USB_DT_CONFIG,
+ .wTotalLength = USB_DT_CONFIG_SIZE +
+#ifdef CONFIG_DFU
+ 3 * USB_DT_INTERFACE_SIZE +
+ 1 * USB_DT_ENDPOINT_SIZE,
+ .bNumInterfaces = 3,
+#else
+ 1 * USB_DT_INTERFACE_SIZE +
+ 1 * USB_DT_ENDPOINT_SIZE,
+ .bNumInterfaces = 1,
+#endif
+ .bConfigurationValue = 1,
+#ifdef CONFIG_USB_STRING
+ .iConfiguration = 5,
+#else
+ .iConfiguration = 0,
+#endif
+ .bmAttributes = USB_CONFIG_ATT_ONE,
+ .bMaxPower = 250, /* 500mA */
+ },
+ .uif = {
+ .bLength = USB_DT_INTERFACE_SIZE,
+ .bDescriptorType = USB_DT_INTERFACE,
+ .bInterfaceNumber = 0,
+ .bAlternateSetting = 0,
+ .bNumEndpoints = 1,
+ .bInterfaceClass = USB_CLASS_HID,
+ .bInterfaceSubClass = 0,
+ .bInterfaceProtocol = 0x01,
+#ifdef CONFIG_USB_STRING
+ .iInterface = 6,
+#else
+ .iInterface = 0,
+#endif
+ },
+ .hid = {
+ .bLength = 0x09,
+ .bDescriptorType = HID_DT_HID,
+ .bcdHID = 0x0111,
+ .bCountryCode = 0,
+ .bNumDescriptors = 1,
+ .desc[0] = {
+ .bDescriptorType = HID_DT_REPORT,
+ .bLength = FIXME,
+ },
+ },
+ .ep = {
+ {
+ .bLength = USB_DT_ENDPOINT_SIZE,
+ .bDescriptorType = USB_DT_ENDPOINT,
+ .bEndpointAddress = OPENPCD_IRQ_EP,
+ .bmAttributes = USB_ENDPOINT_XFER_INT,
+ .wMaxPacketSize = AT91C_EP_IN_SIZE,
+ .bInterval = 0x0a, /* FIXME */
+ },
+ },
+
+#ifdef CONFIG_DFU
+ .uif_dfu = DFU_RT_IF_DESC,
+#endif
+};
+
+#endif /* _USB_DESCRIPTORS_H */
diff --git a/firmware/src/os/usb_descriptors_openpcd.h b/firmware/src/os/usb_descriptors_openpcd.h
new file mode 100644
index 0000000..ceb7ff6
--- /dev/null
+++ b/firmware/src/os/usb_descriptors_openpcd.h
@@ -0,0 +1,110 @@
+#ifndef _USB_DESCRIPTORS_H
+#define _USB_DESCRIPTORS_H
+
+#include <usb_ch9.h>
+#include <sys/types.h>
+#include <openpcd.h>
+#include <dfu/dfu.h>
+
+#include "../config.h"
+
+const struct usb_device_descriptor dev_descriptor = {
+ .bLength = USB_DT_DEVICE_SIZE,
+ .bDescriptorType = USB_DT_DEVICE,
+ .bcdUSB = 0x0100,
+ .bDeviceClass = USB_CLASS_VENDOR_SPEC,
+ .bDeviceSubClass = 0xff,
+ .bDeviceProtocol = 0xff,
+ .bMaxPacketSize0 = 0x08,
+ .idVendor = USB_VENDOR_ID,
+ .idProduct = USB_PRODUCT_ID,
+ .bcdDevice = 0x0030, /* Version 0.3 */
+#ifdef CONFIG_USB_STRING
+ .iManufacturer = 3,
+ .iProduct = 4,
+ .iSerialNumber = 0,
+#else
+ .iManufacturer = 0,
+ .iProduct = 0,
+ .iSerialNumber = 0,
+#endif
+ .bNumConfigurations = 0x01,
+};
+
+struct _desc {
+ struct usb_config_descriptor ucfg;
+ struct usb_interface_descriptor uif;
+ struct usb_endpoint_descriptor ep[3];
+#ifdef CONFIG_DFU
+ struct usb_interface_descriptor uif_dfu[2];
+#endif
+};
+
+const struct _desc cfg_descriptor = {
+ .ucfg = {
+ .bLength = USB_DT_CONFIG_SIZE,
+ .bDescriptorType = USB_DT_CONFIG,
+ .wTotalLength = USB_DT_CONFIG_SIZE +
+#ifdef CONFIG_DFU
+ 3 * USB_DT_INTERFACE_SIZE +
+ 3 * USB_DT_ENDPOINT_SIZE,
+ .bNumInterfaces = 3,
+#else
+ 1 * USB_DT_INTERFACE_SIZE +
+ 3 * USB_DT_ENDPOINT_SIZE,
+ .bNumInterfaces = 1,
+#endif
+ .bConfigurationValue = 1,
+#ifdef CONFIG_USB_STRING
+ .iConfiguration = 5,
+#else
+ .iConfiguration = 0,
+#endif
+ .bmAttributes = USB_CONFIG_ATT_ONE,
+ .bMaxPower = 250, /* 500mA */
+ },
+ .uif = {
+ .bLength = USB_DT_INTERFACE_SIZE,
+ .bDescriptorType = USB_DT_INTERFACE,
+ .bInterfaceNumber = 0,
+ .bAlternateSetting = 0,
+ .bNumEndpoints = 3,
+ .bInterfaceClass = USB_CLASS_VENDOR_SPEC,
+ .bInterfaceSubClass = 0,
+ .bInterfaceProtocol = 0xff,
+#ifdef CONFIG_USB_STRING
+ .iInterface = 6,
+#else
+ .iInterface = 0,
+#endif
+ },
+ .ep= {
+ {
+ .bLength = USB_DT_ENDPOINT_SIZE,
+ .bDescriptorType = USB_DT_ENDPOINT,
+ .bEndpointAddress = OPENPCD_OUT_EP,
+ .bmAttributes = USB_ENDPOINT_XFER_BULK,
+ .wMaxPacketSize = AT91C_EP_OUT_SIZE,
+ .bInterval = 0x00,
+ }, {
+ .bLength = USB_DT_ENDPOINT_SIZE,
+ .bDescriptorType = USB_DT_ENDPOINT,
+ .bEndpointAddress = OPENPCD_IN_EP,
+ .bmAttributes = USB_ENDPOINT_XFER_BULK,
+ .wMaxPacketSize = AT91C_EP_IN_SIZE,
+ .bInterval = 0x00,
+ }, {
+ .bLength = USB_DT_ENDPOINT_SIZE,
+ .bDescriptorType = USB_DT_ENDPOINT,
+ .bEndpointAddress = OPENPCD_IRQ_EP,
+ .bmAttributes = USB_ENDPOINT_XFER_INT,
+ .wMaxPacketSize = AT91C_EP_IN_SIZE,
+ .bInterval = 0xff, /* FIXME */
+ },
+ },
+#ifdef CONFIG_DFU
+ .uif_dfu = DFU_RT_IF_DESC,
+#endif
+};
+
+#endif /* _USB_DESCRIPTORS_H */
diff --git a/firmware/src/os/usb_hid.c b/firmware/src/os/usb_hid.c
new file mode 100644
index 0000000..57daeb5
--- /dev/null
+++ b/firmware/src/os/usb_hid.c
@@ -0,0 +1,34 @@
+/* OpenPCD USB HID - emulate a human inupt device
+ * (C) 2008 by Harald Welte <hwelte@hmw-consulting.de>
+ *
+ * This program 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
+#include <sys/types.h>
+#include <errno.h>
+#include <string.h>
+
+#include <openpcd.h>
+
+#include <os/pcd_enumerate.h>
+#include <os/usb_handler.h>
+#include <os/req_ctx.h>
+#include <os/led.h>
+#include <os/dbgu.h>
+
+#include "../openpcd.h"
+
+
diff --git a/firmware/src/pcd/main_hid.c b/firmware/src/pcd/main_hid.c
new file mode 100644
index 0000000..9735c3d
--- /dev/null
+++ b/firmware/src/pcd/main_hid.c
@@ -0,0 +1,59 @@
+/* main_hid - OpenPCD Human Input Device firmware
+ *
+ * (C) 2008 by Harald Welte <laforge@hmw-consulting.de>
+ *
+ * This program 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <errno.h>
+#include <string.h>
+#include <lib_AT91SAM7.h>
+#include <openpcd.h>
+#include <os/dbgu.h>
+#include <os/led.h>
+#include <os/pcd_enumerate.h>
+#include <os/usb_handler.h>
+
+static void help(void)
+{
+}
+
+int _main_dbgu(char key)
+{
+ switch (key) {
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+void _init_func(void)
+{
+ //usbtest_init();
+}
+
+void _main_func(void)
+{
+ /* first we try to get rid of pending to-be-sent stuff */
+ usb_out_process();
+
+ /* next we deal with incoming reqyests from USB EP1 (OUT) */
+ usb_in_process();
+
+ /* try unthrottling sources since we now are [more] likely to
+ * have empty request contexts */
+ udp_unthrottle();
+}
personal git repositories of Harald Welte. Your mileage may vary