diff options
| author | hathach <[email protected]> | 2013-03-13 21:42:19 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2013-03-13 21:42:19 +0700 |
| commit | 9bc30f76947b15b442f6e0ec7919baa17aea5737 (patch) | |
| tree | f43d889a280da964c6620fb4b768e488e4a1bd70 /tests | |
| parent | dbd3d9618daa782f897aca15e404359f63067ad1 (diff) | |
add some test for usbh_hcd integration
- add tests for pipe_close (while TDs are active)
- add tests for device unplugged
add tesst & implement the async_advance_isr to clean up "REMOVING" queue head
- add helper find previous qhd
- add remove qhd from async list
- add is_removing field for async advance isr to clean up
add pipe close for control pipe & bulk pipe (with tests)
add helper get qhd from pipe_handle
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/test/host/ehci/test_ehci_isr.c | 43 | ||||
| -rw-r--r-- | tests/test/host/ehci/test_ehci_pipe_open.c | 43 | ||||
| -rw-r--r-- | tests/test/host/ehci/test_ehci_pipe_xfer_control.c | 1 | ||||
| -rw-r--r-- | tests/test/host/ehci/test_ehci_usbh_hcd_integration.c | 180 |
4 files changed, 226 insertions, 41 deletions
diff --git a/tests/test/host/ehci/test_ehci_isr.c b/tests/test/host/ehci/test_ehci_isr.c index f6b9a09e5..af3fc0589 100644 --- a/tests/test/host/ehci/test_ehci_isr.c +++ b/tests/test/host/ehci/test_ehci_isr.c @@ -50,15 +50,17 @@ usbh_device_info_t usbh_device_info_pool[TUSB_CFG_HOST_DEVICE_MAX+1]; uint8_t hostid; - +ehci_registers_t * regs; void setUp(void) { memclr_(&lpc_usb0, sizeof(LPC_USB0_Type)); memclr_(&lpc_usb1, sizeof(LPC_USB1_Type)); hostid = RANDOM(CONTROLLER_HOST_NUMBER) + TEST_CONTROLLER_HOST_START_INDEX; + regs = get_operational_register(hostid); hcd_init(); + regs->usb_sts = 0; // hcd_init clear usb_sts by writing 1s } void tearDown(void) @@ -103,44 +105,5 @@ void test_isr_device_disconnect(void) //------------- Code Under Test -------------// hcd_isr(hostid); - ehci_registers_t * const regs = get_operational_register(hostid); TEST_ASSERT(regs->usb_cmd_bit.advacne_async); } - -void test_isr_disconnect_then_async_advance(void) -{ - uint8_t dev_addr = 1; - uint8_t hostid = 0; - ehci_registers_t * const regs = get_operational_register(hostid); - -// usbh_device_info_pool[dev_addr].status = TUSB_DEVICE_STATUS_READY; - usbh_device_info_pool[dev_addr].core_id = hostid; - usbh_device_info_pool[dev_addr].hub_addr = 0; - usbh_device_info_pool[dev_addr].hub_port = 0; - - hcd_pipe_control_open(dev_addr, 64); - hcd_pipe_control_xfer(dev_addr, - &(tusb_std_request_t) { - .bmRequestType = { .direction = TUSB_DIR_HOST_TO_DEV, .type = TUSB_REQUEST_TYPE_STANDARD, .recipient = TUSB_REQUEST_RECIPIENT_DEVICE }, - .bRequest = TUSB_REQUEST_SET_ADDRESS, - .wValue = 3 }, - NULL); - - ehci_qhd_t *p_qhd = &ehci_data.device[dev_addr].control.qhd; - ehci_qtd_t *p_qtd_head = p_qhd->p_qtd_list_head; - ehci_qtd_t *p_qtd_tail = p_qhd->p_qtd_list_tail; - - ehci_controller_device_unplug(hostid); - usbh_device_unplugged_isr_Expect(hostid); - - //------------- Code Under Test -------------// - hcd_isr(hostid); // port change detect - regs->usb_sts_bit.port_change_detect = 0; // clear port change detect - hcd_isr(hostid); // async advance - - TEST_ASSERT( align32(get_async_head(hostid)->next.address) != (uint32_t) p_qhd ); - TEST_ASSERT_FALSE(p_qhd->used); - TEST_ASSERT_FALSE(p_qtd_head->used); - TEST_ASSERT_FALSE(p_qtd_tail->used); - -} diff --git a/tests/test/host/ehci/test_ehci_pipe_open.c b/tests/test/host/ehci/test_ehci_pipe_open.c index de80809a6..a097da367 100644 --- a/tests/test/host/ehci/test_ehci_pipe_open.c +++ b/tests/test/host/ehci/test_ehci_pipe_open.c @@ -109,6 +109,7 @@ void verify_open_qhd(ehci_qhd_t *p_qhd, uint8_t endpoint_addr, uint16_t max_pack //------------- HCD -------------// TEST_ASSERT(p_qhd->used); + TEST_ASSERT_FALSE(p_qhd->is_removing); TEST_ASSERT_NULL(p_qhd->p_qtd_list_head); TEST_ASSERT_NULL(p_qhd->p_qtd_list_tail); } @@ -179,6 +180,34 @@ void test_control_open_non_highspeed(void) TEST_ASSERT_TRUE(p_qhd->non_hs_control_endpoint); } +void test_control_addr0_close(void) +{ + ehci_qhd_t * const p_qhd = async_head; + dev_addr = 0; + hcd_pipe_control_open(dev_addr, control_max_packet_size); + + //------------- Code Under Test -------------// + hcd_pipe_control_close(dev_addr); + + TEST_ASSERT(p_qhd->head_list_flag); + TEST_ASSERT(p_qhd->is_removing); +} + +void test_control_close(void) +{ + ehci_qhd_t * const p_qhd = &ehci_data.device[dev_addr].control.qhd; + + hcd_pipe_control_open(dev_addr, control_max_packet_size); + + //------------- Code Under TEST -------------// + hcd_pipe_control_close(dev_addr); + TEST_ASSERT(p_qhd->is_removing); + TEST_ASSERT(p_qhd->used); + + TEST_ASSERT( align32(get_async_head(hostid)->next.address) != (uint32_t) p_qhd ); + TEST_ASSERT_EQUAL( get_async_head(hostid), align32(p_qhd->next.address)); +} + //--------------------------------------------------------------------+ // BULK PIPE //--------------------------------------------------------------------+ @@ -234,6 +263,20 @@ void test_open_bulk_qhd_data(void) TEST_ASSERT_EQUAL(EHCI_QUEUE_ELEMENT_QHD, async_head->next.type); } +void test_bulk_close(void) +{ + tusb_descriptor_endpoint_t const * desc_endpoint = &desc_ept_bulk_in; + pipe_handle_t pipe_hdl = hcd_pipe_open(dev_addr, desc_endpoint, TUSB_CLASS_MSC); + ehci_qhd_t *p_qhd = &ehci_data.device[ pipe_hdl.dev_addr ].qhd[ pipe_hdl.index ]; + + //------------- Code Under TEST -------------// + hcd_pipe_close(pipe_hdl); + + TEST_ASSERT(p_qhd->is_removing); + TEST_ASSERT( align32(get_async_head(hostid)->next.address) != (uint32_t) p_qhd ); + TEST_ASSERT_EQUAL_HEX( (uint32_t) get_async_head(hostid), align32(p_qhd->next.address ) ); +} + //--------------------------------------------------------------------+ // INTERRUPT PIPE //--------------------------------------------------------------------+ diff --git a/tests/test/host/ehci/test_ehci_pipe_xfer_control.c b/tests/test/host/ehci/test_ehci_pipe_xfer_control.c index b264994f4..4a3649a8a 100644 --- a/tests/test/host/ehci/test_ehci_pipe_xfer_control.c +++ b/tests/test/host/ehci/test_ehci_pipe_xfer_control.c @@ -244,7 +244,6 @@ void test_control_xfer_isr(void) usbh_isr_Expect(((pipe_handle_t){.dev_addr = dev_addr}), 0); //------------- Code Under TEST -------------// - printf("control head = %x\n", p_qhd); hcd_isr(hostid); TEST_ASSERT_NULL(p_qhd->p_qtd_list_head); diff --git a/tests/test/host/ehci/test_ehci_usbh_hcd_integration.c b/tests/test/host/ehci/test_ehci_usbh_hcd_integration.c new file mode 100644 index 000000000..edde08cbf --- /dev/null +++ b/tests/test/host/ehci/test_ehci_usbh_hcd_integration.c @@ -0,0 +1,180 @@ +/* + * test_usbh_hcd_integration.c + * + * Created on: Mar 13, 2013 + * Author: hathach + */ + +/* + * Software License Agreement (BSD License) + * Copyright (c) 2012, hathach (tinyusb.net) + * 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. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 tiny usb stack. + */ + +#include "unity.h" +#include "tusb_option.h" +#include "errors.h" +#include "binary.h" + +#include "hal.h" +#include "mock_osal.h" +#include "hcd.h" +#include "usbh_hcd.h" +#include "usbh.h" +#include "ehci.h" +#include "ehci_controller.h" + +#define _TINY_USB_SOURCE_FILE_ +usbh_device_info_t usbh_device_info_pool[TUSB_CFG_HOST_DEVICE_MAX+1]; +uint8_t const control_max_packet_size = 64; +uint8_t hub_addr; +uint8_t hub_port; +uint8_t dev_addr; +uint8_t hostid; +ehci_registers_t * regs; +ehci_qhd_t *async_head; +ehci_qhd_t *period_head; + +void setUp(void) +{ + memclr_(&lpc_usb0, sizeof(LPC_USB0_Type)); + memclr_(&lpc_usb1, sizeof(LPC_USB1_Type)); + memclr_(usbh_device_info_pool, sizeof(usbh_device_info_t)*(TUSB_CFG_HOST_DEVICE_MAX+1)); + + hub_addr = hub_port = 0; + dev_addr = 1; + + hostid = RANDOM(CONTROLLER_HOST_NUMBER) + TEST_CONTROLLER_HOST_START_INDEX; + + hcd_init(); + + for (uint8_t i=0; i<TUSB_CFG_HOST_DEVICE_MAX; i++) + { + usbh_device_info_pool[i].core_id = hostid; + usbh_device_info_pool[i].hub_addr = hub_addr; + usbh_device_info_pool[i].hub_port = hub_port; + usbh_device_info_pool[i].speed = TUSB_SPEED_HIGH; + } + + regs = get_operational_register(hostid); + async_head = get_async_head( hostid ); + period_head = get_period_head( hostid ); + regs->usb_sts = 0; // hcd_init clear usb_sts by writing 1s +} + +void tearDown(void) +{ +} + +void test_addr0_control_close(void) +{ + dev_addr = 0; + + hcd_pipe_control_open(dev_addr, 64); + hcd_pipe_control_xfer(dev_addr, + &(tusb_std_request_t) { + .bmRequestType = { .direction = TUSB_DIR_HOST_TO_DEV, .type = TUSB_REQUEST_TYPE_STANDARD, .recipient = TUSB_REQUEST_RECIPIENT_DEVICE }, + .bRequest = TUSB_REQUEST_SET_ADDRESS, + .wValue = 3 }, + NULL); + + ehci_qhd_t *p_qhd = async_head; + hcd_pipe_control_close(dev_addr); + + //------------- Code Under Test -------------// + regs->usb_sts_bit.port_change_detect = 0; // clear port change detect + regs->usb_sts_bit.async_advance = 1; + hcd_isr(hostid); // async advance + + TEST_ASSERT( p_qhd->qtd_overlay.halted ); + TEST_ASSERT_FALSE( p_qhd->is_removing ); + TEST_ASSERT_NULL( p_qhd->p_qtd_list_head ); + TEST_ASSERT_NULL( p_qhd->p_qtd_list_tail ); +} + +void test_isr_disconnect_then_async_advance_control_pipe(void) +{ + hcd_pipe_control_open(dev_addr, 64); + hcd_pipe_control_xfer(dev_addr, + &(tusb_std_request_t) { + .bmRequestType = { .direction = TUSB_DIR_HOST_TO_DEV, .type = TUSB_REQUEST_TYPE_STANDARD, .recipient = TUSB_REQUEST_RECIPIENT_DEVICE }, + .bRequest = TUSB_REQUEST_SET_ADDRESS, + .wValue = 3 }, + NULL); + + ehci_qhd_t *p_qhd = &ehci_data.device[dev_addr].control.qhd; + ehci_qtd_t *p_qtd_head = p_qhd->p_qtd_list_head; + ehci_qtd_t *p_qtd_tail = p_qhd->p_qtd_list_tail; + + ehci_controller_device_unplug(hostid); + + //------------- Code Under Test -------------// + hcd_isr(hostid); // port change detect + regs->usb_sts_bit.port_change_detect = 0; // clear port change detect + regs->usb_sts_bit.async_advance = 1; + hcd_isr(hostid); // async advance + + TEST_ASSERT_FALSE(p_qhd->used); + TEST_ASSERT_FALSE(p_qhd->is_removing); + TEST_ASSERT_NULL(p_qhd->p_qtd_list_head); + TEST_ASSERT_NULL(p_qhd->p_qtd_list_tail); +} + +void test_bulk_pipe_close(void) +{ + tusb_descriptor_endpoint_t const desc_ept_bulk_in = + { + .bLength = sizeof(tusb_descriptor_endpoint_t), + .bDescriptorType = TUSB_DESC_ENDPOINT, + .bEndpointAddress = 0x81, + .bmAttributes = { .xfer = TUSB_XFER_BULK }, + .wMaxPacketSize = 512, + .bInterval = 0 + }; + + uint8_t xfer_data[100]; + pipe_handle_t pipe_hdl = hcd_pipe_open(dev_addr, &desc_ept_bulk_in, TUSB_CLASS_MSC); + hcd_pipe_xfer(pipe_hdl, xfer_data, sizeof(xfer_data), 100); + hcd_pipe_xfer(pipe_hdl, xfer_data, sizeof(xfer_data), 50); + + ehci_qhd_t *p_qhd = &ehci_data.device[dev_addr].qhd[pipe_hdl.index]; + ehci_qtd_t *p_qtd_head = p_qhd->p_qtd_list_head; + ehci_qtd_t *p_qtd_tail = p_qhd->p_qtd_list_tail; + + hcd_pipe_close(pipe_hdl); + + //------------- Code Under Test -------------// + regs->usb_sts_bit.async_advance = 1; + hcd_isr(hostid); // async advance + + TEST_ASSERT_FALSE(p_qhd->used); + TEST_ASSERT_FALSE(p_qhd->is_removing); + TEST_ASSERT_NULL(p_qhd->p_qtd_list_head); + TEST_ASSERT_NULL(p_qhd->p_qtd_list_tail); + TEST_ASSERT_FALSE(p_qtd_head->used); + TEST_ASSERT_FALSE(p_qtd_tail->used); +} |
