diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4e43640..dc31f82 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,7 +14,7 @@ on: jobs: build: runs-on: ubuntu-18.04 - continue-on-error: true + continue-on-error: false strategy: matrix: target-hardware: [esp8266, esp32, esp32c3] @@ -66,18 +66,30 @@ jobs: path: './' - - name: Merge bin files - id: merge - if: matrix.target-hardware != 'esp8266' || matrix.target-hardware == 'esp8266' && steps.script.outputs.status == 'success' && !cancelled() + - name: Merge bin files (esp8266) + if: matrix.target-hardware == 'esp8266' run: | git clone https://github.com/espressif/esptool.git sudo python3 ./esptool/esptool.py --chip ${{ matrix.target-hardware }} merge_bin -o build/wireless_esp_dap_full.bin 0x0 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin 0x10000 build/wireless_esp_dap.bin sudo mv build/wireless_esp_dap.bin build/wireless_esp_dap_app.bin - echo "::set-output name=status::success" + + - name: Merge bin files (esp32) + if: matrix.target-hardware == 'esp32' + run: | + git clone https://github.com/espressif/esptool.git + sudo python3 ./esptool/esptool.py --chip ${{ matrix.target-hardware }} merge_bin -o build/wireless_esp_dap_full.bin 0x1000 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin 0x10000 build/wireless_esp_dap.bin + sudo mv build/wireless_esp_dap.bin build/wireless_esp_dap_app.bin + + - name: Merge bin files (esp32c3) + if: matrix.target-hardware == 'esp32c3' + run: | + git clone https://github.com/espressif/esptool.git + sudo python3 ./esptool/esptool.py --chip ${{ matrix.target-hardware }} merge_bin -o build/wireless_esp_dap_full.bin 0x0 build/bootloader/bootloader.bin 0x8000 build/partition_table/partition-table.bin 0x10000 build/wireless_esp_dap.bin + sudo mv build/wireless_esp_dap.bin build/wireless_esp_dap_app.bin + - name: Upload firmware uses: actions/upload-artifact@v2 - if: matrix.target-hardware != 'esp8266' || matrix.target-hardware == 'esp8266' && steps.merge.outputs.status == 'success' && !cancelled() with: name: firmware_${{ matrix.target-hardware }}.zip path: | diff --git a/README.md b/README.md index cb0b1b5..c173e43 100644 --- a/README.md +++ b/README.md @@ -62,7 +62,9 @@ You can also specify your IP in the above file (We recommend using the static ad ![WIFI](https://user-images.githubusercontent.com/17078589/118365659-517e7880-b5d0-11eb-9a5b-afe43348c2ba.png) -There is built-in ipv4 only mDNS server. You can access the device using `dap.local` . +There is built-in ipv4 only mDNS server. You can access the device using `dap.local`. + +> The mDNS in ESP8266 only supports ipv4. ![mDNS](https://user-images.githubusercontent.com/17078589/149659052-7b29533f-9660-4811-8125-f8f50490d762.png) @@ -127,8 +129,8 @@ There is built-in ipv4 only mDNS server. You can access the device using `dap.lo |--------------------|---------| | TCK | GPIO14 | | TMS | GPIO13 | -| TDI | GPIO19 | -| TDO | GPIO18 | +| TDI | GPIO18 | +| TDO | GPIO19 | | nTRST \(optional\) | GPIO25 | | nRESET | GPIO26 | | TVCC | 3V3 | @@ -225,7 +227,7 @@ See: [Build with Github Action](https://github.com/windowsair/wireless-esp8266-d 1. Get ESP8266 RTOS Software Development Kit - The SDK is already included in the project, please use it for subsequent operations. + The SDK is already included in the project. Please don't use other versions of the SDK. 2. Build & Flash @@ -270,7 +272,7 @@ idf.py -p /dev/ttyS5 flash -> We also provided sample firmware quick evaluation. See [Releases](https://github.com/windowsair/wireless-esp8266-dap/releases) +> We also provided sample firmware for quick evaluation. See [Releases](https://github.com/windowsair/wireless-esp8266-dap/releases) ## Usage diff --git a/README_CN.md b/README_CN.md index 04461c6..87bf198 100644 --- a/README_CN.md +++ b/README_CN.md @@ -11,51 +11,75 @@ ## 简介 -只需要**一枚ESP8266**即可实现的无线调试器!通过USBIP协议栈和CMSIS-DAP协议栈实现。 +只需要**一枚ESP芯片**即可开始无线调试!通过USBIP协议栈和CMSIS-DAP协议栈实现。 -> 👉在5M速度范围下,擦除并下载100kb大小的固件(Hex固件) 实测图: +> 👉在5米范围内,擦除并烧写100kb大小的固件(Hex固件) :

