diff --git a/components/DAP/config/DAP_config.h b/components/DAP/config/DAP_config.h
index a61956e..226145b 100644
--- a/components/DAP/config/DAP_config.h
+++ b/components/DAP/config/DAP_config.h
@@ -34,11 +34,42 @@
#include "gpio.h"
#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
@@ -63,7 +94,7 @@ This information includes:
/// Processor Clock of the Cortex-M MCU used in the Debug Unit.
/// This value is used to calculate the SWD/JTAG clock speed.
-#define CPU_CLOCK 160000000U ///< Specifies the CPU Clock in Hz.
+#define CPU_CLOCK 160000000 ///< Specifies the CPU Clock in Hz.
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<160MHz
/// Number of processor cycles for I/O Port write operations.
@@ -80,7 +111,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 1 ///< JTAG Mode: 1 = available, 0 = not available.
+#define DAP_JTAG 0 ///< 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.
@@ -100,7 +131,7 @@ 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 512U ///< Specifies Packet Size in bytes.
+#define DAP_PACKET_SIZE 64U ///< Specifies Packet Size in bytes.
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<< 512 for High-speed USB WinUSB.
/// Maximum Package Buffers for Command and Response data.
@@ -111,22 +142,22 @@ This information includes:
/// Indicate that UART Serial Wire Output (SWO) trace is available.
/// This information is returned by the command \ref DAP_Info as part of Capabilities.
-#define SWO_UART 1 ///< SWO UART: 1 = available, 0 = not available.
+#define SWO_UART 0 ///< SWO UART: 1 = available, 0 = not available.
/// Maximum SWO UART Baudrate.
-#define SWO_UART_MAX_BAUDRATE (115200U*40U) ///< SWO UART Maximum Baudrate in Hz.
+#define SWO_UART_MAX_BAUDRATE (115200U * 40U) ///< SWO UART Maximum Baudrate in Hz.
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<< 5MHz
//// 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.
-#define SWO_MANCHESTER 1 ///< SWO Manchester: 1 = available, 0 = not available.
+#define SWO_MANCHESTER 0 ///< SWO Manchester: 1 = available, 0 = not available.
/// SWO Trace Buffer Size.
#define SWO_BUFFER_SIZE 4096U ///< SWO Trace Buffer Size in bytes (must be 2^n).
/// SWO Streaming Trace.
-#define SWO_STREAM 1 ///< SWO Streaming Trace: 1 = available, 0 = not available.
+#define SWO_STREAM 0 ///< SWO Streaming Trace: 1 = available, 0 = not available.
/// Clock frequency of the Test Domain Timer. Timer value is returned with \ref TIMESTAMP_GET.
#define TIMESTAMP_CLOCK 5000000U ///< Timestamp clock in Hz (0 = timestamps not supported).
@@ -168,7 +199,7 @@ __STATIC_INLINE uint8_t DAP_GetVendorString(char *str)
__STATIC_INLINE uint8_t DAP_GetProductString(char *str)
{
//(void)str;
- strcpy(str, "CMSIS-DAP v2");
+ strcpy(str, "CMSIS-DAP v2");
return (sizeof("CMSIS-DAP v2"));
}
@@ -180,7 +211,7 @@ __STATIC_INLINE uint8_t DAP_GetProductString(char *str)
*/
__STATIC_INLINE uint8_t DAP_GetSerNumString(char *str)
{
- strcpy(str, "1234");
+ strcpy(str, "1234");
return (sizeof("1234"));
}
@@ -189,14 +220,14 @@ __STATIC_INLINE uint8_t DAP_GetSerNumString(char *str)
// Modify your pins here
// ATTENTION: DO NOT USE RTC GPIO16
-#define PIN_SWDIO 2
-#define PIN_SWCLK 0
-#define PIN_TDO 4
-#define PIN_TDI 5
-#define PIN_nTRST 1 // optional
-#define PIN_nRESET 16
+#define PIN_SWDIO 4
+#define PIN_SWCLK 5
+#define PIN_TDO 13
+#define PIN_TDI 12
+#define PIN_nTRST 0 // optional
+#define PIN_nRESET 14
// LED_BUILTIN
-#define PIN_LED_CONNECTED 13
+#define PIN_LED_CONNECTED 2
// LED_BUILTIN
#define PIN_LED_RUNNING 15
@@ -244,16 +275,49 @@ of the same I/O port. The following SWDIO I/O Pin functions are provided:
*/
__STATIC_INLINE void PORT_JTAG_SETUP(void)
{
- gpio_set_direction(PIN_SWCLK, GPIO_MODE_OUTPUT);
- gpio_set_direction(PIN_SWDIO, GPIO_MODE_OUTPUT);
+ gpio_pin_reg_t pin_reg;
- gpio_set_direction(PIN_TDO, GPIO_MODE_DEF_INPUT);
- gpio_set_direction(PIN_TDI, GPIO_MODE_OUTPUT);
+ // gpio_set_direction(PIN_SWCLK, GPIO_MODE_OUTPUT);
+ // gpio_set_direction(PIN_SWDIO, GPIO_MODE_OUTPUT);
+ GPIO.enable_w1ts |= (0x1 << PIN_SWCLK);
+ GPIO.pin[PIN_SWCLK].driver = 0;
+ pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(PIN_SWCLK));
+ pin_reg.pullup = 0;
+ WRITE_PERI_REG(GPIO_PIN_REG(PIN_SWCLK), pin_reg.val);
+ GPIO.enable_w1ts |= (0x1 << PIN_SWDIO);
+ GPIO.pin[PIN_SWDIO].driver = 0;
+ pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(PIN_SWDIO));
+ pin_reg.pullup = 0;
+ WRITE_PERI_REG(GPIO_PIN_REG(PIN_SWDIO), pin_reg.val);
- gpio_set_direction(PIN_nTRST, GPIO_MODE_OUTPUT_OD);
- gpio_set_direction(PIN_nRESET, GPIO_MODE_OUTPUT_OD);
- gpio_set_pull_mode(PIN_nTRST, GPIO_PULLUP_ONLY);
- gpio_set_pull_mode(PIN_nRESET, GPIO_PULLUP_ONLY);
+ // gpio_set_direction(PIN_TDO, GPIO_MODE_DEF_INPUT);
+ GPIO.enable_w1tc |= (0x1 << PIN_TDO);
+ GPIO.pin[PIN_TDO].driver = 0;
+ pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(PIN_TDO));
+ pin_reg.pullup = 0;
+ WRITE_PERI_REG(GPIO_PIN_REG(PIN_TDO), pin_reg.val);
+ // gpio_set_direction(PIN_TDI, GPIO_MODE_OUTPUT);
+ GPIO.enable_w1ts |= (0x1 << PIN_TDI);
+ GPIO.pin[PIN_TDI].driver = 0;
+ pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(PIN_TDI));
+ pin_reg.pullup = 0;
+ WRITE_PERI_REG(GPIO_PIN_REG(PIN_TDI), pin_reg.val);
+
+ // gpio_set_direction(PIN_nTRST, GPIO_MODE_OUTPUT_OD);
+ // gpio_set_direction(PIN_nRESET, GPIO_MODE_OUTPUT_OD);
+ GPIO.enable_w1tc |= (0x1 << PIN_nTRST);
+ GPIO.pin[PIN_nTRST].driver = 1;
+ GPIO.enable_w1tc |= (0x1 << PIN_nRESET);
+ GPIO.pin[PIN_nRESET].driver = 1;
+
+ // gpio_set_pull_mode(PIN_nTRST, GPIO_PULLUP_ONLY);
+ // gpio_set_pull_mode(PIN_nRESET, GPIO_PULLUP_ONLY);
+ pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(PIN_nTRST));
+ pin_reg.pullup = 1;
+ WRITE_PERI_REG(GPIO_PIN_REG(PIN_nTRST), pin_reg.val);
+ pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(PIN_nRESET));
+ pin_reg.pullup = 1;
+ WRITE_PERI_REG(GPIO_PIN_REG(PIN_nRESET), pin_reg.val);
}
/**
@@ -265,16 +329,49 @@ __STATIC_INLINE void PORT_JTAG_SETUP(void)
*/
__STATIC_INLINE void PORT_SWD_SETUP(void)
{
- gpio_set_direction(PIN_SWCLK, GPIO_MODE_OUTPUT);
- gpio_set_direction(PIN_SWDIO, GPIO_MODE_OUTPUT);
+ gpio_pin_reg_t pin_reg;
- gpio_set_direction(PIN_TDO, GPIO_MODE_DEF_INPUT);
- gpio_set_direction(PIN_TDI, GPIO_MODE_OUTPUT);
+ // gpio_set_direction(PIN_SWCLK, GPIO_MODE_OUTPUT);
+ // gpio_set_direction(PIN_SWDIO, GPIO_MODE_OUTPUT);
+ GPIO.enable_w1ts |= (0x1 << PIN_SWCLK);
+ GPIO.pin[PIN_SWCLK].driver = 0;
+ pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(PIN_SWCLK));
+ pin_reg.pullup = 0;
+ WRITE_PERI_REG(GPIO_PIN_REG(PIN_SWCLK), pin_reg.val);
+ GPIO.enable_w1ts |= (0x1 << PIN_SWDIO);
+ GPIO.pin[PIN_SWDIO].driver = 0;
+ pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(PIN_SWDIO));
+ pin_reg.pullup = 0;
+ WRITE_PERI_REG(GPIO_PIN_REG(PIN_SWDIO), pin_reg.val);
- gpio_set_direction(PIN_nTRST, GPIO_MODE_OUTPUT_OD);
- gpio_set_direction(PIN_nRESET, GPIO_MODE_OUTPUT_OD);
- gpio_set_pull_mode(PIN_nTRST, GPIO_PULLUP_ONLY);
- gpio_set_pull_mode(PIN_nRESET, GPIO_PULLUP_ONLY);
+ // gpio_set_direction(PIN_TDO, GPIO_MODE_DEF_INPUT);
+ GPIO.enable_w1tc |= (0x1 << PIN_TDO);
+ GPIO.pin[PIN_TDO].driver = 0;
+ pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(PIN_TDO));
+ pin_reg.pullup = 0;
+ WRITE_PERI_REG(GPIO_PIN_REG(PIN_TDO), pin_reg.val);
+ // gpio_set_direction(PIN_TDI, GPIO_MODE_OUTPUT);
+ GPIO.enable_w1ts |= (0x1 << PIN_TDI);
+ GPIO.pin[PIN_TDI].driver = 0;
+ pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(PIN_TDI));
+ pin_reg.pullup = 0;
+ WRITE_PERI_REG(GPIO_PIN_REG(PIN_TDI), pin_reg.val);
+
+ // gpio_set_direction(PIN_nTRST, GPIO_MODE_OUTPUT_OD);
+ // gpio_set_direction(PIN_nRESET, GPIO_MODE_OUTPUT_OD);
+ GPIO.enable_w1tc |= (0x1 << PIN_nTRST);
+ GPIO.pin[PIN_nTRST].driver = 1;
+ GPIO.enable_w1tc |= (0x1 << PIN_nRESET);
+ GPIO.pin[PIN_nRESET].driver = 1;
+
+ // gpio_set_pull_mode(PIN_nTRST, GPIO_PULLUP_ONLY);
+ // gpio_set_pull_mode(PIN_nRESET, GPIO_PULLUP_ONLY);
+ pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(PIN_nTRST));
+ pin_reg.pullup = 1;
+ WRITE_PERI_REG(GPIO_PIN_REG(PIN_nTRST), pin_reg.val);
+ pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(PIN_nRESET));
+ pin_reg.pullup = 1;
+ WRITE_PERI_REG(GPIO_PIN_REG(PIN_nRESET), pin_reg.val);
}
/**
@@ -286,14 +383,31 @@ __STATIC_INLINE void PORT_SWD_SETUP(void)
__STATIC_INLINE void PORT_OFF(void)
{
// Will be called when the DAP disconnected
- gpio_set_direction(PIN_SWCLK, GPIO_MODE_DEF_DISABLE);
- gpio_set_direction(PIN_SWDIO, GPIO_MODE_DEF_DISABLE);
+ // gpio_set_direction(PIN_SWCLK, GPIO_MODE_DEF_DISABLE);
+ // gpio_set_direction(PIN_SWDIO, GPIO_MODE_DEF_DISABLE);
- gpio_set_direction(PIN_TDO, GPIO_MODE_DEF_DISABLE);
- gpio_set_direction(PIN_TDI, GPIO_MODE_DEF_DISABLE);
+ // gpio_set_direction(PIN_TDO, GPIO_MODE_DEF_DISABLE);
+ // gpio_set_direction(PIN_TDI, GPIO_MODE_DEF_DISABLE);
- gpio_set_direction(PIN_nTRST, GPIO_MODE_DEF_DISABLE);
- gpio_set_direction(PIN_nRESET, GPIO_MODE_DEF_DISABLE);
+ // gpio_set_direction(PIN_nTRST, GPIO_MODE_DEF_DISABLE);
+ // gpio_set_direction(PIN_nRESET, GPIO_MODE_DEF_DISABLE);
+ GPIO.pin[PIN_SWCLK].driver = 0;
+ GPIO.enable_w1tc |= (0x1 << PIN_SWCLK);
+
+ GPIO.pin[PIN_SWDIO].driver = 0;
+ GPIO.enable_w1tc |= (0x1 << PIN_SWDIO);
+
+ GPIO.pin[PIN_TDO].driver = 0;
+ GPIO.enable_w1tc |= (0x1 << PIN_TDO);
+
+ GPIO.pin[PIN_TDI].driver = 0;
+ GPIO.enable_w1tc |= (0x1 << PIN_TDI);
+
+ GPIO.pin[PIN_nTRST].driver = 0;
+ GPIO.enable_w1tc |= (0x1 << PIN_nTRST);
+
+ GPIO.pin[PIN_nRESET].driver = 0;
+ GPIO.enable_w1tc |= (0x1 << PIN_nRESET);
}
// SWCLK/TCK I/O pin -------------------------------------
@@ -306,7 +420,7 @@ __STATIC_INLINE void PORT_OFF(void)
__STATIC_FORCEINLINE uint32_t PIN_SWCLK_TCK_IN(void)
{
////TODO: can we set to 0?
- return ((GPIO.in >> PIN_SWCLK) & 0x1);
+ return 0;
}
/**
@@ -338,7 +452,7 @@ __STATIC_FORCEINLINE void PIN_SWCLK_TCK_CLR(void)
*/
__STATIC_FORCEINLINE uint32_t PIN_SWDIO_TMS_IN(void)
{
- return ((GPIO.in >> PIN_SWDIO) & 0x1);
+ return ((GPIO.in >> PIN_SWDIO) & 0x1) ? 1 : 0;
}
/**
@@ -368,7 +482,7 @@ __STATIC_FORCEINLINE void PIN_SWDIO_TMS_CLR(void)
*/
__STATIC_FORCEINLINE uint32_t PIN_SWDIO_IN(void)
{
- return ((GPIO.in >> PIN_SWDIO) & 0x1);
+ return ((GPIO.in >> PIN_SWDIO) & 0x1) ? 1 : 0;
}
/**
@@ -388,11 +502,13 @@ __STATIC_FORCEINLINE void PIN_SWDIO_OUT(uint32_t bit)
{
//set bit
GPIO.out_w1ts |= (0x1 << PIN_SWDIO);
+
}
else
{
//reset bit
GPIO.out_w1tc |= (0x1 << PIN_SWDIO);
+
}
}
@@ -407,6 +523,7 @@ __STATIC_FORCEINLINE void PIN_SWDIO_OUT_ENABLE(void)
// set \ref gpio_set_direction -> OUTPUT
GPIO.enable_w1ts |= (0x1 << PIN_SWDIO);
+ GPIO.pin[PIN_SWDIO].driver = 0;
}
/**
@@ -420,6 +537,7 @@ __STATIC_FORCEINLINE void PIN_SWDIO_OUT_DISABLE(void)
// set \ref gpio_set_dircetion -> INPUT
// esp8266 input is always connected
GPIO.enable_w1tc |= (0x1 << PIN_SWDIO);
+ GPIO.pin[PIN_SWDIO].driver = 0;
}
// TDI Pin I/O ---------------------------------------------
@@ -431,7 +549,7 @@ __STATIC_FORCEINLINE void PIN_SWDIO_OUT_DISABLE(void)
*/
__STATIC_FORCEINLINE uint32_t PIN_TDI_IN(void)
{
- return ((GPIO.in >> PIN_TDI) & 0x1);
+ return ((GPIO.in >> PIN_TDI) & 0x1) ? 1 : 0;
}
/**
@@ -446,11 +564,13 @@ __STATIC_FORCEINLINE void PIN_TDI_OUT(uint32_t bit)
{
//set bit
GPIO.out_w1ts |= (0x1 << PIN_TDI);
+
}
else
{
//reset bit
GPIO.out_w1tc |= (0x1 << PIN_TDI);
+
}
}
@@ -463,7 +583,7 @@ __STATIC_FORCEINLINE void PIN_TDI_OUT(uint32_t bit)
*/
__STATIC_FORCEINLINE uint32_t PIN_TDO_IN(void)
{
- return ((GPIO.in >> PIN_TDI) & 0x1);
+ return ((GPIO.in >> PIN_TDO) & 0x1) ? 1 : 0;
}
// nTRST Pin I/O -------------------------------------------
@@ -475,7 +595,7 @@ __STATIC_FORCEINLINE uint32_t PIN_TDO_IN(void)
*/
__STATIC_FORCEINLINE uint32_t PIN_nTRST_IN(void)
{
- return ((GPIO.in >> PIN_nTRST) & 0x1);
+ return 0; // not available
}
/**
@@ -487,17 +607,18 @@ __STATIC_FORCEINLINE uint32_t PIN_nTRST_IN(void)
*/
__STATIC_FORCEINLINE void PIN_nTRST_OUT(uint32_t bit)
{
- ////TODO: What does this mean? ? ?
- if ((bit & 1U) == 1)
- {
- //set bit
- GPIO.out_w1ts |= (0x1 << PIN_nTRST);
- }
- else
- {
- //reset bit
- GPIO.out_w1tc |= (0x1 << PIN_nTRST);
- }
+ // ////TODO: What does this mean? ? ?
+ // if ((bit & 1U) == 1)
+ // {
+ // //set bit
+ // GPIO.out_w1ts |= (0x1 << PIN_nTRST);
+ // }
+ // else
+ // {
+ // //reset bit
+ // GPIO.out_w1tc |= (0x1 << PIN_nTRST);
+ // }
+ ; // not available
}
// nRESET Pin I/O------------------------------------------
@@ -509,7 +630,7 @@ __STATIC_FORCEINLINE void PIN_nTRST_OUT(uint32_t bit)
*/
__STATIC_FORCEINLINE uint32_t PIN_nRESET_IN(void)
{
- return ((GPIO.in >> PIN_nRESET) & 0x1);
+ return ((GPIO.in >> PIN_nRESET) & 0x1) ? 1 : 0;
}
/**
diff --git a/components/USBIP/USB_handle.c b/components/USBIP/USB_handle.c
index 666d026..62ba946 100644
--- a/components/USBIP/USB_handle.c
+++ b/components/USBIP/USB_handle.c
@@ -19,11 +19,18 @@
#include "usb_defs.h"
#include "MSOS20Descriptors.h"
+// const char *strings_list[] = {
+// 0, // reserved: available languages
+// "windowsair",
+// "CMSIS-DAP v2",
+// "1234",
+// };
+
const char *strings_list[] = {
- 0, // reserved: available languages
- "windowsair",
- "CMSIS-DAP v2",
- "1234",
+ 0, // reserved: available languages
+ "windowsair",
+ "esp8266 CMSIS-DAP",
+ "1234",
};
// handle functions
static void handleGetDescriptor(usbip_stage2_header *header);
@@ -106,6 +113,10 @@ void handleUSBControlRequest(usbip_stage2_header *header)
break;
case 0x80: // *IMPORTANT*
+#if (USE_WINUSB == 0)
+ case 0x81:
+#endif
+ {
switch (header->u.cmd_submit.request.bRequest)
{
case USB_REQ_GET_CONFIGURATION:
@@ -125,6 +136,8 @@ void handleUSBControlRequest(usbip_stage2_header *header)
break;
}
break;
+ }
+#if (USE_WINUSB == 1)
case 0x81: // ignore...
switch (header->u.cmd_submit.request.bRequest)
{
@@ -147,7 +160,7 @@ void handleUSBControlRequest(usbip_stage2_header *header)
break;
}
break;
-
+#endif
case 0x82: // ignore...
switch (header->u.cmd_submit.request.bRequest)
{
@@ -182,8 +195,22 @@ void handleUSBControlRequest(usbip_stage2_header *header)
header->u.cmd_submit.request.bmRequestType, header->u.cmd_submit.request.bRequest, *wIndex);
break;
}
+ break;
}
- break;
+ case 0x21: // Set_Idle for HID
+ switch (header->u.cmd_submit.request.bRequest)
+ {
+ case USB_REQ_SET_IDLE:
+ os_printf("* SET IDLE\r\n");
+ send_stage2_submit(header, 0, 0);
+ break;
+
+ default:
+ os_printf("USB unknown request, bmRequestType:%d,bRequest:%d\r\n",
+ header->u.cmd_submit.request.bmRequestType, header->u.cmd_submit.request.bRequest);
+ break;
+ }
+ break;
default:
os_printf("USB unknown request, bmRequestType:%d,bRequest:%d\r\n",
header->u.cmd_submit.request.bmRequestType, header->u.cmd_submit.request.bRequest);
@@ -222,7 +249,7 @@ static void handleGetDescriptor(usbip_stage2_header *header)
break;
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)
{
@@ -231,27 +258,27 @@ static void handleGetDescriptor(usbip_stage2_header *header)
}
else if (header->u.cmd_submit.request.wValue.u8lo != 0xee)
{
- os_printf("low bit : %d\r\n", (int)header->u.cmd_submit.request.wValue.u8lo);
- os_printf("high bit : %d\r\n", (int)header->u.cmd_submit.request.wValue.u8hi);
+ //os_printf("low bit : %d\r\n", (int)header->u.cmd_submit.request.wValue.u8lo);
+ //os_printf("high bit : %d\r\n", (int)header->u.cmd_submit.request.wValue.u8hi);
int slen = strlen(strings_list[header->u.cmd_submit.request.wValue.u8lo]);
int wslen = slen * 2;
int buff_len = sizeof(usb_string_descriptor) + wslen;
- char temp_buff[256];
+ char temp_buff[64];
usb_string_descriptor *desc = (usb_string_descriptor *)temp_buff;
desc->bLength = buff_len;
desc->bDescriptorType = USB_DT_STRING;
for (int i = 0; i < slen; i++)
{
desc->wData[i] = strings_list[header->u.cmd_submit.request.wValue.u8lo][i];
- send_stage2_submit_data(header, 0, (uint8_t *)temp_buff, buff_len);
+
}
+ send_stage2_submit_data(header, 0, (uint8_t *)temp_buff, buff_len);
}
else
{
os_printf("low bit : %d\r\n", (int)header->u.cmd_submit.request.wValue.u8lo);
os_printf("high bit : %d\r\n", (int)header->u.cmd_submit.request.wValue.u8hi);
os_printf("***Unsupported String descriptor***\r\n");
-
}
break;
@@ -293,8 +320,14 @@ static void handleGetDescriptor(usbip_stage2_header *header)
os_printf("* GET 0x0F BOS DESCRIPTOR\r\n");
send_stage2_submit_data(header, 0, bosDescriptor, sizeof(bosDescriptor));
break;
+ case USB_DT_HID_REPORT:
+ os_printf("* GET 0x22 HID REPORT DESCRIPTOR");
+ send_stage2_submit_data(header, 0, (void *)kHidReportDescriptor, sizeof(kHidReportDescriptor));
+ break;
default:
os_printf("USB unknown Get Descriptor requested:%d\r\n", header->u.cmd_submit.request.wValue.u8lo);
+ os_printf("low bit :%d\r\n",header->u.cmd_submit.request.wValue.u8lo);
+ os_printf("high bit :%d\r\n",header->u.cmd_submit.request.wValue.u8hi);
break;
}
}
diff --git a/components/USBIP/USBd_config.c b/components/USBIP/USBd_config.c
index f28d636..598e7d9 100644
--- a/components/USBIP/USBd_config.c
+++ b/components/USBIP/USBd_config.c
@@ -54,6 +54,8 @@ const uint8_t kUSBd0DeviceDescriptor[0x12] =
// Standard Interface Descriptor
+
+#if (USE_WINUSB ==1)
const uint8_t kUSBd0InterfaceDescriptor[0x1E]=
{
0x09, // bLength
@@ -118,8 +120,58 @@ const uint8_t kUSBd0InterfaceDescriptor[0x1E]=
};
+#else
+const uint8_t kUSBd0InterfaceDescriptor[0x20]=
+{
+ 0x09, // bLength
+ USB_DT_INTERFACE, // bDescriptorType
+ USBD_CUSTOM_CLASS0_IF0_NUM, // bInterfaceNumber
+ USBD_CUSTOM_CLASS0_IF0_ALT, // bAlternateSetting
+ 0x02, // bNumEndpoints ----> 2 endpoint for USB HID
+ //
+ USBD_CUSTOM_CLASS0_IF0_CLASS, // bInterfaceClass
+ USBD_CUSTOM_CLASS0_IF0_SUBCLASS, // bInterfaceSubClass
+ USBD_CUSTOM_CLASS0_IF0_PROTOCOL, // bInterfaceProtocol
+ 0x00, // iInterface
+ // Index of string descriptor describing this interface
+
+ // HID Descriptor
+ 0x09, // bLength
+ 0x21, // bDescriptorType
+ 0x11, 0x01, // bcdHID
+ 0x00, // bCountryCode
+ 0x01, // bNumDescriptors
+ 0x22, // bDescriptorType1
+ 0x21, 0x00, // wDescriptorLength1
+
+ // Standard Endpoint Descriptor
+
+ // We perform all transfer operations on Pysical endpoint 1.
+
+ /* Pysical endpoint 1 */
+
+ 0x07, // bLength
+ USB_DT_ENDPOINT, // bDescriptorType
+ 0x81, // bEndpointAddress
+ USB_ENDPOINT_ATTR_INTERRUPT, // bmAttributes
+ USBShort(64), // wMaxPacketSize
+ 0xff, // bInterval
+
+ /* Pysical endpoint 1 */
+
+ 0x07, // bLength
+ USB_DT_ENDPOINT, // bDescriptorType
+ 0x01, // bEndpointAddress
+ USB_ENDPOINT_ATTR_INTERRUPT, // bmAttributes
+ USBShort(64), // wMaxPacketSize
+ 0xff, // bInterval
+};
+#endif
+
// Standard Configuration Descriptor
#define LENGTHOFCONFIGDESCRIPTOR 9
+
+#if (USE_WINUSB == 1)
const uint8_t kUSBd0ConfigDescriptor[LENGTHOFCONFIGDESCRIPTOR] =
{
// Configuration descriptor header.
@@ -139,6 +191,52 @@ const uint8_t kUSBd0ConfigDescriptor[LENGTHOFCONFIGDESCRIPTOR] =
USBD0_CFG_DESC_BMAXPOWER, // bMaxPower
};
+#else
+const uint8_t kUSBd0ConfigDescriptor[LENGTHOFCONFIGDESCRIPTOR] =
+{
+ // Configuration descriptor header.
+
+ 0x09, // bLength
+ USB_DT_CONFIGURATION, // bDescriptorType
+
+ USBShort((sizeof(kUSBd0InterfaceDescriptor)) + (LENGTHOFCONFIGDESCRIPTOR)),
+ // wTotalLength
+
+ 0x01, // bNumInterfaces
+ // There is only one interface in the CMSIS-DAP project
+ 0x01, // bConfigurationValue: 0x01 is used to select this configuration */
+ 0x00, // iConfiguration: no string to describe this configuration */
+ USBD0_CFG_DESC_BMATTRIBUTES, // bmAttributes
+
+ USBD0_CFG_DESC_BMAXPOWER, // bMaxPower
+};
+#endif
+
+
+// USB HID Report Descriptor
+const uint8_t kHidReportDescriptor[0x21] = {
+ 0x06, 0x00, 0xFF, // Usage Page (Vendor Defined 0xFF00)
+ 0x09, 0x01, // Usage (0x01)
+ 0xA1, 0x01, // Collection (Application)
+ 0x15, 0x00, // Logical Minimum (0)
+ 0x26, 0xFF, 0x00, // Logical Maximum (255)
+ 0x75, 0x08, // Report Size (8)
+ 0x95, 0x40, // 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)
+ 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)
+ 0x09, 0x01, // Usage (0x01)
+ 0xB1, 0x02, // Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
+ 0xC0, // End Collection
+ // 33 bytes
+};
+
+
+
+
/**
diff --git a/components/USBIP/USBd_config.h b/components/USBIP/USBd_config.h
index 6af8944..dc3a3e2 100644
--- a/components/USBIP/USBd_config.h
+++ b/components/USBIP/USBd_config.h
@@ -1,34 +1,39 @@
#ifndef __USBD_CONFIG_H__
#define __USBD_CONFIG_H__
+#define USE_WINUSB 0
+
// Vendor ID assigned by USB-IF (idVendor).
-#define USBD0_DEV_DESC_IDVENDOR 0xC251
+#define USBD0_DEV_DESC_IDVENDOR 0xC251
// Product ID assigned by manufacturer (idProduct).
-#define USBD0_DEV_DESC_IDPRODUCT 0xF00A
+#define USBD0_DEV_DESC_IDPRODUCT 0xF00A
// Device Release Number in binary-coded decimal (bcdDevice).
-#define USBD0_DEV_DESC_BCDDEVICE 0x0100
+#define USBD0_DEV_DESC_BCDDEVICE 0x0100
// Maximum packet size for Endpoint 0 (bMaxPacketSize0).
-#define USBD0_MAX_PACKET0 64
+#define USBD0_MAX_PACKET0 64
// If disabled Serial Number String will not be assigned to USB Device.
-#define USBD0_STR_DESC_SER_EN 1
+#define USBD0_STR_DESC_SER_EN 1
// bmAttributes
-#define USBD0_CFG_DESC_BMATTRIBUTES 0x80
+#define USBD0_CFG_DESC_BMATTRIBUTES 0x80
// bMaxPower
-#define USBD0_CFG_DESC_BMAXPOWER 250
-
+#define USBD0_CFG_DESC_BMAXPOWER 250
// Interface Number
-#define USBD_CUSTOM_CLASS0_IF0_NUM 0
+#define USBD_CUSTOM_CLASS0_IF0_NUM 0
// Alternate Setting
-#define USBD_CUSTOM_CLASS0_IF0_ALT 0
+#define USBD_CUSTOM_CLASS0_IF0_ALT 0
// Class Code
-#define USBD_CUSTOM_CLASS0_IF0_CLASS 0xFF // 0xFF: Vendor Specific
+#if (USE_WINUSB == 1)
+#define USBD_CUSTOM_CLASS0_IF0_CLASS 0xFF // 0xFF: Vendor Specific
+#else
+#define USBD_CUSTOM_CLASS0_IF0_CLASS 0x03 // 0x03: HID class
+#endif
// Subclass Code
#define USBD_CUSTOM_CLASS0_IF0_SUBCLASS 0x00
@@ -36,19 +41,26 @@
// Protocol Code
#define USBD_CUSTOM_CLASS0_IF0_PROTOCOL 0x00
-
-
-
-
/////////////////////////////////////////////
+
+// common part
extern const uint8_t kUSBd0DeviceDescriptor[0x12];
-extern const uint8_t kUSBd0InterfaceDescriptor[0x1E];
-extern const uint8_t kUSBd0ConfigDescriptor[0x09];
extern const uint8_t kLangDescriptor[0x04];
extern const uint8_t kManufacturerString[0x28];
extern const uint8_t kProductString[0x18];
extern const uint8_t kSerialNumberString[0x1A];
+
+#if (USE_WINUSB == 1)
+extern const uint8_t kUSBd0InterfaceDescriptor[0x1E];
+extern const uint8_t kUSBd0ConfigDescriptor[0x09];
extern const uint8_t kInterfaceString[0x2C];
+#else
+extern const uint8_t kUSBd0InterfaceDescriptor[0x20];
+extern const uint8_t kUSBd0ConfigDescriptor[0x09];
+extern const uint8_t kInterfaceString[0x2C];
+extern const uint8_t kHidReportDescriptor[0x21];
+
+#endif
#endif
\ No newline at end of file
diff --git a/components/USBIP/usb_defs.h b/components/USBIP/usb_defs.h
index c33fa06..0377dc4 100644
--- a/components/USBIP/usb_defs.h
+++ b/components/USBIP/usb_defs.h
@@ -98,6 +98,14 @@ typedef struct
#define USB_REQ_GET_INTERFACE 10
#define USB_REQ_SET_INTERFACE 11
#define USB_REQ_SET_SYNCH_FRAME 12
+
+// USB HID Request
+#define USB_REQ_GET_REPORT 0x01
+#define USB_REQ_GET_IDLE 0x02
+#define USB_REQ_GET_PROTOCOL 0x03
+#define USB_REQ_SET_REPORT 0x09
+#define USB_REQ_SET_IDLE 0X0A
+#define USB_REQ_SET_PROTOCOL 0X0B
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
@@ -115,6 +123,9 @@ typedef struct
#define USB_DT_OTG 9
#define USB_DT_DEBUG 10
#define USB_DT_INTERFACE_ASSOCIATION 11
+/* USB HID */
+#define USB_DT_HID 0x21
+#define USB_DT_HID_REPORT 0x22
///////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////
diff --git a/main/DAP_handle.c b/main/DAP_handle.c
index 9d928fb..4f51da4 100644
--- a/main/DAP_handle.c
+++ b/main/DAP_handle.c
@@ -14,7 +14,7 @@
#include "DAP.h"
#include "esp_libc.h"
////TODO: Merge this
-#define DAP_PACKET_SIZE 512
+#define DAP_PACKET_SIZE 64
static uint8_t data_out[DAP_PACKET_SIZE];
static int dap_respond = 0;
@@ -40,7 +40,7 @@ void handle_dap_data_response(usbip_stage2_header *header)
//os_printf("*** Will respond");
- send_stage2_submit_data(header, 0, data_out, (dap_respond & 0x0000FFFF));
+ send_stage2_submit_data(header, 0, data_out, DAP_PACKET_SIZE);
dap_respond = 0;
//os_printf("*** RESPONDED ***");
}
diff --git a/main/main.c b/main/main.c
index 5676c15..b26615d 100644
--- a/main/main.c
+++ b/main/main.c
@@ -140,9 +140,9 @@ void app_main()
DAP_Setup(); // DAP Setup
xTaskCreate(timer_create_task, "timer_create", 512, NULL, 10, NULL);
- xTaskCreate(tcp_server_task, "tcp_server", 4096, NULL, 5, NULL);
+ xTaskCreate(tcp_server_task, "tcp_server", 4096, NULL, 20, NULL);
// SWO Trace Task
- xTaskCreate(SWO_Thread, "swo_task", 1024, NULL, 6, NULL);
- xTaskCreate(usart_monitor_task, "uart_task", 512, NULL, 6, NULL);
+ //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 fbb16b7..834381f 100644
--- a/main/tcp_server.c
+++ b/main/tcp_server.c
@@ -31,9 +31,10 @@
uint8_t kState = ACCEPTING;
int kSock = -1;
+
void tcp_server_task(void *pvParameters)
{
- uint8_t rx_buffer[2048];
+ uint8_t tcp_rx_buffer[256];
char addr_str[128];
int addr_family;
int ip_protocol;
@@ -101,7 +102,7 @@ void tcp_server_task(void *pvParameters)
while (1)
{
- int len = recv(kSock, rx_buffer, 2047, 0);
+ int len = recv(kSock, tcp_rx_buffer, 255, 0);
// Error occured during receiving
if (len < 0)
{
@@ -117,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)
{
@@ -137,11 +138,11 @@ void tcp_server_task(void *pvParameters)
kState = ATTACHING;
case ATTACHING:
- attach(rx_buffer, len);
+ attach(tcp_rx_buffer, len);
break;
case EMULATING:
- emulate(rx_buffer, len);
+ emulate(tcp_rx_buffer, len);
break;
default:
os_printf("unkonw kstate!\r\n");
diff --git a/main/usbip_server.c b/main/usbip_server.c
index 2227bd2..9c41eef 100644
--- a/main/usbip_server.c
+++ b/main/usbip_server.c
@@ -31,6 +31,9 @@ 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)
{
int command = read_stage1_command(buffer, length);
@@ -197,6 +200,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);
return -1;
}
return 0;
@@ -278,12 +282,12 @@ static int handle_submit(usbip_stage2_header *header)
case 0x01:
if (header->base.direction == 0)
{
- // os_printf("EP 01 DATA FROM HOST");
+ //os_printf("EP 01 DATA FROM HOST");
handle_dap_data_request(header);
}
else
{
- os_printf("EP 01 DATA TO HOST\r\n");
+ // os_printf("EP 01 DATA TO HOST\r\n");
handle_dap_data_response(header);
}
break;
diff --git a/sdkconfig b/sdkconfig
index 0b1692e..08378b1 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=921600
+CONFIG_ESPTOOLPY_BAUD=115200
CONFIG_ESPTOOLPY_COMPRESSED=y
CONFIG_ESPTOOLPY_FLASHMODE_QIO=y
# CONFIG_ESPTOOLPY_FLASHMODE_QOUT is not set
@@ -42,10 +42,10 @@ CONFIG_SPI_FLASH_FREQ=0x0
# CONFIG_ESPTOOLPY_FLASHSIZE_1MB is not set
# CONFIG_ESPTOOLPY_FLASHSIZE_2MB is not set
# CONFIG_ESPTOOLPY_FLASHSIZE_4MB is not set
-CONFIG_ESPTOOLPY_FLASHSIZE_8MB=y
-# CONFIG_ESPTOOLPY_FLASHSIZE_16MB is not set
-CONFIG_ESPTOOLPY_FLASHSIZE="8MB"
-CONFIG_SPI_FLASH_SIZE=0x800000
+# CONFIG_ESPTOOLPY_FLASHSIZE_8MB is not set
+CONFIG_ESPTOOLPY_FLASHSIZE_16MB=y
+CONFIG_ESPTOOLPY_FLASHSIZE="16MB"
+CONFIG_SPI_FLASH_SIZE=0x1000000
CONFIG_ESPTOOLPY_BEFORE_RESET=y
# CONFIG_ESPTOOLPY_BEFORE_NORESET is not set
CONFIG_ESPTOOLPY_BEFORE="default_reset"