summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHiFiPhile <[email protected]>2024-05-11 12:44:16 +0200
committerHiFiPhile <[email protected]>2024-05-11 12:44:16 +0200
commit33882b3e89ead1d8b27e858ac8a932b4cbb9b165 (patch)
tree6b4bac21569d9c01cb027ca7cc30068fbf1dd0aa
parent9ce44db56f145d2efeec6b67d0786230c1a735c4 (diff)
parentd707ea56b47e2fbbe5eaa4854a427a3a7873dea3 (diff)
Merge remote-tracking branch 'remotes/tinyusb/master' into rx_fb
-rw-r--r--.circleci/config.yml31
-rw-r--r--.github/actions/get_deps/action.yml (renamed from .github/actions/prepare_build/action.yml)23
-rw-r--r--.github/actions/setup_toolchain/action.yml18
-rw-r--r--.github/workflows/build_cmake.yml46
-rw-r--r--.github/workflows/build_esp.yml109
-rw-r--r--.github/workflows/build_family.yml64
-rw-r--r--.github/workflows/build_iar.yml2
-rw-r--r--.github/workflows/build_renesas.yml3
-rw-r--r--.github/workflows/build_util.yml59
-rw-r--r--.github/workflows/build_win_mac.yml56
-rw-r--r--.github/workflows/ci_set_matrix.py2
-rw-r--r--.github/workflows/cifuzz.yml1
-rw-r--r--.github/workflows/hil_test.yml121
-rw-r--r--.github/workflows/pre-commit.yml3
-rw-r--r--examples/device/net_lwip_webserver/skip.txt4
-rw-r--r--examples/device/video_capture_2ch/skip.txt2
-rw-r--r--examples/host/cdc_msc_hid_freertos/only.txt1
-rw-r--r--hw/bsp/lpc17/family.mk2
-rw-r--r--hw/bsp/lpc40/family.mk2
-rw-r--r--lib/rt-thread/SConscript46
-rw-r--r--lib/rt-thread/tusb_config.h71
-rw-r--r--lib/rt-thread/tusb_rt_thread_port.c5
-rw-r--r--src/class/audio/audio_device.c2
-rw-r--r--src/class/hid/hid.h389
-rw-r--r--src/class/net/ncm_device.c16
-rw-r--r--src/device/usbd.c57
-rw-r--r--src/device/usbd.h6
-rw-r--r--src/device/usbd_pvt.h11
-rw-r--r--test/hil/hil_test.py19
-rw-r--r--test/hil/pi4.json10
-rw-r--r--test/hil/pi4_esp32.json14
-rw-r--r--tools/build.py46
-rw-r--r--tools/build_esp32.py106
-rw-r--r--tools/get_deps.py32
34 files changed, 725 insertions, 654 deletions
diff --git a/.circleci/config.yml b/.circleci/config.yml
new file mode 100644
index 000000000..d5d401c51
--- /dev/null
+++ b/.circleci/config.yml
@@ -0,0 +1,31 @@
+# Use the latest 2.1 version of CircleCI pipeline process engine.
+# See: https://circleci.com/docs/configuration-reference
+version: 2.1
+
+# Define a job to be invoked later in a workflow.
+# See: https://circleci.com/docs/jobs-steps/#jobs-overview & https://circleci.com/docs/configuration-reference/#jobs
+jobs:
+ say-hello:
+ # Specify the execution environment. You can specify an image from Docker Hub or use one of our convenience images from CircleCI's Developer Hub.
+ # See: https://circleci.com/docs/executor-intro/ & https://circleci.com/docs/configuration-reference/#executor-job
+ docker:
+ # Specify the version you desire here
+ # See: https://circleci.com/developer/images/image/cimg/base
+ - image: cimg/base:current
+
+ # Add steps to the job
+ # See: https://circleci.com/docs/jobs-steps/#steps-overview & https://circleci.com/docs/configuration-reference/#steps
+ steps:
+ # Checkout the code as the first step.
+ - checkout
+ - run:
+ name: "Say hello"
+ command: "echo Hello, World!"
+
+# Orchestrate jobs using workflows
+# See: https://circleci.com/docs/workflows/ & https://circleci.com/docs/configuration-reference/#workflows
+workflows:
+ say-hello-workflow: # This is the name of the workflow, feel free to change it to better match your workflow.
+ # Inside the workflow, you define the jobs you want to run.
+ jobs:
+ - say-hello
diff --git a/.github/actions/prepare_build/action.yml b/.github/actions/get_deps/action.yml
index 5f2c544c1..38b44a70e 100644
--- a/.github/actions/prepare_build/action.yml
+++ b/.github/actions/get_deps/action.yml
@@ -1,30 +1,29 @@
-name: Prepare to build
+name: Get dependencies
inputs:
- family:
+ arg:
required: true
type: string
runs:
using: "composite"
steps:
- - name: Setup Python
- uses: actions/setup-python@v5
- with:
- python-version: '3.x'
-
- name: Checkout pico-sdk for rp2040
- if: contains(inputs.family, 'rp2040')
+ if: contains(inputs.arg, 'rp2040') || contains(inputs.arg, 'raspberry_pi_pico')
uses: actions/checkout@v4
with:
repository: raspberrypi/pico-sdk
ref: develop
path: pico-sdk
- - name: Get Dependencies
+ - name: Linux dependencies
+ if: runner.os == 'Linux'
run: |
sudo apt install -y ninja-build
- pip install click
- python3 tools/get_deps.py ${{ inputs.family }}
- echo >> $GITHUB_ENV "PICO_SDK_PATH=$GITHUB_WORKSPACE/pico-sdk"
+ shell: bash
+
+ - name: Get Dependencies
+ run: |
+ python3 tools/get_deps.py ${{ inputs.arg }}
+ echo "PICO_SDK_PATH=${{ github.workspace }}/pico-sdk" >> $GITHUB_ENV
shell: bash
diff --git a/.github/actions/setup_toolchain/action.yml b/.github/actions/setup_toolchain/action.yml
index b59ece116..e6c79e7dd 100644
--- a/.github/actions/setup_toolchain/action.yml
+++ b/.github/actions/setup_toolchain/action.yml
@@ -8,6 +8,11 @@ inputs:
required: false
type: string
+outputs:
+ build_option:
+ description: 'Build option for the toolchain e.g --toolchain clang'
+ value: ${{ steps.set-toolchain-option.outputs.build_option }}
+
runs:
using: "composite"
steps:
@@ -19,7 +24,7 @@ runs:
- name: Pull ESP-IDF docker
if: inputs.toolchain == 'esp-idf'
- run: docker pull espressif/idf:latest
+ run: docker pull espressif/idf:${{ inputs.toolchain_url }}
shell: bash
- name: Download Toolchain
@@ -29,3 +34,14 @@ runs:
uses: ./.github/actions/setup_toolchain/download
with:
toolchain_url: ${{ inputs.toolchain_url }}
+
+ - name: Set toolchain option
+ id: set-toolchain-option
+ run: |
+ BUILD_OPTION=""
+ if [[ "${{ inputs.toolchain }}" == *"clang"* ]]; then
+ BUILD_OPTION="--toolchain clang"
+ fi
+ echo "build_option=$BUILD_OPTION"
+ echo "build_option=$BUILD_OPTION" >> $GITHUB_OUTPUT
+ shell: bash
diff --git a/.github/workflows/build_cmake.yml b/.github/workflows/build_cmake.yml
index b62a0e9bd..4723cf8d9 100644
--- a/.github/workflows/build_cmake.yml
+++ b/.github/workflows/build_cmake.yml
@@ -12,6 +12,7 @@ on:
- 'tools/build.py'
- '.github/actions/**'
- '.github/workflows/build_cmake.yml'
+ - '.github/workflows/build_util.yml'
- '.github/workflows/ci_set_matrix.py'
pull_request:
branches: [ master ]
@@ -24,9 +25,10 @@ on:
- 'tools/build.py'
- '.github/actions/**'
- '.github/workflows/build_cmake.yml'
+ - '.github/workflows/build_util.yml'
- '.github/workflows/ci_set_matrix.py'
concurrency:
- group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+ group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
@@ -55,7 +57,7 @@ jobs:
# ---------------------------------------
cmake:
needs: set-matrix
- uses: ./.github/workflows/build_family.yml
+ uses: ./.github/workflows/build_util.yml
strategy:
fail-fast: false
matrix:
@@ -69,14 +71,14 @@ jobs:
build-system: 'cmake'
toolchain: ${{ matrix.toolchain }}
toolchain_url: ${{ fromJSON(needs.set-matrix.outputs.json)[matrix.toolchain].toolchain_url }}
- build-family: ${{ toJSON(fromJSON(needs.set-matrix.outputs.json)[matrix.toolchain].family) }}
+ build-args: ${{ toJSON(fromJSON(needs.set-matrix.outputs.json)[matrix.toolchain].family) }}
# ---------------------------------------
# Build Make
# ---------------------------------------
make:
needs: set-matrix
- uses: ./.github/workflows/build_family.yml
+ uses: ./.github/workflows/build_util.yml
strategy:
fail-fast: false
matrix:
@@ -90,4 +92,38 @@ jobs:
build-system: 'make'
toolchain: ${{ matrix.toolchain }}
toolchain_url: ${{ fromJSON(needs.set-matrix.outputs.json)[matrix.toolchain].toolchain_url }}
- build-family: ${{ toJSON(fromJSON(needs.set-matrix.outputs.json)[matrix.toolchain].family) }}
+ build-args: ${{ toJSON(fromJSON(needs.set-matrix.outputs.json)[matrix.toolchain].family) }}
+
+ # ---------------------------------------
+ # Build Make on Windows/MacOS
+ # ---------------------------------------
+ make-os:
+ uses: ./.github/workflows/build_util.yml
+ strategy:
+ fail-fast: false
+ matrix:
+ os: [windows-latest, macos-latest]
+ with:
+ os: ${{ matrix.os }}
+ build-system: 'make'
+ toolchain: 'arm-gcc'
+ build-args: '["-bstm32f411disco"]'
+
+ # ---------------------------------------
+ # Build Espressif
+ # ---------------------------------------
+ espressif:
+ uses: ./.github/workflows/build_util.yml
+ strategy:
+ fail-fast: false
+ matrix:
+ board:
+ # ESP32-S2
+ - 'espressif_kaluga_1'
+ # ESP32-S3 skip since devkitm is also compiled in hil-test workflow
+ #- 'espressif_s3_devkitm'
+ with:
+ build-system: 'cmake'
+ toolchain: 'esp-idf'
+ toolchain_url: 'v5.1.1'
+ build-args: '["-b${{ matrix.board }}"]'
diff --git a/.github/workflows/build_esp.yml b/.github/workflows/build_esp.yml
deleted file mode 100644
index 66fa8548e..000000000
--- a/.github/workflows/build_esp.yml
+++ /dev/null
@@ -1,109 +0,0 @@
-name: Build ESP
-
-on:
- workflow_dispatch:
- push:
- paths:
- - 'src/**'
- - 'examples/**'
- - 'lib/**'
- - 'hw/**'
- - 'test/hil/**'
- - '.github/workflows/build_esp.yml'
- pull_request:
- branches: [ master ]
- paths:
- - 'src/**'
- - 'examples/**'
- - 'lib/**'
- - 'hw/**'
- - 'test/hil/**'
- - '.github/workflows/build_esp.yml'
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
- cancel-in-progress: true
-
-jobs:
- build-esp:
- runs-on: ubuntu-latest
- strategy:
- fail-fast: false
- matrix:
- board:
- # ESP32-S2
- - 'espressif_kaluga_1'
- # ESP32-S3
- - 'espressif_s3_devkitm'
- steps:
- - name: Setup Python
- uses: actions/setup-python@v5
- with:
- python-version: '3.x'
-
- - name: Checkout TinyUSB
- uses: actions/checkout@v4
-
- - name: Setup Toolchain
- uses: ./.github/actions/setup_toolchain
- with:
- toolchain: 'esp-idf'
-
- - name: Build
- run: docker run --rm -v $PWD:/project -w /project espressif/idf:v5.1.1 python3 tools/build.py -b ${{ matrix.board }}
-
- - name: Upload Artifacts for Hardware Testing
- if: matrix.board == 'espressif_s3_devkitm' && github.repository_owner == 'hathach'
- uses: actions/upload-artifact@v4
- with:
- name: ${{ matrix.board }}
- path: |
- cmake-build/cmake-build-${{ matrix.board }}/*/*/bootloader/bootloader.bin
- cmake-build/cmake-build-${{ matrix.board }}/*/*/*.bin
- cmake-build/cmake-build-${{ matrix.board }}/*/*/partition_table/partition-table.bin
- cmake-build/cmake-build-${{ matrix.board }}/*/*/config.env
- cmake-build/cmake-build-${{ matrix.board }}/*/*/flash_args
-
- # ---------------------------------------
- # Hardware in the loop (HIL)
- # Current self-hosted instance is running on an RPI4. For attached hardware checkout hil_pi4.json
- # ---------------------------------------
- hil-test:
- # run only with hathach's commit due to limited resource on RPI4
- if: github.repository_owner == 'hathach'
- needs: build-esp
- runs-on: [self-hosted, esp32s3, hardware-in-the-loop]
- strategy:
- fail-fast: false
- matrix:
- board:
- - 'espressif_s3_devkitm'
- steps:
- - name: Clean workspace
- run: |
- echo "Cleaning up previous run"
- rm -rf "${{ github.workspace }}"
- mkdir -p "${{ github.workspace }}"
-
- # USB bus on rpi4 is not stable, reset it before testing
- - name: Reset USB bus
- run: |
- lsusb
- lsusb -t
- # reset VIA Labs 2.0 hub
- sudo usbreset 001/002
-
- - name: Checkout test/hil
- uses: actions/checkout@v4
- with:
- sparse-checkout: test/hil
-
- - name: Download Artifacts
- uses: actions/download-artifact@v4
- with:
- name: ${{ matrix.board }}
- path: cmake-build/cmake-build-${{ matrix.board }}
-
- - name: Test on actual hardware
- run: |
- python3 test/hil/hil_test.py --board ${{ matrix.board }} pi4_esp32.json
diff --git a/.github/workflows/build_family.yml b/.github/workflows/build_family.yml
deleted file mode 100644
index 2e89267a3..000000000
--- a/.github/workflows/build_family.yml
+++ /dev/null
@@ -1,64 +0,0 @@
-name: Build family
-
-on:
- workflow_call:
- inputs:
- build-system:
- required: true
- type: string
- toolchain:
- required: true
- type: string
- toolchain_url:
- required: true
- type: string
- build-family:
- required: true
- type: string
-
-jobs:
- family:
- runs-on: ubuntu-latest
- strategy:
- fail-fast: false
- matrix:
- family: ${{ fromJSON(inputs.build-family) }}
- steps:
- - name: Checkout TinyUSB
- uses: actions/checkout@v4
-
- - name: Setup Python
- uses: actions/setup-python@v5
- with:
- python-version: '3.x'
-
- - name: Setup Toolchain
- uses: ./.github/actions/setup_toolchain
- with:
- toolchain: ${{ inputs.toolchain }}
- toolchain_url: ${{ inputs.toolchain_url }}
-
- - name: Checkout pico-sdk for rp2040
- if: contains(matrix.family, 'rp2040')
- uses: actions/checkout@v4
- with:
- repository: raspberrypi/pico-sdk
- ref: develop
- path: pico-sdk
-
- - name: Get Dependencies
- run: |
- sudo apt install -y ninja-build
- pip install click
- python3 tools/get_deps.py ${{ matrix.family }}
-
- - name: Build
- run: |
- OPTION=""
- if [[ "${{ inputs.toolchain }}" == *"clang"* ]]; then
- OPTION="--toolchain clang"
- fi
- echo "OPTION=$OPTION"
- python tools/build.py -s ${{ inputs.build-system }} $OPTION ${{ matrix.family }}
- env:
- PICO_SDK_PATH: ${{ github.workspace }}/pico-sdk
diff --git a/.github/workflows/build_iar.yml b/.github/workflows/build_iar.yml
index c4a7f96b7..34dbda192 100644
--- a/.github/workflows/build_iar.yml
+++ b/.github/workflows/build_iar.yml
@@ -23,7 +23,7 @@ on:
- '.github/workflows/build_iar.yml'
concurrency:
- group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+ group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
diff --git a/.github/workflows/build_renesas.yml b/.github/workflows/build_renesas.yml
index 8c83bdbbf..1be49344f 100644
--- a/.github/workflows/build_renesas.yml
+++ b/.github/workflows/build_renesas.yml
@@ -21,7 +21,7 @@ on:
- '.github/workflows/build_renesas.yml'
concurrency:
- group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+ group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
@@ -65,7 +65,6 @@ jobs:
- name: Get Dependencies
run: |
- pip install click
python3 tools/get_deps.py ${{ matrix.family }}
- name: Build
diff --git a/.github/workflows/build_util.yml b/.github/workflows/build_util.yml
new file mode 100644
index 000000000..f8ad1900c
--- /dev/null
+++ b/.github/workflows/build_util.yml
@@ -0,0 +1,59 @@
+name: Reusable build util
+
+on:
+ workflow_call:
+ inputs:
+ build-system:
+ required: true
+ type: string
+ toolchain:
+ required: true
+ type: string
+ toolchain_url:
+ required: false
+ type: string
+ build-args:
+ required: true
+ type: string
+ os:
+ required: false
+ type: string
+ default: 'ubuntu-latest'
+
+jobs:
+ family:
+ runs-on: ${{ inputs.os }}
+ strategy:
+ fail-fast: false
+ matrix:
+ arg: ${{ fromJSON(inputs.build-args) }}
+ steps:
+ - name: Checkout TinyUSB
+ uses: actions/checkout@v4
+
+ - name: Setup Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.x'
+
+ - name: Setup Toolchain
+ id: setup-toolchain
+ uses: ./.github/actions/setup_toolchain
+ with:
+ toolchain: ${{ inputs.toolchain }}
+ toolchain_url: ${{ inputs.toolchain_url }}
+
+ - name: Get Dependencies
+ uses: ./.github/actions/get_deps
+ with:
+ arg: ${{ matrix.arg }}
+
+ - name: Build
+ if: inputs.toolchain != 'esp-idf'
+ run: |
+ python tools/build.py -s ${{ inputs.build-system }} ${{ steps.setup-toolchain.outputs.build_option }} ${{ matrix.arg }}
+
+ - name: Build using ESP-IDF docker
+ if: inputs.toolchain == 'esp-idf'
+ run: |
+ docker run --rm -v $PWD:/project -w /project espressif/idf:${{ inputs.toolchain_url }} python3 tools/build.py ${{ matrix.arg }}
diff --git a/.github/workflows/build_win_mac.yml b/.github/workflows/build_win_mac.yml
deleted file mode 100644
index 35328aa32..000000000
--- a/.github/workflows/build_win_mac.yml
+++ /dev/null
@@ -1,56 +0,0 @@
-name: Build Windows/MacOS
-
-on:
- workflow_dispatch:
- push:
- paths:
- - 'src/**'
- - 'examples/**'
- - 'lib/**'
- - 'hw/**'
- - '.github/workflows/build_win_mac.yml'
- pull_request:
- branches: [ master ]
- paths:
- - 'src/**'
- - 'examples/**'
- - 'lib/**'
- - 'hw/**'
- - '.github/workflows/build_win_mac.yml'
-
-concurrency:
- group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
- cancel-in-progress: true
-
-jobs:
- # ---------------------------------------
- # Build ARM family
- # ---------------------------------------
- build-arm:
- strategy:
- fail-fast: false
- matrix:
- os: [windows-latest, macos-latest]
- runs-on: ${{ matrix.os }}
-
- steps:
- - name: Setup Python
- uses: actions/setup-python@v5
- with:
- python-version: '3.x'
-
- - name: Install ARM GCC
- uses: carlosperate/arm-none-eabi-gcc-action@v1
- with:
- release: '10.3-2021.10'
-
- - name: Checkout TinyUSB
- uses: actions/checkout@v4
-
- - name: Get Dependencies
- run: |
- pip install click
- python3 tools/get_deps.py stm32f4
-
- - name: Build
- run: python3 tools/build.py -s make stm32f2
diff --git a/.github/workflows/ci_set_matrix.py b/.github/workflows/ci_set_matrix.py
index 2a17be6a1..ea758d917 100644
--- a/.github/workflows/ci_set_matrix.py
+++ b/.github/workflows/ci_set_matrix.py
@@ -16,7 +16,7 @@ family_list = {
"ch32v307 fomu gd32vf103": ["riscv-gcc"],
"imxrt": ["arm-gcc", "arm-clang"],
"kinetis_k kinetis_kl kinetis_k32l2": ["arm-gcc", "arm-clang"],
- "lpc11 lpc13 lpc15": ["arm-gcc"],
+ "lpc11 lpc13 lpc15": ["arm-gcc", "arm-clang"],
"lpc17 lpc18 lpc40 lpc43": ["arm-gcc", "arm-clang"],
"lpc51 lpc54 lpc55": ["arm-gcc", "arm-clang"],
"mcx": ["arm-gcc"],
diff --git a/.github/workflows/cifuzz.yml b/.github/workflows/cifuzz.yml
index faa0f911c..622d261a0 100644
--- a/.github/workflows/cifuzz.yml
+++ b/.github/workflows/cifuzz.yml
@@ -12,7 +12,6 @@ on:
- '**.h'
jobs:
Fuzzing:
- if: false
runs-on: ubuntu-latest
steps:
- name: Build Fuzzers
diff --git a/.github/workflows/hil_test.yml b/.github/workflows/hil_test.yml
index 024ab969d..796ff32dc 100644
--- a/.github/workflows/hil_test.yml
+++ b/.github/workflows/hil_test.yml
@@ -24,15 +24,18 @@ on:
- '.github/actions/**'
- '.github/workflows/hil_test.yml'
concurrency:
- group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+ group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
+ # ---------------------------------------
+ # Build Non Espressif
+ # ---------------------------------------
build:
if: github.repository_owner == 'hathach'
runs-on: ubuntu-latest
outputs:
- BOARD_LIST: ${{ steps.parse_hil_json.outputs.BOARD_LIST }}
+ BOARDS_LIST: ${{ steps.parse_hil_json.outputs.BOARDS_LIST }}
steps:
- name: Checkout TinyUSB
uses: actions/checkout@v4
@@ -42,38 +45,29 @@ jobs:
with:
python-version: '3.x'
- - name: Install ARM GCC
- uses: carlosperate/arm-none-eabi-gcc-action@v1
- with:
- release: '12.3.Rel1'
-
- name: Parse HIL json
id: parse_hil_json
run: |
sudo apt install -y jq
- BOARD_LIST=$(jq -r '.boards[] | "-b " + .name' test/hil/pi4.json | tr '\n' ' ')
- echo "BOARD_LIST=$BOARD_LIST"
- echo >> $GITHUB_ENV "BOARD_LIST=$BOARD_LIST"
- echo >> $GITHUB_OUTPUT "BOARD_LIST=$BOARD_LIST"
- - name: Checkout pico-sdk for rp2040
- uses: actions/checkout@v4
+ # Non-Espresif boards
+ BOARDS_LIST=$(jq -r '.boards[] | select(.flasher != "esptool") | "-b " + .name' test/hil/pi4.json | tr '\n' ' ')
+ echo "BOARDS_LIST=$BOARDS_LIST"
+ echo "BOARDS_LIST=$BOARDS_LIST" >> $GITHUB_ENV
+ echo "BOARDS_LIST=$BOARDS_LIST" >> $GITHUB_OUTPUT
+
+ - name: Setup ARM Toolchain
+ uses: ./.github/actions/setup_toolchain
with:
- repository: raspberrypi/pico-sdk
- ref: develop
- path: pico-sdk
+ toolchain: 'arm-gcc'
- name: Get Dependencies
- run: |
- pip install click
- sudo apt install -y ninja-build
- python3 tools/get_deps.py $BOARD_LIST
+ uses: ./.github/actions/get_deps
+ with:
+ arg: ${{ env.BOARDS_LIST }}
- name: Build
- run: |
- python tools/build.py $BOARD_LIST
- env:
- PICO_SDK_PATH: ${{ github.workspace }}/pico-sdk
+ run: python tools/build.py $BOARDS_LIST
- name: Upload Artifacts for Hardware Testing
uses: actions/upload-artifact@v4
@@ -84,15 +78,70 @@ jobs:
cmake-build/cmake-build-*/*/*/*.bin
# ---------------------------------------
+ # Build Espressif
+ # ---------------------------------------
+ build-esp:
+ runs-on: ubuntu-latest
+ outputs:
+ BOARDS_LIST: ${{ steps.parse_hil_json.outputs.BOARDS_LIST }}
+ steps:
+ - name: Checkout TinyUSB
+ uses: actions/checkout@v4
+
+ - name: Setup Python
+ uses: actions/setup-python@v5
+ with:
+ python-version: '3.x'
+
+ - name: Parse HIL json
+ id: parse_hil_json
+ run: |
+ sudo apt install -y jq
+ # Espressif boards
+ BOARDS_LIST=$(jq -r '.boards[] | select(.flasher == "esptool") | "-b " + .name' test/hil/pi4.json | tr '\n' ' ')
+ echo "BOARDS_LIST=$BOARDS_LIST"
+ echo "BOARDS_LIST=$BOARDS_LIST" >> $GITHUB_ENV
+ echo "BOARDS_LIST=$BOARDS_LIST" >> $GITHUB_OUTPUT
+
+ - name: Setup ESP-IDF
+ if: env.BOARDS_LIST != ''
+ uses: ./.github/actions/setup_toolchain
+ with:
+ toolchain: 'esp-idf'
+ toolchain_url: 'v5.1.1'
+
+ - name: Get Dependencies
+ uses: ./.github/actions/get_deps
+ with:
+ arg: ${{ env.BOARDS_LIST }}
+
+ - name: Build Espressif
+ if: env.BOARDS_LIST != ''
+ run: docker run --rm -v $PWD:/project -w /project espressif/idf:v5.1.1 python3 tools/build.py $BOARDS_LIST
+
+ - name: Upload Artifacts for Hardware Testing
+ uses: actions/upload-artifact@v4
+ with:
+ name: hil_pi4_esp
+ path: |
+ cmake-build/cmake-build-*/*/*/*.bin
+ cmake-build/cmake-build-*/*/*/bootloader/bootloader.bin
+ cmake-build/cmake-build-*/*/*/partition_table/partition-table.bin
+ cmake-build/cmake-build-*/*/*/config.env
+ cmake-build/cmake-build-*/*/*/flash_args
+
+ # ---------------------------------------
# Hardware in the loop (HIL)
- # Current self-hosted instance is running on an RPI4. For attached hardware checkout hil_pi4.json
+ # Current self-hosted instance is running on an RPI4. For attached hardware checkout test/hil/pi4.json
# ---------------------------------------
hil-pi4:
if: github.repository_owner == 'hathach'
- needs: build
- runs-on: [self-hosted, rp2040, nrf52840, hardware-in-the-loop]
+ needs:
+ - build
+ - build-esp
+ runs-on: [self-hosted, rp2040, nrf52840, esp32s3, hardware-in-the-loop]
env:
- BOARD_LIST: ${{ needs.build.outputs.BOARD_LIST }}
+ BOARDS_LIST: "${{ needs.build.outputs.BOARDS_LIST }} ${{ needs.build-esp.outputs.BOARDS_LIST }}"
steps:
- name: Clean workspace
run: |
@@ -103,8 +152,7 @@ jobs:
# USB bus on rpi4 is not stable, reset it before testing
- name: Reset USB bus
run: |
- lsusb
- lsusb -t
+ # lsusb -t
# reset VIA Labs 2.0 hub
sudo usbreset 001/002
@@ -119,7 +167,16 @@ jobs:
name: hil_pi4
path: cmake-build
+ - name: Download Artifacts
+ uses: actions/download-artifact@v4
+ with:
+ name: hil_pi4_esp
+ path: cmake-build
+
- name: Test on actual hardware
run: |
- echo "BOARD_LIST=$BOARD_LIST"
- python3 test/hil/hil_test.py $BOARD_LIST pi4.json
+ echo "BOARDS_LIST=$BOARDS_LIST"
+ echo "::group::{cmake-build contents}"
+ tree cmake-build
+ echo "::endgroup::"
+ python3 test/hil/hil_test.py $BOARDS_LIST pi4.json
diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml
index 6b3151702..d1ffe6ca1 100644
--- a/.github/workflows/pre-commit.yml
+++ b/.github/workflows/pre-commit.yml
@@ -7,7 +7,7 @@ on:
branches: [ master ]
concurrency:
- group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
+ group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
@@ -38,7 +38,6 @@ jobs:
- name: Build Fuzzer
run: |
- pip install click
export CC=clang
export CXX=clang++
fuzz_harness=$(ls -d test/fuzz/device/*/)
diff --git a/examples/device/net_lwip_webserver/skip.txt b/examples/device/net_lwip_webserver/skip.txt
index bb3ff7885..43cdab71a 100644
--- a/examples/device/net_lwip_webserver/skip.txt
+++ b/examples/device/net_lwip_webserver/skip.txt
@@ -9,6 +9,8 @@ mcu:STM32F0
mcu:KINETIS_KL
family:broadcom_64bit
family:broadcom_32bit
+family:espressif
board:curiosity_nano
board:frdm_kl25z
-family:espressif
+# lpc55 has weird error 'ncm_interface' causes a section type conflict with 'ntb_parameters'
+family:lpc55
diff --git a/examples/device/video_capture_2ch/skip.txt b/examples/device/video_capture_2ch/skip.txt
index 15c176a2a..86697899b 100644
--- a/examples/device/video_capture_2ch/skip.txt
+++ b/examples/device/video_capture_2ch/skip.txt
@@ -12,3 +12,5 @@ board:lpcxpresso11u68
board:stm32f303disco
board:stm32l412nucleo
board:ek_tm4c123gxl
+board:uno_r4
+board:ra4m1_ek
diff --git a/examples/host/cdc_msc_hid_freertos/only.txt b/examples/host/cdc_msc_hid_freertos/only.txt
index 81d993ffa..1e0e60075 100644
--- a/examples/host/cdc_msc_hid_freertos/only.txt
+++ b/examples/host/cdc_msc_hid_freertos/only.txt
@@ -8,5 +8,4 @@ mcu:MIMXRT10XX
mcu:MIMXRT11XX
mcu:MSP432E4
mcu:RX65X
-mcu:RAXXX
mcu:MAX3421
diff --git a/hw/bsp/lpc17/family.mk b/hw/bsp/lpc17/family.mk
index 84ed95648..d719a47b7 100644
--- a/hw/bsp/lpc17/family.mk
+++ b/hw/bsp/lpc17/family.mk
@@ -22,8 +22,8 @@ LDFLAGS_GCC += --specs=nosys.specs --specs=nano.specs
SRC_C += \
src/portable/nxp/lpc17_40/dcd_lpc17_40.c \
- src/portable/ohci/ohci.c \
src/portable/nxp/lpc17_40/hcd_lpc17_40.c \
+ src/portable/ohci/ohci.c \
$(MCU_DIR)/../gcc/cr_startup_lpc175x_6x.c \
$(MCU_DIR)/src/chip_17xx_40xx.c \
$(MCU_DIR)/src/clock_17xx_40xx.c \
diff --git a/hw/bsp/lpc40/family.mk b/hw/bsp/lpc40/family.mk
index 79d868f35..ef9fe57b2 100644
--- a/hw/bsp/lpc40/family.mk
+++ b/hw/bsp/lpc40/family.mk
@@ -20,6 +20,8 @@ LDFLAGS_GCC += --specs=nosys.specs --specs=nano.specs
# All source paths should be relative to the top level.
SRC_C += \
src/portable/nxp/lpc17_40/dcd_lpc17_40.c \
+ src/portable/nxp/lpc17_40/hcd_lpc17_40.c \
+ src/portable/ohci/ohci.c \
$(MCU_DIR)/../gcc/cr_startup_lpc40xx.c \
$(MCU_DIR)/src/chip_17xx_40xx.c \
$(MCU_DIR)/src/clock_17xx_40xx.c \
diff --git a/lib/rt-thread/SConscript b/lib/rt-thread/SConscript
index 205e12958..482f6d7b2 100644
--- a/lib/rt-thread/SConscript
+++ b/lib/rt-thread/SConscript
@@ -5,32 +5,44 @@ cwd = GetCurrentDir()
src = Split("""
../../src/tusb.c
../../src/common/tusb_fifo.c
-../../src/device/usbd.c
-../../src/device/usbd_control.c
./tusb_rt_thread_port.c
""")
path = [cwd, cwd + "/../../src"]
-# BSP
-if GetDepend(["SOC_FAMILY_STM32"]):
- src += ["../../src/portable/synopsys/dwc2/dcd_dwc2.c",
- "../../src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c"]
+LOCAL_CFLAGS = ''
-if GetDepend(["SOC_NRF52840"]):
- src += ["../../src/portable/nordic/nrf5x/dcd_nrf5x.c"]
+# for device stack
+if GetDepend(["PKG_TINYUSB_DEVICE_ENABLE"]):
+ src += ["../../src/device/usbd.c",
+ "../../src/device/usbd_control.c"]
+ # BSP
+ if GetDepend(["SOC_FAMILY_STM32"]):
+ src += ["../../src/portable/synopsys/dwc2/dcd_dwc2.c",
+ "../../src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c"]
-if GetDepend(["SOC_FAMILY_RENESAS"]):
- src += ["../../src/portable/renesas/rusb2/dcd_rusb2.c",
- "../../src/portable/renesas/rusb2/rusb2_common.c"]
+ if GetDepend(["SOC_NRF52840"]):
+ src += ["../../src/portable/nordic/nrf5x/dcd_nrf5x.c"]
-# Device class
-if GetDepend(["PKG_TINYUSB_DEVICE_CDC"]):
- src += ["../../src/class/cdc/cdc_device.c"]
+ if GetDepend(["SOC_FAMILY_RENESAS"]):
+ src += ["../../src/portable/renesas/rusb2/dcd_rusb2.c",
+ "../../src/portable/renesas/rusb2/rusb2_common.c"]
-if GetDepend(["PKG_TINYUSB_DEVICE_MSC"]):
- src += ["../../src/class/msc/msc_device.c", "port/msc_device_port.c"]
+ # Device class
+ if GetDepend(["PKG_TINYUSB_DEVICE_UVC"]):
+ src += ["../../src/class/video/video_device.c"]
+ if GetDepend(["PKG_TINYUSB_DEVICE_CDC"]):
+ src += ["../../src/class/cdc/cdc_device.c"]
+ if GetDepend(["PKG_TINYUSB_DEVICE_MSC"]):
+ src += ["../../src/class/msc/msc_device.c", "port/msc_device_port.c"]
+
+# for host stack
+if GetDepend(["PKG_TINYUSB_HOST_ENABLE"]):
+ src += ["../../src/host/usbh.c", "../../src/host/hub.c"]
+
+ if GetDepend(["SOC_FAMILY_RENESAS"]):
+ src += ["../../src/portable/renesas/rusb2/hcd_rusb2.c",
+ "../../src/portable/renesas/rusb2/rusb2_common.c"]
-LOCAL_CFLAGS = ''
if rtconfig.PLATFORM == 'gcc' or rtconfig.PLATFORM == 'armclang': # GCC or Keil AC6
LOCAL_CFLAGS += ' -std=c99'
diff --git a/lib/rt-thread/tusb_config.h b/lib/rt-thread/tusb_config.h
index 8b145f3f7..b3c3bf43f 100644
--- a/lib/rt-thread/tusb_config.h
+++ b/lib/rt-thread/tusb_config.h
@@ -113,6 +113,11 @@ extern "C" {
//--------------------------------------------------------------------
// DEVICE CONFIGURATION
//--------------------------------------------------------------------
+#if defined(PKG_TINYUSB_DEVICE_ENABLE)
+ #define CFG_TUD_ENABLED (1)
+#else
+ #define CFG_TUD_ENABLED (0)
+#endif
#ifndef CFG_TUD_ENDPOINT0_SIZE
#define CFG_TUD_ENDPOINT0_SIZE PKG_TINYUSB_EDPT0_SIZE
@@ -138,6 +143,72 @@ extern "C" {
#define PKG_TINYUSB_DEVICE_HID_STRING ""
#endif
+//--------------------------------------------------------------------
+// HOST CONFIGURATION
+//--------------------------------------------------------------------
+#if defined(PKG_TINYUSB_HOST_ENABLE)
+ #define CFG_TUH_ENABLED (1)
+#else
+ #define CFG_TUH_ENABLED (0)
+#endif
+
+#if (PKG_TINYUSB_HOST_PORT == 0)
+#undef CFG_TUSB_RHPORT0_MODE
+#define CFG_TUSB_RHPORT0_MODE (OPT_MODE_HOST | PKG_TINYUSB_HOST_PORT_SPEED)
+#endif
+
+#if (PKG_TINYUSB_HOST_PORT == 1)
+#undef CFG_TUSB_RHPORT1_MODE
+#define CFG_TUSB_RHPORT1_MODE (OPT_MODE_HOST | PKG_TINYUSB_HOST_PORT_SPEED)
+#endif
+
+#define BOARD_TUH_RHPORT PKG_TINYUSB_HOST_PORT // FULL SPEED
+#define BOARD_TUH_MAX_SPEED PKG_TINYUSB_HOST_PORT_SPEED
+// Default is max speed that hardware controller could support with on-chip PHY
+#define CFG_TUH_MAX_SPEED BOARD_TUH_MAX_SPEED
+
+//------------------------- Board Specific --------------------------
+
+// RHPort number used for host can be defined by board.mk, default to port 0
+#ifndef BOARD_TUH_RHPORT
+#define BOARD_TUH_RHPORT 0
+#endif
+
+// RHPort max operational speed can defined by board.mk
+#ifndef BOARD_TUH_MAX_SPEED
+#define BOARD_TUH_MAX_SPEED OPT_MODE_DEFAULT_SPEED
+#endif
+
+// Size of buffer to hold descriptors and other data used for enumeration
+#define CFG_TUH_ENUMERATION_BUFSIZE 256
+
+#define CFG_TUH_HUB 2 // number of supported hubs
+#define CFG_TUH_CDC 0 // CDC ACM
+#define CFG_TUH_CDC_FTDI 0 // FTDI Serial. FTDI is not part of CDC class, only to re-use CDC driver API
+#define CFG_TUH_CDC_CP210X 0 // CP210x Serial. CP210X is not part of CDC class, only to re-use CDC driver API
+#define CFG_TUH_CDC_CH34X 0 // CH340 or CH341 Serial. CH34X is not part of CDC class, only to re-use CDC driver API
+#define CFG_TUH_HID 0 // typical keyboard + mouse device can have 3-4 HID interfaces
+#define CFG_TUH_MSC 0
+//#define CFG_TUH_VENDOR 3
+
+// max device support (excluding hub device): 1 hub typically has 4 ports
+#define CFG_TUH_DEVICE_MAX (3*CFG_TUH_HUB + 1)
+
+//------------- HID -------------//
+#define CFG_TUH_HID_EPIN_BUFSIZE 64
+#define CFG_TUH_HID_EPOUT_BUFSIZE 64
+
+//------------- CDC -------------//
+
+// Set Line Control state on enumeration/mounted:
+// DTR ( bit 0), RTS (bit 1)
+#define CFG_TUH_CDC_LINE_CONTROL_ON_ENUM 0x03
+
+// Set Line Coding on enumeration/mounted, value for cdc_line_coding_t
+// bit rate = 115200, 1 stop bit, no parity, 8 bit data width
+#define CFG_TUH_CDC_LINE_CODING_ON_ENUM { 115200, CDC_LINE_CODING_STOP_BITS_1, CDC_LINE_CODING_PARITY_NONE, 8 }
+
+
#ifdef __cplusplus
}
diff --git a/lib/rt-thread/tusb_rt_thread_port.c b/lib/rt-thread/tusb_rt_thread_port.c
index d33e3ac60..7e04d2453 100644
--- a/lib/rt-thread/tusb_rt_thread_port.c
+++ b/lib/rt-thread/tusb_rt_thread_port.c
@@ -44,7 +44,12 @@ static void tusb_thread_entry(void *parameter)
(void) parameter;
while (1)
{
+#if CFG_TUH_ENABLED
+ tuh_task();
+#endif
+#if CFG_TUD_ENABLED
tud_task();
+#endif
}
}
diff --git a/src/class/audio/audio_device.c b/src/class/audio/audio_device.c
index 5ee0a4007..719e71e12 100644
--- a/src/class/audio/audio_device.c
+++ b/src/class/audio/audio_device.c
@@ -2093,7 +2093,7 @@ static bool audiod_set_interface(uint8_t rhport, tusb_control_request_t const *
break;
}
}
- if (disable) usbd_sof_enable(rhport, false);
+ if (disable) usbd_sof_enable(rhport, SOF_CONSUMER_AUDIO, false);
#endif
#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL
diff --git a/src/class/hid/hid.h b/src/class/hid/hid.h
index e949f1f83..2fe922136 100644
--- a/src/class/hid/hid.h
+++ b/src/class/hid/hid.h
@@ -366,177 +366,224 @@ typedef enum
//--------------------------------------------------------------------+
// HID KEYCODE
//--------------------------------------------------------------------+
-#define HID_KEY_NONE 0x00
-#define HID_KEY_A 0x04
-#define HID_KEY_B 0x05
-#define HID_KEY_C 0x06
-#define HID_KEY_D 0x07
-#define HID_KEY_E 0x08
-#define HID_KEY_F 0x09
-#define HID_KEY_G 0x0A
-#define HID_KEY_H 0x0B
-#define HID_KEY_I 0x0C
-#define HID_KEY_J 0x0D
-#define HID_KEY_K 0x0E
-#define HID_KEY_L 0x0F
-#define HID_KEY_M 0x10
-#define HID_KEY_N 0x11
-#define HID_KEY_O 0x12
-#define HID_KEY_P 0x13
-#define HID_KEY_Q 0x14
-#define HID_KEY_R 0x15
-#define HID_KEY_S 0x16
-#define HID_KEY_T 0x17
-#define HID_KEY_U 0x18
-#define HID_KEY_V 0x19
-#define HID_KEY_W 0x1A
-#define HID_KEY_X 0x1B
-#define HID_KEY_Y 0x1C
-#define HID_KEY_Z 0x1D
-#define HID_KEY_1 0x1E
-#define HID_KEY_2 0x1F
-#define HID_KEY_3 0x20
-#define HID_KEY_4 0x21
-#define HID_KEY_5 0x22
-#define HID_KEY_6 0x23
-#define HID_KEY_7 0x24
-#define HID_KEY_8 0x25
-#define HID_KEY_9 0x26
-#define HID_KEY_0 0x27
-#define HID_KEY_ENTER 0x28
-#define HID_KEY_ESCAPE 0x29
-#define HID_KEY_BACKSPACE 0x2A
-#define HID_KEY_TAB 0x2B
-#define HID_KEY_SPACE 0x2C
-#define HID_KEY_MINUS 0x2D
-#define HID_KEY_EQUAL 0x2E
-#define HID_KEY_BRACKET_LEFT 0x2F
-#define HID_KEY_BRACKET_RIGHT 0x30
-#define HID_KEY_BACKSLASH 0x31
-#define HID_KEY_EUROPE_1 0x32
-#define HID_KEY_SEMICOLON 0x33
-#define HID_KEY_APOSTROPHE 0x34
-#define HID_KEY_GRAVE 0x35
-#define HID_KEY_COMMA 0x36
-#define HID_KEY_PERIOD 0x37
-#define HID_KEY_SLASH 0x38
-#define HID_KEY_CAPS_LOCK 0x39
-#define HID_KEY_F1 0x3A
-#define HID_KEY_F2 0x3B
-#define HID_KEY_F3 0x3C
-#define HID_KEY_F4 0x3D
-#define HID_KEY_F5 0x3E
-#define HID_KEY_F6 0x3F
-#define HID_KEY_F7 0x40
-#define HID_KEY_F8 0x41
-#define HID_KEY_F9 0x42
-#define HID_KEY_F10 0x43
-#define HID_KEY_F11 0x44
-#define HID_KEY_F12 0x45
-#define HID_KEY_PRINT_SCREEN 0x46
-#define HID_KEY_SCROLL_LOCK 0x47
-#define HID_KEY_PAUSE 0x48
-#define HID_KEY_INSERT 0x49
-#define HID_KEY_HOME 0x4A
-#define HID_KEY_PAGE_UP 0x4B
-#define HID_KEY_DELETE 0x4C
-#define HID_KEY_END 0x4D
-#define HID_KEY_PAGE_DOWN 0x4E
-#define HID_KEY_ARROW_RIGHT 0x4F
-#define HID_KEY_ARROW_LEFT 0x50
-#define HID_KEY_ARROW_DOWN 0x51
-#define HID_KEY_ARROW_UP 0x52
-#define HID_KEY_NUM_LOCK 0x53
-#define HID_KEY_KEYPAD_DIVIDE 0x54
-#define HID_KEY_KEYPAD_MULTIPLY 0x55
-#define HID_KEY_KEYPAD_SUBTRACT 0x56
-#define HID_KEY_KEYPAD_ADD 0x57
-#define HID_KEY_KEYPAD_ENTER 0x58
-#define HID_KEY_KEYPAD_1 0x59
-#define HID_KEY_KEYPAD_2 0x5A
-#define HID_KEY_KEYPAD_3 0x5B
-#define HID_KEY_KEYPAD_4 0x5C
-#define HID_KEY_KEYPAD_5 0x5D
-#define HID_KEY_KEYPAD_6 0x5E
-#define HID_KEY_KEYPAD_7 0x5F
-#define HID_KEY_KEYPAD_8 0x60
-#define HID_KEY_KEYPAD_9 0x61
-#define HID_KEY_KEYPAD_0 0x62
-#define HID_KEY_KEYPAD_DECIMAL 0x63
-#define HID_KEY_EUROPE_2 0x64
-#define HID_KEY_APPLICATION 0x65
-#define HID_KEY_POWER 0x66
-#define HID_KEY_KEYPAD_EQUAL 0x67
-#define HID_KEY_F13 0x68
-#define HID_KEY_F14 0x69
-#define HID_KEY_F15 0x6A
-#define HID_KEY_F16 0x6B
-#define HID_KEY_F17 0x6C
-#define HID_KEY_F18 0x6D
-#define HID_KEY_F19 0x6E
-#define HID_KEY_F20 0x6F
-#define HID_KEY_F21 0x70
-#define HID_KEY_F22 0x71
-#define HID_KEY_F23 0x72
-#define HID_KEY_F24 0x73
-#define HID_KEY_EXECUTE 0x74
-#define HID_KEY_HELP 0x75
-#define HID_KEY_MENU 0x76
-#define HID_KEY_SELECT 0x77
-#define HID_KEY_STOP 0x78
-#define HID_KEY_AGAIN 0x79
-#define HID_KEY_UNDO 0x7A
-#define HID_KEY_CUT 0x7B
-#define HID_KEY_COPY 0x7C
-#define HID_KEY_PASTE 0x7D
-#define HID_KEY_FIND 0x7E
-#define HID_KEY_MUTE 0x7F
-#define HID_KEY_VOLUME_UP 0x80
-#define HID_KEY_VOLUME_DOWN 0x81
-#define HID_KEY_LOCKING_CAPS_LOCK 0x82
-#define HID_KEY_LOCKING_NUM_LOCK 0x83
-#define HID_KEY_LOCKING_SCROLL_LOCK 0x84
-#define HID_KEY_KEYPAD_COMMA 0x85
-#define HID_KEY_KEYPAD_EQUAL_SIGN 0x86
-#define HID_KEY_KANJI1 0x87
-#define HID_KEY_KANJI2 0x88
-#define HID_KEY_KANJI3 0x89
-#define HID_KEY_KANJI4 0x8A
-#define HID_KEY_KANJI5 0x8B
-#define HID_KEY_KANJI6 0x8C
-#define HID_KEY_KANJI7 0x8D
-#define HID_KEY_KANJI8 0x8E
-#define HID_KEY_KANJI9 0x8F
-#define HID_KEY_LANG1 0x90
-#define HID_KEY_LANG2 0x91
-#define HID_KEY_LANG3 0x92
-#define HID_KEY_LANG4 0x93
-#define HID_KEY_LANG5 0x94
-#define HID_KEY_LANG6 0x95
-#define HID_KEY_LANG7 0x96
-#define HID_KEY_LANG8 0x97
-#define HID_KEY_LANG9 0x98
-#define HID_KEY_ALTERNATE_ERASE 0x99
-#define HID_KEY_SYSREQ_ATTENTION 0x9A
-#define HID_KEY_CANCEL 0x9B
-#define HID_KEY_CLEAR 0x9C
-#define HID_KEY_PRIOR 0x9D
-#define HID_KEY_RETURN 0x9E
-#define HID_KEY_SEPARATOR 0x9F
-#define HID_KEY_OUT 0xA0
-#define HID_KEY_OPER 0xA1
-#define HID_KEY_CLEAR_AGAIN 0xA2
-#define HID_KEY_CRSEL_PROPS 0xA3
-#define HID_KEY_EXSEL 0xA4
-// RESERVED 0xA5-DF
-#define HID_KEY_CONTROL_LEFT 0xE0
-#define HID_KEY_SHIFT_LEFT 0xE1
-#define HID_KEY_ALT_LEFT 0xE2
-#define HID_KEY_GUI_LEFT 0xE3
-#define HID_KEY_CONTROL_RIGHT 0xE4
-#define HID_KEY_SHIFT_RIGHT 0xE5
-#define HID_KEY_ALT_RIGHT 0xE6
-#define HID_KEY_GUI_RIGHT 0xE7
+#define HID_KEY_NONE 0x00
+#define HID_KEY_A 0x04
+#define HID_KEY_B 0x05
+#define HID_KEY_C 0x06
+#define HID_KEY_D 0x07
+#define HID_KEY_E 0x08
+#define HID_KEY_F 0x09
+#define HID_KEY_G 0x0A
+#define HID_KEY_H 0x0B
+#define HID_KEY_I 0x0C
+#define HID_KEY_J 0x0D
+#define HID_KEY_K 0x0E
+#define HID_KEY_L 0x0F
+#define HID_KEY_M 0x10
+#define HID_KEY_N 0x11
+#define HID_KEY_O 0x12
+#define HID_KEY_P 0x13
+#define HID_KEY_Q 0x14
+#define HID_KEY_R 0x15
+#define HID_KEY_S 0x16
+#define HID_KEY_T 0x17
+#define HID_KEY_U 0x18
+#define HID_KEY_V 0x19
+#define HID_KEY_W 0x1A
+#define HID_KEY_X 0x1B
+#define HID_KEY_Y 0x1C
+#define HID_KEY_Z 0x1D
+#define HID_KEY_1 0x1E
+#define HID_KEY_2 0x1F
+#define HID_KEY_3 0x20
+#define HID_KEY_4 0x21
+#define HID_KEY_5 0x22
+#define HID_KEY_6 0x23
+#define HID_KEY_7 0x24
+#define HID_KEY_8 0x25
+#define HID_KEY_9 0x26
+#define HID_KEY_0 0x27
+#define HID_KEY_ENTER 0x28
+#define HID_KEY_ESCAPE 0x29
+#define HID_KEY_BACKSPACE 0x2A
+#define HID_KEY_TAB 0x2B
+#define HID_KEY_SPACE 0x2C
+#define HID_KEY_MINUS 0x2D
+#define HID_KEY_EQUAL 0x2E
+#define HID_KEY_BRACKET_LEFT 0x2F
+#define HID_KEY_BRACKET_RIGHT 0x30
+#define HID_KEY_BACKSLASH 0x31
+#define HID_KEY_EUROPE_1 0x32
+#define HID_KEY_SEMICOLON 0x33
+#define HID_KEY_APOSTROPHE 0x34
+#define HID_KEY_GRAVE 0x35
+#define HID_KEY_COMMA 0x36
+#define HID_KEY_PERIOD 0x37
+#define HID_KEY_SLASH 0x38
+#define HID_KEY_CAPS_LOCK 0x39
+#define HID_KEY_F1 0x3A
+#define HID_KEY_F2 0x3B
+#define HID_KEY_F3 0x3C
+#define HID_KEY_F4 0x3D
+#define HID_KEY_F5 0x3E
+#define HID_KEY_F6 0x3F
+#define HID_KEY_F7 0x40
+#define HID_KEY_F8 0x41
+#define HID_KEY_F9 0x42
+#define HID_KEY_F10 0x43
+#define HID_KEY_F11 0x44
+#define HID_KEY_F12 0x45
+#define HID_KEY_PRINT_SCREEN 0x46
+#define HID_KEY_SCROLL_LOCK 0x47
+#define HID_KEY_PAUSE 0x48
+#define HID_KEY_INSERT 0x49
+#define HID_KEY_HOME 0x4A
+#define HID_KEY_PAGE_UP 0x4B
+#define HID_KEY_DELETE 0x4C
+#define HID_KEY_END 0x4D
+#define HID_KEY_PAGE_DOWN 0x4E
+#define HID_KEY_ARROW_RIGHT 0x4F
+#define HID_KEY_ARROW_LEFT 0x50
+#define HID_KEY_ARROW_DOWN 0x51
+#define HID_KEY_ARROW_UP 0x52
+#define HID_KEY_NUM_LOCK 0x53
+#define HID_KEY_KEYPAD_DIVIDE 0x54
+#define HID_KEY_KEYPAD_MULTIPLY 0x55
+#define HID_KEY_KEYPAD_SUBTRACT 0x56
+#define HID_KEY_KEYPAD_ADD 0x57
+#define HID_KEY_KEYPAD_ENTER 0x58
+#define HID_KEY_KEYPAD_1 0x59
+#define HID_KEY_KEYPAD_2 0x5A
+#define HID_KEY_KEYPAD_3 0x5B
+#define HID_KEY_KEYPAD_4 0x5C
+#define HID_KEY_KEYPAD_5 0x5D
+#define HID_KEY_KEYPAD_6 0x5E
+#define HID_KEY_KEYPAD_7 0x5F
+#define HID_KEY_KEYPAD_8 0x60
+#define HID_KEY_KEYPAD_9 0x61
+#define HID_KEY_KEYPAD_0 0x62
+#define HID_KEY_KEYPAD_DECIMAL 0x63
+#define HID_KEY_EUROPE_2 0x64
+#define HID_KEY_APPLICATION 0x65
+#define HID_KEY_POWER 0x66
+#define HID_KEY_KEYPAD_EQUAL 0x67
+#define HID_KEY_F13 0x68
+#define HID_KEY_F14 0x69
+#define HID_KEY_F15 0x6A
+#define HID_KEY_F16 0x6B
+#define HID_KEY_F17 0x6C
+#define HID_KEY_F18 0x6D
+#define HID_KEY_F19 0x6E
+#define HID_KEY_F20 0x6F
+#define HID_KEY_F21 0x70
+#define HID_KEY_F22 0x71
+#define HID_KEY_F23 0x72
+#define HID_KEY_F24 0x73
+#define HID_KEY_EXECUTE 0x74
+#define HID_KEY_HELP 0x75
+#define HID_KEY_MENU 0x76
+#define HID_KEY_SELECT 0x77
+#define HID_KEY_STOP 0x78
+#define HID_KEY_AGAIN 0x79
+#define HID_KEY_UNDO 0x7A
+#define HID_KEY_CUT 0x7B
+#define HID_KEY_COPY 0x7C
+#define HID_KEY_PASTE 0x7D
+#define HID_KEY_FIND 0x7E
+#define HID_KEY_MUTE 0x7F
+#define HID_KEY_VOLUME_UP 0x80
+#define HID_KEY_VOLUME_DOWN 0x81
+#define HID_KEY_LOCKING_CAPS_LOCK 0x82
+#define HID_KEY_LOCKING_NUM_LOCK 0x83
+#define HID_KEY_LOCKING_SCROLL_LOCK 0x84
+#define HID_KEY_KEYPAD_COMMA 0x85
+#define HID_KEY_KEYPAD_EQUAL_SIGN 0x86
+#define HID_KEY_KANJI1 0x87
+#define HID_KEY_KANJI2 0x88
+#define HID_KEY_KANJI3 0x89
+#define HID_KEY_KANJI4 0x8A
+#define HID_KEY_KANJI5 0x8B
+#define HID_KEY_KANJI6 0x8C
+#define HID_KEY_KANJI7 0x8D
+#define HID_KEY_KANJI8 0x8E
+#define HID_KEY_KANJI9 0x8F
+#define HID_KEY_LANG1 0x90
+#define HID_KEY_LANG2 0x91
+#define HID_KEY_LANG3 0x92
+#define HID_KEY_LANG4 0x93
+#define HID_KEY_LANG5 0x94
+#define HID_KEY_LANG6 0x95
+#define HID_KEY_LANG7 0x96
+#define HID_KEY_LANG8 0x97
+#define HID_KEY_LANG9 0x98
+#define HID_KEY_ALTERNATE_ERASE 0x99
+#define HID_KEY_SYSREQ_ATTENTION 0x9A
+#define HID_KEY_CANCEL 0x9B
+#define HID_KEY_CLEAR 0x9C
+#define HID_KEY_PRIOR 0x9D
+#define HID_KEY_RETURN 0x9E
+#define HID_KEY_SEPARATOR 0x9F
+#define HID_KEY_OUT 0xA0
+#define HID_KEY_OPER 0xA1
+#define HID_KEY_CLEAR_AGAIN 0xA2
+#define HID_KEY_CRSEL_PROPS 0xA3
+#define HID_KEY_EXSEL 0xA4
+// RESERVED 0xA5-AF
+#define HID_KEY_KEYPAD_00 0xB0
+#define HID_KEY_KEYPAD_000 0xB1
+#define HID_KEY_THOUSANDS_SEPARATOR 0xB2
+#define HID_KEY_DECIMAL_SEPARATOR 0xB3
+#define HID_KEY_CURRENCY_UNIT 0xB4
+#define HID_KEY_CURRENCY_SUBUNIT 0xB5
+#define HID_KEY_KEYPAD_LEFT_PARENTHESIS 0xB6
+#define HID_KEY_KEYPAD_RIGHT_PARENTHESIS 0xB7
+#define HID_KEY_KEYPAD_LEFT_BRACE 0xB8
+#define HID_KEY_KEYPAD_RIGHT_BRACE 0xB9
+#define HID_KEY_KEYPAD_TAB 0xBA
+#define HID_KEY_KEYPAD_BACKSPACE 0xBB
+#define HID_KEY_KEYPAD_A 0xBC
+#define HID_KEY_KEYPAD_B 0xBD
+#define HID_KEY_KEYPAD_C 0xBE
+#define HID_KEY_KEYPAD_D 0xBF
+#define HID_KEY_KEYPAD_E 0xC0
+#define HID_KEY_KEYPAD_F 0xC1
+#define HID_KEY_KEYPAD_XOR 0xC2
+#define HID_KEY_KEYPAD_CARET 0xC3
+#define HID_KEY_KEYPAD_PERCENT 0xC4
+#define HID_KEY_KEYPAD_LESS_THAN 0xC5
+#define HID_KEY_KEYPAD_GREATER_THAN 0xC6
+#define HID_KEY_KEYPAD_AMPERSAND 0xC7
+#define HID_KEY_KEYPAD_DOUBLE_AMPERSAND 0xC8
+#define HID_KEY_KEYPAD_VERTICAL_BAR 0xC9
+#define HID_KEY_KEYPAD_DOUBLE_VERTICAL_BAR 0xCA
+#define HID_KEY_KEYPAD_COLON 0xCB
+#define HID_KEY_KEYPAD_HASH 0xCC
+#define HID_KEY_KEYPAD_SPACE 0xCD
+#define HID_KEY_KEYPAD_AT 0xCE
+#define HID_KEY_KEYPAD_EXCLAMATION 0xCF
+#define HID_KEY_KEYPAD_MEMORY_STORE 0xD0
+#define HID_KEY_KEYPAD_MEMORY_RECALL 0xD1
+#define HID_KEY_KEYPAD_MEMORY_CLEAR 0xD2
+#define HID_KEY_KEYPAD_MEMORY_ADD 0xD3
+#define HID_KEY_KEYPAD_MEMORY_SUBTRACT 0xD4
+#define HID_KEY_KEYPAD_MEMORY_MULTIPLY 0xD5
+#define HID_KEY_KEYPAD_MEMORY_DIVIDE 0xD6
+#define HID_KEY_KEYPAD_PLUS_MINUS 0xD7
+#define HID_KEY_KEYPAD_CLEAR 0xD8
+#define HID_KEY_KEYPAD_CLEAR_ENTRY 0xD9
+#define HID_KEY_KEYPAD_BINARY 0xDA
+#define HID_KEY_KEYPAD_OCTAL 0xDB
+#define HID_KEY_KEYPAD_DECIMAL_2 0xDC
+#define HID_KEY_KEYPAD_HEXADECIMAL 0xDD
+// RESERVED 0xDE-DF
+#define HID_KEY_CONTROL_LEFT 0xE0
+#define HID_KEY_SHIFT_LEFT 0xE1
+#define HID_KEY_ALT_LEFT 0xE2
+#define HID_KEY_GUI_LEFT 0xE3
+#define HID_KEY_CONTROL_RIGHT 0xE4
+#define HID_KEY_SHIFT_RIGHT 0xE5
+#define HID_KEY_ALT_RIGHT 0xE6
+#define HID_KEY_GUI_RIGHT 0xE7
//--------------------------------------------------------------------+
diff --git a/src/class/net/ncm_device.c b/src/class/net/ncm_device.c
index 4b237e4cf..64aba011a 100644
--- a/src/class/net/ncm_device.c
+++ b/src/class/net/ncm_device.c
@@ -112,7 +112,7 @@ typedef struct {
bool notification_xmit_is_running; // notification is currently transmitted
} ncm_interface_t;
-CFG_TUSB_MEM_SECTION CFG_TUSB_MEM_ALIGN tu_static ncm_interface_t ncm_interface;
+CFG_TUD_MEM_SECTION CFG_TUD_MEM_ALIGN tu_static ncm_interface_t ncm_interface;
/**
* This is the NTB parameter structure
@@ -120,7 +120,7 @@ CFG_TUSB_MEM_SECTION CFG_TUSB_MEM_ALIGN tu_static ncm_interface_t ncm_interface;
* \attention
* We are lucky, that byte order is correct
*/
-CFG_TUSB_MEM_SECTION CFG_TUSB_MEM_ALIGN tu_static const ntb_parameters_t ntb_parameters = {
+CFG_TUD_MEM_SECTION CFG_TUD_MEM_ALIGN tu_static const ntb_parameters_t ntb_parameters = {
.wLength = sizeof(ntb_parameters_t),
.bmNtbFormatsSupported = 0x01,// 16-bit NTB supported
.dwNtbInMaxSize = CFG_TUD_NCM_IN_NTB_MAX_SIZE,
@@ -285,7 +285,7 @@ static xmit_ntb_t *xmit_get_next_ready_ntb(void) {
* This must be called from netd_xfer_cb() so that ep_in is ready
*/
static bool xmit_insert_required_zlp(uint8_t rhport, uint32_t xferred_bytes) {
- TU_LOG_DRV("xmit_insert_required_zlp(%d,%d)\n", rhport, xferred_bytes);
+ TU_LOG_DRV("xmit_insert_required_zlp(%d,%ld)\n", rhport, xferred_bytes);
if (xferred_bytes == 0 || xferred_bytes % CFG_TUD_NET_ENDPOINT_SIZE != 0) {
return false;
@@ -521,11 +521,11 @@ static bool recv_validate_datagram(const recv_ntb_t *ntb, uint32_t len) {
return false;
}
if (len < sizeof(nth16_t) + sizeof(ndp16_t) + 2 * sizeof(ndp16_datagram_t)) {
- TU_LOG_DRV("(EE) ill min len: %d\n", len);
+ TU_LOG_DRV("(EE) ill min len: %lu\n", len);
return false;
}
if (nth16->wBlockLength > len) {
- TU_LOG_DRV("(EE) ill block length: %d > %d\n", nth16->wBlockLength, len);
+ TU_LOG_DRV("(EE) ill block length: %d > %lu\n", nth16->wBlockLength, len);
return false;
}
if (nth16->wBlockLength > CFG_TUD_NCM_OUT_NTB_MAX_SIZE) {
@@ -533,7 +533,7 @@ static bool recv_validate_datagram(const recv_ntb_t *ntb, uint32_t len) {
return false;
}
if (nth16->wNdpIndex < sizeof(nth16) || nth16->wNdpIndex > len - (sizeof(ndp16_t) + 2 * sizeof(ndp16_datagram_t))) {
- TU_LOG_DRV("(EE) ill position of first ndp: %d (%d)\n", nth16->wNdpIndex, len);
+ TU_LOG_DRV("(EE) ill position of first ndp: %d (%lu)\n", nth16->wNdpIndex, len);
return false;
}
@@ -567,11 +567,11 @@ static bool recv_validate_datagram(const recv_ntb_t *ntb, uint32_t len) {
while (ndp16_datagram[ndx].wDatagramIndex != 0 && ndp16_datagram[ndx].wDatagramLength != 0) {
TU_LOG_DRV(" << %d %d\n", ndp16_datagram[ndx].wDatagramIndex, ndp16_datagram[ndx].wDatagramLength);
if (ndp16_datagram[ndx].wDatagramIndex > len) {
- TU_LOG_DRV("(EE) ill start of datagram[%d]: %d (%d)\n", ndx, ndp16_datagram[ndx].wDatagramIndex, len);
+ TU_LOG_DRV("(EE) ill start of datagram[%d]: %d (%lu)\n", ndx, ndp16_datagram[ndx].wDatagramIndex, len);
return false;
}
if (ndp16_datagram[ndx].wDatagramIndex + ndp16_datagram[ndx].wDatagramLength > len) {
- TU_LOG_DRV("(EE) ill end of datagram[%d]: %d (%d)\n", ndx, ndp16_datagram[ndx].wDatagramIndex + ndp16_datagram[ndx].wDatagramLength, len);
+ TU_LOG_DRV("(EE) ill end of datagram[%d]: %d (%lu)\n", ndx, ndp16_datagram[ndx].wDatagramIndex + ndp16_datagram[ndx].wDatagramLength, len);
return false;
}
++ndx;
diff --git a/src/device/usbd.c b/src/device/usbd.c
index 6aeaa699f..e33f39bcf 100644
--- a/src/device/usbd.c
+++ b/src/device/usbd.c
@@ -56,6 +56,10 @@ TU_ATTR_WEAK void tud_event_hook_cb(uint8_t rhport, uint32_t eventid, bool in_is
(void)in_isr;
}
+TU_ATTR_WEAK void tud_sof_cb(uint32_t frame_count) {
+ (void)frame_count;
+}
+
//--------------------------------------------------------------------+
// Device Data
//--------------------------------------------------------------------+
@@ -76,6 +80,7 @@ typedef struct {
volatile uint8_t cfg_num; // current active configuration (0x00 is not configured)
uint8_t speed;
volatile uint8_t setup_count;
+ volatile uint8_t sof_consumer;
uint8_t itf2drv[CFG_TUD_INTERFACE_MAX]; // map interface number to driver (0xff is invalid)
uint8_t ep2drv[CFG_TUD_ENDPPOINT_MAX][2]; // map endpoint to driver ( 0xff is invalid ), can use only 4-bit each
@@ -275,6 +280,7 @@ TU_ATTR_ALWAYS_INLINE static inline usbd_class_driver_t const * get_driver(uint8
return driver;
}
+
//--------------------------------------------------------------------+
// DCD Event
//--------------------------------------------------------------------+
@@ -382,6 +388,12 @@ bool tud_connect(void) {
return true;
}
+bool tud_sof_cb_enable(bool en)
+{
+ usbd_sof_enable(_usbd_rhport, SOF_CONSUMER_USER, en);
+ return true;
+}
+
//--------------------------------------------------------------------+
// USBD Task
//--------------------------------------------------------------------+
@@ -612,6 +624,12 @@ void tud_task_ext(uint32_t timeout_ms, bool in_isr) {
break;
case DCD_EVENT_SOF:
+ if (tu_bit_test(_usbd_dev.sof_consumer, SOF_CONSUMER_USER)) {
+ TU_LOG_USBD("\r\n");
+ tud_sof_cb(event.sof.frame_count);
+ }
+ break;
+
default:
TU_BREAKPOINT();
break;
@@ -702,6 +720,9 @@ static bool process_control_request(uint8_t rhport, tusb_control_request_t const
// already configured: need to clear all endpoints and driver first
TU_LOG_USBD(" Clear current Configuration (%u) before switching\r\n", _usbd_dev.cfg_num);
+ // disable SOF
+ dcd_sof_enable(rhport, false);
+
// close all non-control endpoints, cancel all pending transfers if any
dcd_edpt_close_all(rhport);
@@ -1101,6 +1122,14 @@ TU_ATTR_FAST_FUNC void dcd_event_handler(dcd_event_t const* event, bool in_isr)
break;
case DCD_EVENT_SOF:
+ // SOF driver handler in ISR context
+ for (uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++) {
+ usbd_class_driver_t const* driver = get_driver(i);
+ if (driver && driver->sof) {
+ driver->sof(event->rhport, event->sof.frame_count);
+ }
+ }
+
// Some MCUs after running dcd_remote_wakeup() does not have way to detect the end of remote wakeup
// which last 1-15 ms. DCD can use SOF as a clear indicator that bus is back to operational
if (_usbd_dev.suspended) {
@@ -1110,15 +1139,10 @@ TU_ATTR_FAST_FUNC void dcd_event_handler(dcd_event_t const* event, bool in_isr)
queue_event(&event_resume, in_isr);
}
- // SOF driver handler in ISR context
- for (uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++) {
- usbd_class_driver_t const* driver = get_driver(i);
- if (driver && driver->sof) {
- driver->sof(event->rhport, event->sof.frame_count);
- }
+ if (tu_bit_test(_usbd_dev.sof_consumer, SOF_CONSUMER_USER)) {
+ dcd_event_t const event_sof = {.rhport = event->rhport, .event_id = DCD_EVENT_SOF};
+ queue_event(&event_sof, in_isr);
}
-
- // skip osal queue for SOF in usbd task
break;
case DCD_EVENT_SETUP_RECEIVED:
@@ -1355,12 +1379,21 @@ void usbd_edpt_close(uint8_t rhport, uint8_t ep_addr) {
return;
}
-void usbd_sof_enable(uint8_t rhport, bool en) {
+void usbd_sof_enable(uint8_t rhport, sof_consumer_t consumer, bool en) {
rhport = _usbd_rhport;
- // TODO: Check needed if all drivers including the user sof_cb does not need an active SOF ISR any more.
- // Only if all drivers switched off SOF calls the SOF interrupt may be disabled
- dcd_sof_enable(rhport, en);
+ uint8_t consumer_old = _usbd_dev.sof_consumer;
+ // Keep track how many class instances need the SOF interrupt
+ if (en) {
+ _usbd_dev.sof_consumer |= (uint8_t)(1 << consumer);
+ } else {
+ _usbd_dev.sof_consumer &= (uint8_t)(~(1 << consumer));
+ }
+
+ // Test logically unequal
+ if(!_usbd_dev.sof_consumer != !consumer_old) {
+ dcd_sof_enable(rhport, _usbd_dev.sof_consumer);
+ }
}
bool usbd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {
diff --git a/src/device/usbd.h b/src/device/usbd.h
index 3caaaca25..6216d97ac 100644
--- a/src/device/usbd.h
+++ b/src/device/usbd.h
@@ -97,6 +97,9 @@ bool tud_disconnect(void);
// Return false on unsupported MCUs
bool tud_connect(void);
+// Enable or disable the Start Of Frame callback support
+bool tud_sof_cb_enable(bool en);
+
// Carry out Data and Status stage of control transfer
// - If len = 0, it is equivalent to sending status only
// - If len > wLength : it will be truncated
@@ -152,6 +155,9 @@ TU_ATTR_WEAK void tud_resume_cb(void);
// Invoked when there is a new usb event, which need to be processed by tud_task()/tud_task_ext()
void tud_event_hook_cb(uint8_t rhport, uint32_t eventid, bool in_isr);
+// Invoked when a new (micro) frame started
+void tud_sof_cb(uint32_t frame_count);
+
// Invoked when received control request with VENDOR TYPE
TU_ATTR_WEAK bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);
diff --git a/src/device/usbd_pvt.h b/src/device/usbd_pvt.h
index 7eb504246..335d46cd8 100644
--- a/src/device/usbd_pvt.h
+++ b/src/device/usbd_pvt.h
@@ -36,6 +36,15 @@
#define TU_LOG_USBD(...) TU_LOG(CFG_TUD_LOG_LEVEL, __VA_ARGS__)
//--------------------------------------------------------------------+
+// MACRO CONSTANT TYPEDEF PROTYPES
+//--------------------------------------------------------------------+
+
+typedef enum {
+ SOF_CONSUMER_USER = 0,
+ SOF_CONSUMER_AUDIO,
+} sof_consumer_t;
+
+//--------------------------------------------------------------------+
// Class Driver API
//--------------------------------------------------------------------+
@@ -108,7 +117,7 @@ bool usbd_edpt_ready(uint8_t rhport, uint8_t ep_addr) {
}
// Enable SOF interrupt
-void usbd_sof_enable(uint8_t rhport, bool en);
+void usbd_sof_enable(uint8_t rhport, sof_consumer_t consumer, bool en);
/*------------------------------------------------------------------*/
/* Helper
diff --git a/test/hil/hil_test.py b/test/hil/hil_test.py
index dffb81765..c2699cc6f 100644
--- a/test/hil/hil_test.py
+++ b/test/hil/hil_test.py
@@ -25,10 +25,10 @@
# ACTION=="add", SUBSYSTEM=="tty", SUBSYSTEMS=="usb", MODE="0666", PROGRAM="/bin/sh -c 'echo $$ID_SERIAL_SHORT | rev | cut -c -8 | rev'", SYMLINK+="ttyUSB_%c.%s{bInterfaceNumber}"
# ACTION=="add", SUBSYSTEM=="block", SUBSYSTEMS=="usb", ENV{ID_FS_USAGE}=="filesystem", MODE="0666", PROGRAM="/bin/sh -c 'echo $$ID_SERIAL_SHORT | rev | cut -c -8 | rev'", RUN{program}+="/usr/bin/systemd-mount --no-block --automount=yes --collect $devnode /media/blkUSB_%c.%s{bInterfaceNumber}"
+import argparse
import os
import sys
import time
-import click
import serial
import subprocess
import json
@@ -318,13 +318,18 @@ def test_hid_composite_freertos(id):
# -------------------------------------------------------------
# Main
# -------------------------------------------------------------
[email protected]('config_file')
[email protected]('-b', '--board', multiple=True, default=None, help='Boards to test, all if not specified')
-def main(config_file, board):
+def main():
"""
Hardware test on specified boards
"""
+ parser = argparse.ArgumentParser()
+ parser.add_argument('config_file', help='Configuration JSON file')
+ parser.add_argument('-b', '--board', action='append', default=[], help='Boards to test, all if not specified')
+ args = parser.parse_args()
+
+ config_file = args.config_file
+ boards = args.board
+
config_file = os.path.join(os.path.dirname(__file__), config_file)
with open(config_file) as f:
config = json.load(f)
@@ -334,10 +339,10 @@ def main(config_file, board):
'cdc_dual_ports', 'cdc_msc', 'dfu', 'dfu_runtime', 'hid_boot_interface',
]
- if len(board) == 0:
+ if len(boards) == 0:
config_boards = config['boards']
else:
- config_boards = [e for e in config['boards'] if e['name'] in board]
+ config_boards = [e for e in config['boards'] if e['name'] in boards]
for item in config_boards:
name = item['name']
diff --git a/test/hil/pi4.json b/test/hil/pi4.json
index 04329bb64..bdb8a5fa5 100644
--- a/test/hil/pi4.json
+++ b/test/hil/pi4.json
@@ -22,6 +22,16 @@
"flasher_product": "ItsyBitsy M4 Express",
"flasher_reset_pin": "2",
"flasher_args": "--offset 0x4000"
+ },
+ {
+ "name": "espressif_s3_devkitm",
+ "uid": "84F703C084E4",
+ "tests": [
+ "cdc_msc_freertos", "hid_composite_freertos"
+ ],
+ "flasher": "esptool",
+ "flasher_sn": "3ea619acd1cdeb11a0a0b806e93fd3f1",
+ "flasher_args": "-b 1500000"
}
]
}
diff --git a/test/hil/pi4_esp32.json b/test/hil/pi4_esp32.json
deleted file mode 100644
index c95dd2d4e..000000000
--- a/test/hil/pi4_esp32.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "boards": [
- {
- "name": "espressif_s3_devkitm",
- "uid": "84F703C084E4",
- "tests": [
- "cdc_msc_freertos", "hid_composite_freertos"
- ],
- "flasher": "esptool",
- "flasher_sn": "3ea619acd1cdeb11a0a0b806e93fd3f1",
- "flasher_args": "-b 1500000"
- }
- ]
-}
diff --git a/tools/build.py b/tools/build.py
index 884cd56f4..967f7c95e 100644
--- a/tools/build.py
+++ b/tools/build.py
@@ -1,8 +1,8 @@
+import argparse
import os
import sys
import time
import subprocess
-import click
from pathlib import Path
from multiprocessing import Pool
@@ -125,13 +125,20 @@ def build_family(family, toolchain, build_system):
return ret
[email protected]('families', nargs=-1, required=False)
[email protected]('-b', '--board', multiple=True, default=None, help='Boards to build')
[email protected]('-t', '--toolchain', default='gcc', help='Toolchain to use, default is gcc')
[email protected]('-s', '--build-system', default='cmake', help='Build system to use, default is cmake')
-def main(families, board, toolchain, build_system):
- if len(families) == 0 and len(board) == 0:
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument('families', nargs='*', default=[], help='Families to build')
+ parser.add_argument('-b', '--board', action='append', default=[], help='Boards to build')
+ parser.add_argument('-t', '--toolchain', default='gcc', help='Toolchain to use, default is gcc')
+ parser.add_argument('-s', '--build-system', default='cmake', help='Build system to use, default is cmake')
+ args = parser.parse_args()
+
+ families = args.families
+ boards = args.board
+ toolchain = args.toolchain
+ build_system = args.build_system
+
+ if len(families) == 0 and len(boards) == 0:
print("Please specify families or board to build")
return 1
@@ -159,12 +166,23 @@ def main(families, board, toolchain, build_system):
total_result[2] += fret[2]
# build board (only cmake)
- if board is not None:
- for b in board:
- r = build_board_cmake(b, toolchain)
- total_result[0] += r[0]
- total_result[1] += r[1]
- total_result[2] += r[2]
+ if boards is not None:
+ for b in boards:
+ if build_system == 'cmake':
+ r = build_board_cmake(b, toolchain)
+ total_result[0] += r[0]
+ total_result[1] += r[1]
+ total_result[2] += r[2]
+ elif build_system == 'make':
+ all_examples = get_examples(find_family(b))
+ with Pool(processes=os.cpu_count()) as pool:
+ pool_args = list((map(lambda e, bb=b, o=f"TOOLCHAIN={toolchain}": [e, bb, o], all_examples)))
+ r = pool.starmap(build_utils.build_example, pool_args)
+ # sum all element of same index (column sum)
+ rsum = list(map(sum, list(zip(*r))))
+ total_result[0] += rsum[0]
+ total_result[1] += rsum[1]
+ total_result[2] += rsum[2]
total_time = time.monotonic() - total_time
print(build_separator)
diff --git a/tools/build_esp32.py b/tools/build_esp32.py
deleted file mode 100644
index 951467c23..000000000
--- a/tools/build_esp32.py
+++ /dev/null
@@ -1,106 +0,0 @@
-import os
-import glob
-import sys
-import subprocess
-import time
-
-import build_utils
-
-SUCCEEDED = "\033[32msucceeded\033[0m"
-FAILED = "\033[31mfailed\033[0m"
-SKIPPED = "\033[33mskipped\033[0m"
-
-success_count = 0
-fail_count = 0
-skip_count = 0
-exit_status = 0
-
-total_time = time.monotonic()
-
-build_format = '| {:30} | {:30} | {:18} | {:7} | {:6} | {:6} |'
-build_separator = '-' * 107
-
-def filter_with_input(mylist):
- if len(sys.argv) > 1:
- input_args = list(set(mylist).intersection(sys.argv))
- if len(input_args) > 0:
- mylist[:] = input_args
-
-
-# Build all examples if not specified
-all_examples = [entry.replace('examples/', '') for entry in glob.glob("examples/*/*_freertos")]
-filter_with_input(all_examples)
-all_examples.append('device/board_test')
-all_examples.sort()
-
-# Build all boards if not specified
-all_boards = []
-for entry in os.scandir("hw/bsp/espressif/boards"):
- if entry.is_dir():
- all_boards.append(entry.name)
-filter_with_input(all_boards)
-all_boards.sort()
-
-def build_board(example, board):
- global success_count, fail_count, skip_count, exit_status
- start_time = time.monotonic()
-
- # Check if board is skipped
- build_dir = f"cmake-build/cmake-build-{board}/{example}"
-
- # Generate and build
- r = subprocess.run(f"cmake examples/{example} -B {build_dir} -G \"Ninja\" -DBOARD={board} -DMAX3421_HOST=1",
- shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
- if r.returncode == 0:
- r = subprocess.run(f"cmake --build {build_dir}", shell=True, stdout=subprocess.PIPE,
- stderr=subprocess.STDOUT)
- build_duration = time.monotonic() - start_time
- flash_size = "-"
- sram_size = "-"
-
- if r.returncode == 0:
- success = SUCCEEDED
- success_count += 1
- #(flash_size, sram_size) = build_size(example, board)
- else:
- exit_status = r.returncode
- success = FAILED
- fail_count += 1
-
- title = build_format.format(example, board, success, "{:.2f}s".format(build_duration), flash_size, sram_size)
- if os.getenv('CI'):
- # always print build output if in CI
- print(f"::group::{title}")
- print(r.stdout.decode("utf-8"))
- print(f"::endgroup::")
- else:
- # print build output if failed
- print(title)
- if r.returncode != 0:
- print(r.stdout.decode("utf-8"))
-
-
-def build_size(example, board):
- #elf_file = 'examples/device/{}/_build/{}/{}-firmware.elf'.format(example, board, board)
- elf_file = 'examples/device/{}/_build/{}/*.elf'.format(example, board)
- size_output = subprocess.run('size {}'.format(elf_file), shell=True, stdout=subprocess.PIPE).stdout.decode("utf-8")
- size_list = size_output.split('\n')[1].split('\t')
- flash_size = int(size_list[0])
- sram_size = int(size_list[1]) + int(size_list[2])
- return (flash_size, sram_size)
-
-
-print(build_separator)
-print(build_format.format('Example', 'Board', '\033[39mResult\033[0m', 'Time', 'Flash', 'SRAM'))
-print(build_separator)
-
-for example in all_examples:
- for board in all_boards:
- build_board(example, board)
-
-total_time = time.monotonic() - total_time
-print(build_separator)
-print("Build Summary: {} {}, {} {}, {} {} and took {:.2f}s".format(success_count, SUCCEEDED, fail_count, FAILED, skip_count, SKIPPED, total_time))
-print(build_separator)
-
-sys.exit(exit_status)
diff --git a/tools/get_deps.py b/tools/get_deps.py
index bca38fc80..20cbe64c7 100644
--- a/tools/get_deps.py
+++ b/tools/get_deps.py
@@ -1,4 +1,4 @@
-import click
+import argparse
import sys
import subprocess
from pathlib import Path
@@ -238,28 +238,32 @@ def find_family(board):
return None
[email protected]('family', nargs=-1, required=False)
[email protected]('-b', '--board', multiple=True, default=None, help='Boards to fetch')
-def main(family, board):
- if len(family) == 0 and len(board) == 0:
- print("Please specify family or board to fetch")
- return
+def main():
+ parser = argparse.ArgumentParser()
+ parser.add_argument('families', nargs='*', default=[], help='Families to fetch')
+ parser.add_argument('-b', '--board', action='append', default=[], help='Boards to fetch')
+ args = parser.parse_args()
+
+ families = args.families
+ boards = args.board
+
+ if len(families) == 0 and len(boards) == 0:
+ print("Warning: family and board are not specified, only fetching mandatory dependencies.")
status = 0
deps = list(deps_mandatory.keys())
- if 'all' in family:
+ if 'all' in families:
deps += deps_optional.keys()
else:
- family = list(family)
- if board is not None:
- for b in board:
+ families = list(families)
+ if boards is not None:
+ for b in boards:
f = find_family(b)
if f is not None:
- family.append(f)
+ families.append(f)
- for f in family:
+ for f in families:
for d in deps_optional:
if f in deps_optional[d][2]:
deps.append(d)