summaryrefslogtreecommitdiff
path: root/tinyusb
diff options
context:
space:
mode:
authorhathach <[email protected]>2013-03-06 15:39:37 +0700
committerhathach <[email protected]>2013-03-06 15:39:37 +0700
commitf38fed3529c66379903059d350d231f5d4947736 (patch)
treedb2a05b3a605f6836ec59f9fab44a459098dc4d3 /tinyusb
parent685fb970860868053a7cccf194c77053c7ddf575 (diff)
pass test for setup TD
Diffstat (limited to 'tinyusb')
-rw-r--r--tinyusb/host/ehci/ehci.c29
1 files changed, 28 insertions, 1 deletions
diff --git a/tinyusb/host/ehci/ehci.c b/tinyusb/host/ehci/ehci.c
index 2cc43774e..913c43a77 100644
--- a/tinyusb/host/ehci/ehci.c
+++ b/tinyusb/host/ehci/ehci.c
@@ -248,6 +248,7 @@ tusb_error_t hcd_controller_reset(uint8_t hostid)
static void queue_head_init(ehci_qhd_t *p_qhd, uint8_t dev_addr, uint16_t max_packet_size, uint8_t endpoint_addr, uint8_t xfer_type);
static inline ehci_qhd_t* const get_control_qhd(uint8_t dev_addr) ATTR_ALWAYS_INLINE ATTR_PURE ATTR_WARN_UNUSED_RESULT;
static inline ehci_qtd_t* get_control_qtds(uint8_t dev_addr) ATTR_ALWAYS_INLINE ATTR_PURE ATTR_WARN_UNUSED_RESULT;
+static inline tusb_std_request_t* const get_control_request_ptr(uint8_t dev_addr) ATTR_ALWAYS_INLINE ATTR_PURE ATTR_WARN_UNUSED_RESULT;
tusb_error_t hcd_pipe_control_open(uint8_t dev_addr, uint8_t max_packet_size)
{
@@ -308,8 +309,17 @@ tusb_error_t hcd_pipe_control_xfer(uint8_t dev_addr, tusb_std_request_t const *
ehci_qtd_t *p_data = p_setup + 1;
ehci_qtd_t *p_status = p_setup + 2;
- p_qhd->p_qtd_list = p_setup;
+ memclr_(p_setup, sizeof(ehci_qtd_t));
p_setup->next.address = (uint32_t) p_data;
+ p_setup->active = 1;
+ p_setup->cerr = 3; // TODO 3 consecutive errors tolerance
+ p_setup->data_toggle = 0;
+ p_setup->total_bytes = 8; // sizeof (tusb_std_request_t)
+
+ p_setup->buffer[0] = (uint32_t) get_control_request_ptr(dev_addr);
+ *(get_control_request_ptr(dev_addr)) = *p_request;
+
+ p_setup->pid = EHCI_PID_SETUP;
if (p_request->wLength > 0)
{
@@ -318,9 +328,19 @@ tusb_error_t hcd_pipe_control_xfer(uint8_t dev_addr, tusb_std_request_t const *
{
p_data = p_setup;
}
+
p_data->next.address = (uint32_t) p_status;
+
p_status->next.terminate = 1;
+ //------------- alternate link is not used -------------//
+ p_data->alternate.terminate = 1;
+ p_setup->alternate.terminate = 1;
+ p_data->alternate.terminate = 1;
+
+ //------------- hook TD List to Queue Head -------------//
+ p_qhd->p_qtd_list = p_setup;
+ p_qhd->qtd_overlay.next.address = (uint32_t) p_setup;
return TUSB_ERROR_NONE;
}
@@ -342,6 +362,13 @@ static inline ehci_qtd_t* get_control_qtds(uint8_t dev_addr)
}
+static inline tusb_std_request_t* const get_control_request_ptr(uint8_t dev_addr)
+{
+ return (dev_addr == 0) ?
+ &ehci_data.addr0.request :
+ &ehci_data.device[ dev_addr ].control.request;
+}
+
static void queue_head_init(ehci_qhd_t *p_qhd, uint8_t dev_addr, uint16_t max_packet_size, uint8_t endpoint_addr, uint8_t xfer_type)
{
p_qhd->device_address = dev_addr;