summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/driver/usbh_device_driver.h134
-rw-r--r--include/usbh_config.h14
-rw-r--r--include/usbh_core.h61
-rw-r--r--include/usbh_driver_hid.h85
-rw-r--r--include/usbh_driver_hid_mouse.h53
-rw-r--r--include/usbh_lld_stm32f4.h4
6 files changed, 210 insertions, 141 deletions
diff --git a/include/driver/usbh_device_driver.h b/include/driver/usbh_device_driver.h
index bace1ef..e846fd2 100644
--- a/include/driver/usbh_device_driver.h
+++ b/include/driver/usbh_device_driver.h
@@ -26,6 +26,7 @@
#include "usbh_config.h"
#include "usbh_core.h"
+#include <libopencm3/usb/usbstd.h>
#include <stdint.h>
BEGIN_DECLS
@@ -61,6 +62,54 @@ enum USBH_CONTROL_TYPE {
USBH_CONTROL_TYPE_DATA
};
+enum USBH_ENUM_STATE {
+ USBH_ENUM_STATE_SET_ADDRESS,
+ USBH_ENUM_STATE_FIRST = USBH_ENUM_STATE_SET_ADDRESS,
+ USBH_ENUM_STATE_DEVICE_DT_READ_SETUP,
+ USBH_ENUM_STATE_DEVICE_DT_READ_COMPLETE,
+ USBH_ENUM_STATE_CONFIGURATION_DT_HEADER_READ_SETUP,
+ USBH_ENUM_STATE_CONFIGURATION_DT_HEADER_READ,
+ USBH_ENUM_STATE_CONFIGURATION_DT_HEADER_READ_COMPLETE,
+ USBH_ENUM_STATE_CONFIGURATION_DT_READ_SETUP,
+ USBH_ENUM_STATE_CONFIGURATION_DT_READ,
+ USBH_ENUM_STATE_CONFIGURATION_DT_READ_COMPLETE,
+ USBH_ENUM_STATE_SET_CONFIGURATION_SETUP,
+ USBH_ENUM_STATE_SET_CONFIGURATION_COMPLETE,
+ USBH_ENUM_STATE_FIND_DRIVER,
+};
+
+enum USBH_CONTROL_STATE {
+ USBH_CONTROL_STATE_NONE,
+ USBH_CONTROL_STATE_SETUP,
+ USBH_CONTROL_STATE_DATA,
+ USBH_CONTROL_STATE_STATUS,
+};
+
+typedef struct _usbh_device usbh_device_t;
+
+struct _usbh_packet_callback_data {
+ /// status - it is used for reporting of the errors
+ enum USBH_PACKET_CALLBACK_STATUS status;
+
+ /// count of bytes that has been actually transferred
+ uint32_t transferred_length;
+};
+typedef struct _usbh_packet_callback_data usbh_packet_callback_data_t;
+
+typedef void (*usbh_packet_callback_t)(usbh_device_t *dev, usbh_packet_callback_data_t status);
+
+struct _usbh_control {
+ enum USBH_CONTROL_STATE state;
+ usbh_packet_callback_t callback;
+ union {
+ const void *out;
+ void *in;
+ } data;
+ uint16_t data_length;
+ struct usb_setup_data setup_data;
+};
+typedef struct _usbh_control usbh_control_t;
+
/**
* @brief The _usbh_device struct
*
@@ -77,7 +126,8 @@ struct _usbh_device {
enum USBH_SPEED speed;
/// state used for enumeration purposes
- uint8_t state;
+ enum USBH_ENUM_STATE state;
+ usbh_control_t control;
/// toggle bit
uint8_t toggle0;
@@ -99,20 +149,12 @@ struct _usbh_device {
};
typedef struct _usbh_device usbh_device_t;
-struct _usbh_packet_callback_data {
- /// status - it is used for reporting of the errors
- enum USBH_PACKET_CALLBACK_STATUS status;
-
- /// count of bytes that has been actually transferred
- uint32_t transferred_length;
-};
-typedef struct _usbh_packet_callback_data usbh_packet_callback_data_t;
-
-typedef void (*usbh_packet_callback_t)(usbh_device_t *dev, usbh_packet_callback_data_t status);
-
struct _usbh_packet {
/// pointer to data
- void *data;
+ union {
+ const void *out;
+ void *in;
+ } data;
/// length of the data (up to 1023)
uint16_t datalen;
@@ -201,6 +243,66 @@ struct _usbh_generic_data {
typedef struct _usbh_generic_data usbh_generic_data_t;
+/// set to -1 for unused items ("don't care" functionality) @see find_driver()
+struct _usbh_dev_driver_info {
+ int32_t deviceClass;
+ int32_t deviceSubClass;
+ int32_t deviceProtocol;
+ int32_t idVendor;
+ int32_t idProduct;
+ int32_t ifaceClass;
+ int32_t ifaceSubClass;
+ int32_t ifaceProtocol;
+};
+typedef struct _usbh_dev_driver_info usbh_dev_driver_info_t;
+
+struct _usbh_dev_driver {
+ /**
+ * @brief init is initialization routine of the device driver
+ *
+ * This function is called during the initialization of the device driver
+ */
+ void *(*init)(usbh_device_t *usbh_dev);
+
+ /**
+ * @brief analyze descriptor
+ * @param[in/out] drvdata is the device driver's private data
+ * @param[in] descriptor is the pointer to the descriptor that should
+ * be parsed in order to prepare driver to be loaded
+ *
+ * @retval true when the enumeration is complete and the driver is ready to be used
+ * @retval false when the device driver is not ready to be used
+ *
+ * This should be used for getting correct endpoint numbers, getting maximum sizes of endpoints.
+ * Should return true, when no more data is needed.
+ *
+ */
+ bool (*analyze_descriptor)(void *drvdata, void *descriptor);
+
+ /**
+ * @brief poll method is called periodically by the library core
+ * @param[in/out] drvdata is the device driver's private data
+ * @param[in] time_curr_us current timestamp in microseconds
+ * @see usbh_poll()
+ */
+ void (*poll)(void *drvdata, uint32_t time_curr_us);
+
+ /**
+ * @brief unloads the device driver
+ * @param[in/out] drvdata is the device driver's private data
+ *
+ * This should free any data associated with this device
+ */
+ void (*remove)(void *drvdata);
+
+ /**
+ * @brief info - compatibility information about the driver. It is used by the core during device enumeration
+ * @see find_driver()
+ */
+ const usbh_dev_driver_info_t * const info;
+};
+typedef struct _usbh_dev_driver usbh_dev_driver_t;
+
#define ERROR(arg) LOG_PRINTF("UNHANDLED_ERROR %d: file: %s, line: %d",\
arg, __FILE__, __LINE__)
@@ -216,10 +318,8 @@ void usbh_read(usbh_device_t *dev, usbh_packet_t *packet);
void usbh_write(usbh_device_t *dev, const usbh_packet_t *packet);
/* Helper functions used by device drivers */
-void device_xfer_control_read(void *data, uint16_t datalen, usbh_packet_callback_t callback, usbh_device_t *dev);
-void device_xfer_control_write_setup(void *data, uint16_t datalen, usbh_packet_callback_t callback, usbh_device_t *dev);
-void device_xfer_control_write_data(void *data, uint16_t datalen, usbh_packet_callback_t callback, usbh_device_t *dev);
-
+void device_control(usbh_device_t *dev, usbh_packet_callback_t callback, const struct usb_setup_data *setup_data, void *data);
+void device_remove(usbh_device_t *dev);
END_DECLS
diff --git a/include/usbh_config.h b/include/usbh_config.h
index 7bf800b..8146ffb 100644
--- a/include/usbh_config.h
+++ b/include/usbh_config.h
@@ -38,10 +38,10 @@
// Set this wisely
#define BUFFER_ONE_BYTES (2048)
-// MOUSE
-#define USBH_HID_MOUSE_MAX_DEVICES (2)
-
-#define USBH_HID_MOUSE_BUFFER (32)
+// HID class devices
+#define USBH_HID_MAX_DEVICES (2)
+#define USBH_HID_BUFFER (256)
+#define USBH_HID_REPORT_BUFFER (4)
// MIDI
// Maximal number of midi devices connected to whatever hub
@@ -59,10 +59,4 @@
#error USBH_MAX_DEVICES > 127
#endif
-// Uncomment to enable OTG_HS support - low level driver
-// #define USE_STM32F4_USBH_DRIVER_HS
-
-// Uncomment to enable OTG_FS support - low level driver
-#define USE_STM32F4_USBH_DRIVER_FS
-
#endif
diff --git a/include/usbh_core.h b/include/usbh_core.h
index 2a36809..04dbd29 100644
--- a/include/usbh_core.h
+++ b/include/usbh_core.h
@@ -40,72 +40,15 @@
BEGIN_DECLS
-/// set to -1 for unused items ("don't care" functionality) @see find_driver()
-struct _usbh_dev_driver_info {
- int32_t deviceClass;
- int32_t deviceSubClass;
- int32_t deviceProtocol;
- int32_t idVendor;
- int32_t idProduct;
- int32_t ifaceClass;
- int32_t ifaceSubClass;
- int32_t ifaceProtocol;
-};
-typedef struct _usbh_dev_driver_info usbh_dev_driver_info_t;
-
-struct _usbh_dev_driver {
- /**
- * @brief init is initialization routine of the device driver
- *
- * This function is called during the initialization of the device driver
- */
- void *(*init)(void *usbh_dev);
-
- /**
- * @brief analyze descriptor
- * @param[in/out] drvdata is the device driver's private data
- * @param[in] descriptor is the pointer to the descriptor that should
- * be parsed in order to prepare driver to be loaded
- *
- * @retval true when the enumeration is complete and the driver is ready to be used
- * @retval false when the device driver is not ready to be used
- *
- * This should be used for getting correct endpoint numbers, getting maximum sizes of endpoints.
- * Should return true, when no more data is needed.
- *
- */
- bool (*analyze_descriptor)(void *drvdata, void *descriptor);
-
- /**
- * @brief poll method is called periodically by the library core
- * @param[in/out] drvdata is the device driver's private data
- * @param[in] time_curr_us current timestamp in microseconds
- * @see usbh_poll()
- */
- void (*poll)(void *drvdata, uint32_t time_curr_us);
-
- /**
- * @brief unloads the device driver
- * @param[in/out] drvdata is the device driver's private data
- *
- * This should free any data associated with this device
- */
- void (*remove)(void *drvdata);
-
- /**
- * @brief info - compatibility information about the driver. It is used by the core during device enumeration
- * @see find_driver()
- */
- const usbh_dev_driver_info_t * const info;
-};
typedef struct _usbh_dev_driver usbh_dev_driver_t;
+typedef struct _usbh_low_level_driver usbh_low_level_driver_t;
/**
* @brief usbh_init
* @param low_level_drivers list of the low level drivers to be used by this library
* @param device_drivers list of the device drivers that could be used with attached devices
*/
-void usbh_init(const void *low_level_drivers[], const usbh_dev_driver_t * const device_drivers[]);
+void usbh_init(const usbh_low_level_driver_t * const low_level_drivers[], const usbh_dev_driver_t * const device_drivers[]);
/**
* @brief usbh_poll
diff --git a/include/usbh_driver_hid.h b/include/usbh_driver_hid.h
new file mode 100644
index 0000000..8155d82
--- /dev/null
+++ b/include/usbh_driver_hid.h
@@ -0,0 +1,85 @@
+/*
+ * This file is part of the libusbhost library
+ * hosted at http://github.com/libusbhost/libusbhost
+ *
+ * Copyright (C) 2016 Amir Hammad <amir.hammad@hotmail.com>
+ *
+ *
+ * libusbhost is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This library 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 Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this library. If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+#ifndef USBH_DRIVER_HID_
+#define USBH_DRIVER_HID_
+
+#include "usbh_core.h"
+
+#include <stdint.h>
+
+BEGIN_DECLS
+
+struct _hid_mouse_config {
+ /**
+ * @brief this is called when some data is read when polling the device
+ * @param device_id handle of HID device
+ * @param data pointer to the data
+ * @param length count of bytes in the data
+ *
+ * TODO: make better interface that provides data contained in the report descriptor
+ *
+ */
+ void (*hid_in_message_handler)(uint8_t device_id, const uint8_t *data, uint32_t length);
+};
+typedef struct _hid_mouse_config hid_config_t;
+
+/**
+ * @brief hid_mouse_driver_init initialization routine - this will initialize internal structures of this device driver
+ * @param config
+ * @see hid_mouse_config_t
+ */
+void hid_driver_init(const hid_config_t *config);
+
+/**
+ * @brief hid_set_report
+ * @param device_id handle of HID device
+ * @returns true on success, false otherwise
+ */
+bool hid_set_report(uint8_t device_id, uint8_t val);
+
+enum HID_TYPE {
+ HID_TYPE_NONE,
+ HID_TYPE_MOUSE,
+ HID_TYPE_KEYBOARD,
+};
+
+/**
+ * @brief hid_get_type
+ * @param device_id handle of HID device
+ * @return type of attached HID
+ * @see enum HID_TYPE
+ */
+enum HID_TYPE hid_get_type(uint8_t device_id);
+
+/**
+ * @brief hid_is_connected
+ * @param device_id handle of HID device
+ * @return true if the device with device_id is connected
+ */
+bool hid_is_connected(uint8_t device_id);
+
+extern const usbh_dev_driver_t usbh_hid_driver;
+
+END_DECLS
+
+#endif
diff --git a/include/usbh_driver_hid_mouse.h b/include/usbh_driver_hid_mouse.h
deleted file mode 100644
index 4a9f0d3..0000000
--- a/include/usbh_driver_hid_mouse.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * This file is part of the libusbhost library
- * hosted at http://github.com/libusbhost/libusbhost
- *
- * Copyright (C) 2015 Amir Hammad <amir.hammad@hotmail.com>
- *
- *
- * libusbhost is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This library 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 Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this library. If not, see <http://www.gnu.org/licenses/>.
- *
- */
-
-#ifndef USBH_DRIVER_HID_MOUSE_
-#define USBH_DRIVER_HID_MOUSE_
-
-#include "usbh_core.h"
-
-#include <stdint.h>
-
-BEGIN_DECLS
-
-struct _hid_mouse_config {
- /**
- * @brief this is called when some data is read when polling the device
- * @param device_id
- * @param data pointer to the data (only 4 bytes are valid!)
- */
- void (*mouse_in_message_handler)(uint8_t device_id, const uint8_t *data);
-};
-typedef struct _hid_mouse_config hid_mouse_config_t;
-
-/**
- * @brief hid_mouse_driver_init initialization routine - this will initialize internal structures of this device driver
- * @param config
- * @see hid_mouse_config_t
- */
-void hid_mouse_driver_init(const hid_mouse_config_t *config);
-
-extern const usbh_dev_driver_t usbh_hid_mouse_driver;
-
-END_DECLS
-
-#endif
diff --git a/include/usbh_lld_stm32f4.h b/include/usbh_lld_stm32f4.h
index ead40cd..33be145 100644
--- a/include/usbh_lld_stm32f4.h
+++ b/include/usbh_lld_stm32f4.h
@@ -30,8 +30,8 @@
BEGIN_DECLS
// pass this to usbh init
-extern const void *usbh_lld_stm32f4_driver_fs;
-extern const void *usbh_lld_stm32f4_driver_hs;
+extern const usbh_low_level_driver_t usbh_lld_stm32f4_driver_fs;
+extern const usbh_low_level_driver_t usbh_lld_stm32f4_driver_hs;
#ifdef USART_DEBUG
void print_channels(const void *drvdata);