diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 0445a67..6cb88ba 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -10,18 +10,18 @@ jobs:
runs-on: ubuntu-18.04
steps:
- uses: actions/checkout@v2
+ with:
+ submodules: recursive
- name: before_install
run: |
sudo apt update
- sudo apt install -y gcc git wget make libncurses-dev flex bison python python-serial ninja-build
+ sudo apt install -y gcc git wget make libncurses-dev flex bison python python-setuptools python-serial ninja-build
wget https://dl.espressif.com/dl/xtensa-lx106-elf-linux64-1.22.0-100-ge567ec7-5.2.0.tar.gz
- name: install
run: |
tar -xzf ./xtensa-lx106-elf-linux64-1.22.0-100-ge567ec7-5.2.0.tar.gz
- wget https://github.com/espressif/ESP8266_RTOS_SDK/releases/download/v3.3-rc1/ESP8266_RTOS_SDK-v3.3-rc1.zip
- unzip ESP8266_RTOS_SDK-v3.3-rc1.zip
python -m pip install --user -r ./ESP8266_RTOS_SDK/requirements.txt
- name: script
@@ -41,6 +41,13 @@ jobs:
echo "::set-output name=release_tag::UserBuild_$(date +"%Y.%m.%d_%H-%M")"
echo "::set-output name=status::success"
+ - name: Merge bin files
+ if: steps.tag.outputs.status == 'success' && !cancelled()
+ run: |
+ git clone https://github.com/espressif/esptool.git
+ ./esptool/esptool.py --chip esp8266 merge_bin -o build/esp8266_dap_full.bin 0x0 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin 0x10000 build/esp8266_dap.bin
+ mv build/esp8266_dap.bin build/esp8266_dap_app.bin
+
- name: Release user firmware
uses: softprops/action-gh-release@v1
if: steps.tag.outputs.status == 'success' && !cancelled()
@@ -48,5 +55,9 @@ jobs:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
with:
tag_name: ${{ steps.tag.outputs.release_tag }}
- files: ${{ env.FIRMWARE }}/esp8266_dap.bin
+ files: |
+ ${{ env.FIRMWARE }}/esp8266_dap_full.bin
+ ${{ env.FIRMWARE }}/esp8266_dap_app.bin
+ ${{ env.FIRMWARE }}/bootloader/bootloader.bin
+ ${{ env.FIRMWARE }}/partition_table/partition-table.bin
diff --git a/.gitignore b/.gitignore
index 9a47b5a..33904f1 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
.vscode/
build/
-tmp/
\ No newline at end of file
+tmp/
+.history/
\ No newline at end of file
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..8950d78
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "ESP8266_RTOS_SDK"]
+ path = ESP8266_RTOS_SDK
+ url = https://github.com/espressif/ESP8266_RTOS_SDK
diff --git a/.travis.yml b/.travis.yml.backup
similarity index 100%
rename from .travis.yml
rename to .travis.yml.backup
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 7bc2902..ee5b850 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,9 +1,6 @@
-# The following five lines of boilerplate have to be in your project's
-# CMakeLists in this exact order for cmake to work correctly
cmake_minimum_required(VERSION 3.5)
-#set(COMPONENT_DIRS "${IDF_PATH}/components ${PROJECT_PATH}/components")
-include_directories(${CMAKE_CURRENT_SOURCE_DIR}/main)
+include_directories(${CMAKE_CURRENT_SOURCE_DIR})
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(esp8266_dap)
diff --git a/ESP8266_RTOS_SDK b/ESP8266_RTOS_SDK
new file mode 160000
index 0000000..1be2289
--- /dev/null
+++ b/ESP8266_RTOS_SDK
@@ -0,0 +1 @@
+Subproject commit 1be2289fcd68672f5d6bf6aafa4f4b57b20527a4
diff --git a/Makefile b/Makefile
deleted file mode 100644
index e965b90..0000000
--- a/Makefile
+++ /dev/null
@@ -1,9 +0,0 @@
-#
-# This is a project Makefile. It is assumed the directory this Makefile resides in is a
-# project subdirectory.
-#
-
-PROJECT_NAME := tcp_server
-
-include $(IDF_PATH)/make/project.mk
-
diff --git a/README.md b/README.md
index d05c649..0cffc18 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-

+

