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
/// 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 <b>Capabilities</b>.
@ -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 <b>Capabilities</b>.
@ -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

View File

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

View File

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

View File

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

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")
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()
{
//// 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;