From fdd98e2fa954af916b2b61b4852d21af11477cd0 Mon Sep 17 00:00:00 2001 From: hathach Date: Sun, 28 Apr 2013 00:00:48 +0700 Subject: [PATCH] clean up main --- demos/host/src/main.c | 84 ++++++++++++++++++++++---------- tests/test/host/usbh/test_usbh.c | 10 ---- tinyusb/host/ehci/ehci.c | 3 +- 3 files changed, 60 insertions(+), 37 deletions(-) diff --git a/demos/host/src/main.c b/demos/host/src/main.c index a88573fb..c4f318de 100644 --- a/demos/host/src/main.c +++ b/demos/host/src/main.c @@ -64,19 +64,38 @@ //--------------------------------------------------------------------+ // INTERNAL OBJECT & FUNCTION DECLARATION //--------------------------------------------------------------------+ -void print_greeting(void); - OSAL_TASK_FUNCTION( led_blinking_task ) (void* p_task_para); OSAL_TASK_DEF(led_blinking_task_def, "led blinking", led_blinking_task, 128, LED_BLINKING_APP_TASK_PRIO); +void print_greeting(void); +static inline void wait_blocking_ms(uint32_t ms); + //--------------------------------------------------------------------+ // IMPLEMENTATION //--------------------------------------------------------------------+ +#if TUSB_CFG_OS == TUSB_OS_NONE +// like a real RTOS, this function is a main loop invoking each task in application and never return +void os_none_start_scheduler(void) +{ + while (1) + { + tusb_task_runner(); + keyboard_app_task(NULL); + mouse_app_task(NULL); + led_blinking_task(NULL); + } +} +#endif + + int main(void) { board_init(); + // TODO blocking wait --> systick handler --> ...... freeRTOS hardfault + //wait_blocking_ms(1000); // wait a bit for power stable + // print_greeting(); TODO uart output before freeRTOS scheduler start will lead to hardfault // find a way to fix this as tusb_init can output to uart when an error occurred @@ -98,15 +117,7 @@ int main(void) vTaskStartScheduler(); #elif TUSB_CFG_OS == TUSB_OS_NONE - print_greeting(); - - while (1) - { - tusb_task_runner(); - keyboard_app_task(NULL); - mouse_app_task(NULL); - led_blinking_task(NULL); - } + os_none_start_scheduler(); #else #error need to start RTOS schduler #endif @@ -121,6 +132,33 @@ int main(void) return 0; } +//--------------------------------------------------------------------+ +// BLINKING TASK +//--------------------------------------------------------------------+ +OSAL_TASK_FUNCTION( led_blinking_task ) (void* p_task_para) +{ + // task init, only executed exactly one time, real RTOS does not need this but none OS does + { + static bool is_init = false; + if (!is_init) + { + is_init = true; + print_greeting(); + } + } + + static uint32_t led_on_mask = 0; + + OSAL_TASK_LOOP_BEGIN + + osal_task_delay(1000); + + board_leds(led_on_mask, 1 - led_on_mask); + led_on_mask = 1 - led_on_mask; // toggle + + OSAL_TASK_LOOP_END +} + //--------------------------------------------------------------------+ // HELPER FUNCTION //--------------------------------------------------------------------+ @@ -135,20 +173,14 @@ void print_greeting(void) ); } -OSAL_TASK_FUNCTION( led_blinking_task ) (void* p_task_para) +static inline void wait_blocking_us(volatile uint32_t us) { - static uint32_t led_on_mask = 0; - -#if TUSB_CFG_OS != TUSB_OS_NONE // TODO abstract to approriate place - print_greeting(); -#endif - - OSAL_TASK_LOOP_BEGIN - - osal_task_delay(1000); - - board_leds(led_on_mask, 1 - led_on_mask); - led_on_mask = 1 - led_on_mask; // toggle - - OSAL_TASK_LOOP_END + us *= (SystemCoreClock / 1000000) / 3; + while(us--); } + +static inline void wait_blocking_ms(uint32_t ms) +{ + wait_blocking_us(ms * 1000); +} + diff --git a/tests/test/host/usbh/test_usbh.c b/tests/test/host/usbh/test_usbh.c index 1058e54d..6ec0ffcf 100644 --- a/tests/test/host/usbh/test_usbh.c +++ b/tests/test/host/usbh/test_usbh.c @@ -111,16 +111,6 @@ void test_usbh_init_enum_queue_create_failed(void) TEST_ASSERT_EQUAL(TUSB_ERROR_OSAL_QUEUE_FAILED, usbh_init()); } -void test_usbh_init_reporter_taks_create_failed(void) -{ - TEST_IGNORE(); -} - -void test_usbh_init_reporter_queue_create_failed(void) -{ - TEST_IGNORE(); -} - void class_init_expect(void) { hidh_init_Expect(); diff --git a/tinyusb/host/ehci/ehci.c b/tinyusb/host/ehci/ehci.c index cef71313..3c2c83f2 100644 --- a/tinyusb/host/ehci/ehci.c +++ b/tinyusb/host/ehci/ehci.c @@ -482,7 +482,8 @@ void port_connect_status_change_isr(uint8_t hostid) { ehci_registers_t* const regs = get_operational_register(hostid); - if (regs->portsc_bit.current_connect_status) // device plugged + // NOTE There is an sequence plug->unplug->…..-> plug if device is powering with pre-plugged device + if (regs->portsc_bit.current_connect_status) { usbh_device_plugged_isr(hostid); }else // device unplugged