diff --git a/.circleci/config.yml b/.circleci/config.yml
index 28afafb00..451b79085 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -20,6 +20,7 @@ jobs:
BUILDSYSTEM_TOOLCHAIN=(
"cmake arm-clang"
+ "cmake arm-iar"
"make aarch64-gcc"
"make arm-gcc"
"make msp430-gcc"
@@ -28,7 +29,27 @@ jobs:
"cmake esp-idf"
)
- RESOURCE_LARGE='["nrf", "imxrt"]'
+ RESOURCE_LARGE='["nrf", "imxrt", "stm32f4", "stm32h7"]'
+
+ gen_build_entry() {
+ local build_system="$1"
+ local toolchain="$2"
+ local family="$3"
+ local resource_class="$4"
+
+ if [[ "$toolchain" == "esp-idf" ]]; then
+ echo " - build-vm:" >> .circleci/config2.yml
+ else
+ echo " - build:" >> .circleci/config2.yml
+ fi
+
+ echo " matrix:" >> .circleci/config2.yml
+ echo " parameters:" >> .circleci/config2.yml
+ echo " build-system: ['$build_system']" >> .circleci/config2.yml
+ echo " toolchain: ['$toolchain']" >> .circleci/config2.yml
+ echo " family: $family" >> .circleci/config2.yml
+ echo " resource_class: ['$resource_class']" >> .circleci/config2.yml
+ }
for e in "${BUILDSYSTEM_TOOLCHAIN[@]}"; do
e_arr=($e)
@@ -43,26 +64,14 @@ jobs:
FAMILY=$(jq -n --argjson family "$FAMILY" --argjson resource "$RESOURCE_LARGE" '$family | map(select(IN($resource[]) | not))')
if [[ $toolchain == esp-idf ]]; then
- echo " - build-vm:" >> .circleci/config2.yml
+ gen_build_entry "$build_system" "$toolchain" "$FAMILY" "large"
else
- echo " - build:" >> .circleci/config2.yml
- fi
- echo " matrix:" >> .circleci/config2.yml
- echo " parameters:" >> .circleci/config2.yml
- echo " build-system: ['$build_system']" >> .circleci/config2.yml
- echo " toolchain: ['$toolchain']" >> .circleci/config2.yml
- echo " family: $FAMILY" >> .circleci/config2.yml
- #echo " resource_class: ['medium+']" >> .circleci/config2.yml
+ gen_build_entry "$build_system" "$toolchain" "$FAMILY" "medium+"
- # add large resources
- if [ "$(echo $FAMILY_LARGE | jq 'length')" -gt 0 ]; then
- echo " - build:" >> .circleci/config2.yml
- echo " matrix:" >> .circleci/config2.yml
- echo " parameters:" >> .circleci/config2.yml
- echo " build-system: ['$build_system']" >> .circleci/config2.yml
- echo " toolchain: ['$toolchain']" >> .circleci/config2.yml
- echo " family: $FAMILY_LARGE" >> .circleci/config2.yml
- echo " resource_class: ['large']" >> .circleci/config2.yml
+ # add large resources if available
+ if [ "$(echo $FAMILY_LARGE | jq 'length')" -gt 0 ]; then
+ gen_build_entry "$build_system" "$toolchain" "$FAMILY_LARGE" "large"
+ fi
fi
done
diff --git a/.circleci/config2.yml b/.circleci/config2.yml
index e811ef3ed..e6ae87e77 100644
--- a/.circleci/config2.yml
+++ b/.circleci/config2.yml
@@ -16,7 +16,8 @@ commands:
"arm-gcc": "https://github.com/xpack-dev-tools/arm-none-eabi-gcc-xpack/releases/download/v13.2.1-1.1/xpack-arm-none-eabi-gcc-13.2.1-1.1-linux-x64.tar.gz",
"msp430-gcc": "http://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/MSPGCC/9_2_0_0/export/msp430-gcc-9.2.0.50_linux64.tar.bz2",
"riscv-gcc": "https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack/releases/download/v13.2.0-2/xpack-riscv-none-elf-gcc-13.2.0-2-linux-x64.tar.gz",
- "rx-gcc": "https://llvm-gcc-renesas.com/downloads/get.php?f=rx/8.3.0.202004-gnurx/gcc-8.3.0.202004-GNURX-ELF.run"
+ "rx-gcc": "https://llvm-gcc-renesas.com/downloads/get.php?f=rx/8.3.0.202004-gnurx/gcc-8.3.0.202004-GNURX-ELF.run",
+ "arm-iar": "https://updates.iar.com/FileStore/STANDARD/001/003/322/cxarm-9.60.3.deb"
}'
toolchain_url=$(echo $TOOLCHAIN_JSON | jq -r '.["<< parameters.toolchain >>"]')
@@ -38,18 +39,26 @@ commands:
# download if folder does not exist (not cached)
if [ ! -d ~/cache/<< parameters.toolchain >> ]; then
mkdir -p ~/cache/<< parameters.toolchain >>
- wget --progress=dot:giga $toolchain_url -O toolchain.tar.gz
if [[ << parameters.toolchain >> == rx-gcc ]]; then
- mv toolchain.tar.gz toolchain.run
+ wget --progress=dot:giga $toolchain_url -O toolchain.run
chmod +x toolchain.run
./toolchain.run -p ~/cache/<< parameters.toolchain >>/gnurx -y
+ elif [[ << parameters.toolchain >> == arm-iar ]]; then
+ wget --progress=dot:giga $toolchain_url -O ~/cache/<< parameters.toolchain >>/toolchain.deb
else
+ wget --progress=dot:giga $toolchain_url -O toolchain.tar.gz
tar -C ~/cache/<< parameters.toolchain >> -xaf toolchain.tar.gz
fi
fi
# Add toolchain to PATH
- echo "export PATH=$PATH:`echo ~/cache/<< parameters.toolchain >>/*/bin`" >> $BASH_ENV
+ if [[ << parameters.toolchain >> == arm-iar ]]; then
+ # Install IAR since we only cache deb file
+ sudo dpkg --ignore-depends=libusb-1.0-0 -i ~/cache/<< parameters.toolchain >>/toolchain.deb
+ echo "export PATH=$PATH:/opt/iar/cxarm/arm/bin" >> $BASH_ENV
+ else
+ echo "export PATH=$PATH:`echo ~/cache/<< parameters.toolchain >>/*/bin`" >> $BASH_ENV
+ fi
- save_cache:
name: Save Toolchain Cache
@@ -110,6 +119,9 @@ commands:
# Toolchain option default is gcc
if [ << parameters.toolchain >> == arm-clang ]; then
TOOLCHAIN_OPTION="--toolchain clang"
+ elif [ << parameters.toolchain >> == arm-iar ]; then
+ TOOLCHAIN_OPTION="--toolchain iar"
+ iccarm --version
elif [ << parameters.toolchain >> == arm-gcc ]; then
TOOLCHAIN_OPTION="--toolchain gcc"
fi
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 283b72061..67482c748 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -113,13 +113,12 @@ jobs:
# Build IAR on HFP self-hosted
# ---------------------------------------
arm-iar:
- if: github.repository_owner == 'hathach'
+ if: github.repository_owner == 'hathach' && github.event_name == 'push'
needs: set-matrix
runs-on: [self-hosted, Linux, X64, hifiphile]
env:
BUILD_ARGS: ${{ join(fromJSON(needs.set-matrix.outputs.json)['arm-iar'], ' ') }}
- IAR_LMS_CLOUD_URL: https://license.cloud.iar.com
- IAR_LMS_BEARER_TOKEN: ${{ secrets.IAR_LMS_BEARER_TOKEN }}
+ # IAR_LMS_BEARER_TOKEN: ${{ secrets.IAR_LMS_BEARER_TOKEN }}
steps:
- name: Clean workspace
run: |
@@ -138,8 +137,3 @@ jobs:
- name: Build
run: python3 tools/build.py --one-per-family --toolchain iar $BUILD_ARGS
-
- - name: Test on actual hardware (hardware in the loop)
- if: github.event_name == 'pull_request'
- run: |
- python3 test/hil/hil_test.py hfp.json
diff --git a/.github/workflows/ci_set_matrix.py b/.github/workflows/ci_set_matrix.py
index 78fcac68a..410508246 100755
--- a/.github/workflows/ci_set_matrix.py
+++ b/.github/workflows/ci_set_matrix.py
@@ -55,14 +55,6 @@ def set_matrix_json():
for toolchain in toolchain_list:
filtered_families = [family for family, supported_toolchain in family_list.items() if
toolchain in supported_toolchain]
-
- # always add board in hfp.json for arm-iar
- if toolchain == 'arm-iar':
- with open('test/hil/hfp.json') as f:
- hfp_data = json.load(f)
- hfp_boards = [f"-b{board['name']}" for board in hfp_data['boards']]
- filtered_families = filtered_families + hfp_boards
-
matrix[toolchain] = filtered_families
print(json.dumps(matrix))
diff --git a/.github/workflows/hil_test.yml b/.github/workflows/hil_test.yml
index c6e7f33b0..bfa2b5704 100644
--- a/.github/workflows/hil_test.yml
+++ b/.github/workflows/hil_test.yml
@@ -58,7 +58,7 @@ jobs:
# ---------------------------------------
# Hardware in the loop (HIL)
- # self-hosted running on an VM. For attached hardware checkout HIL_JSON
+ # self-hosted on local VM, for attached hardware checkout HIL_JSON
# ---------------------------------------
hil-tinyusb:
if: github.repository_owner == 'hathach'
@@ -86,3 +86,41 @@ jobs:
run: |
ls cmake-build/
python3 test/hil/hil_test.py ${{ env.HIL_JSON }}
+
+ # ---------------------------------------
+ # Hardware in the loop (HIL)
+ # self-hosted by HFP, build with IAR toolchain, for attached hardware checkout test/hil/hfp.json
+ # ---------------------------------------
+ hil-hfp:
+ if: github.repository_owner == 'hathach'
+ runs-on: [self-hosted, Linux, X64, hifiphile]
+ #env:
+ # IAR_LMS_BEARER_TOKEN: ${{ secrets.IAR_LMS_BEARER_TOKEN }}
+ steps:
+ - name: Clean workspace
+ run: |
+ echo "Cleaning up previous run"
+ rm -rf "${{ github.workspace }}"
+ mkdir -p "${{ github.workspace }}"
+
+ - name: Toolchain version
+ run: iccarm --version
+
+ - name: Checkout TinyUSB
+ uses: actions/checkout@v4
+
+ - name: Get build boards
+ run: |
+ MATRIX_JSON=$(python test/hil/hil_ci_set_matrix.py test/hil/hfp.json)
+ BUILD_ARGS=$(echo $MATRIX_JSON | jq -r '.["arm-gcc"] | join(" ")')
+ echo "BUILD_ARGS=$BUILD_ARGS"
+ echo "BUILD_ARGS=$BUILD_ARGS" >> $GITHUB_ENV
+
+ - name: Get Dependencies
+ run: python3 tools/get_deps.py $BUILD_ARGS
+
+ - name: Build
+ run: python3 tools/build.py --toolchain iar $BUILD_ARGS
+
+ - name: Test on actual hardware (hardware in the loop)
+ run: python3 test/hil/hil_test.py hfp.json
diff --git a/.idea/cmake.xml b/.idea/cmake.xml
index 25a8513ca..5af6d7722 100644
--- a/.idea/cmake.xml
+++ b/.idea/cmake.xml
@@ -83,7 +83,7 @@
-
+
diff --git a/.idea/runConfigurations/stlink.xml b/.idea/runConfigurations/stlink.xml
index 2d94e66d6..e84445add 100644
--- a/.idea/runConfigurations/stlink.xml
+++ b/.idea/runConfigurations/stlink.xml
@@ -1,6 +1,6 @@
-
-
+
+
diff --git a/hw/bsp/stm32h5/boards/stm32h503nucleo/board.cmake b/hw/bsp/stm32h5/boards/stm32h503nucleo/board.cmake
index f0fb1d809..1a44c3f1d 100644
--- a/hw/bsp/stm32h5/boards/stm32h503nucleo/board.cmake
+++ b/hw/bsp/stm32h5/boards/stm32h503nucleo/board.cmake
@@ -4,5 +4,6 @@ set(JLINK_DEVICE stm32h503rb)
function(update_board TARGET)
target_compile_definitions(${TARGET} PUBLIC
STM32H503xx
+ HSE_VALUE=24000000
)
endfunction()
diff --git a/hw/bsp/stm32h5/boards/stm32h503nucleo/board.mk b/hw/bsp/stm32h5/boards/stm32h503nucleo/board.mk
index cf60098af..0292353ae 100644
--- a/hw/bsp/stm32h5/boards/stm32h503nucleo/board.mk
+++ b/hw/bsp/stm32h5/boards/stm32h503nucleo/board.mk
@@ -1,7 +1,8 @@
MCU_VARIANT = stm32h503xx
CFLAGS += \
- -DSTM32H503xx
+ -DSTM32H503xx \
+ -DHSE_VALUE=24000000 \
# For flash-jlink target
JLINK_DEVICE = stm32h503rb
diff --git a/hw/bsp/stm32h5/boards/stm32h563nucleo/board.cmake b/hw/bsp/stm32h5/boards/stm32h563nucleo/board.cmake
index 694ea41cd..0077bf235 100644
--- a/hw/bsp/stm32h5/boards/stm32h563nucleo/board.cmake
+++ b/hw/bsp/stm32h5/boards/stm32h563nucleo/board.cmake
@@ -4,5 +4,6 @@ set(JLINK_DEVICE stm32h563zi)
function(update_board TARGET)
target_compile_definitions(${TARGET} PUBLIC
STM32H563xx
+ HSE_VALUE=8000000
)
endfunction()
diff --git a/hw/bsp/stm32h5/boards/stm32h563nucleo/board.h b/hw/bsp/stm32h5/boards/stm32h563nucleo/board.h
index 8e849f5c8..c4e0f680b 100644
--- a/hw/bsp/stm32h5/boards/stm32h563nucleo/board.h
+++ b/hw/bsp/stm32h5/boards/stm32h563nucleo/board.h
@@ -67,9 +67,8 @@ static inline void SystemClock_Config(void) {
/** Initializes the RCC Oscillators according to the specified parameters
* in the RCC_OscInitTypeDef structure.
*/
- RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_HSE;
- RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS_DIGITAL;
- RCC_OscInitStruct.HSI48State = RCC_HSI48_ON;
+ RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
+ RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLL1_SOURCE_HSE;
RCC_OscInitStruct.PLL.PLLM = 4;
@@ -88,8 +87,8 @@ static inline void SystemClock_Config(void) {
/** Initializes the CPU, AHB and APB buses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
- |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
- |RCC_CLOCKTYPE_PCLK3;
+ |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
+ |RCC_CLOCKTYPE_PCLK3;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
@@ -101,25 +100,27 @@ static inline void SystemClock_Config(void) {
Error_Handler();
}
- // Configure CRS clock source
- __HAL_RCC_CRS_CLK_ENABLE();
- RCC_CRSInitTypeDef RCC_CRSInitStruct = {0};
- RCC_CRSInitStruct.Prescaler = RCC_CRS_SYNC_DIV1;
- RCC_CRSInitStruct.Source = RCC_CRS_SYNC_SOURCE_USB;
- RCC_CRSInitStruct.Polarity = RCC_CRS_SYNC_POLARITY_RISING;
- RCC_CRSInitStruct.ReloadValue = __HAL_RCC_CRS_RELOADVALUE_CALCULATE(48000000, 1000);
- RCC_CRSInitStruct.ErrorLimitValue = 34;
- RCC_CRSInitStruct.HSI48CalibrationValue = 32;
- HAL_RCCEx_CRSConfig(&RCC_CRSInitStruct);
+ /** Configure the programming delay
+ */
+ __HAL_FLASH_SET_PROGRAM_DELAY(FLASH_PROGRAMMING_DELAY_2);
- /* Select HSI48 as USB clock source */
- RCC_PeriphCLKInitTypeDef usb_clk = {0 };
- usb_clk.PeriphClockSelection = RCC_PERIPHCLK_USB;
- usb_clk.UsbClockSelection = RCC_USBCLKSOURCE_HSI48;
- HAL_RCCEx_PeriphCLKConfig(&usb_clk);
-
- /* Peripheral clock enable */
- __HAL_RCC_USB_CLK_ENABLE();
+ RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
+ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB;
+ PeriphClkInitStruct.PLL3.PLL3Source = RCC_PLL3_SOURCE_HSE;
+ PeriphClkInitStruct.PLL3.PLL3M = 1;
+ PeriphClkInitStruct.PLL3.PLL3N = 18;
+ PeriphClkInitStruct.PLL3.PLL3P = 2;
+ PeriphClkInitStruct.PLL3.PLL3Q = 3;
+ PeriphClkInitStruct.PLL3.PLL3R = 2;
+ PeriphClkInitStruct.PLL3.PLL3RGE = RCC_PLL3_VCIRANGE_1;
+ PeriphClkInitStruct.PLL3.PLL3VCOSEL = RCC_PLL3_VCORANGE_WIDE;
+ PeriphClkInitStruct.PLL3.PLL3FRACN = 0.0;
+ PeriphClkInitStruct.PLL3.PLL3ClockOut = RCC_PLL3_DIVQ;
+ PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_PLL3Q;
+ if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
+ {
+ Error_Handler();
+ }
}
#ifdef __cplusplus
diff --git a/hw/bsp/stm32h5/boards/stm32h563nucleo/board.mk b/hw/bsp/stm32h5/boards/stm32h563nucleo/board.mk
index 091d1e5e3..a7ccbdf39 100644
--- a/hw/bsp/stm32h5/boards/stm32h563nucleo/board.mk
+++ b/hw/bsp/stm32h5/boards/stm32h563nucleo/board.mk
@@ -1,7 +1,8 @@
MCU_VARIANT = stm32h563xx
CFLAGS += \
- -DSTM32H563xx
+ -DSTM32H563xx \
+ -DHSE_VALUE=8000000 \
# For flash-jlink target
JLINK_DEVICE = stm32h563zi
diff --git a/hw/bsp/stm32h5/boards/stm32h563nucleo/cubemx/stm32h563nucleo.ioc b/hw/bsp/stm32h5/boards/stm32h563nucleo/cubemx/stm32h563nucleo.ioc
index 3c83d136d..b9b9605c1 100644
--- a/hw/bsp/stm32h5/boards/stm32h563nucleo/cubemx/stm32h563nucleo.ioc
+++ b/hw/bsp/stm32h5/boards/stm32h563nucleo/cubemx/stm32h563nucleo.ioc
@@ -2,6 +2,7 @@
BOOTPATH.BootPathName=LEGACY
BOOTPATH.IPParameters=BootPathName
BOOTPATH.UserSelectedBootPath=LEGACY
+BSP_IP_NAME=NUCLEO-H563ZI
CAD.formats=
CAD.pinconfig=
CAD.provider=
@@ -16,6 +17,7 @@ Mcu.ContextProject=TrustZoneDisabled
Mcu.Family=STM32H5
Mcu.IP0=BOOTPATH
Mcu.IP1=CORTEX_M33_NS
+Mcu.IP10=NUCLEO-H563ZI
Mcu.IP2=DEBUG
Mcu.IP3=ICACHE
Mcu.IP4=MEMORYMAP
@@ -24,7 +26,7 @@ Mcu.IP6=PWR
Mcu.IP7=RCC
Mcu.IP8=SYS
Mcu.IP9=USB
-Mcu.IPNb=10
+Mcu.IPNb=11
Mcu.Name=STM32H563ZITx
Mcu.Package=LQFP144
Mcu.Pin0=PE2
@@ -74,8 +76,8 @@ Mcu.PinsNb=43
Mcu.ThirdPartyNb=0
Mcu.UserConstants=
Mcu.UserName=STM32H563ZITx
-MxCube.Version=6.10.0
-MxDb.Version=DB.6.0.100
+MxCube.Version=6.12.1
+MxDb.Version=DB.6.0.121
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false
NVIC.EXTI13_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true
@@ -267,7 +269,7 @@ ProjectManager.CustomerFirmwarePackage=
ProjectManager.DefaultFWLocation=true
ProjectManager.DeletePrevious=true
ProjectManager.DeviceId=STM32H563ZITx
-ProjectManager.FirmwarePackage=STM32Cube FW_H5 V1.1.1
+ProjectManager.FirmwarePackage=STM32Cube FW_H5 V1.3.0
ProjectManager.FreePins=false
ProjectManager.HalAssertFull=false
ProjectManager.HeapSize=0x200
@@ -317,7 +319,7 @@ RCC.I2C2Freq_Value=250000000
RCC.I2C3Freq_Value=250000000
RCC.I2C4Freq_Value=250000000
RCC.I3C1Freq_Value=250000000
-RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,APB3Freq_Value,CECFreq_Value,CKPERFreq_Value,CRSFreq_Value,CSI_VALUE,CortexFreq_Value,DACFreq_Value,EPOD_VALUE,ETHFreq_Value,FCLKCortexFreq_Value,FDCANFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSIDiv,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,I3C1Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM3Freq_Value,LPTIM4Freq_Value,LPTIM5Freq_Value,LPTIM6Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSIRC_VALUE,MCO1PinFreq_Value,MCO2PinFreq_Value,OCTOSPIMFreq_Value,PLL2PoutputFreq_Value,PLL2QoutputFreq_Value,PLL2RoutputFreq_Value,PLL3PoutputFreq_Value,PLL3QoutputFreq_Value,PLL3RoutputFreq_Value,PLLM,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLSourceVirtual,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMC1Freq_Value,SDMMC2Freq_Value,SPI1Freq_Value,SPI2Freq_Value,SPI3Freq_Value,SPI4Freq_Value,SPI5Freq_Value,SPI6Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART12Freq_Value,UART4Freq_Value,UART5Freq_Value,UART7Freq_Value,UART8Freq_Value,UART9Freq_Value,UCPD1outputFreq_Value,USART10Freq_Value,USART11Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USART6Freq_Value,USBFreq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOPLL2OutputFreq_Value,VCOPLL3OutputFreq_Value
+RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,APB3Freq_Value,CECFreq_Value,CKPERFreq_Value,CRSFreq_Value,CSI_VALUE,CortexFreq_Value,DACFreq_Value,EPOD_VALUE,ETHFreq_Value,FCLKCortexFreq_Value,FDCANFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSIDiv,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,I2C4Freq_Value,I3C1Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM3Freq_Value,LPTIM4Freq_Value,LPTIM5Freq_Value,LPTIM6Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSIRC_VALUE,MCO1PinFreq_Value,MCO2PinFreq_Value,OCTOSPIMFreq_Value,PLL2PoutputFreq_Value,PLL2QoutputFreq_Value,PLL2RoutputFreq_Value,PLL2Source,PLL3FRACN,PLL3N,PLL3PoutputFreq_Value,PLL3Q,PLL3QoutputFreq_Value,PLL3RoutputFreq_Value,PLL3Source,PLLFRACN,PLLM,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLSourceVirtual,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SAI2Freq_Value,SDMMC1Freq_Value,SDMMC2Freq_Value,SPI1Freq_Value,SPI2Freq_Value,SPI3Freq_Value,SPI4Freq_Value,SPI5Freq_Value,SPI6Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,UART12Freq_Value,UART4Freq_Value,UART5Freq_Value,UART7Freq_Value,UART8Freq_Value,UART9Freq_Value,UCPD1outputFreq_Value,USART10Freq_Value,USART11Freq_Value,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,USART6Freq_Value,USBCLockSelection,USBFreq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOPLL2OutputFreq_Value,VCOPLL3OutputFreq_Value
RCC.LPTIM1Freq_Value=250000000
RCC.LPTIM2Freq_Value=250000000
RCC.LPTIM3Freq_Value=250000000
@@ -330,12 +332,18 @@ RCC.LSIRC_VALUE=32000
RCC.MCO1PinFreq_Value=64000000
RCC.MCO2PinFreq_Value=250000000
RCC.OCTOSPIMFreq_Value=250000000
-RCC.PLL2PoutputFreq_Value=258000000
-RCC.PLL2QoutputFreq_Value=258000000
-RCC.PLL2RoutputFreq_Value=258000000
-RCC.PLL3PoutputFreq_Value=258000000
-RCC.PLL3QoutputFreq_Value=258000000
-RCC.PLL3RoutputFreq_Value=258000000
+RCC.PLL2PoutputFreq_Value=516000000
+RCC.PLL2QoutputFreq_Value=516000000
+RCC.PLL2RoutputFreq_Value=516000000
+RCC.PLL2Source=RCC_PLL2_SOURCE_HSE
+RCC.PLL3FRACN=0
+RCC.PLL3N=18
+RCC.PLL3PoutputFreq_Value=72000000
+RCC.PLL3Q=3
+RCC.PLL3QoutputFreq_Value=48000000
+RCC.PLL3RoutputFreq_Value=72000000
+RCC.PLL3Source=RCC_PLL3_SOURCE_HSE
+RCC.PLLFRACN=0
RCC.PLLM=4
RCC.PLLN=250
RCC.PLLPoutputFreq_Value=250000000
@@ -343,8 +351,8 @@ RCC.PLLQoutputFreq_Value=250000000
RCC.PLLSourceVirtual=RCC_PLL1_SOURCE_HSE
RCC.PWRFreq_Value=250000000
RCC.RNGFreq_Value=48000000
-RCC.SAI1Freq_Value=258000000
-RCC.SAI2Freq_Value=258000000
+RCC.SAI1Freq_Value=516000000
+RCC.SAI2Freq_Value=516000000
RCC.SDMMC1Freq_Value=250000000
RCC.SDMMC2Freq_Value=250000000
RCC.SPI1Freq_Value=250000000
@@ -368,13 +376,14 @@ RCC.USART1Freq_Value=250000000
RCC.USART2Freq_Value=250000000
RCC.USART3Freq_Value=250000000
RCC.USART6Freq_Value=250000000
+RCC.USBCLockSelection=RCC_USBCLKSOURCE_PLL3Q
RCC.USBFreq_Value=48000000
-RCC.VCOInput2Freq_Value=4000000
-RCC.VCOInput3Freq_Value=4000000
+RCC.VCOInput2Freq_Value=8000000
+RCC.VCOInput3Freq_Value=8000000
RCC.VCOInputFreq_Value=2000000
RCC.VCOOutputFreq_Value=500000000
-RCC.VCOPLL2OutputFreq_Value=516000000
-RCC.VCOPLL3OutputFreq_Value=516000000
+RCC.VCOPLL2OutputFreq_Value=1032000000
+RCC.VCOPLL3OutputFreq_Value=144000000
SH.ADCx_INP18.0=ADC1_INP18
SH.ADCx_INP18.ConfNb=1
SH.GPXTI13.0=GPIO_EXTI13
diff --git a/src/class/video/video.h b/src/class/video/video.h
index b8a9b6369..f348e187b 100644
--- a/src/class/video/video.h
+++ b/src/class/video/video.h
@@ -540,28 +540,32 @@ typedef struct TU_ATTR_PACKED {
TU_VERIFY_STATIC( sizeof(video_probe_and_commit_control_t) == 48, "size is not correct");
-#define TUD_VIDEO_DESC_IAD_LEN 8
-#define TUD_VIDEO_DESC_STD_VC_LEN 9
-#define TUD_VIDEO_DESC_CS_VC_LEN 12
-#define TUD_VIDEO_DESC_INPUT_TERM_LEN 8
-#define TUD_VIDEO_DESC_OUTPUT_TERM_LEN 9
-#define TUD_VIDEO_DESC_CAMERA_TERM_LEN 18
-#define TUD_VIDEO_DESC_STD_VS_LEN 9
-#define TUD_VIDEO_DESC_CS_VS_IN_LEN 13
-#define TUD_VIDEO_DESC_CS_VS_OUT_LEN 9
-#define TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN 27
-#define TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN 11
-#define TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN 38
-#define TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_DISC_LEN 26
-#define TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN 38
-#define TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_DISC_LEN 26
-#define TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN 6
+#define TUD_VIDEO_DESC_IAD_LEN 8
+#define TUD_VIDEO_DESC_STD_VC_LEN 9
+#define TUD_VIDEO_DESC_CS_VC_LEN 12
+#define TUD_VIDEO_DESC_INPUT_TERM_LEN 8
+#define TUD_VIDEO_DESC_OUTPUT_TERM_LEN 9
+#define TUD_VIDEO_DESC_CAMERA_TERM_LEN 18
+#define TUD_VIDEO_DESC_STD_VS_LEN 9
+#define TUD_VIDEO_DESC_CS_VS_IN_LEN 13
+#define TUD_VIDEO_DESC_CS_VS_OUT_LEN 9
+#define TUD_VIDEO_DESC_CS_VS_FMT_UNCOMPR_LEN 27
+#define TUD_VIDEO_DESC_CS_VS_FMT_MJPEG_LEN 11
+#define TUD_VIDEO_DESC_CS_VS_FMT_FRAME_BASED_LEN 28
+#define TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_CONT_LEN 38
+#define TUD_VIDEO_DESC_CS_VS_FRM_UNCOMPR_DISC_LEN 26
+#define TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_CONT_LEN 38
+#define TUD_VIDEO_DESC_CS_VS_FRM_MJPEG_DISC_LEN 26
+#define TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_CONT_LEN 38
+#define TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_DISC_LEN 26
+#define TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN 6
/* 2.2 compression formats */
#define TUD_VIDEO_GUID_YUY2 0x59,0x55,0x59,0x32,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71
#define TUD_VIDEO_GUID_NV12 0x4E,0x56,0x31,0x32,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71
#define TUD_VIDEO_GUID_M420 0x4D,0x34,0x32,0x30,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71
#define TUD_VIDEO_GUID_I420 0x49,0x34,0x32,0x30,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71
+#define TUD_VIDEO_GUID_H264 0x48,0x32,0x36,0x34,0x00,0x00,0x10,0x00,0x80,0x00,0x00,0xAA,0x00,0x38,0x9B,0x71
#define TUD_VIDEO_DESC_IAD(_firstitf, _nitfs, _stridx) \
TUD_VIDEO_DESC_IAD_LEN, TUSB_DESC_INTERFACE_ASSOCIATION, \
@@ -656,6 +660,25 @@ TU_VERIFY_STATIC( sizeof(video_probe_and_commit_control_t) == 48, "size is not c
_frmidx, _cap, U16_TO_U8S_LE(_width), U16_TO_U8S_LE(_height), U32_TO_U8S_LE(_minbr), U32_TO_U8S_LE(_maxbr), \
U32_TO_U8S_LE(_maxfrmbufsz), U32_TO_U8S_LE(_frminterval), (TU_ARGS_NUM(__VA_ARGS__)), __VA_ARGS__
+/* Motion-Frame-Based 3.1.1 Table 3-1 */
+#define TUD_VIDEO_DESC_CS_VS_FMT_FRAME_BASED(_fmtidx, _numfrmdesc, _guid, _bitsperpix, _frmidx, _asrx, _asry, _interlace, _cp, _variablesize) \
+ TUD_VIDEO_DESC_CS_VS_FMT_FRAME_BASED_LEN, TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED, \
+ _fmtidx, _numfrmdesc, TUD_VIDEO_GUID(_guid), _bitsperpix, _frmidx, _asrx, _asry, _interlace, _cp, _variablesize
+
+/* Motion-Frame-Based 3.1.1 Table 3-2 and 3-3 */
+#define TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_CONT(_frmidx, _cap, _width, _height, _minbr, _maxbr, _frminterval, _bytesperline, _minfrminterval, _maxfrminterval, _frmintervalstep) \
+ TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_CONT_LEN, TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VS_FRAME_FRAME_BASED, \
+ _frmidx, _cap, U16_TO_U8S_LE(_width), U16_TO_U8S_LE(_height), U32_TO_U8S_LE(_minbr), U32_TO_U8S_LE(_maxbr), \
+ U32_TO_U8S_LE(_frminterval), 0, U32_TO_U8S_LE(_bytesperline), \
+ U32_TO_U8S_LE(_minfrminterval), U32_TO_U8S_LE(_maxfrminterval), U32_TO_U8S_LE(_frmintervalstep)
+
+/* Motion-Frame-Based 3.1.1 Table 3-2 and 3-4 */
+#define TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_DISC(_frmidx, _cap, _width, _height, _minbr, _maxbr, _frminterval, _bytesperline, ...) \
+ TUD_VIDEO_DESC_CS_VS_FRM_FRAME_BASED_DISC_LEN + (TU_ARGS_NUM(__VA_ARGS__)) * 4, \
+ TUSB_DESC_CS_INTERFACE, VIDEO_CS_ITF_VS_FRAME_FRAME_BASED, \
+ _frmidx, _cap, U16_TO_U8S_LE(_width), U16_TO_U8S_LE(_height), U32_TO_U8S_LE(_minbr), U32_TO_U8S_LE(_maxbr), \
+U32_TO_U8S_LE(_frminterval), U32_TO_U8S_LE(_bytesperline), (TU_ARGS_NUM(__VA_ARGS__)), __VA_ARGS__
+
/* 3.9.2.6 */
#define TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING(_color, _trns, _mat) \
TUD_VIDEO_DESC_CS_VS_COLOR_MATCHING_LEN, \
diff --git a/src/class/video/video_device.c b/src/class/video/video_device.c
index 86513ddf0..3124d5596 100644
--- a/src/class/video/video_device.c
+++ b/src/class/video/video_device.c
@@ -462,6 +462,9 @@ static bool _update_streaming_parameters(videod_streaming_interface_t const *stm
case VIDEO_CS_ITF_VS_FORMAT_MJPEG:
break;
+ case VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED:
+ break;
+
default: return false;
}
@@ -487,6 +490,10 @@ static bool _update_streaming_parameters(videod_streaming_interface_t const *stm
frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * 16 / 8; /* YUV422 */
break;
+ case VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED:
+ frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * 16 / 8; /* YUV422 */
+ break;
+
default: break;
}
param->dwMaxVideoFrameSize = frame_size;
@@ -576,6 +583,10 @@ static bool _negotiate_streaming_parameters(videod_streaming_interface_t const *
frmnum = fmt->mjpeg.bDefaultFrameIndex;
break;
+ case VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED:
+ frmnum = fmt->frame_based.bDefaultFrameIndex;
+ break;
+
default: return false;
}
break;
@@ -594,6 +605,10 @@ static bool _negotiate_streaming_parameters(videod_streaming_interface_t const *
frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * 16 / 8; /* YUV422 */
break;
+ case VIDEO_CS_ITF_VS_FORMAT_FRAME_BASED:
+ frame_size = (uint_fast32_t)frm->wWidth * frm->wHeight * 16 / 8; /* YUV422 */
+ break;
+
default: return false;
}
param->dwMaxVideoFrameSize = frame_size;
diff --git a/src/portable/synopsys/dwc2/dwc2_esp32.h b/src/portable/synopsys/dwc2/dwc2_esp32.h
index ddbfd0d10..3309760ff 100644
--- a/src/portable/synopsys/dwc2/dwc2_esp32.h
+++ b/src/portable/synopsys/dwc2/dwc2_esp32.h
@@ -73,7 +73,7 @@ static void dwc2_int_handler_wrap(void* arg) {
dcd_int_handler(rhport);
}
#endif
-#if CFG_TUH_ENABLED
+#if CFG_TUH_ENABLED && !CFG_TUH_MAX3421
if (role == TUSB_ROLE_HOST) {
hcd_int_handler(rhport, true);
}
diff --git a/tools/build.py b/tools/build.py
index 3a9239bc2..bbc98e9c4 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -109,7 +109,14 @@ def cmake_board(board, toolchain, build_flags_on):
rcmd = run_cmd(f'cmake examples -B {build_dir} -G "Ninja" -DBOARD={board} -DCMAKE_BUILD_TYPE=MinSizeRel '
f'-DTOOLCHAIN={toolchain} {build_flags}')
if rcmd.returncode == 0:
- rcmd = run_cmd(f"cmake --build {build_dir}")
+ cmd = f"cmake --build {build_dir}"
+ # Due to IAR capability, limit parallel build to 4 (medium+) or 6 (large) docker
+ if toolchain == 'iar' and os.getenv('CIRCLECI'):
+ if 'large' in os.getenv('CIRCLE_JOB'):
+ cmd += ' --parallel 6'
+ else:
+ cmd += ' --parallel 4'
+ rcmd = run_cmd(cmd)
ret[0 if rcmd.returncode == 0 else 1] += 1
example = 'all'