From 529e0a375f7a84c134be33c4e6ec374326b2ecd2 Mon Sep 17 00:00:00 2001 From: windowsair Date: Sat, 25 Jan 2020 21:45:24 +0800 Subject: [PATCH] feat: URB packet processing & DAP command push --- components/DAP/config/DAP_config.h | 12 ++--- components/USBIP/USB_handle.c | 83 +++++++++++++++++------------- components/USBIP/USBd_config.c | 3 +- components/USBIP/usbip_defs.h | 10 ++-- main/CMakeLists.txt | 2 +- main/DAP_handle.c | 45 ++++++++++++++++ main/DAP_handle.h | 8 +++ main/usbip_server.c | 11 ++-- 8 files changed, 120 insertions(+), 54 deletions(-) create mode 100644 main/DAP_handle.c create mode 100644 main/DAP_handle.h diff --git a/components/DAP/config/DAP_config.h b/components/DAP/config/DAP_config.h index 048d766..cc272fe 100644 --- a/components/DAP/config/DAP_config.h +++ b/components/DAP/config/DAP_config.h @@ -100,7 +100,7 @@ This information includes: /// 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 8U ///< Specifies number of packets buffered. +#define DAP_PACKET_COUNT 1U ///< 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. @@ -109,7 +109,7 @@ This information includes: /// Maximum SWO UART Baudrate. #define SWO_UART_MAX_BAUDRATE 50000000U ///< SWO UART Maximum Baudrate in Hz. // <<<<<<<<<<<<<<<<<<<<<<<<<<<<< 5MHz -// TODO: uncertain value +//// TODO: uncertain value /// Indicate that Manchester Serial Wire Output (SWO) trace is available. /// This information is returned by the command \ref DAP_Info as part of Capabilities. @@ -144,7 +144,7 @@ This information includes: */ __STATIC_INLINE uint8_t DAP_GetVendorString(char *str) { - //TODO: fill this + ////TODO: fill this // In fact, Keil can get the corresponding information through USB // without filling in this information. (void)str; @@ -296,7 +296,7 @@ __STATIC_INLINE void PORT_OFF(void) */ __STATIC_FORCEINLINE uint32_t PIN_SWCLK_TCK_IN(void) { - // TODO : can we set to 0? + ////TODO: can we set to 0? return ((GPIO.in >> PIN_SWCLK) & 0x1); } @@ -478,7 +478,7 @@ __STATIC_FORCEINLINE uint32_t PIN_nTRST_IN(void) */ __STATIC_FORCEINLINE void PIN_nTRST_OUT(uint32_t bit) { - //TODO : What does this mean? ? ? + ////TODO: What does this mean? ? ? if ((bit & 1U) == 1) { //set bit @@ -512,7 +512,7 @@ __STATIC_FORCEINLINE uint32_t PIN_nRESET_IN(void) */ __STATIC_FORCEINLINE void PIN_nRESET_OUT(uint32_t bit) { - //TODO : What does this mean? ? ? + ////TODO: What does this mean? ? ? if ((bit & 1U) == 1) { //set bit diff --git a/components/USBIP/USB_handle.c b/components/USBIP/USB_handle.c index 56207a2..b8807db 100644 --- a/components/USBIP/USB_handle.c +++ b/components/USBIP/USB_handle.c @@ -1,6 +1,6 @@ /** * @file USB_handle.c - * @brief Handle all Standard Device Requests + * @brief Handle all Standard Device Requests on endpoint 0 * @version 0.1 * @date 2020-01-23 * @@ -17,34 +17,38 @@ #include "usbip_server.h" #include "usb_defs.h" - // handle functions -static void handleGetDescriptor(struct usbip_stage2_header *header); +static void handleGetDescriptor(usbip_stage2_header *header); ////TODO: fill this -int handleUSBControlRequest(struct usbip_stage2_header *header) +int handleUSBControlRequest(usbip_stage2_header *header) { // Table 9-3. Standard Device Requests switch (header->u.cmd_submit.request.bmRequestType) { - case 0x00: + case 0x00: // ignore.. switch (header->u.cmd_submit.request.bRequest) { case USB_REQ_CLEAR_FEATURE: - /* code */ + os_printf("* CLEAR FEATURE\r\n"); + send_stage2_submit_data(header, 0, 0, 0); break; case USB_REQ_SET_FEATURE: - /* code */ + os_printf("* SET FEATURE\r\n"); + send_stage2_submit_data(header, 0, 0, 0); break; case USB_REQ_SET_ADDRESS: - /* code */ + os_printf("* SET ADDRESS\r\n"); + send_stage2_submit_data(header, 0, 0, 0); break; case USB_REQ_SET_DESCRIPTOR: - /* code */ + os_printf("* SET DESCRIPTOR\r\n"); + send_stage2_submit_data(header, 0, 0, 0); break; case USB_REQ_SET_CONFIGURATION: - /* code */ + os_printf("* SET CONFIGURATION\r\n"); + send_stage2_submit_data(header, 0, 0, 0); break; default: os_printf("USB unknown request, bmRequestType:%d,bRequest:%d\r\n", @@ -52,17 +56,20 @@ int handleUSBControlRequest(struct usbip_stage2_header *header) break; } break; - case 0x01: + case 0x01: // ignore... switch (header->u.cmd_submit.request.bRequest) { case USB_REQ_CLEAR_FEATURE: - /* code */ + os_printf("* CLEAR FEATURE\r\n"); + send_stage2_submit_data(header, 0, 0, 0); break; case USB_REQ_SET_FEATURE: - /* code */ + os_printf("* SET FEATURE\r\n"); + send_stage2_submit_data(header, 0, 0, 0); break; case USB_REQ_SET_INTERFACE: - /* code */ + os_printf("* SET INTERFACE\r\n"); + send_stage2_submit_data(header, 0, 0, 0); break; default: @@ -71,14 +78,16 @@ int handleUSBControlRequest(struct usbip_stage2_header *header) break; } break; - case 0x02: + case 0x02: // ignore.. switch (header->u.cmd_submit.request.bRequest) { case USB_REQ_CLEAR_FEATURE: - /* code */ + os_printf("* CLEAR FEATURE\r\n"); + send_stage2_submit_data(header, 0, 0, 0); break; case USB_REQ_SET_FEATURE: - /* code */ + os_printf("* SET INTERFACE\r\n"); + send_stage2_submit_data(header, 0, 0, 0); break; default: @@ -88,17 +97,19 @@ int handleUSBControlRequest(struct usbip_stage2_header *header) } break; - case 0x80: + case 0x80: // *IMPORTANT* switch (header->u.cmd_submit.request.bRequest) { case USB_REQ_GET_CONFIGURATION: - handleGetDescriptor(header); + os_printf("* GET CONIFGTRATION\r\n"); + send_stage2_submit_data(header, 0, 0, 0); break; case USB_REQ_GET_DESCRIPTOR: - /* code */ + handleGetDescriptor(header); ////TODO: device_qualifier break; case USB_REQ_GET_STATUS: - /* code */ + os_printf("* GET STATUS\r\n"); + send_stage2_submit_data(header, 0, 0, 0); break; default: os_printf("USB unknown request, bmRequestType:%d,bRequest:%d\r\n", @@ -106,17 +117,20 @@ int handleUSBControlRequest(struct usbip_stage2_header *header) break; } break; - case 0x81: + case 0x81: // ignore... switch (header->u.cmd_submit.request.bRequest) { case USB_REQ_GET_INTERFACE: - /* code */ + os_printf("* GET INTERFACE\r\n"); + send_stage2_submit_data(header, 0, 0, 0); break; case USB_REQ_SET_SYNCH_FRAME: - /* code */ + os_printf("* SET SYNCH FRAME\r\n"); + send_stage2_submit_data(header, 0, 0, 0); break; case USB_REQ_GET_STATUS: - /* code */ + os_printf("* GET STATUS\r\n"); + send_stage2_submit_data(header, 0, 0, 0); break; default: @@ -126,11 +140,12 @@ int handleUSBControlRequest(struct usbip_stage2_header *header) } break; - case 0x82: + case 0x82: // ignore... switch (header->u.cmd_submit.request.bRequest) { case USB_REQ_GET_STATUS: - /* code */ + os_printf("* GET STATUS\r\n"); + send_stage2_submit_data(header, 0, 0, 0); break; default: @@ -139,7 +154,6 @@ int handleUSBControlRequest(struct usbip_stage2_header *header) break; } break; - ///////// default: os_printf("USB unknown request, bmRequestType:%d,bRequest:%d\r\n", @@ -148,8 +162,8 @@ int handleUSBControlRequest(struct usbip_stage2_header *header) } } -////TODO: fill this -static void handleGetDescriptor(struct usbip_stage2_header *header) +////TODO: BOS descriptor +static void handleGetDescriptor(usbip_stage2_header *header) { // 9.4.3 Get Descriptor switch (header->u.cmd_submit.request.wValue.u8hi) @@ -168,7 +182,6 @@ static void handleGetDescriptor(struct usbip_stage2_header *header) send_stage2_submit(header, 0, header->u.cmd_submit.data_length); send(kSock, kUSBd0ConfigDescriptor, sizeof(kUSBd0ConfigDescriptor), 0); - } else { @@ -177,18 +190,19 @@ static void handleGetDescriptor(struct usbip_stage2_header *header) send_stage2_submit(header, 0, header->u.cmd_submit.data_length); send(kSock, kUSBd0ConfigDescriptor, sizeof(kUSBd0ConfigDescriptor), 0); send(kSock, kUSBd0InterfaceDescriptor, sizeof(kUSBd0InterfaceDescriptor), 0); - } break; case USB_DT_STRING: os_printf("* GET 0x03 STRING DESCRIPTOR\r\n"); - if (header->u.cmd_submit.request.wValue.u8lo == 0) { + if (header->u.cmd_submit.request.wValue.u8lo == 0) + { os_printf("** REQUESTED list of supported languages\r\n"); send_stage2_submit_data(header, 0, kLangDescriptor, sizeof(kLangDescriptor)); } - else{ + else + { os_printf("***Unsupported operation***\r\n"); } break; @@ -227,7 +241,6 @@ static void handleGetDescriptor(struct usbip_stage2_header *header) send_stage2_submit(header, 0, 0); break; - default: os_printf("USB unknown Get Descriptor requested:%d", header->u.cmd_submit.request.wValue.u8lo); break; diff --git a/components/USBIP/USBd_config.c b/components/USBIP/USBd_config.c index e0f57ab..c266c16 100644 --- a/components/USBIP/USBd_config.c +++ b/components/USBIP/USBd_config.c @@ -26,7 +26,8 @@ const uint8_t kUSBd0DeviceDescriptor[0x12] = { 0x12, // bLength USB_DT_DEVICE, // bDescriptorType (constant) - USBShort(0x0200), // bcdUSB (2.00) + USBShort(0x0210), // bcdUSB + ////TODO: Is it also available elsewhere? // We need to use a device other than the USB-IF standard, set to 0x00 0x00, // bDeviceClass diff --git a/components/USBIP/usbip_defs.h b/components/USBIP/usbip_defs.h index c977914..84904c6 100644 --- a/components/USBIP/usbip_defs.h +++ b/components/USBIP/usbip_defs.h @@ -197,13 +197,13 @@ typedef struct */ typedef struct { - struct usbip_stage2_header_basic base; + usbip_stage2_header_basic base; union { - struct usbip_stage2_header_cmd_submit cmd_submit; - struct usbip_stage2_header_ret_submit ret_submit; - struct usbip_stage2_header_cmd_unlink cmd_unlink; - struct usbip_stage2_header_ret_unlink ret_unlink; + usbip_stage2_header_cmd_submit cmd_submit; + usbip_stage2_header_ret_submit ret_submit; + usbip_stage2_header_cmd_unlink cmd_unlink; + usbip_stage2_header_ret_unlink ret_unlink; } u; } __attribute__((packed)) usbip_stage2_header; diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 6619874..b961c72 100644 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1,4 +1,4 @@ -set(COMPONENT_SRCS "main.c timer.c tcp_server.c usbip_server.c") +set(COMPONENT_SRCS "main.c timer.c tcp_server.c usbip_server.c DAP_handle.c") set(COMPONENT_ADD_INCLUDEDIRS ". $ENV{IDF_PATH}/components/esp8266/include/esp8266/ ../components/USBIP") register_component() diff --git a/main/DAP_handle.c b/main/DAP_handle.c new file mode 100644 index 0000000..98d26c8 --- /dev/null +++ b/main/DAP_handle.c @@ -0,0 +1,45 @@ +/** + * @file DAP_handle.c + * @brief Handle DAP packets and transaction push + * @version 0.1 + * @date 2020-01-25 + * + * @copyright Copyright (c) 2020 + * + */ + +#include +#include "usbip_server.h" +#include "DAP_handle.h" +#include "DAP.h" + +////TODO: Merge this +#define DAP_PACKET_SIZE 512 + + +uint8_t data_out[DAP_PACKET_SIZE]; +int respond = 0; + + +void handle_dap_data_request(usbip_stage2_header *header) +{ + uint8_t * data_in = (uint8_t *)header; + data_in = &(data_in[sizeof(usbip_stage2_header)]); + // Point to the beginning of the URB packet + respond = DAP_ProcessCommand((uint8_t *)data_in, (uint8_t *)data_out); + send_stage2_submit(header, 0, 0); + +} +void handle_dap_data_response(usbip_stage2_header *header) +{ + if (respond) { + 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); + } +} \ No newline at end of file diff --git a/main/DAP_handle.h b/main/DAP_handle.h new file mode 100644 index 0000000..903bc58 --- /dev/null +++ b/main/DAP_handle.h @@ -0,0 +1,8 @@ +#ifndef __DAP_HANDLE_H__ +#define __DAP_HANDLE_H__ + +#include "usbip_defs.h" + +void handle_dap_data_request(usbip_stage2_header *header); +void handle_dap_data_response(usbip_stage2_header *header); +#endif \ No newline at end of file diff --git a/main/usbip_server.c b/main/usbip_server.c index b18d235..034975d 100644 --- a/main/usbip_server.c +++ b/main/usbip_server.c @@ -121,7 +121,6 @@ static void send_device_list() static void send_device_info() { - //// TODO:fill this os_printf("Sending device info..."); usbip_stage1_usb_device device; @@ -172,7 +171,7 @@ static void send_interface_info() int emulate(uint8_t *buffer, uint32_t length) { // usbip_stage2_header header; - int command = read_stage2_command((usbip_stage2_header *)buffer); ////TODO: fill this + int command = read_stage2_command((usbip_stage2_header *)buffer, length); ////TODO: fill this if (command < 0) { return -1; @@ -272,13 +271,13 @@ static int handle_submit(usbip_stage2_header *header) case 0x01: if (header->base.direction == 0) { - // Serial.println("EP 01 DATA FROM HOST"); - handle_data_request(header); + // os_printf("EP 01 DATA FROM HOST"); + handle_dap_data_request(header); } else { - // Serial.println("EP 01 DATA TO HOST"); - handle_data_response(header); + // os_printf("EP 01 DATA TO HOST"); + handle_dap_data_response(header); } break;