diff options
| author | hathach <[email protected]> | 2013-03-22 17:08:51 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2013-03-22 17:08:51 +0700 |
| commit | dbaf6c0d30657ec1659ddb13269edc4ae28b7bc2 (patch) | |
| tree | 59685ec0d0e0eea4b29cbff5d308e1befe4a8dd6 /tinyusb | |
| parent | cd2915e78cdd261713f1b0aa4ebe0441f99f9456 (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.h | 10 | ||||
| -rw-r--r-- | tinyusb/common/common.h | 6 | ||||
| -rw-r--r-- | tinyusb/common/errors.h | 1 | ||||
| -rw-r--r-- | tinyusb/hal/hal.h | 22 | ||||
| -rw-r--r-- | tinyusb/host/ehci/ehci.c | 7 | ||||
| -rw-r--r-- | tinyusb/host/usbh.c | 29 |
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] ); } |
