0
0
Fork 0

feat: URB packet processing & DAP command push

This commit is contained in:
windowsair 2020-01-25 21:45:24 +08:00
parent 957cc01656
commit 529e0a375f
8 changed files with 120 additions and 54 deletions

View File

@ -100,7 +100,7 @@ This information includes:
/// This configuration settings is used to optimize the communication performance with the /// 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 /// 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). /// 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. /// Indicate that UART Serial Wire Output (SWO) trace is available.
/// This information is returned by the command \ref DAP_Info as part of <b>Capabilities</b>. /// This information is returned by the command \ref DAP_Info as part of <b>Capabilities</b>.
@ -109,7 +109,7 @@ This information includes:
/// Maximum SWO UART Baudrate. /// Maximum SWO UART Baudrate.
#define SWO_UART_MAX_BAUDRATE 50000000U ///< SWO UART Maximum Baudrate in Hz. #define SWO_UART_MAX_BAUDRATE 50000000U ///< SWO UART Maximum Baudrate in Hz.
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<< 5MHz // <<<<<<<<<<<<<<<<<<<<<<<<<<<<< 5MHz
// TODO: uncertain value //// TODO: uncertain value
/// Indicate that Manchester Serial Wire Output (SWO) trace is available. /// Indicate that Manchester Serial Wire Output (SWO) trace is available.
/// This information is returned by the command \ref DAP_Info as part of <b>Capabilities</b>. /// This information is returned by the command \ref DAP_Info as part of <b>Capabilities</b>.
@ -144,7 +144,7 @@ This information includes:
*/ */
__STATIC_INLINE uint8_t DAP_GetVendorString(char *str) __STATIC_INLINE uint8_t DAP_GetVendorString(char *str)
{ {
//TODO: fill this ////TODO: fill this
// In fact, Keil can get the corresponding information through USB // In fact, Keil can get the corresponding information through USB
// without filling in this information. // without filling in this information.
(void)str; (void)str;
@ -296,7 +296,7 @@ __STATIC_INLINE void PORT_OFF(void)
*/ */
__STATIC_FORCEINLINE uint32_t PIN_SWCLK_TCK_IN(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); 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) __STATIC_FORCEINLINE void PIN_nTRST_OUT(uint32_t bit)
{ {
//TODO : What does this mean? ? ? ////TODO: What does this mean? ? ?
if ((bit & 1U) == 1) if ((bit & 1U) == 1)
{ {
//set bit //set bit
@ -512,7 +512,7 @@ __STATIC_FORCEINLINE uint32_t PIN_nRESET_IN(void)
*/ */
__STATIC_FORCEINLINE void PIN_nRESET_OUT(uint32_t bit) __STATIC_FORCEINLINE void PIN_nRESET_OUT(uint32_t bit)
{ {
//TODO : What does this mean? ? ? ////TODO: What does this mean? ? ?
if ((bit & 1U) == 1) if ((bit & 1U) == 1)
{ {
//set bit //set bit

View File

@ -1,6 +1,6 @@
/** /**
* @file USB_handle.c * @file USB_handle.c
* @brief Handle all Standard Device Requests * @brief Handle all Standard Device Requests on endpoint 0
* @version 0.1 * @version 0.1
* @date 2020-01-23 * @date 2020-01-23
* *
@ -17,34 +17,38 @@
#include "usbip_server.h" #include "usbip_server.h"
#include "usb_defs.h" #include "usb_defs.h"
// handle functions // handle functions
static void handleGetDescriptor(struct usbip_stage2_header *header); static void handleGetDescriptor(usbip_stage2_header *header);
////TODO: fill this ////TODO: fill this
int handleUSBControlRequest(struct usbip_stage2_header *header) int handleUSBControlRequest(usbip_stage2_header *header)
{ {
// Table 9-3. Standard Device Requests // Table 9-3. Standard Device Requests
switch (header->u.cmd_submit.request.bmRequestType) switch (header->u.cmd_submit.request.bmRequestType)
{ {
case 0x00: case 0x00: // ignore..
switch (header->u.cmd_submit.request.bRequest) switch (header->u.cmd_submit.request.bRequest)
{ {
case USB_REQ_CLEAR_FEATURE: case USB_REQ_CLEAR_FEATURE:
/* code */ os_printf("* CLEAR FEATURE\r\n");
send_stage2_submit_data(header, 0, 0, 0);
break; break;
case USB_REQ_SET_FEATURE: case USB_REQ_SET_FEATURE:
/* code */ os_printf("* SET FEATURE\r\n");
send_stage2_submit_data(header, 0, 0, 0);
break; break;
case USB_REQ_SET_ADDRESS: case USB_REQ_SET_ADDRESS:
/* code */ os_printf("* SET ADDRESS\r\n");
send_stage2_submit_data(header, 0, 0, 0);
break; break;
case USB_REQ_SET_DESCRIPTOR: case USB_REQ_SET_DESCRIPTOR:
/* code */ os_printf("* SET DESCRIPTOR\r\n");
send_stage2_submit_data(header, 0, 0, 0);
break; break;
case USB_REQ_SET_CONFIGURATION: case USB_REQ_SET_CONFIGURATION:
/* code */ os_printf("* SET CONFIGURATION\r\n");
send_stage2_submit_data(header, 0, 0, 0);
break; break;
default: default:
os_printf("USB unknown request, bmRequestType:%d,bRequest:%d\r\n", os_printf("USB unknown request, bmRequestType:%d,bRequest:%d\r\n",
@ -52,17 +56,20 @@ int handleUSBControlRequest(struct usbip_stage2_header *header)
break; break;
} }
break; break;
case 0x01: case 0x01: // ignore...
switch (header->u.cmd_submit.request.bRequest) switch (header->u.cmd_submit.request.bRequest)
{ {
case USB_REQ_CLEAR_FEATURE: case USB_REQ_CLEAR_FEATURE:
/* code */ os_printf("* CLEAR FEATURE\r\n");
send_stage2_submit_data(header, 0, 0, 0);
break; break;
case USB_REQ_SET_FEATURE: case USB_REQ_SET_FEATURE:
/* code */ os_printf("* SET FEATURE\r\n");
send_stage2_submit_data(header, 0, 0, 0);
break; break;
case USB_REQ_SET_INTERFACE: case USB_REQ_SET_INTERFACE:
/* code */ os_printf("* SET INTERFACE\r\n");
send_stage2_submit_data(header, 0, 0, 0);
break; break;
default: default:
@ -71,14 +78,16 @@ int handleUSBControlRequest(struct usbip_stage2_header *header)
break; break;
} }
break; break;
case 0x02: case 0x02: // ignore..
switch (header->u.cmd_submit.request.bRequest) switch (header->u.cmd_submit.request.bRequest)
{ {
case USB_REQ_CLEAR_FEATURE: case USB_REQ_CLEAR_FEATURE:
/* code */ os_printf("* CLEAR FEATURE\r\n");
send_stage2_submit_data(header, 0, 0, 0);
break; break;
case USB_REQ_SET_FEATURE: case USB_REQ_SET_FEATURE:
/* code */ os_printf("* SET INTERFACE\r\n");
send_stage2_submit_data(header, 0, 0, 0);
break; break;
default: default:
@ -88,17 +97,19 @@ int handleUSBControlRequest(struct usbip_stage2_header *header)
} }
break; break;
case 0x80: case 0x80: // *IMPORTANT*
switch (header->u.cmd_submit.request.bRequest) switch (header->u.cmd_submit.request.bRequest)
{ {
case USB_REQ_GET_CONFIGURATION: case USB_REQ_GET_CONFIGURATION:
handleGetDescriptor(header); os_printf("* GET CONIFGTRATION\r\n");
send_stage2_submit_data(header, 0, 0, 0);
break; break;
case USB_REQ_GET_DESCRIPTOR: case USB_REQ_GET_DESCRIPTOR:
/* code */ handleGetDescriptor(header); ////TODO: device_qualifier
break; break;
case USB_REQ_GET_STATUS: case USB_REQ_GET_STATUS:
/* code */ os_printf("* GET STATUS\r\n");
send_stage2_submit_data(header, 0, 0, 0);
break; break;
default: default:
os_printf("USB unknown request, bmRequestType:%d,bRequest:%d\r\n", os_printf("USB unknown request, bmRequestType:%d,bRequest:%d\r\n",
@ -106,17 +117,20 @@ int handleUSBControlRequest(struct usbip_stage2_header *header)
break; break;
} }
break; break;
case 0x81: case 0x81: // ignore...
switch (header->u.cmd_submit.request.bRequest) switch (header->u.cmd_submit.request.bRequest)
{ {
case USB_REQ_GET_INTERFACE: case USB_REQ_GET_INTERFACE:
/* code */ os_printf("* GET INTERFACE\r\n");
send_stage2_submit_data(header, 0, 0, 0);
break; break;
case USB_REQ_SET_SYNCH_FRAME: case USB_REQ_SET_SYNCH_FRAME:
/* code */ os_printf("* SET SYNCH FRAME\r\n");
send_stage2_submit_data(header, 0, 0, 0);
break; break;
case USB_REQ_GET_STATUS: case USB_REQ_GET_STATUS:
/* code */ os_printf("* GET STATUS\r\n");
send_stage2_submit_data(header, 0, 0, 0);
break; break;
default: default:
@ -126,11 +140,12 @@ int handleUSBControlRequest(struct usbip_stage2_header *header)
} }
break; break;
case 0x82: case 0x82: // ignore...
switch (header->u.cmd_submit.request.bRequest) switch (header->u.cmd_submit.request.bRequest)
{ {
case USB_REQ_GET_STATUS: case USB_REQ_GET_STATUS:
/* code */ os_printf("* GET STATUS\r\n");
send_stage2_submit_data(header, 0, 0, 0);
break; break;
default: default:
@ -139,7 +154,6 @@ int handleUSBControlRequest(struct usbip_stage2_header *header)
break; break;
} }
break; break;
/////////
default: default:
os_printf("USB unknown request, bmRequestType:%d,bRequest:%d\r\n", 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 ////TODO: BOS descriptor
static void handleGetDescriptor(struct usbip_stage2_header *header) static void handleGetDescriptor(usbip_stage2_header *header)
{ {
// 9.4.3 Get Descriptor // 9.4.3 Get Descriptor
switch (header->u.cmd_submit.request.wValue.u8hi) 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_stage2_submit(header, 0, header->u.cmd_submit.data_length);
send(kSock, kUSBd0ConfigDescriptor, sizeof(kUSBd0ConfigDescriptor), 0); send(kSock, kUSBd0ConfigDescriptor, sizeof(kUSBd0ConfigDescriptor), 0);
} }
else 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_stage2_submit(header, 0, header->u.cmd_submit.data_length);
send(kSock, kUSBd0ConfigDescriptor, sizeof(kUSBd0ConfigDescriptor), 0); send(kSock, kUSBd0ConfigDescriptor, sizeof(kUSBd0ConfigDescriptor), 0);
send(kSock, kUSBd0InterfaceDescriptor, sizeof(kUSBd0InterfaceDescriptor), 0); send(kSock, kUSBd0InterfaceDescriptor, sizeof(kUSBd0InterfaceDescriptor), 0);
} }
break; break;
case USB_DT_STRING: case USB_DT_STRING:
os_printf("* GET 0x03 STRING DESCRIPTOR\r\n"); 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"); os_printf("** REQUESTED list of supported languages\r\n");
send_stage2_submit_data(header, 0, kLangDescriptor, sizeof(kLangDescriptor)); send_stage2_submit_data(header, 0, kLangDescriptor, sizeof(kLangDescriptor));
} }
else{ else
{
os_printf("***Unsupported operation***\r\n"); os_printf("***Unsupported operation***\r\n");
} }
break; break;
@ -227,7 +241,6 @@ static void handleGetDescriptor(struct usbip_stage2_header *header)
send_stage2_submit(header, 0, 0); send_stage2_submit(header, 0, 0);
break; break;
default: default:
os_printf("USB unknown Get Descriptor requested:%d", header->u.cmd_submit.request.wValue.u8lo); os_printf("USB unknown Get Descriptor requested:%d", header->u.cmd_submit.request.wValue.u8lo);
break; break;

View File

@ -26,7 +26,8 @@ const uint8_t kUSBd0DeviceDescriptor[0x12] =
{ {
0x12, // bLength 0x12, // bLength
USB_DT_DEVICE, // bDescriptorType (constant) 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 // We need to use a device other than the USB-IF standard, set to 0x00
0x00, // bDeviceClass 0x00, // bDeviceClass

View File

@ -197,13 +197,13 @@ typedef struct
*/ */
typedef struct typedef struct
{ {
struct usbip_stage2_header_basic base; usbip_stage2_header_basic base;
union { union {
struct usbip_stage2_header_cmd_submit cmd_submit; usbip_stage2_header_cmd_submit cmd_submit;
struct usbip_stage2_header_ret_submit ret_submit; usbip_stage2_header_ret_submit ret_submit;
struct usbip_stage2_header_cmd_unlink cmd_unlink; usbip_stage2_header_cmd_unlink cmd_unlink;
struct usbip_stage2_header_ret_unlink ret_unlink; usbip_stage2_header_ret_unlink ret_unlink;
} u; } u;
} __attribute__((packed)) usbip_stage2_header; } __attribute__((packed)) usbip_stage2_header;

View File

@ -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") set(COMPONENT_ADD_INCLUDEDIRS ". $ENV{IDF_PATH}/components/esp8266/include/esp8266/ ../components/USBIP")
register_component() register_component()

45
main/DAP_handle.c Normal file
View File

@ -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 <stdint.h>
#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);
}
}

8
main/DAP_handle.h Normal file
View File

@ -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

View File

@ -121,7 +121,6 @@ static void send_device_list()
static void send_device_info() static void send_device_info()
{ {
//// TODO:fill this
os_printf("Sending device info..."); os_printf("Sending device info...");
usbip_stage1_usb_device device; usbip_stage1_usb_device device;
@ -172,7 +171,7 @@ static void send_interface_info()
int emulate(uint8_t *buffer, uint32_t length) int emulate(uint8_t *buffer, uint32_t length)
{ {
// usbip_stage2_header header; // 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) if (command < 0)
{ {
return -1; return -1;
@ -272,13 +271,13 @@ static int handle_submit(usbip_stage2_header *header)
case 0x01: case 0x01:
if (header->base.direction == 0) if (header->base.direction == 0)
{ {
// Serial.println("EP 01 DATA FROM HOST"); // os_printf("EP 01 DATA FROM HOST");
handle_data_request(header); handle_dap_data_request(header);
} }
else else
{ {
// Serial.println("EP 01 DATA TO HOST"); // os_printf("EP 01 DATA TO HOST");
handle_data_response(header); handle_dap_data_response(header);
} }
break; break;