mirror of
https://github.com/hathach/tinyusb.git
synced 2025-03-29 01:20:19 +00:00
Merge remote-tracking branch 'remotes/tinyusb/master' into rx_fb
This commit is contained in:
commit
33882b3e89
31
.circleci/config.yml
Normal file
31
.circleci/config.yml
Normal file
@ -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
|
@ -1,30 +1,29 @@
|
|||||||
name: Prepare to build
|
name: Get dependencies
|
||||||
|
|
||||||
inputs:
|
inputs:
|
||||||
family:
|
arg:
|
||||||
required: true
|
required: true
|
||||||
type: string
|
type: string
|
||||||
|
|
||||||
runs:
|
runs:
|
||||||
using: "composite"
|
using: "composite"
|
||||||
steps:
|
steps:
|
||||||
- name: Setup Python
|
|
||||||
uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: '3.x'
|
|
||||||
|
|
||||||
- name: Checkout pico-sdk for rp2040
|
- 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
|
uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
repository: raspberrypi/pico-sdk
|
repository: raspberrypi/pico-sdk
|
||||||
ref: develop
|
ref: develop
|
||||||
path: pico-sdk
|
path: pico-sdk
|
||||||
|
|
||||||
- name: Get Dependencies
|
- name: Linux dependencies
|
||||||
|
if: runner.os == 'Linux'
|
||||||
run: |
|
run: |
|
||||||
sudo apt install -y ninja-build
|
sudo apt install -y ninja-build
|
||||||
pip install click
|
shell: bash
|
||||||
python3 tools/get_deps.py ${{ inputs.family }}
|
|
||||||
echo >> $GITHUB_ENV "PICO_SDK_PATH=$GITHUB_WORKSPACE/pico-sdk"
|
- name: Get Dependencies
|
||||||
|
run: |
|
||||||
|
python3 tools/get_deps.py ${{ inputs.arg }}
|
||||||
|
echo "PICO_SDK_PATH=${{ github.workspace }}/pico-sdk" >> $GITHUB_ENV
|
||||||
shell: bash
|
shell: bash
|
18
.github/actions/setup_toolchain/action.yml
vendored
18
.github/actions/setup_toolchain/action.yml
vendored
@ -8,6 +8,11 @@ inputs:
|
|||||||
required: false
|
required: false
|
||||||
type: string
|
type: string
|
||||||
|
|
||||||
|
outputs:
|
||||||
|
build_option:
|
||||||
|
description: 'Build option for the toolchain e.g --toolchain clang'
|
||||||
|
value: ${{ steps.set-toolchain-option.outputs.build_option }}
|
||||||
|
|
||||||
runs:
|
runs:
|
||||||
using: "composite"
|
using: "composite"
|
||||||
steps:
|
steps:
|
||||||
@ -19,7 +24,7 @@ runs:
|
|||||||
|
|
||||||
- name: Pull ESP-IDF docker
|
- name: Pull ESP-IDF docker
|
||||||
if: inputs.toolchain == 'esp-idf'
|
if: inputs.toolchain == 'esp-idf'
|
||||||
run: docker pull espressif/idf:latest
|
run: docker pull espressif/idf:${{ inputs.toolchain_url }}
|
||||||
shell: bash
|
shell: bash
|
||||||
|
|
||||||
- name: Download Toolchain
|
- name: Download Toolchain
|
||||||
@ -29,3 +34,14 @@ runs:
|
|||||||
uses: ./.github/actions/setup_toolchain/download
|
uses: ./.github/actions/setup_toolchain/download
|
||||||
with:
|
with:
|
||||||
toolchain_url: ${{ inputs.toolchain_url }}
|
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
|
||||||
|
46
.github/workflows/build_cmake.yml
vendored
46
.github/workflows/build_cmake.yml
vendored
@ -12,6 +12,7 @@ on:
|
|||||||
- 'tools/build.py'
|
- 'tools/build.py'
|
||||||
- '.github/actions/**'
|
- '.github/actions/**'
|
||||||
- '.github/workflows/build_cmake.yml'
|
- '.github/workflows/build_cmake.yml'
|
||||||
|
- '.github/workflows/build_util.yml'
|
||||||
- '.github/workflows/ci_set_matrix.py'
|
- '.github/workflows/ci_set_matrix.py'
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ master ]
|
branches: [ master ]
|
||||||
@ -24,9 +25,10 @@ on:
|
|||||||
- 'tools/build.py'
|
- 'tools/build.py'
|
||||||
- '.github/actions/**'
|
- '.github/actions/**'
|
||||||
- '.github/workflows/build_cmake.yml'
|
- '.github/workflows/build_cmake.yml'
|
||||||
|
- '.github/workflows/build_util.yml'
|
||||||
- '.github/workflows/ci_set_matrix.py'
|
- '.github/workflows/ci_set_matrix.py'
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@ -55,7 +57,7 @@ jobs:
|
|||||||
# ---------------------------------------
|
# ---------------------------------------
|
||||||
cmake:
|
cmake:
|
||||||
needs: set-matrix
|
needs: set-matrix
|
||||||
uses: ./.github/workflows/build_family.yml
|
uses: ./.github/workflows/build_util.yml
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@ -69,14 +71,14 @@ jobs:
|
|||||||
build-system: 'cmake'
|
build-system: 'cmake'
|
||||||
toolchain: ${{ matrix.toolchain }}
|
toolchain: ${{ matrix.toolchain }}
|
||||||
toolchain_url: ${{ fromJSON(needs.set-matrix.outputs.json)[matrix.toolchain].toolchain_url }}
|
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
|
# Build Make
|
||||||
# ---------------------------------------
|
# ---------------------------------------
|
||||||
make:
|
make:
|
||||||
needs: set-matrix
|
needs: set-matrix
|
||||||
uses: ./.github/workflows/build_family.yml
|
uses: ./.github/workflows/build_util.yml
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
@ -90,4 +92,38 @@ jobs:
|
|||||||
build-system: 'make'
|
build-system: 'make'
|
||||||
toolchain: ${{ matrix.toolchain }}
|
toolchain: ${{ matrix.toolchain }}
|
||||||
toolchain_url: ${{ fromJSON(needs.set-matrix.outputs.json)[matrix.toolchain].toolchain_url }}
|
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 }}"]'
|
||||||
|
109
.github/workflows/build_esp.yml
vendored
109
.github/workflows/build_esp.yml
vendored
@ -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
|
|
64
.github/workflows/build_family.yml
vendored
64
.github/workflows/build_family.yml
vendored
@ -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
|
|
2
.github/workflows/build_iar.yml
vendored
2
.github/workflows/build_iar.yml
vendored
@ -23,7 +23,7 @@ on:
|
|||||||
- '.github/workflows/build_iar.yml'
|
- '.github/workflows/build_iar.yml'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
3
.github/workflows/build_renesas.yml
vendored
3
.github/workflows/build_renesas.yml
vendored
@ -21,7 +21,7 @@ on:
|
|||||||
- '.github/workflows/build_renesas.yml'
|
- '.github/workflows/build_renesas.yml'
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@ -65,7 +65,6 @@ jobs:
|
|||||||
|
|
||||||
- name: Get Dependencies
|
- name: Get Dependencies
|
||||||
run: |
|
run: |
|
||||||
pip install click
|
|
||||||
python3 tools/get_deps.py ${{ matrix.family }}
|
python3 tools/get_deps.py ${{ matrix.family }}
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
|
59
.github/workflows/build_util.yml
vendored
Normal file
59
.github/workflows/build_util.yml
vendored
Normal file
@ -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 }}
|
56
.github/workflows/build_win_mac.yml
vendored
56
.github/workflows/build_win_mac.yml
vendored
@ -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
|
|
2
.github/workflows/ci_set_matrix.py
vendored
2
.github/workflows/ci_set_matrix.py
vendored
@ -16,7 +16,7 @@ family_list = {
|
|||||||
"ch32v307 fomu gd32vf103": ["riscv-gcc"],
|
"ch32v307 fomu gd32vf103": ["riscv-gcc"],
|
||||||
"imxrt": ["arm-gcc", "arm-clang"],
|
"imxrt": ["arm-gcc", "arm-clang"],
|
||||||
"kinetis_k kinetis_kl kinetis_k32l2": ["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"],
|
"lpc17 lpc18 lpc40 lpc43": ["arm-gcc", "arm-clang"],
|
||||||
"lpc51 lpc54 lpc55": ["arm-gcc", "arm-clang"],
|
"lpc51 lpc54 lpc55": ["arm-gcc", "arm-clang"],
|
||||||
"mcx": ["arm-gcc"],
|
"mcx": ["arm-gcc"],
|
||||||
|
1
.github/workflows/cifuzz.yml
vendored
1
.github/workflows/cifuzz.yml
vendored
@ -12,7 +12,6 @@ on:
|
|||||||
- '**.h'
|
- '**.h'
|
||||||
jobs:
|
jobs:
|
||||||
Fuzzing:
|
Fuzzing:
|
||||||
if: false
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Build Fuzzers
|
- name: Build Fuzzers
|
||||||
|
121
.github/workflows/hil_test.yml
vendored
121
.github/workflows/hil_test.yml
vendored
@ -24,15 +24,18 @@ on:
|
|||||||
- '.github/actions/**'
|
- '.github/actions/**'
|
||||||
- '.github/workflows/hil_test.yml'
|
- '.github/workflows/hil_test.yml'
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
# ---------------------------------------
|
||||||
|
# Build Non Espressif
|
||||||
|
# ---------------------------------------
|
||||||
build:
|
build:
|
||||||
if: github.repository_owner == 'hathach'
|
if: github.repository_owner == 'hathach'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
outputs:
|
outputs:
|
||||||
BOARD_LIST: ${{ steps.parse_hil_json.outputs.BOARD_LIST }}
|
BOARDS_LIST: ${{ steps.parse_hil_json.outputs.BOARDS_LIST }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout TinyUSB
|
- name: Checkout TinyUSB
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
@ -42,38 +45,29 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
python-version: '3.x'
|
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
|
- name: Parse HIL json
|
||||||
id: parse_hil_json
|
id: parse_hil_json
|
||||||
run: |
|
run: |
|
||||||
sudo apt install -y jq
|
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
|
# Non-Espresif boards
|
||||||
uses: actions/checkout@v4
|
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:
|
with:
|
||||||
repository: raspberrypi/pico-sdk
|
toolchain: 'arm-gcc'
|
||||||
ref: develop
|
|
||||||
path: pico-sdk
|
|
||||||
|
|
||||||
- name: Get Dependencies
|
- name: Get Dependencies
|
||||||
run: |
|
uses: ./.github/actions/get_deps
|
||||||
pip install click
|
with:
|
||||||
sudo apt install -y ninja-build
|
arg: ${{ env.BOARDS_LIST }}
|
||||||
python3 tools/get_deps.py $BOARD_LIST
|
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: |
|
run: python tools/build.py $BOARDS_LIST
|
||||||
python tools/build.py $BOARD_LIST
|
|
||||||
env:
|
|
||||||
PICO_SDK_PATH: ${{ github.workspace }}/pico-sdk
|
|
||||||
|
|
||||||
- name: Upload Artifacts for Hardware Testing
|
- name: Upload Artifacts for Hardware Testing
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v4
|
||||||
@ -83,16 +77,71 @@ jobs:
|
|||||||
cmake-build/cmake-build-*/*/*/*.elf
|
cmake-build/cmake-build-*/*/*/*.elf
|
||||||
cmake-build/cmake-build-*/*/*/*.bin
|
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)
|
# 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:
|
hil-pi4:
|
||||||
if: github.repository_owner == 'hathach'
|
if: github.repository_owner == 'hathach'
|
||||||
needs: build
|
needs:
|
||||||
runs-on: [self-hosted, rp2040, nrf52840, hardware-in-the-loop]
|
- build
|
||||||
|
- build-esp
|
||||||
|
runs-on: [self-hosted, rp2040, nrf52840, esp32s3, hardware-in-the-loop]
|
||||||
env:
|
env:
|
||||||
BOARD_LIST: ${{ needs.build.outputs.BOARD_LIST }}
|
BOARDS_LIST: "${{ needs.build.outputs.BOARDS_LIST }} ${{ needs.build-esp.outputs.BOARDS_LIST }}"
|
||||||
steps:
|
steps:
|
||||||
- name: Clean workspace
|
- name: Clean workspace
|
||||||
run: |
|
run: |
|
||||||
@ -103,8 +152,7 @@ jobs:
|
|||||||
# USB bus on rpi4 is not stable, reset it before testing
|
# USB bus on rpi4 is not stable, reset it before testing
|
||||||
- name: Reset USB bus
|
- name: Reset USB bus
|
||||||
run: |
|
run: |
|
||||||
lsusb
|
# lsusb -t
|
||||||
lsusb -t
|
|
||||||
# reset VIA Labs 2.0 hub
|
# reset VIA Labs 2.0 hub
|
||||||
sudo usbreset 001/002
|
sudo usbreset 001/002
|
||||||
|
|
||||||
@ -119,7 +167,16 @@ jobs:
|
|||||||
name: hil_pi4
|
name: hil_pi4
|
||||||
path: cmake-build
|
path: cmake-build
|
||||||
|
|
||||||
|
- name: Download Artifacts
|
||||||
|
uses: actions/download-artifact@v4
|
||||||
|
with:
|
||||||
|
name: hil_pi4_esp
|
||||||
|
path: cmake-build
|
||||||
|
|
||||||
- name: Test on actual hardware
|
- name: Test on actual hardware
|
||||||
run: |
|
run: |
|
||||||
echo "BOARD_LIST=$BOARD_LIST"
|
echo "BOARDS_LIST=$BOARDS_LIST"
|
||||||
python3 test/hil/hil_test.py $BOARD_LIST pi4.json
|
echo "::group::{cmake-build contents}"
|
||||||
|
tree cmake-build
|
||||||
|
echo "::endgroup::"
|
||||||
|
python3 test/hil/hil_test.py $BOARDS_LIST pi4.json
|
||||||
|
3
.github/workflows/pre-commit.yml
vendored
3
.github/workflows/pre-commit.yml
vendored
@ -7,7 +7,7 @@ on:
|
|||||||
branches: [ master ]
|
branches: [ master ]
|
||||||
|
|
||||||
concurrency:
|
concurrency:
|
||||||
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
|
group: ${{ github.workflow }}-${{ github.ref }}
|
||||||
cancel-in-progress: true
|
cancel-in-progress: true
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@ -38,7 +38,6 @@ jobs:
|
|||||||
|
|
||||||
- name: Build Fuzzer
|
- name: Build Fuzzer
|
||||||
run: |
|
run: |
|
||||||
pip install click
|
|
||||||
export CC=clang
|
export CC=clang
|
||||||
export CXX=clang++
|
export CXX=clang++
|
||||||
fuzz_harness=$(ls -d test/fuzz/device/*/)
|
fuzz_harness=$(ls -d test/fuzz/device/*/)
|
||||||
|
@ -9,6 +9,8 @@ mcu:STM32F0
|
|||||||
mcu:KINETIS_KL
|
mcu:KINETIS_KL
|
||||||
family:broadcom_64bit
|
family:broadcom_64bit
|
||||||
family:broadcom_32bit
|
family:broadcom_32bit
|
||||||
|
family:espressif
|
||||||
board:curiosity_nano
|
board:curiosity_nano
|
||||||
board:frdm_kl25z
|
board:frdm_kl25z
|
||||||
family:espressif
|
# lpc55 has weird error 'ncm_interface' causes a section type conflict with 'ntb_parameters'
|
||||||
|
family:lpc55
|
||||||
|
@ -12,3 +12,5 @@ board:lpcxpresso11u68
|
|||||||
board:stm32f303disco
|
board:stm32f303disco
|
||||||
board:stm32l412nucleo
|
board:stm32l412nucleo
|
||||||
board:ek_tm4c123gxl
|
board:ek_tm4c123gxl
|
||||||
|
board:uno_r4
|
||||||
|
board:ra4m1_ek
|
||||||
|
@ -8,5 +8,4 @@ mcu:MIMXRT10XX
|
|||||||
mcu:MIMXRT11XX
|
mcu:MIMXRT11XX
|
||||||
mcu:MSP432E4
|
mcu:MSP432E4
|
||||||
mcu:RX65X
|
mcu:RX65X
|
||||||
mcu:RAXXX
|
|
||||||
mcu:MAX3421
|
mcu:MAX3421
|
||||||
|
@ -22,8 +22,8 @@ LDFLAGS_GCC += --specs=nosys.specs --specs=nano.specs
|
|||||||
|
|
||||||
SRC_C += \
|
SRC_C += \
|
||||||
src/portable/nxp/lpc17_40/dcd_lpc17_40.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/nxp/lpc17_40/hcd_lpc17_40.c \
|
||||||
|
src/portable/ohci/ohci.c \
|
||||||
$(MCU_DIR)/../gcc/cr_startup_lpc175x_6x.c \
|
$(MCU_DIR)/../gcc/cr_startup_lpc175x_6x.c \
|
||||||
$(MCU_DIR)/src/chip_17xx_40xx.c \
|
$(MCU_DIR)/src/chip_17xx_40xx.c \
|
||||||
$(MCU_DIR)/src/clock_17xx_40xx.c \
|
$(MCU_DIR)/src/clock_17xx_40xx.c \
|
||||||
|
@ -20,6 +20,8 @@ LDFLAGS_GCC += --specs=nosys.specs --specs=nano.specs
|
|||||||
# All source paths should be relative to the top level.
|
# All source paths should be relative to the top level.
|
||||||
SRC_C += \
|
SRC_C += \
|
||||||
src/portable/nxp/lpc17_40/dcd_lpc17_40.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)/../gcc/cr_startup_lpc40xx.c \
|
||||||
$(MCU_DIR)/src/chip_17xx_40xx.c \
|
$(MCU_DIR)/src/chip_17xx_40xx.c \
|
||||||
$(MCU_DIR)/src/clock_17xx_40xx.c \
|
$(MCU_DIR)/src/clock_17xx_40xx.c \
|
||||||
|
@ -5,33 +5,45 @@ cwd = GetCurrentDir()
|
|||||||
src = Split("""
|
src = Split("""
|
||||||
../../src/tusb.c
|
../../src/tusb.c
|
||||||
../../src/common/tusb_fifo.c
|
../../src/common/tusb_fifo.c
|
||||||
../../src/device/usbd.c
|
|
||||||
../../src/device/usbd_control.c
|
|
||||||
./tusb_rt_thread_port.c
|
./tusb_rt_thread_port.c
|
||||||
""")
|
""")
|
||||||
path = [cwd, cwd + "/../../src"]
|
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"]
|
|
||||||
|
|
||||||
if GetDepend(["SOC_NRF52840"]):
|
|
||||||
src += ["../../src/portable/nordic/nrf5x/dcd_nrf5x.c"]
|
|
||||||
|
|
||||||
if GetDepend(["SOC_FAMILY_RENESAS"]):
|
|
||||||
src += ["../../src/portable/renesas/rusb2/dcd_rusb2.c",
|
|
||||||
"../../src/portable/renesas/rusb2/rusb2_common.c"]
|
|
||||||
|
|
||||||
# Device class
|
|
||||||
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"]
|
|
||||||
|
|
||||||
LOCAL_CFLAGS = ''
|
LOCAL_CFLAGS = ''
|
||||||
|
|
||||||
|
# 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_NRF52840"]):
|
||||||
|
src += ["../../src/portable/nordic/nrf5x/dcd_nrf5x.c"]
|
||||||
|
|
||||||
|
if GetDepend(["SOC_FAMILY_RENESAS"]):
|
||||||
|
src += ["../../src/portable/renesas/rusb2/dcd_rusb2.c",
|
||||||
|
"../../src/portable/renesas/rusb2/rusb2_common.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"]
|
||||||
|
|
||||||
|
|
||||||
if rtconfig.PLATFORM == 'gcc' or rtconfig.PLATFORM == 'armclang': # GCC or Keil AC6
|
if rtconfig.PLATFORM == 'gcc' or rtconfig.PLATFORM == 'armclang': # GCC or Keil AC6
|
||||||
LOCAL_CFLAGS += ' -std=c99'
|
LOCAL_CFLAGS += ' -std=c99'
|
||||||
elif rtconfig.PLATFORM == 'armcc': # Keil AC5
|
elif rtconfig.PLATFORM == 'armcc': # Keil AC5
|
||||||
|
@ -113,6 +113,11 @@ extern "C" {
|
|||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
// DEVICE CONFIGURATION
|
// 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
|
#ifndef CFG_TUD_ENDPOINT0_SIZE
|
||||||
#define CFG_TUD_ENDPOINT0_SIZE PKG_TINYUSB_EDPT0_SIZE
|
#define CFG_TUD_ENDPOINT0_SIZE PKG_TINYUSB_EDPT0_SIZE
|
||||||
@ -138,6 +143,72 @@ extern "C" {
|
|||||||
#define PKG_TINYUSB_DEVICE_HID_STRING ""
|
#define PKG_TINYUSB_DEVICE_HID_STRING ""
|
||||||
#endif
|
#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
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,12 @@ static void tusb_thread_entry(void *parameter)
|
|||||||
(void) parameter;
|
(void) parameter;
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
|
#if CFG_TUH_ENABLED
|
||||||
|
tuh_task();
|
||||||
|
#endif
|
||||||
|
#if CFG_TUD_ENABLED
|
||||||
tud_task();
|
tud_task();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2093,7 +2093,7 @@ static bool audiod_set_interface(uint8_t rhport, tusb_control_request_t const *
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (disable) usbd_sof_enable(rhport, false);
|
if (disable) usbd_sof_enable(rhport, SOF_CONSUMER_AUDIO, false);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL
|
#if CFG_TUD_AUDIO_ENABLE_EP_IN && CFG_TUD_AUDIO_EP_IN_FLOW_CONTROL
|
||||||
|
@ -366,177 +366,224 @@ typedef enum
|
|||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// HID KEYCODE
|
// HID KEYCODE
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
#define HID_KEY_NONE 0x00
|
#define HID_KEY_NONE 0x00
|
||||||
#define HID_KEY_A 0x04
|
#define HID_KEY_A 0x04
|
||||||
#define HID_KEY_B 0x05
|
#define HID_KEY_B 0x05
|
||||||
#define HID_KEY_C 0x06
|
#define HID_KEY_C 0x06
|
||||||
#define HID_KEY_D 0x07
|
#define HID_KEY_D 0x07
|
||||||
#define HID_KEY_E 0x08
|
#define HID_KEY_E 0x08
|
||||||
#define HID_KEY_F 0x09
|
#define HID_KEY_F 0x09
|
||||||
#define HID_KEY_G 0x0A
|
#define HID_KEY_G 0x0A
|
||||||
#define HID_KEY_H 0x0B
|
#define HID_KEY_H 0x0B
|
||||||
#define HID_KEY_I 0x0C
|
#define HID_KEY_I 0x0C
|
||||||
#define HID_KEY_J 0x0D
|
#define HID_KEY_J 0x0D
|
||||||
#define HID_KEY_K 0x0E
|
#define HID_KEY_K 0x0E
|
||||||
#define HID_KEY_L 0x0F
|
#define HID_KEY_L 0x0F
|
||||||
#define HID_KEY_M 0x10
|
#define HID_KEY_M 0x10
|
||||||
#define HID_KEY_N 0x11
|
#define HID_KEY_N 0x11
|
||||||
#define HID_KEY_O 0x12
|
#define HID_KEY_O 0x12
|
||||||
#define HID_KEY_P 0x13
|
#define HID_KEY_P 0x13
|
||||||
#define HID_KEY_Q 0x14
|
#define HID_KEY_Q 0x14
|
||||||
#define HID_KEY_R 0x15
|
#define HID_KEY_R 0x15
|
||||||
#define HID_KEY_S 0x16
|
#define HID_KEY_S 0x16
|
||||||
#define HID_KEY_T 0x17
|
#define HID_KEY_T 0x17
|
||||||
#define HID_KEY_U 0x18
|
#define HID_KEY_U 0x18
|
||||||
#define HID_KEY_V 0x19
|
#define HID_KEY_V 0x19
|
||||||
#define HID_KEY_W 0x1A
|
#define HID_KEY_W 0x1A
|
||||||
#define HID_KEY_X 0x1B
|
#define HID_KEY_X 0x1B
|
||||||
#define HID_KEY_Y 0x1C
|
#define HID_KEY_Y 0x1C
|
||||||
#define HID_KEY_Z 0x1D
|
#define HID_KEY_Z 0x1D
|
||||||
#define HID_KEY_1 0x1E
|
#define HID_KEY_1 0x1E
|
||||||
#define HID_KEY_2 0x1F
|
#define HID_KEY_2 0x1F
|
||||||
#define HID_KEY_3 0x20
|
#define HID_KEY_3 0x20
|
||||||
#define HID_KEY_4 0x21
|
#define HID_KEY_4 0x21
|
||||||
#define HID_KEY_5 0x22
|
#define HID_KEY_5 0x22
|
||||||
#define HID_KEY_6 0x23
|
#define HID_KEY_6 0x23
|
||||||
#define HID_KEY_7 0x24
|
#define HID_KEY_7 0x24
|
||||||
#define HID_KEY_8 0x25
|
#define HID_KEY_8 0x25
|
||||||
#define HID_KEY_9 0x26
|
#define HID_KEY_9 0x26
|
||||||
#define HID_KEY_0 0x27
|
#define HID_KEY_0 0x27
|
||||||
#define HID_KEY_ENTER 0x28
|
#define HID_KEY_ENTER 0x28
|
||||||
#define HID_KEY_ESCAPE 0x29
|
#define HID_KEY_ESCAPE 0x29
|
||||||
#define HID_KEY_BACKSPACE 0x2A
|
#define HID_KEY_BACKSPACE 0x2A
|
||||||
#define HID_KEY_TAB 0x2B
|
#define HID_KEY_TAB 0x2B
|
||||||
#define HID_KEY_SPACE 0x2C
|
#define HID_KEY_SPACE 0x2C
|
||||||
#define HID_KEY_MINUS 0x2D
|
#define HID_KEY_MINUS 0x2D
|
||||||
#define HID_KEY_EQUAL 0x2E
|
#define HID_KEY_EQUAL 0x2E
|
||||||
#define HID_KEY_BRACKET_LEFT 0x2F
|
#define HID_KEY_BRACKET_LEFT 0x2F
|
||||||
#define HID_KEY_BRACKET_RIGHT 0x30
|
#define HID_KEY_BRACKET_RIGHT 0x30
|
||||||
#define HID_KEY_BACKSLASH 0x31
|
#define HID_KEY_BACKSLASH 0x31
|
||||||
#define HID_KEY_EUROPE_1 0x32
|
#define HID_KEY_EUROPE_1 0x32
|
||||||
#define HID_KEY_SEMICOLON 0x33
|
#define HID_KEY_SEMICOLON 0x33
|
||||||
#define HID_KEY_APOSTROPHE 0x34
|
#define HID_KEY_APOSTROPHE 0x34
|
||||||
#define HID_KEY_GRAVE 0x35
|
#define HID_KEY_GRAVE 0x35
|
||||||
#define HID_KEY_COMMA 0x36
|
#define HID_KEY_COMMA 0x36
|
||||||
#define HID_KEY_PERIOD 0x37
|
#define HID_KEY_PERIOD 0x37
|
||||||
#define HID_KEY_SLASH 0x38
|
#define HID_KEY_SLASH 0x38
|
||||||
#define HID_KEY_CAPS_LOCK 0x39
|
#define HID_KEY_CAPS_LOCK 0x39
|
||||||
#define HID_KEY_F1 0x3A
|
#define HID_KEY_F1 0x3A
|
||||||
#define HID_KEY_F2 0x3B
|
#define HID_KEY_F2 0x3B
|
||||||
#define HID_KEY_F3 0x3C
|
#define HID_KEY_F3 0x3C
|
||||||
#define HID_KEY_F4 0x3D
|
#define HID_KEY_F4 0x3D
|
||||||
#define HID_KEY_F5 0x3E
|
#define HID_KEY_F5 0x3E
|
||||||
#define HID_KEY_F6 0x3F
|
#define HID_KEY_F6 0x3F
|
||||||
#define HID_KEY_F7 0x40
|
#define HID_KEY_F7 0x40
|
||||||
#define HID_KEY_F8 0x41
|
#define HID_KEY_F8 0x41
|
||||||
#define HID_KEY_F9 0x42
|
#define HID_KEY_F9 0x42
|
||||||
#define HID_KEY_F10 0x43
|
#define HID_KEY_F10 0x43
|
||||||
#define HID_KEY_F11 0x44
|
#define HID_KEY_F11 0x44
|
||||||
#define HID_KEY_F12 0x45
|
#define HID_KEY_F12 0x45
|
||||||
#define HID_KEY_PRINT_SCREEN 0x46
|
#define HID_KEY_PRINT_SCREEN 0x46
|
||||||
#define HID_KEY_SCROLL_LOCK 0x47
|
#define HID_KEY_SCROLL_LOCK 0x47
|
||||||
#define HID_KEY_PAUSE 0x48
|
#define HID_KEY_PAUSE 0x48
|
||||||
#define HID_KEY_INSERT 0x49
|
#define HID_KEY_INSERT 0x49
|
||||||
#define HID_KEY_HOME 0x4A
|
#define HID_KEY_HOME 0x4A
|
||||||
#define HID_KEY_PAGE_UP 0x4B
|
#define HID_KEY_PAGE_UP 0x4B
|
||||||
#define HID_KEY_DELETE 0x4C
|
#define HID_KEY_DELETE 0x4C
|
||||||
#define HID_KEY_END 0x4D
|
#define HID_KEY_END 0x4D
|
||||||
#define HID_KEY_PAGE_DOWN 0x4E
|
#define HID_KEY_PAGE_DOWN 0x4E
|
||||||
#define HID_KEY_ARROW_RIGHT 0x4F
|
#define HID_KEY_ARROW_RIGHT 0x4F
|
||||||
#define HID_KEY_ARROW_LEFT 0x50
|
#define HID_KEY_ARROW_LEFT 0x50
|
||||||
#define HID_KEY_ARROW_DOWN 0x51
|
#define HID_KEY_ARROW_DOWN 0x51
|
||||||
#define HID_KEY_ARROW_UP 0x52
|
#define HID_KEY_ARROW_UP 0x52
|
||||||
#define HID_KEY_NUM_LOCK 0x53
|
#define HID_KEY_NUM_LOCK 0x53
|
||||||
#define HID_KEY_KEYPAD_DIVIDE 0x54
|
#define HID_KEY_KEYPAD_DIVIDE 0x54
|
||||||
#define HID_KEY_KEYPAD_MULTIPLY 0x55
|
#define HID_KEY_KEYPAD_MULTIPLY 0x55
|
||||||
#define HID_KEY_KEYPAD_SUBTRACT 0x56
|
#define HID_KEY_KEYPAD_SUBTRACT 0x56
|
||||||
#define HID_KEY_KEYPAD_ADD 0x57
|
#define HID_KEY_KEYPAD_ADD 0x57
|
||||||
#define HID_KEY_KEYPAD_ENTER 0x58
|
#define HID_KEY_KEYPAD_ENTER 0x58
|
||||||
#define HID_KEY_KEYPAD_1 0x59
|
#define HID_KEY_KEYPAD_1 0x59
|
||||||
#define HID_KEY_KEYPAD_2 0x5A
|
#define HID_KEY_KEYPAD_2 0x5A
|
||||||
#define HID_KEY_KEYPAD_3 0x5B
|
#define HID_KEY_KEYPAD_3 0x5B
|
||||||
#define HID_KEY_KEYPAD_4 0x5C
|
#define HID_KEY_KEYPAD_4 0x5C
|
||||||
#define HID_KEY_KEYPAD_5 0x5D
|
#define HID_KEY_KEYPAD_5 0x5D
|
||||||
#define HID_KEY_KEYPAD_6 0x5E
|
#define HID_KEY_KEYPAD_6 0x5E
|
||||||
#define HID_KEY_KEYPAD_7 0x5F
|
#define HID_KEY_KEYPAD_7 0x5F
|
||||||
#define HID_KEY_KEYPAD_8 0x60
|
#define HID_KEY_KEYPAD_8 0x60
|
||||||
#define HID_KEY_KEYPAD_9 0x61
|
#define HID_KEY_KEYPAD_9 0x61
|
||||||
#define HID_KEY_KEYPAD_0 0x62
|
#define HID_KEY_KEYPAD_0 0x62
|
||||||
#define HID_KEY_KEYPAD_DECIMAL 0x63
|
#define HID_KEY_KEYPAD_DECIMAL 0x63
|
||||||
#define HID_KEY_EUROPE_2 0x64
|
#define HID_KEY_EUROPE_2 0x64
|
||||||
#define HID_KEY_APPLICATION 0x65
|
#define HID_KEY_APPLICATION 0x65
|
||||||
#define HID_KEY_POWER 0x66
|
#define HID_KEY_POWER 0x66
|
||||||
#define HID_KEY_KEYPAD_EQUAL 0x67
|
#define HID_KEY_KEYPAD_EQUAL 0x67
|
||||||
#define HID_KEY_F13 0x68
|
#define HID_KEY_F13 0x68
|
||||||
#define HID_KEY_F14 0x69
|
#define HID_KEY_F14 0x69
|
||||||
#define HID_KEY_F15 0x6A
|
#define HID_KEY_F15 0x6A
|
||||||
#define HID_KEY_F16 0x6B
|
#define HID_KEY_F16 0x6B
|
||||||
#define HID_KEY_F17 0x6C
|
#define HID_KEY_F17 0x6C
|
||||||
#define HID_KEY_F18 0x6D
|
#define HID_KEY_F18 0x6D
|
||||||
#define HID_KEY_F19 0x6E
|
#define HID_KEY_F19 0x6E
|
||||||
#define HID_KEY_F20 0x6F
|
#define HID_KEY_F20 0x6F
|
||||||
#define HID_KEY_F21 0x70
|
#define HID_KEY_F21 0x70
|
||||||
#define HID_KEY_F22 0x71
|
#define HID_KEY_F22 0x71
|
||||||
#define HID_KEY_F23 0x72
|
#define HID_KEY_F23 0x72
|
||||||
#define HID_KEY_F24 0x73
|
#define HID_KEY_F24 0x73
|
||||||
#define HID_KEY_EXECUTE 0x74
|
#define HID_KEY_EXECUTE 0x74
|
||||||
#define HID_KEY_HELP 0x75
|
#define HID_KEY_HELP 0x75
|
||||||
#define HID_KEY_MENU 0x76
|
#define HID_KEY_MENU 0x76
|
||||||
#define HID_KEY_SELECT 0x77
|
#define HID_KEY_SELECT 0x77
|
||||||
#define HID_KEY_STOP 0x78
|
#define HID_KEY_STOP 0x78
|
||||||
#define HID_KEY_AGAIN 0x79
|
#define HID_KEY_AGAIN 0x79
|
||||||
#define HID_KEY_UNDO 0x7A
|
#define HID_KEY_UNDO 0x7A
|
||||||
#define HID_KEY_CUT 0x7B
|
#define HID_KEY_CUT 0x7B
|
||||||
#define HID_KEY_COPY 0x7C
|
#define HID_KEY_COPY 0x7C
|
||||||
#define HID_KEY_PASTE 0x7D
|
#define HID_KEY_PASTE 0x7D
|
||||||
#define HID_KEY_FIND 0x7E
|
#define HID_KEY_FIND 0x7E
|
||||||
#define HID_KEY_MUTE 0x7F
|
#define HID_KEY_MUTE 0x7F
|
||||||
#define HID_KEY_VOLUME_UP 0x80
|
#define HID_KEY_VOLUME_UP 0x80
|
||||||
#define HID_KEY_VOLUME_DOWN 0x81
|
#define HID_KEY_VOLUME_DOWN 0x81
|
||||||
#define HID_KEY_LOCKING_CAPS_LOCK 0x82
|
#define HID_KEY_LOCKING_CAPS_LOCK 0x82
|
||||||
#define HID_KEY_LOCKING_NUM_LOCK 0x83
|
#define HID_KEY_LOCKING_NUM_LOCK 0x83
|
||||||
#define HID_KEY_LOCKING_SCROLL_LOCK 0x84
|
#define HID_KEY_LOCKING_SCROLL_LOCK 0x84
|
||||||
#define HID_KEY_KEYPAD_COMMA 0x85
|
#define HID_KEY_KEYPAD_COMMA 0x85
|
||||||
#define HID_KEY_KEYPAD_EQUAL_SIGN 0x86
|
#define HID_KEY_KEYPAD_EQUAL_SIGN 0x86
|
||||||
#define HID_KEY_KANJI1 0x87
|
#define HID_KEY_KANJI1 0x87
|
||||||
#define HID_KEY_KANJI2 0x88
|
#define HID_KEY_KANJI2 0x88
|
||||||
#define HID_KEY_KANJI3 0x89
|
#define HID_KEY_KANJI3 0x89
|
||||||
#define HID_KEY_KANJI4 0x8A
|
#define HID_KEY_KANJI4 0x8A
|
||||||
#define HID_KEY_KANJI5 0x8B
|
#define HID_KEY_KANJI5 0x8B
|
||||||
#define HID_KEY_KANJI6 0x8C
|
#define HID_KEY_KANJI6 0x8C
|
||||||
#define HID_KEY_KANJI7 0x8D
|
#define HID_KEY_KANJI7 0x8D
|
||||||
#define HID_KEY_KANJI8 0x8E
|
#define HID_KEY_KANJI8 0x8E
|
||||||
#define HID_KEY_KANJI9 0x8F
|
#define HID_KEY_KANJI9 0x8F
|
||||||
#define HID_KEY_LANG1 0x90
|
#define HID_KEY_LANG1 0x90
|
||||||
#define HID_KEY_LANG2 0x91
|
#define HID_KEY_LANG2 0x91
|
||||||
#define HID_KEY_LANG3 0x92
|
#define HID_KEY_LANG3 0x92
|
||||||
#define HID_KEY_LANG4 0x93
|
#define HID_KEY_LANG4 0x93
|
||||||
#define HID_KEY_LANG5 0x94
|
#define HID_KEY_LANG5 0x94
|
||||||
#define HID_KEY_LANG6 0x95
|
#define HID_KEY_LANG6 0x95
|
||||||
#define HID_KEY_LANG7 0x96
|
#define HID_KEY_LANG7 0x96
|
||||||
#define HID_KEY_LANG8 0x97
|
#define HID_KEY_LANG8 0x97
|
||||||
#define HID_KEY_LANG9 0x98
|
#define HID_KEY_LANG9 0x98
|
||||||
#define HID_KEY_ALTERNATE_ERASE 0x99
|
#define HID_KEY_ALTERNATE_ERASE 0x99
|
||||||
#define HID_KEY_SYSREQ_ATTENTION 0x9A
|
#define HID_KEY_SYSREQ_ATTENTION 0x9A
|
||||||
#define HID_KEY_CANCEL 0x9B
|
#define HID_KEY_CANCEL 0x9B
|
||||||
#define HID_KEY_CLEAR 0x9C
|
#define HID_KEY_CLEAR 0x9C
|
||||||
#define HID_KEY_PRIOR 0x9D
|
#define HID_KEY_PRIOR 0x9D
|
||||||
#define HID_KEY_RETURN 0x9E
|
#define HID_KEY_RETURN 0x9E
|
||||||
#define HID_KEY_SEPARATOR 0x9F
|
#define HID_KEY_SEPARATOR 0x9F
|
||||||
#define HID_KEY_OUT 0xA0
|
#define HID_KEY_OUT 0xA0
|
||||||
#define HID_KEY_OPER 0xA1
|
#define HID_KEY_OPER 0xA1
|
||||||
#define HID_KEY_CLEAR_AGAIN 0xA2
|
#define HID_KEY_CLEAR_AGAIN 0xA2
|
||||||
#define HID_KEY_CRSEL_PROPS 0xA3
|
#define HID_KEY_CRSEL_PROPS 0xA3
|
||||||
#define HID_KEY_EXSEL 0xA4
|
#define HID_KEY_EXSEL 0xA4
|
||||||
// RESERVED 0xA5-DF
|
// RESERVED 0xA5-AF
|
||||||
#define HID_KEY_CONTROL_LEFT 0xE0
|
#define HID_KEY_KEYPAD_00 0xB0
|
||||||
#define HID_KEY_SHIFT_LEFT 0xE1
|
#define HID_KEY_KEYPAD_000 0xB1
|
||||||
#define HID_KEY_ALT_LEFT 0xE2
|
#define HID_KEY_THOUSANDS_SEPARATOR 0xB2
|
||||||
#define HID_KEY_GUI_LEFT 0xE3
|
#define HID_KEY_DECIMAL_SEPARATOR 0xB3
|
||||||
#define HID_KEY_CONTROL_RIGHT 0xE4
|
#define HID_KEY_CURRENCY_UNIT 0xB4
|
||||||
#define HID_KEY_SHIFT_RIGHT 0xE5
|
#define HID_KEY_CURRENCY_SUBUNIT 0xB5
|
||||||
#define HID_KEY_ALT_RIGHT 0xE6
|
#define HID_KEY_KEYPAD_LEFT_PARENTHESIS 0xB6
|
||||||
#define HID_KEY_GUI_RIGHT 0xE7
|
#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
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
|
@ -112,7 +112,7 @@ typedef struct {
|
|||||||
bool notification_xmit_is_running; // notification is currently transmitted
|
bool notification_xmit_is_running; // notification is currently transmitted
|
||||||
} ncm_interface_t;
|
} 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
|
* 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
|
* \attention
|
||||||
* We are lucky, that byte order is correct
|
* 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),
|
.wLength = sizeof(ntb_parameters_t),
|
||||||
.bmNtbFormatsSupported = 0x01,// 16-bit NTB supported
|
.bmNtbFormatsSupported = 0x01,// 16-bit NTB supported
|
||||||
.dwNtbInMaxSize = CFG_TUD_NCM_IN_NTB_MAX_SIZE,
|
.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
|
* 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) {
|
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) {
|
if (xferred_bytes == 0 || xferred_bytes % CFG_TUD_NET_ENDPOINT_SIZE != 0) {
|
||||||
return false;
|
return false;
|
||||||
@ -521,11 +521,11 @@ static bool recv_validate_datagram(const recv_ntb_t *ntb, uint32_t len) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (len < sizeof(nth16_t) + sizeof(ndp16_t) + 2 * sizeof(ndp16_datagram_t)) {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
if (nth16->wBlockLength > len) {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
if (nth16->wBlockLength > CFG_TUD_NCM_OUT_NTB_MAX_SIZE) {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
if (nth16->wNdpIndex < sizeof(nth16) || nth16->wNdpIndex > len - (sizeof(ndp16_t) + 2 * sizeof(ndp16_datagram_t))) {
|
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;
|
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) {
|
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);
|
TU_LOG_DRV(" << %d %d\n", ndp16_datagram[ndx].wDatagramIndex, ndp16_datagram[ndx].wDatagramLength);
|
||||||
if (ndp16_datagram[ndx].wDatagramIndex > len) {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
if (ndp16_datagram[ndx].wDatagramIndex + ndp16_datagram[ndx].wDatagramLength > len) {
|
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;
|
return false;
|
||||||
}
|
}
|
||||||
++ndx;
|
++ndx;
|
||||||
|
@ -56,6 +56,10 @@ TU_ATTR_WEAK void tud_event_hook_cb(uint8_t rhport, uint32_t eventid, bool in_is
|
|||||||
(void)in_isr;
|
(void)in_isr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TU_ATTR_WEAK void tud_sof_cb(uint32_t frame_count) {
|
||||||
|
(void)frame_count;
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// Device Data
|
// Device Data
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
@ -76,6 +80,7 @@ typedef struct {
|
|||||||
volatile uint8_t cfg_num; // current active configuration (0x00 is not configured)
|
volatile uint8_t cfg_num; // current active configuration (0x00 is not configured)
|
||||||
uint8_t speed;
|
uint8_t speed;
|
||||||
volatile uint8_t setup_count;
|
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 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
|
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;
|
return driver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// DCD Event
|
// DCD Event
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
@ -382,6 +388,12 @@ bool tud_connect(void) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool tud_sof_cb_enable(bool en)
|
||||||
|
{
|
||||||
|
usbd_sof_enable(_usbd_rhport, SOF_CONSUMER_USER, en);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// USBD Task
|
// USBD Task
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
@ -612,6 +624,12 @@ void tud_task_ext(uint32_t timeout_ms, bool in_isr) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case DCD_EVENT_SOF:
|
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:
|
default:
|
||||||
TU_BREAKPOINT();
|
TU_BREAKPOINT();
|
||||||
break;
|
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
|
// 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);
|
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
|
// close all non-control endpoints, cancel all pending transfers if any
|
||||||
dcd_edpt_close_all(rhport);
|
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;
|
break;
|
||||||
|
|
||||||
case DCD_EVENT_SOF:
|
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
|
// 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
|
// which last 1-15 ms. DCD can use SOF as a clear indicator that bus is back to operational
|
||||||
if (_usbd_dev.suspended) {
|
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);
|
queue_event(&event_resume, in_isr);
|
||||||
}
|
}
|
||||||
|
|
||||||
// SOF driver handler in ISR context
|
if (tu_bit_test(_usbd_dev.sof_consumer, SOF_CONSUMER_USER)) {
|
||||||
for (uint8_t i = 0; i < TOTAL_DRIVER_COUNT; i++) {
|
dcd_event_t const event_sof = {.rhport = event->rhport, .event_id = DCD_EVENT_SOF};
|
||||||
usbd_class_driver_t const* driver = get_driver(i);
|
queue_event(&event_sof, in_isr);
|
||||||
if (driver && driver->sof) {
|
|
||||||
driver->sof(event->rhport, event->sof.frame_count);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// skip osal queue for SOF in usbd task
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DCD_EVENT_SETUP_RECEIVED:
|
case DCD_EVENT_SETUP_RECEIVED:
|
||||||
@ -1355,12 +1379,21 @@ void usbd_edpt_close(uint8_t rhport, uint8_t ep_addr) {
|
|||||||
return;
|
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;
|
rhport = _usbd_rhport;
|
||||||
|
|
||||||
// TODO: Check needed if all drivers including the user sof_cb does not need an active SOF ISR any more.
|
uint8_t consumer_old = _usbd_dev.sof_consumer;
|
||||||
// Only if all drivers switched off SOF calls the SOF interrupt may be disabled
|
// Keep track how many class instances need the SOF interrupt
|
||||||
dcd_sof_enable(rhport, en);
|
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) {
|
bool usbd_edpt_iso_alloc(uint8_t rhport, uint8_t ep_addr, uint16_t largest_packet_size) {
|
||||||
|
@ -97,6 +97,9 @@ bool tud_disconnect(void);
|
|||||||
// Return false on unsupported MCUs
|
// Return false on unsupported MCUs
|
||||||
bool tud_connect(void);
|
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
|
// Carry out Data and Status stage of control transfer
|
||||||
// - If len = 0, it is equivalent to sending status only
|
// - If len = 0, it is equivalent to sending status only
|
||||||
// - If len > wLength : it will be truncated
|
// - 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()
|
// 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);
|
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
|
// 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);
|
TU_ATTR_WEAK bool tud_vendor_control_xfer_cb(uint8_t rhport, uint8_t stage, tusb_control_request_t const * request);
|
||||||
|
|
||||||
|
@ -35,6 +35,15 @@
|
|||||||
|
|
||||||
#define TU_LOG_USBD(...) TU_LOG(CFG_TUD_LOG_LEVEL, __VA_ARGS__)
|
#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
|
// Class Driver API
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
@ -108,7 +117,7 @@ bool usbd_edpt_ready(uint8_t rhport, uint8_t ep_addr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Enable SOF interrupt
|
// 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
|
/* Helper
|
||||||
|
@ -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=="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}"
|
# 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 os
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import click
|
|
||||||
import serial
|
import serial
|
||||||
import subprocess
|
import subprocess
|
||||||
import json
|
import json
|
||||||
@ -318,13 +318,18 @@ def test_hid_composite_freertos(id):
|
|||||||
# -------------------------------------------------------------
|
# -------------------------------------------------------------
|
||||||
# Main
|
# Main
|
||||||
# -------------------------------------------------------------
|
# -------------------------------------------------------------
|
||||||
@click.command()
|
def main():
|
||||||
@click.argument('config_file')
|
|
||||||
@click.option('-b', '--board', multiple=True, default=None, help='Boards to test, all if not specified')
|
|
||||||
def main(config_file, board):
|
|
||||||
"""
|
"""
|
||||||
Hardware test on specified boards
|
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)
|
config_file = os.path.join(os.path.dirname(__file__), config_file)
|
||||||
with open(config_file) as f:
|
with open(config_file) as f:
|
||||||
config = json.load(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',
|
'cdc_dual_ports', 'cdc_msc', 'dfu', 'dfu_runtime', 'hid_boot_interface',
|
||||||
]
|
]
|
||||||
|
|
||||||
if len(board) == 0:
|
if len(boards) == 0:
|
||||||
config_boards = config['boards']
|
config_boards = config['boards']
|
||||||
else:
|
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:
|
for item in config_boards:
|
||||||
name = item['name']
|
name = item['name']
|
||||||
|
@ -22,6 +22,16 @@
|
|||||||
"flasher_product": "ItsyBitsy M4 Express",
|
"flasher_product": "ItsyBitsy M4 Express",
|
||||||
"flasher_reset_pin": "2",
|
"flasher_reset_pin": "2",
|
||||||
"flasher_args": "--offset 0x4000"
|
"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"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
@ -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"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
@ -1,8 +1,8 @@
|
|||||||
|
import argparse
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
import time
|
import time
|
||||||
import subprocess
|
import subprocess
|
||||||
import click
|
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from multiprocessing import Pool
|
from multiprocessing import Pool
|
||||||
|
|
||||||
@ -125,13 +125,20 @@ def build_family(family, toolchain, build_system):
|
|||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
@click.command()
|
def main():
|
||||||
@click.argument('families', nargs=-1, required=False)
|
parser = argparse.ArgumentParser()
|
||||||
@click.option('-b', '--board', multiple=True, default=None, help='Boards to build')
|
parser.add_argument('families', nargs='*', default=[], help='Families to build')
|
||||||
@click.option('-t', '--toolchain', default='gcc', help='Toolchain to use, default is gcc')
|
parser.add_argument('-b', '--board', action='append', default=[], help='Boards to build')
|
||||||
@click.option('-s', '--build-system', default='cmake', help='Build system to use, default is cmake')
|
parser.add_argument('-t', '--toolchain', default='gcc', help='Toolchain to use, default is gcc')
|
||||||
def main(families, board, toolchain, build_system):
|
parser.add_argument('-s', '--build-system', default='cmake', help='Build system to use, default is cmake')
|
||||||
if len(families) == 0 and len(board) == 0:
|
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")
|
print("Please specify families or board to build")
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
@ -159,12 +166,23 @@ def main(families, board, toolchain, build_system):
|
|||||||
total_result[2] += fret[2]
|
total_result[2] += fret[2]
|
||||||
|
|
||||||
# build board (only cmake)
|
# build board (only cmake)
|
||||||
if board is not None:
|
if boards is not None:
|
||||||
for b in board:
|
for b in boards:
|
||||||
r = build_board_cmake(b, toolchain)
|
if build_system == 'cmake':
|
||||||
total_result[0] += r[0]
|
r = build_board_cmake(b, toolchain)
|
||||||
total_result[1] += r[1]
|
total_result[0] += r[0]
|
||||||
total_result[2] += r[2]
|
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
|
total_time = time.monotonic() - total_time
|
||||||
print(build_separator)
|
print(build_separator)
|
||||||
|
@ -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)
|
|
@ -1,4 +1,4 @@
|
|||||||
import click
|
import argparse
|
||||||
import sys
|
import sys
|
||||||
import subprocess
|
import subprocess
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
@ -238,28 +238,32 @@ def find_family(board):
|
|||||||
return None
|
return None
|
||||||
|
|
||||||
|
|
||||||
@click.command()
|
def main():
|
||||||
@click.argument('family', nargs=-1, required=False)
|
parser = argparse.ArgumentParser()
|
||||||
@click.option('-b', '--board', multiple=True, default=None, help='Boards to fetch')
|
parser.add_argument('families', nargs='*', default=[], help='Families to fetch')
|
||||||
def main(family, board):
|
parser.add_argument('-b', '--board', action='append', default=[], help='Boards to fetch')
|
||||||
if len(family) == 0 and len(board) == 0:
|
args = parser.parse_args()
|
||||||
print("Please specify family or board to fetch")
|
|
||||||
return
|
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
|
status = 0
|
||||||
deps = list(deps_mandatory.keys())
|
deps = list(deps_mandatory.keys())
|
||||||
|
|
||||||
if 'all' in family:
|
if 'all' in families:
|
||||||
deps += deps_optional.keys()
|
deps += deps_optional.keys()
|
||||||
else:
|
else:
|
||||||
family = list(family)
|
families = list(families)
|
||||||
if board is not None:
|
if boards is not None:
|
||||||
for b in board:
|
for b in boards:
|
||||||
f = find_family(b)
|
f = find_family(b)
|
||||||
if f is not None:
|
if f is not None:
|
||||||
family.append(f)
|
families.append(f)
|
||||||
|
|
||||||
for f in family:
|
for f in families:
|
||||||
for d in deps_optional:
|
for d in deps_optional:
|
||||||
if f in deps_optional[d][2]:
|
if f in deps_optional[d][2]:
|
||||||
deps.append(d)
|
deps.append(d)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user