summaryrefslogtreecommitdiff
path: root/tinyusb
diff options
context:
space:
mode:
authorhathach <[email protected]>2013-03-22 17:08:51 +0700
committerhathach <[email protected]>2013-03-22 17:08:51 +0700
commitdbaf6c0d30657ec1659ddb13269edc4ae28b7bc2 (patch)
tree59685ec0d0e0eea4b29cbff5d308e1befe4a8dd6 /tinyusb
parentcd2915e78cdd261713f1b0aa4ebe0441f99f9456 (diff)
- fix bug when unplugged unmounted-already device (mostly plugged when power on)
- add hal_debugger_is_attached & hal_debugger_breakpoint - assert will suspend (place breakpoint) if the condition is failed and debugger is attached. Otherwise, a message to uart is printed - fix get control qhd function when dev_addr is not zero (shifted 1) - fix wrong logic for unsupported class
Diffstat (limited to 'tinyusb')
-rw-r--r--tinyusb/common/assertion.h10
-rw-r--r--tinyusb/common/common.h6
-rw-r--r--tinyusb/common/errors.h1
-rw-r--r--tinyusb/hal/hal.h22
-rw-r--r--tinyusb/host/ehci/ehci.c7
-rw-r--r--tinyusb/host/usbh.c29
6 files changed, 48 insertions, 27 deletions
diff --git a/tinyusb/common/assertion.h b/tinyusb/common/assertion.h
index 4082f4b59..6ac46086c 100644
--- a/tinyusb/common/assertion.h
+++ b/tinyusb/common/assertion.h
@@ -57,6 +57,7 @@ extern "C"
#endif
#include "tusb_option.h"
+#include "hal/hal.h"
//--------------------------------------------------------------------+
// Compile-time Assert
@@ -92,7 +93,8 @@ extern "C"
#endif
#ifndef _TEST_ASSERT_
- #define ASSERT_ERROR_HANDLER(x, para) return (x)
+ #define ASSERT_ERROR_HANDLER(x, para) \
+ return (x)
#else
#define ASSERT_ERROR_HANDLER(x, para) Throw(x)
#endif
@@ -101,7 +103,11 @@ extern "C"
do{\
setup_statement;\
if (!(condition)) {\
- ASSERT_MESSAGE(format, __VA_ARGS__);\
+ if (hal_debugger_is_attached()){\
+ hal_debugger_breakpoint();\
+ }else{\
+ ASSERT_MESSAGE(format, __VA_ARGS__);\
+ }\
error_handler(error, handler_para);\
}\
}while(0)
diff --git a/tinyusb/common/common.h b/tinyusb/common/common.h
index a433fef06..323ff8ee8 100644
--- a/tinyusb/common/common.h
+++ b/tinyusb/common/common.h
@@ -83,12 +83,6 @@
//--------------------------------------------------------------------+
// MACROS
//--------------------------------------------------------------------+
-#ifndef _TEST_
- #define ASM_BREAKPOINT __asm("BKPT #0\n") // Place breakpoint to stop the debugger at desire
-#else
- #define ASM_BREAKPOINT
-#endif
-
#define STRING_(x) #x // stringify without expand
#define XSTRING_(x) STRING_(x) // expand then stringify
#define STRING_CONCAT_(a, b) a##b // concat without expand
diff --git a/tinyusb/common/errors.h b/tinyusb/common/errors.h
index 81bb5cce6..826e8dd44 100644
--- a/tinyusb/common/errors.h
+++ b/tinyusb/common/errors.h
@@ -49,6 +49,7 @@
#ifndef _TUSB_ERRORS_H_
#define _TUSB_ERRORS_H_
+#include "primitive_types.h"
#include "tusb_option.h"
#ifdef __cplusplus
diff --git a/tinyusb/hal/hal.h b/tinyusb/hal/hal.h
index ad77055eb..941063665 100644
--- a/tinyusb/hal/hal.h
+++ b/tinyusb/hal/hal.h
@@ -52,6 +52,7 @@
#define _TUSB_HAL_H_
#include "tusb_option.h"
+#include "common/errors.h"
#include "common/compiler/compiler.h"
#if MCU == 0
@@ -91,6 +92,27 @@ static inline void hal_interrupt_enable() ATTR_ALWAYS_INLINE;
*/
static inline void hal_interrupt_disable() ATTR_ALWAYS_INLINE;
+static inline bool hal_debugger_is_attached() ATTR_PURE ATTR_ALWAYS_INLINE;
+static inline bool hal_debugger_is_attached()
+{
+#ifndef _TEST_
+ return (CoreDebug->DHCSR & CoreDebug_DHCSR_C_DEBUGEN_Msk) == CoreDebug_DHCSR_C_DEBUGEN_Msk;
+#else
+ return false;
+#endif
+}
+
+static inline void hal_debugger_breakpoint() ATTR_ALWAYS_INLINE;
+static inline void hal_debugger_breakpoint()
+{
+#ifndef _TEST_
+ if (hal_debugger_is_attached()) /* if there is debugger connected */
+ {
+ __asm("BKPT #0\n");
+ }
+#endif
+}
+
#ifdef __cplusplus
}
#endif
diff --git a/tinyusb/host/ehci/ehci.c b/tinyusb/host/ehci/ehci.c
index 0aaa4e9c5..92c439ff8 100644
--- a/tinyusb/host/ehci/ehci.c
+++ b/tinyusb/host/ehci/ehci.c
@@ -221,10 +221,7 @@ void port_connect_status_change_isr(uint8_t hostid)
usbh_device_plugged_isr(hostid, regs->portsc_bit.nxp_port_speed); // NXP specific port speed
}else // device unplugged
{
- printf("%s %d\n", __FUNCTION__, __LINE__);
-
usbh_device_unplugged_isr(hostid);
-
regs->usb_cmd_bit.advacne_async = 1; // Async doorbell check EHCI 4.8.2 for operational details
}
@@ -280,7 +277,7 @@ void hcd_isr(uint8_t hostid)
{
// TODO handle Queue Head halted
// TODO invoke some error callback if not async head
- ASM_BREAKPOINT;
+ hal_debugger_breakpoint();
}
//------------- some QTD/SITD/ITD with IOC set is completed -------------//
@@ -666,7 +663,7 @@ static inline ehci_qhd_t* get_control_qhd(uint8_t dev_addr)
{
return (dev_addr == 0) ?
get_async_head( usbh_device_info_pool[dev_addr].core_id ) :
- &ehci_data.device[dev_addr].control.qhd;
+ &ehci_data.device[dev_addr-1].control.qhd;
}
static inline ehci_qtd_t* get_control_qtds(uint8_t dev_addr)
{
diff --git a/tinyusb/host/usbh.c b/tinyusb/host/usbh.c
index b46be4388..a70ba28bd 100644
--- a/tinyusb/host/usbh.c
+++ b/tinyusb/host/usbh.c
@@ -201,13 +201,15 @@ void usbh_device_plugged_isr(uint8_t hostid, tusb_speed_t speed)
void usbh_device_unplugged_isr(uint8_t hostid)
{
- printf("%s %d\n", __FUNCTION__, __LINE__);
-
//------------- find the device address that is unplugged -------------//
uint8_t dev_addr=1;
- while ( dev_addr <= TUSB_CFG_HOST_DEVICE_MAX && ! (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))
+ while ( dev_addr <= TUSB_CFG_HOST_DEVICE_MAX &&
+ !(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 &&
+ usbh_device_info_pool[dev_addr].status != TUSB_DEVICE_STATUS_UNPLUG
+ )
+ )
{
dev_addr++;
}
@@ -370,20 +372,19 @@ OSAL_TASK_DECLARE(usbh_enumeration_task)
if (class_code == 0)
{
TASK_ASSERT( false ); // corrupted data, abort enumeration
- } else if ( class_code < TUSB_CLASS_MAX_CONSEC_NUMBER)
+ }
+ // supported class
+ else if ( class_code < TUSB_CLASS_MAX_CONSEC_NUMBER && usbh_class_drivers[class_code].open_subtask)
{
- if ( usbh_class_drivers[class_code].open_subtask )
- {
- uint16_t length;
- OSAL_SUBTASK_INVOKED_AND_WAIT ( // parameters in task/sub_task must be static storage (static or global)
- usbh_class_drivers[ ((tusb_descriptor_interface_t*) p_desc)->bInterfaceClass ].open_subtask(new_addr, p_desc, &length) );
- p_desc += length;
- }
+ uint16_t length;
+ OSAL_SUBTASK_INVOKED_AND_WAIT ( // parameters in task/sub_task must be static storage (static or global)
+ usbh_class_drivers[ ((tusb_descriptor_interface_t*) p_desc)->bInterfaceClass ].open_subtask(new_addr, p_desc, &length) );
+ p_desc += length;
} else // unsupported class (not enable or yet implemented)
{
do
{
- p_desc += (*p_desc);
+ p_desc += (*p_desc); // skip the descriptor, increase by the descriptor's length
} while ( (p_desc < enum_data_buffer + ((tusb_descriptor_configuration_t*)enum_data_buffer)->wTotalLength)
&& TUSB_DESC_INTERFACE != p_desc[1] );
}