From ede735c2a73ed8a911190ec33cd2fb477c493acb Mon Sep 17 00:00:00 2001 From: windowsair Date: Tue, 4 Feb 2020 20:45:01 +0800 Subject: [PATCH] feat: Improve DAP performance on USB-HID --- components/DAP/config/DAP_config.h | 45 ++----- components/DAP/include/DAP.h | 30 +++-- components/DAP/include/cmsis_compiler.h | 35 ++++++ components/DAP/source/DAP.c | 4 + components/USBIP/USB_handle.c | 2 +- components/USBIP/USBd_config.c | 8 +- main/DAP_handle.c | 155 ++++++++++++++++++++++-- main/DAP_handle.h | 5 +- main/main.c | 10 +- main/tcp_server.c | 32 ++--- main/usbip_server.c | 18 ++- sdkconfig | 62 +++++----- 12 files changed, 277 insertions(+), 129 deletions(-) diff --git a/components/DAP/config/DAP_config.h b/components/DAP/config/DAP_config.h index 226145b..7121a2e 100644 --- a/components/DAP/config/DAP_config.h +++ b/components/DAP/config/DAP_config.h @@ -35,41 +35,7 @@ #include "gpio_struct.h" #include "timer_struct.h" #include "esp8266/pin_mux_register.h" -#define GPIO_PIN_REG_0 PERIPHS_IO_MUX_GPIO0_U -#define GPIO_PIN_REG_1 PERIPHS_IO_MUX_U0TXD_U -#define GPIO_PIN_REG_2 PERIPHS_IO_MUX_GPIO2_U -#define GPIO_PIN_REG_3 PERIPHS_IO_MUX_U0RXD_U -#define GPIO_PIN_REG_4 PERIPHS_IO_MUX_GPIO4_U -#define GPIO_PIN_REG_5 PERIPHS_IO_MUX_GPIO5_U -#define GPIO_PIN_REG_6 PERIPHS_IO_MUX_SD_CLK_U -#define GPIO_PIN_REG_7 PERIPHS_IO_MUX_SD_DATA0_U -#define GPIO_PIN_REG_8 PERIPHS_IO_MUX_SD_DATA1_U -#define GPIO_PIN_REG_9 PERIPHS_IO_MUX_SD_DATA2_U -#define GPIO_PIN_REG_10 PERIPHS_IO_MUX_SD_DATA3_U -#define GPIO_PIN_REG_11 PERIPHS_IO_MUX_SD_CMD_U -#define GPIO_PIN_REG_12 PERIPHS_IO_MUX_MTDI_U -#define GPIO_PIN_REG_13 PERIPHS_IO_MUX_MTCK_U -#define GPIO_PIN_REG_14 PERIPHS_IO_MUX_MTMS_U -#define GPIO_PIN_REG_15 PERIPHS_IO_MUX_MTDO_U -#define GPIO_PIN_REG_16 PAD_XPD_DCDC_CONF -#define GPIO_PIN_REG(i) \ - (i==0) ? GPIO_PIN_REG_0: \ - (i==1) ? GPIO_PIN_REG_1: \ - (i==2) ? GPIO_PIN_REG_2: \ - (i==3) ? GPIO_PIN_REG_3: \ - (i==4) ? GPIO_PIN_REG_4: \ - (i==5) ? GPIO_PIN_REG_5: \ - (i==6) ? GPIO_PIN_REG_6: \ - (i==7) ? GPIO_PIN_REG_7: \ - (i==8) ? GPIO_PIN_REG_8: \ - (i==9) ? GPIO_PIN_REG_9: \ - (i==10)? GPIO_PIN_REG_10: \ - (i==11)? GPIO_PIN_REG_11: \ - (i==12)? GPIO_PIN_REG_12: \ - (i==13)? GPIO_PIN_REG_13: \ - (i==14)? GPIO_PIN_REG_14: \ - (i==15)? GPIO_PIN_REG_15: \ - GPIO_PIN_REG_16 + //************************************************************************************************** /** \defgroup DAP_Config_Debug_gr CMSIS-DAP Debug Unit Information @@ -97,6 +63,9 @@ This information includes: #define CPU_CLOCK 160000000 ///< Specifies the CPU Clock in Hz. // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<160MHz +// This value is used to replace the largest 10MHZ speed clock in Keil +#define MAX_USER_CLOCK 10000000 ///< Specifies the max Debug Clock in Hz. + /// Number of processor cycles for I/O Port write operations. /// This value is used to calculate the SWD/JTAG clock speed that is generated with I/O /// Port write operations in the Debug Unit by a Cortex-M MCU. Most Cortex-M processors @@ -111,7 +80,7 @@ This information includes: /// Indicate that JTAG communication mode is available at the Debug Port. /// This information is returned by the command \ref DAP_Info as part of Capabilities. -#define DAP_JTAG 0 ///< JTAG Mode: 1 = available, 0 = not available. +#define DAP_JTAG 1 ///< JTAG Mode: 1 = available, 0 = not available. /// Configure maximum number of JTAG devices on the scan chain connected to the Debug Access Port. /// This setting impacts the RAM requirements of the Debug Unit. Valid range is 1 .. 255. @@ -131,14 +100,14 @@ This information includes: /// This configuration settings is used to optimize the communication performance with the /// debugger and depends on the USB peripheral. Typical vales are 64 for Full-speed USB HID or WinUSB, /// 1024 for High-speed USB HID and 512 for High-speed USB WinUSB. -#define DAP_PACKET_SIZE 64U ///< Specifies Packet Size in bytes. +#define DAP_PACKET_SIZE 255U ///< Specifies Packet Size in bytes. // <<<<<<<<<<<<<<<<<<<<<<<<<<<<< 512 for High-speed USB WinUSB. /// Maximum Package Buffers for Command and Response data. /// This configuration settings is used to optimize the communication performance with the /// debugger and depends on the USB peripheral. For devices with limited RAM or USB buffer the /// setting can be reduced (valid range is 1 .. 255). -#define DAP_PACKET_COUNT 1U ///< Specifies number of packets buffered. +#define DAP_PACKET_COUNT 20 ///< Specifies number of packets buffered. /// Indicate that UART Serial Wire Output (SWO) trace is available. /// This information is returned by the command \ref DAP_Info as part of Capabilities. diff --git a/components/DAP/include/DAP.h b/components/DAP/include/DAP.h index 516b83d..b467714 100644 --- a/components/DAP/include/DAP.h +++ b/components/DAP/include/DAP.h @@ -287,21 +287,25 @@ extern void DAP_Setup (void); #define USE_ASSEMBLY 0 -#if USE_ASSEMBLY == 0 -__STATIC_FORCEINLINE void PIN_DELAY_SLOW (uint32_t delay) { - uint32_t count = delay; - while (--count); -} +#define USE_ASSEMBLY 1 + +#if (USE_ASSEMBLY == 0) + __STATIC_FORCEINLINE void PIN_DELAY_SLOW(uint32_t delay) + { + uint32_t count = delay; + while (--count) + ; + } #else -__STATIC_FORCEINLINE void PIN_DELAY_SLOW (uint32_t delay) { - __ASM volatile ( - ".syntax unified\n" - "0:\n\t" - "subs %0,%0,#1\n\t" - "bne 0b\n" - : "+l" (delay) : : "cc" - ); +__STATIC_FORCEINLINE void PIN_DELAY_SLOW(uint32_t delay) +{ + __asm__ volatile( + "l_PINDELAYSLOW%=:" + "ADDI.N %[time], %[time], -1;" + "BNEZ %[time], l_PINDELAYSLOW%=;" + : [time] "+r"(delay)); } + #endif // Fixed delay for fast clock generation diff --git a/components/DAP/include/cmsis_compiler.h b/components/DAP/include/cmsis_compiler.h index 349f5fd..aafbe21 100644 --- a/components/DAP/include/cmsis_compiler.h +++ b/components/DAP/include/cmsis_compiler.h @@ -11,5 +11,40 @@ #define __WEAK __attribute__((weak)) #endif +#define GPIO_PIN_REG_0 PERIPHS_IO_MUX_GPIO0_U +#define GPIO_PIN_REG_1 PERIPHS_IO_MUX_U0TXD_U +#define GPIO_PIN_REG_2 PERIPHS_IO_MUX_GPIO2_U +#define GPIO_PIN_REG_3 PERIPHS_IO_MUX_U0RXD_U +#define GPIO_PIN_REG_4 PERIPHS_IO_MUX_GPIO4_U +#define GPIO_PIN_REG_5 PERIPHS_IO_MUX_GPIO5_U +#define GPIO_PIN_REG_6 PERIPHS_IO_MUX_SD_CLK_U +#define GPIO_PIN_REG_7 PERIPHS_IO_MUX_SD_DATA0_U +#define GPIO_PIN_REG_8 PERIPHS_IO_MUX_SD_DATA1_U +#define GPIO_PIN_REG_9 PERIPHS_IO_MUX_SD_DATA2_U +#define GPIO_PIN_REG_10 PERIPHS_IO_MUX_SD_DATA3_U +#define GPIO_PIN_REG_11 PERIPHS_IO_MUX_SD_CMD_U +#define GPIO_PIN_REG_12 PERIPHS_IO_MUX_MTDI_U +#define GPIO_PIN_REG_13 PERIPHS_IO_MUX_MTCK_U +#define GPIO_PIN_REG_14 PERIPHS_IO_MUX_MTMS_U +#define GPIO_PIN_REG_15 PERIPHS_IO_MUX_MTDO_U +#define GPIO_PIN_REG_16 PAD_XPD_DCDC_CONF +#define GPIO_PIN_REG(i) \ + (i==0) ? GPIO_PIN_REG_0: \ + (i==1) ? GPIO_PIN_REG_1: \ + (i==2) ? GPIO_PIN_REG_2: \ + (i==3) ? GPIO_PIN_REG_3: \ + (i==4) ? GPIO_PIN_REG_4: \ + (i==5) ? GPIO_PIN_REG_5: \ + (i==6) ? GPIO_PIN_REG_6: \ + (i==7) ? GPIO_PIN_REG_7: \ + (i==8) ? GPIO_PIN_REG_8: \ + (i==9) ? GPIO_PIN_REG_9: \ + (i==10)? GPIO_PIN_REG_10: \ + (i==11)? GPIO_PIN_REG_11: \ + (i==12)? GPIO_PIN_REG_12: \ + (i==13)? GPIO_PIN_REG_13: \ + (i==14)? GPIO_PIN_REG_14: \ + (i==15)? GPIO_PIN_REG_15: \ + GPIO_PIN_REG_16 #endif \ No newline at end of file diff --git a/components/DAP/source/DAP.c b/components/DAP/source/DAP.c index 9e1f620..03f048c 100644 --- a/components/DAP/source/DAP.c +++ b/components/DAP/source/DAP.c @@ -377,6 +377,10 @@ static uint32_t DAP_SWJ_Clock(const uint8_t *request, uint8_t *response) { *response = DAP_ERROR; return ((4U << 16) | 1U); } + if(clock == 10000000){ + clock = MAX_USER_CLOCK; + } + if (clock >= MAX_SWJ_CLOCK(DELAY_FAST_CYCLES)) { DAP_Data.fast_clock = 1U; diff --git a/components/USBIP/USB_handle.c b/components/USBIP/USB_handle.c index 62ba946..f9fe76a 100644 --- a/components/USBIP/USB_handle.c +++ b/components/USBIP/USB_handle.c @@ -321,7 +321,7 @@ static void handleGetDescriptor(usbip_stage2_header *header) send_stage2_submit_data(header, 0, bosDescriptor, sizeof(bosDescriptor)); break; case USB_DT_HID_REPORT: - os_printf("* GET 0x22 HID REPORT DESCRIPTOR"); + os_printf("* GET 0x22 HID REPORT DESCRIPTOR\r\n"); send_stage2_submit_data(header, 0, (void *)kHidReportDescriptor, sizeof(kHidReportDescriptor)); break; default: diff --git a/components/USBIP/USBd_config.c b/components/USBIP/USBd_config.c index 598e7d9..0061a8b 100644 --- a/components/USBIP/USBd_config.c +++ b/components/USBIP/USBd_config.c @@ -155,7 +155,7 @@ const uint8_t kUSBd0InterfaceDescriptor[0x20]= 0x81, // bEndpointAddress USB_ENDPOINT_ATTR_INTERRUPT, // bmAttributes USBShort(64), // wMaxPacketSize - 0xff, // bInterval + 0x01, // bInterval /* Pysical endpoint 1 */ @@ -164,7 +164,7 @@ const uint8_t kUSBd0InterfaceDescriptor[0x20]= 0x01, // bEndpointAddress USB_ENDPOINT_ATTR_INTERRUPT, // bmAttributes USBShort(64), // wMaxPacketSize - 0xff, // bInterval + 0x01, // bInterval }; #endif @@ -221,10 +221,10 @@ const uint8_t kHidReportDescriptor[0x21] = { 0x15, 0x00, // Logical Minimum (0) 0x26, 0xFF, 0x00, // Logical Maximum (255) 0x75, 0x08, // Report Size (8) - 0x95, 0x40, // Report Count (64) + 0x95, 0xFF, // Report Count (64) 0x09, 0x01, // Usage (0x01) 0x81, 0x02, // Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position) - 0x95, 0x40, // Report Count (64) + 0x95, 0xFF, // Report Count (64) 0x09, 0x01, // Usage (0x01) 0x91, 0x02, // Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile) 0x95, 0x01, // Report Count (1) diff --git a/main/DAP_handle.c b/main/DAP_handle.c index 4f51da4..a3bff99 100644 --- a/main/DAP_handle.c +++ b/main/DAP_handle.c @@ -1,20 +1,35 @@ /** * @file DAP_handle.c * @brief Handle DAP packets and transaction push - * @version 0.1 - * @date 2020-01-25 + * @version 0.2 + * @date 2020-02-04 * * @copyright Copyright (c) 2020 * */ #include +#include #include "usbip_server.h" #include "DAP_handle.h" #include "DAP.h" #include "esp_libc.h" +#include "USBd_config.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/ringbuf.h" +#include "freertos/semphr.h" + +#include "lwip/err.h" +#include "lwip/sockets.h" +#include "lwip/sys.h" +#include + +extern int kSock; +extern TaskHandle_t kDAPTaskHandle; ////TODO: Merge this -#define DAP_PACKET_SIZE 64 +#define DAP_PACKET_SIZE 255 static uint8_t data_out[DAP_PACKET_SIZE]; static int dap_respond = 0; @@ -24,29 +39,40 @@ static int swo_trace_respond = 0; static uint8_t *swo_data_to_send; static uint32_t num_swo_data; -void handle_dap_data_request(usbip_stage2_header *header) +static RingbufHandle_t dap_dataIN_handle = NULL; +static RingbufHandle_t dap_dataOUT_handle = NULL; +static SemaphoreHandle_t data_response_mux = NULL; + +static void unpack(void *data, int size); + +void handle_dap_data_request(usbip_stage2_header *header, uint32_t length) { uint8_t *data_in = (uint8_t *)header; data_in = &(data_in[sizeof(usbip_stage2_header)]); // Point to the beginning of the URB packet + +#if (USE_WINUSB == 1) dap_respond = DAP_ProcessCommand((uint8_t *)data_in, (uint8_t *)data_out); //handle_dap_data_response(header); send_stage2_submit(header, 0, 0); +#else + xRingbufferSend(dap_dataIN_handle, data_in, length - sizeof(usbip_stage2_header), portMAX_DELAY); + //os_printf("LENGTH: %d\r\n", length - sizeof(usbip_stage2_header)); + xTaskNotifyGive(kDAPTaskHandle); + send_stage2_submit(header, 0, 0); + +#endif } + void handle_dap_data_response(usbip_stage2_header *header) { if (dap_respond) { - - //os_printf("*** Will respond"); - send_stage2_submit_data(header, 0, data_out, DAP_PACKET_SIZE); dap_respond = 0; - //os_printf("*** RESPONDED ***"); } else { - //os_printf("*** Will NOT respond"); send_stage2_submit(header, 0, 0); } } @@ -56,14 +82,10 @@ void handle_swo_trace_response(usbip_stage2_header *header) if (swo_trace_respond) { swo_trace_respond = 0; - //os_printf("*** Will respond"); send_stage2_submit_data(header, 0, data_out, DAP_PACKET_SIZE); - - //os_printf("*** RESPONDED ***"); } else { - //os_printf("*** Will NOT respond"); send_stage2_submit(header, 0, 0); } } @@ -83,4 +105,111 @@ void SWO_AbortTransfer(void) { //USBD_EndpointAbort(0U, USB_ENDPOINT_IN(2U)); ////TODO: unlink might be useful ... +} + +void DAP_Thread(void *argument) +{ + dap_dataIN_handle = xRingbufferCreate(DAP_PACKET_SIZE * 20, RINGBUF_TYPE_BYTEBUF); + dap_dataOUT_handle = xRingbufferCreate(DAP_PACKET_SIZE * 10, RINGBUF_TYPE_BYTEBUF); + data_response_mux = xSemaphoreCreateMutex(); + size_t packetSize; + uint8_t *item; + + if (dap_dataIN_handle == NULL || dap_dataIN_handle == NULL || + data_response_mux == NULL) + { + os_printf("Can not create DAP ringbuf/mux!\r\n"); + vTaskDelete(NULL); + } + for (;;) + { + + while (1) + { + ulTaskNotifyTake(pdFALSE, portMAX_DELAY); + packetSize = 0; + item = (uint8_t *)xRingbufferReceiveUpTo(dap_dataIN_handle, &packetSize, + (1 / portTICK_RATE_MS), DAP_PACKET_SIZE); + if (packetSize == 0) + { + break; + } + + else if (packetSize < DAP_PACKET_SIZE) + { + os_printf("Wrong data in packet size:%d , data in remain: %d\r\n", packetSize, (int)xRingbufferGetMaxItemSize(dap_dataIN_handle)); + vRingbufferReturnItem(dap_dataIN_handle, (void *)item); + break; + // This may not happen because there is a semaphore acquisition + } + + if (item[0] == ID_DAP_QueueCommands) + item[0] = ID_DAP_ExecuteCommands; + DAP_ProcessCommand(item, data_out); + + vRingbufferReturnItem(dap_dataIN_handle, (void *)item); + xRingbufferSend(dap_dataOUT_handle, data_out, DAP_PACKET_SIZE, portMAX_DELAY); + if (xSemaphoreTake(data_response_mux, portMAX_DELAY) == pdTRUE) + { + ++dap_respond; + xSemaphoreGive(data_response_mux); + } + } + } +} + +int fast_reply(uint8_t *buf, uint32_t length) +{ + if (length == 48 && buf[3] == 1 && buf[15] == 1 && buf[19] == 1) + { + if (dap_respond > 0) + { + uint8_t *item; + size_t packetSize = 0; + item = (uint8_t *)xRingbufferReceiveUpTo(dap_dataOUT_handle, &packetSize, + (10 / portTICK_RATE_MS), DAP_PACKET_SIZE); + if (packetSize == DAP_PACKET_SIZE) + { + unpack((uint32_t *)buf, sizeof(usbip_stage2_header)); + send_stage2_submit_data((usbip_stage2_header *)buf, 0, item, DAP_PACKET_SIZE); + if (xSemaphoreTake(data_response_mux, portMAX_DELAY) == pdTRUE) + { + --dap_respond; + xSemaphoreGive(data_response_mux); + } + vRingbufferReturnItem(dap_dataOUT_handle, (void *)item); + return 1; + } + else if (packetSize > 0) + { + os_printf("Wrong data out packet size:%d!\r\n", packetSize); + } + ////TODO: fast reply + } + else + { + buf[3] = 0x3; // command + buf[15] = 0; // direction + buf[0x16] = 0; + buf[0x17] = 0; + buf[27] = 0; + buf[39] = 0; + send(kSock, buf, 48, 0); + return 1; + } + } + return 0; +} + +static void unpack(void *data, int size) +{ + + // Ignore the setup field + int sz = (size / sizeof(uint32_t)) - 2; + uint32_t *ptr = (uint32_t *)data; + + for (int i = 0; i < sz; i++) + { + ptr[i] = ntohl(ptr[i]); + } } \ No newline at end of file diff --git a/main/DAP_handle.h b/main/DAP_handle.h index 5ac91f2..2d71be2 100644 --- a/main/DAP_handle.h +++ b/main/DAP_handle.h @@ -3,7 +3,10 @@ #include "usbip_defs.h" -void handle_dap_data_request(usbip_stage2_header *header); +void handle_dap_data_request(usbip_stage2_header *header, uint32_t length); void handle_dap_data_response(usbip_stage2_header *header); void handle_swo_trace_response(usbip_stage2_header *header); + +int fast_reply(uint8_t *buf, uint32_t length); + #endif \ No newline at end of file diff --git a/main/main.c b/main/main.c index b26615d..6369f17 100644 --- a/main/main.c +++ b/main/main.c @@ -26,18 +26,17 @@ #include "tcp_server.h" #include "timer.h" #include "wifi_configuration.h" -/* The examples use simple WiFi configuration that you can set via - 'make menuconfig'. - If you'd rather not, just change the below entries to strings with - the config you want - ie #define EXAMPLE_WIFI_SSID "mywifissid" -*/ + + extern void SWO_Thread(void *argument); extern void usart_monitor_task(void *argument); extern void DAP_Setup(void); +extern void DAP_Thread(void *argument); /* FreeRTOS event group to signal when we are connected & ready to make a request */ static EventGroupHandle_t wifi_event_group; +TaskHandle_t kDAPTaskHandle = NULL; const int IPV4_GOTIP_BIT = BIT0; #ifdef CONFIG_EXAMPLE_IPV6 @@ -141,6 +140,7 @@ void app_main() xTaskCreate(timer_create_task, "timer_create", 512, NULL, 10, NULL); xTaskCreate(tcp_server_task, "tcp_server", 4096, NULL, 20, NULL); + xTaskCreate(DAP_Thread, "DAP_Task", 2048, NULL, 22, &kDAPTaskHandle); // SWO Trace Task //xTaskCreate(SWO_Thread, "swo_task", 1024, NULL, 6, NULL); //xTaskCreate(usart_monitor_task, "uart_task", 512, NULL, 6, NULL); diff --git a/main/tcp_server.c b/main/tcp_server.c index 834381f..99e9fe8 100644 --- a/main/tcp_server.c +++ b/main/tcp_server.c @@ -34,7 +34,7 @@ int kSock = -1; void tcp_server_task(void *pvParameters) { - uint8_t tcp_rx_buffer[256]; + uint8_t tcp_rx_buffer[305]; char addr_str[128]; int addr_family; int ip_protocol; @@ -102,7 +102,7 @@ void tcp_server_task(void *pvParameters) while (1) { - int len = recv(kSock, tcp_rx_buffer, 255, 0); + int len = recv(kSock, tcp_rx_buffer, sizeof(tcp_rx_buffer), 0); // Error occured during receiving if (len < 0) { @@ -118,19 +118,19 @@ void tcp_server_task(void *pvParameters) // Data received else { -// #ifdef CONFIG_EXAMPLE_IPV6 -// // Get the sender's ip address as string -// if (sourceAddr.sin6_family == PF_INET) -// { -// inet_ntoa_r(((struct sockaddr_in *)&sourceAddr)->sin_addr.s_addr, addr_str, sizeof(addr_str) - 1); -// } -// else if (sourceAddr.sin6_family == PF_INET6) -// { -// inet6_ntoa_r(sourceAddr.sin6_addr, addr_str, sizeof(addr_str) - 1); -// } -// #else -// inet_ntoa_r(((struct sockaddr_in *)&sourceAddr)->sin_addr.s_addr, addr_str, sizeof(addr_str) - 1); -// #endif + // #ifdef CONFIG_EXAMPLE_IPV6 + // // Get the sender's ip address as string + // if (sourceAddr.sin6_family == PF_INET) + // { + // inet_ntoa_r(((struct sockaddr_in *)&sourceAddr)->sin_addr.s_addr, addr_str, sizeof(addr_str) - 1); + // } + // else if (sourceAddr.sin6_family == PF_INET6) + // { + // inet6_ntoa_r(sourceAddr.sin6_addr, addr_str, sizeof(addr_str) - 1); + // } + // #else + // inet_ntoa_r(((struct sockaddr_in *)&sourceAddr)->sin_addr.s_addr, addr_str, sizeof(addr_str) - 1); + // #endif switch (kState) { @@ -155,6 +155,8 @@ void tcp_server_task(void *pvParameters) os_printf("Shutting down socket and restarting...\r\n"); //shutdown(kSock, 0); close(kSock); + if (kState == EMULATING) + kState = ACCEPTING; //shutdown(listen_sock, 0); //close(listen_sock); diff --git a/main/usbip_server.c b/main/usbip_server.c index 9c41eef..1eb2b75 100644 --- a/main/usbip_server.c +++ b/main/usbip_server.c @@ -11,6 +11,7 @@ #include "USBd_config.h" #include "DAP_handle.h" #include "USB_handle.h" +#include "USBd_config.h" // attach helper function static int read_stage1_command(uint8_t *buffer, uint32_t length); @@ -24,14 +25,13 @@ static void send_interface_info(); // emulate helper function static void pack(void *data, int size); static void unpack(void *data, int size); -static int handle_submit(usbip_stage2_header *header); +static int handle_submit(usbip_stage2_header *header, uint32_t length); static int read_stage2_command(usbip_stage2_header *header, uint32_t length); static void handle_unlink(usbip_stage2_header *header); // unlink helper function static void send_stage2_unlink(usbip_stage2_header *req_header); -static void fast_submit_reply(usbip_stage2_header *req_header); int attach(uint8_t *buffer, uint32_t length) @@ -182,6 +182,12 @@ static void send_interface_info() int emulate(uint8_t *buffer, uint32_t length) { // usbip_stage2_header header; + #if (USE_WINUSB == 0) + if(fast_reply(buffer, length)) + { + return 0; + } + #endif int command = read_stage2_command((usbip_stage2_header *)buffer, length); if (command < 0) { @@ -191,7 +197,7 @@ int emulate(uint8_t *buffer, uint32_t length) switch (command) { case USBIP_STAGE2_REQ_SUBMIT: - handle_submit((usbip_stage2_header *)buffer); + handle_submit((usbip_stage2_header *)buffer , length); break; case USBIP_STAGE2_REQ_UNLINK: @@ -200,7 +206,7 @@ int emulate(uint8_t *buffer, uint32_t length) default: os_printf("emulate unknown command:%d\r\n", command); - handle_submit((usbip_stage2_header *)buffer); + //handle_submit((usbip_stage2_header *)buffer, length); return -1; } return 0; @@ -269,7 +275,7 @@ static void unpack(void *data, int size) * @brief USB transaction processing * */ -static int handle_submit(usbip_stage2_header *header) +static int handle_submit(usbip_stage2_header *header, uint32_t length) { switch (header->base.ep) { @@ -283,7 +289,7 @@ static int handle_submit(usbip_stage2_header *header) if (header->base.direction == 0) { //os_printf("EP 01 DATA FROM HOST"); - handle_dap_data_request(header); + handle_dap_data_request(header ,length); } else { diff --git a/sdkconfig b/sdkconfig index 08378b1..4db752e 100644 --- a/sdkconfig +++ b/sdkconfig @@ -25,7 +25,7 @@ CONFIG_ESPTOOLPY_BAUD_921600B=y # CONFIG_ESPTOOLPY_BAUD_2MB is not set # CONFIG_ESPTOOLPY_BAUD_OTHER is not set CONFIG_ESPTOOLPY_BAUD_OTHER_VAL=115200 -CONFIG_ESPTOOLPY_BAUD=115200 +CONFIG_ESPTOOLPY_BAUD=921600 CONFIG_ESPTOOLPY_COMPRESSED=y CONFIG_ESPTOOLPY_FLASHMODE_QIO=y # CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set @@ -33,12 +33,12 @@ CONFIG_ESPTOOLPY_FLASHMODE_QIO=y # CONFIG_ESPTOOLPY_FLASHMODE_DOUT is not set CONFIG_ESPTOOLPY_FLASHMODE="dio" CONFIG_SPI_FLASH_MODE=0x0 -# CONFIG_ESPTOOLPY_FLASHFREQ_80M is not set -CONFIG_ESPTOOLPY_FLASHFREQ_40M=y +CONFIG_ESPTOOLPY_FLASHFREQ_80M=y +# CONFIG_ESPTOOLPY_FLASHFREQ_40M is not set # CONFIG_ESPTOOLPY_FLASHFREQ_26M is not set # CONFIG_ESPTOOLPY_FLASHFREQ_20M is not set -CONFIG_ESPTOOLPY_FLASHFREQ="40m" -CONFIG_SPI_FLASH_FREQ=0x0 +CONFIG_ESPTOOLPY_FLASHFREQ="80m" +CONFIG_SPI_FLASH_FREQ=0xf # CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set # CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set # CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set @@ -76,9 +76,9 @@ CONFIG_EXAMPLE_IPV4=y CONFIG_EXAMPLE_PORT=3333 # CONFIG_COMPILER_OPTIMIZATION_LEVEL_DEBUG is not set CONFIG_COMPILER_OPTIMIZATION_LEVEL_RELEASE=y -CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE=y +# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_ENABLE is not set # CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT is not set -# CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE is not set +CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_DISABLE=y # CONFIG_COMPILER_CXX_EXCEPTIONS is not set CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y # CONFIG_COMPILER_STACK_CHECK_MODE_NORM is not set @@ -87,7 +87,7 @@ CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y # CONFIG_COMPILER_STACK_CHECK is not set # CONFIG_COMPILER_WARN_WRITE_STRINGS is not set CONFIG_APP_UPDATE_CHECK_APP_SUM=y -# CONFIG_APP_UPDATE_CHECK_APP_HASH is not set +CONFIG_APP_UPDATE_CHECK_APP_HASH=y # CONFIG_AWS_IOT_SDK is not set # CONFIG_USING_ESP_CONSOLE is not set CONFIG_ESP_TLS_USING_MBEDTLS=y @@ -107,8 +107,8 @@ CONFIG_ESP_FILENAME_MACRO_NO_PATH=y # CONFIG_ESP_FILENAME_MACRO_NULL is not set CONFIG_USING_NEW_ETS_VPRINTF=y # CONFIG_LINK_ETS_PRINTF_TO_IRAM is not set -# CONFIG_SOC_FULL_ICACHE is not set -CONFIG_SOC_IRAM_SIZE=0xC000 +CONFIG_SOC_FULL_ICACHE=y +CONFIG_SOC_IRAM_SIZE=0x8000 CONFIG_CONSOLE_UART_DEFAULT=y # CONFIG_CONSOLE_UART_CUSTOM is not set # CONFIG_CONSOLE_UART_NONE is not set @@ -130,7 +130,6 @@ CONFIG_TASK_WDT_TIMEOUT_S=15 CONFIG_RESET_REASON=y CONFIG_WIFI_PPT_TASKSTACK_SIZE=2048 CONFIG_EVENT_LOOP_STACK_SIZE=2048 -CONFIG_ESP8266_CORE_GLOBAL_DATA_LINK_IRAM=y # CONFIG_ESP8266_OTA_FROM_OLD is not set # CONFIG_ESP8266_BOOT_COPY_APP is not set CONFIG_ESP_ERR_TO_NAME_LOOKUP=y @@ -141,7 +140,7 @@ CONFIG_WIFI_TX_RATE_SEQUENCE_FROM_HIGH=y # CONFIG_ESP8266_WIFI_QOS_ENABLED is not set # CONFIG_ESP8266_WIFI_AMPDU_RX_ENABLED is not set # CONFIG_ESP8266_WIFI_AMSDU_ENABLED is not set -CONFIG_ESP8266_WIFI_RX_BUFFER_NUM=16 +CONFIG_ESP8266_WIFI_RX_BUFFER_NUM=26 CONFIG_ESP8266_WIFI_LEFT_CONTINUOUS_RX_BUFFER_NUM=4 CONFIG_ESP8266_WIFI_RX_PKT_NUM=7 CONFIG_ESP8266_WIFI_TX_PKT_NUM=6 @@ -151,8 +150,8 @@ CONFIG_ESP8266_WIFI_CONNECT_OPEN_ROUTER_WHEN_PWD_IS_SET=y CONFIG_ESP_PHY_CALIBRATION_AND_DATA_STORAGE=y # CONFIG_ESP_PHY_INIT_DATA_IN_PARTITION is not set CONFIG_ESP_PHY_INIT_DATA_VDD33_CONST=33 -CONFIG_ESP8266_PHY_MAX_WIFI_TX_POWER=20 -# CONFIG_ESP8266_HSPI_HIGH_THROUGHPUT is not set +CONFIG_ESP8266_PHY_MAX_WIFI_TX_POWER=21 +CONFIG_ESP8266_HSPI_HIGH_THROUGHPUT=y CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y CONFIG_HTTP_BUF_SIZE=512 CONFIG_HTTPD_MAX_REQ_HDR_LEN=512 @@ -166,33 +165,31 @@ CONFIG_FREERTOS_MAX_HOOK=2 CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1024 CONFIG_FREERTOS_ISR_STACKSIZE=512 # CONFIG_FREERTOS_EXTENED_HOOKS is not set -CONFIG_FREERTOS_GLOBAL_DATA_LINK_IRAM=y -# CONFIG_FREERTOS_CODE_LINK_TO_IRAM is not set +CONFIG_FREERTOS_CODE_LINK_TO_IRAM=y CONFIG_FREERTOS_TIMER_STACKSIZE=2048 CONFIG_TASK_SWITCH_FASTER=y # CONFIG_USE_QUEUE_SETS is not set # CONFIG_ENABLE_FREERTOS_SLEEP is not set # CONFIG_FREERTOS_USE_TRACE_FACILITY is not set # CONFIG_FREERTOS_GENERATE_RUN_TIME_STATS is not set -# CONFIG_HEAP_DISABLE_IRAM is not set +CONFIG_HEAP_DISABLE_IRAM=y # CONFIG_LOG_DEFAULT_LEVEL_NONE is not set -# CONFIG_LOG_DEFAULT_LEVEL_ERROR is not set +CONFIG_LOG_DEFAULT_LEVEL_ERROR=y # CONFIG_LOG_DEFAULT_LEVEL_WARN is not set -CONFIG_LOG_DEFAULT_LEVEL_INFO=y +# CONFIG_LOG_DEFAULT_LEVEL_INFO is not set # CONFIG_LOG_DEFAULT_LEVEL_DEBUG is not set # CONFIG_LOG_DEFAULT_LEVEL_VERBOSE is not set -CONFIG_LOG_DEFAULT_LEVEL=3 +CONFIG_LOG_DEFAULT_LEVEL=1 CONFIG_LOG_COLORS=y # CONFIG_LOG_SET_LEVEL is not set -# CONFIG_LWIP_USE_IRAM is not set -# CONFIG_LWIP_HIGH_THROUGHPUT is not set -CONFIG_LWIP_GLOBAL_DATA_LINK_IRAM=y -CONFIG_TCPIP_RECVMBOX_SIZE=32 +CONFIG_LWIP_USE_IRAM=y +CONFIG_LWIP_HIGH_THROUGHPUT=y +CONFIG_TCPIP_RECVMBOX_SIZE=64 CONFIG_LWIP_ARP_TABLE_SIZE=10 CONFIG_LWIP_ARP_MAXAGE=300 # CONFIG_LWIP_ESP_GRATUITOUS_ARP is not set CONFIG_LWIP_SOCKET_MULTITHREAD=y -# CONFIG_ENABLE_NONBLOCK_SPEEDUP is not set +CONFIG_ENABLE_NONBLOCK_SPEEDUP=y CONFIG_SET_SOLINGER_DEFAULT=y CONFIG_ESP_UDP_SYNC_SEND=y CONFIG_ESP_UDP_SYNC_RETRY_MAX=5 @@ -202,8 +199,8 @@ CONFIG_LWIP_SO_REUSE_RXTOALL=y # CONFIG_LWIP_SO_RCVBUF is not set CONFIG_LWIP_RECV_BUFSIZE_DEFAULT=11680 CONFIG_LWIP_TCP_CLOSE_TIMEOUT_MS_DEFAULT=10000 -# CONFIG_LWIP_IP_FRAG is not set -# CONFIG_LWIP_IP_REASSEMBLY is not set +CONFIG_LWIP_IP_FRAG=y +CONFIG_LWIP_IP_REASSEMBLY=y CONFIG_LWIP_IP_REASS_MAX_PBUFS=10 # CONFIG_LWIP_IP_SOF_BROADCAST is not set # CONFIG_LWIP_IP_SOF_BROADCAST_RECV is not set @@ -221,7 +218,7 @@ CONFIG_LWIP_IGMP=y CONFIG_ESP_DNS=y CONFIG_DNS_MAX_SERVERS=3 # CONFIG_LWIP_NETIF_LOOPBACK is not set -# CONFIG_TCP_HIGH_SPEED_RETRANSMISSION is not set +CONFIG_TCP_HIGH_SPEED_RETRANSMISSION=y CONFIG_LWIP_MAX_ACTIVE_TCP=5 CONFIG_LWIP_MAX_LISTENING_TCP=8 CONFIG_TCP_MAXRTX=12 @@ -229,7 +226,7 @@ CONFIG_TCP_SYNMAXRTX=6 CONFIG_TCP_MSS=1460 CONFIG_TCP_SND_BUF_DEFAULT=2920 CONFIG_TCP_WND_DEFAULT=5840 -CONFIG_TCP_RECVMBOX_SIZE=6 +CONFIG_TCP_RECVMBOX_SIZE=16 CONFIG_TCP_QUEUE_OOSEQ=y CONFIG_TCP_OVERSIZE_MSS=y # CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set @@ -237,7 +234,7 @@ CONFIG_TCP_OVERSIZE_MSS=y # CONFIG_LWIP_TCP_TIMESTAMPS is not set CONFIG_LWIP_MAX_UDP_PCBS=4 CONFIG_UDP_RECVMBOX_SIZE=6 -CONFIG_TCPIP_TASK_STACK_SIZE=2048 +CONFIG_TCPIP_TASK_STACK_SIZE=4096 CONFIG_LWIP_MAX_RAW_PCBS=4 # CONFIG_LWIP_IPV6 is not set # CONFIG_LWIP_STATS is not set @@ -343,7 +340,6 @@ CONFIG_OPENSSL_ASSERT_DO_NOTHING=y # CONFIG_ENABLE_PTHREAD is not set # CONFIG_USING_SPIFFS is not set CONFIG_IP_LOST_TIMER_INTERVAL=120 -CONFIG_TCPIP_ADAPTER_GLOBAL_DATA_LINK_IRAM=y # CONFIG_util_assert is not set CONFIG_ESP_SHA=y CONFIG_ESP_AES=y @@ -372,9 +368,9 @@ CONFIG_MONITOR_BAUD_OTHER_VAL=74880 CONFIG_MONITOR_BAUD=74880 # CONFIG_OPTIMIZATION_LEVEL_DEBUG is not set CONFIG_OPTIMIZATION_LEVEL_RELEASE=y -CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED=y +# CONFIG_OPTIMIZATION_ASSERTIONS_ENABLED is not set # CONFIG_OPTIMIZATION_ASSERTIONS_SILENT is not set -# CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED is not set +CONFIG_OPTIMIZATION_ASSERTIONS_DISABLED=y # CONFIG_CXX_EXCEPTIONS is not set CONFIG_STACK_CHECK_NONE=y # CONFIG_STACK_CHECK_NORM is not set