@@ -17,7 +17,7 @@ Realized by USBIP and CMSIS-DAP protocol stack.
> 👉 5m distance, 100kb size firmware(Hex) flash test:
-
+
## Feature
@@ -49,6 +49,10 @@ The default connected WIFI SSID is `DAP` , password `12345678`
You can change `WIFI_SSID` and ` WIFI_PASS` in [wifi_configuration.h](main/wifi_configuration.h)
+You can also specify your IP in the above file (We recommend using the static address binding feature of the router).
+
+
+
### Debugger
@@ -57,8 +61,7 @@ You can change `WIFI_SSID` and ` WIFI_PASS` in [wifi_configuration.h](main/wifi_
| SWD | |
|----------------|--------|
| SWCLK | GPIO14 |
-| SWDIO | GPIO12 |
-| SWDIO_MOSI | GPIO13 |
+| SWDIO | GPIO13 |
| LED\_CONNECTED | GPIO2 |
| LED\_RUNNING | GPIO15 |
| TVCC | 3V3 |
@@ -184,7 +187,7 @@ When you select max clock, we will take the following actions:
1. Use WinUSB Mode(enabled by default):
- change `USE_WINUSB` macor in [USBd_config.h](components/USBIP/USBd_config.h)
+ change `USE_WINUSB` macor in [dap_configuration.h](main/dap_configuration.h)
@@ -234,9 +237,9 @@ Credits to the following project, people and organizations:
> - https://github.com/cezanne/usbip-win for usbip windows
-- @HeavenSpree
-- @Zy19930907
-- @caiguang1997
+- [@HeavenSpree](https://www.github.com/HeavenSpree)
+- [@Zy19930907](https://www.github.com/Zy19930907)
+- [@caiguang1997](https://www.github.com/caiguang1997)
## License
diff --git a/components/DAP/CMakeLists.txt b/components/DAP/CMakeLists.txt
index c18752a..65ffbff 100644
--- a/components/DAP/CMakeLists.txt
+++ b/components/DAP/CMakeLists.txt
@@ -1,4 +1,4 @@
-set(COMPONENT_ADD_INCLUDEDIRS "config include $ENV{IDF_PATH}/components/esp8266/include/esp8266/ $ENV{IDF_PATH}//components/esp_ringbuf/include/")
+set(COMPONENT_ADD_INCLUDEDIRS "config include $ENV{IDF_PATH}/components/esp8266/include/esp8266/ $ENV{IDF_PATH}/components/esp_ringbuf/include/")
set(COMPONENT_SRCS "./source/DAP.c ./source/DAP_vendor.c ./source/JTAG_DP.c ./source/SW_DP.c ./source/SWO.c ./source/uart_modify.c ./source/spi_op.c ./source/spi_switch.c ./source/dap_utility.c")
diff --git a/components/DAP/config/DAP_config.h b/components/DAP/config/DAP_config.h
index c3b724d..a9b83bb 100644
--- a/components/DAP/config/DAP_config.h
+++ b/components/DAP/config/DAP_config.h
@@ -1,710 +1,731 @@
-/*
- * Copyright (c) 2013-2017 ARM Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the License); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ----------------------------------------------------------------------
- *
- * $Date: 1. December 2017
- * $Revision: V2.0.0
- *
- * Project: CMSIS-DAP Configuration
- * Title: DAP_config.h CMSIS-DAP Configuration File (Template)
- *
- *---------------------------------------------------------------------------*/
-
-/**
- * @file DAP_config.h
- * @author windowsair
- * @brief Adaptation of GPIO and SPI pin
- * @change: 2021-2-10 Support GPIO and SPI
- * @version 0.1
- * @date 2021-2-10
- *
- * @copyright Copyright (c) 2021
- *
- */
-
-
-#ifndef __DAP_CONFIG_H__
-#define __DAP_CONFIG_H__
-
-#include
-#include
-#include "cmsis_compiler.h"
-#include "gpio.h"
-#include "gpio_struct.h"
-#include "timer_struct.h"
-#include "esp8266/pin_mux_register.h"
-
-#include "gpio_op.h"
-#include "spi_switch.h"
-#include "dap_configuration.h"
-//**************************************************************************************************
-/**
-\defgroup DAP_Config_Debug_gr CMSIS-DAP Debug Unit Information
-\ingroup DAP_ConfigIO_gr
-@{
-Provides definitions about the hardware and configuration of the Debug Unit.
-
-This information includes:
- - Definition of Cortex-M processor parameters used in CMSIS-DAP Debug Unit.
- - Debug Unit Identification strings (Vendor, Product, Serial Number).
- - Debug Unit communication packet size.
- - Debug Access Port supported modes and settings (JTAG/SWD and SWO).
- - Optional information about a connected Target Device (for Evaluation Boards).
-*/
-
-//#ifdef _RTE_
-//#include "RTE_Components.h"
-//#include CMSIS_device_header
-//#else
-//#include "device.h" // Debug Unit Cortex-M Processor Header File
-//#endif
-
-/// 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 160000000 ///< Specifies the CPU Clock in Hz.
-// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<160MHz
-
-
-//#define MAX_USER_CLOCK 16000000 ///< 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
-/// require 2 processor cycles for a I/O Port Write operation. If the Debug Unit uses
-/// a Cortex-M0+ processor with high-speed peripheral I/O only 1 processor cycle might be
-/// required.
-#define IO_PORT_WRITE_CYCLES 2U ///< I/O Cycles: 2=default, 1=Cortex-M0+ fast I/0.
-
-/// Indicate that Serial Wire Debug (SWD) communication mode is available at the Debug Access Port.
-/// This information is returned by the command \ref DAP_Info as part of Capabilities.
-#define DAP_SWD 1 ///< SWD Mode: 1 = available, 0 = not available.
-
-/// 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.
-
-/// 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.
-#define DAP_JTAG_DEV_CNT 8U ///< Maximum number of JTAG devices on scan chain.
-
-/// Default communication mode on the Debug Access Port.
-/// Used for the command \ref DAP_Connect when Port Default mode is selected.
-#define DAP_DEFAULT_PORT 1U ///< Default JTAG/SWJ Port Mode: 1 = SWD, 2 = JTAG.
-
-/// Default communication speed on the Debug Access Port for SWD and JTAG mode.
-/// Used to initialize the default SWD/JTAG clock frequency.
-/// The command \ref DAP_SWJ_Clock can be used to overwrite this default setting.
-#define DAP_DEFAULT_SWJ_CLOCK 1000000U ///< Default SWD/JTAG clock frequency in Hz.
-// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<1MHz
-
-/// 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 255 ///< 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.
-#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.
-// <<<<<<<<<<<<<<<<<<<<<<<<<<<<< 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 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 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).
-// <<<<<<<<<<<<<<<<<<<<<5MHz
-
-/// Debug Unit is connected to fixed Target Device.
-/// The Debug Unit may be part of an evaluation board and always connected to a fixed
-/// known device. In this case a Device Vendor and Device Name string is stored which
-/// may be used by the debugger or IDE to configure device parameters.
-#define TARGET_DEVICE_FIXED 0 ///< Target Device: 1 = known, 0 = unknown;
-
-#if TARGET_DEVICE_FIXED
-#define TARGET_DEVICE_VENDOR "ARM" ///< String indicating the Silicon Vendor
-#define TARGET_DEVICE_NAME "Cortex-M4" ///< String indicating the Target Device
-#endif
-
-/**
- * @brief Get Vendor ID string.
- *
- * @param str Pointer to buffer to store the string.
- * @return String length.
- */
-__STATIC_INLINE uint8_t DAP_GetVendorString(char *str)
-{
- ////TODO: fill this
- // In fact, Keil can get the corresponding information through USB
- // without filling in this information.
- // (void)str;
- strcpy(str, "windowsair");
- return (sizeof("windowsair"));
-}
-
-/**
- * @brief Get Product ID string.
- *
- * @param str Pointer to buffer to store the string.
- * @return String length.
- */
-__STATIC_INLINE uint8_t DAP_GetProductString(char *str)
-{
- //(void)str;
- strcpy(str, "CMSIS-DAP v2");
- return (sizeof("CMSIS-DAP v2"));
-}
-
-/**
- * @brief Get Serial Number string.
- *
- * @param str Pointer to buffer to store the string.
- * @return String length.
- */
-__STATIC_INLINE uint8_t DAP_GetSerNumString(char *str)
-{
- strcpy(str, "1234");
- return (sizeof("1234"));
-}
-
-///@}
-
-
-// Note: DO NOT modify these pins: PIN_SWDIO PIN_SWDIO_MOSI PIN_SWCLK
-// Modify the following pins carefully: PIN_TDO
-#define PIN_SWDIO 12 // SPI MISO
-#define PIN_SWDIO_MOSI 13 // SPI MOSI
-#define PIN_SWCLK 14
-#define PIN_TDO 16 // device TDO -> Host Data Input (use RTC pin 16)
-#define PIN_TDI 4
-#define PIN_nTRST 0 // optional
-#define PIN_nRESET 5
-// LED_BUILTIN
-#define PIN_LED_CONNECTED 2
-// LED_BUILTIN
-#define PIN_LED_RUNNING 15
-
-//**************************************************************************************************
-/**
-\defgroup DAP_Config_PortIO_gr CMSIS-DAP Hardware I/O Pin Access
-\ingroup DAP_ConfigIO_gr
-@{
-
-Standard I/O Pins of the CMSIS-DAP Hardware Debug Port support standard JTAG mode
-and Serial Wire Debug (SWD) mode. In SWD mode only 2 pins are required to implement the debug
-interface of a device. The following I/O Pins are provided:
-
-JTAG I/O Pin | SWD I/O Pin | CMSIS-DAP Hardware pin mode
----------------------------- | -------------------- | ---------------------------------------------
-TCK: Test Clock | SWCLK: Clock | Output Push/Pull
-TMS: Test Mode Select | SWDIO: Data I/O | Output Push/Pull; Input (for receiving data)
-TDI: Test Data Input | | Output Push/Pull
-TDO: Test Data Output | | Input
-nTRST: Test Reset (optional) | | Output Open Drain with pull-up resistor
-nRESET: Device Reset | nRESET: Device Reset | Output Open Drain with pull-up resistor
-
-
-DAP Hardware I/O Pin Access Functions
--------------------------------------
-The various I/O Pins are accessed by functions that implement the Read, Write, Set, or Clear to
-these I/O Pins.
-
-For the SWDIO I/O Pin there are additional functions that are called in SWD I/O mode only.
-This functions are provided to achieve faster I/O that is possible with some advanced GPIO
-peripherals that can independently write/read a single I/O pin without affecting any other pins
-of the same I/O port. The following SWDIO I/O Pin functions are provided:
- - \ref PIN_SWDIO_OUT_ENABLE to enable the output mode from the DAP hardware.
- - \ref PIN_SWDIO_OUT_DISABLE to enable the input mode to the DAP hardware.
- - \ref PIN_SWDIO_IN to read from the SWDIO I/O pin with utmost possible speed.
- - \ref PIN_SWDIO_OUT to write to the SWDIO I/O pin with utmost possible speed.
-*/
-
-/**
- * @brief Setup JTAG I/O pins: TCK, TMS, TDI, TDO, nTRST, and nRESET.
- * Configures the DAP Hardware I/O pins for JTAG mode:
- * - TCK, TMS, TDI, nTRST, nRESET to ***output*** mode and set to high level.
- * - TDO to ***input*** mode.
- *
- */
-__STATIC_INLINE void PORT_JTAG_SETUP(void)
-{
- gpio_pin_reg_t pin_reg;
-
-
- // set TCK, TMS pin
- DAP_SPI_Deinit();
-
-
- // use RTC pin 16
- // output disable
- WRITE_PERI_REG(PAD_XPD_DCDC_CONF, ((READ_PERI_REG(PAD_XPD_DCDC_CONF) & (uint32_t)0xffffffbc)) | (uint32_t)0x1); // mux configuration for XPD_DCDC and rtc_gpio0 connection
- CLEAR_PERI_REG_MASK(RTC_GPIO_CONF, 0x1); // mux configuration for out enable
- CLEAR_PERI_REG_MASK(RTC_GPIO_ENABLE, 0x1); // out disable
- // pulldown disable
- pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(PIN_TDO));
- pin_reg.rtc_pin.pulldown = 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);
-}
-
-/**
- * @brief Setup SWD I/O pins: SWCLK, SWDIO, and nRESET.
- * Configures the DAP Hardware I/O pins for Serial Wire Debug (SWD) mode:
- * - SWCLK, SWDIO, nRESET to output mode and set to default high level.
- * - TDI, nTRST to HighZ mode (pins are unused in SWD mode).
- *
- */
-__STATIC_INLINE void PORT_SWD_SETUP(void)
-{
- // At this stage we do not consider whether to use SPI or GPIO.
- // We will switch to the specific mode when setting the transfer rate.
- DAP_SPI_Init();
- DAP_SPI_Disable();
-}
-
-/**
- * @brief Disable JTAG/SWD I/O Pins.
- * Disables the DAP Hardware I/O pins which configures:
- * - TCK/SWCLK, TMS/SWDIO, TDI, TDO, nTRST, nRESET to High-Z mode.
- *
- */
-__STATIC_INLINE void PORT_OFF(void)
-{
- // Will be called when the DAP disconnected
- DAP_SPI_Disable();
-}
-
-// SWCLK/TCK I/O pin -------------------------------------
-
-/**
- * @brief SWCLK/TCK I/O pin: Get Input.
- *
- * @return Current status of the SWCLK/TCK DAP hardware I/O pin.
- */
-__STATIC_FORCEINLINE uint32_t PIN_SWCLK_TCK_IN(void)
-{
- ////TODO: can we set to 0?
- return 0;
-}
-
-/**
- * @brief SWCLK/TCK I/O pin: Set Output to High.
- *
- * Set the SWCLK/TCK DAP hardware I/O pin to high level.
- */
-__STATIC_FORCEINLINE void PIN_SWCLK_TCK_SET(void)
-{
- GPIO.out_w1ts |= (0x1 << PIN_SWCLK);
-}
-
-/**
- * @brief SWCLK/TCK I/O pin: Set Output to Low.
- *
- * Set the SWCLK/TCK DAP hardware I/O pin to low level.
- */
-__STATIC_FORCEINLINE void PIN_SWCLK_TCK_CLR(void)
-{
- GPIO.out_w1tc |= (0x1 << PIN_SWCLK);
-}
-
-// SWDIO/TMS Pin I/O --------------------------------------
-
-/**
- * @brief SWDIO/TMS I/O pin: Get Input.
- *
- * @return Current status of the SWDIO/TMS DAP hardware I/O pin.
- */
-__STATIC_FORCEINLINE uint32_t PIN_SWDIO_TMS_IN(void)
-{
- // Note that we only use mosi in GPIO mode
- return ((GPIO.in >> PIN_SWDIO_MOSI) & 0x1) ? 1 : 0;
-}
-
-/**
- * @brief SWDIO/TMS I/O pin: Set Output to High.
- *
- * Set the SWDIO/TMS DAP hardware I/O pin to high level.
- */
-__STATIC_FORCEINLINE void PIN_SWDIO_TMS_SET(void)
-{
- GPIO.out_w1ts |= (0x1 << PIN_SWDIO_MOSI);
-}
-
-/**
- * @brief SWDIO/TMS I/O pin: Set Output to Low.
- *
- * Set the SWDIO/TMS DAP hardware I/O pin to low level.
- */
-__STATIC_FORCEINLINE void PIN_SWDIO_TMS_CLR(void)
-{
- GPIO.out_w1tc |= (0x1 << PIN_SWDIO_MOSI);
-}
-
-/**
- * @brief SWDIO I/O pin: Get Input (used in SWD mode only).
- *
- * @return Current status of the SWDIO DAP hardware I/O pin.
- */
-__STATIC_FORCEINLINE uint32_t PIN_SWDIO_IN(void)
-{
- // Note that we only use mosi in GPIO mode
- return ((GPIO.in >> PIN_SWDIO_MOSI) & 0x1) ? 1 : 0;
-}
-
-/**
- * @brief SWDIO I/O pin: Set Output (used in SWD mode only).
- *
- * @param bit Output value for the SWDIO DAP hardware I/O pin.
- *
- */
-__STATIC_FORCEINLINE void PIN_SWDIO_OUT(uint32_t bit)
-{
- /**
- * Important: Use only one bit (bit0) of param!
- * Sometimes the func "SWD_TransferFunction" of SW_DP.c will
- * issue "2" as param instead of "0". Zach Lee
- */
- if ((bit & 1U) == 1)
- {
- //set bit
- GPIO.out_w1ts |= (0x1 << PIN_SWDIO_MOSI);
-
- }
- else
- {
- //reset bit
- GPIO.out_w1tc |= (0x1 << PIN_SWDIO_MOSI);
-
- }
-}
-
-/**
- * @brief SWDIO I/O pin: Switch to Output mode (used in SWD mode only).
- * Configure the SWDIO DAP hardware I/O pin to output mode. This function is
- * called prior \ref PIN_SWDIO_OUT function calls.
- */
-__STATIC_FORCEINLINE void PIN_SWDIO_OUT_ENABLE(void)
-{
- // set \ref gpio_set_direction -> OUTPUT
- // GPIO.enable_w1ts |= (0x1 << PIN_SWDIO_MOSI);
- // GPIO.pin[PIN_SWDIO_MOSI].driver = 0;
- do {}while (0);
-
-}
-
-/**
- * @brief SWDIO I/O pin: Switch to Input mode (used in SWD mode only).
- * Configure the SWDIO DAP hardware I/O pin to input mode. This function is
- * called prior \ref PIN_SWDIO_IN function calls.
- */
-__STATIC_FORCEINLINE void PIN_SWDIO_OUT_DISABLE(void)
-{
- // may be unuse.
- // set \ref gpio_set_dircetion -> INPUT
- // esp8266 input is always connected
- // GPIO.enable_w1tc |= (0x1 << PIN_SWDIO_MOSI);
- // GPIO.pin[PIN_SWDIO_MOSI].driver = 0;
- GPIO.out_w1ts |= (0x1 << PIN_SWDIO_MOSI);
-}
-
-// TDI Pin I/O ---------------------------------------------
-
-/**
- * @brief TDI I/O pin: Get Input.
- *
- * @return Current status of the TDI DAP hardware I/O pin.
- */
-__STATIC_FORCEINLINE uint32_t PIN_TDI_IN(void)
-{
- return ((GPIO.in >> PIN_TDI) & 0x1) ? 1 : 0;
-}
-
-/**
- * @brief TDI I/O pin: Set Output.
- *
- * @param bit Output value for the TDI DAP hardware I/O pin.
- *
- */
-__STATIC_FORCEINLINE void PIN_TDI_OUT(uint32_t bit)
-{
- if ((bit & 1U) == 1)
- {
- //set bit
- GPIO.out_w1ts |= (0x1 << PIN_TDI);
-
- }
- else
- {
- //reset bit
- GPIO.out_w1tc |= (0x1 << PIN_TDI);
-
- }
-}
-
-// TDO Pin I/O ---------------------------------------------
-
-/**
- * @brief TDO I/O pin: Get Input.
- *
- * @return Current status of the TDO DAP hardware I/O pin.
- */
-__STATIC_FORCEINLINE uint32_t PIN_TDO_IN(void)
-{
- return READ_PERI_REG(RTC_GPIO_IN_DATA) & 0x1;
-}
-
-// nTRST Pin I/O -------------------------------------------
-
-/**
- * @brief nTRST I/O pin: Get Input.
- *
- * @return Current status of the nTRST DAP hardware I/O pin.
- */
-__STATIC_FORCEINLINE uint32_t PIN_nTRST_IN(void)
-{
- return 0; // not available
-}
-
-/**
- * @brief nTRST I/O pin: Set Output.
- *
- * @param bit JTAG TRST Test Reset pin status:
- * - 0: issue a JTAG TRST Test Reset.
- - 1: release JTAG TRST Test Reset.
- */
-__STATIC_FORCEINLINE void PIN_nTRST_OUT(uint32_t bit)
-{
- // Vendor reset sequence
- ; // not available
-}
-
-// nRESET Pin I/O------------------------------------------
-
-/**
- * @brief nRESET I/O pin: Get Input.
- *
- * @return Current status of the nRESET DAP hardware I/O pin.
- */
-__STATIC_FORCEINLINE uint32_t PIN_nRESET_IN(void)
-{
- return ((GPIO.in >> PIN_nRESET) & 0x1) ? 1 : 0;
-}
-
-/**
- * @brief nRESET I/O pin: Set Output.
- *
- * @param bit target device hardware reset pin status:
- * - 0: issue a device hardware reset.
- * - 1: release device hardware reset.
- */
-__STATIC_FORCEINLINE void PIN_nRESET_OUT(uint32_t bit)
-{
- // Vendor reset sequence
- //// FIXME: unavailable
- if ((bit & 1U) == 1)
- {
- //set bit
- GPIO.out_w1ts |= (0x1 << PIN_nRESET);
- }
- else
- {
- //reset bit
- GPIO.out_w1tc |= (0x1 << PIN_nRESET);
- }
-}
-
-///@}
-
-//**************************************************************************************************
-/**
-\defgroup DAP_Config_LEDs_gr CMSIS-DAP Hardware Status LEDs
-\ingroup DAP_ConfigIO_gr
-@{
-
-CMSIS-DAP Hardware may provide LEDs that indicate the status of the CMSIS-DAP Debug Unit.
-
-It is recommended to provide the following LEDs for status indication:
- - Connect LED: is active when the DAP hardware is connected to a debugger.
- - Running LED: is active when the debugger has put the target device into running state.
-*/
-
-/** Debug Unit: Set status of Connected LED.
-\param bit status of the Connect LED.
- - 1: Connect LED ON: debugger is connected to CMSIS-DAP Debug Unit.
- - 0: Connect LED OFF: debugger is not connected to CMSIS-DAP Debug Unit.
-*/
-
-/**
- * @brief Debug Unit: Set status of Connected LED.
- *
- * @param bit status of the Connect LED.
- * - 1: Connect LED ON: debugger is connected to CMSIS-DAP Debug Unit.
- * - 0: Connect LED OFF: debugger is not connected to CMSIS-DAP Debug Unit.
- */
-__STATIC_INLINE void LED_CONNECTED_OUT(uint32_t bit)
-{
- if (bit)
- {
- //set bit
- GPIO.out_w1ts |= (0x1 << PIN_LED_CONNECTED);
- }
- else
- {
- //reset bit
- GPIO.out_w1tc |= (0x1 << PIN_LED_CONNECTED);
- }
-}
-
-/**
- * @brief Debug Unit: Set status Target Running LED.
- *
- * @param bit status of the Target Running LED.
- * - 1: Target Running LED ON: program execution in target started.
- * - 0: Target Running LED OFF: program execution in target stopped.
- */
-__STATIC_INLINE void LED_RUNNING_OUT(uint32_t bit)
-{
- if (bit)
- {
- //set bit
- GPIO.out_w1ts |= (0x1 << PIN_LED_RUNNING);
- }
- else
- {
- //reset bit
- GPIO.out_w1tc |= (0x1 << PIN_LED_RUNNING);
- }
-}
-
-///@}
-
-//**************************************************************************************************
-/**
-\defgroup DAP_Config_Timestamp_gr CMSIS-DAP Timestamp
-\ingroup DAP_ConfigIO_gr
-@{
-Access function for Test Domain Timer.
-
-The value of the Test Domain Timer in the Debug Unit is returned by the function \ref TIMESTAMP_GET. By
-default, the DWT timer is used. The frequency of this timer is configured with \ref TIMESTAMP_CLOCK.
-
-*/
-
-/**
- * @brief Get timestamp of Test Domain Timer.
- *
- * @return Current timestamp value.
- */
-__STATIC_INLINE uint32_t TIMESTAMP_GET(void)
-{
- // FRC1 is a 23-bit countdown timer
- return (0x7FFFFF - (frc1.count.data));
-}
-
-///@}
-
-//**************************************************************************************************
-/**
-\defgroup DAP_Config_Initialization_gr CMSIS-DAP Initialization
-\ingroup DAP_ConfigIO_gr
-@{
-
-CMSIS-DAP Hardware I/O and LED Pins are initialized with the function \ref DAP_SETUP.
-*/
-
-/** Setup of the Debug Unit I/O pins and LEDs (called when Debug Unit is initialized).
-This function performs the initialization of the CMSIS-DAP Hardware I/O Pins and the
-Status LEDs. In detail the operation of Hardware I/O and LED pins are enabled and set:
- - I/O clock system enabled.
- - all I/O pins: input buffer enabled, output pins are set to HighZ mode.
- - for nTRST, nRESET a weak pull-up (if available) is enabled.
- - LED output pins are enabled and LEDs are turned off.
-*/
-__STATIC_INLINE void DAP_SETUP(void)
-{
- // Connecting non-SWD pins to GPIO
- GPIO_FUNCTION_SET(PIN_TDO);
- GPIO_FUNCTION_SET(PIN_TDI);
- GPIO_FUNCTION_SET(PIN_nTRST);
- GPIO_FUNCTION_SET(PIN_nRESET);
- GPIO_FUNCTION_SET(PIN_LED_CONNECTED);
- GPIO_FUNCTION_SET(PIN_LED_RUNNING);
-
-
- // Configure: LED as output (turned off)
-
- GPIO_SET_DIRECTION_NORMAL_OUT(PIN_LED_CONNECTED);
- GPIO_SET_DIRECTION_NORMAL_OUT(PIN_LED_RUNNING);
-
- LED_CONNECTED_OUT(0);
- LED_RUNNING_OUT(0);
-
- PORT_OFF();
-}
-
-/** Reset Target Device with custom specific I/O pin or command sequence.
-This function allows the optional implementation of a device specific reset sequence.
-It is called when the command \ref DAP_ResetTarget and is for example required
-when a device needs a time-critical unlock sequence that enables the debug port.
-\return 0 = no device specific reset sequence is implemented.\n
- 1 = a device specific reset sequence is implemented.
-*/
-__STATIC_INLINE uint8_t RESET_TARGET(void)
-{
- return (0U); // not available
-}
-
-///@}
-
-#endif /* __DAP_CONFIG_H__ */
+/*
+ * Copyright (c) 2013-2017 ARM Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ----------------------------------------------------------------------
+ *
+ * $Date: 1. December 2017
+ * $Revision: V2.0.0
+ *
+ * Project: CMSIS-DAP Configuration
+ * Title: DAP_config.h CMSIS-DAP Configuration File (Template)
+ *
+ *---------------------------------------------------------------------------*/
+
+/**
+ * @file DAP_config.h
+ * @author windowsair
+ * @brief Adaptation of GPIO and SPI pin
+ * @change: 2021-2-10 Support GPIO and SPI
+ * 2021-2-18 Try to support SWO
+ * @version 0.1
+ * @date 2021-2-10
+ *
+ * @copyright Copyright (c) 2021
+ *
+ */
+
+
+#ifndef __DAP_CONFIG_H__
+#define __DAP_CONFIG_H__
+
+#include
+#include
+
+#include "main/dap_configuration.h"
+#include "main/timer.h"
+
+#include "components/DAP/include/cmsis_compiler.h"
+#include "components/DAP/include/gpio_op.h"
+#include "components/DAP/include/spi_switch.h"
+
+
+#include "gpio.h"
+#include "gpio_struct.h"
+#include "esp8266/pin_mux_register.h"
+
+
+//**************************************************************************************************
+/**
+\defgroup DAP_Config_Debug_gr CMSIS-DAP Debug Unit Information
+\ingroup DAP_ConfigIO_gr
+@{
+Provides definitions about the hardware and configuration of the Debug Unit.
+
+This information includes:
+ - Definition of Cortex-M processor parameters used in CMSIS-DAP Debug Unit.
+ - Debug Unit Identification strings (Vendor, Product, Serial Number).
+ - Debug Unit communication packet size.
+ - Debug Access Port supported modes and settings (JTAG/SWD and SWO).
+ - Optional information about a connected Target Device (for Evaluation Boards).
+*/
+
+//#ifdef _RTE_
+//#include "RTE_Components.h"
+//#include CMSIS_device_header
+//#else
+//#include "device.h" // Debug Unit Cortex-M Processor Header File
+//#endif
+
+/// 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 160000000 ///< Specifies the CPU Clock in Hz.
+// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<160MHz
+
+
+//#define MAX_USER_CLOCK 16000000 ///< 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
+/// require 2 processor cycles for a I/O Port Write operation. If the Debug Unit uses
+/// a Cortex-M0+ processor with high-speed peripheral I/O only 1 processor cycle might be
+/// required.
+#define IO_PORT_WRITE_CYCLES 2U ///< I/O Cycles: 2=default, 1=Cortex-M0+ fast I/0.
+
+/// Indicate that Serial Wire Debug (SWD) communication mode is available at the Debug Access Port.
+/// This information is returned by the command \ref DAP_Info as part of Capabilities.
+#define DAP_SWD 1 ///< SWD Mode: 1 = available, 0 = not available.
+
+/// 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.
+
+/// 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.
+#define DAP_JTAG_DEV_CNT 8U ///< Maximum number of JTAG devices on scan chain.
+
+/// Default communication mode on the Debug Access Port.
+/// Used for the command \ref DAP_Connect when Port Default mode is selected.
+#define DAP_DEFAULT_PORT 1U ///< Default JTAG/SWJ Port Mode: 1 = SWD, 2 = JTAG.
+
+/// Default communication speed on the Debug Access Port for SWD and JTAG mode.
+/// Used to initialize the default SWD/JTAG clock frequency.
+/// The command \ref DAP_SWJ_Clock can be used to overwrite this default setting.
+#define DAP_DEFAULT_SWJ_CLOCK 1000000U ///< Default SWD/JTAG clock frequency in Hz.
+// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<1MHz
+
+/// 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 255 ///< Specifies number of packets buffered.
+
+/// Indicates that the SWO function(UART SWO & Streaming Trace) is available
+#define SWO_FUNCTION_ENABLE 0 ///< SWO function: 1 = available, 0 = not available.
+
+
+/// 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 SWO_FUNCTION_ENABLE ///< SWO UART: 1 = available, 0 = not available.
+
+/// Maximum SWO UART Baudrate.
+#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 0 ///< SWO Manchester: 1 = available, 0 = not available.
+// (windowsair)Do not modify. Not support.
+
+
+/// SWO Trace Buffer Size.
+#define SWO_BUFFER_SIZE 2048U ///< SWO Trace Buffer Size in bytes (must be 2^n).
+
+/// SWO Streaming Trace.
+#define SWO_STREAM SWO_FUNCTION_ENABLE ///< 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).
+// <<<<<<<<<<<<<<<<<<<<<5MHz
+
+/// Debug Unit is connected to fixed Target Device.
+/// The Debug Unit may be part of an evaluation board and always connected to a fixed
+/// known device. In this case a Device Vendor and Device Name string is stored which
+/// may be used by the debugger or IDE to configure device parameters.
+#define TARGET_DEVICE_FIXED 0 ///< Target Device: 1 = known, 0 = unknown;
+
+#if TARGET_DEVICE_FIXED
+#define TARGET_DEVICE_VENDOR "ARM" ///< String indicating the Silicon Vendor
+#define TARGET_DEVICE_NAME "Cortex-M4" ///< String indicating the Target Device
+#endif
+
+/**
+ * @brief Get Vendor ID string.
+ *
+ * @param str Pointer to buffer to store the string.
+ * @return String length.
+ */
+__STATIC_INLINE uint8_t DAP_GetVendorString(char *str)
+{
+ // In fact, Keil can get the corresponding information through USB
+ // without filling in this information.
+ // (void)str;
+ strcpy(str, "windowsair");
+ return (sizeof("windowsair"));
+}
+
+/**
+ * @brief Get Product ID string.
+ *
+ * @param str Pointer to buffer to store the string.
+ * @return String length.
+ */
+__STATIC_INLINE uint8_t DAP_GetProductString(char *str)
+{
+ //(void)str;
+ strcpy(str, "CMSIS-DAP v2");
+ return (sizeof("CMSIS-DAP v2"));
+}
+
+/**
+ * @brief Get Serial Number string.
+ *
+ * @param str Pointer to buffer to store the string.
+ * @return String length.
+ */
+__STATIC_INLINE uint8_t DAP_GetSerNumString(char *str)
+{
+ strcpy(str, "1234");
+ return (sizeof("1234"));
+}
+
+///@}
+
+
+// Note: DO NOT modify these pins: PIN_SWDIO PIN_SWDIO_MOSI PIN_SWCLK
+// Modify the following pins carefully: PIN_TDO
+#define PIN_SWDIO 12 // SPI MISO
+#define PIN_SWDIO_MOSI 13 // SPI MOSI
+#define PIN_SWCLK 14
+#define PIN_TDO 16 // device TDO -> Host Data Input (use RTC pin 16)
+#define PIN_TDI 4
+#define PIN_nTRST 0 // optional
+#define PIN_nRESET 5
+// LED_BUILTIN
+#define PIN_LED_CONNECTED 2
+// LED_BUILTIN
+#define PIN_LED_RUNNING 15
+
+//**************************************************************************************************
+/**
+\defgroup DAP_Config_PortIO_gr CMSIS-DAP Hardware I/O Pin Access
+\ingroup DAP_ConfigIO_gr
+@{
+
+Standard I/O Pins of the CMSIS-DAP Hardware Debug Port support standard JTAG mode
+and Serial Wire Debug (SWD) mode. In SWD mode only 2 pins are required to implement the debug
+interface of a device. The following I/O Pins are provided:
+
+JTAG I/O Pin | SWD I/O Pin | CMSIS-DAP Hardware pin mode
+---------------------------- | -------------------- | ---------------------------------------------
+TCK: Test Clock | SWCLK: Clock | Output Push/Pull
+TMS: Test Mode Select | SWDIO: Data I/O | Output Push/Pull; Input (for receiving data)
+TDI: Test Data Input | | Output Push/Pull
+TDO: Test Data Output | | Input
+nTRST: Test Reset (optional) | | Output Open Drain with pull-up resistor
+nRESET: Device Reset | nRESET: Device Reset | Output Open Drain with pull-up resistor
+
+
+DAP Hardware I/O Pin Access Functions
+-------------------------------------
+The various I/O Pins are accessed by functions that implement the Read, Write, Set, or Clear to
+these I/O Pins.
+
+For the SWDIO I/O Pin there are additional functions that are called in SWD I/O mode only.
+This functions are provided to achieve faster I/O that is possible with some advanced GPIO
+peripherals that can independently write/read a single I/O pin without affecting any other pins
+of the same I/O port. The following SWDIO I/O Pin functions are provided:
+ - \ref PIN_SWDIO_OUT_ENABLE to enable the output mode from the DAP hardware.
+ - \ref PIN_SWDIO_OUT_DISABLE to enable the input mode to the DAP hardware.
+ - \ref PIN_SWDIO_IN to read from the SWDIO I/O pin with utmost possible speed.
+ - \ref PIN_SWDIO_OUT to write to the SWDIO I/O pin with utmost possible speed.
+*/
+
+/**
+ * @brief Setup JTAG I/O pins: TCK, TMS, TDI, TDO, nTRST, and nRESET.
+ * Configures the DAP Hardware I/O pins for JTAG mode:
+ * - TCK, TMS, TDI, nTRST, nRESET to ***output*** mode and set to high level.
+ * - TDO to ***input*** mode.
+ *
+ */
+__STATIC_INLINE void PORT_JTAG_SETUP(void)
+{
+ gpio_pin_reg_t pin_reg;
+
+
+ // set TCK, TMS pin
+ PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14); // GPIO14 is SPI CLK pin (Clock)
+ GPIO.enable_w1ts |= (0x1 << 14); // PP Output
+ pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(14));
+ pin_reg.pullup = 1;
+ WRITE_PERI_REG(GPIO_PIN_REG(14), pin_reg.val);
+
+ PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13); // GPIO13 is SPI MOSI pin (Master Data Out)
+ GPIO.enable_w1ts |= (0x1 << 13);
+ GPIO.pin[13].driver = 1; // OD output
+ pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(13));
+ pin_reg.pullup = 0;
+ WRITE_PERI_REG(GPIO_PIN_REG(13), pin_reg.val);
+
+
+ // use RTC pin 16
+ // output disable
+ WRITE_PERI_REG(PAD_XPD_DCDC_CONF, ((READ_PERI_REG(PAD_XPD_DCDC_CONF) & (uint32_t)0xffffffbc)) | (uint32_t)0x1); // mux configuration for XPD_DCDC and rtc_gpio0 connection
+ CLEAR_PERI_REG_MASK(RTC_GPIO_CONF, 0x1); // mux configuration for out enable
+ CLEAR_PERI_REG_MASK(RTC_GPIO_ENABLE, 0x1); // out disable
+ // pulldown disable
+ pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(PIN_TDO));
+ pin_reg.rtc_pin.pulldown = 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);
+}
+
+/**
+ * @brief Setup SWD I/O pins: SWCLK, SWDIO, and nRESET.
+ * Configures the DAP Hardware I/O pins for Serial Wire Debug (SWD) mode:
+ * - SWCLK, SWDIO, nRESET to output mode and set to default high level.
+ * - TDI, nTRST to HighZ mode (pins are unused in SWD mode).
+ *
+ */
+__STATIC_INLINE void PORT_SWD_SETUP(void)
+{
+ // At this stage we do not consider whether to use SPI or GPIO.
+ // We will switch to the specific mode when setting the transfer rate.
+ DAP_SPI_Init();
+ DAP_SPI_Disable();
+}
+
+/**
+ * @brief Disable JTAG/SWD I/O Pins.
+ * Disables the DAP Hardware I/O pins which configures:
+ * - TCK/SWCLK, TMS/SWDIO, TDI, TDO, nTRST, nRESET to High-Z mode.
+ *
+ */
+__STATIC_INLINE void PORT_OFF(void)
+{
+ // Will be called when the DAP disconnected
+ DAP_SPI_Disable();
+}
+
+// SWCLK/TCK I/O pin -------------------------------------
+
+/**
+ * @brief SWCLK/TCK I/O pin: Get Input.
+ *
+ * @return Current status of the SWCLK/TCK DAP hardware I/O pin.
+ */
+__STATIC_FORCEINLINE uint32_t PIN_SWCLK_TCK_IN(void)
+{
+ ////TODO: can we set to 0?
+ return 0;
+}
+
+/**
+ * @brief SWCLK/TCK I/O pin: Set Output to High.
+ *
+ * Set the SWCLK/TCK DAP hardware I/O pin to high level.
+ */
+__STATIC_FORCEINLINE void PIN_SWCLK_TCK_SET(void)
+{
+ GPIO.out_w1ts |= (0x1 << PIN_SWCLK);
+}
+
+/**
+ * @brief SWCLK/TCK I/O pin: Set Output to Low.
+ *
+ * Set the SWCLK/TCK DAP hardware I/O pin to low level.
+ */
+__STATIC_FORCEINLINE void PIN_SWCLK_TCK_CLR(void)
+{
+ GPIO.out_w1tc |= (0x1 << PIN_SWCLK);
+}
+
+// SWDIO/TMS Pin I/O --------------------------------------
+
+/**
+ * @brief SWDIO/TMS I/O pin: Get Input.
+ *
+ * @return Current status of the SWDIO/TMS DAP hardware I/O pin.
+ */
+__STATIC_FORCEINLINE uint32_t PIN_SWDIO_TMS_IN(void)
+{
+ // Note that we only use mosi in GPIO mode
+ return ((GPIO.in >> PIN_SWDIO_MOSI) & 0x1) ? 1 : 0;
+}
+
+/**
+ * @brief SWDIO/TMS I/O pin: Set Output to High.
+ *
+ * Set the SWDIO/TMS DAP hardware I/O pin to high level.
+ */
+__STATIC_FORCEINLINE void PIN_SWDIO_TMS_SET(void)
+{
+ GPIO.out_w1ts |= (0x1 << PIN_SWDIO_MOSI);
+}
+
+/**
+ * @brief SWDIO/TMS I/O pin: Set Output to Low.
+ *
+ * Set the SWDIO/TMS DAP hardware I/O pin to low level.
+ */
+__STATIC_FORCEINLINE void PIN_SWDIO_TMS_CLR(void)
+{
+ GPIO.out_w1tc |= (0x1 << PIN_SWDIO_MOSI);
+}
+
+/**
+ * @brief SWDIO I/O pin: Get Input (used in SWD mode only).
+ *
+ * @return Current status of the SWDIO DAP hardware I/O pin.
+ */
+__STATIC_FORCEINLINE uint32_t PIN_SWDIO_IN(void)
+{
+ // Note that we only use mosi in GPIO mode
+ return ((GPIO.in >> PIN_SWDIO_MOSI) & 0x1) ? 1 : 0;
+}
+
+/**
+ * @brief SWDIO I/O pin: Set Output (used in SWD mode only).
+ *
+ * @param bit Output value for the SWDIO DAP hardware I/O pin.
+ *
+ */
+__STATIC_FORCEINLINE void PIN_SWDIO_OUT(uint32_t bit)
+{
+ /**
+ * Important: Use only one bit (bit0) of param!
+ * Sometimes the func "SWD_TransferFunction" of SW_DP.c will
+ * issue "2" as param instead of "0". Zach Lee
+ */
+ if ((bit & 1U) == 1)
+ {
+ //set bit
+ GPIO.out_w1ts |= (0x1 << PIN_SWDIO_MOSI);
+
+ }
+ else
+ {
+ //reset bit
+ GPIO.out_w1tc |= (0x1 << PIN_SWDIO_MOSI);
+
+ }
+}
+
+/**
+ * @brief SWDIO I/O pin: Switch to Output mode (used in SWD mode only).
+ * Configure the SWDIO DAP hardware I/O pin to output mode. This function is
+ * called prior \ref PIN_SWDIO_OUT function calls.
+ */
+__STATIC_FORCEINLINE void PIN_SWDIO_OUT_ENABLE(void)
+{
+ // set \ref gpio_set_direction -> OUTPUT
+ // GPIO.enable_w1ts |= (0x1 << PIN_SWDIO_MOSI);
+ // GPIO.pin[PIN_SWDIO_MOSI].driver = 0;
+ do {}while (0);
+
+}
+
+/**
+ * @brief SWDIO I/O pin: Switch to Input mode (used in SWD mode only).
+ * Configure the SWDIO DAP hardware I/O pin to input mode. This function is
+ * called prior \ref PIN_SWDIO_IN function calls.
+ */
+__STATIC_FORCEINLINE void PIN_SWDIO_OUT_DISABLE(void)
+{
+ // may be unuse.
+ // set \ref gpio_set_dircetion -> INPUT
+ // esp8266 input is always connected
+ // GPIO.enable_w1tc |= (0x1 << PIN_SWDIO_MOSI);
+ // GPIO.pin[PIN_SWDIO_MOSI].driver = 0;
+ GPIO.out_w1ts |= (0x1 << PIN_SWDIO_MOSI);
+}
+
+// TDI Pin I/O ---------------------------------------------
+
+/**
+ * @brief TDI I/O pin: Get Input.
+ *
+ * @return Current status of the TDI DAP hardware I/O pin.
+ */
+__STATIC_FORCEINLINE uint32_t PIN_TDI_IN(void)
+{
+ return ((GPIO.in >> PIN_TDI) & 0x1) ? 1 : 0;
+}
+
+/**
+ * @brief TDI I/O pin: Set Output.
+ *
+ * @param bit Output value for the TDI DAP hardware I/O pin.
+ *
+ */
+__STATIC_FORCEINLINE void PIN_TDI_OUT(uint32_t bit)
+{
+ if ((bit & 1U) == 1)
+ {
+ //set bit
+ GPIO.out_w1ts |= (0x1 << PIN_TDI);
+
+ }
+ else
+ {
+ //reset bit
+ GPIO.out_w1tc |= (0x1 << PIN_TDI);
+
+ }
+}
+
+// TDO Pin I/O ---------------------------------------------
+
+/**
+ * @brief TDO I/O pin: Get Input.
+ *
+ * @return Current status of the TDO DAP hardware I/O pin.
+ */
+__STATIC_FORCEINLINE uint32_t PIN_TDO_IN(void)
+{
+ return READ_PERI_REG(RTC_GPIO_IN_DATA) & 0x1;
+}
+
+// nTRST Pin I/O -------------------------------------------
+
+/**
+ * @brief nTRST I/O pin: Get Input.
+ *
+ * @return Current status of the nTRST DAP hardware I/O pin.
+ */
+__STATIC_FORCEINLINE uint32_t PIN_nTRST_IN(void)
+{
+ return 0; // not available
+}
+
+/**
+ * @brief nTRST I/O pin: Set Output.
+ *
+ * @param bit JTAG TRST Test Reset pin status:
+ * - 0: issue a JTAG TRST Test Reset.
+ - 1: release JTAG TRST Test Reset.
+ */
+__STATIC_FORCEINLINE void PIN_nTRST_OUT(uint32_t bit)
+{
+ // Vendor reset sequence
+ ; // not available
+}
+
+// nRESET Pin I/O------------------------------------------
+
+/**
+ * @brief nRESET I/O pin: Get Input.
+ *
+ * @return Current status of the nRESET DAP hardware I/O pin.
+ */
+__STATIC_FORCEINLINE uint32_t PIN_nRESET_IN(void)
+{
+ return ((GPIO.in >> PIN_nRESET) & 0x1) ? 1 : 0;
+}
+
+/**
+ * @brief nRESET I/O pin: Set Output.
+ *
+ * @param bit target device hardware reset pin status:
+ * - 0: issue a device hardware reset.
+ * - 1: release device hardware reset.
+ */
+__STATIC_FORCEINLINE void PIN_nRESET_OUT(uint32_t bit)
+{
+ // Vendor reset sequence
+ //// FIXME: unavailable
+ if ((bit & 1U) == 1)
+ {
+ //set bit
+ GPIO.out_w1ts |= (0x1 << PIN_nRESET);
+ }
+ else
+ {
+ //reset bit
+ GPIO.out_w1tc |= (0x1 << PIN_nRESET);
+ }
+}
+
+///@}
+
+//**************************************************************************************************
+/**
+\defgroup DAP_Config_LEDs_gr CMSIS-DAP Hardware Status LEDs
+\ingroup DAP_ConfigIO_gr
+@{
+
+CMSIS-DAP Hardware may provide LEDs that indicate the status of the CMSIS-DAP Debug Unit.
+
+It is recommended to provide the following LEDs for status indication:
+ - Connect LED: is active when the DAP hardware is connected to a debugger.
+ - Running LED: is active when the debugger has put the target device into running state.
+*/
+
+/** Debug Unit: Set status of Connected LED.
+\param bit status of the Connect LED.
+ - 1: Connect LED ON: debugger is connected to CMSIS-DAP Debug Unit.
+ - 0: Connect LED OFF: debugger is not connected to CMSIS-DAP Debug Unit.
+*/
+
+/**
+ * @brief Debug Unit: Set status of Connected LED.
+ *
+ * @param bit status of the Connect LED.
+ * - 1: Connect LED ON: debugger is connected to CMSIS-DAP Debug Unit.
+ * - 0: Connect LED OFF: debugger is not connected to CMSIS-DAP Debug Unit.
+ */
+__STATIC_INLINE void LED_CONNECTED_OUT(uint32_t bit)
+{
+ if (bit)
+ {
+ //set bit
+ GPIO.out_w1ts |= (0x1 << PIN_LED_CONNECTED);
+ }
+ else
+ {
+ //reset bit
+ GPIO.out_w1tc |= (0x1 << PIN_LED_CONNECTED);
+ }
+}
+
+/**
+ * @brief Debug Unit: Set status Target Running LED.
+ *
+ * @param bit status of the Target Running LED.
+ * - 1: Target Running LED ON: program execution in target started.
+ * - 0: Target Running LED OFF: program execution in target stopped.
+ */
+__STATIC_INLINE void LED_RUNNING_OUT(uint32_t bit)
+{
+ if (bit)
+ {
+ //set bit
+ GPIO.out_w1ts |= (0x1 << PIN_LED_RUNNING);
+ }
+ else
+ {
+ //reset bit
+ GPIO.out_w1tc |= (0x1 << PIN_LED_RUNNING);
+ }
+}
+
+///@}
+
+//**************************************************************************************************
+/**
+\defgroup DAP_Config_Timestamp_gr CMSIS-DAP Timestamp
+\ingroup DAP_ConfigIO_gr
+@{
+Access function for Test Domain Timer.
+
+The value of the Test Domain Timer in the Debug Unit is returned by the function \ref TIMESTAMP_GET. By
+default, the DWT timer is used. The frequency of this timer is configured with \ref TIMESTAMP_CLOCK.
+
+*/
+
+/**
+ * @brief Get timestamp of Test Domain Timer.
+ *
+ * @return Current timestamp value.
+ */
+__STATIC_INLINE uint32_t TIMESTAMP_GET(void)
+{
+ return get_timer_count();
+}
+
+///@}
+
+//**************************************************************************************************
+/**
+\defgroup DAP_Config_Initialization_gr CMSIS-DAP Initialization
+\ingroup DAP_ConfigIO_gr
+@{
+
+CMSIS-DAP Hardware I/O and LED Pins are initialized with the function \ref DAP_SETUP.
+*/
+
+/** Setup of the Debug Unit I/O pins and LEDs (called when Debug Unit is initialized).
+This function performs the initialization of the CMSIS-DAP Hardware I/O Pins and the
+Status LEDs. In detail the operation of Hardware I/O and LED pins are enabled and set:
+ - I/O clock system enabled.
+ - all I/O pins: input buffer enabled, output pins are set to HighZ mode.
+ - for nTRST, nRESET a weak pull-up (if available) is enabled.
+ - LED output pins are enabled and LEDs are turned off.
+*/
+__STATIC_INLINE void DAP_SETUP(void)
+{
+ // Connecting non-SWD pins to GPIO
+ GPIO_FUNCTION_SET(PIN_TDO);
+ GPIO_FUNCTION_SET(PIN_TDI);
+ GPIO_FUNCTION_SET(PIN_nTRST);
+ GPIO_FUNCTION_SET(PIN_nRESET);
+ GPIO_FUNCTION_SET(PIN_LED_CONNECTED);
+ GPIO_FUNCTION_SET(PIN_LED_RUNNING);
+
+
+ // Configure: LED as output (turned off)
+
+ GPIO_SET_DIRECTION_NORMAL_OUT(PIN_LED_CONNECTED);
+ GPIO_SET_DIRECTION_NORMAL_OUT(PIN_LED_RUNNING);
+
+ LED_CONNECTED_OUT(0);
+ LED_RUNNING_OUT(0);
+
+ PORT_OFF();
+}
+
+/** Reset Target Device with custom specific I/O pin or command sequence.
+This function allows the optional implementation of a device specific reset sequence.
+It is called when the command \ref DAP_ResetTarget and is for example required
+when a device needs a time-critical unlock sequence that enables the debug port.
+\return 0 = no device specific reset sequence is implemented.\n
+ 1 = a device specific reset sequence is implemented.
+*/
+__STATIC_INLINE uint8_t RESET_TARGET(void)
+{
+ return (0U); // not available
+}
+
+///@}
+
+#endif /* __DAP_CONFIG_H__ */
diff --git a/components/DAP/include/DAP.h b/components/DAP/include/DAP.h
index e7260d3..a011a92 100644
--- a/components/DAP/include/DAP.h
+++ b/components/DAP/include/DAP.h
@@ -273,8 +273,8 @@ extern void SWO_TransferComplete (void);
extern uint32_t UART_SWO_Mode (uint32_t enable);
extern uint32_t UART_SWO_Baudrate (uint32_t baudrate);
extern uint32_t UART_SWO_Control (uint32_t active);
-extern void UART_SWO_Capture (uint8_t *buf, uint32_t num);
-extern uint32_t UART_SWO_GetCount (void);
+// extern void UART_SWO_Capture (uint8_t *buf, uint32_t num);
+// extern uint32_t UART_SWO_GetCount (void);
extern uint32_t Manchester_SWO_Mode (uint32_t enable);
extern uint32_t Manchester_SWO_Baudrate (uint32_t baudrate);
diff --git a/components/DAP/include/cmsis_compiler.h b/components/DAP/include/cmsis_compiler.h
index 9d032bb..d448225 100644
--- a/components/DAP/include/cmsis_compiler.h
+++ b/components/DAP/include/cmsis_compiler.h
@@ -2,13 +2,13 @@
#define __CMSIS_COMPILER_H__
#ifndef __STATIC_FORCEINLINE
- #define __STATIC_FORCEINLINE static inline __attribute__((always_inline))
+ #define __STATIC_FORCEINLINE static inline __attribute__((always_inline))
#endif
#ifndef __STATIC_INLINE
#define __STATIC_INLINE static inline __attribute__((always_inline))
#endif
#ifndef __FORCEINLINE
- #define __FORCEINLINE inline __attribute__((always_inline))
+ #define __FORCEINLINE inline __attribute__((always_inline))
#endif
#ifndef __WEAK
#define __WEAK __attribute__((weak))
diff --git a/components/DAP/include/dap_utility.h b/components/DAP/include/dap_utility.h
index ee25c6f..08ea438 100644
--- a/components/DAP/include/dap_utility.h
+++ b/components/DAP/include/dap_utility.h
@@ -4,7 +4,7 @@
#include
#ifndef __STATIC_FORCEINLINE
- #define __STATIC_FORCEINLINE static inline __attribute__((always_inline))
+ #define __STATIC_FORCEINLINE static inline __attribute__((always_inline))
#endif
#ifndef __STATIC_INLINE
#define __STATIC_INLINE static inline __attribute__((always_inline))
diff --git a/components/DAP/include/gpio_op.h b/components/DAP/include/gpio_op.h
index 30b214d..48888cf 100644
--- a/components/DAP/include/gpio_op.h
+++ b/components/DAP/include/gpio_op.h
@@ -1,7 +1,8 @@
#ifndef __GPIO_OP_H__
#define __GPIO_OP_H__
-#include "cmsis_compiler.h"
+#include "components/DAP/include/cmsis_compiler.h"
+
#include "gpio.h"
#include "gpio_struct.h"
#include "timer_struct.h"
diff --git a/components/DAP/include/swo.h b/components/DAP/include/swo.h
new file mode 100644
index 0000000..b7d1ff5
--- /dev/null
+++ b/components/DAP/include/swo.h
@@ -0,0 +1,17 @@
+#ifndef __SWO_H__
+#define __SWO_H__
+
+typedef void * EventGroupHandle_t;
+
+// event group bits
+#define SWO_GOT_DATA 0x00000001
+#define UART_GOT_DATA 0x00000002
+#define SWO_ERROR_TIME_OUT 0x00000004
+
+extern EventGroupHandle_t kSwoThreadEventGroup;
+extern volatile uint8_t kSwoTransferBusy;
+
+
+void SetTraceError(uint8_t flag); // Use in the uart handler
+
+#endif
\ No newline at end of file
diff --git a/components/DAP/include/uart_modify.h b/components/DAP/include/uart_modify.h
index 3d3a277..2a62ed4 100644
--- a/components/DAP/include/uart_modify.h
+++ b/components/DAP/include/uart_modify.h
@@ -1,6 +1,6 @@
/**
* @brief Made some simple modifications to the official UART
- *
+ *
*/
// Copyright 2018-2025 Espressif Systems (Shanghai) PTE LTD
@@ -27,7 +27,15 @@ extern "C" {
#include "esp_err.h"
#include "esp_log.h"
+#include "freertos/FreeRTOS.h"
#include "freertos/queue.h"
+#include "freertos/semphr.h"
+
+// SWO modify
+extern volatile uint32_t kSWO_read_index;
+extern volatile uint32_t kSWO_read_num;
+extern volatile uint8_t kSWO_uart_notify_enable;
+extern SemaphoreHandle_t kSWO_read_mux;
#define UART_FIFO_LEN (128) /*!< Length of the hardware FIFO buffers */
#define UART_INTR_MASK 0x1ff /*!< Mask of all UART interrupts */
@@ -428,7 +436,7 @@ esp_err_t my_uart_intr_config(uart_port_t uart_num, uart_intr_config_t *uart_int
* @param uart_queue UART event queue handle (out param). On success, a new queue handle is written here to provide
* access to UART events. If set to NULL, driver will not use an event queue.
* @param no_use Invalid parameters, just to fit some modules.
- *
+ *
* @return
* - ESP_OK Success
* - ESP_ERR_INVALID_ARG Parameter error
@@ -558,6 +566,30 @@ esp_err_t my_uart_get_buffered_data_len(uart_port_t uart_num, size_t *size);
*/
esp_err_t my_uart_set_rx_timeout(uart_port_t uart_num, const uint8_t tout_thresh);
+
+/**
+ * @brief Asynchronously read bytes to swo buffer
+ * @note This function only serves as a notification,
+ * and will initiate a callback when the buffer reaches the length since we modify the uart
+ * @param index buffer index to read
+ * @param length data length
+ * @return esp_err_t
+ * - ESP_OK Success
+ * - ESP_FAIL There are still unfinished requests
+ */
+esp_err_t my_uart_read_bytes_async_swo(uint32_t index, uint32_t length);
+
+
+/**
+ * @brief UART get RX ring buffer cached data length
+ * @note This function is basically equivalent to \ref my_uart_get_buffered_data_len
+ * @param uart_num UART port number.
+ *
+ * @return data length
+ */
+int my_uart_get_rx_buffered_data_len(uart_port_t uart_num);
+
+
#ifdef __cplusplus
}
#endif
diff --git a/components/DAP/source/DAP.c b/components/DAP/source/DAP.c
index 973f0fb..6079067 100644
--- a/components/DAP/source/DAP.c
+++ b/components/DAP/source/DAP.c
@@ -26,10 +26,10 @@
*---------------------------------------------------------------------------*/
#include
-#include "DAP_config.h"
-#include "DAP.h"
-#include "spi_switch.h"
+#include "components/DAP/config/DAP_config.h"
+#include "components/DAP/include/DAP.h"
+#include "components/DAP/include/spi_switch.h"
#if (DAP_PACKET_SIZE < 64U)
@@ -385,10 +385,15 @@ static uint32_t DAP_SWJ_Clock(const uint8_t *request, uint8_t *response) {
// clock >= 10MHz -> use 40MHz SPI
if (clock >= 10000000) {
- DAP_SPI_Init();
+ if (DAP_Data.debug_port != DAP_PORT_JTAG) {
+ DAP_SPI_Init();
+ SWD_TransferSpeed = kTransfer_SPI;
+ } else {
+ SWD_TransferSpeed = kTransfer_GPIO_fast;
+ }
DAP_Data.fast_clock = 1U;
DAP_Data.clock_delay = 1U;
- SWD_TransferSpeed = kTransfer_SPI;
+
} else if (clock >= 2000000) {
// clock >= 2MHz -> Use GPIO with no program delay
DAP_SPI_Deinit();
diff --git a/components/DAP/source/DAP_vendor.c b/components/DAP/source/DAP_vendor.c
index a4ae496..3579918 100644
--- a/components/DAP/source/DAP_vendor.c
+++ b/components/DAP/source/DAP_vendor.c
@@ -24,18 +24,18 @@
* Title: DAP_vendor.c CMSIS-DAP Vendor Commands
*
*---------------------------------------------------------------------------*/
-
-#include "DAP_config.h"
-#include "DAP.h"
+
+#include "components/DAP/config/DAP_config.h"
+#include "components/DAP/include/DAP.h"
//**************************************************************************************************
-/**
+/**
\defgroup DAP_Vendor_Adapt_gr Adapt Vendor Commands
-\ingroup DAP_Vendor_gr
+\ingroup DAP_Vendor_gr
@{
-The file DAP_vendor.c provides template source code for extension of a Debug Unit with
-Vendor Commands. Copy this file to the project folder of the Debug Unit and add the
+The file DAP_vendor.c provides template source code for extension of a Debug Unit with
+Vendor Commands. Copy this file to the project folder of the Debug Unit and add the
file to the MDK-ARM project under the file group Configuration.
*/
diff --git a/components/DAP/source/JTAG_DP.c b/components/DAP/source/JTAG_DP.c
index 24b1f3f..f5c9d5e 100644
--- a/components/DAP/source/JTAG_DP.c
+++ b/components/DAP/source/JTAG_DP.c
@@ -25,8 +25,8 @@
*
*---------------------------------------------------------------------------*/
-#include "DAP_config.h"
-#include "DAP.h"
+#include "components/DAP/config/DAP_config.h"
+#include "components/DAP/include/DAP.h"
// JTAG Macros
diff --git a/components/DAP/source/SWO.c b/components/DAP/source/SWO.c
index d331a0c..4e2fcdc 100644
--- a/components/DAP/source/SWO.c
+++ b/components/DAP/source/SWO.c
@@ -1,6 +1,14 @@
/**
- * @brief Modify this file to fit esp8266 Uart
- *
+ * @file SWO.c
+ * @author windowsair
+ * @brief SWO support
+ * @change: 2021-02-17: Add basic functions
+ * @version 0.2
+ *
+ * @date 2021-02-17
+ *
+ * @copyright Copyright (c) 2021
+ *
*/
/*
@@ -30,22 +38,18 @@
*
*---------------------------------------------------------------------------*/
-#include "DAP_config.h"
-#include "DAP.h"
+#include "components/DAP/config/DAP_config.h"
+#include "components/DAP/include/DAP.h"
+#include "components/DAP/include/uart_modify.h"
+#include "components/DAP/include/swo.h"
#include "esp_err.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
-#include "uart_modify.h"
-EventGroupHandle_t kSWO_Thread_event_group;
-EventGroupHandle_t kUART_Monitoe_event_group;
-#define SWO_GOT_DATA BIT0
-#define SWO_ERROR_TIME_OUT BIT1
-
-#define UART_GOT_DATA BIT0
+EventGroupHandle_t kSwoThreadEventGroup;
#if (SWO_STREAM != 0)
@@ -61,14 +65,14 @@ EventGroupHandle_t kUART_Monitoe_event_group;
#endif
-
+// use in baudrate setting
static uint8_t USART_Ready = 0U;
#endif /* (SWO_UART != 0) */
#if ((SWO_UART != 0) || (SWO_MANCHESTER != 0))
-#define SWO_STREAM_TIMEOUT (50 / portTICK_RATE_MS) /* Stream timeout in ms */
+#define SWO_STREAM_TIMEOUT pdMS_TO_TICKS(50) /* Stream timeout in ms */
#define USB_BLOCK_SIZE 512U /* USB Block Size */
#define TRACE_BLOCK_SIZE 64U /* Trace Block Size (2^n: 32...512) */
@@ -81,7 +85,7 @@ static uint8_t TraceError[2] = {0U, 0U}; /* Trace Error flags (banked) */
static uint8_t TraceError_n = 0U; /* Active Trace Error bank */
// Trace Buffer
-static uint8_t TraceBuf[SWO_BUFFER_SIZE]; /* Trace Buffer (must be 2^n) */
+static uint8_t kSwoTraceBuf[SWO_BUFFER_SIZE]; /* Trace Buffer (must be 2^n) */
static volatile uint32_t TraceIndexI = 0U; /* Incoming Trace Index */
static volatile uint32_t TraceIndexO = 0U; /* Outgoing Trace Index */
static volatile uint8_t TraceUpdate; /* Trace Update Flag */
@@ -101,105 +105,35 @@ static void ClearTrace(void);
static void ResumeTrace(void);
static uint32_t GetTraceCount(void);
static uint8_t GetTraceStatus(void);
-void SetTraceError(uint8_t flag);
#if (SWO_STREAM != 0)
-static volatile uint8_t TransferBusy = 0U; /* Transfer Busy Flag */
-static uint32_t TransferSize; /* Current Transfer Size */
+volatile uint8_t kSwoTransferBusy = 0U; /* Transfer Busy Flag */
+static uint32_t TransferSize; /* Current Transfer Size */
#endif
#if (SWO_UART != 0)
-void usart_monitor_task(void *argument)
-{
- uint32_t index_i;
- uint32_t index_o;
- uint32_t count;
- uint32_t num;
- uint32_t flags;
-
- kUART_Monitoe_event_group = xEventGroupCreate();
- for (;;)
- {
- flags = xEventGroupWaitBits(kUART_Monitoe_event_group, UART_GOT_DATA,
- pdTRUE, pdFALSE, portMAX_DELAY);
- if (flags & UART_GOT_DATA)
- {
-#if (TIMESTAMP_CLOCK != 0U)
- TraceTimestamp.tick = TIMESTAMP_GET();
-#endif
- index_o = TraceIndexO;
- index_i = TraceIndexI;
- index_i += TraceBlockSize;
- TraceIndexI = index_i;
-#if (TIMESTAMP_CLOCK != 0U)
- TraceTimestamp.index = index_i;
-#endif
-
- num = TRACE_BLOCK_SIZE - (index_i & (TRACE_BLOCK_SIZE - 1U));
- // num is the number of bytes we need to read
- // (to achieve the size of TRACE_BLOCK_SIZE)
- count = index_i - index_o;
- // Amount of data that has not been processed yet
-
- // (SWO_BUFFER_SIZE-num): the remaining usable length of the buffer after reading this data
- if (count <= (SWO_BUFFER_SIZE - num))
- {
- index_i &= SWO_BUFFER_SIZE - 1U;
- TraceBlockSize = num;
- my_uart_read_bytes(USART_PORT, &TraceBuf[index_i], num, 20 / portTICK_RATE_MS);
- //pUSART->Receive(&TraceBuf[index_i], num);
- }
- else
- {
- // Not enough buffers
- TraceStatus = DAP_SWO_CAPTURE_ACTIVE | DAP_SWO_CAPTURE_PAUSED;
- }
- TraceUpdate = 1U;
-#if (SWO_STREAM != 0)
- if (TraceTransport == 2U)
- {
- if (count >= (USB_BLOCK_SIZE - (index_o & (USB_BLOCK_SIZE - 1U))))
- {
- xEventGroupSetBits(kSWO_Thread_event_group, SWO_GOT_DATA);
- }
- }
-#endif
- }
- }
-
- // if (event & ARM_USART_EVENT_RX_OVERFLOW)
- // {
- // SetTraceError(DAP_SWO_BUFFER_OVERRUN);
- // }
- // if (event & (ARM_USART_EVENT_RX_BREAK |
- // ARM_USART_EVENT_RX_FRAMING_ERROR |
- // ARM_USART_EVENT_RX_PARITY_ERROR))
- // {
- // SetTraceError(DAP_SWO_STREAM_ERROR);
- // }
-}
// Enable or disable UART SWO Mode
// enable: enable flag
// return: 1 - Success, 0 - Error
-__WEAK uint32_t UART_SWO_Mode(uint32_t enable)
+uint32_t UART_SWO_Mode(uint32_t enable)
{
int32_t status;
USART_Ready = 0U;
uart_config_t uart_config = {
- .baud_rate = 115200,
+ .baud_rate = 74880,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE};
- my_uart_param_config(USART_PORT, &uart_config);
+ my_uart_param_config(USART_PORT, &uart_config); // register setting
#define BUF_SIZE (1024)
- my_uart_driver_install(USART_PORT, BUF_SIZE, 0, 0, NULL, 0);
+//// TODO: remove this
if (enable != 0U)
{
@@ -207,6 +141,7 @@ __WEAK uint32_t UART_SWO_Mode(uint32_t enable)
status = my_uart_driver_install(USART_PORT, BUF_SIZE, 0, 0, NULL, 0);
if (status != ESP_OK)
{
+ my_uart_driver_delete(USART_PORT);
return (0U);
}
}
@@ -214,6 +149,7 @@ __WEAK uint32_t UART_SWO_Mode(uint32_t enable)
{
my_uart_driver_delete(USART_PORT);
}
+
return (1U);
@@ -222,11 +158,12 @@ __WEAK uint32_t UART_SWO_Mode(uint32_t enable)
// Configure UART SWO Baudrate
// baudrate: requested baudrate
// return: actual baudrate or 0 when not configured
-__WEAK uint32_t UART_SWO_Baudrate(uint32_t baudrate)
+uint32_t UART_SWO_Baudrate(uint32_t baudrate)
{
- int32_t status;
+ //// TODO: There may be bugs.
+ //int32_t status;
uint32_t index;
- uint32_t num;
+ uint32_t remain_trace_block_size;
if (baudrate > SWO_UART_MAX_BAUDRATE)
{
@@ -235,10 +172,8 @@ __WEAK uint32_t UART_SWO_Baudrate(uint32_t baudrate)
if (TraceStatus & DAP_SWO_CAPTURE_ACTIVE)
{
- size_t len = 0;
- my_uart_get_buffered_data_len(USART_PORT, &len);
+ TraceIndexI += my_uart_get_rx_buffered_data_len(USART_PORT);
my_uart_flush(USART_PORT);
- TraceIndexI += len;
// pUSART->Control(ARM_USART_CONTROL_RX, 0U);
// if (pUSART->GetStatus().rx_busy)
// {
@@ -248,29 +183,21 @@ __WEAK uint32_t UART_SWO_Baudrate(uint32_t baudrate)
}
/////////////
- status = my_uart_set_baudrate(USART_PORT, baudrate);
+ my_uart_set_baudrate(USART_PORT, baudrate);
+
+ USART_Ready = 1U;
- if (status == ESP_OK)
- {
- USART_Ready = 1U;
- }
- else
- {
- USART_Ready = 0U;
- return (0U);
- }
-
if (TraceStatus & DAP_SWO_CAPTURE_ACTIVE)
{
if ((TraceStatus & DAP_SWO_CAPTURE_PAUSED) == 0U)
{
- index = TraceIndexI & (SWO_BUFFER_SIZE - 1U);
- num = TRACE_BLOCK_SIZE - (index & (TRACE_BLOCK_SIZE - 1U));
- TraceBlockSize = num;
- //pUSART->Receive(&TraceBuf[index], num);
- my_uart_read_bytes(USART_PORT, &TraceBuf[index], num, 20 / portTICK_RATE_MS);
+ index = TraceIndexI & (SWO_BUFFER_SIZE - 1U); // TraceIndexI % SWO_BUFFER_SIZE
+ remain_trace_block_size = TRACE_BLOCK_SIZE - (index & (TRACE_BLOCK_SIZE - 1U)); // index % TRACE_BLOCK_SIZE
+ TraceBlockSize = remain_trace_block_size;
+ //pUSART->Receive(&kSwoTraceBuf[index], num);
+ my_uart_read_bytes_async_swo(index, remain_trace_block_size);
}
- //pUSART->Control(ARM_USART_CONTROL_RX, 1U); ////TODO:
+ //pUSART->Control(ARM_USART_CONTROL_RX, 1U);
}
return (baudrate);
@@ -279,7 +206,7 @@ __WEAK uint32_t UART_SWO_Baudrate(uint32_t baudrate)
// Control UART SWO Capture
// active: active flag
// return: 1 - Success, 0 - Error
-__WEAK uint32_t UART_SWO_Control(uint32_t active)
+uint32_t UART_SWO_Control(uint32_t active)
{
int32_t status;
@@ -290,7 +217,8 @@ __WEAK uint32_t UART_SWO_Control(uint32_t active)
return (0U);
}
TraceBlockSize = 1U;
- status = my_uart_read_bytes(USART_PORT, &TraceBuf[0], 1U, 20 / portTICK_RATE_MS);
+ status = my_uart_read_bytes_async_swo(0, 1U);
+
if (status == ESP_FAIL)
{
return (0U);
@@ -299,14 +227,13 @@ __WEAK uint32_t UART_SWO_Control(uint32_t active)
// if (status != ARM_DRIVER_OK)
// {
// return (0U);
- // } ////TODO:
+ // }
}
else
{
- size_t len = 0;
- my_uart_get_buffered_data_len(USART_PORT, &len);
+ // no active
+ TraceIndexI += my_uart_get_rx_buffered_data_len(USART_PORT);
my_uart_flush(USART_PORT);
- TraceIndexI += len;
// pUSART->Control(ARM_USART_CONTROL_RX, 0U);
// if (pUSART->GetStatus().rx_busy)
// {
@@ -318,20 +245,19 @@ __WEAK uint32_t UART_SWO_Control(uint32_t active)
}
// Start UART SWO Capture
-// buf: pointer to buffer for capturing
+// index: trace buffer index to read
// num: number of bytes to capture
-__WEAK void UART_SWO_Capture(uint8_t *buf, uint32_t num)
+static void UART_SWO_Capture(uint32_t index, uint32_t num)
{
TraceBlockSize = num;
- my_uart_read_bytes(USART_PORT, buf, num, 20 / portTICK_RATE_MS);
+ my_uart_read_bytes_async_swo(index, num);
}
// Get UART SWO Pending Trace Count
// return: number of pending trace data bytes
-__WEAK uint32_t UART_SWO_GetCount(void)
+static uint32_t UART_SWO_GetCount(void)
{
- uint32_t count;
-
+ //// TODO: There may be bugs.
// if (pUSART->GetStatus().rx_busy)
// {
// count = pUSART->GetRxCount();
@@ -340,65 +266,31 @@ __WEAK uint32_t UART_SWO_GetCount(void)
// {
// count = 0U;
// }
- my_uart_get_buffered_data_len(USART_PORT, &count);
- return (count);
+ return my_uart_get_rx_buffered_data_len(USART_PORT);
+
}
#endif /* (SWO_UART != 0) */
-#if (SWO_MANCHESTER != 0)
-// Enable or disable Manchester SWO Mode
-// enable: enable flag
-// return: 1 - Success, 0 - Error
-__WEAK uint32_t Manchester_SWO_Mode(uint32_t enable)
-{
- return (0U);
-}
-// Configure Manchester SWO Baudrate
-// baudrate: requested baudrate
-// return: actual baudrate or 0 when not configured
-__WEAK uint32_t Manchester_SWO_Baudrate(uint32_t baudrate)
-{
- return (0U);
-}
+//
+// Trace status helper functions
+//
-// Control Manchester SWO Capture
-// active: active flag
-// return: 1 - Success, 0 - Error
-__WEAK uint32_t Manchester_SWO_Control(uint32_t active)
-{
- return (0U);
-}
-
-// Start Manchester SWO Capture
-// buf: pointer to buffer for capturing
-// num: number of bytes to capture
-__WEAK void Manchester_SWO_Capture(uint8_t *buf, uint32_t num)
-{
-}
-
-// Get Manchester SWO Pending Trace Count
-// return: number of pending trace data bytes
-__WEAK uint32_t Manchester_SWO_GetCount(void)
-{
- return (0U);
-}
-
-#endif /* (SWO_MANCHESTER != 0) */
// Clear Trace Errors and Data
static void ClearTrace(void)
{
#if (SWO_STREAM != 0)
- if (TraceTransport == 2U)
+ if (TraceTransport == 2U) // Indicates that we use WinUSB for transfer.
{
- if (TransferBusy != 0U)
+ if (kSwoTransferBusy != 0U)
{
- SWO_AbortTransfer();
- TransferBusy = 0U;
+ // Unfortunately, we cannot abort the transmission
+ // SWO_AbortTransfer();
+ kSwoTransferBusy = 0U;
}
}
#endif
@@ -430,18 +322,10 @@ static void ResumeTrace(void)
index_i &= SWO_BUFFER_SIZE - 1U;
switch (TraceMode)
{
-#if (SWO_UART != 0)
case DAP_SWO_UART:
TraceStatus = DAP_SWO_CAPTURE_ACTIVE;
- UART_SWO_Capture(&TraceBuf[index_i], 1U);
+ UART_SWO_Capture(index_i, 1U);
break;
-#endif
-#if (SWO_MANCHESTER != 0)
- case DAP_SWO_MANCHESTER:
- TraceStatus = DAP_SWO_CAPTURE_ACTIVE;
- Manchester_SWO_Capture(&TraceBuf[index_i], 1U);
- break;
-#endif
default:
break;
}
@@ -463,20 +347,15 @@ static uint32_t GetTraceCount(void)
count = TraceIndexI - TraceIndexO;
switch (TraceMode)
{
-#if (SWO_UART != 0)
case DAP_SWO_UART:
count += UART_SWO_GetCount();
break;
-#endif
-#if (SWO_MANCHESTER != 0)
- case DAP_SWO_MANCHESTER:
- count += Manchester_SWO_GetCount();
- break;
-#endif
default:
break;
}
+ vTaskDelay(pdMS_TO_TICKS(10));
} while (TraceUpdate != 0U);
+ // Synchronously wait for the data to complete
}
else
{
@@ -541,14 +420,7 @@ uint32_t SWO_Transport(const uint8_t *request, uint8_t *response)
result = 0U;
}
- if (result != 0U)
- {
- *response = DAP_OK;
- }
- else
- {
- *response = DAP_ERROR;
- }
+ *response = result ? DAP_OK : DAP_ERROR;
return ((1U << 16) | 1U);
}
@@ -565,6 +437,7 @@ uint32_t SWO_Mode(const uint8_t *request, uint8_t *response)
mode = *request;
+ // disable swo mode
switch (TraceMode)
{
#if (SWO_UART != 0)
@@ -572,11 +445,7 @@ uint32_t SWO_Mode(const uint8_t *request, uint8_t *response)
UART_SWO_Mode(0U);
break;
#endif
-#if (SWO_MANCHESTER != 0)
- case DAP_SWO_MANCHESTER:
- Manchester_SWO_Mode(0U);
- break;
-#endif
+
default:
break;
}
@@ -591,34 +460,18 @@ uint32_t SWO_Mode(const uint8_t *request, uint8_t *response)
result = UART_SWO_Mode(1U);
break;
#endif
-#if (SWO_MANCHESTER != 0)
- case DAP_SWO_MANCHESTER:
- result = Manchester_SWO_Mode(1U);
- break;
-#endif
+
default:
result = 0U;
break;
}
- if (result != 0U)
- {
- TraceMode = mode;
- }
- else
- {
- TraceMode = DAP_SWO_OFF;
- }
+
+ // DAP_SWO_OFF -> has error
+ TraceMode = result ? mode : DAP_SWO_OFF;
TraceStatus = 0U;
- if (result != 0U)
- {
- *response = DAP_OK;
- }
- else
- {
- *response = DAP_ERROR;
- }
+ *response = result ? DAP_OK : DAP_ERROR;
return ((1U << 16) | 1U);
}
@@ -644,11 +497,7 @@ uint32_t SWO_Baudrate(const uint8_t *request, uint8_t *response)
baudrate = UART_SWO_Baudrate(baudrate);
break;
#endif
-#if (SWO_MANCHESTER != 0)
- case DAP_SWO_MANCHESTER:
- baudrate = Manchester_SWO_Baudrate(baudrate);
- break;
-#endif
+
default:
baudrate = 0U;
break;
@@ -681,7 +530,9 @@ uint32_t SWO_Control(const uint8_t *request, uint8_t *response)
if (active != (TraceStatus & DAP_SWO_CAPTURE_ACTIVE))
{
- if (active)
+ // active status: request != now status
+
+ if (active) // request: active
{
ClearTrace();
}
@@ -692,39 +543,32 @@ uint32_t SWO_Control(const uint8_t *request, uint8_t *response)
result = UART_SWO_Control(active);
break;
#endif
-#if (SWO_MANCHESTER != 0)
- case DAP_SWO_MANCHESTER:
- result = Manchester_SWO_Control(active);
- break;
-#endif
+
default:
result = 0U;
break;
}
+
if (result != 0U)
{
+ // success done
TraceStatus = active;
#if (SWO_STREAM != 0)
- if (TraceTransport == 2U)
+ if (TraceTransport == 2U) // Indicates that we use WinUSB for transfer.
{
- xEventGroupSetBits(kSWO_Thread_event_group, SWO_GOT_DATA);
+ xEventGroupSetBits(kSwoThreadEventGroup, SWO_GOT_DATA);
}
#endif
}
}
else
{
+ // request: active but already actived
result = 1U;
}
- if (result != 0U)
- {
- *response = DAP_OK;
- }
- else
- {
- *response = DAP_ERROR;
- }
+
+ *response = result ? DAP_OK : DAP_ERROR;
return ((1U << 16) | 1U);
}
@@ -793,6 +637,7 @@ uint32_t SWO_ExtendedStatus(const uint8_t *request, uint8_t *response)
TraceUpdate = 0U;
index = TraceTimestamp.index;
tick = TraceTimestamp.tick;
+ vTaskDelay(pdMS_TO_TICKS(10));
} while (TraceUpdate != 0U);
*response++ = (uint8_t)(index >> 0);
*response++ = (uint8_t)(index >> 8);
@@ -824,6 +669,8 @@ uint32_t SWO_Data(const uint8_t *request, uint8_t *response)
status = GetTraceStatus();
count = GetTraceCount();
+ // transport 1: use DAP SWO command
+ // transport 2: WinUSB
if (TraceTransport == 1U)
{
n = (uint32_t)(*(request + 0) << 0) |
@@ -839,6 +686,7 @@ uint32_t SWO_Data(const uint8_t *request, uint8_t *response)
}
else
{
+ // if use winusb, then nothing to do.
count = 0U;
}
@@ -852,7 +700,7 @@ uint32_t SWO_Data(const uint8_t *request, uint8_t *response)
for (i = index, n = count; n; n--)
{
i &= SWO_BUFFER_SIZE - 1U;
- *response++ = TraceBuf[i++];
+ *response++ = kSwoTraceBuf[i++];
}
TraceIndexO = index + count;
ResumeTrace();
@@ -867,78 +715,171 @@ uint32_t SWO_Data(const uint8_t *request, uint8_t *response)
void SWO_TransferComplete(void)
{
TraceIndexO += TransferSize;
- TransferBusy = 0U;
+ kSwoTransferBusy = 0U;
ResumeTrace();
- xEventGroupSetBits(kSWO_Thread_event_group, SWO_GOT_DATA);
+ xEventGroupSetBits(kSwoThreadEventGroup, SWO_GOT_DATA);
}
// SWO Thread
-void SWO_Thread(void *argument)
+void SWO_Thread()
{
- uint32_t timeout;
uint32_t flags;
uint32_t count;
uint32_t index;
uint32_t i, n;
- (void)argument;
- timeout = portMAX_DELAY;
-
- kSWO_Thread_event_group = xEventGroupCreate();
+ uint32_t index_i;
+ uint32_t index_o;
+ uint32_t remain_trace_block_size;
+
+ TickType_t timeout = portMAX_DELAY;
+
+ kSwoThreadEventGroup = xEventGroupCreate();
for (;;)
{
- flags = xEventGroupWaitBits(kSWO_Thread_event_group, SWO_GOT_DATA | SWO_ERROR_TIME_OUT,
+ /*
+ Here, our event group handles two main types of events:
+ 1. `SWO_GOT_DATA` : The SWO package may be ready to send.
+ 2. `UART_GOT_DATA` : The uart transfer event is complete and we can start reading.
+
+ Note that the `SWO_ERROR_TIME_OUT` flag is only used for internal processing, only when the status is
+ inactive can it be set.
+
+ We deal with uart events first.
+ Currently, SWO events are always handled.
+ */
+ flags = xEventGroupWaitBits(kSwoThreadEventGroup, SWO_GOT_DATA | UART_GOT_DATA | SWO_ERROR_TIME_OUT,
pdTRUE, pdFALSE, timeout);
- if (TraceStatus & DAP_SWO_CAPTURE_ACTIVE)
+
+ if (!(flags & UART_GOT_DATA) && !(flags & SWO_GOT_DATA))
{
- timeout = SWO_STREAM_TIMEOUT;
+ if (TraceMode != DAP_SWO_OFF && my_uart_get_rx_buffered_data_len(USART_PORT) >= kSWO_read_num)
+ {
+ flags = UART_GOT_DATA;
+ }
+ }
+
+ if (flags & UART_GOT_DATA)
+ {
+ // The data is still in the uart buffer,
+ // and the data in the uart needs to be read into the SWO buffer
+ my_uart_read_bytes(USART_PORT, &kSwoTraceBuf[kSWO_read_index], kSWO_read_num, pdMS_TO_TICKS(20));
+
+
+ index_o = TraceIndexO;
+
+ TraceIndexI += TraceBlockSize;
+ index_i = TraceIndexI;
+
+#if (TIMESTAMP_CLOCK != 0U)
+ TraceTimestamp.tick = TIMESTAMP_GET();
+ TraceTimestamp.index = index_i;
+#endif
+ remain_trace_block_size = TRACE_BLOCK_SIZE - (index_i & (TRACE_BLOCK_SIZE - 1U));
+ // remain_trace_block_size is the number of bytes we need to read
+ // (to achieve the size of TRACE_BLOCK_SIZE)
+ count = index_i - index_o;
+ // Amount of data that has not been processed yet
+
+ // (SWO_BUFFER_SIZE-num): the remaining usable length of the buffer after reading this data
+ if (count <= (SWO_BUFFER_SIZE - remain_trace_block_size))
+ {
+ // index_i % 4096
+ index_i &= SWO_BUFFER_SIZE - 1U;
+ TraceBlockSize = remain_trace_block_size;
+ my_uart_read_bytes_async_swo(index_i, remain_trace_block_size);
+ //pUSART->Receive(&kSwoTraceBuf[index_i], num);
+ }
+ else
+ {
+ // Not enough buffers
+ TraceStatus = DAP_SWO_CAPTURE_ACTIVE | DAP_SWO_CAPTURE_PAUSED;
+ }
+ TraceUpdate = 1U;
+#if (SWO_STREAM != 0)
+ if (TraceTransport == 2U) // Indicates that we use WinUSB for transfer.
+ {
+ // unsent length >= remaining length of the USB block
+ //// TODO: may be we can remove this
+ if (count >= (USB_BLOCK_SIZE - (index_o & (USB_BLOCK_SIZE - 1U))))
+ {
+ flags = SWO_GOT_DATA;
+ }
+ }
+#endif
+ }
+
+ // xEventGroupClearBits
+
+ /*
+ `SWO_GOT_DATA` may be set in the following situations:
+ - The SWO status requested by `SWD_contorl` is different from the current SWO status.
+ - When `SWO_TransferComplete` is called, and there may be potentially unsent data in the buffer.
+ - monitor task believes we need to send data that is already long enough.
+
+ Note: The processing of the following code segment will always be executed,
+ and should be ensured to be stable enough.
+
+
+ TODO: The time interval for executing the code is not guaranteed.
+ */
+
+ if (!(TraceStatus & DAP_SWO_CAPTURE_ACTIVE))
+ {
+ flags = SWO_ERROR_TIME_OUT;
+ timeout = portMAX_DELAY;
}
else
{
- timeout = portMAX_DELAY;
- flags = SWO_ERROR_TIME_OUT;
+ timeout = pdMS_TO_TICKS(150);
}
- if (TransferBusy == 0U)
+
+ if (kSwoTransferBusy)
{
- count = GetTraceCount();
- if (count != 0U)
+ continue;
+ }
+
+ count = GetTraceCount();
+ if (count != 0U)
+ {
+ index = TraceIndexO & (SWO_BUFFER_SIZE - 1U);
+ n = SWO_BUFFER_SIZE - index;
+ if (count > n)
{
- index = TraceIndexO & (SWO_BUFFER_SIZE - 1U);
- n = SWO_BUFFER_SIZE - index;
- if (count > n)
+ count = n;
+ }
+ if ((flags & SWO_ERROR_TIME_OUT) == 0)
+ {
+ i = index & (USB_BLOCK_SIZE - 1U);
+ if (i == 0U)
{
- count = n;
+ count &= ~(USB_BLOCK_SIZE - 1U); // Take down to the nearest number that is a multiple of USB_BLOCK_SIZE
}
- if ((flags & SWO_ERROR_TIME_OUT) == 0)
+ else
{
- i = index & (USB_BLOCK_SIZE - 1U);
- if (i == 0U)
+ n = USB_BLOCK_SIZE - i;
+ if (count >= n)
{
- count &= ~(USB_BLOCK_SIZE - 1U);
- // Take down to the nearest number that is a multiple of USB_BLOCK_SIZE
+ count = n; // The number of bytes to be sent exceeds the remain USB block size.
}
else
{
- n = USB_BLOCK_SIZE - i;
- if (count >= n)
- {
- count = n;
- }
- else
- {
- count = 0U;
- }
+ count = 0U; // Haven't received a full USB block yet.
}
}
- if (count != 0U)
- {
- TransferSize = count;
- TransferBusy = 1U;
- SWO_QueueTransfer(&TraceBuf[index], count); //through USB
- }
+ }
+ // Notify that there is data available for transmission
+ if (count != 0U)
+ {
+ TransferSize = count;
+ kSwoTransferBusy = 1U;
+ SWO_QueueTransfer(&kSwoTraceBuf[index], count); // through USB
}
}
+
}
+
+ // For all exceptions, we have handled them directly in the interrupt handlers.
}
#endif /* (SWO_STREAM != 0) */
diff --git a/components/DAP/source/SW_DP.c b/components/DAP/source/SW_DP.c
index 9a2088f..4d0b99d 100644
--- a/components/DAP/source/SW_DP.c
+++ b/components/DAP/source/SW_DP.c
@@ -1,528 +1,529 @@
-/*
- * Copyright (c) 2013-2017 ARM Limited. All rights reserved.
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Licensed under the Apache License, Version 2.0 (the License); you may
- * not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an AS IS BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * ----------------------------------------------------------------------
- *
- * $Date: 1. December 2017
- * $Revision: V2.0.0
- *
- * Project: CMSIS-DAP Source
- * Title: SW_DP.c CMSIS-DAP SW DP I/O
- *
- *---------------------------------------------------------------------------*/
-
-/**
- * @file SW_DP.c
- * @author windowsair
- * @brief Adaptation of GPIO and SPI
- * @change:
- * 2021-2-10 Support GPIO and SPI for SWD sequence / SWJ sequence / SWD transfer
- * Note: SWD sequence not yet tested
- * @version 0.1
- * @date 2021-2-10
- *
- * @copyright Copyright (c) 2021
- *
- */
-
-
-#include "DAP_config.h"
-#include "DAP.h"
-
-#include "spi_op.h"
-#include "spi_switch.h"
-#include "dap_utility.h"
-
-// Debug
-#define PRINT_SWD_PROTOCOL 0
-
-// SW Macros
-
-#define PIN_DELAY() PIN_DELAY_SLOW(DAP_Data.clock_delay)
-
-#define PIN_SWCLK_SET PIN_SWCLK_TCK_SET
-#define PIN_SWCLK_CLR PIN_SWCLK_TCK_CLR
-
-// Space for time in the original version,
-// and time for space in our implementation
-
-#define SW_CLOCK_CYCLE() \
- PIN_SWCLK_CLR(); \
- if (need_delay) { PIN_DELAY(); } \
- PIN_SWCLK_SET(); \
- if (need_delay) { PIN_DELAY(); }
-
-#define SW_WRITE_BIT(bit) \
- PIN_SWDIO_OUT(bit); \
- PIN_SWCLK_CLR(); \
- if (need_delay) { PIN_DELAY(); } \
- PIN_SWCLK_SET(); \
- if (need_delay) { PIN_DELAY(); }
-
-#define SW_READ_BIT(bit) \
- PIN_SWCLK_CLR(); \
- if (need_delay) { PIN_DELAY(); } \
- bit = PIN_SWDIO_IN(); \
- PIN_SWCLK_SET(); \
- if (need_delay) { PIN_DELAY(); }
-
-
-
-uint8_t SWD_TransferSpeed = kTransfer_GPIO_normal;
-
-
-void SWJ_Sequence_GPIO (uint32_t count, const uint8_t *data, uint8_t need_delay);
-void SWJ_Sequence_SPI (uint32_t count, const uint8_t *data);
-
-void SWD_Sequence_GPIO (uint32_t info, const uint8_t *swdo, uint8_t *swdi);
-void SWD_Sequence_SPI (uint32_t info, const uint8_t *swdo, uint8_t *swdi);
-
-
-// Generate SWJ Sequence
-// count: sequence bit count
-// data: pointer to sequence bit data
-// return: none
-#if ((DAP_SWD != 0) || (DAP_JTAG != 0))
-void SWJ_Sequence (uint32_t count, const uint8_t *data) {
- // if (count != 8 && count != 16 && count!= 51)
- // {
- // printf("[ERROR] wrong SWJ Swquence length:%d\r\n", (int)count);
- // return;
- // }
-
- if(SWD_TransferSpeed == kTransfer_SPI) {
- SWJ_Sequence_SPI(count, data);
- } else {
- SWJ_Sequence_GPIO(count, data, 1);
- }
-
-}
-
-
-void SWJ_Sequence_GPIO (uint32_t count, const uint8_t *data, uint8_t need_delay) {
- uint32_t val;
- uint32_t n;
-
- val = 0U;
- n = 0U;
- while (count--) {
- if (n == 0U) {
- val = *data++;
- n = 8U;
- }
- if (val & 1U) {
- PIN_SWDIO_TMS_SET();
- } else {
- PIN_SWDIO_TMS_CLR();
- }
- SW_CLOCK_CYCLE();
- val >>= 1;
- n--;
- }
-}
-
-void SWJ_Sequence_SPI (uint32_t count, const uint8_t *data) {
- DAP_SPI_Enable();
- DAP_SPI_WriteBits(count, data);
-}
-#endif
-
-
-// Generate SWD Sequence
-// info: sequence information
-// swdo: pointer to SWDIO generated data
-// swdi: pointer to SWDIO captured data
-// return: none
-#if (DAP_SWD != 0)
-void SWD_Sequence (uint32_t info, const uint8_t *swdo, uint8_t *swdi) {
- if (SWD_TransferSpeed == kTransfer_SPI) {
- SWD_Sequence_SPI(info, swdo, swdi);
- } else {
- SWD_Sequence_GPIO(info, swdo, swdi);
- }
-}
-
-void SWD_Sequence_GPIO (uint32_t info, const uint8_t *swdo, uint8_t *swdi) {
- const uint8_t need_delay = 1;
-
- uint32_t val;
- uint32_t bit;
- uint32_t n, k;
-
- n = info & SWD_SEQUENCE_CLK;
- if (n == 0U) {
- n = 64U;
- }
- // n = 1 ~ 64
-
- // LSB
- if (info & SWD_SEQUENCE_DIN) {
- while (n) {
- val = 0U;
- for (k = 8U; k && n; k--, n--) {
- SW_READ_BIT(bit);
- val >>= 1;
- val |= bit << 7;
- }
- val >>= k;
- *swdi++ = (uint8_t)val;
- }
- } else {
- while (n) {
- val = *swdo++;
- for (k = 8U; k && n; k--, n--) {
- SW_WRITE_BIT(val);
- val >>= 1;
- }
- }
- }
-}
-
-void SWD_Sequence_SPI (uint32_t info, const uint8_t *swdo, uint8_t *swdi) {
- uint32_t n;
- n = info & SWD_SEQUENCE_CLK;
- if (n == 0U) {
- n = 64U;
- }
- // n = 1 ~ 64
-
- if (info & SWD_SEQUENCE_DIN) {
- DAP_SPI_ReadBits(n, swdi);
- } else {
- DAP_SPI_WriteBits(n, swdo);
- }
-}
-
-#endif
-
-
-#if (DAP_SWD != 0)
-
-
-// SWD Transfer I/O
-// request: A[3:2] RnW APnDP
-// data: DATA[31:0]
-// return: ACK[2:0]
-static uint8_t SWD_Transfer_SPI (uint32_t request, uint32_t *data) {
- // SPI transfer mode does not require operations such as PIN_DELAY
- uint8_t ack;
- // uint32_t bit;
- uint32_t val;
- uint8_t parity;
- uint8_t computedParity;
-
- uint32_t n;
-
- const uint8_t constantBits = 0b10000001U; /* Start Bit & Stop Bit & Park Bit is fixed. */
- uint8_t requestByte; /* LSB */
-
-
- DAP_SPI_Enable();
-
- requestByte = constantBits | (((uint8_t)(request & 0xFU)) << 1U) | (ParityEvenUint8(request & 0xFU) << 5U);
- /* For 4bit, Parity can be equivalent to 8bit with all 0 high bits */
-
- #if (PRINT_SWD_PROTOCOL == 1)
- switch (requestByte)
- {
- case 0xA5U:
- printf("IDCODE\r\n");
- break;
- case 0xA9U:
- printf("W CTRL/STAT\r\n");
- break;
- case 0xBDU:
- printf("RDBUFF\r\n");
- break;
- case 0x8DU:
- printf("R CTRL/STAT\r\n");
- break;
- case 0x81U:
- printf("W ABORT\r\n");
- break;
- case 0xB1U:
- printf("W SELECT\r\n");
- break;
- case 0xBBU:
- printf("W APc\r\n");
- break;
- case 0x9FU:
- printf("R APc\r\n");
- break;
- case 0x8BU:
- printf("W AP4\r\n");
- break;
- case 0xA3U:
- printf("W AP0\r\n");
- break;
- case 0X87U:
- printf("R AP0\r\n");
- break;
- case 0xB7U:
- printf("R AP8\r\n");
- break;
- default:
- //W AP8
- printf("Unknown:%08x\r\n", requestByte);
- break;
- }
- #endif
-
- if (request & DAP_TRANSFER_RnW) {
- /* Read data */
-
- DAP_SPI_Send_Header(requestByte, &ack, 0); // 0 Trn After ACK
- if (ack == DAP_TRANSFER_OK) {
- DAP_SPI_Read_Data(&val, &parity);
- computedParity = ParityEvenUint32(val);
-
- if ((computedParity ^ parity) & 1U) {
- ack = DAP_TRANSFER_ERROR;
- }
- if (data) { *data = val; }
-
- /* Capture Timestamp */
- if (request & DAP_TRANSFER_TIMESTAMP) {
- DAP_Data.timestamp = TIMESTAMP_GET();
- }
-
- }
- else if ((ack == DAP_TRANSFER_WAIT) || (ack == DAP_TRANSFER_FAULT)) {
- DAP_SPI_Generate_Cycle(1);
- #if (PRINT_SWD_PROTOCOL == 1)
- printf("WAIT\r\n");
- #endif
-
- // return DAP_TRANSFER_WAIT;
- }
- else {
- /* Protocol error */
- DAP_SPI_Disable();
- PIN_SWDIO_TMS_SET();
-
- DAP_SPI_Enable();
- DAP_SPI_Protocol_Error_Read();
-
- DAP_SPI_Disable();
- PIN_SWDIO_TMS_SET();
- #if (PRINT_SWD_PROTOCOL == 1)
- printf("Protocol Error: Read\r\n");
- #endif
- }
-
- return ((uint8_t)ack);
- }
- else {
- /* Write data */
- parity = ParityEvenUint32(*data);
- DAP_SPI_Send_Header(requestByte, &ack, 1); // 1 Trn After ACK
- if (ack == DAP_TRANSFER_OK) {
- DAP_SPI_Write_Data(*data, parity);
- /* Capture Timestamp */
- if (request & DAP_TRANSFER_TIMESTAMP) {
- DAP_Data.timestamp = TIMESTAMP_GET();
- }
- /* Idle cycles */
- n = DAP_Data.transfer.idle_cycles;
- if (n) { DAP_SPI_Generate_Cycle(n); }
-
- DAP_SPI_Disable();
- PIN_SWDIO_TMS_SET();
-
- return ((uint8_t)ack);
- }
- else if ((ack == DAP_TRANSFER_WAIT) || (ack == DAP_TRANSFER_FAULT)) {
- /* already turnaround. */
-
- /* TODO: overrun transfer -> for read */
- #if (PRINT_SWD_PROTOCOL == 1)
- printf("WAIT\r\n");
- #endif
-
- }
- else {
- //// FIXME: bug
- /* Protocol error */
- DAP_SPI_Disable();
- PIN_SWDIO_TMS_SET();
-
- DAP_SPI_Enable();
- DAP_SPI_Protocol_Error_Write();
-
- DAP_SPI_Disable();
- PIN_SWDIO_TMS_SET();
-
- #if (PRINT_SWD_PROTOCOL == 1)
- printf("Protocol Error: Write\r\n");
- #endif
- }
-
- return ((uint8_t)ack);
-
- }
-
- return DAP_TRANSFER_ERROR;
-}
-
-
-
-static uint8_t SWD_Transfer_GPIO (uint32_t request, uint32_t *data, uint8_t need_delay) {
- uint32_t ack;
- uint32_t bit;
- uint32_t val;
- uint32_t parity;
-
- uint32_t n;
-
- /* Packet Request */
- parity = 0U;
- SW_WRITE_BIT(1U); /* Start Bit */
- bit = request >> 0;
- SW_WRITE_BIT(bit); /* APnDP Bit */
- parity += bit;
- bit = request >> 1;
- SW_WRITE_BIT(bit); /* RnW Bit */
- parity += bit;
- bit = request >> 2;
- SW_WRITE_BIT(bit); /* A2 Bit */
- parity += bit;
- bit = request >> 3;
- SW_WRITE_BIT(bit); /* A3 Bit */
- parity += bit;
- SW_WRITE_BIT(parity); /* Parity Bit */
- SW_WRITE_BIT(0U); /* Stop Bit */
- SW_WRITE_BIT(1U); /* Park Bit */
-
- /* Turnaround */
- PIN_SWDIO_OUT_DISABLE();
- for (n = DAP_Data.swd_conf.turnaround; n; n--) {
- SW_CLOCK_CYCLE();
- }
-
- /* Acknowledge response */
- SW_READ_BIT(bit);
- ack = bit << 0;
- SW_READ_BIT(bit);
- ack |= bit << 1;
- SW_READ_BIT(bit);
- ack |= bit << 2;
-
- if (ack == DAP_TRANSFER_OK) { /* OK response */
- /* Data transfer */
- if (request & DAP_TRANSFER_RnW) {
- /* Read data */
- val = 0U;
- parity = 0U;
- for (n = 32U; n; n--) {
- SW_READ_BIT(bit); /* Read RDATA[0:31] */
- parity += bit;
- val >>= 1;
- val |= bit << 31;
- }
- SW_READ_BIT(bit); /* Read Parity */
- if ((parity ^ bit) & 1U) {
- ack = DAP_TRANSFER_ERROR;
- }
- if (data) { *data = val; }
- /* Turnaround */
- for (n = DAP_Data.swd_conf.turnaround; n; n--) {
- SW_CLOCK_CYCLE();
- }
- PIN_SWDIO_OUT_ENABLE();
- } else {
- /* Turnaround */
- for (n = DAP_Data.swd_conf.turnaround; n; n--) {
- SW_CLOCK_CYCLE();
- }
- PIN_SWDIO_OUT_ENABLE();
- /* Write data */
- val = *data;
- parity = 0U;
- for (n = 32U; n; n--) {
- SW_WRITE_BIT(val); /* Write WDATA[0:31] */
- parity += val;
- val >>= 1;
- }
- SW_WRITE_BIT(parity); /* Write Parity Bit */
- }
- /* Capture Timestamp */
- if (request & DAP_TRANSFER_TIMESTAMP) {
- DAP_Data.timestamp = TIMESTAMP_GET();
- }
- /* Idle cycles */
- n = DAP_Data.transfer.idle_cycles;
- if (n) {
- PIN_SWDIO_OUT(0U);
- for (; n; n--) {
- SW_CLOCK_CYCLE();
- }
- }
- PIN_SWDIO_OUT(1U);
- return ((uint8_t)ack);
- }
-
- if ((ack == DAP_TRANSFER_WAIT) || (ack == DAP_TRANSFER_FAULT)) {
- /* WAIT or FAULT response */
- if (DAP_Data.swd_conf.data_phase && ((request & DAP_TRANSFER_RnW) != 0U)) {
- for (n = 32U+1U; n; n--) {
- SW_CLOCK_CYCLE(); /* Dummy Read RDATA[0:31] + Parity */
- }
- }
- /* Turnaround */
- for (n = DAP_Data.swd_conf.turnaround; n; n--) {
- SW_CLOCK_CYCLE();
- }
- PIN_SWDIO_OUT_ENABLE();
- if (DAP_Data.swd_conf.data_phase && ((request & DAP_TRANSFER_RnW) == 0U)) {
- PIN_SWDIO_OUT(0U);
- for (n = 32U+1U; n; n--) {
- SW_CLOCK_CYCLE(); /* Dummy Write WDATA[0:31] + Parity */
- }
- }
- PIN_SWDIO_OUT(1U);
- return ((uint8_t)ack);
- }
-
- /* Protocol error */
- for (n = DAP_Data.swd_conf.turnaround + 32U + 1U; n; n--) {
- SW_CLOCK_CYCLE(); /* Back off data phase */
- }
- PIN_SWDIO_OUT_ENABLE();
- PIN_SWDIO_OUT(1U);
- return ((uint8_t)ack);
-}
-
-
-// SWD Transfer I/O
-// request: A[3:2] RnW APnDP
-// data: DATA[31:0]
-// return: ACK[2:0]
-uint8_t SWD_Transfer(uint32_t request, uint32_t *data) {
- switch (SWD_TransferSpeed) {
- case kTransfer_SPI:
- return SWD_Transfer_SPI(request, data);
- case kTransfer_GPIO_fast:
- return SWD_Transfer_GPIO(request, data, 0);
- case kTransfer_GPIO_normal:
- return SWD_Transfer_GPIO(request, data, 1);
- default:
- return SWD_Transfer_GPIO(request, data, 1);
- }
-}
-
-
-#endif /* (DAP_SWD != 0) */
+/*
+ * Copyright (c) 2013-2017 ARM Limited. All rights reserved.
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Licensed under the Apache License, Version 2.0 (the License); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an AS IS BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * ----------------------------------------------------------------------
+ *
+ * $Date: 1. December 2017
+ * $Revision: V2.0.0
+ *
+ * Project: CMSIS-DAP Source
+ * Title: SW_DP.c CMSIS-DAP SW DP I/O
+ *
+ *---------------------------------------------------------------------------*/
+
+/**
+ * @file SW_DP.c
+ * @author windowsair
+ * @brief Adaptation of GPIO and SPI
+ * @change:
+ * 2021-2-10 Support GPIO and SPI for SWD sequence / SWJ sequence / SWD transfer
+ * Note: SWD sequence not yet tested
+ * @version 0.1
+ * @date 2021-2-10
+ *
+ * @copyright Copyright (c) 2021
+ *
+ */
+
+#include
+
+#include "components/DAP/config/DAP_config.h"
+#include "components/DAP/include/DAP.h"
+#include "components/DAP/include/spi_op.h"
+#include "components/DAP/include/spi_switch.h"
+#include "components/DAP/include/dap_utility.h"
+
+
+// Debug
+#define PRINT_SWD_PROTOCOL 0
+
+// SW Macros
+
+#define PIN_DELAY() PIN_DELAY_SLOW(DAP_Data.clock_delay)
+
+#define PIN_SWCLK_SET PIN_SWCLK_TCK_SET
+#define PIN_SWCLK_CLR PIN_SWCLK_TCK_CLR
+
+// Space for time in the original version,
+// and time for space in our implementation
+
+#define SW_CLOCK_CYCLE() \
+ PIN_SWCLK_CLR(); \
+ if (need_delay) { PIN_DELAY(); } \
+ PIN_SWCLK_SET(); \
+ if (need_delay) { PIN_DELAY(); }
+
+#define SW_WRITE_BIT(bit) \
+ PIN_SWDIO_OUT(bit); \
+ PIN_SWCLK_CLR(); \
+ if (need_delay) { PIN_DELAY(); } \
+ PIN_SWCLK_SET(); \
+ if (need_delay) { PIN_DELAY(); }
+
+#define SW_READ_BIT(bit) \
+ PIN_SWCLK_CLR(); \
+ if (need_delay) { PIN_DELAY(); } \
+ bit = PIN_SWDIO_IN(); \
+ PIN_SWCLK_SET(); \
+ if (need_delay) { PIN_DELAY(); }
+
+
+
+uint8_t SWD_TransferSpeed = kTransfer_GPIO_normal;
+
+
+void SWJ_Sequence_GPIO (uint32_t count, const uint8_t *data, uint8_t need_delay);
+void SWJ_Sequence_SPI (uint32_t count, const uint8_t *data);
+
+void SWD_Sequence_GPIO (uint32_t info, const uint8_t *swdo, uint8_t *swdi);
+void SWD_Sequence_SPI (uint32_t info, const uint8_t *swdo, uint8_t *swdi);
+
+
+// Generate SWJ Sequence
+// count: sequence bit count
+// data: pointer to sequence bit data
+// return: none
+#if ((DAP_SWD != 0) || (DAP_JTAG != 0))
+void SWJ_Sequence (uint32_t count, const uint8_t *data) {
+ // if (count != 8 && count != 16 && count!= 51)
+ // {
+ // printf("[ERROR] wrong SWJ Swquence length:%d\r\n", (int)count);
+ // return;
+ // }
+
+ if(SWD_TransferSpeed == kTransfer_SPI) {
+ SWJ_Sequence_SPI(count, data);
+ } else {
+ SWJ_Sequence_GPIO(count, data, 1);
+ }
+
+}
+
+
+void SWJ_Sequence_GPIO (uint32_t count, const uint8_t *data, uint8_t need_delay) {
+ uint32_t val;
+ uint32_t n;
+
+ val = 0U;
+ n = 0U;
+ while (count--) {
+ if (n == 0U) {
+ val = *data++;
+ n = 8U;
+ }
+ if (val & 1U) {
+ PIN_SWDIO_TMS_SET();
+ } else {
+ PIN_SWDIO_TMS_CLR();
+ }
+ SW_CLOCK_CYCLE();
+ val >>= 1;
+ n--;
+ }
+}
+
+void SWJ_Sequence_SPI (uint32_t count, const uint8_t *data) {
+ DAP_SPI_Enable();
+ DAP_SPI_WriteBits(count, data);
+}
+#endif
+
+
+// Generate SWD Sequence
+// info: sequence information
+// swdo: pointer to SWDIO generated data
+// swdi: pointer to SWDIO captured data
+// return: none
+#if (DAP_SWD != 0)
+void SWD_Sequence (uint32_t info, const uint8_t *swdo, uint8_t *swdi) {
+ if (SWD_TransferSpeed == kTransfer_SPI) {
+ SWD_Sequence_SPI(info, swdo, swdi);
+ } else {
+ SWD_Sequence_GPIO(info, swdo, swdi);
+ }
+}
+
+void SWD_Sequence_GPIO (uint32_t info, const uint8_t *swdo, uint8_t *swdi) {
+ const uint8_t need_delay = 1;
+
+ uint32_t val;
+ uint32_t bit;
+ uint32_t n, k;
+
+ n = info & SWD_SEQUENCE_CLK;
+ if (n == 0U) {
+ n = 64U;
+ }
+ // n = 1 ~ 64
+
+ // LSB
+ if (info & SWD_SEQUENCE_DIN) {
+ while (n) {
+ val = 0U;
+ for (k = 8U; k && n; k--, n--) {
+ SW_READ_BIT(bit);
+ val >>= 1;
+ val |= bit << 7;
+ }
+ val >>= k;
+ *swdi++ = (uint8_t)val;
+ }
+ } else {
+ while (n) {
+ val = *swdo++;
+ for (k = 8U; k && n; k--, n--) {
+ SW_WRITE_BIT(val);
+ val >>= 1;
+ }
+ }
+ }
+}
+
+void SWD_Sequence_SPI (uint32_t info, const uint8_t *swdo, uint8_t *swdi) {
+ uint32_t n;
+ n = info & SWD_SEQUENCE_CLK;
+ if (n == 0U) {
+ n = 64U;
+ }
+ // n = 1 ~ 64
+
+ if (info & SWD_SEQUENCE_DIN) {
+ DAP_SPI_ReadBits(n, swdi);
+ } else {
+ DAP_SPI_WriteBits(n, swdo);
+ }
+}
+
+#endif
+
+
+#if (DAP_SWD != 0)
+
+
+// SWD Transfer I/O
+// request: A[3:2] RnW APnDP
+// data: DATA[31:0]
+// return: ACK[2:0]
+static uint8_t SWD_Transfer_SPI (uint32_t request, uint32_t *data) {
+ //// FIXME: overrun detection
+ // SPI transfer mode does not require operations such as PIN_DELAY
+ uint8_t ack;
+ // uint32_t bit;
+ uint32_t val;
+ uint8_t parity;
+ uint8_t computedParity;
+
+ uint32_t n;
+
+ const uint8_t constantBits = 0b10000001U; /* Start Bit & Stop Bit & Park Bit is fixed. */
+ uint8_t requestByte; /* LSB */
+
+
+ DAP_SPI_Enable();
+
+ requestByte = constantBits | (((uint8_t)(request & 0xFU)) << 1U) | (ParityEvenUint8(request & 0xFU) << 5U);
+ /* For 4bit, Parity can be equivalent to 8bit with all 0 high bits */
+
+ #if (PRINT_SWD_PROTOCOL == 1)
+ switch (requestByte)
+ {
+ case 0xA5U:
+ printf("IDCODE\r\n");
+ break;
+ case 0xA9U:
+ printf("W CTRL/STAT\r\n");
+ break;
+ case 0xBDU:
+ printf("RDBUFF\r\n");
+ break;
+ case 0x8DU:
+ printf("R CTRL/STAT\r\n");
+ break;
+ case 0x81U:
+ printf("W ABORT\r\n");
+ break;
+ case 0xB1U:
+ printf("W SELECT\r\n");
+ break;
+ case 0xBBU:
+ printf("W APc\r\n");
+ break;
+ case 0x9FU:
+ printf("R APc\r\n");
+ break;
+ case 0x8BU:
+ printf("W AP4\r\n");
+ break;
+ case 0xA3U:
+ printf("W AP0\r\n");
+ break;
+ case 0X87U:
+ printf("R AP0\r\n");
+ break;
+ case 0xB7U:
+ printf("R AP8\r\n");
+ break;
+ default:
+ //W AP8
+ printf("Unknown:%08x\r\n", requestByte);
+ break;
+ }
+ #endif
+
+ if (request & DAP_TRANSFER_RnW) {
+ /* Read data */
+
+ DAP_SPI_Send_Header(requestByte, &ack, 0); // 0 Trn After ACK
+ if (ack == DAP_TRANSFER_OK) {
+ DAP_SPI_Read_Data(&val, &parity);
+ computedParity = ParityEvenUint32(val);
+
+ if ((computedParity ^ parity) & 1U) {
+ ack = DAP_TRANSFER_ERROR;
+ }
+ if (data) { *data = val; }
+
+ /* Capture Timestamp */
+ if (request & DAP_TRANSFER_TIMESTAMP) {
+ DAP_Data.timestamp = TIMESTAMP_GET();
+ }
+
+ }
+ else if ((ack == DAP_TRANSFER_WAIT) || (ack == DAP_TRANSFER_FAULT)) {
+ DAP_SPI_Generate_Cycle(1);
+ #if (PRINT_SWD_PROTOCOL == 1)
+ printf("WAIT\r\n");
+ #endif
+
+ // return DAP_TRANSFER_WAIT;
+ }
+ else {
+ /* Protocol error */
+ DAP_SPI_Disable();
+ PIN_SWDIO_TMS_SET();
+
+ DAP_SPI_Enable();
+ DAP_SPI_Protocol_Error_Read();
+
+ DAP_SPI_Disable();
+ PIN_SWDIO_TMS_SET();
+ #if (PRINT_SWD_PROTOCOL == 1)
+ printf("Protocol Error: Read\r\n");
+ #endif
+ }
+
+ return ((uint8_t)ack);
+ }
+ else {
+ /* Write data */
+ parity = ParityEvenUint32(*data);
+ DAP_SPI_Send_Header(requestByte, &ack, 1); // 1 Trn After ACK
+ if (ack == DAP_TRANSFER_OK) {
+ DAP_SPI_Write_Data(*data, parity);
+ /* Capture Timestamp */
+ if (request & DAP_TRANSFER_TIMESTAMP) {
+ DAP_Data.timestamp = TIMESTAMP_GET();
+ }
+ /* Idle cycles */
+ n = DAP_Data.transfer.idle_cycles;
+ if (n) { DAP_SPI_Generate_Cycle(n); }
+
+ DAP_SPI_Disable();
+ PIN_SWDIO_TMS_SET();
+
+ return ((uint8_t)ack);
+ }
+ else if ((ack == DAP_TRANSFER_WAIT) || (ack == DAP_TRANSFER_FAULT)) {
+ /* already turnaround. */
+
+ /* TODO: overrun transfer -> for read */
+ #if (PRINT_SWD_PROTOCOL == 1)
+ printf("WAIT\r\n");
+ #endif
+
+ }
+ else {
+ /* Protocol error */
+ DAP_SPI_Disable();
+ PIN_SWDIO_TMS_SET();
+
+ DAP_SPI_Enable();
+ DAP_SPI_Protocol_Error_Write();
+
+ DAP_SPI_Disable();
+ PIN_SWDIO_TMS_SET();
+
+ #if (PRINT_SWD_PROTOCOL == 1)
+ printf("Protocol Error: Write\r\n");
+ #endif
+ }
+
+ return ((uint8_t)ack);
+
+ }
+
+ return DAP_TRANSFER_ERROR;
+}
+
+
+
+static uint8_t SWD_Transfer_GPIO (uint32_t request, uint32_t *data, uint8_t need_delay) {
+ uint32_t ack;
+ uint32_t bit;
+ uint32_t val;
+ uint32_t parity;
+
+ uint32_t n;
+
+ /* Packet Request */
+ parity = 0U;
+ SW_WRITE_BIT(1U); /* Start Bit */
+ bit = request >> 0;
+ SW_WRITE_BIT(bit); /* APnDP Bit */
+ parity += bit;
+ bit = request >> 1;
+ SW_WRITE_BIT(bit); /* RnW Bit */
+ parity += bit;
+ bit = request >> 2;
+ SW_WRITE_BIT(bit); /* A2 Bit */
+ parity += bit;
+ bit = request >> 3;
+ SW_WRITE_BIT(bit); /* A3 Bit */
+ parity += bit;
+ SW_WRITE_BIT(parity); /* Parity Bit */
+ SW_WRITE_BIT(0U); /* Stop Bit */
+ SW_WRITE_BIT(1U); /* Park Bit */
+
+ /* Turnaround */
+ PIN_SWDIO_OUT_DISABLE();
+ for (n = DAP_Data.swd_conf.turnaround; n; n--) {
+ SW_CLOCK_CYCLE();
+ }
+
+ /* Acknowledge response */
+ SW_READ_BIT(bit);
+ ack = bit << 0;
+ SW_READ_BIT(bit);
+ ack |= bit << 1;
+ SW_READ_BIT(bit);
+ ack |= bit << 2;
+
+ if (ack == DAP_TRANSFER_OK) { /* OK response */
+ /* Data transfer */
+ if (request & DAP_TRANSFER_RnW) {
+ /* Read data */
+ val = 0U;
+ parity = 0U;
+ for (n = 32U; n; n--) {
+ SW_READ_BIT(bit); /* Read RDATA[0:31] */
+ parity += bit;
+ val >>= 1;
+ val |= bit << 31;
+ }
+ SW_READ_BIT(bit); /* Read Parity */
+ if ((parity ^ bit) & 1U) {
+ ack = DAP_TRANSFER_ERROR;
+ }
+ if (data) { *data = val; }
+ /* Turnaround */
+ for (n = DAP_Data.swd_conf.turnaround; n; n--) {
+ SW_CLOCK_CYCLE();
+ }
+ PIN_SWDIO_OUT_ENABLE();
+ } else {
+ /* Turnaround */
+ for (n = DAP_Data.swd_conf.turnaround; n; n--) {
+ SW_CLOCK_CYCLE();
+ }
+ PIN_SWDIO_OUT_ENABLE();
+ /* Write data */
+ val = *data;
+ parity = 0U;
+ for (n = 32U; n; n--) {
+ SW_WRITE_BIT(val); /* Write WDATA[0:31] */
+ parity += val;
+ val >>= 1;
+ }
+ SW_WRITE_BIT(parity); /* Write Parity Bit */
+ }
+ /* Capture Timestamp */
+ if (request & DAP_TRANSFER_TIMESTAMP) {
+ DAP_Data.timestamp = TIMESTAMP_GET();
+ }
+ /* Idle cycles */
+ n = DAP_Data.transfer.idle_cycles;
+ if (n) {
+ PIN_SWDIO_OUT(0U);
+ for (; n; n--) {
+ SW_CLOCK_CYCLE();
+ }
+ }
+ PIN_SWDIO_OUT(1U);
+ return ((uint8_t)ack);
+ }
+
+ if ((ack == DAP_TRANSFER_WAIT) || (ack == DAP_TRANSFER_FAULT)) {
+ /* WAIT or FAULT response */
+ if (DAP_Data.swd_conf.data_phase && ((request & DAP_TRANSFER_RnW) != 0U)) {
+ for (n = 32U+1U; n; n--) {
+ SW_CLOCK_CYCLE(); /* Dummy Read RDATA[0:31] + Parity */
+ }
+ }
+ /* Turnaround */
+ for (n = DAP_Data.swd_conf.turnaround; n; n--) {
+ SW_CLOCK_CYCLE();
+ }
+ PIN_SWDIO_OUT_ENABLE();
+ if (DAP_Data.swd_conf.data_phase && ((request & DAP_TRANSFER_RnW) == 0U)) {
+ PIN_SWDIO_OUT(0U);
+ for (n = 32U+1U; n; n--) {
+ SW_CLOCK_CYCLE(); /* Dummy Write WDATA[0:31] + Parity */
+ }
+ }
+ PIN_SWDIO_OUT(1U);
+ return ((uint8_t)ack);
+ }
+
+ /* Protocol error */
+ for (n = DAP_Data.swd_conf.turnaround + 32U + 1U; n; n--) {
+ SW_CLOCK_CYCLE(); /* Back off data phase */
+ }
+ PIN_SWDIO_OUT_ENABLE();
+ PIN_SWDIO_OUT(1U);
+ return ((uint8_t)ack);
+}
+
+
+// SWD Transfer I/O
+// request: A[3:2] RnW APnDP
+// data: DATA[31:0]
+// return: ACK[2:0]
+uint8_t SWD_Transfer(uint32_t request, uint32_t *data) {
+ switch (SWD_TransferSpeed) {
+ case kTransfer_SPI:
+ return SWD_Transfer_SPI(request, data);
+ case kTransfer_GPIO_fast:
+ return SWD_Transfer_GPIO(request, data, 0);
+ case kTransfer_GPIO_normal:
+ return SWD_Transfer_GPIO(request, data, 1);
+ default:
+ return SWD_Transfer_GPIO(request, data, 1);
+ }
+}
+
+
+#endif /* (DAP_SWD != 0) */
diff --git a/components/DAP/source/dap_utility.c b/components/DAP/source/dap_utility.c
index 94c0381..2a4be5a 100644
--- a/components/DAP/source/dap_utility.c
+++ b/components/DAP/source/dap_utility.c
@@ -1,6 +1,6 @@
-#include "dap_utility.h"
+#include "components/DAP/include/dap_utility.h"
-const uint8_t kParityByteTable[256] =
+const uint8_t kParityByteTable[256] =
{
#define P2(n) n, n^1, n^1, n
#define P4(n) P2(n), P2(n^1), P2(n^1), P2(n)
diff --git a/components/DAP/source/spi_op.c b/components/DAP/source/spi_op.c
index 728c837..a3c0d5d 100644
--- a/components/DAP/source/spi_op.c
+++ b/components/DAP/source/spi_op.c
@@ -4,17 +4,23 @@
* @brief Using SPI for common transfer operations
* @change: 2020-11-25 first version
* 2021-2-11 Support SWD sequence
- * @version 0.2
- * @date 2021-2-11
+ * 2021-3-10 Support 3-wire SPI
+ * @version 0.3
+ * @date 2021-3-10
*
* @copyright Copyright (c) 2021
*
*/
#include
+#include
+
+#include "main/dap_configuration.h"
+
+#include "components/DAP/include/cmsis_compiler.h"
+#include "components/DAP/include/spi_op.h"
#include "esp8266/spi_struct.h"
-#include "cmsis_compiler.h"
-#include "spi_op.h"
+
#define DAP_SPI SPI1
@@ -83,7 +89,7 @@ void DAP_SPI_WriteBits(const uint8_t count, const uint8_t *buf)
// Start transmission
DAP_SPI.cmd.usr = 1;
// Wait for sending to complete
- while (DAP_SPI.cmd.usr);
+ while (DAP_SPI.cmd.usr) continue;
}
@@ -103,12 +109,20 @@ void DAP_SPI_ReadBits(const uint8_t count, uint8_t *buf) {
DAP_SPI.user.usr_mosi = 0;
DAP_SPI.user.usr_miso = 1;
+#if (USE_SPI_SIO == 1)
+ DAP_SPI.user.sio = true;
+#endif
+
DAP_SPI.user1.usr_miso_bitlen = count - 1U;
// Start transmission
DAP_SPI.cmd.usr = 1;
// Wait for reading to complete
- while (DAP_SPI.cmd.usr);
+ while (DAP_SPI.cmd.usr) continue;
+
+#if (USE_SPI_SIO == 1)
+ DAP_SPI.user.sio = false;
+#endif
data_buf[0] = DAP_SPI.data_buf[0];
data_buf[1] = DAP_SPI.data_buf[1];
@@ -139,6 +153,10 @@ __FORCEINLINE void DAP_SPI_Send_Header(const uint8_t packetHeaderData, uint8_t *
DAP_SPI.user.usr_miso = 1;
+#if (USE_SPI_SIO == 1)
+ DAP_SPI.user.sio = true;
+#endif
+
// 1 bit Trn(Before ACK) + 3bits ACK + TrnAferACK - 1(prescribed)
DAP_SPI.user1.usr_miso_bitlen = 1U + 3U + TrnAfterACK - 1U;
@@ -148,7 +166,11 @@ __FORCEINLINE void DAP_SPI_Send_Header(const uint8_t packetHeaderData, uint8_t *
// Start transmission
DAP_SPI.cmd.usr = 1;
// Wait for sending to complete
- while (DAP_SPI.cmd.usr);
+ while (DAP_SPI.cmd.usr) continue;
+
+#if (USE_SPI_SIO == 1)
+ DAP_SPI.user.sio = false;
+#endif
dataBuf = DAP_SPI.data_buf[0];
*ack = (dataBuf >> 1) & 0b111;
@@ -163,19 +185,27 @@ __FORCEINLINE void DAP_SPI_Send_Header(const uint8_t packetHeaderData, uint8_t *
*/
__FORCEINLINE void DAP_SPI_Read_Data(uint32_t *resData, uint8_t *resParity)
{
- uint64_t dataBuf;
+ volatile uint64_t dataBuf;
uint32_t *pU32Data = (uint32_t *)&dataBuf;
DAP_SPI.user.usr_mosi = 0;
DAP_SPI.user.usr_miso = 1;
+#if (USE_SPI_SIO == 1)
+ DAP_SPI.user.sio = true;
+#endif
+
// 1 bit Trn(End) + 3bits ACK + 32bis data + 1bit parity - 1(prescribed)
DAP_SPI.user1.usr_miso_bitlen = 1U + 32U + 1U - 1U;
// Start transmission
DAP_SPI.cmd.usr = 1;
// Wait for sending to complete
- while (DAP_SPI.cmd.usr);
+ while (DAP_SPI.cmd.usr) continue;
+
+#if (USE_SPI_SIO == 1)
+ DAP_SPI.user.sio = false;
+#endif
pU32Data[0] = DAP_SPI.data_buf[0];
pU32Data[1] = DAP_SPI.data_buf[1];
@@ -204,7 +234,7 @@ __FORCEINLINE void DAP_SPI_Write_Data(uint32_t data, uint8_t parity)
// Start transmission
DAP_SPI.cmd.usr = 1;
// Wait for sending to complete
- while (DAP_SPI.cmd.usr);
+ while (DAP_SPI.cmd.usr) continue;
}
/**
@@ -221,8 +251,10 @@ __FORCEINLINE void DAP_SPI_Generate_Cycle(uint8_t num)
DAP_SPI.data_buf[0] = 0x00000000U;
+ // Start transmission
DAP_SPI.cmd.usr = 1;
- while (DAP_SPI.cmd.usr);
+ // Wait for sending to complete
+ while (DAP_SPI.cmd.usr) continue;
}
@@ -239,8 +271,10 @@ __FORCEINLINE void DAP_SPI_Protocol_Error_Read()
DAP_SPI.data_buf[0] = 0xFFFFFFFFU;
DAP_SPI.data_buf[1] = 0xFFFFFFFFU;
+ // Start transmission
DAP_SPI.cmd.usr = 1;
- while (DAP_SPI.cmd.usr);
+ // Wait for sending to complete
+ while (DAP_SPI.cmd.usr) continue;
}
@@ -257,6 +291,8 @@ __FORCEINLINE void DAP_SPI_Protocol_Error_Write()
DAP_SPI.data_buf[0] = 0xFFFFFFFFU;
DAP_SPI.data_buf[1] = 0xFFFFFFFFU;
+ // Start transmission
DAP_SPI.cmd.usr = 1;
- while (DAP_SPI.cmd.usr);
+ // Wait for sending to complete
+ while (DAP_SPI.cmd.usr) continue;
}
diff --git a/components/DAP/source/spi_switch.c b/components/DAP/source/spi_switch.c
index 09a7236..36d1d96 100644
--- a/components/DAP/source/spi_switch.c
+++ b/components/DAP/source/spi_switch.c
@@ -12,13 +12,13 @@
*/
#include
+#include "components/DAP/include/cmsis_compiler.h"
+#include "components/DAP/include/spi_switch.h"
+
#include "esp8266/spi_struct.h"
#include "esp8266/pin_mux_register.h"
#include "esp8266/gpio_struct.h"
-#include "cmsis_compiler.h"
-#include "spi_switch.h"
-
#define DAP_SPI SPI1
@@ -106,11 +106,13 @@ void DAP_SPI_Init()
pin_reg.pullup = 0;
WRITE_PERI_REG(GPIO_PIN_REG(13), pin_reg.val);
+#if (USE_SPI_SIO != 1)
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_HSPIQ_MISO); // GPIO12 is SPI MISO pin (Master Data In)
// esp8266 in is always connected
pin_reg.val = READ_PERI_REG(GPIO_PIN_REG(12));
pin_reg.pullup = 0;
WRITE_PERI_REG(GPIO_PIN_REG(12), pin_reg.val);
+#endif // (USE_SPI_SIO != 1)
@@ -136,10 +138,12 @@ __FORCEINLINE void DAP_SPI_Deinit()
{
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTMS_U, FUNC_GPIO14);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTCK_U, FUNC_GPIO13); // MOSI
+#if (USE_SPI_SIO != 1)
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12); // MISO
// disable MISO output connect
GPIO.enable_w1tc |= (0x1 << 12);
+#endif // (USE_SPI_SIO != 1)
gpio_pin_reg_t pin_reg;
GPIO.enable_w1ts |= (0x1 << 13);
diff --git a/components/DAP/source/uart_modify.c b/components/DAP/source/uart_modify.c
index e485482..d9ce6ce 100644
--- a/components/DAP/source/uart_modify.c
+++ b/components/DAP/source/uart_modify.c
@@ -1,6 +1,6 @@
/**
* @brief Made some simple modifications to the official UART
- *
+ *
*/
// Copyright 2018-2025 Espressif Systems (Shanghai) PTE LTD
@@ -19,6 +19,11 @@
#include
#include
+
+#include "components/DAP/config/DAP_config.h"
+#include "components/DAP/include/uart_modify.h"
+#include "components/DAP/include/swo.h"
+
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
@@ -26,12 +31,9 @@
#include "freertos/ringbuf.h"
#include "freertos/event_groups.h"
-#include "esp_err.h"
-#include "esp_log.h"
#include "esp_attr.h"
// SWO modify
-#include "DAP_config.h"
#include "esp8266/uart_struct.h"
#include "esp8266/uart_register.h"
#include "esp8266/pin_mux_register.h"
@@ -39,8 +41,6 @@
#include "esp8266/rom_functions.h"
#include "rom/ets_sys.h"
-
-#include "uart_modify.h"
#include "driver/uart_select.h"
#define portYIELD_FROM_ISR() taskYIELD()
@@ -70,6 +70,11 @@ typedef struct
} tx_data;
} uart_tx_data_t;
+
+
+// read:
+// hardware FIFO -> `rx_data_buf` -> `rx_ring_buf` -> user buf
+
typedef struct
{
uart_port_t uart_num; /*!< UART port number*/
@@ -118,18 +123,21 @@ typedef struct
static uart_isr_func_t uart_isr_func[UART_NUM_MAX];
// SWO modify
-extern EventGroupHandle_t kUART_Monitoe_event_group;
-#define UART_GOT_DATA BIT0
-extern void SetTraceError(uint8_t flag);
#define DAP_SWO_CAPTURE_ACTIVE (1U << 0)
#define DAP_SWO_CAPTURE_PAUSED (1U << 1)
#define DAP_SWO_STREAM_ERROR (1U << 6)
#define DAP_SWO_BUFFER_OVERRUN (1U << 7)
-//
+
+// non thread safe
+volatile uint32_t kSWO_read_index = 0;
+volatile uint32_t kSWO_read_num = 0;
+volatile uint8_t kSWO_uart_notify_enable = 1;
+SemaphoreHandle_t kSWO_read_mux = NULL;
+
+
esp_err_t my_uart_set_word_length(uart_port_t uart_num, uart_word_length_t data_bit)
{
- UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_ERR_INVALID_ARG);
UART_CHECK((data_bit < UART_DATA_BITS_MAX), "data bit error", ESP_ERR_INVALID_ARG);
UART_ENTER_CRITICAL();
@@ -140,7 +148,6 @@ esp_err_t my_uart_set_word_length(uart_port_t uart_num, uart_word_length_t data_
esp_err_t my_uart_get_word_length(uart_port_t uart_num, uart_word_length_t *data_bit)
{
- UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_ERR_INVALID_ARG);
UART_CHECK((data_bit), "empty pointer", ESP_FAIL);
*(data_bit) = UART[uart_num]->conf0.bit_num;
@@ -149,7 +156,6 @@ esp_err_t my_uart_get_word_length(uart_port_t uart_num, uart_word_length_t *data
esp_err_t my_uart_set_stop_bits(uart_port_t uart_num, uart_stop_bits_t stop_bit)
{
- UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_ERR_INVALID_ARG);
UART_CHECK((stop_bit < UART_STOP_BITS_MAX), "stop bit error", ESP_ERR_INVALID_ARG);
UART_ENTER_CRITICAL();
@@ -160,7 +166,6 @@ esp_err_t my_uart_set_stop_bits(uart_port_t uart_num, uart_stop_bits_t stop_bit)
esp_err_t my_uart_get_stop_bits(uart_port_t uart_num, uart_stop_bits_t *stop_bit)
{
- UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_ERR_INVALID_ARG);
UART_CHECK((stop_bit), "empty pointer", ESP_FAIL);
(*stop_bit) = UART[uart_num]->conf0.stop_bit_num;
@@ -169,7 +174,6 @@ esp_err_t my_uart_get_stop_bits(uart_port_t uart_num, uart_stop_bits_t *stop_bit
esp_err_t my_uart_set_parity(uart_port_t uart_num, uart_parity_t parity_mode)
{
- UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_ERR_INVALID_ARG);
UART_CHECK(((parity_mode == UART_PARITY_DISABLE) || (parity_mode == UART_PARITY_EVEN) || (parity_mode == UART_PARITY_ODD)),
"parity_mode error", ESP_ERR_INVALID_ARG);
@@ -182,7 +186,6 @@ esp_err_t my_uart_set_parity(uart_port_t uart_num, uart_parity_t parity_mode)
esp_err_t my_uart_get_parity(uart_port_t uart_num, uart_parity_t *parity_mode)
{
- UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_ERR_INVALID_ARG);
UART_CHECK((parity_mode), "empty pointer", ESP_ERR_INVALID_ARG);
UART_ENTER_CRITICAL();
@@ -209,8 +212,6 @@ esp_err_t my_uart_get_parity(uart_port_t uart_num, uart_parity_t *parity_mode)
esp_err_t my_uart_set_baudrate(uart_port_t uart_num, uint32_t baud_rate)
{
- UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_ERR_INVALID_ARG);
-
UART_ENTER_CRITICAL();
UART[uart_num]->clk_div.val = (uint32_t)(UART_CLK_FREQ / baud_rate) & 0xFFFFF;
UART_EXIT_CRITICAL();
@@ -219,7 +220,6 @@ esp_err_t my_uart_set_baudrate(uart_port_t uart_num, uint32_t baud_rate)
esp_err_t my_uart_get_baudrate(uart_port_t uart_num, uint32_t *baudrate)
{
- UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_ERR_INVALID_ARG);
UART_CHECK((baudrate), "empty pointer", ESP_ERR_INVALID_ARG);
(*baudrate) = (UART_CLK_FREQ / (UART[uart_num]->clk_div.val & 0xFFFFF));
@@ -228,7 +228,6 @@ esp_err_t my_uart_get_baudrate(uart_port_t uart_num, uint32_t *baudrate)
esp_err_t my_uart_set_line_inverse(uart_port_t uart_num, uint32_t inverse_mask)
{
- UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_ERR_INVALID_ARG);
UART_CHECK((((inverse_mask & ~UART_LINE_INV_MASK) == 0) || (inverse_mask == 0)), "inverse_mask error", ESP_ERR_INVALID_ARG);
UART_ENTER_CRITICAL();
@@ -377,6 +376,7 @@ static esp_err_t uart_reset_rx_fifo(uart_port_t uart_num)
return ESP_OK;
}
+// Clear uart interrupts status.
esp_err_t my_uart_clear_intr_status(uart_port_t uart_num, uint32_t mask)
{
UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_ERR_INVALID_ARG);
@@ -387,6 +387,7 @@ esp_err_t my_uart_clear_intr_status(uart_port_t uart_num, uint32_t mask)
return ESP_OK;
}
+// Set UART interrupt enable
esp_err_t my_uart_enable_intr_mask(uart_port_t uart_num, uint32_t enable_mask)
{
UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_ERR_INVALID_ARG);
@@ -407,6 +408,9 @@ esp_err_t my_uart_disable_intr_mask(uart_port_t uart_num, uint32_t disable_mask)
return ESP_OK;
}
+
+// helper function
+
esp_err_t my_uart_enable_rx_intr(uart_port_t uart_num)
{
return my_uart_enable_intr_mask(uart_num, UART_RXFIFO_FULL_INT_ENA | UART_RXFIFO_TOUT_INT_ENA);
@@ -435,6 +439,9 @@ esp_err_t my_uart_enable_tx_intr(uart_port_t uart_num, int enable, int thresh)
return ESP_OK;
}
+
+
+
static void uart_intr_service(void *arg)
{
// UART intr process
@@ -460,6 +467,7 @@ static void uart_intr_service(void *arg)
} while (++uart_num < UART_NUM_MAX);
}
+// setting isr function
esp_err_t my_uart_isr_register(uart_port_t uart_num, void (*fn)(void *), void *arg)
{
UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_ERR_INVALID_ARG);
@@ -552,7 +560,7 @@ static void uart_rx_intr_handler_default(void *param)
uart_obj_t *p_uart = (uart_obj_t *)param;
uint8_t uart_num = p_uart->uart_num;
uart_dev_t *uart_reg = UART[uart_num];
- int rx_fifo_len = uart_reg->status.rxfifo_cnt;
+ int rx_fifo_len = uart_reg->status.rxfifo_cnt;
uint8_t buf_idx = 0;
uint32_t uart_intr_status = UART[uart_num]->int_st.val;
uart_event_t uart_event;
@@ -718,7 +726,17 @@ static void uart_rx_intr_handler_default(void *param)
else
{
p_uart->rx_buffered_len += p_uart->rx_stash_len;
- xEventGroupSetBitsFromISR(kUART_Monitoe_event_group, UART_GOT_DATA, pdFALSE);
+ // SWO modify
+ if (kSWO_read_num && p_uart->rx_buffered_len >= kSWO_read_num)
+ {
+ if (kSWO_uart_notify_enable)
+ {
+ kSWO_uart_notify_enable = 0;
+ xEventGroupSetBitsFromISR(kSwoThreadEventGroup, UART_GOT_DATA, pdFALSE);
+ }
+
+ }
+
}
notify = UART_SELECT_READ_NOTIF;
@@ -744,7 +762,7 @@ static void uart_rx_intr_handler_default(void *param)
// SWO modify
// Unfortunately, Overflow occurs usually there is no flow control.
// Although the overflow situation often occurs,
- // the buffer stability of the serial port is better,
+ // the buffer stability of the serial port is better,
// and there is basically no data loss.
////TODO: Can we get rid of this code?
SetTraceError(DAP_SWO_BUFFER_OVERRUN);
@@ -804,6 +822,7 @@ static void uart_rx_intr_handler_default(void *param)
}
}
+
// Fill UART tx_fifo and return a number,
// This function by itself is not thread-safe, always call from within a muxed section.
static int uart_fill_fifo(uart_port_t uart_num, const char *buffer, uint32_t len)
@@ -904,6 +923,8 @@ int my_uart_write_bytes(uart_port_t uart_num, const char *src, size_t size)
return uart_tx_all(uart_num, src, size);
}
+
+// return min(length, data length in ring buffer)
int my_uart_read_bytes(uart_port_t uart_num, uint8_t *buf, uint32_t length, TickType_t ticks_to_wait)
{
UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", (-1));
@@ -934,6 +955,7 @@ int my_uart_read_bytes(uart_port_t uart_num, uint8_t *buf, uint32_t length, Tick
}
else
{
+ // nothing receive
xSemaphoreGive(p_uart_obj[uart_num]->rx_mux);
return copy_len;
}
@@ -974,6 +996,15 @@ int my_uart_read_bytes(uart_port_t uart_num, uint8_t *buf, uint32_t length, Tick
p_uart_obj[uart_num]->rx_buffer_full_flg = false;
UART_EXIT_CRITICAL();
my_uart_enable_rx_intr(p_uart_obj[uart_num]->uart_num);
+ // SWO modify
+ if (uart_num == 0 && kSWO_read_num && p_uart_obj[0]->rx_buffered_len >= kSWO_read_num)
+ {
+ if (kSWO_uart_notify_enable)
+ {
+ kSWO_uart_notify_enable = 0;
+ xEventGroupSetBitsFromISR(kSwoThreadEventGroup, UART_GOT_DATA, pdFALSE);
+ }
+ }
}
}
}
@@ -994,6 +1025,7 @@ esp_err_t my_uart_get_buffered_data_len(uart_port_t uart_num, size_t *size)
esp_err_t my_uart_flush(uart_port_t uart_num) __attribute__((alias("my_uart_flush_input")));
+// flush RX buffer
esp_err_t my_uart_flush_input(uart_port_t uart_num)
{
UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_ERR_INVALID_ARG);
@@ -1051,6 +1083,15 @@ esp_err_t my_uart_flush_input(uart_port_t uart_num)
p_uart_obj[uart_num]->rx_buffered_len += p_uart_obj[uart_num]->rx_stash_len;
p_uart_obj[uart_num]->rx_buffer_full_flg = false;
UART_EXIT_CRITICAL();
+ // SWO modify
+ if (uart_num == 0 && kSWO_read_num && p_uart_obj[0]->rx_buffered_len >= kSWO_read_num)
+ {
+ if (kSWO_uart_notify_enable)
+ {
+ kSWO_uart_notify_enable = 0;
+ xEventGroupSetBitsFromISR(kSwoThreadEventGroup, UART_GOT_DATA, pdFALSE);
+ }
+ }
}
}
}
@@ -1058,7 +1099,7 @@ esp_err_t my_uart_flush_input(uart_port_t uart_num)
p_uart->rx_ptr = NULL;
p_uart->rx_cur_remain = 0;
p_uart->rx_head_ptr = NULL;
- uart_reset_rx_fifo(uart_num);
+ uart_reset_rx_fifo(uart_num); // reset hardware FIFO
my_uart_enable_rx_intr(p_uart_obj[uart_num]->uart_num);
xSemaphoreGive(p_uart->rx_mux);
return ESP_OK;
@@ -1096,6 +1137,14 @@ esp_err_t my_uart_driver_install(uart_port_t uart_num, int rx_buffer_size, int t
p_uart_obj[uart_num]->rx_buffered_len = 0;
p_uart_obj[uart_num]->wait_tx_done_flg = false;
+ // SWO modify
+ if (uart_num == 0)
+ {
+ kSWO_read_index = 0;
+ kSWO_read_num = 0;
+ kSWO_read_mux = xSemaphoreCreateMutex();
+ }
+
if (uart_queue)
{
p_uart_obj[uart_num]->xQueueUart = xQueueCreate(queue_size, sizeof(uart_event_t));
@@ -1176,6 +1225,12 @@ esp_err_t my_uart_driver_delete(uart_port_t uart_num)
my_uart_disable_tx_intr(uart_num);
_xt_isr_mask(0x1 << ETS_UART_INUM);
+ // SWO modify
+ if (uart_num == 0 && kSWO_read_mux)
+ {
+ vSemaphoreDelete(kSWO_read_mux);
+ }
+
if (p_uart_obj[uart_num]->tx_fifo_sem)
{
vSemaphoreDelete(p_uart_obj[uart_num]->tx_fifo_sem);
@@ -1254,3 +1309,27 @@ esp_err_t my_uart_set_rx_timeout(uart_port_t uart_num, const uint8_t tout_thresh
UART_EXIT_CRITICAL();
return ESP_OK;
}
+
+// SWO modify
+esp_err_t my_uart_read_bytes_async_swo(uint32_t index, uint32_t length)
+{
+ if (kSWO_read_num > 0) {
+ return ESP_FAIL;
+ }
+ xSemaphoreTake(kSWO_read_mux, (portTickType)portMAX_DELAY);
+ kSWO_read_num = length;
+ kSWO_read_index = index;
+ kSWO_uart_notify_enable = 1;
+ xSemaphoreGive(kSWO_read_mux);
+
+ return ESP_OK;
+}
+
+
+int my_uart_get_rx_buffered_data_len(uart_port_t uart_num)
+{
+ UART_CHECK((uart_num < UART_NUM_MAX), "uart_num error", ESP_ERR_INVALID_ARG);
+ UART_CHECK((p_uart_obj[uart_num]), "uart driver error", ESP_ERR_INVALID_ARG);
+
+ return p_uart_obj[uart_num]->rx_buffered_len;
+}
diff --git a/components/USBIP/CMakeLists.txt b/components/USBIP/CMakeLists.txt
index 3aeba6c..ce9a251 100644
--- a/components/USBIP/CMakeLists.txt
+++ b/components/USBIP/CMakeLists.txt
@@ -1,4 +1,4 @@
set(COMPONENT_ADD_INCLUDEDIRS ". ../../main")
-set(COMPONENT_SRCS "MSOS20Descriptors.c USB_handle.c USBd_config.c")
+set(COMPONENT_SRCS "MSOS20_descriptor.c usb_handle.c usb_descriptor.c")
register_component()
\ No newline at end of file
diff --git a/components/USBIP/MSOS20Descriptors.c b/components/USBIP/MSOS20_descriptor.c
similarity index 64%
rename from components/USBIP/MSOS20Descriptors.c
rename to components/USBIP/MSOS20_descriptor.c
index 8e3ba5d..e18f5f3 100644
--- a/components/USBIP/MSOS20Descriptors.c
+++ b/components/USBIP/MSOS20_descriptor.c
@@ -1,84 +1,112 @@
-/**
- * @file MSOS20Descriptors.c
- * @author windowsair
- * @brief Store related data of Microsoft OS 2.0 descriptor
- * @version 0.1
- * @date 2019-11-21
- *
- * @copyright Copyright (c) 2019
- *
- */
-
- ////TODO: refactoring into structure
-
-#include
-#include "MSOS20Descriptors.h"
-
-#define USBShort(ui16Value) ((ui16Value) & 0xff), ((ui16Value) >> 8) //((ui16Value) & 0xFF),(((ui16Value) >> 8) & 0xFF)
-
-
-
-// Microsoft OS 2.0 descriptor set header
-const uint8_t msOs20DescriptorSetHeader[kLengthOfMsOS20] =
-{
- // Microsoft OS 2.0 Descriptor Set header (Table 10)
- 0x0A, 0x00, // wLength (Shall be set to 0x0A)
- MS_OS_20_SET_HEADER_DESCRIPTOR, 0x00,
- 0x00, 0x00, 0x03, 0x06, // dwWindowsVersion: Windows 8.1 (NTDDI_WINBLUE)
- USBShort(kLengthOfMsOS20), // wTotalLength
-
- // Support WinUSB
- // See https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/automatic-installation-of-winusb
-
- // Microsoft OS 2.0 compatible ID descriptor (Table 13)
- 0x14, 0x00, // wLength
- USBShort(MS_OS_20_FEATURE_COMPATIBLE_ID), // wDescriptorType
- 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00, // compatibleID
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // subCompatibleID
-
- // Microsoft OS 2.0 registry property descriptor (Table 14)
- 0x84, 0x00, // wLength
- USBShort(MS_OS_20_FEATURE_REG_PROPERTY),
- 0x07, 0x00, // wPropertyDataType: REG_MULTI_SZ (Unicode Strings)
- 0x2A, 0x00, // wPropertyNameLength
- 'D',0,'e',0,'v',0,'i',0,'c',0,'e',0,'I',0,'n',0,'t',0,'e',0,'r',0,
- 'f',0,'a',0,'c',0,'e',0,'G',0,'U',0,'I',0,'D',0,'s',0,0,0,
- // Set to "DeviceInterfaceGUID" to support WinUSB
- 0x50, 0x00, // wPropertyDataLength
- // WinUSB GUID
- '{',0,'C',0,'D',0,'B',0,'3',0,'B',0,'5',0,'A',0,'D',0,'-',0,
- '2',0,'9',0,'3',0,'B',0,'-',0,'4',0,'6',0,'6',0,'3',0,'-',0,
- 'A',0,'A',0,'3',0,'6',0,'-',0,'1',0,'A',0,'A',0,'E',0,'4',0,
- '6',0,'4',0,'6',0,'3',0,'7',0,'7',0,'6',0,'}',0,0,0,0,0,
- // identify a CMSIS-DAP V2 configuration,
- // must set to "{CDB3B5AD-293B-4663-AA36-1AAE46463776}"
-
-};
-
-const uint8_t bosDescriptor[kLengthOfBos] =
-{
- // Universal Serial Bus 3.0 Specification, Table 9-9.
- 0x05, // bLength of this descriptor
- USB_DESCRIPTOR_TYPE_BOS, // BOS Descriptor type(Constant)
- USBShort(kLengthOfBos), // wLength
- 0x01, // bNumDeviceCaps -> only 0x01 for OS2.0 descriptor
-
- // Microsoft OS 2.0 platform capability descriptor header (Table 4)
- // See also:
- // Universal Serial Bus 3.0 Specification : Format of a Device Capability Descriptor, Table 9-10.
-
- 0x1C, // bLength of this first device capability descriptor
- // bLength -> The total length of the remaining arrays containing this field
- USB_DESCRIPTOR_TYPE_DEVICE_CAPABILITY, // bDescriptorType
- USB_DEVICE_CAPABILITY_TYPE_PLATFORM, // bDevCapabilityType
-
- // Capability-Dependent (See USB3.0 Specification Table 9-10.)
- 0x00, // bReserved
- USB_DEVICE_CAPABILITY_UUID, // MS_OS_20_Platform_Capability_ID
-
- 0x00, 0x00, 0x03, 0x06, // dwWindowsVersion: Windows 8.1 (NTDDI_WINBLUE)
- USBShort(kLengthOfMsOS20), // wMSOSDescriptorSetTotalLength(length of descriptor set header)
- kValueOfbMS_VendorCode, // bMS_VendorCode (0x01 will be ok)
- ////TODO:change this
- 0, // bAltEnumCode
+/**
+ * @file MSOS20_descriptor.c
+ * @author windowsair
+ * @brief Store related data of Microsoft OS 2.0 descriptor
+ * @change: 2021-5-12 Add support for USB 3.0
+ * @version 0.2
+ * @date 2021-5-12
+ *
+ * @copyright Copyright (c) 2021
+ *
+ */
+
+ ////TODO: refactoring into structure
+
+#include
+
+#include "components/USBIP/MSOS20_descriptor.h"
+
+#define USBShort(ui16Value) ((ui16Value) & 0xff), ((ui16Value) >> 8) //((ui16Value) & 0xFF),(((ui16Value) >> 8) & 0xFF)
+
+
+
+// Microsoft OS 2.0 descriptor set header
+const uint8_t msOs20DescriptorSetHeader[kLengthOfMsOS20] =
+{
+ // Microsoft OS 2.0 Descriptor Set header (Table 10)
+ 0x0A, 0x00, // wLength (Shall be set to 0x0A)
+ MS_OS_20_SET_HEADER_DESCRIPTOR, 0x00,
+ 0x00, 0x00, 0x03, 0x06, // dwWindowsVersion: Windows 8.1 (NTDDI_WINBLUE)
+ USBShort(kLengthOfMsOS20), // wTotalLength
+
+ // Support WinUSB
+ // See https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/automatic-installation-of-winusb
+
+ // Microsoft OS 2.0 compatible ID descriptor (Table 13)
+ 0x14, 0x00, // wLength
+ USBShort(MS_OS_20_FEATURE_COMPATIBLE_ID), // wDescriptorType
+ 'W', 'I', 'N', 'U', 'S', 'B', 0x00, 0x00, // compatibleID
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // subCompatibleID
+
+ // Microsoft OS 2.0 registry property descriptor (Table 14)
+ 0x84, 0x00, // wLength
+ USBShort(MS_OS_20_FEATURE_REG_PROPERTY),
+ 0x07, 0x00, // wPropertyDataType: REG_MULTI_SZ (Unicode Strings)
+ 0x2A, 0x00, // wPropertyNameLength
+ 'D',0,'e',0,'v',0,'i',0,'c',0,'e',0,'I',0,'n',0,'t',0,'e',0,'r',0,
+ 'f',0,'a',0,'c',0,'e',0,'G',0,'U',0,'I',0,'D',0,'s',0,0,0,
+ // Set to "DeviceInterfaceGUID" to support WinUSB
+ 0x50, 0x00, // wPropertyDataLength
+ // WinUSB GUID
+ '{',0,'C',0,'D',0,'B',0,'3',0,'B',0,'5',0,'A',0,'D',0,'-',0,
+ '2',0,'9',0,'3',0,'B',0,'-',0,'4',0,'6',0,'6',0,'3',0,'-',0,
+ 'A',0,'A',0,'3',0,'6',0,'-',0,'1',0,'A',0,'A',0,'E',0,'4',0,
+ '6',0,'4',0,'6',0,'3',0,'7',0,'7',0,'6',0,'}',0,0,0,0,0,
+ // identify a CMSIS-DAP V2 configuration,
+ // must set to "{CDB3B5AD-293B-4663-AA36-1AAE46463776}"
+
+};
+
+const uint8_t bosDescriptor[kLengthOfBos] =
+{
+ // USB 3.0 Specification, Table 9-9.
+ 0x05, // bLength of this descriptor
+ USB_DESCRIPTOR_TYPE_BOS, // BOS Descriptor type(Constant)
+ USBShort(kLengthOfBos), // wLength
+
+
+#if (USE_USB_3_0 == 1)
+ 0x03, // bNumDeviceCaps -> USB2.0 extension & SuperSpeed USB Device & OS2.0 descriptor
+#else
+ 0x01, // bNumDeviceCaps -> only 0x01 for OS2.0 descriptor
+#endif // USE_USB_3_0 == 1
+
+#if (USE_USB_3_0 == 1)
+ // USB 2.0 extension, USB 3.0 Specification, Table 9-12.
+ 0x07, // bLength of this descriptor
+ USB_DESCRIPTOR_TYPE_DEVICE_CAPABILITY, // DEVICE CAPABILITY Descriptor type
+ USB_DEVICE_CAPABILITY_TYPE_USB2_0_EXTENSION, // Capability type: USB 2.0 EXTENSION
+ 0x02, 0x00, 0x00, 0x00, // bmAttributes -> LPM Support
+
+ // SuperSpeed USB Device, USB 3.0 Specification, Table 9-13.
+ 0x0A, // bLength of this descriptor
+ USB_DESCRIPTOR_TYPE_DEVICE_CAPABILITY, // DEVICE CAPABILITY Descriptor type
+ USB_DEVICE_CAPABILITY_TYPE_SUPERSPEED_USB, // Capability type: SUPERSPEED_USB
+ 0x00, // bmAttributes -> LTM Capable
+ 0x08, 0x00, // wSpeedsSupported -> only support SuperSpeed
+ 0x03, // bFunctionalitySupport
+ 0x00, // bU1DevExitLat -> 0 may be ok
+ 0x00, 0x00, // wU2DevExitLat -> 0 may be ok
+#endif // USE_USB_3_0 == 1
+
+
+
+ // Microsoft OS 2.0 platform capability descriptor header (Table 4)
+ // See also:
+ // USB 3.0 Specification : Format of a Device Capability Descriptor, Table 9-10.
+
+ 0x1C, // bLength of this first device capability descriptor
+ // bLength -> The total length of the remaining arrays containing this field
+ USB_DESCRIPTOR_TYPE_DEVICE_CAPABILITY, // bDescriptorType
+ USB_DEVICE_CAPABILITY_TYPE_PLATFORM, // bDevCapabilityType
+
+ // Capability-Dependent (See USB 3.0 Specification Table 9-10.)
+ 0x00, // bReserved
+ USB_DEVICE_CAPABILITY_UUID, // MS_OS_20_Platform_Capability_ID
+
+ 0x00, 0x00, 0x03, 0x06, // dwWindowsVersion: Windows 8.1 (NTDDI_WINBLUE)
+ USBShort(kLengthOfMsOS20), // wMSOSDescriptorSetTotalLength(length of descriptor set header)
+ kValueOfbMS_VendorCode, // bMS_VendorCode (0x01 will be ok)
+ ////TODO:change this
+ 0, // bAltEnumCode
};
\ No newline at end of file
diff --git a/components/USBIP/MSOS20Descriptors.h b/components/USBIP/MSOS20_descriptor.h
similarity index 82%
rename from components/USBIP/MSOS20Descriptors.h
rename to components/USBIP/MSOS20_descriptor.h
index 51bbcb1..4520249 100644
--- a/components/USBIP/MSOS20Descriptors.h
+++ b/components/USBIP/MSOS20_descriptor.h
@@ -1,81 +1,93 @@
-/**
- * @file MSOS20Descriptors.h
- * @author windowsair
- * @brief
- * @version 0.1
- * @date 2019-11-21
- *
- * @copyright Copyright (c) 2019
- *
- */
-
-#ifndef __MSOS20DESCRIPTORS_H__
-#define __MSOS20DESCRIPTORS_H__
-
-#define kLengthOfMsOS20 0xA2
-#define kLengthOfBos 0x21
-#define kValueOfbMS_VendorCode 0x01// Just set to 0x01
-extern const uint8_t bosDescriptor[kLengthOfBos];
-extern const uint8_t msOs20DescriptorSetHeader[kLengthOfMsOS20];
-
-/* Microsoft OS 2.0 Descriptors BEGIN */
-
-// Platform capability BOS descriptor, Table 1.
-#define USB_DEVICE_CAPABILITY_TYPE_PLATFORM 5
-
-// Platform capability UUID, Table 3.
-// {D8DD60DF-4589-4CC7-9CD2-659D9E648A9F}
-#define USB_DEVICE_CAPABILITY_UUID 0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C, 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F
-
-
-// Microsoft OS 2.0 descriptor wIndex values enum, Table 8.
-#define MS_OS_20_DESCRIPTOR_INDEX 7
-#define MS_OS_20_SET_ALT_ENUMERATION 8
-
-
-// Microsoft OS 2.0 descriptor types enum for wDescriptorType values, Table 9.
-#define MS_OS_20_SET_HEADER_DESCRIPTOR 0x00
-#define MS_OS_20_SUBSET_HEADER_CONFIGURATION 0x01
-#define MS_OS_20_SUBSET_HEADER_FUNCTION 0x02
-#define MS_OS_20_FEATURE_COMPATIBLE_ID 0x03
-#define MS_OS_20_FEATURE_REG_PROPERTY 0x04
-#define MS_OS_20_FEATURE_MIN_RESUME_TIME 0x05
-#define MS_OS_20_FEATURE_MODEL_ID 0x06
-#define MS_OS_20_FEATURE_CCGP_DEVICE 0x07
-
-/* Microsoft OS 2.0 Descriptors END */
-
-
-
-/* Wireless USB Standard Extension Descriptor Types BEGIN */
-
-// Wireless USB Specification 1.1 revison 1.1, Table 7-21.
-#define USB_DESCRIPTOR_TYPE_SECURITY 12
-#define USB_DESCRIPTOR_TYPE_KEY 13
-#define USB_DESCRIPTOR_TYPE_ENCRYPTION_TYPE 14
-#define USB_DESCRIPTOR_TYPE_BOS 15
-#define USB_DESCRIPTOR_TYPE_DEVICE_CAPABILITY 16
-#define USB_DESCRIPTOR_TYPE_WIRELESS_ENDPOINT_COMPANION 17
-
-/* Wireless USB Standard Extension Descriptor Types END */
-
-
-/* Microsoft Extended Compat ID OS Feature Descriptor BEGIN */
-
-#define USB_MS_EXTENDED_COMPAT_ID_VERSION 0x0100
-#define USB_MS_EXTENDED_COMPAT_ID_TYPE 0x04
-
-#define USB_COMPATID_NONE {0}
-#define USB_SUBCOMPATID_NONE {0}
-#define USB_COMPATID_WINUSB "WINUSB\0"
-#define USB_COMPATID_RNDIS "RNDIS\0\0"
-#define USB_COMPATID_PTP "PTP\0\0\0\0"
-#define USB_COMPATID_MTP "MTP\0\0\0\0"
-#define USB_COMPATID_BLUETOOTH "BLUTUTH"
-#define USB_SUBCOMPATID_BT_V11 "11\0\0\0\0\0"
-#define USB_SUBCOMPATID_BT_V12 "12\0\0\0\0\0"
-#define USB_SUBCOMPATID_BT_V20EDR "EDR\0\0\0\0"
-
-/* Microsoft Extended Compat ID OS Feature Descriptor END */
-
+/**
+ * @file MSOS20_descriptor.h
+ * @author windowsair
+ * @brief
+ * @version 0.2
+ * @date 2021-5-12
+ *
+ * @copyright Copyright (c) 2021
+ *
+ */
+
+#ifndef __MSOS20_DESCRIPTOR_H__
+#define __MSOS20_DESCRIPTOR_H__
+
+
+#define kLengthOfMsOS20 0xA2
+
+#if (USE_USB_3_0 == 1)
+#define kLengthOfBos 0x32
+#else
+#define kLengthOfBos 0x21
+#endif // USE_USB_3_0 == 1
+
+#define kValueOfbMS_VendorCode 0x01// Just set to 0x01
+extern const uint8_t bosDescriptor[kLengthOfBos];
+extern const uint8_t msOs20DescriptorSetHeader[kLengthOfMsOS20];
+
+/* Microsoft OS 2.0 Descriptors BEGIN */
+
+// Platform capability BOS descriptor, Table 1.
+#define USB_DEVICE_CAPABILITY_TYPE_PLATFORM 5
+
+// USB 2.0 Extension Descriptor, USB3.0 Specification Table 9-11
+#define USB_DEVICE_CAPABILITY_TYPE_USB2_0_EXTENSION 2
+// SuperSpeed USB specific device level capabilities, USB3.0 Specification Table 9-11
+#define USB_DEVICE_CAPABILITY_TYPE_SUPERSPEED_USB 3
+
+// Platform capability UUID, Table 3.
+// {D8DD60DF-4589-4CC7-9CD2-659D9E648A9F}
+#define USB_DEVICE_CAPABILITY_UUID 0xDF, 0x60, 0xDD, 0xD8, 0x89, 0x45, 0xC7, 0x4C, 0x9C, 0xD2, 0x65, 0x9D, 0x9E, 0x64, 0x8A, 0x9F
+
+
+// Microsoft OS 2.0 descriptor wIndex values enum, Table 8.
+#define MS_OS_20_DESCRIPTOR_INDEX 7
+#define MS_OS_20_SET_ALT_ENUMERATION 8
+
+
+// Microsoft OS 2.0 descriptor types enum for wDescriptorType values, Table 9.
+#define MS_OS_20_SET_HEADER_DESCRIPTOR 0x00
+#define MS_OS_20_SUBSET_HEADER_CONFIGURATION 0x01
+#define MS_OS_20_SUBSET_HEADER_FUNCTION 0x02
+#define MS_OS_20_FEATURE_COMPATIBLE_ID 0x03
+#define MS_OS_20_FEATURE_REG_PROPERTY 0x04
+#define MS_OS_20_FEATURE_MIN_RESUME_TIME 0x05
+#define MS_OS_20_FEATURE_MODEL_ID 0x06
+#define MS_OS_20_FEATURE_CCGP_DEVICE 0x07
+
+/* Microsoft OS 2.0 Descriptors END */
+
+
+
+/* Wireless USB Standard Extension Descriptor Types BEGIN */
+
+// Wireless USB Specification 1.1 revison 1.1, Table 7-21.
+#define USB_DESCRIPTOR_TYPE_SECURITY 12
+#define USB_DESCRIPTOR_TYPE_KEY 13
+#define USB_DESCRIPTOR_TYPE_ENCRYPTION_TYPE 14
+#define USB_DESCRIPTOR_TYPE_BOS 15
+#define USB_DESCRIPTOR_TYPE_DEVICE_CAPABILITY 16
+#define USB_DESCRIPTOR_TYPE_WIRELESS_ENDPOINT_COMPANION 17
+
+/* Wireless USB Standard Extension Descriptor Types END */
+
+
+/* Microsoft Extended Compat ID OS Feature Descriptor BEGIN */
+
+#define USB_MS_EXTENDED_COMPAT_ID_VERSION 0x0100
+#define USB_MS_EXTENDED_COMPAT_ID_TYPE 0x04
+
+#define USB_COMPATID_NONE {0}
+#define USB_SUBCOMPATID_NONE {0}
+#define USB_COMPATID_WINUSB "WINUSB\0"
+#define USB_COMPATID_RNDIS "RNDIS\0\0"
+#define USB_COMPATID_PTP "PTP\0\0\0\0"
+#define USB_COMPATID_MTP "MTP\0\0\0\0"
+#define USB_COMPATID_BLUETOOTH "BLUTUTH"
+#define USB_SUBCOMPATID_BT_V11 "11\0\0\0\0\0"
+#define USB_SUBCOMPATID_BT_V12 "12\0\0\0\0\0"
+#define USB_SUBCOMPATID_BT_V20EDR "EDR\0\0\0\0"
+
+/* Microsoft Extended Compat ID OS Feature Descriptor END */
+
#endif
\ No newline at end of file
diff --git a/components/USBIP/usb_defs.h b/components/USBIP/usb_defs.h
index 0377dc4..1312907 100644
--- a/components/USBIP/usb_defs.h
+++ b/components/USBIP/usb_defs.h
@@ -3,9 +3,9 @@
* @brief Modify
* @version 0.1
* @date 2020-01-22
- *
+ *
* @copyright Copyright (c) 2020
- *
+ *
*/
//
@@ -119,6 +119,7 @@ typedef struct
#define USB_DT_OTHER_SPEED_CONFIGURATION 7
#define USB_DT_INTERFACE_POWER 8
#define USB_DT_BOS 15
+#define USB_DT_SUPERSPEED_USB_ENDPOINT_COMPANION 48
/* From ECNs */
#define USB_DT_OTG 9
#define USB_DT_DEBUG 10
@@ -234,7 +235,7 @@ typedef struct
///////////////////////////////////////////////////////////////
/* USB Standard Endpoint Descriptor - Table 9-13 */
-typedef struct
+typedef struct
{
uint8_t bLength;
uint8_t bDescriptorType;
diff --git a/components/USBIP/USBd_config.c b/components/USBIP/usb_descriptor.c
similarity index 73%
rename from components/USBIP/USBd_config.c
rename to components/USBIP/usb_descriptor.c
index a15bf51..12752c4 100644
--- a/components/USBIP/USBd_config.c
+++ b/components/USBIP/usb_descriptor.c
@@ -1,24 +1,26 @@
////TODO: refactoring into structure
/**
- * @file USBd_config.c
+ * @file usb_descriptor.c
* @brief Standard USB Descriptor Definitions
- fix bugs 2020-1-23
+ * @change: 2020-1-23 : fix bugs
+ * 2021-5-12 : Add support for USB 3.0
* @version 0.2
* @date 2020-1-23
- *
- *
+ *
+ *
*/
#include
#include
-#include "USBd_config.h"
-#include "usb_defs.h"
-#define USBShort(ui16Value) ((ui16Value) & 0xff), ((ui16Value) >> 8) //((ui16Value) & 0xFF),(((ui16Value) >> 8) & 0xFF)
+#include "components/USBIP/usb_descriptor.h"
+#include "components/USBIP/usb_defs.h"
+
+#define USBShort(ui16Value) ((ui16Value) & 0xff), ((ui16Value) >> 8)
/**
* @brief step 1. Build Standard Device Descriptor
- *
+ *
*/
// Standard Device Descriptor
@@ -28,18 +30,28 @@ const uint8_t kUSBd0DeviceDescriptor[0x12] =
USB_DT_DEVICE, // bDescriptorType
#if (USE_WINUSB == 1)
- USBShort(0x0210), // bcdUSB
+
+#if (USE_USB_3_0 == 1)
+ USBShort(0x0300), // bcdUSB
#else
- USBShort(0x0200), // bcdUSB
-#endif
+ USBShort(0x210), // bcdUSB
+#endif // USE_USB_3_0 == 1
+
+#else
+ USBShort(0x0200), // bcdUSB
+#endif // (USE_WINUSB == 1)
////TODO: Is it also available elsewhere?
// We need to use a device other than the USB-IF standard, set to 0x00
0x00, // bDeviceClass
0x00, // bDeviceSubClass
0x00, // bDeviceProtocol
-
+
+#if (USE_USB_3_0 == 1)
+ 0x09, // bMaxPacketSize0, for USB 3.0 must set to 0x09(2^9)
+#else
USBD0_MAX_PACKET0, // bMaxPacketSize0 Maximum packet size for default pipe.
+#endif
USBShort(USBD0_DEV_DESC_IDVENDOR), // idVendor Vendor ID (VID).
USBShort(USBD0_DEV_DESC_IDPRODUCT), // idProduct Product ID (PID).
USBShort(USBD0_DEV_DESC_BCDDEVICE), // bcdDevice Device Version BCD.
@@ -54,25 +66,25 @@ const uint8_t kUSBd0DeviceDescriptor[0x12] =
/**
* @brief step 2. Buid Standard Configuration Descriptor
- *
+ *
*/
// Standard Interface Descriptor
#if (USE_WINUSB ==1)
-const uint8_t kUSBd0InterfaceDescriptor[0x1E]=
+const uint8_t kUSBd0InterfaceDescriptor[]=
{
0x09, // bLength
USB_DT_INTERFACE, // bDescriptorType
- USBD_CUSTOM_CLASS0_IF0_NUM, // bInterfaceNumber
- USBD_CUSTOM_CLASS0_IF0_ALT, // bAlternateSetting
+ USBD_CUSTOM_CLASS0_IF0_NUM, // bInterfaceNumber
+ USBD_CUSTOM_CLASS0_IF0_ALT, // bAlternateSetting
0x03, // bNumEndpoints(we will use 3 endpoints)
- //
- USBD_CUSTOM_CLASS0_IF0_CLASS, // bInterfaceClass
- USBD_CUSTOM_CLASS0_IF0_SUBCLASS, // bInterfaceSubClass
+ //
+ USBD_CUSTOM_CLASS0_IF0_CLASS, // bInterfaceClass
+ USBD_CUSTOM_CLASS0_IF0_SUBCLASS, // bInterfaceSubClass
USBD_CUSTOM_CLASS0_IF0_PROTOCOL, // bInterfaceProtocol
- 0x00, // iInterface
+ 0x00, // iInterface
// Index of string descriptor describing this interface
////TODO: fix this 0x04 ?
@@ -82,46 +94,73 @@ const uint8_t kUSBd0InterfaceDescriptor[0x1E]=
// Endpoint 1: Bulk Out – used for commands received from host PC.
// Endpoint 2: Bulk In – used for responses send to host PC.
// Endpoint 3: Bulk In (optional) – used for streaming SWO trace
-
- // ATTENTION:
+
+ // ATTENTION:
// physical endpoint 1 indeed included two "endpoints": Bulk OUT and Bulk IN
// physical endpoint 1 -> Endpoint 1 & Endpoint 2
// physical endpoint 2 -> Endpoint 3
// See also :
- // http://www.keil.com/pack/doc/CMSIS/DAP/html/group__DAP__ConfigUSB__gr.html
-
+ // http://www.keil.com/pack/doc/CMSIS/DAP/html/group__DAP__ConfigUSB__gr.html
+
/* Pysical endpoint 1 */
// "Endpoint 1: Bulk Out – used for commands received from host PC." PC -> Device
- 0x07, // bLength
- USB_DT_ENDPOINT, // bDescriptorType
+ 0x07, // bLength
+ USB_DT_ENDPOINT, // bDescriptorType
0x01, // bEndpointAddress
- USB_ENDPOINT_ATTR_BULK, // bmAttributes
- USBShort(512), // wMaxPacketSize
- // We assume that it always runs in High Speed.
- 0x00, // bInterval
+ USB_ENDPOINT_ATTR_BULK, // bmAttributes
+ USBShort(USB_ENDPOINT_SIZE), // wMaxPacketSize
+ 0x00, // bInterval
+
+ /* SuperSpeed Endpoint Companion */
+#if (USE_USB_3_0 == 1)
+ 0x06, // bLength
+ USB_DT_SUPERSPEED_USB_ENDPOINT_COMPANION, // bDescriptorType
+ 0x00, // bMaxBurst
+ 0x00, // bmAttributes(MaxStream for Bulk)
+ 0x00, 0x00, // wBytesPerInterval -> 0 for Bulk
+#endif // USE_USB_3_0 == 1
+
/* Pysical endpoint 1 */
-
+
// "Endpoint 2: Bulk In – used for responses send to host PC." Device -> PC
- 0x07, // bLength
- USB_DT_ENDPOINT, // bDescriptorType
+ 0x07, // bLength
+ USB_DT_ENDPOINT, // bDescriptorType
0x81, // bEndpointAddress
- USB_ENDPOINT_ATTR_BULK, // bmAttributes
- USBShort(512), // wMaxPacketSize
- 0x00, // bInterval
+ USB_ENDPOINT_ATTR_BULK, // bmAttributes
+ USBShort(USB_ENDPOINT_SIZE), // wMaxPacketSize
+ 0x00, // bInterval
+
+ /* SuperSpeed Endpoint Companion */
+#if (USE_USB_3_0 == 1)
+ 0x06, // bLength
+ USB_DT_SUPERSPEED_USB_ENDPOINT_COMPANION, // bDescriptorType
+ 0x00, // bMaxBurst
+ 0x00, // bmAttributes(MaxStream for Bulk)
+ 0x00, 0x00, // wBytesPerInterval -> 0 for Bulk
+#endif // USE_USB_3_0 == 1
+
/* Pysical endpoint 2 */
-
- // "Endpoint 3: Bulk In (optional) – used for streaming SWO trace" Device -> PC
- 0x07, // bLength
- USB_DT_ENDPOINT, // bDescriptorType
- 0x82, // bEndpointAddress
- USB_ENDPOINT_ATTR_BULK, // bmAttributes
- USBShort(512), // wMaxPacketSize
- 0x00, // bInterval
+ // "Endpoint 3: Bulk In (optional) – used for streaming SWO trace" Device -> PC
+ 0x07, // bLength
+ USB_DT_ENDPOINT, // bDescriptorType
+ 0x82, // bEndpointAddress
+ USB_ENDPOINT_ATTR_BULK, // bmAttributes
+ USBShort(USB_ENDPOINT_SIZE), // wMaxPacketSize
+ 0x00, // bInterval
+
+ /* SuperSpeed Endpoint Companion */
+#if (USE_USB_3_0 == 1)
+ 0x06, // bLength
+ USB_DT_SUPERSPEED_USB_ENDPOINT_COMPANION, // bDescriptorType
+ 0x00, // bMaxBurst
+ 0x00, // bmAttributes(MaxStream for Bulk)
+ 0x00, 0x00, // wBytesPerInterval -> 0 for Bulk
+#endif // USE_USB_3_0 == 1
};
@@ -130,16 +169,16 @@ const uint8_t kUSBd0InterfaceDescriptor[0x20]=
{
0x09, // bLength
USB_DT_INTERFACE, // bDescriptorType
- USBD_CUSTOM_CLASS0_IF0_NUM, // bInterfaceNumber
- USBD_CUSTOM_CLASS0_IF0_ALT, // bAlternateSetting
+ 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_CLASS, // bInterfaceClass
+ USBD_CUSTOM_CLASS0_IF0_SUBCLASS, // bInterfaceSubClass
USBD_CUSTOM_CLASS0_IF0_PROTOCOL, // bInterfaceProtocol
- 0x00, // iInterface
+ 0x00, // iInterface
// Index of string descriptor describing this interface
-
+
// HID Descriptor
0x09, // bLength
0x21, // bDescriptorType
@@ -147,29 +186,29 @@ const uint8_t kUSBd0InterfaceDescriptor[0x20]=
0x00, // bCountryCode
0x01, // bNumDescriptors
0x22, // bDescriptorType1
- 0x21, 0x00, // wDescriptorLength1
+ 0x21, 0x00, // wDescriptorLength1
// Standard Endpoint Descriptor
// We perform all transfer operations on Pysical endpoint 1.
-
+
/* Pysical endpoint 1 */
- 0x07, // bLength
- USB_DT_ENDPOINT, // bDescriptorType
+ 0x07, // bLength
+ USB_DT_ENDPOINT, // bDescriptorType
0x81, // bEndpointAddress
- USB_ENDPOINT_ATTR_INTERRUPT, // bmAttributes
- USBShort(64), // wMaxPacketSize
- 0x01, // bInterval
+ USB_ENDPOINT_ATTR_INTERRUPT, // bmAttributes
+ USBShort(64), // wMaxPacketSize
+ 0x01, // bInterval
/* Pysical endpoint 1 */
-
- 0x07, // bLength
- USB_DT_ENDPOINT, // bDescriptorType
+
+ 0x07, // bLength
+ USB_DT_ENDPOINT, // bDescriptorType
0x01, // bEndpointAddress
- USB_ENDPOINT_ATTR_INTERRUPT, // bmAttributes
- USBShort(64), // wMaxPacketSize
- 0x01, // bInterval
+ USB_ENDPOINT_ATTR_INTERRUPT, // bmAttributes
+ USBShort(64), // wMaxPacketSize
+ 0x01, // bInterval
};
#endif
@@ -182,12 +221,12 @@ const uint8_t kUSBd0ConfigDescriptor[LENGTHOFCONFIGDESCRIPTOR] =
// Configuration descriptor header.
0x09, // bLength
- USB_DT_CONFIGURATION, // bDescriptorType
-
- USBShort((sizeof(kUSBd0InterfaceDescriptor)) + (LENGTHOFCONFIGDESCRIPTOR)),
+ USB_DT_CONFIGURATION, // bDescriptorType
+
+ USBShort((sizeof(kUSBd0InterfaceDescriptor)) + (LENGTHOFCONFIGDESCRIPTOR)),
// wTotalLength
- 0x01, // bNumInterfaces
+ 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 */
@@ -202,12 +241,12 @@ const uint8_t kUSBd0ConfigDescriptor[LENGTHOFCONFIGDESCRIPTOR] =
// Configuration descriptor header.
0x09, // bLength
- USB_DT_CONFIGURATION, // bDescriptorType
-
- USBShort((sizeof(kUSBd0InterfaceDescriptor)) + (LENGTHOFCONFIGDESCRIPTOR)),
+ USB_DT_CONFIGURATION, // bDescriptorType
+
+ USBShort((sizeof(kUSBd0InterfaceDescriptor)) + (LENGTHOFCONFIGDESCRIPTOR)),
// wTotalLength
- 0x01, // bNumInterfaces
+ 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 */
@@ -246,7 +285,7 @@ const uint8_t kHidReportDescriptor[0x21] = {
/**
* @brief step 3. Build String Descriptor
- *
+ *
*/
@@ -265,7 +304,7 @@ const uint8_t kLangDescriptor[0x04] =
* 3. Serial number string -> "0001A0000000"
* 4. Interface string -> "LPC-Link-II CMSIS-DAP"
*
- *
+ *
*/
const uint8_t kManufacturerString[0x28] =
@@ -286,7 +325,7 @@ const uint8_t kProductString[0x18] =
'I', 0
};
-const uint8_t kSerialNumberString[0x1A] =
+const uint8_t kSerialNumberString[0x1A] =
{
0x1A, // bLength
0x03, // bDescriptorType
@@ -301,7 +340,7 @@ const uint8_t kInterfaceString[0x2C] =
0x03, // bDescriptorType
// "LPC-Link-II CMSIS-DAP"
'L', 0, 'P', 0, 'C', 0, '-', 0, 'L', 0, 'i', 0, 'n', 0, 'k', 0, '-', 0, 'I', 0,
- 'I', 0, ' ', 0, 'C', 0, 'M', 0, 'S', 0, 'I', 0, 'S', 0, '-', 0, 'D', 0, 'A', 0,
+ 'I', 0, ' ', 0, 'C', 0, 'M', 0, 'S', 0, 'I', 0, 'S', 0, '-', 0, 'D', 0, 'A', 0,
'P', 0
};
diff --git a/components/USBIP/USBd_config.h b/components/USBIP/usb_descriptor.h
similarity index 88%
rename from components/USBIP/USBd_config.h
rename to components/USBIP/usb_descriptor.h
index 188b529..8b2a31b 100644
--- a/components/USBIP/USBd_config.h
+++ b/components/USBIP/usb_descriptor.h
@@ -1,7 +1,7 @@
-#ifndef __USBD_CONFIG_H__
-#define __USBD_CONFIG_H__
+#ifndef __USB_DESCRIPTOR_H__
+#define __USB_DESCRIPTOR_H__
-#include "dap_configuration.h"
+#include "main/dap_configuration.h"
// Vendor ID assigned by USB-IF (idVendor).
#define USBD0_DEV_DESC_IDVENDOR 0xC251
@@ -51,7 +51,13 @@ extern const uint8_t kProductString[0x18];
extern const uint8_t kSerialNumberString[0x1A];
#if (USE_WINUSB == 1)
+
+#if (USE_USB_3_0 == 1)
+extern const uint8_t kUSBd0InterfaceDescriptor[0x30];
+#else
extern const uint8_t kUSBd0InterfaceDescriptor[0x1E];
+#endif // USE_USB_3_0 == 1
+
extern const uint8_t kUSBd0ConfigDescriptor[0x09];
extern const uint8_t kInterfaceString[0x2C];
diff --git a/components/USBIP/USB_handle.c b/components/USBIP/usb_handle.c
similarity index 98%
rename from components/USBIP/USB_handle.c
rename to components/USBIP/usb_handle.c
index e806f1e..496d8e8 100644
--- a/components/USBIP/USB_handle.c
+++ b/components/USBIP/usb_handle.c
@@ -3,21 +3,23 @@
* @brief Handle all Standard Device Requests on endpoint 0
* @version 0.1
* @date 2020-01-23
- *
+ *
* @copyright Copyright (c) 2020
- *
+ *
*/
#include
#include
+
+#include "main/usbip_server.h"
+
+#include "components/USBIP/usb_handle.h"
+#include "components/USBIP/usb_descriptor.h"
+#include "components/USBIP/MSOS20_descriptor.h"
+
#include "lwip/err.h"
#include "lwip/sockets.h"
#include "lwip/sys.h"
#include
-#include "USB_handle.h"
-#include "USBd_config.h"
-#include "usbip_server.h"
-#include "usb_defs.h"
-#include "MSOS20Descriptors.h"
const char *strings_list[] = {
@@ -263,7 +265,7 @@ static void handleGetDescriptor(usbip_stage2_header *header)
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);
}
diff --git a/components/USBIP/USB_handle.h b/components/USBIP/usb_handle.h
similarity index 69%
rename from components/USBIP/USB_handle.h
rename to components/USBIP/usb_handle.h
index ac4eeec..f61edf5 100644
--- a/components/USBIP/USB_handle.h
+++ b/components/USBIP/usb_handle.h
@@ -1,7 +1,8 @@
#ifndef __USB_HANDLE_H__
#define __USB_HANDLE_H__
-#include "usbip_defs.h"
+#include "components/USBIP/usbip_defs.h"
+
void handleUSBControlRequest(usbip_stage2_header *header);
#endif
\ No newline at end of file
diff --git a/components/USBIP/usbip_defs.h b/components/USBIP/usbip_defs.h
index d36d16e..84112a7 100644
--- a/components/USBIP/usbip_defs.h
+++ b/components/USBIP/usbip_defs.h
@@ -3,9 +3,9 @@
* @brief Simple modification
* @version 0.1
* @date 2020-01-22
- *
+ *
* @copyright Copyright (c) 2020
- *
+ *
*/
// Focus on the following structures in this file:
@@ -20,7 +20,8 @@
#define __USBIP_DEFS_H__
#include
-#include "usb_defs.h"
+
+#include "components/USBIP/usb_defs.h"
#define USBIP_SYSFS_PATH_SIZE 256
#define USBIP_BUSID_SIZE 32
@@ -33,7 +34,7 @@ enum usbip_stage1_command
};
enum usbip_stager2_command
-{
+{
//Offset 0
USBIP_STAGE2_REQ_SUBMIT = 0x0001,
USBIP_STAGE2_REQ_UNLINK = 0x0002,
@@ -106,7 +107,7 @@ typedef struct
/**
* struct usbip_header_basic - data pertinent to every URB request
* RESPONSE & REQUEST
- *
+ *
* @command: the usbip request type
* @seqnum: sequential number that identifies requests; incremented per
* connection
@@ -127,7 +128,7 @@ typedef struct
/**
* struct usbip_header_cmd_submit - USBIP_CMD_SUBMIT packet header
* >>>REQUEST
- *
+ *
* @transfer_flags: URB flags
* @transfer_buffer_length: the data size for (in) or (out) transfer
* @start_frame: initial frame for isochronous or interrupt transfers
@@ -154,7 +155,7 @@ typedef struct
/**
* struct usbip_header_ret_submit - USBIP_RET_SUBMIT packet header
* <<
-#include
-#include "usbip_server.h"
-#include "DAP_handle.h"
-#include "DAP.h"
-#include "esp_libc.h"
-#include "USBd_config.h"
-#include "dap_configuration.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;
-
-int kRestartDAPHandle = 0;
-
-
-#if (USE_WINUSB == 1)
-typedef struct
-{
- uint32_t length;
- uint8_t buf[DAP_PACKET_SIZE];
-} DAPPacetDataType;
-#else
-typedef struct
-{
- uint8_t buf[DAP_PACKET_SIZE];
-} DAPPacetDataType;
-#endif
-
-
-#define DAP_HANDLE_SIZE (sizeof(DAPPacetDataType))
-
-static DAPPacetDataType DAPDataProcessed;
-static int dap_respond = 0;
-
-
-// SWO Trace
-static int swo_trace_respond = 0;
-static uint8_t *swo_data_to_send;
-static uint32_t num_swo_data;
-
-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)
- send_stage2_submit(header, 0, 0);
-
- // always send constant size buf -> cuz we don't care about the IN packet size
- // and to unify the style, we set aside the length of the section
- xRingbufferSend(dap_dataIN_handle, data_in - sizeof(uint32_t), DAP_HANDLE_SIZE, portMAX_DELAY);
- xTaskNotifyGive(kDAPTaskHandle);
-
-#else
- send_stage2_submit(header, 0, 0);
-
- xRingbufferSend(dap_dataIN_handle, data_in, DAP_HANDLE_SIZE, portMAX_DELAY);
- xTaskNotifyGive(kDAPTaskHandle);
-
-#endif
-
- // dap_respond = DAP_ProcessCommand((uint8_t *)data_in, (uint8_t *)data_out);
- // //handle_dap_data_response(header);
- // send_stage2_submit(header, 0, 0);
-}
-
-void handle_dap_data_response(usbip_stage2_header *header)
-{
- return;
- // int resLength = dap_respond & 0xFFFF;
- // if (resLength)
- // {
-
- // send_stage2_submit_data(header, 0, (void *)DAPDataProcessed.buf, resLength);
- // dap_respond = 0;
- // }
- // else
- // {
- // send_stage2_submit(header, 0, 0);
- // }
-}
-
-void handle_swo_trace_response(usbip_stage2_header *header)
-{
- // TODO:
- send_stage2_submit(header, 0, 0);
- return;
-
- if (swo_trace_respond)
- {
- swo_trace_respond = 0;
- //send_stage2_submit_data(header, 0, (void *)DAPDataProcessed.buf, DAP_PACKET_SIZE);
- }
- else
- {
- send_stage2_submit(header, 0, 0);
- }
-}
-
-// SWO Data Queue Transfer
-// buf: pointer to buffer with data
-// num: number of bytes to transfer
-void SWO_QueueTransfer(uint8_t *buf, uint32_t num)
-{
- swo_data_to_send = buf;
- num_swo_data = num;
- swo_trace_respond = 1;
-}
-
-// SWO Data Abort Transfer
-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_HANDLE_SIZE * 20, RINGBUF_TYPE_BYTEBUF);
- dap_dataOUT_handle = xRingbufferCreate(DAP_HANDLE_SIZE * 20, RINGBUF_TYPE_BYTEBUF);
- data_response_mux = xSemaphoreCreateMutex();
- size_t packetSize;
- int resLength;
- DAPPacetDataType *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)
- {
- if (kRestartDAPHandle)
- {
- vRingbufferDelete(dap_dataIN_handle);
- vRingbufferDelete(dap_dataOUT_handle);
- dap_dataIN_handle = dap_dataOUT_handle = NULL;
-
- dap_dataIN_handle = xRingbufferCreate(DAP_HANDLE_SIZE * 20, RINGBUF_TYPE_BYTEBUF);
- dap_dataOUT_handle = xRingbufferCreate(DAP_HANDLE_SIZE * 20, RINGBUF_TYPE_BYTEBUF);
- if (dap_dataIN_handle == NULL || dap_dataIN_handle == NULL)
- {
- os_printf("Can not create DAP ringbuf/mux!\r\n");
- vTaskDelete(NULL);
- }
- kRestartDAPHandle = 0;
- }
-
- ulTaskNotifyTake(pdFALSE, portMAX_DELAY);
- packetSize = 0;
- item = (DAPPacetDataType *)xRingbufferReceiveUpTo(dap_dataIN_handle, &packetSize,
- (1 / portTICK_RATE_MS), DAP_HANDLE_SIZE);
- if (packetSize == 0)
- {
- break;
- }
-
- else if (packetSize < DAP_HANDLE_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->buf[0] == ID_DAP_QueueCommands)
- {
- item->buf[0] = ID_DAP_ExecuteCommands;
- }
-
- resLength = DAP_ProcessCommand((uint8_t *)item->buf, (uint8_t *)DAPDataProcessed.buf); // use first 4 byte to save length
- resLength &= 0xFFFF; // res length in lower 16 bits
-
- vRingbufferReturnItem(dap_dataIN_handle, (void *)item); // process done.
-
- // now prepare to reply
- #if (USE_WINUSB == 1)
- DAPDataProcessed.length = resLength;
- #endif
- xRingbufferSend(dap_dataOUT_handle, (void *)&DAPDataProcessed, DAP_HANDLE_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)
- {
- DAPPacetDataType *item;
- size_t packetSize = 0;
- item = (DAPPacetDataType *)xRingbufferReceiveUpTo(dap_dataOUT_handle, &packetSize,
- (10 / portTICK_RATE_MS), DAP_HANDLE_SIZE);
- if (packetSize == DAP_HANDLE_SIZE)
- {
- unpack((uint32_t *)buf, sizeof(usbip_stage2_header));
-
- #if (USE_WINUSB == 1)
- uint32_t resLength = item->length;
- send_stage2_submit_data((usbip_stage2_header *)buf, 0, item->buf, resLength);
- #else
- send_stage2_submit_data((usbip_stage2_header *)buf, 0, item->buf, DAP_HANDLE_SIZE);
- #endif
-
-
- 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
- {
- //// TODO: ep0 dir 0 ?
- buf[0x3] = 0x3; // command
- buf[0xF] = 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
+/**
+ * @file DAP_handle.c
+ * @brief Handle DAP packets and transaction push
+ * @version 0.4
+ * @change: 2020.02.04 first version
+ * 2020.11.11 support WinUSB mode
+ * 2021.02.17 support SWO
+ *
+ * @copyright Copyright (c) 2021
+ *
+ */
+
+#include
+#include
+
+#include "main/usbip_server.h"
+#include "main/DAP_handle.h"
+#include "main/dap_configuration.h"
+
+#include "components/USBIP/usb_descriptor.h"
+#include "components/DAP/include/DAP.h"
+#include "components/DAP/include/swo.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
+
+#if (USE_WINUSB == 1)
+typedef struct
+{
+ uint32_t length;
+ uint8_t buf[DAP_PACKET_SIZE];
+} DapPacket_t;
+#else
+typedef struct
+{
+ uint8_t buf[DAP_PACKET_SIZE];
+} DapPacket_t;
+#endif
+
+#define DAP_HANDLE_SIZE (sizeof(DapPacket_t))
+
+
+extern int kSock;
+extern TaskHandle_t kDAPTaskHandle;
+
+int kRestartDAPHandle = 0;
+
+
+static DapPacket_t DAPDataProcessed;
+static int dap_respond = 0;
+
+// SWO Trace
+static uint8_t *swo_data_to_send = NULL;
+static uint32_t swo_data_num;
+
+// DAP handle
+static RingbufHandle_t dap_dataIN_handle = NULL;
+static RingbufHandle_t dap_dataOUT_handle = NULL;
+static SemaphoreHandle_t data_response_mux = NULL;
+
+
+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)
+ send_stage2_submit(header, 0, 0);
+
+ // always send constant size buf -> cuz we don't care about the IN packet size
+ // and to unify the style, we set aside the length of the section
+ xRingbufferSend(dap_dataIN_handle, data_in - sizeof(uint32_t), DAP_HANDLE_SIZE, portMAX_DELAY);
+ xTaskNotifyGive(kDAPTaskHandle);
+
+#else
+ send_stage2_submit(header, 0, 0);
+
+ xRingbufferSend(dap_dataIN_handle, data_in, DAP_HANDLE_SIZE, portMAX_DELAY);
+ xTaskNotifyGive(kDAPTaskHandle);
+
+#endif
+
+ // dap_respond = DAP_ProcessCommand((uint8_t *)data_in, (uint8_t *)data_out);
+ // //handle_dap_data_response(header);
+ // send_stage2_submit(header, 0, 0);
+}
+
+void handle_dap_data_response(usbip_stage2_header *header)
+{
+ return;
+ // int resLength = dap_respond & 0xFFFF;
+ // if (resLength)
+ // {
+
+ // send_stage2_submit_data(header, 0, (void *)DAPDataProcessed.buf, resLength);
+ // dap_respond = 0;
+ // }
+ // else
+ // {
+ // send_stage2_submit(header, 0, 0);
+ // }
+}
+
+void handle_swo_trace_response(usbip_stage2_header *header)
+{
+#if (SWO_FUNCTION_ENABLE == 1)
+ if (kSwoTransferBusy)
+ {
+ // busy indicates that there is data to be send
+ printf("swo use data\r\n");
+ send_stage2_submit_data(header, 0, (void *)swo_data_to_send, swo_data_num);
+ SWO_TransferComplete();
+ }
+ else
+ {
+ // nothing to send.
+ send_stage2_submit(header, 0, 0);
+ }
+#else
+ send_stage2_submit(header, 0, 0);
+#endif
+}
+
+// SWO Data Queue Transfer
+// buf: pointer to buffer with data
+// num: number of bytes to transfer
+void SWO_QueueTransfer(uint8_t *buf, uint32_t num)
+{
+ swo_data_to_send = buf;
+ swo_data_num = num;
+}
+
+void DAP_Thread(void *argument)
+{
+ dap_dataIN_handle = xRingbufferCreate(DAP_HANDLE_SIZE * 20, RINGBUF_TYPE_BYTEBUF);
+ dap_dataOUT_handle = xRingbufferCreate(DAP_HANDLE_SIZE * 20, RINGBUF_TYPE_BYTEBUF);
+ data_response_mux = xSemaphoreCreateMutex();
+ size_t packetSize;
+ int resLength;
+ DapPacket_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)
+ {
+ if (kRestartDAPHandle)
+ {
+ vRingbufferDelete(dap_dataIN_handle);
+ vRingbufferDelete(dap_dataOUT_handle);
+ dap_dataIN_handle = dap_dataOUT_handle = NULL;
+
+ dap_dataIN_handle = xRingbufferCreate(DAP_HANDLE_SIZE * 20, RINGBUF_TYPE_BYTEBUF);
+ dap_dataOUT_handle = xRingbufferCreate(DAP_HANDLE_SIZE * 20, RINGBUF_TYPE_BYTEBUF);
+ if (dap_dataIN_handle == NULL || dap_dataIN_handle == NULL)
+ {
+ os_printf("Can not create DAP ringbuf/mux!\r\n");
+ vTaskDelete(NULL);
+ }
+ kRestartDAPHandle = 0;
+ }
+
+ ulTaskNotifyTake(pdFALSE, portMAX_DELAY);
+ packetSize = 0;
+ item = (DapPacket_t *)xRingbufferReceiveUpTo(dap_dataIN_handle, &packetSize,
+ pdMS_TO_TICKS(1), DAP_HANDLE_SIZE);
+ if (packetSize == 0)
+ {
+ break;
+ }
+
+ else if (packetSize < DAP_HANDLE_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->buf[0] == ID_DAP_QueueCommands)
+ {
+ item->buf[0] = ID_DAP_ExecuteCommands;
+ }
+
+ resLength = DAP_ProcessCommand((uint8_t *)item->buf, (uint8_t *)DAPDataProcessed.buf); // use first 4 byte to save length
+ resLength &= 0xFFFF; // res length in lower 16 bits
+
+ vRingbufferReturnItem(dap_dataIN_handle, (void *)item); // process done.
+
+ // now prepare to reply
+#if (USE_WINUSB == 1)
+ DAPDataProcessed.length = resLength;
+#endif
+ xRingbufferSend(dap_dataOUT_handle, (void *)&DAPDataProcessed, DAP_HANDLE_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)
+{
+ usbip_stage2_header *buf_header = (usbip_stage2_header *)buf;
+ if (length == 48 &&
+ buf_header->base.command == PP_HTONL(USBIP_STAGE2_REQ_SUBMIT) &&
+ buf_header->base.direction == PP_HTONL(USBIP_DIR_IN) &&
+ buf_header->base.ep == PP_HTONL(1))
+ {
+ if (dap_respond > 0)
+ {
+ DapPacket_t *item;
+ size_t packetSize = 0;
+ item = (DapPacket_t *)xRingbufferReceiveUpTo(dap_dataOUT_handle, &packetSize,
+ pdMS_TO_TICKS(10), DAP_HANDLE_SIZE);
+ if (packetSize == DAP_HANDLE_SIZE)
+ {
+#if (USE_WINUSB == 1)
+ send_stage2_submit_data_fast((usbip_stage2_header *)buf, item->buf, item->length);
+#else
+ send_stage2_submit_data_fast((usbip_stage2_header *)buf, item->buf, DAP_HANDLE_SIZE);
+#endif
+
+ 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_header->base.command = PP_HTONL(USBIP_STAGE2_RSP_SUBMIT);
+ buf_header->base.direction = PP_HTONL(USBIP_DIR_OUT);
+ buf_header->u.ret_submit.status = 0;
+ buf_header->u.ret_submit.data_length = 0;
+ buf_header->u.ret_submit.error_count = 0;
+ send(kSock, buf, 48, 0);
+ return 1;
+ }
+ }
+ return 0;
+}
diff --git a/main/DAP_handle.h b/main/DAP_handle.h
index 2d71be2..bce40ca 100644
--- a/main/DAP_handle.h
+++ b/main/DAP_handle.h
@@ -1,7 +1,7 @@
#ifndef __DAP_HANDLE_H__
#define __DAP_HANDLE_H__
-#include "usbip_defs.h"
+#include "components/USBIP/usbip_defs.h"
void handle_dap_data_request(usbip_stage2_header *header, uint32_t length);
void handle_dap_data_response(usbip_stage2_header *header);
diff --git a/main/dap_configuration.h b/main/dap_configuration.h
index 07298cf..1c6efdf 100644
--- a/main/dap_configuration.h
+++ b/main/dap_configuration.h
@@ -3,10 +3,31 @@
/**
* @brief Specify the use of WINUSB
- *
+ *
*/
#define USE_WINUSB 1
+/**
+ * @brief Enable this option, no need to physically connect MOSI and MISO
+ *
+ */
+#define USE_SPI_SIO 1
+
+
+/**
+ * @brief Specify to enable USB 3.0
+ *
+ */
+#define USE_USB_3_0 0
+
+
+// For USB 3.0, it must be 1024 byte.
+#if (USE_USB_3_0 == 1)
+ #define USB_ENDPOINT_SIZE 1024U
+#else
+ #define USB_ENDPOINT_SIZE 512U
+#endif
+
/// Maximum Package Size for Command and Response data.
/// 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,
diff --git a/main/main.c b/main/main.c
index a8c3e85..597cd52 100644
--- a/main/main.c
+++ b/main/main.c
@@ -1,142 +1,181 @@
-/* BSD Socket API Example
-
- This example code is in the Public Domain (or CC0 licensed, at your option.)
-
- Unless required by applicable law or agreed to in writing, this
- software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
- CONDITIONS OF ANY KIND, either express or implied.
-*/
-#include
-#include
-#include
-#include "freertos/FreeRTOS.h"
-#include "freertos/task.h"
-#include "freertos/event_groups.h"
-#include "esp_system.h"
-#include "esp_wifi.h"
-#include "esp_event_loop.h"
-#include "esp_log.h"
-#include "nvs_flash.h"
-
-#include "lwip/err.h"
-#include "lwip/sockets.h"
-#include "lwip/sys.h"
-#include
-
-#include "tcp_server.h"
-#include "timer.h"
-#include "wifi_configuration.h"
-
-
-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
-const int IPV6_GOTIP_BIT = BIT1;
-#endif
-
-
-static esp_err_t event_handler(void *ctx, system_event_t *event)
-{
- /* For accessing reason codes in case of disconnection */
- system_event_info_t *info = &event->event_info;
-
- switch (event->event_id)
- {
- case SYSTEM_EVENT_STA_START:
- esp_wifi_connect();
- os_printf("SYSTEM_EVENT_STA_START\r\n");
- break;
- case SYSTEM_EVENT_STA_CONNECTED:
-#ifdef CONFIG_EXAMPLE_IPV6
- /* enable ipv6 */
- tcpip_adapter_create_ip6_linklocal(TCPIP_ADAPTER_IF_STA);
-#endif
- break;
- case SYSTEM_EVENT_STA_GOT_IP:
- xEventGroupSetBits(wifi_event_group, IPV4_GOTIP_BIT);
- os_printf("SYSTEM EVENT STA GOT IP : %s\r\n", ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));
- break;
- case SYSTEM_EVENT_STA_DISCONNECTED:
- os_printf("Disconnect reason : %d\r\n", info->disconnected.reason);
- if (info->disconnected.reason == WIFI_REASON_BASIC_RATE_NOT_SUPPORT)
- {
- /*Switch to 802.11 bgn mode */
- esp_wifi_set_protocol(ESP_IF_WIFI_STA, WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N);
- }
- esp_wifi_connect();
- xEventGroupClearBits(wifi_event_group, IPV4_GOTIP_BIT);
-#ifdef CONFIG_EXAMPLE_IPV6
- xEventGroupClearBits(wifi_event_group, IPV6_GOTIP_BIT);
-#endif
- break;
- case SYSTEM_EVENT_AP_STA_GOT_IP6:
-#ifdef CONFIG_EXAMPLE_IPV6
- xEventGroupSetBits(wifi_event_group, IPV6_GOTIP_BIT);
- os_printf("SYSTEM_EVENT_STA_GOT_IP6\r\n");
-
- char *ip6 = ip6addr_ntoa(&event->event_info.got_ip6.ip6_info.ip);
- os_printf("IPv6: %s\r\n", ip6);
-#endif
- default:
- break;
- }
- return ESP_OK;
-}
-
-static void initialise_wifi(void)
-{
- tcpip_adapter_init();
- wifi_event_group = xEventGroupCreate();
-
- ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));
- wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
- ESP_ERROR_CHECK(esp_wifi_init(&cfg));
- ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
- wifi_config_t wifi_config = {
- .sta = {
- .ssid = WIFI_SSID,
- .password = WIFI_PASS,
- },
- };
- os_printf("Setting WiFi configuration SSID %s...\r\n", wifi_config.sta.ssid);
- ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
- ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
- ESP_ERROR_CHECK(esp_wifi_start());
-}
-
-static void wait_for_ip()
-{
-#ifdef CONFIG_EXAMPLE_IPV6
- uint32_t bits = IPV4_GOTIP_BIT | IPV6_GOTIP_BIT;
-#else
- uint32_t bits = IPV4_GOTIP_BIT;
-#endif
-
- os_printf("Waiting for AP connection...\r\n");
- xEventGroupWaitBits(wifi_event_group, bits, false, true, portMAX_DELAY);
- os_printf("Connected to AP\r\n");
-}
-
-
-void app_main()
-{
- ESP_ERROR_CHECK(nvs_flash_init());
- initialise_wifi();
- wait_for_ip();
- DAP_Setup(); // DAP Setup
-
- xTaskCreate(timer_create_task, "timer_create", 512, NULL, 10, NULL);
- xTaskCreate(tcp_server_task, "tcp_server", 4096, NULL, 14, NULL);
- xTaskCreate(DAP_Thread, "DAP_Task", 2048, NULL, 10, &kDAPTaskHandle);
- // SWO Trace Task
- //xTaskCreate(SWO_Thread, "swo_task", 1024, NULL, 6, NULL);
- //xTaskCreate(usart_monitor_task, "uart_task", 512, NULL, 6, NULL);
-}
+/* BSD Socket API Example
+
+ This example code is in the Public Domain (or CC0 licensed, at your option.)
+
+ Unless required by applicable law or agreed to in writing, this
+ software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
+ CONDITIONS OF ANY KIND, either express or implied.
+*/
+#include
+#include
+#include
+
+#include "main/tcp_server.h"
+#include "main/timer.h"
+#include "main/wifi_configuration.h"
+
+#include "freertos/FreeRTOS.h"
+#include "freertos/task.h"
+#include "freertos/event_groups.h"
+#include "esp_system.h"
+#include "esp_wifi.h"
+#include "esp_event_loop.h"
+#include "esp_log.h"
+#include "nvs_flash.h"
+
+#include "lwip/err.h"
+#include "lwip/sockets.h"
+#include "lwip/sys.h"
+#include
+
+
+extern void DAP_Setup(void);
+extern void DAP_Thread(void *argument);
+extern void SWO_Thread();
+
+TaskHandle_t kDAPTaskHandle = NULL;
+
+
+
+/* FreeRTOS event group to signal when we are connected & ready to make a request */
+static EventGroupHandle_t wifi_event_group;
+
+const int IPV4_GOTIP_BIT = BIT0;
+#ifdef CONFIG_EXAMPLE_IPV6
+const int IPV6_GOTIP_BIT = BIT1;
+#endif
+
+
+static esp_err_t event_handler(void *ctx, system_event_t *event)
+{
+ /* For accessing reason codes in case of disconnection */
+ system_event_info_t *info = &event->event_info;
+
+ switch (event->event_id)
+ {
+ case SYSTEM_EVENT_STA_START:
+ esp_wifi_connect();
+ os_printf("SYSTEM_EVENT_STA_START\r\n");
+ break;
+ case SYSTEM_EVENT_STA_CONNECTED:
+#ifdef CONFIG_EXAMPLE_IPV6
+ /* enable ipv6 */
+ tcpip_adapter_create_ip6_linklocal(TCPIP_ADAPTER_IF_STA);
+#endif
+ break;
+ case SYSTEM_EVENT_STA_GOT_IP:
+ xEventGroupSetBits(wifi_event_group, IPV4_GOTIP_BIT);
+ os_printf("SYSTEM EVENT STA GOT IP : %s\r\n", ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));
+ break;
+ case SYSTEM_EVENT_STA_DISCONNECTED:
+ os_printf("Disconnect reason : %d\r\n", info->disconnected.reason);
+ if (info->disconnected.reason == WIFI_REASON_BASIC_RATE_NOT_SUPPORT)
+ {
+ /*Switch to 802.11 bgn mode */
+ esp_wifi_set_protocol(ESP_IF_WIFI_STA, WIFI_PROTOCOL_11B | WIFI_PROTOCOL_11G | WIFI_PROTOCOL_11N);
+ }
+ esp_wifi_connect();
+ xEventGroupClearBits(wifi_event_group, IPV4_GOTIP_BIT);
+#ifdef CONFIG_EXAMPLE_IPV6
+ xEventGroupClearBits(wifi_event_group, IPV6_GOTIP_BIT);
+#endif
+ break;
+ case SYSTEM_EVENT_AP_STA_GOT_IP6:
+#ifdef CONFIG_EXAMPLE_IPV6
+ xEventGroupSetBits(wifi_event_group, IPV6_GOTIP_BIT);
+ os_printf("SYSTEM_EVENT_STA_GOT_IP6\r\n");
+
+ char *ip6 = ip6addr_ntoa(&event->event_info.got_ip6.ip6_info.ip);
+ os_printf("IPv6: %s\r\n", ip6);
+#endif
+ default:
+ break;
+ }
+ return ESP_OK;
+}
+
+static void initialise_wifi(void)
+{
+ tcpip_adapter_init();
+
+#if (USE_STATIC_IP == 1)
+ tcpip_adapter_dhcps_stop(TCPIP_ADAPTER_IF_STA);
+
+ tcpip_adapter_ip_info_t ip_info;
+
+#define MY_IP4_ADDR(...) IP4_ADDR(__VA_ARGS__)
+ MY_IP4_ADDR(&ip_info.ip, DAP_IP_ADDRESS);
+ MY_IP4_ADDR(&ip_info.gw, DAP_IP_GATEWAY);
+ MY_IP4_ADDR(&ip_info.netmask, DAP_IP_NETMASK);
+#undef MY_IP4_ADDR
+
+ tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_STA, &ip_info);
+#endif // (USE_STATIC_IP == 1)
+
+
+ wifi_event_group = xEventGroupCreate();
+
+ ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));
+ wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
+ ESP_ERROR_CHECK(esp_wifi_init(&cfg));
+ ESP_ERROR_CHECK(esp_wifi_set_storage(WIFI_STORAGE_RAM));
+ wifi_config_t wifi_config = {
+ .sta = {
+ .ssid = WIFI_SSID,
+ .password = WIFI_PASS,
+ },
+ };
+ os_printf("Setting WiFi configuration SSID %s...\r\n", wifi_config.sta.ssid);
+ ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
+ ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
+ ESP_ERROR_CHECK(esp_wifi_start());
+}
+
+static void wait_for_ip()
+{
+#ifdef CONFIG_EXAMPLE_IPV6
+ uint32_t bits = IPV4_GOTIP_BIT | IPV6_GOTIP_BIT;
+#else
+ uint32_t bits = IPV4_GOTIP_BIT;
+#endif
+
+ os_printf("Waiting for AP connection...\r\n");
+ xEventGroupWaitBits(wifi_event_group, bits, false, true, portMAX_DELAY);
+ os_printf("Connected to AP\r\n");
+}
+
+
+void app_main()
+{
+ // struct rst_info *rtc_info = system_get_rst_info();
+
+ // os_printf("reset reason: %x\n", rtc_info->reason);
+
+ // if (rtc_info->reason == REASON_WDT_RST ||
+ // rtc_info->reason == REASON_EXCEPTION_RST ||
+ // rtc_info->reason == REASON_SOFT_WDT_RST)
+ // {
+ // if (rtc_info->reason == REASON_EXCEPTION_RST)
+ // {
+ // os_printf("Fatal exception (%d):\n", rtc_info->exccause);
+ // }
+ // os_printf("epc1=0x%08x, epc2=0x%08x, epc3=0x%08x,excvaddr=0x%08x, depc=0x%08x\n",
+ // rtc_info->epc1, rtc_info->epc2, rtc_info->epc3,
+ // rtc_info->excvaddr, rtc_info->depc);
+ // }
+
+ ESP_ERROR_CHECK(nvs_flash_init());
+ initialise_wifi();
+ wait_for_ip();
+ DAP_Setup();
+ timer_init();
+
+
+ xTaskCreate(tcp_server_task, "tcp_server", 4096, NULL, 14, NULL);
+ xTaskCreate(DAP_Thread, "DAP_Task", 2048, NULL, 10, &kDAPTaskHandle);
+ // SWO Trace Task
+ #if (SWO_FUNCTION_ENABLE == 1)
+ xTaskCreate(SWO_Thread, "SWO_Task", 512, NULL, 10, NULL);
+ #endif
+ // It seems that the task is overly stressful...
+}
diff --git a/main/monitor.c b/main/monitor.c
new file mode 100644
index 0000000..6ac83be
--- /dev/null
+++ b/main/monitor.c
@@ -0,0 +1,24 @@
+#include
+#include
+
+#include "freertos/FreeRTOS.h"
+#include "freertos/task.h"
+#include "esp_system.h"
+
+void esp_print_tasks(void)
+{
+ char *pbuffer = (char *)calloc(1, 2048);
+ printf("--------------- heap:%u ---------------------\r\n", esp_get_free_heap_size());
+ vTaskGetRunTimeStats(pbuffer);
+ printf("%s", pbuffer);
+ printf("----------------------------------------------\r\n");
+ free(pbuffer);
+}
+
+void monitor_task()
+{
+ while(1) {
+ esp_print_tasks();
+ vTaskDelay(3000 / portTICK_RATE_MS);
+ }
+}
\ No newline at end of file
diff --git a/main/tcp_server.c b/main/tcp_server.c
index 8f85f6f..2967f08 100644
--- a/main/tcp_server.c
+++ b/main/tcp_server.c
@@ -1,181 +1,182 @@
-/**
- * @file tcp_server.c
- * @brief Handle main tcp tasks
- * @version 0.1
- * @date 2020-01-22
- *
- * @copyright Copyright (c) 2020
- *
- */
-#include "tcp_server.h"
-
-#include
-#include
-#include
-#include "freertos/FreeRTOS.h"
-#include "freertos/task.h"
-#include "freertos/event_groups.h"
-#include "esp_system.h"
-#include "esp_wifi.h"
-#include "esp_event_loop.h"
-#include "esp_log.h"
-#include "nvs_flash.h"
-
-#include "lwip/err.h"
-#include "lwip/sockets.h"
-#include "lwip/sys.h"
-#include
-
-#include "wifi_configuration.h"
-#include "usbip_server.h"
-
-extern TaskHandle_t kDAPTaskHandle;
-extern int kRestartDAPHandle;
-
-uint8_t kState = ACCEPTING;
-int kSock = -1;
-
-void tcp_server_task(void *pvParameters)
-{
- uint8_t tcp_rx_buffer[1024];
- char addr_str[128];
- int addr_family;
- int ip_protocol;
-
- int on = 1;
- while (1)
- {
-
-#ifdef CONFIG_EXAMPLE_IPV4
- struct sockaddr_in destAddr;
- destAddr.sin_addr.s_addr = htonl(INADDR_ANY);
- destAddr.sin_family = AF_INET;
- destAddr.sin_port = htons(PORT);
- addr_family = AF_INET;
- ip_protocol = IPPROTO_IP;
- inet_ntoa_r(destAddr.sin_addr, addr_str, sizeof(addr_str) - 1);
-#else // IPV6
- struct sockaddr_in6 destAddr;
- bzero(&destAddr.sin6_addr.un, sizeof(destAddr.sin6_addr.un));
- destAddr.sin6_family = AF_INET6;
- destAddr.sin6_port = htons(PORT);
- addr_family = AF_INET6;
- ip_protocol = IPPROTO_IPV6;
- inet6_ntoa_r(destAddr.sin6_addr, addr_str, sizeof(addr_str) - 1);
-#endif
-
- int listen_sock = socket(addr_family, SOCK_STREAM, ip_protocol);
- if (listen_sock < 0)
- {
- os_printf("Unable to create socket: errno %d\r\n", errno);
- break;
- }
- os_printf("Socket created\r\n");
-
- setsockopt(listen_sock, SOL_SOCKET, SO_KEEPALIVE, (void *)&on, sizeof(on));
- setsockopt(listen_sock, IPPROTO_TCP, TCP_NODELAY, (void *)&on, sizeof(on));
-
- int err = bind(listen_sock, (struct sockaddr *)&destAddr, sizeof(destAddr));
- if (err != 0)
- {
- os_printf("Socket unable to bind: errno %d\r\n", errno);
- break;
- }
- os_printf("Socket binded\r\n");
-
- err = listen(listen_sock, 1);
- if (err != 0)
- {
- os_printf("Error occured during listen: errno %d\r\n", errno);
- break;
- }
- os_printf("Socket listening\r\n");
-
-#ifdef CONFIG_EXAMPLE_IPV6
- struct sockaddr_in6 sourceAddr; // Large enough for both IPv4 or IPv6
-#else
- struct sockaddr_in sourceAddr;
-#endif
- uint32_t addrLen = sizeof(sourceAddr);
- while (1)
- {
- kSock = accept(listen_sock, (struct sockaddr *)&sourceAddr, &addrLen);
- if (kSock < 0)
- {
- os_printf("Unable to accept connection: errno %d\r\n", errno);
- break;
- }
- setsockopt(kSock, SOL_SOCKET, SO_KEEPALIVE, (void *)&on, sizeof(on));
- setsockopt(kSock, IPPROTO_TCP, TCP_NODELAY, (void *)&on, sizeof(on));
- os_printf("Socket accepted\r\n");
-
- while (1)
- {
- int len = recv(kSock, tcp_rx_buffer, sizeof(tcp_rx_buffer), 0);
- // Error occured during receiving
- if (len < 0)
- {
- os_printf("recv failed: errno %d\r\n", errno);
- break;
- }
- // Connection closed
- else if (len == 0)
- {
- os_printf("Connection closed\r\n");
- break;
- }
- // 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
-
- switch (kState)
- {
- case ACCEPTING:
- kState = ATTACHING;
-
- case ATTACHING:
- attach(tcp_rx_buffer, len);
- break;
-
- case EMULATING:
- emulate(tcp_rx_buffer, len);
- break;
- default:
- os_printf("unkonw kstate!\r\n");
- }
- }
- }
- // kState = ACCEPTING;
- if (kSock != -1)
- {
- os_printf("Shutting down socket and restarting...\r\n");
- //shutdown(kSock, 0);
- close(kSock);
- if (kState == EMULATING)
- kState = ACCEPTING;
-
- // Restart DAP Handle
- kRestartDAPHandle = 1;
- xTaskNotifyGive(kDAPTaskHandle);
-
- //shutdown(listen_sock, 0);
- //close(listen_sock);
- //vTaskDelay(5);
- }
- }
- }
- vTaskDelete(NULL);
+/**
+ * @file tcp_server.c
+ * @brief Handle main tcp tasks
+ * @version 0.1
+ * @date 2020-01-22
+ *
+ * @copyright Copyright (c) 2020
+ *
+ */
+#include "tcp_server.h"
+
+#include
+#include
+#include
+
+#include "main/wifi_configuration.h"
+#include "main/usbip_server.h"
+
+#include "freertos/FreeRTOS.h"
+#include "freertos/task.h"
+#include "freertos/event_groups.h"
+#include "esp_system.h"
+#include "esp_wifi.h"
+#include "esp_event_loop.h"
+#include "esp_log.h"
+#include "nvs_flash.h"
+
+#include "lwip/err.h"
+#include "lwip/sockets.h"
+#include "lwip/sys.h"
+#include
+
+extern TaskHandle_t kDAPTaskHandle;
+extern int kRestartDAPHandle;
+
+uint8_t kState = ACCEPTING;
+int kSock = -1;
+
+void tcp_server_task(void *pvParameters)
+{
+ uint8_t tcp_rx_buffer[1500];
+ char addr_str[128];
+ int addr_family;
+ int ip_protocol;
+
+ int on = 1;
+ while (1)
+ {
+
+#ifdef CONFIG_EXAMPLE_IPV4
+ struct sockaddr_in destAddr;
+ destAddr.sin_addr.s_addr = htonl(INADDR_ANY);
+ destAddr.sin_family = AF_INET;
+ destAddr.sin_port = htons(PORT);
+ addr_family = AF_INET;
+ ip_protocol = IPPROTO_IP;
+ inet_ntoa_r(destAddr.sin_addr, addr_str, sizeof(addr_str) - 1);
+#else // IPV6
+ struct sockaddr_in6 destAddr;
+ bzero(&destAddr.sin6_addr.un, sizeof(destAddr.sin6_addr.un));
+ destAddr.sin6_family = AF_INET6;
+ destAddr.sin6_port = htons(PORT);
+ addr_family = AF_INET6;
+ ip_protocol = IPPROTO_IPV6;
+ inet6_ntoa_r(destAddr.sin6_addr, addr_str, sizeof(addr_str) - 1);
+#endif
+
+ int listen_sock = socket(addr_family, SOCK_STREAM, ip_protocol);
+ if (listen_sock < 0)
+ {
+ os_printf("Unable to create socket: errno %d\r\n", errno);
+ break;
+ }
+ os_printf("Socket created\r\n");
+
+ setsockopt(listen_sock, SOL_SOCKET, SO_KEEPALIVE, (void *)&on, sizeof(on));
+ setsockopt(listen_sock, IPPROTO_TCP, TCP_NODELAY, (void *)&on, sizeof(on));
+
+ int err = bind(listen_sock, (struct sockaddr *)&destAddr, sizeof(destAddr));
+ if (err != 0)
+ {
+ os_printf("Socket unable to bind: errno %d\r\n", errno);
+ break;
+ }
+ os_printf("Socket binded\r\n");
+
+ err = listen(listen_sock, 1);
+ if (err != 0)
+ {
+ os_printf("Error occured during listen: errno %d\r\n", errno);
+ break;
+ }
+ os_printf("Socket listening\r\n");
+
+#ifdef CONFIG_EXAMPLE_IPV6
+ struct sockaddr_in6 sourceAddr; // Large enough for both IPv4 or IPv6
+#else
+ struct sockaddr_in sourceAddr;
+#endif
+ uint32_t addrLen = sizeof(sourceAddr);
+ while (1)
+ {
+ kSock = accept(listen_sock, (struct sockaddr *)&sourceAddr, &addrLen);
+ if (kSock < 0)
+ {
+ os_printf("Unable to accept connection: errno %d\r\n", errno);
+ break;
+ }
+ setsockopt(kSock, SOL_SOCKET, SO_KEEPALIVE, (void *)&on, sizeof(on));
+ setsockopt(kSock, IPPROTO_TCP, TCP_NODELAY, (void *)&on, sizeof(on));
+ os_printf("Socket accepted\r\n");
+
+ while (1)
+ {
+ int len = recv(kSock, tcp_rx_buffer, sizeof(tcp_rx_buffer), 0);
+ // Error occured during receiving
+ if (len < 0)
+ {
+ os_printf("recv failed: errno %d\r\n", errno);
+ break;
+ }
+ // Connection closed
+ else if (len == 0)
+ {
+ os_printf("Connection closed\r\n");
+ break;
+ }
+ // 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
+
+ switch (kState)
+ {
+ case ACCEPTING:
+ kState = ATTACHING;
+
+ case ATTACHING:
+ attach(tcp_rx_buffer, len);
+ break;
+
+ case EMULATING:
+ emulate(tcp_rx_buffer, len);
+ break;
+ default:
+ os_printf("unkonw kstate!\r\n");
+ }
+ }
+ }
+ // kState = ACCEPTING;
+ if (kSock != -1)
+ {
+ os_printf("Shutting down socket and restarting...\r\n");
+ //shutdown(kSock, 0);
+ close(kSock);
+ if (kState == EMULATING)
+ kState = ACCEPTING;
+
+ // Restart DAP Handle
+ kRestartDAPHandle = 1;
+ xTaskNotifyGive(kDAPTaskHandle);
+
+ //shutdown(listen_sock, 0);
+ //close(listen_sock);
+ //vTaskDelay(5);
+ }
+ }
+ }
+ vTaskDelete(NULL);
}
\ No newline at end of file
diff --git a/main/tcp_server.h b/main/tcp_server.h
index 877ab2a..7f94d11 100644
--- a/main/tcp_server.h
+++ b/main/tcp_server.h
@@ -3,4 +3,4 @@
void tcp_server_task(void *pvParameters);
-#endif
\ No newline at end of file
+#endif
\ No newline at end of file
diff --git a/main/timer.c b/main/timer.c
index 6fbe6b7..59de98f 100644
--- a/main/timer.c
+++ b/main/timer.c
@@ -1,29 +1,49 @@
/**
* @file timer.c
* @brief Hardware timer for DAP timestamp
- * @version 0.1
+ * @change: 2021-02-18 Using the FRC2 timer
+ *
+ * @version 0.2
* @date 2020-01-22
- *
- * @copyright Copyright (c) 2020
- *
+ *
+ * @copyright Copyright (c) 2021
+ *
*/
#include
#include
-#include "timer.h"
+
+#include "main/timer.h"
+
#include "hw_timer.h"
-#include "timer_struct.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
-void timer_create_task()
+
+/*
+ Note:
+ System bus frequency is 80MHz, will not be affected by CPU frequency. The
+ frequency of UART, SPI, or other peripheral devices, are divided from system
+ bus frequency, so they will not be affected by CPU frequency either.
+
+*/
+
+#define TIMER_BASE 0x60000600
+volatile frc2_struct_t * frc2 = (frc2_struct_t *)(TIMER_BASE + (1) * 0x20);
+
+void timer_init()
{
- // FRC1 frequency 80MHz
vPortEnterCritical();
- frc1.ctrl.div = TIMER_CLKDIV_16; // 80MHz / 16 = 5MHz
- frc1.ctrl.intr_type = TIMER_EDGE_INT;
- frc1.ctrl.reload = 0x01;
- frc1.load.data = 0x7FFFFF; // 23bit??
- frc1.ctrl.en = 0x01;
+ frc2->ctrl.div = TIMER_CLKDIV_16; // 80MHz / 16 = 5MHz
+ frc2->ctrl.intr_type = TIMER_EDGE_INT;
+ frc2->ctrl.reload = 0x01; // enable auto reload
+ frc2->load.val = 0x7FFFFFFF; // 31bit max
+ frc2->ctrl.en = 0x01;
vPortExitCritical();
- vTaskDelete(NULL);
+}
+
+// Timing up to 2147483647(0x7FFFFFFF) / 5000000(5MHz) = 429s
+// 0.2 micro-second resolution
+uint32_t get_timer_count()
+{
+ return (uint32_t)frc2->count.data;
}
\ No newline at end of file
diff --git a/main/timer.h b/main/timer.h
index bc569a9..1fa4fa0 100644
--- a/main/timer.h
+++ b/main/timer.h
@@ -1,6 +1,71 @@
+/**
+ * @file timer.h
+ * @author windowsair
+ * @brief esp8266 hardware timer
+ * @change: 2021-02-18 Add frc2 timer
+ * @note
+ * FRC2 is not officially documented. There is no guarantee of its behavior.
+ * FRC2 may be used for RTC functions. May be reserved for other functions in the future.
+ *
+ *
+ * @version 0.1
+ * @date 2021-02-18
+ *
+ * @copyright Copyright (c) 2021
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ */
#ifndef __TIMER_H__
#define __TIMER_H__
-void timer_create_task();
+#include
-#endif
\ No newline at end of file
+
+// FRC2 is a 32-bit countup timer
+typedef struct {
+ union {
+ struct {
+ uint32_t data: 32;
+ };
+ uint32_t val;
+ } load;
+
+ union {
+ struct {
+ uint32_t data: 31;
+ uint32_t reserved23: 1;
+ };
+ uint32_t val;
+ } count;
+
+ union {
+ struct {
+ uint32_t div: 6;
+ uint32_t reload: 1;
+ uint32_t en: 1;
+ uint32_t intr_type: 1;
+ uint32_t reserved24: 23;
+ };
+ uint32_t val;
+ } ctrl;
+
+ union {
+ struct {
+ uint32_t clr: 1;
+ uint32_t reserved1: 31;
+ };
+ uint32_t val;
+ } intr;
+} frc2_struct_t;
+
+extern volatile frc2_struct_t* frc2;
+
+extern void timer_init();
+extern uint32_t get_timer_count();
+
+#endif
\ No newline at end of file
diff --git a/main/usbip_server.c b/main/usbip_server.c
index 915cfeb..d0a8ee5 100644
--- a/main/usbip_server.c
+++ b/main/usbip_server.c
@@ -1,17 +1,17 @@
#include
#include
+
+#include "main/usbip_server.h"
+#include "main/DAP_handle.h"
+
+#include "components/USBIP/usb_handle.h"
+#include "components/USBIP/usb_descriptor.h"
+
#include "lwip/err.h"
#include "lwip/sockets.h"
#include "lwip/sys.h"
#include
-#include "usbip_server.h"
-#include "usbip_defs.h"
-#include "usb_defs.h"
-#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);
@@ -190,7 +190,7 @@ int emulate(uint8_t *buffer, uint32_t length)
int command = read_stage2_command((usbip_stage2_header *)buffer, length);
if (command < 0)
{
- return -1;
+ return -1;
}
switch (command)
@@ -229,7 +229,7 @@ static int read_stage2_command(usbip_stage2_header *header, uint32_t length)
* - ret_submit
* - cmd_unlink
* - ret_unlink
- *
+ *
* @param data Point to packets header
* @param size Packets header size
*/
@@ -253,7 +253,7 @@ static void pack(void *data, int size)
* - ret_submit
* - cmd_unlink
* - ret_unlink
- *
+ *
* @param data Point to packets header
* @param size packets header size
*/
@@ -339,7 +339,7 @@ void send_stage2_submit(usbip_stage2_header *req_header, int32_t status, int32_t
req_header->u.ret_submit.status = status;
req_header->u.ret_submit.data_length = data_length;
-
+ // already unpacked
pack(req_header, sizeof(usbip_stage2_header));
send(kSock, req_header, sizeof(usbip_stage2_header), 0);
}
@@ -355,6 +355,23 @@ void send_stage2_submit_data(usbip_stage2_header *req_header, int32_t status, co
}
}
+void send_stage2_submit_data_fast(usbip_stage2_header *req_header, const void *const data, int32_t data_length)
+{
+ uint8_t * send_buf = (uint8_t *)req_header;
+
+ req_header->base.command = PP_HTONL(USBIP_STAGE2_RSP_SUBMIT);
+ req_header->base.direction = htonl(!(req_header->base.direction));
+
+ memset(&(req_header->u.ret_submit), 0, sizeof(usbip_stage2_header_ret_submit));
+ req_header->u.ret_submit.data_length = htonl(data_length);
+
+
+ // payload
+ memcpy(&send_buf[sizeof(usbip_stage2_header)], data, data_length);
+ send(kSock, send_buf, sizeof(usbip_stage2_header) + data_length, 0);
+}
+
+
static void handle_unlink(usbip_stage2_header *header)
{
os_printf("s2 handling cmd unlink...\r\n");
diff --git a/main/usbip_server.h b/main/usbip_server.h
index 2d0effd..92c17c2 100644
--- a/main/usbip_server.h
+++ b/main/usbip_server.h
@@ -1,7 +1,9 @@
#ifndef __USBIP_SERVER_H__
#define __USBIP_SERVER_H__
#include
-#include "usbip_defs.h"
+
+#include "components/USBIP/usbip_defs.h"
+
enum state_t
{
ACCEPTING,
@@ -15,5 +17,7 @@ int attach(uint8_t *buffer, uint32_t length);
int emulate(uint8_t *buffer, uint32_t length);
void send_stage2_submit_data(usbip_stage2_header *req_header, int32_t status, const void * const data, int32_t data_length);
void send_stage2_submit(usbip_stage2_header *req_header, int32_t status, int32_t data_length);
+void send_stage2_submit_data_fast(usbip_stage2_header *req_header, const void *const data, int32_t data_length);
+
#endif
\ No newline at end of file
diff --git a/main/wifi_configuration.h b/main/wifi_configuration.h
index 5f84b6d..6c40f2c 100644
--- a/main/wifi_configuration.h
+++ b/main/wifi_configuration.h
@@ -3,9 +3,9 @@
* @brief Fill in your wifi configuration information here.
* @version 0.1
* @date 2020-01-22
- *
+ *
* @copyright Copyright (c) 2020
- *
+ *
*/
#ifndef __WIFI_CONFIGURATION__
#define __WIFI_CONFIGURATION__
@@ -13,8 +13,15 @@
#define WIFI_SSID "DAP"
#define WIFI_PASS "12345678"
-#define PORT 3240
+#define USE_STATIC_IP 1
+// If you don't want to specify the ip configuration, then ignore the following items.
+#define DAP_IP_ADDRESS 192, 168, 137, 123
+#define DAP_IP_GATEWAY 192, 168, 137, 1
+#define DAP_IP_NETMASK 255, 255, 255, 0
+
+// DO NOT CHANGE
+#define PORT 3240
#define CONFIG_EXAMPLE_IPV4 1
-#endif
\ No newline at end of file
+#endif
\ No newline at end of file
diff --git a/sdkconfig b/sdkconfig
index c3b4568..e9edbd4 100644
--- a/sdkconfig
+++ b/sdkconfig
@@ -10,6 +10,8 @@ CONFIG_IDF_TARGET="esp8266"
#
CONFIG_SDK_TOOLPREFIX="xtensa-lx106-elf-"
CONFIG_BOOTLOADER_INIT_SPI_FLASH=y
+# CONFIG_BOOTLOADER_DISABLE_JTAG_IO is not set
+# CONFIG_BOOTLOADER_FAST_BOOT is not set
# CONFIG_LOG_BOOTLOADER_LEVEL_NONE is not set
# CONFIG_LOG_BOOTLOADER_LEVEL_ERROR is not set
# CONFIG_LOG_BOOTLOADER_LEVEL_WARN is not set
@@ -18,6 +20,7 @@ CONFIG_LOG_BOOTLOADER_LEVEL_INFO=y
# CONFIG_LOG_BOOTLOADER_LEVEL_VERBOSE is not set
CONFIG_LOG_BOOTLOADER_LEVEL=3
# CONFIG_BOOTLOADER_APP_TEST is not set
+CONFIG_BOOTLOADER_STORE_OFFSET=0x0
CONFIG_ESPTOOLPY_PORT="/dev/ttyS5"
# CONFIG_ESPTOOLPY_BAUD_115200B is not set
# CONFIG_ESPTOOLPY_BAUD_230400B is not set
@@ -83,14 +86,18 @@ CONFIG_COMPILER_STACK_CHECK_MODE_NONE=y
# CONFIG_COMPILER_WARN_WRITE_STRINGS is not set
CONFIG_APP_UPDATE_CHECK_APP_SUM=y
CONFIG_APP_UPDATE_CHECK_APP_HASH=y
-# CONFIG_AWS_IOT_SDK is not set
-# CONFIG_USING_ESP_CONSOLE is not set
+CONFIG_APP_COMPILE_TIME_DATE=y
+# CONFIG_APP_EXCLUDE_PROJECT_VER_VAR is not set
+# CONFIG_APP_EXCLUDE_PROJECT_NAME_VAR is not set
+# CONFIG_APP_PROJECT_VER_FROM_CONFIG is not set
+# CONFIG_ENABLE_COAP is not set
CONFIG_ESP_TLS_USING_MBEDTLS=y
# CONFIG_ESP_TLS_USING_WOLFSSL is not set
# CONFIG_ESP_TLS_SERVER is not set
# CONFIG_ESP_TLS_PSK_VERIFICATION is not set
# CONFIG_ESP_WOLFSSL_INTERNAL is not set
# CONFIG_WOLFSSL_DEBUG is not set
+# CONFIG_ESP8266_NMI_WDT is not set
# CONFIG_ESP8266_DEFAULT_CPU_FREQ_80 is not set
CONFIG_ESP8266_DEFAULT_CPU_FREQ_160=y
CONFIG_ESP8266_DEFAULT_CPU_FREQ_MHZ=160
@@ -102,38 +109,26 @@ 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_ETS_PRINTF_EXIT_WHEN_FLASH_RW=y
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
-CONFIG_CONSOLE_UART_NUM=0
-CONFIG_CONSOLE_UART_BAUDRATE=74880
-# CONFIG_UART0_SWAP_IO is not set
# CONFIG_DISABLE_ROM_UART_PRINT is not set
-# CONFIG_PANIC_FULL_STACK is not set
# CONFIG_ESP_PANIC_PRINT_HALT is not set
CONFIG_ESP_PANIC_PRINT_REBOOT=y
# CONFIG_ESP_PANIC_SILENT_REBOOT is not set
-CONFIG_MAIN_TASK_STACK_SIZE=3584
-CONFIG_TASK_WDT=y
-CONFIG_TASK_WDT_PANIC=y
-# CONFIG_TASK_WDT_TIMEOUT_13N is not set
-# CONFIG_TASK_WDT_TIMEOUT_14N is not set
-CONFIG_TASK_WDT_TIMEOUT_15N=y
-CONFIG_TASK_WDT_TIMEOUT_S=15
+# CONFIG_ESP_PANIC_GDBSTUB is not set
CONFIG_RESET_REASON=y
CONFIG_WIFI_PPT_TASKSTACK_SIZE=4096
-CONFIG_EVENT_LOOP_STACK_SIZE=4096
# CONFIG_ESP8266_OTA_FROM_OLD is not set
# CONFIG_ESP8266_BOOT_COPY_APP is not set
-CONFIG_ESP_ERR_TO_NAME_LOOKUP=y
CONFIG_ESP8266_TIME_SYSCALL_USE_FRC1=y
# CONFIG_ESP8266_TIME_SYSCALL_USE_NONE is not set
+# CONFIG_PM_ENABLE is not set
CONFIG_SCAN_AP_MAX=99
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_AMPDU_RX_ENABLED=y
+CONFIG_ESP8266_WIFI_RX_BA_WIN_SIZE=6
# CONFIG_ESP8266_WIFI_AMSDU_ENABLED is not set
CONFIG_ESP8266_WIFI_RX_BUFFER_NUM=28
CONFIG_ESP8266_WIFI_LEFT_CONTINUOUS_RX_BUFFER_NUM=8
@@ -141,21 +136,91 @@ CONFIG_ESP8266_WIFI_RX_PKT_NUM=16
CONFIG_ESP8266_WIFI_TX_PKT_NUM=6
CONFIG_ESP8266_WIFI_NVS_ENABLED=y
CONFIG_ESP8266_WIFI_CONNECT_OPEN_ROUTER_WHEN_PWD_IS_SET=y
+CONFIG_ESP8266_WIFI_ENABLE_WPA3_SAE=y
# CONFIG_ESP8266_WIFI_DEBUG_LOG_ENABLE is not set
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=21
CONFIG_ESP8266_HSPI_HIGH_THROUGHPUT=y
+# CONFIG_ESP_ERR_TO_NAME_LOOKUP is not set
+CONFIG_ESP_SYSTEM_EVENT_QUEUE_SIZE=32
+CONFIG_ESP_SYSTEM_EVENT_TASK_STACK_SIZE=2048
+CONFIG_ESP_MAIN_TASK_STACK_SIZE=3584
+CONFIG_ESP_TIMER_TASK_STACK_SIZE=2048
+CONFIG_ESP_CONSOLE_UART_DEFAULT=y
+# CONFIG_ESP_CONSOLE_UART_CUSTOM is not set
+# CONFIG_ESP_CONSOLE_UART_NONE is not set
+CONFIG_ESP_CONSOLE_UART_NUM=0
+CONFIG_ESP_CONSOLE_UART_BAUDRATE=74880
+# CONFIG_ESP_UART0_SWAP_IO is not set
+# CONFIG_ESP_TASK_WDT is not set
+# CONFIG_ESP_TASK_WDT_TIMEOUT_13N is not set
+# CONFIG_ESP_TASK_WDT_TIMEOUT_14N is not set
+CONFIG_ESP_TASK_WDT_TIMEOUT_15N=y
+CONFIG_ESP_TASK_WDT_TIMEOUT_S=15
+# CONFIG_ESP_EVENT_LOOP_PROFILING is not set
+CONFIG_ESP_EVENT_POST_FROM_ISR=y
CONFIG_ESP_HTTP_CLIENT_ENABLE_HTTPS=y
+# CONFIG_ESP_HTTP_CLIENT_ENABLE_BASIC_AUTH is not set
CONFIG_HTTP_BUF_SIZE=512
CONFIG_HTTPD_MAX_REQ_HDR_LEN=512
CONFIG_HTTPD_MAX_URI_LEN=512
CONFIG_OTA_BUF_SIZE=256
# CONFIG_OTA_ALLOW_HTTP is not set
+# CONFIG_FATFS_CODEPAGE_DYNAMIC is not set
+CONFIG_FATFS_CODEPAGE_437=y
+# CONFIG_FATFS_CODEPAGE_720 is not set
+# CONFIG_FATFS_CODEPAGE_737 is not set
+# CONFIG_FATFS_CODEPAGE_771 is not set
+# CONFIG_FATFS_CODEPAGE_775 is not set
+# CONFIG_FATFS_CODEPAGE_850 is not set
+# CONFIG_FATFS_CODEPAGE_852 is not set
+# CONFIG_FATFS_CODEPAGE_855 is not set
+# CONFIG_FATFS_CODEPAGE_857 is not set
+# CONFIG_FATFS_CODEPAGE_860 is not set
+# CONFIG_FATFS_CODEPAGE_861 is not set
+# CONFIG_FATFS_CODEPAGE_862 is not set
+# CONFIG_FATFS_CODEPAGE_863 is not set
+# CONFIG_FATFS_CODEPAGE_864 is not set
+# CONFIG_FATFS_CODEPAGE_865 is not set
+# CONFIG_FATFS_CODEPAGE_866 is not set
+# CONFIG_FATFS_CODEPAGE_869 is not set
+# CONFIG_FATFS_CODEPAGE_932 is not set
+# CONFIG_FATFS_CODEPAGE_936 is not set
+# CONFIG_FATFS_CODEPAGE_949 is not set
+# CONFIG_FATFS_CODEPAGE_950 is not set
+CONFIG_FATFS_CODEPAGE=437
+CONFIG_FATFS_LFN_NONE=y
+# CONFIG_FATFS_LFN_HEAP is not set
+# CONFIG_FATFS_LFN_STACK is not set
+CONFIG_FATFS_FS_LOCK=0
+CONFIG_FATFS_TIMEOUT_MS=10000
+CONFIG_FATFS_PER_FILE_CACHE=y
+CONFIG_FMB_COMM_MODE_TCP_EN=y
+CONFIG_FMB_TCP_PORT_DEFAULT=502
+CONFIG_FMB_TCP_PORT_MAX_CONN=5
+CONFIG_FMB_TCP_CONNECTION_TOUT_SEC=20
+CONFIG_FMB_MASTER_TIMEOUT_MS_RESPOND=150
+CONFIG_FMB_MASTER_DELAY_MS_CONVERT=200
+CONFIG_FMB_QUEUE_LENGTH=20
+CONFIG_FMB_PORT_TASK_STACK_SIZE=4096
+CONFIG_FMB_SERIAL_BUF_SIZE=256
+CONFIG_FMB_PORT_TASK_PRIO=10
+CONFIG_FMB_CONTROLLER_SLAVE_ID_SUPPORT=y
+CONFIG_FMB_CONTROLLER_SLAVE_ID=0x00112233
+CONFIG_FMB_CONTROLLER_NOTIFY_TIMEOUT=20
+CONFIG_FMB_CONTROLLER_NOTIFY_QUEUE_SIZE=20
+CONFIG_FMB_CONTROLLER_STACK_SIZE=4096
+CONFIG_FMB_EVENT_QUEUE_TIMEOUT=20
+CONFIG_FMB_TIMER_GROUP=0
+CONFIG_FMB_TIMER_INDEX=0
+# CONFIG_FMB_TIMER_ISR_IN_IRAM is not set
# CONFIG_DISABLE_FREERTOS is not set
+CONFIG_FREERTOS_UNICORE=y
# CONFIG_FREERTOS_ENABLE_REENT is not set
-CONFIG_FREERTOS_HZ=100
+CONFIG_FREERTOS_NO_AFFINITY=0x7FFFFFFF
+CONFIG_FREERTOS_HZ=1000
CONFIG_FREERTOS_MAX_HOOK=2
CONFIG_FREERTOS_IDLE_TASK_STACKSIZE=1024
CONFIG_FREERTOS_ISR_STACKSIZE=512
@@ -167,7 +232,10 @@ CONFIG_TASK_SWITCH_FASTER=y
# 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_FREERTOS_WATCHPOINT_END_OF_STACK=y
CONFIG_HEAP_DISABLE_IRAM=y
+# CONFIG_HEAP_TRACING is not set
+CONFIG_LIBSODIUM_USE_MBEDTLS_SHA=y
# CONFIG_LOG_DEFAULT_LEVEL_NONE is not set
CONFIG_LOG_DEFAULT_LEVEL_ERROR=y
# CONFIG_LOG_DEFAULT_LEVEL_WARN is not set
@@ -177,73 +245,84 @@ CONFIG_LOG_DEFAULT_LEVEL_ERROR=y
CONFIG_LOG_DEFAULT_LEVEL=1
CONFIG_LOG_COLORS=y
# CONFIG_LOG_SET_LEVEL is not set
-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 is not set
-CONFIG_ENABLE_NONBLOCK_SPEEDUP=y
-CONFIG_ESP_UDP_SYNC_SEND=y
-CONFIG_ESP_UDP_SYNC_RETRY_MAX=5
+CONFIG_LWIP_LOCAL_HOSTNAME="espressif"
+CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y
+# CONFIG_LWIP_L2_TO_L3_COPY is not set
+CONFIG_LWIP_IRAM_OPTIMIZATION=y
+CONFIG_LWIP_TIMERS_ONDEMAND=y
CONFIG_LWIP_MAX_SOCKETS=10
+# CONFIG_LWIP_USE_ONLY_LWIP_SELECT is not set
+# CONFIG_LWIP_SO_LINGER is not set
CONFIG_LWIP_SO_REUSE=y
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=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
-CONFIG_LWIP_ICMP=y
-# CONFIG_LWIP_MULTICAST_PING is not set
-# CONFIG_LWIP_BROADCAST_PING is not set
-# CONFIG_LWIP_RAW is not set
+# CONFIG_LWIP_NETBUF_RECVINFO is not set
+CONFIG_LWIP_IP4_FRAG=y
+# CONFIG_LWIP_IP6_FRAG is not set
+# CONFIG_LWIP_IP4_REASSEMBLY is not set
+# CONFIG_LWIP_IP6_REASSEMBLY is not set
+# CONFIG_LWIP_IP_FORWARD is not set
+# CONFIG_LWIP_STATS is not set
+# CONFIG_LWIP_ETHARP_TRUST_IP_MAC is not set
+# CONFIG_LWIP_ESP_GRATUITOUS_ARP is not set
+CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=64
CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y
-CONFIG_LWIP_DHCP_MAX_NTP_SERVERS=1
+# CONFIG_LWIP_DHCP_RESTORE_LAST_IP is not set
CONFIG_LWIP_DHCPS_LEASE_UNIT=60
CONFIG_LWIP_DHCPS_MAX_STATION_NUM=8
-CONFIG_LWIP_DHCP_DISCOVER_RETRANSMISSION_INTERVAL=250
# CONFIG_LWIP_AUTOIP is not set
-CONFIG_LWIP_IGMP=y
-CONFIG_ESP_DNS=y
-CONFIG_DNS_MAX_SERVERS=3
+# CONFIG_LWIP_IPV6_AUTOCONFIG is not set
# CONFIG_LWIP_NETIF_LOOPBACK is not set
-CONFIG_TCP_HIGH_SPEED_RETRANSMISSION=y
CONFIG_LWIP_MAX_ACTIVE_TCP=16
CONFIG_LWIP_MAX_LISTENING_TCP=8
-CONFIG_TCP_MAXRTX=12
-CONFIG_TCP_SYNMAXRTX=6
-CONFIG_TCP_MSS=1460
-CONFIG_TCP_SND_BUF_DEFAULT=2920
-CONFIG_TCP_WND_DEFAULT=10240
-CONFIG_TCP_RECVMBOX_SIZE=16
-CONFIG_TCP_QUEUE_OOSEQ=y
-CONFIG_TCP_OVERSIZE_MSS=y
-# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set
-# CONFIG_TCP_OVERSIZE_DISABLE is not set
-# CONFIG_LWIP_TCP_TIMESTAMPS is not set
+CONFIG_LWIP_TCP_MAXRTX=12
+CONFIG_LWIP_TCP_SYNMAXRTX=6
+CONFIG_LWIP_TCP_MSS=1460
+CONFIG_LWIP_TCP_TMR_INTERVAL=250
+CONFIG_LWIP_TCP_MSL=60000
+CONFIG_LWIP_TCP_SND_BUF_DEFAULT=11680
+CONFIG_LWIP_TCP_WND_DEFAULT=10240
+CONFIG_LWIP_TCP_RECVMBOX_SIZE=16
+CONFIG_LWIP_TCP_QUEUE_OOSEQ=y
+# CONFIG_LWIP_TCP_SACK_OUT is not set
+# CONFIG_LWIP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set
+CONFIG_LWIP_TCP_OVERSIZE_MSS=y
+# CONFIG_LWIP_TCP_OVERSIZE_QUARTER_MSS is not set
+# CONFIG_LWIP_TCP_OVERSIZE_DISABLE is not set
+CONFIG_LWIP_TCP_RTO_TIME=3000
CONFIG_LWIP_MAX_UDP_PCBS=4
-CONFIG_UDP_RECVMBOX_SIZE=6
-CONFIG_TCPIP_TASK_STACK_SIZE=4096
+CONFIG_LWIP_UDP_RECVMBOX_SIZE=6
+CONFIG_LWIP_TCPIP_TASK_STACK_SIZE=4096
+CONFIG_LWIP_TCPIP_TASK_AFFINITY_NO_AFFINITY=y
+# CONFIG_LWIP_TCPIP_TASK_AFFINITY_CPU0 is not set
+CONFIG_LWIP_TCPIP_TASK_AFFINITY=0x7FFFFFFF
+# CONFIG_LWIP_PPP_SUPPORT is not set
+CONFIG_LWIP_IPV6_MEMP_NUM_ND6_QUEUE=3
+CONFIG_LWIP_IPV6_ND6_NUM_NEIGHBORS=5
+# CONFIG_LWIP_MULTICAST_PING is not set
+# CONFIG_LWIP_BROADCAST_PING is not set
CONFIG_LWIP_MAX_RAW_PCBS=4
# CONFIG_LWIP_IPV6 is not set
-# CONFIG_LWIP_STATS is not set
-# CONFIG_ESP_LWIP_MEM_DBG is not set
-# CONFIG_LWIP_DEBUG is not set
+CONFIG_LWIP_DHCP_MAX_NTP_SERVERS=1
+CONFIG_LWIP_SNTP_UPDATE_DELAY=3600000
+CONFIG_LWIP_ESP_LWIP_ASSERT=y
+# CONFIG_LWIP_NETIF_DEBUG is not set
+# CONFIG_LWIP_PBUF_DEBUG is not set
+# CONFIG_LWIP_ETHARP_DEBUG is not set
+# CONFIG_LWIP_API_LIB_DEBUG is not set
+# CONFIG_LWIP_SOCKETS_DEBUG is not set
+# CONFIG_LWIP_IP_DEBUG is not set
+# CONFIG_LWIP_ICMP_DEBUG is not set
+# CONFIG_LWIP_IP6_DEBUG is not set
+# CONFIG_LWIP_ICMP6_DEBUG is not set
CONFIG_MBEDTLS_INTERNAL_MEM_ALLOC=y
# CONFIG_MBEDTLS_DEFAULT_MEM_ALLOC is not set
# CONFIG_MBEDTLS_CUSTOM_MEM_ALLOC is not set
CONFIG_MBEDTLS_ASYMMETRIC_CONTENT_LEN=y
CONFIG_MBEDTLS_SSL_IN_CONTENT_LEN=16384
CONFIG_MBEDTLS_SSL_OUT_CONTENT_LEN=4096
+# CONFIG_MBEDTLS_DYNAMIC_BUFFER is not set
# CONFIG_MBEDTLS_DEBUG is not set
-CONFIG_MBEDTLS_HARDWARE_AES=y
-# CONFIG_MBEDTLS_HARDWARE_MPI is not set
-CONFIG_MBEDTLS_HARDWARE_SHA=y
CONFIG_MBEDTLS_HAVE_TIME=y
# CONFIG_MBEDTLS_HAVE_TIME_DATE is not set
CONFIG_MBEDTLS_TLS_SERVER_AND_CLIENT=y
@@ -301,29 +380,19 @@ CONFIG_MBEDTLS_ECP_DP_BP384R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_BP512R1_ENABLED=y
CONFIG_MBEDTLS_ECP_DP_CURVE25519_ENABLED=y
CONFIG_MBEDTLS_ECP_NIST_OPTIM=y
+# CONFIG_util_assert is not set
+CONFIG_ESP_SHA=y
+CONFIG_ESP_AES=y
+CONFIG_ESP_MD5=y
+CONFIG_ESP_ARC4=y
# CONFIG_ENABLE_MDNS is not set
-# CONFIG_MQTT_USING_ESP is not set
-CONFIG_MQTT_USING_IBM=y
-CONFIG_V3_1=y
-# CONFIG_V3_1_1 is not set
-CONFIG_DEFAULT_MQTT_VERSION=3
-CONFIG_MQTT_CLIENT_ID="espressif_sample"
-CONFIG_MQTT_KEEP_ALIVE=30
-CONFIG_MQTT_USERNAME="espressif"
-CONFIG_MQTT_PASSWORD="admin"
-CONFIG_CLEAN_SESSION=y
-# CONFIG_KEEP_SESSION is not set
-CONFIG_DEFAULT_MQTT_SESSION=1
-CONFIG_NO_TLS=y
-# CONFIG_TLS_VERIFY_NONE is not set
-# CONFIG_TLS_VERIFY_PEER is not set
-# CONFIG_TLS_VERIFY_CLIENT is not set
-CONFIG_DEFAULT_MQTT_SECURITY=0
-CONFIG_MQTT_SEND_BUFFER=2048
-CONFIG_MQTT_RECV_BUFFER=2048
-CONFIG_MQTT_SEND_CYCLE=30000
-CONFIG_MQTT_RECV_CYCLE=0
-CONFIG_MQTT_PING_TIMEOUT=3000
+CONFIG_MQTT_PROTOCOL_311=y
+CONFIG_MQTT_TRANSPORT_SSL=y
+CONFIG_MQTT_TRANSPORT_WEBSOCKET=y
+CONFIG_MQTT_TRANSPORT_WEBSOCKET_SECURE=y
+# CONFIG_MQTT_USE_CUSTOM_CONFIG is not set
+# CONFIG_MQTT_TASK_CORE_SELECTION_ENABLED is not set
+# CONFIG_MQTT_CUSTOM_OUTBOX is not set
# CONFIG_NEWLIB_LIBRARY_LEVEL_NORMAL is not set
# CONFIG_NEWLIB_LIBRARY_LEVEL_NANO is not set
CONFIG_NEWLIB_LIBRARY_LEVEL_FLOAT_NANO=y
@@ -331,17 +400,45 @@ CONFIG_NEWLIB_LIBRARY_LEVEL_FLOAT_NANO=y
# CONFIG_OPENSSL_DEBUG is not set
CONFIG_OPENSSL_ASSERT_DO_NOTHING=y
# CONFIG_OPENSSL_ASSERT_EXIT is not set
-# CONFIG_ENABLE_PTHREAD is not set
-# CONFIG_USING_SPIFFS is not set
+CONFIG_ENABLE_PTHREAD=y
+CONFIG_PTHREAD_TASK_PRIO_DEFAULT=5
+CONFIG_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072
+CONFIG_PTHREAD_STACK_MIN=768
+CONFIG_PTHREAD_TASK_NAME_DEFAULT="pthread"
+CONFIG_SPIFFS_MAX_PARTITIONS=3
+CONFIG_SPIFFS_CACHE=y
+CONFIG_SPIFFS_CACHE_WR=y
+# CONFIG_SPIFFS_CACHE_STATS is not set
+CONFIG_SPIFFS_PAGE_CHECK=y
+CONFIG_SPIFFS_GC_MAX_RUNS=10
+# CONFIG_SPIFFS_GC_STATS is not set
+CONFIG_SPIFFS_PAGE_SIZE=256
+CONFIG_SPIFFS_OBJ_NAME_LEN=32
+CONFIG_SPIFFS_USE_MAGIC=y
+CONFIG_SPIFFS_USE_MAGIC_LENGTH=y
+CONFIG_SPIFFS_META_LENGTH=4
+CONFIG_SPIFFS_USE_MTIME=y
+# CONFIG_SPIFFS_DBG is not set
+# CONFIG_SPIFFS_API_DBG is not set
+# CONFIG_SPIFFS_GC_DBG is not set
+# CONFIG_SPIFFS_CACHE_DBG is not set
+# CONFIG_SPIFFS_CHECK_DBG is not set
+# CONFIG_SPIFFS_TEST_VISUALISATION is not set
CONFIG_IP_LOST_TIMER_INTERVAL=120
-# CONFIG_util_assert is not set
-CONFIG_ESP_SHA=y
-CONFIG_ESP_AES=y
-CONFIG_ESP_MD5=y
-CONFIG_ESP_ARC4=y
-# CONFIG_USING_ESP_VFS is not set
+CONFIG_VFS_SUPPRESS_SELECT_DEBUG_OUTPUT=y
+CONFIG_VFS_SUPPORT_TERMIOS=y
+CONFIG_SEMIHOSTFS_MAX_MOUNT_POINTS=1
+CONFIG_SEMIHOSTFS_HOST_PATH_MAX_LEN=128
+# CONFIG_WL_SECTOR_SIZE_512 is not set
+CONFIG_WL_SECTOR_SIZE_4096=y
+CONFIG_WL_SECTOR_SIZE=4096
# CONFIG_ENABLE_UNIFIED_PROVISIONING is not set
CONFIG_LTM_FAST=y
+CONFIG_WPA_MBEDTLS_CRYPTO=y
+# CONFIG_WPA_DEBUG_PRINT is not set
+# CONFIG_WPA_TESTING_OPTIONS is not set
+# CONFIG_WPA_WPS_WARS is not set
+# CONFIG_WPA_11KV_SUPPORT is not set
# Deprecated options for backward compatibility
CONFIG_TARGET_PLATFORM="esp8266"
@@ -372,4 +469,55 @@ CONFIG_STACK_CHECK_NONE=y
# CONFIG_STACK_CHECK_ALL is not set
# CONFIG_STACK_CHECK is not set
# CONFIG_WARN_WRITE_STRINGS is not set
+CONFIG_MAIN_TASK_STACK_SIZE=3584
+CONFIG_CONSOLE_UART_DEFAULT=y
+# CONFIG_CONSOLE_UART_CUSTOM is not set
+# CONFIG_CONSOLE_UART_NONE is not set
+CONFIG_CONSOLE_UART_NUM=0
+CONFIG_CONSOLE_UART_BAUDRATE=74880
+# CONFIG_UART0_SWAP_IO is not set
+# CONFIG_TASK_WDT is not set
+CONFIG_TASK_WDT_TIMEOUT_S=15
+CONFIG_MB_MASTER_TIMEOUT_MS_RESPOND=150
+CONFIG_MB_MASTER_DELAY_MS_CONVERT=200
+CONFIG_MB_QUEUE_LENGTH=20
+CONFIG_MB_SERIAL_TASK_STACK_SIZE=4096
+CONFIG_MB_SERIAL_BUF_SIZE=256
+CONFIG_MB_SERIAL_TASK_PRIO=10
+CONFIG_MB_CONTROLLER_SLAVE_ID_SUPPORT=y
+CONFIG_MB_CONTROLLER_SLAVE_ID=0x00112233
+CONFIG_MB_CONTROLLER_NOTIFY_TIMEOUT=20
+CONFIG_MB_CONTROLLER_NOTIFY_QUEUE_SIZE=20
+CONFIG_MB_CONTROLLER_STACK_SIZE=4096
+CONFIG_MB_EVENT_QUEUE_TIMEOUT=20
+CONFIG_MB_TIMER_GROUP=0
+CONFIG_MB_TIMER_INDEX=0
+# CONFIG_L2_TO_L3_COPY is not set
+# CONFIG_USE_ONLY_LWIP_SELECT is not set
+# CONFIG_ESP_GRATUITOUS_ARP is not set
+CONFIG_TCPIP_RECVMBOX_SIZE=64
+CONFIG_TCP_MAXRTX=12
+CONFIG_TCP_SYNMAXRTX=6
+CONFIG_TCP_MSS=1460
+CONFIG_TCP_MSL=60000
+CONFIG_TCP_SND_BUF_DEFAULT=11680
+CONFIG_TCP_WND_DEFAULT=10240
+CONFIG_TCP_RECVMBOX_SIZE=16
+CONFIG_TCP_QUEUE_OOSEQ=y
+# CONFIG_ESP_TCP_KEEP_CONNECTION_WHEN_IP_CHANGES is not set
+CONFIG_TCP_OVERSIZE_MSS=y
+# CONFIG_TCP_OVERSIZE_QUARTER_MSS is not set
+# CONFIG_TCP_OVERSIZE_DISABLE is not set
+CONFIG_UDP_RECVMBOX_SIZE=6
+CONFIG_TCPIP_TASK_STACK_SIZE=4096
+CONFIG_TCPIP_TASK_AFFINITY_NO_AFFINITY=y
+# CONFIG_TCPIP_TASK_AFFINITY_CPU0 is not set
+CONFIG_TCPIP_TASK_AFFINITY=0x7FFFFFFF
+# CONFIG_PPP_SUPPORT is not set
+CONFIG_ESP32_PTHREAD_TASK_PRIO_DEFAULT=5
+CONFIG_ESP32_PTHREAD_TASK_STACK_SIZE_DEFAULT=3072
+CONFIG_ESP32_PTHREAD_STACK_MIN=768
+CONFIG_ESP32_PTHREAD_TASK_NAME_DEFAULT="pthread"
+CONFIG_SUPPRESS_SELECT_DEBUG_OUTPUT=y
+CONFIG_SUPPORT_TERMIOS=y
# End of deprecated options