diff --git a/demos/bsp/boards/embedded_artists/board_ea4357.h b/demos/bsp/boards/embedded_artists/board_ea4357.h
index 138e6e199..2a6ef8490 100644
--- a/demos/bsp/boards/embedded_artists/board_ea4357.h
+++ b/demos/bsp/boards/embedded_artists/board_ea4357.h
@@ -66,8 +66,8 @@
#include "oem_base_board/pca9532.h" // LEDs
-#define CFG_PRINTF_TARGET PRINTF_TARGET_SWO
-//#define CFG_PRINTF_TARGET PRINTF_TARGET_UART
+//#define CFG_PRINTF_TARGET PRINTF_TARGET_SWO
+#define CFG_PRINTF_TARGET PRINTF_TARGET_UART // FIXME keil's cmsis rtx does not work with UART (work with SWO)
/*=========================================================================
HARDWARE MAC ADDRESS
diff --git a/demos/bsp/lpc43xx/CMSIS_LPC43xx_DriverLib/inc/LPC43xx.h b/demos/bsp/lpc43xx/CMSIS_LPC43xx_DriverLib/inc/LPC43xx.h
index 88872efab..860d7cba0 100644
--- a/demos/bsp/lpc43xx/CMSIS_LPC43xx_DriverLib/inc/LPC43xx.h
+++ b/demos/bsp/lpc43xx/CMSIS_LPC43xx_DriverLib/inc/LPC43xx.h
@@ -49,6 +49,7 @@ extern "C" {
#elif defined(__GNUC__)
/* anonymous unions are enabled by default */
#elif defined(__IAR_SYSTEMS_ICC__)
+ #pragma diag_suppress=Pe161 // suppress unknow pragma
#pragma push
#pragma language=extended
#else
diff --git a/demos/host/host_cmsis_rtx/host_cmsis_rtx.uvopt b/demos/host/host_cmsis_rtx/host_cmsis_rtx.uvopt
index 6d3c1ab8f..4ee637487 100644
--- a/demos/host/host_cmsis_rtx/host_cmsis_rtx.uvopt
+++ b/demos/host/host_cmsis_rtx/host_cmsis_rtx.uvopt
@@ -529,7 +529,7 @@
0
0
0
- 40
+ 41
56
0
..\..\bsp\boards\embedded_artists\board_ea4357.c
@@ -681,7 +681,7 @@
0
30
0
- 27
+ 28
39
0
..\..\..\tinyusb\tusb.c
@@ -745,7 +745,7 @@
0
38
0
- 357
+ 358
364
0
..\..\..\tinyusb\host\usbh.c
@@ -761,7 +761,7 @@
0
18
0
- 584
+ 589
606
0
..\..\..\tinyusb\host\ehci\ehci.c
@@ -993,7 +993,7 @@
0
0
0
- 390
+ 391
406
0
..\..\bsp\lpc43xx\CMSIS_LPC43xx_DriverLib\src\lpc43xx_cgu.c
@@ -1009,7 +1009,7 @@
0
44
0
- 47
+ 48
60
0
..\..\bsp\lpc43xx\CMSIS_LPC43xx_DriverLib\src\system_LPC43xx.c
@@ -1049,7 +1049,7 @@
0
0
0
- 137
+ 138
151
0
..\..\bsp\lpc43xx\startup_keil\startup_LPC43xx.s
@@ -1071,10 +1071,10 @@
1
0
0
- 0
+ 13
0
- 202
- 204
+ 203
+ 215
0
..\..\..\vendor\cmsis_rtos_rtx\RTX_Conf_CM.c
RTX_Conf_CM.c
diff --git a/demos/host/host_os_none/host_os_none.ewp b/demos/host/host_os_none/host_os_none.ewp
index 8176206fd..31e345cc5 100644
--- a/demos/host/host_os_none/host_os_none.ewp
+++ b/demos/host/host_os_none/host_os_none.ewp
@@ -938,6 +938,9 @@
$PROJ_DIR$\..\src\mouse_app.c
+
+ $PROJ_DIR$\..\src\msc_app.c
+
$PROJ_DIR$\..\src\rndis_app.c
@@ -1003,6 +1006,9 @@
$PROJ_DIR$\..\..\..\tinyusb\class\hid_host.c
+
+ $PROJ_DIR$\..\..\..\tinyusb\class\msc_host.c
+
common
diff --git a/demos/host/src/main.c b/demos/host/src/main.c
index 66df55d7a..6ec9fd795 100644
--- a/demos/host/src/main.c
+++ b/demos/host/src/main.c
@@ -52,6 +52,7 @@
#include "mouse_app.h"
#include "keyboard_app.h"
+#include "msc_app.h"
#include "cdc_serial_app.h"
#include "rndis_app.h"
diff --git a/demos/host/src/msc_app.h b/demos/host/src/msc_app.h
new file mode 100644
index 000000000..dc56bbdd8
--- /dev/null
+++ b/demos/host/src/msc_app.h
@@ -0,0 +1,71 @@
+/**************************************************************************/
+/*!
+ @file msc_app.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 TBD
+ * \defgroup TBD
+ * \brief TBD
+ *
+ * @{
+ */
+
+#ifndef _TUSB_MSC_APP_H_
+#define _TUSB_MSC_APP_H_
+
+#include
+#include
+
+#include "boards/board.h"
+#include "tusb.h"
+
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+
+void msc_app_init(void);
+OSAL_TASK_FUNCTION( msc_app_task ) (void* p_task_para);
+
+
+#ifdef __cplusplus
+ }
+#endif
+
+#endif /* _TUSB_MSC_APP_H_ */
+
+/** @} */
diff --git a/tests/lpc18xx_43xx/test/host/usbh/test_enum_task.c b/tests/lpc18xx_43xx/test/host/usbh/test_enum_task.c
index c7f604d39..b036084d3 100644
--- a/tests/lpc18xx_43xx/test/host/usbh/test_enum_task.c
+++ b/tests/lpc18xx_43xx/test/host/usbh/test_enum_task.c
@@ -159,6 +159,13 @@ tusb_error_t control_xfer_stub(uint8_t dev_addr, const tusb_control_request_t *
memcpy(data, &desc_configuration, p_request->wLength);
break;
+ case 5: // set configure
+ TEST_ASSERT_EQUAL(TUSB_REQUEST_SET_CONFIGURATION, p_request->bRequest);
+ TEST_ASSERT_EQUAL(1, p_request->wValue);
+ TEST_ASSERT_EQUAL(0, p_request->wIndex);
+ TEST_ASSERT_EQUAL(0, p_request->wLength);
+ break;
+
default:
return TUSB_ERROR_OSAL_TIMEOUT;
}
diff --git a/tinyusb/class/cdc_host.c b/tinyusb/class/cdc_host.c
index c90e84dbb..15a232184 100644
--- a/tinyusb/class/cdc_host.c
+++ b/tinyusb/class/cdc_host.c
@@ -224,10 +224,7 @@ tusb_error_t cdch_open_subtask(uint8_t dev_addr, tusb_descriptor_interface_t con
#endif
{
// FIXME mounted class flag is not set yet
- if (tusbh_cdc_mounted_cb)
- {
- tusbh_cdc_mounted_cb(dev_addr);
- }
+ tusbh_cdc_mounted_cb(dev_addr);
}
OSAL_SUBTASK_END
@@ -243,15 +240,12 @@ void cdch_isr(pipe_handle_t pipe_hdl, tusb_event_t event, uint32_t xferred_bytes
rndish_xfer_isr(p_cdc, pipe_hdl, event, xferred_bytes);
} else
#endif
- if (tusbh_cdc_xfer_isr)
- {
- tusbh_cdc_xfer_isr( pipe_hdl.dev_addr, event, get_app_pipeid(pipe_hdl), xferred_bytes );
- }
+
+ tusbh_cdc_xfer_isr( pipe_hdl.dev_addr, event, get_app_pipeid(pipe_hdl), xferred_bytes );
}
void cdch_close(uint8_t dev_addr)
{
- tusb_error_t err1, err2, err3;
cdch_data_t * p_cdc = &cdch_data[dev_addr-1];
#if TUSB_CFG_HOST_CDC_RNDIS
@@ -261,20 +255,9 @@ void cdch_close(uint8_t dev_addr)
}
#endif
- if ( pipehandle_is_valid(p_cdc->pipe_notification) )
- {
- err1 = hcd_pipe_close(p_cdc->pipe_notification);
- }
-
- if ( pipehandle_is_valid(p_cdc->pipe_in) )
- {
- err2 = hcd_pipe_close(p_cdc->pipe_in);
- }
-
- if ( pipehandle_is_valid(p_cdc->pipe_out) )
- {
- err3 = hcd_pipe_close(p_cdc->pipe_out);
- }
+ (void) hcd_pipe_close(p_cdc->pipe_notification);
+ (void) hcd_pipe_close(p_cdc->pipe_in);
+ (void) hcd_pipe_close(p_cdc->pipe_out);
#if TUSB_CFG_HOST_CDC_RNDIS
@@ -282,14 +265,7 @@ void cdch_close(uint8_t dev_addr)
memclr_(p_cdc, sizeof(cdch_data_t));
- if (tusbh_cdc_unmounted_isr)
- {
- tusbh_cdc_unmounted_isr(dev_addr);
- }
-
- ASSERT(err1 == TUSB_ERROR_NONE &&
- err2 == TUSB_ERROR_NONE &&
- err3 == TUSB_ERROR_NONE, VOID_RETURN );
+ tusbh_cdc_unmounted_isr(dev_addr);
}
diff --git a/tinyusb/class/hid_host.c b/tinyusb/class/hid_host.c
index de44bb416..9018c6123 100644
--- a/tinyusb/class/hid_host.c
+++ b/tinyusb/class/hid_host.c
@@ -244,10 +244,7 @@ tusb_error_t hidh_open_subtask(uint8_t dev_addr, tusb_descriptor_interface_t con
if ( HID_PROTOCOL_KEYBOARD == p_interface_desc->bInterfaceProtocol)
{
SUBTASK_ASSERT_STATUS ( hidh_interface_open(dev_addr, p_interface_desc->bInterfaceNumber, p_endpoint_desc, &keyboardh_data[dev_addr-1]) );
- if ( tusbh_hid_keyboard_mounted_cb )
- {
- tusbh_hid_keyboard_mounted_cb(dev_addr);
- }
+ tusbh_hid_keyboard_mounted_cb(dev_addr);
} else
#endif
@@ -255,10 +252,7 @@ tusb_error_t hidh_open_subtask(uint8_t dev_addr, tusb_descriptor_interface_t con
if ( HID_PROTOCOL_MOUSE == p_interface_desc->bInterfaceProtocol)
{
SUBTASK_ASSERT_STATUS ( hidh_interface_open(dev_addr, p_interface_desc->bInterfaceNumber, p_endpoint_desc, &mouseh_data[dev_addr-1]) );
- if (tusbh_hid_mouse_mounted_cb)
- {
- tusbh_hid_mouse_mounted_cb(dev_addr);
- }
+ tusbh_hid_mouse_mounted_cb(dev_addr);
} else
#endif
@@ -281,10 +275,7 @@ void hidh_isr(pipe_handle_t pipe_hdl, tusb_event_t event, uint32_t xferred_bytes
if ( pipehandle_is_equal(pipe_hdl, keyboardh_data[pipe_hdl.dev_addr-1].pipe_hdl) )
{
keyboardh_data[pipe_hdl.dev_addr-1].status = (event == TUSB_EVENT_XFER_COMPLETE) ? TUSB_INTERFACE_STATUS_COMPLETE : TUSB_INTERFACE_STATUS_ERROR;
- if (tusbh_hid_keyboard_isr)
- {
- tusbh_hid_keyboard_isr(pipe_hdl.dev_addr, event);
- }
+ tusbh_hid_keyboard_isr(pipe_hdl.dev_addr, event);
return;
}
#endif
@@ -293,11 +284,7 @@ void hidh_isr(pipe_handle_t pipe_hdl, tusb_event_t event, uint32_t xferred_bytes
if ( pipehandle_is_equal(pipe_hdl, mouseh_data[pipe_hdl.dev_addr-1].pipe_hdl) )
{
mouseh_data[pipe_hdl.dev_addr-1].status = (event == TUSB_EVENT_XFER_COMPLETE) ? TUSB_INTERFACE_STATUS_COMPLETE : TUSB_INTERFACE_STATUS_ERROR;
- if (tusbh_hid_mouse_isr)
- {
- tusbh_hid_mouse_isr(pipe_hdl.dev_addr, event);
- }
-
+ tusbh_hid_mouse_isr(pipe_hdl.dev_addr, event);
return;
}
#endif
diff --git a/tinyusb/class/msc_host.c b/tinyusb/class/msc_host.c
index 6dc2d0a65..f5c4dbd25 100644
--- a/tinyusb/class/msc_host.c
+++ b/tinyusb/class/msc_host.c
@@ -94,7 +94,7 @@ tusb_error_t msch_open_subtask(uint8_t dev_addr, tusb_descriptor_interface_t con
}
//------------- Open Data Pipe -------------//
- tusb_descriptor_endpoint_t const *p_endpoint = (tusb_descriptor_endpoint_t const *) descriptor_next( p_interface_desc );
+ tusb_descriptor_endpoint_t const *p_endpoint = (tusb_descriptor_endpoint_t const *) descriptor_next( (uint8_t const*) p_interface_desc );
for(uint32_t i=0; i<2; i++)
{
ASSERT_INT(TUSB_DESC_TYPE_ENDPOINT, p_endpoint->bDescriptorType, TUSB_ERROR_USBH_DESCRIPTOR_CORRUPTED);
@@ -105,7 +105,7 @@ tusb_error_t msch_open_subtask(uint8_t dev_addr, tusb_descriptor_interface_t con
(*p_pipe_hdl) = hcd_pipe_open(dev_addr, p_endpoint, TUSB_CLASS_MSC);
ASSERT ( pipehandle_is_valid(*p_pipe_hdl), TUSB_ERROR_HCD_OPEN_PIPE_FAILED );
- p_endpoint = (tusb_descriptor_endpoint_t const *) descriptor_next( p_endpoint );
+ p_endpoint = (tusb_descriptor_endpoint_t const *) descriptor_next( (uint8_t const*) p_endpoint );
}
msch_data[dev_addr-1].interface_number = p_interface_desc->bInterfaceNumber;
@@ -119,8 +119,7 @@ tusb_error_t msch_open_subtask(uint8_t dev_addr, tusb_descriptor_interface_t con
error
);
- SUBTASK_ASSERT( TUSB_ERROR_NONE != error /* && TODO STALL means zero */);
-
+ SUBTASK_ASSERT( TUSB_ERROR_NONE == error /* && TODO STALL means zero */);
msch_data[dev_addr-1].max_lun = msch_buffer[0];
//------------- SCSI Inquiry -------------//
@@ -133,7 +132,7 @@ tusb_error_t msch_open_subtask(uint8_t dev_addr, tusb_descriptor_interface_t con
return TUSB_ERROR_NONE;
}
-void msch_isr(pipe_handle_t pipe_hdl, tusb_event_t event)
+void msch_isr(pipe_handle_t pipe_hdl, tusb_event_t event, uint32_t xferred_bytes)
{
}
diff --git a/tinyusb/class/msc_host.h b/tinyusb/class/msc_host.h
index 8f90d8923..d6a976397 100644
--- a/tinyusb/class/msc_host.h
+++ b/tinyusb/class/msc_host.h
@@ -77,7 +77,7 @@ void tusbh_msc_mounted_cb(uint8_t dev_addr);
void msch_init(void);
tusb_error_t msch_open_subtask(uint8_t dev_addr, tusb_descriptor_interface_t const *p_interface_desc, uint16_t *p_length) ATTR_WARN_UNUSED_RESULT;
-void msch_isr(pipe_handle_t pipe_hdl, tusb_event_t event);
+void msch_isr(pipe_handle_t pipe_hdl, tusb_event_t event, uint32_t xferred_bytes);
void msch_close(uint8_t dev_addr);
#endif
diff --git a/tinyusb/host/ehci/ehci.c b/tinyusb/host/ehci/ehci.c
index 9ec9fc7a8..3a8562a36 100644
--- a/tinyusb/host/ehci/ehci.c
+++ b/tinyusb/host/ehci/ehci.c
@@ -689,7 +689,9 @@ void hcd_isr(uint8_t hostid)
{
ehci_registers_t* const regs = get_operational_register(hostid);
- uint32_t int_status = regs->usb_sts & regs->usb_int_enable;
+ uint32_t int_status = regs->usb_sts;
+ int_status &= regs->usb_int_enable;
+
regs->usb_sts |= int_status; // Acknowledge handled interrupt
if (int_status == 0)
diff --git a/tinyusb/host/usbh.c b/tinyusb/host/usbh.c
index dd930845e..67cc8f96c 100644
--- a/tinyusb/host/usbh.c
+++ b/tinyusb/host/usbh.c
@@ -206,9 +206,11 @@ tusb_error_t usbh_control_xfer_subtask(uint8_t dev_addr, uint8_t bmRequestType,
#ifndef _TEST_
usbh_devices[dev_addr].control.pipe_status = 0;
#else
- usbh_devices[dev_addr].control.pipe_status = TUSB_EVENT_XFER_COMPLETE; // in Test project, mark as complete to imm pass
+ usbh_devices[dev_addr].control.pipe_status = TUSB_EVENT_XFER_COMPLETE; // in Test project, mark as complete immediately
#endif
- /*SUBTASK_ASSERT_STATUS*/ (void) ( hcd_pipe_control_xfer(dev_addr, &usbh_devices[dev_addr].control.request, data) );
+
+ SUBTASK_ASSERT_STATUS_WITH_HANDLER( hcd_pipe_control_xfer(dev_addr, &usbh_devices[dev_addr].control.request, data),
+ osal_mutex_release(usbh_devices[dev_addr].control.mutex_hdl) );
osal_semaphore_wait(usbh_devices[dev_addr].control.sem_hdl, OSAL_TIMEOUT_NORMAL, &error); // careful of local variable without static
osal_mutex_release(usbh_devices[dev_addr].control.mutex_hdl);