diff options
| author | sakumisu <[email protected]> | 2023-11-20 22:09:31 +0800 |
|---|---|---|
| committer | sakumisu <[email protected]> | 2023-11-20 22:15:33 +0800 |
| commit | bbcb433564d6c769cfdc05673f0ed984e8d59931 (patch) | |
| tree | 145fe90ec387ebb113b0776d3c9ef0e11c1b376a | |
| parent | 7989708bfe4e56181f6a7e5e7bc60c7408cc6f7f (diff) | |
support host demo with timer for rtthread
| -rw-r--r-- | demo/usb_host.c | 81 |
1 files changed, 79 insertions, 2 deletions
diff --git a/demo/usb_host.c b/demo/usb_host.c index c4aac3b9..d2549503 100644 --- a/demo/usb_host.c +++ b/demo/usb_host.c @@ -375,6 +375,33 @@ void usbh_videostreaming_parse_yuyv2(struct usbh_urb *urb, struct usbh_videostre #include "lwip/prot/dhcp.h" #endif +#ifndef RT_USING_TIMER_SOFT +#error must enable RT_USING_TIMER_SOFT to support timer callback in thread +#endif + +#ifdef __RTTHREAD__ + +#include "rtthread.h" +static rt_timer_t dhcp_timer = RT_NULL; + +static void dhcp_timeout(void *parameter) +{ + struct netif *netif = (struct netif *)parameter; + struct dhcp *dhcp; + + if (netif_is_up(netif)) { + dhcp = netif_dhcp_data(netif); + + if (dhcp && (dhcp->state == DHCP_STATE_BOUND)) { + rt_kprintf("\r\n IPv4 Address : %s\r\n", ipaddr_ntoa(&netif->ip_addr)); + rt_kprintf(" IPv4 Subnet mask : %s\r\n", ipaddr_ntoa(&netif->netmask)); + rt_kprintf(" IPv4 Gateway : %s\r\n\r\n", ipaddr_ntoa(&netif->gw)); + + rt_timer_stop(dhcp_timer); + } + } +} +#else #include "FreeRTOS.h" #include "task.h" #include "semphr.h" @@ -400,6 +427,7 @@ static void dhcp_timeout(TimerHandle_t xTimer) } } #endif +#endif #if TEST_USBH_CDC_ECM #include "usbh_cdc_ecm.h" @@ -438,8 +466,12 @@ void usbh_cdc_ecm_run(struct usbh_cdc_ecm *cdc_ecm_class) #if LWIP_DHCP dhcp_start(netif); +#ifdef __RTTHREAD__ + rt_timer_start(dhcp_timer); +#else xTimerStart(dhcp_handle, 0); #endif +#endif } void usbh_cdc_ecm_stop(struct usbh_cdc_ecm *cdc_ecm_class) @@ -459,6 +491,29 @@ void usbh_cdc_ecm_stop(struct usbh_cdc_ecm *cdc_ecm_class) struct netif g_rndis_netif; +#ifdef __RTTHREAD__ + +static rt_timer_t keep_timer = RT_NULL; + +static void rndis_dev_keepalive_timeout(void *parameter) +{ + struct usbh_rndis *rndis_class = (struct usbh_rndis *)parameter; + usbh_rndis_keepalive(rndis_class); +} + +void timer_init(struct usbh_rndis *rndis_class) +{ + keep_timer = rt_timer_create("keep", + rndis_dev_keepalive_timeout, + rndis_class, + 3000, + RT_TIMER_FLAG_PERIODIC | + RT_TIMER_FLAG_SOFT_TIMER); + + rt_timer_start(keep_timer); +} + +#else TimerHandle_t timer_handle; static void rndis_dev_keepalive_timeout(TimerHandle_t xTimer) @@ -479,6 +534,7 @@ void timer_init(struct usbh_rndis *rndis_class) } } } +#endif static err_t usbh_rndis_if_init(struct netif *netif) { @@ -514,8 +570,12 @@ void usbh_rndis_run(struct usbh_rndis *rndis_class) #if LWIP_DHCP dhcp_start(netif); +#ifdef __RTTHREAD__ + rt_timer_start(dhcp_timer); +#else xTimerStart(dhcp_handle, 0); #endif +#endif } void usbh_rndis_stop(struct usbh_rndis *rndis_class) @@ -527,9 +587,13 @@ void usbh_rndis_stop(struct usbh_rndis *rndis_class) #endif netif_set_down(netif); netif_remove(netif); - +#ifdef __RTTHREAD__ + rt_timer_stop(keep_timer); + rt_timer_delete(keep_timer); +#else xTimerStop(timer_handle, 0); xTimerDelete(timer_handle, 0); +#endif } #endif @@ -594,9 +658,11 @@ void usbh_class_test(void) #endif #if TEST_USBH_CDC_ECM || TEST_USBH_RNDIS struct netif *netif; +#ifndef __RTTHREAD__ /* Initialize the LwIP stack */ tcpip_init(NULL, NULL); #endif +#endif #if TEST_USBH_CDC_ECM netif = &g_cdc_ecm_netif; usbh_cdc_ecm_lwip_thread_init(&g_cdc_ecm_netif); @@ -606,10 +672,21 @@ void usbh_class_test(void) usbh_rndis_lwip_thread_init(&g_rndis_netif); #endif #if TEST_USBH_CDC_ECM || TEST_USBH_RNDIS +#ifdef __RTTHREAD__ + dhcp_timer = rt_timer_create("dhcp", + dhcp_timeout, + netif, + 200, + RT_TIMER_FLAG_PERIODIC | + RT_TIMER_FLAG_SOFT_TIMER); + +#else dhcp_handle = xTimerCreate((const char *)"dhcp", (TickType_t)200, (UBaseType_t)pdTRUE, (void *const)netif, (TimerCallbackFunction_t)dhcp_timeout); if (dhcp_handle == NULL) { USB_LOG_ERR("timer creation failed! \r\n"); - while (1) {} + while (1) { + } } #endif +#endif }
\ No newline at end of file |