+---- + +对于Keil用户,我们现在支持[elaphureLink](https://github.com/windowsair/elaphureLink)。无需usbip即可开始您的无线调试之旅! + ## 特性 -1. 支持的调试协议模式和调试接口: - - [x] SWD(SW-DP) - - [x] JTAG(JTAG-DP) - - [x] SWJ-DP -2. 支持的USB通信协议: +1. 支持的ESP芯片 + - [x] ESP8266/8285 + - [x] ESP32 + - [x] ESP32C3 + +2. 支持的调试接口: + - [x] SWD + - [x] JTAG + +3. 支持的USB通信协议: - [x] USB-HID - [x] WCID & WinUSB (默认) -3. 支持的调试跟踪器: - - [ ] UART TCP桥 -4. 其它 - - [x] 通过SPI接口加速的SWD协议 +4. 支持的调试跟踪器: + - [x] TCP转发的串口 + +5. 其它 + - [x] 通过SPI接口加速的SWD协议(最高可达40MHz) + - [x] 支持[elaphureLink](https://github.com/windowsair/elaphureLink),无需驱动的快速Keil调试 - [x] ... ## 连接你的开发板 ### WIFI连接 -    固件默认的WIFI SSID是`DAP`,密码是`12345678`。你可以在[wifi_configuration.h](main/wifi_configuration.h)文件中修改`WIFI_SSID`和` WIFI_PASS`字段来修改ESP8266连接的目标WIFI。你还可以在上面的配置文件中修改IP地址(但是我们更推荐你通过在路由器上绑定静态IP地址)。 + +固件默认的WIFI SSID是`DAP`或者`OTA`,密码是`12345678`。 + +你可以在[wifi_configuration.h](main/wifi_configuration.h)文件中添加多个无线接入点。 + +你还可以在上面的配置文件中修改IP地址(但是我们更推荐你通过在路由器上绑定静态IP地址)。 ![WIFI](https://user-images.githubusercontent.com/17078589/118365659-517e7880-b5d0-11eb-9a5b-afe43348c2ba.png) -ESP8266具有一个内置的mDNS服务(仅ipv4). 你可以通过 `dap.local` 操作设备。 +固件中已经内置了一个mDNS服务。你可以通过`dap.local`的地址访问到设备。 + +> ESP8266的mDNS只支持ipv4。 ![mDNS](https://user-images.githubusercontent.com/17078589/149659052-7b29533f-9660-4811-8125-f8f50490d762.png) + ### 调试接口连接 -| SWD接口 | ESP8266引脚 | +
+ESP8266 + +| SWD | | |----------------|--------| | SWCLK | GPIO14 | | SWDIO | GPIO13 | | TVCC | 3V3 | | GND | GND | + -------------- -| JTAG接口 | ESP8266引脚 | -| :----------------: | :---------: | + +| JTAG | | +|--------------------|---------| | TCK | GPIO14 | | TMS | GPIO13 | | TDI | GPIO4 | @@ -67,17 +91,104 @@ ESP8266具有一个内置的mDNS服务(仅ipv4). 你可以通过 `dap.local` -------------- -| 其它 | ESP8266引脚 | -|:------------------:|:-------------:| +| Other | | +|--------------------|---------------| | LED\_WIFI\_STATUS | GPIO15 | | Tx | GPIO2 | | Rx | GPIO3 (U0RXD) | -> Rx 和 Tx 被用于UART TCP桥,默然不开启此功能。 +> Rx和Tx用于TCP转发的串口,默认不开启该功能。 + +
+ + +
+ESP32 + +| SWD | | +|----------------|--------| +| SWCLK | GPIO14 | +| SWDIO | GPIO13 | +| TVCC | 3V3 | +| GND | GND | + + +-------------- + + +| JTAG | | +|--------------------|---------| +| TCK | GPIO14 | +| TMS | GPIO13 | +| TDI | GPIO18 | +| TDO | GPIO19 | +| nTRST \(optional\) | GPIO25 | +| nRESET | GPIO26 | +| TVCC | 3V3 | +| GND | GND | + +-------------- + +| Other | | +|--------------------|---------------| +| LED\_WIFI\_STATUS | GPIO27 | +| Tx | GPIO23 | +| Rx | GPIO22 | + + +> Rx和Tx用于TCP转发的串口,默认不开启该功能。 + + +
+ + +
+ESP32C3 + +| SWD | | +|----------------|--------| +| SWCLK | GPIO6 | +| SWDIO | GPIO7 | +| TVCC | 3V3 | +| GND | GND | + + +-------------- + + +| JTAG | | +|--------------------|---------| +| TCK | GPIO6 | +| TMS | GPIO7 | +| TDI | GPIO9 | +| TDO | GPIO8 | +| nTRST \(optional\) | GPIO4 | +| nRESET | GPIO5 | +| TVCC | 3V3 | +| GND | GND | + +-------------- + +| Other | | +|--------------------|---------------| +| LED\_WIFI\_STATUS | GPIO10 | +| Tx | GPIO19 | +| Rx | GPIO18 | + + +> Rx和Tx用于TCP转发的串口,默认不开启该功能。 + + +
+ ---- ## 硬件参考电路 + +目前这里仅有ESP8266的参考电路。 + + 我们为你提供了一个简单的硬件电路例子作为参考: ![sch](https://user-images.githubusercontent.com/17078589/120953707-2a0a6e00-c780-11eb-9ad8-7221cf847974.png) @@ -98,30 +209,64 @@ ESP8266具有一个内置的mDNS服务(仅ipv4). 你可以通过 `dap.local` ### 在本地构建并烧写 -下面展示的是在Ubuntu20.04中使用终端安装依赖软件并编译烧录固件的操作流程。 -1. 下载本仓库到本地: - ```bash - $ sudo apt update && sudo apt install -y cmake git - $ git clone https://github.com/windowsair/wireless-esp8266-dap.git && cd wireless-esp8266-dap* - ``` -2. 获取ESP8266 RTOS软件开发套件: - ```bash - $ git submodule init && git submodule update && cd ESP8266_RTOS_SDK - ``` -3. 安装ESP8266 RTOS软件开发套件: - ```bash - $ sudo apt install -y python3 python3-pip - $ ./install.sh && . ./export.sh && cd .. - ``` -4. 编译并烧录固件: - ```bash - # 编译固件 - $ python3 ./idf.py build - # 烧录固件,“/dev/ttyS5”需要改成你对应的串口 - $ python3 ./idf.py -p /dev/ttyS5 flash - ``` -> 我们也提供了已经编译好的固件用于快速评估。在[Releases](https://github.com/windowsair/wireless-esp8266-dap/releases)中查看详细信息。 +
+ESP8266 + +1. 获取ESP8266 SDK + + 项目中已经随附了一个SDK。请不要使用其他版本的SDK。 + +2. 编译和烧写 + + 使用ESP-IDF编译系统进行构建。 + 更多的信息,请见:[Build System](https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html "Build System") + + +下面例子展示了在Windows上完成这些任务的一种可行方法: + +```bash +# 编译 +python ./idf.py build +# 烧写 +python ./idf.py -p /dev/ttyS5 flash +``` + +
+ + +
+ESP32/ESP32C3 + +1. 获取esp-idf + + 目前,请考虑使用esp-idf v4.4.2: https://github.com/espressif/esp-idf/releases/tag/v4.4.2 + +2. 编译和烧写 + + 使用ESP-IDF编译系统进行构建。 + 更多的信息,请见:[Build System](https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html "Build System") + + +下面例子展示了在Windows上完成这些任务的一种可行方法: + +```bash +# 编译 +idf.py build +# 烧写 +idf.py -p /dev/ttyS5 flash +``` + + +> 位于项目根目录的`idf.py`脚本仅适用于较老的ESP8266设备,请不要在ESP32设备上使用。 + +
+ + +> 我们还提供了预编译固件用于快速评估。详见 [Releases](https://github.com/windowsair/wireless-esp8266-dap/releases) + + + ## 使用 @@ -152,9 +297,33 @@ ESP8266具有一个内置的mDNS服务(仅ipv4). 你可以通过 `dap.local` ------ +## 经常会问的问题 + +### Keil提示“RDDI-DAP ERROR”或“SWD/JTAG Communication Failure” + +1. 检查线路连接。别忘了连接3V3引脚。 +2. 检查网络连接是否稳定。 + + +## DAP很慢或者不稳定 + +注意,本项目受限于周围的网络环境。如果你在电脑上使用热点进行连接,你可以尝试使用wireshark等工具对网络连接进行分析。当调试闲置时,线路上应保持静默,而正常工作时一般不会发生太多的丢包。 + +一些局域网广播数据包可能会造成严重影响,这些包可能由这些应用发出: +- DropBox LAN Sync +- Logitech Arx Control +- ... + +对于ESP8266, 这无异于UDP洪水攻击...😰 + + +周围的射频环境同样会造成影响,此外距离、网卡性能等也可能是需要考虑的。 + + + ## 文档 -### 速度性能 +### 速度策略 单独使用ESP8266通用IO时的最大翻转速率只有大概2MHz。当你选择最大时钟时,我们需要采取以下操作: @@ -215,13 +384,13 @@ CONFIG_ESPTOOLPY_FLASHSIZE="1MB" CONFIG_ESP8266_BOOT_COPY_APP=y ``` -可以用esptool.py工具检查你使用的ESP8266的闪存大小: +可以用esptool.py工具检查你使用的ESP设备闪存大小: ```bash esptool.py -p (PORT) flash_id ``` -### Uart TCP桥 +### TCP转发的串口 该功能在TCP和Uart之间提供了一个桥梁: ``` @@ -232,7 +401,7 @@ esptool.py -p (PORT) flash_id ![uart_tcp_bridge](https://user-images.githubusercontent.com/17078589/150290065-05173965-8849-4452-ab7e-ec7649f46620.jpg) -当TCP连接建立后,网桥将尝试解决首次发送的文本。当文本是一个有效的波特率时,bridge 将切换到它。例如,发送ASCII文本`115200`会将波特率切换为115200。 +当TCP连接建立后,ESP芯片将尝试解决首次发送的文本。当文本是一个有效的波特率时,转发器就会切换到该波特率。例如,发送ASCII文本`115200`会将波特率切换为115200。 由于性能原因,该功能默认不启用。你可以修改 [wifi_configuration.h](main/wifi_configuration.h) 来打开它。 ---- @@ -245,31 +414,6 @@ esptool.py -p (PORT) flash_id - [新的Issues](https://github.com/windowsair/wireless-esp8266-dap/issues) - [新的pull request](https://github.com/windowsair/wireless-esp8266-dap/pulls) -### 版本修订信息 - -2020.12.1 - -TCP传输速度需要进一步提高。 - -2020.11.11 - -现在可以使用Winusb了,但它非常慢。 - -2020.2.4 - -由于USB-HID的限制(不知道是USBIP的问题还是Windows的问题),现在每个URB数据包只能达到255字节(约1MBps带宽),还没有达到ESP8266传输带宽的上限。 - -我现在有一个想法,在两者之间构建一个中间人来转发流量,从而增加每次传输的带宽。 - -2020.1.31 - -目前,对WCID、WinUSB等的适配已经全部完成。然而,当在端点上传输数据时,我们收到了来自USBIP的错误信息。这很可能是USBIP项目本身的问题。 - -由于USBIP协议文件的完整性,我们还没有理解它在批量传输过程中的作用,这也可能导致后续过程中的错误。 - -我们将继续努力使其在USB HID上发挥作用。一旦USBIP的问题得到解决,我们将立即将其转移到WinUSB上工作 - ------- # 致谢 diff --git a/sdkconfig.defaults.esp32c3 b/sdkconfig.defaults.esp32c3 index 57f349d..e6fa97c 100644 --- a/sdkconfig.defaults.esp32c3 +++ b/sdkconfig.defaults.esp32c3 @@ -380,7 +380,7 @@ CONFIG_ESP32C3_UNIVERSAL_MAC_ADDRESSES=4 # Sleep Config # CONFIG_ESP_SLEEP_POWER_DOWN_FLASH=y -CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND=y +# CONFIG_ESP_SLEEP_GPIO_RESET_WORKAROUND is not set # CONFIG_ESP_SLEEP_FLASH_LEAKAGE_WORKAROUND is not set # end of Sleep Config @@ -452,8 +452,7 @@ CONFIG_ESP_SYSTEM_ALLOW_RTC_FAST_MEM_AS_HEAP=y # Memory protection # CONFIG_ESP_SYSTEM_MEMPROT_DEPCHECK=y -CONFIG_ESP_SYSTEM_MEMPROT_FEATURE=y -CONFIG_ESP_SYSTEM_MEMPROT_FEATURE_LOCK=y +# CONFIG_ESP_SYSTEM_MEMPROT_FEATURE is not set CONFIG_ESP_SYSTEM_MEMPROT_CPU_PREFETCH_PAD_SIZE=16 CONFIG_ESP_SYSTEM_MEMPROT_MEM_ALIGN_SIZE=512 # end of Memory protection @@ -497,17 +496,17 @@ CONFIG_ESP_TIMER_IMPL_SYSTIMER=y # Wi-Fi # CONFIG_ESP32_WIFI_ENABLED=y -CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=10 -CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=32 +CONFIG_ESP32_WIFI_STATIC_RX_BUFFER_NUM=16 +CONFIG_ESP32_WIFI_DYNAMIC_RX_BUFFER_NUM=64 # CONFIG_ESP32_WIFI_STATIC_TX_BUFFER is not set CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER=y CONFIG_ESP32_WIFI_TX_BUFFER_TYPE=1 -CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=32 +CONFIG_ESP32_WIFI_DYNAMIC_TX_BUFFER_NUM=64 # CONFIG_ESP32_WIFI_CSI_ENABLED is not set CONFIG_ESP32_WIFI_AMPDU_TX_ENABLED=y -CONFIG_ESP32_WIFI_TX_BA_WIN=6 +CONFIG_ESP32_WIFI_TX_BA_WIN=32 CONFIG_ESP32_WIFI_AMPDU_RX_ENABLED=y -CONFIG_ESP32_WIFI_RX_BA_WIN=6 +CONFIG_ESP32_WIFI_RX_BA_WIN=32 CONFIG_ESP32_WIFI_NVS_ENABLED=y CONFIG_ESP32_WIFI_SOFTAP_BEACON_MAX_LEN=752 CONFIG_ESP32_WIFI_MGMT_SBUF_NUM=32 @@ -633,8 +632,7 @@ CONFIG_FREERTOS_QUEUE_REGISTRY_SIZE=0 CONFIG_FREERTOS_CHECK_MUTEX_GIVEN_BY_OWNER=y # CONFIG_FREERTOS_CHECK_PORT_CRITICAL_COMPLIANCE is not set # CONFIG_FREERTOS_PLACE_FUNCTIONS_INTO_FLASH is not set -CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT=y -# CONFIG_FREERTOS_PLACE_SNAPSHOT_FUNS_INTO_FLASH is not set +# CONFIG_FREERTOS_ENABLE_TASK_SNAPSHOT is not set # end of FreeRTOS # @@ -693,7 +691,7 @@ CONFIG_LOG_TIMESTAMP_SOURCE_RTOS=y # # LWIP # -CONFIG_LWIP_LOCAL_HOSTNAME="espressif" +CONFIG_LWIP_LOCAL_HOSTNAME="esp32c3-dap" # CONFIG_LWIP_NETIF_API is not set # CONFIG_LWIP_TCPIP_CORE_LOCKING is not set CONFIG_LWIP_DNS_SUPPORT_MDNS_QUERIES=y @@ -716,7 +714,7 @@ CONFIG_LWIP_IP6_FRAG=y # CONFIG_LWIP_ETHARP_TRUST_IP_MAC is not set CONFIG_LWIP_ESP_GRATUITOUS_ARP=y CONFIG_LWIP_GARP_TMR_INTERVAL=60 -CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=32 +CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=50 CONFIG_LWIP_DHCP_DOES_ARP_CHECK=y # CONFIG_LWIP_DHCP_DISABLE_CLIENT_ID is not set CONFIG_LWIP_DHCP_DISABLE_VENDOR_CLASS_ID=y @@ -737,8 +735,7 @@ CONFIG_LWIP_IPV6=y CONFIG_LWIP_IPV6_NUM_ADDRESSES=3 # CONFIG_LWIP_IPV6_FORWARD is not set # CONFIG_LWIP_NETIF_STATUS_CALLBACK is not set -CONFIG_LWIP_NETIF_LOOPBACK=y -CONFIG_LWIP_LOOPBACK_MAX_PBUFS=8 +# CONFIG_LWIP_NETIF_LOOPBACK is not set # # TCP @@ -981,9 +978,8 @@ CONFIG_MDNS_MULTIPLE_INSTANCE=y # # ESP-MQTT Configurations # -CONFIG_MQTT_PROTOCOL_311=y +# CONFIG_MQTT_PROTOCOL_311 is not set # CONFIG_MQTT_TRANSPORT_SSL is not set -# CONFIG_MQTT_TRANSPORT_WEBSOCKET is not set # CONFIG_MQTT_MSG_ID_INCREMENTAL is not set # CONFIG_MQTT_SKIP_PUBLISH_IF_DISCONNECTED is not set # CONFIG_MQTT_REPORT_DELETED_MESSAGES is not set