summaryrefslogtreecommitdiff
path: root/tinyusb
diff options
context:
space:
mode:
authorhathach <[email protected]>2013-12-11 14:31:27 +0700
committerhathach <[email protected]>2013-12-11 14:31:27 +0700
commit4d14e2ac50dfa137d8b761825011c3a4e97cf26d (patch)
treec650661bc180c0138e8895320be97964c58119e8 /tinyusb
parentb35d2c8f43bd8fa80fd85bbb44c9f3f1d6030e20 (diff)
add structure & define for ohci
Diffstat (limited to 'tinyusb')
-rw-r--r--tinyusb/host/ehci/ehci.c14
-rw-r--r--tinyusb/host/ehci/ehci.h2
-rw-r--r--tinyusb/host/ohci/ohci.c185
-rw-r--r--tinyusb/host/ohci/ohci.h277
4 files changed, 470 insertions, 8 deletions
diff --git a/tinyusb/host/ehci/ehci.c b/tinyusb/host/ehci/ehci.c
index 21114712e..de9f88f9f 100644
--- a/tinyusb/host/ehci/ehci.c
+++ b/tinyusb/host/ehci/ehci.c
@@ -171,6 +171,13 @@ tusb_speed_t hcd_port_speed_get(uint8_t hostid)
return (tusb_speed_t) get_operational_register(hostid)->portsc_bit.nxp_port_speed; // NXP specific port speed
}
+// TODO refractor abtract later
+void hcd_port_unplug(uint8_t hostid)
+{
+ ehci_registers_t* const regs = get_operational_register(hostid);
+ regs->usb_cmd_bit.advacne_async = 1; // Async doorbell check EHCI 4.8.2 for operational details
+}
+
//--------------------------------------------------------------------+
// Controller API
//--------------------------------------------------------------------+
@@ -572,13 +579,6 @@ static void port_connect_status_change_isr(uint8_t hostid)
}
}
-// TODO refractor abtract later
-void hcd_port_unplug(uint8_t hostid)
-{
- ehci_registers_t* const regs = get_operational_register(hostid);
- regs->usb_cmd_bit.advacne_async = 1; // Async doorbell check EHCI 4.8.2 for operational details
-}
-
static void qhd_xfer_complete_isr(ehci_qhd_t * p_qhd)
{
uint8_t max_loop = 0;
diff --git a/tinyusb/host/ehci/ehci.h b/tinyusb/host/ehci/ehci.h
index 1736190b8..ed4e8b0ef 100644
--- a/tinyusb/host/ehci/ehci.h
+++ b/tinyusb/host/ehci/ehci.h
@@ -71,7 +71,7 @@
#define HOST_HCD_XFER_INTERRUPT // TODO interrupt is used widely, should always be enalbed
#define EHCI_PERIODIC_LIST (defined HOST_HCD_XFER_INTERRUPT || defined HOST_HCD_XFER_ISOCHRONOUS)
-// TODO allow user to configure
+// TODO merge OHCI with EHCI
#define EHCI_MAX_QHD 8
#define EHCI_MAX_QTD 20
#define EHCI_MAX_ITD 4
diff --git a/tinyusb/host/ohci/ohci.c b/tinyusb/host/ohci/ohci.c
new file mode 100644
index 000000000..61cc9e737
--- /dev/null
+++ b/tinyusb/host/ohci/ohci.c
@@ -0,0 +1,185 @@
+/**************************************************************************/
+/*!
+ @file ohci.c
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+#include "common/common.h"
+
+#if MODE_HOST_SUPPORTED && (TUSB_CFG_MCU == MCU_LPC175X_6X)
+//--------------------------------------------------------------------+
+// INCLUDE
+//--------------------------------------------------------------------+
+#include "hal/hal.h"
+#include "osal/osal.h"
+#include "common/timeout_timer.h"
+
+#include "../hcd.h"
+#include "../usbh_hcd.h"
+#include "ohci.h"
+
+//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF
+//--------------------------------------------------------------------+
+#define OHCI_REG ((ohci_registers_t *) LPC_USB_BASE)
+
+//--------------------------------------------------------------------+
+// INTERNAL OBJECT & FUNCTION DECLARATION
+//--------------------------------------------------------------------+
+ohci_data_t ohci_data TUSB_CFG_ATTR_USBRAM;
+
+//--------------------------------------------------------------------+
+// USBH-HCD API
+//--------------------------------------------------------------------+
+tusb_error_t hcd_init(void)
+{
+ //------------- Data Structure init -------------//
+ memclr_(&ohci_data, sizeof(ohci_data_t));
+
+
+
+ return TUSB_ERROR_NONE;
+}
+
+//--------------------------------------------------------------------+
+// PORT API
+//--------------------------------------------------------------------+
+void hcd_port_reset(uint8_t hostid)
+{
+ // TODO OHCI
+}
+
+bool hcd_port_connect_status(uint8_t hostid)
+{
+ // TODO OHCI
+}
+
+tusb_speed_t hcd_port_speed_get(uint8_t hostid)
+{
+ // TODO OHCI
+}
+
+// TODO refractor abtract later
+void hcd_port_unplug(uint8_t hostid)
+{
+ // TODO OHCI
+}
+
+//--------------------------------------------------------------------+
+// Controller API
+//--------------------------------------------------------------------+
+
+//--------------------------------------------------------------------+
+// CONTROL PIPE API
+//--------------------------------------------------------------------+
+tusb_error_t hcd_pipe_control_open(uint8_t dev_addr, uint8_t max_packet_size)
+{
+ // TODO OHCI return TUSB_ERROR_NONE;
+}
+
+tusb_error_t hcd_pipe_control_xfer(uint8_t dev_addr, tusb_control_request_t const * p_request, uint8_t data[])
+{
+ // TODO OHCI return TUSB_ERROR_NONE;
+}
+
+tusb_error_t hcd_pipe_control_close(uint8_t dev_addr)
+{
+ // TODO OHCI return TUSB_ERROR_NONE;
+}
+
+//--------------------------------------------------------------------+
+// BULK/INT/ISO PIPE API
+//--------------------------------------------------------------------+
+pipe_handle_t hcd_pipe_open(uint8_t dev_addr, tusb_descriptor_endpoint_t const * p_endpoint_desc, uint8_t class_code)
+{
+ // TODO OHCI return TUSB_ERROR_NONE;
+}
+
+tusb_error_t hcd_pipe_queue_xfer(pipe_handle_t pipe_hdl, uint8_t buffer[], uint16_t total_bytes)
+{
+ // TODO OHCI return TUSB_ERROR_NONE;
+}
+
+tusb_error_t hcd_pipe_xfer(pipe_handle_t pipe_hdl, uint8_t buffer[], uint16_t total_bytes, bool int_on_complete)
+{
+ // TODO OHCI return TUSB_ERROR_NONE;
+}
+
+/// pipe_close should only be called as a part of unmount/safe-remove process
+tusb_error_t hcd_pipe_close(pipe_handle_t pipe_hdl)
+{
+ // TODO OHCI return TUSB_ERROR_NONE;
+}
+
+bool hcd_pipe_is_busy(pipe_handle_t pipe_hdl)
+{
+ // TODO OHCI
+}
+
+bool hcd_pipe_is_error(pipe_handle_t pipe_hdl)
+{
+ // TODO OHCI
+}
+
+bool hcd_pipe_is_stalled(pipe_handle_t pipe_hdl)
+{
+ // TODO OHCI
+}
+
+uint8_t hcd_pipe_get_endpoint_addr(pipe_handle_t pipe_hdl)
+{
+ // TODO OHCI
+}
+
+tusb_error_t hcd_pipe_clear_stall(pipe_handle_t pipe_hdl)
+{
+ // TODO OHCI return TUSB_ERROR_NONE;
+}
+
+
+//--------------------------------------------------------------------+
+// OHCI Interrupt Handler
+//--------------------------------------------------------------------+
+void hcd_isr(uint8_t hostid)
+{
+
+}
+//--------------------------------------------------------------------+
+// HELPER
+//--------------------------------------------------------------------+
+
+
+#endif
+
diff --git a/tinyusb/host/ohci/ohci.h b/tinyusb/host/ohci/ohci.h
new file mode 100644
index 000000000..6d183191c
--- /dev/null
+++ b/tinyusb/host/ohci/ohci.h
@@ -0,0 +1,277 @@
+/**************************************************************************/
+/*!
+ @file ohci.h
+ @author hathach (tinyusb.org)
+
+ @section LICENSE
+
+ Software License Agreement (BSD License)
+
+ Copyright (c) 2013, hathach (tinyusb.org)
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the copyright holders nor the
+ names of its contributors may be used to endorse or promote products
+ derived from this software without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
+ EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
+ DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+ This file is part of the tinyusb stack.
+*/
+/**************************************************************************/
+
+/** \ingroup Port_HCD
+ * @{
+ * \defgroup OHCI
+ * \brief OHCI driver. All documents sources mentioned here (eg section 3.5) is referring to OHCI Specs unless state otherwise
+ * @{
+ */
+
+#ifndef _TUSB_OHCI_H_
+#define _TUSB_OHCI_H_
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+#include "common/common.h"
+
+//--------------------------------------------------------------------+
+// OHCI CONFIGURATION & CONSTANTS
+//--------------------------------------------------------------------+
+#define HOST_HCD_XFER_INTERRUPT // TODO interrupt is used widely, should always be enalbed
+#define OHCI_PERIODIC_LIST (defined HOST_HCD_XFER_INTERRUPT || defined HOST_HCD_XFER_ISOCHRONOUS)
+
+// TODO merge OHCI with EHCI
+#define OHCI_MAX_QHD 8
+#define OHCI_MAX_QTD 20
+#define OHCI_MAX_ITD 4
+
+//--------------------------------------------------------------------+
+// OHCI Data Structure
+//--------------------------------------------------------------------+
+typedef struct {
+ uint32_t interrupt_table[32];
+ volatile uint16_t frame_number;
+ volatile uint16_t frame_pad;
+ volatile uint32_t done_head;
+ uint8_t reserved[116]; // TODO try to make use of this area if possible
+}ohci_hcca_t; // ATTR_ALIGNED(256)
+
+typedef struct {
+ //------------- Word 0 -------------//
+ uint32_t : 18;
+ uint32_t buffer_rounding : 1;
+ uint32_t pid : 2;
+ uint32_t delay_interrupt : 3;
+ volatile uint32_t data_toggle : 2;
+ volatile uint32_t error_count : 2;
+ volatile uint32_t condition_code : 4;
+ /*---------- End Word 1 ----------*/
+
+ //------------- Word 1 -------------//
+ volatile uint8_t* current_buffer_pointer;
+
+ //------------- Word 2 -------------//
+ volatile uint32_t next_td;
+
+ //------------- Word 3 -------------//
+ uint8_t* buffer_end;
+} ATTR_ALIGNED(16) ohci_gtd_t;
+
+STATIC_ASSERT( sizeof(ohci_gtd_t) == 16, "size is not correct" );
+
+typedef struct {
+ //------------- Word 0 -------------//
+ uint32_t device_address : 7;
+ uint32_t endpoint_number : 4;
+ uint32_t direction : 2;
+ uint32_t speed : 1;
+ uint32_t skip : 1;
+ uint32_t is_iso : 1;
+ uint32_t max_package_size : 11;
+ uint32_t : 5;
+
+ //------------- Word 1 -------------//
+ uint32_t td_tail; // 4 lsb bits are free to use
+
+ //------------- Word 2 -------------//
+ volatile union{
+ uint32_t td_head;
+ struct {
+ uint32_t halted : 1;
+ uint32_t toggle : 1;
+ uint32_t : 30;
+ };
+ };
+
+ //------------- Word 3 -------------//
+ uint32_t next_ed; // 4 lsb bits are free to use
+} ATTR_ALIGNED(16) ohci_ed_t;
+
+STATIC_ASSERT( sizeof(ohci_ed_t) == 16, "size is not correct" );
+
+typedef struct {
+ /*---------- Word 1 ----------*/
+ uint32_t starting_frame : 16;
+ uint32_t : 5; // can be used
+ uint32_t delay_interrupt : 3;
+ uint32_t frame_count : 3;
+ uint32_t : 1; // can be used
+ volatile uint32_t condition_code : 4;
+ /*---------- End Word 1 ----------*/
+
+ /*---------- Word 2 ----------*/
+ uint32_t buffer_page0; // 12 lsb bits can be used
+
+ /*---------- Word 3 ----------*/
+ volatile uint32_t next_td;
+
+ /*---------- Word 4 ----------*/
+ uint32_t buffer_end;
+
+ /*---------- Word 5-8 ----------*/
+ volatile uint16_t offset_packetstatus[8];
+} ATTR_ALIGNED(32) ochi_itd_t;
+
+STATIC_ASSERT( sizeof(ochi_itd_t) == 32, "size is not correct" );
+
+// structure with member alignment required from large to small
+typedef struct {
+ ohci_hcca_t hcca;
+// ochi_itd_t itd[OHCI_MAX_ITD];
+
+ // control endpoints has reserved
+ struct {
+ ohci_ed_t ed;
+ ohci_gtd_t gtd[3]; // setup, data, status
+ }control[TUSB_CFG_HOST_DEVICE_MAX+1];
+
+ ohci_ed_t ed[OHCI_MAX_QHD];
+ ohci_gtd_t gtd[OHCI_MAX_QTD];
+
+}ATTR_ALIGNED(256) ohci_data_t;
+
+//--------------------------------------------------------------------+
+// OHCI Operational Register
+//--------------------------------------------------------------------+
+
+
+//--------------------------------------------------------------------+
+// OHCI Data Organization
+//--------------------------------------------------------------------+
+typedef volatile struct
+{
+ uint32_t revision;
+
+ union {
+ uint32_t control;
+ struct {
+ uint32_t control_bulk_service_ratio : 2;
+ uint32_t periodic_list_enable : 1;
+ uint32_t isochronous_enable : 1;
+ uint32_t control_list_enable : 1;
+ uint32_t bulk_list_enable : 1;
+ uint32_t hc_functional_state : 2;
+ uint32_t interrupt_routing : 1;
+ uint32_t remote_wakeup_connected : 1;
+ uint32_t remote_wakeup_enale : 1;
+ uint32_t : 0;
+ }control_bit;
+ };
+
+ union {
+ uint32_t command_status;
+ struct {
+ uint32_t controller_reset : 1;
+ uint32_t control_list_filled : 1;
+ uint32_t bulk_list_filled : 1;
+ uint32_t ownership_change_request : 1;
+ uint32_t : 12;
+ uint32_t scheduling_overrun_count : 2;
+ }command_status_bit;
+ };
+
+ uint32_t interrupt_status;
+ uint32_t interrupt_enable;
+ uint32_t interrupt_disable;
+
+ uint32_t hcca;
+ uint32_t period_current_ed;
+ uint32_t control_head_ed;
+ uint32_t control_current_ed;
+ uint32_t bulk_head_ed;
+ uint32_t bulk_current_ed;
+ uint32_t done_head;
+
+ uint32_t frame_interval;
+ uint32_t frame_remaining;
+ uint32_t frame_number;
+ uint32_t periodic_start;
+ uint32_t lowspeed_threshold;
+
+ uint32_t rh_descriptorA;
+ uint32_t rh_descriptorB;
+
+ union {
+ uint32_t rh_status;
+ struct {
+ uint32_t local_power_status : 1; // read Local Power Status; write: Clear Global Power
+ uint32_t over_current_indicator : 1;
+ uint32_t : 13;
+ uint32_t device_remote_wakeup_enable : 1;
+ uint32_t local_power_status_change : 1;
+ uint32_t over_current_indicator_change : 1;
+ uint32_t : 13;
+ uint32_t clear_remote_wakeup_enable : 1;
+ }rh_status_bit;
+ };
+
+ union {
+ uint32_t rhport_status[2]; // TODO NXP OHCI controller only has 2 ports
+ struct {
+ uint32_t current_connect_status : 1;
+ uint32_t port_enable_status : 1;
+ uint32_t port_suspend_status : 1;
+ uint32_t port_over_current_indicator : 1;
+ uint32_t port_reset_status : 1;
+ uint32_t : 3;
+ uint32_t port_power_status : 1;
+ uint32_t low_speed_device_attached : 1;
+ uint32_t : 6;
+ uint32_t connect_status_change : 1;
+ uint32_t port_enable_status_change : 1;
+ uint32_t port_suspend_status_change : 1;
+ uint32_t port_over_current_indicator_change : 1;
+ uint32_t port_reset_status_change : 1;
+ uint32_t : 0;
+ }rhport_status_bit[2];
+ };
+}ohci_registers_t;
+
+STATIC_ASSERT( sizeof(ohci_registers_t) == 0x5c, "size is not correct");
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_OHCI_H_ */
+
+/** @} */
+/** @} */