diff --git a/Tools/AP_Bootloader/board_types.txt b/Tools/AP_Bootloader/board_types.txt index 7e845f3e502d3..afbccd60e5c78 100644 --- a/Tools/AP_Bootloader/board_types.txt +++ b/Tools/AP_Bootloader/board_types.txt @@ -339,6 +339,8 @@ AP_HW_KHA_ETH 1315 AP_HW_FlysparkF4 1361 +AP_HW_CIPHERWINGF4 1362 + AP_HW_CUBEORANGE_PERIPH 1400 AP_HW_CUBEBLACK_PERIPH 1401 AP_HW_PIXRACER_PERIPH 1402 diff --git a/Tools/bootloaders/CIPHERWINGF4_bl.bin b/Tools/bootloaders/CIPHERWINGF4_bl.bin new file mode 100755 index 0000000000000..55b52b997bd9e Binary files /dev/null and b/Tools/bootloaders/CIPHERWINGF4_bl.bin differ diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CIPHERWINGF4/README.md b/libraries/AP_HAL_ChibiOS/hwdef/CIPHERWINGF4/README.md new file mode 100644 index 0000000000000..b433d3c81a82a --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/CIPHERWINGF4/README.md @@ -0,0 +1,95 @@ +# CipherWing F4 (STM32F405) + +## Introduction +The **CipherWing F4** is a custom autopilot board designed around the STM32F405 MCU. +It is hardware-compatible with the OmnibusF4 family and supports multiple firmwares including **INAV**, **PX4**, and **ArduPilot** (tested with this PR). +This board is under early development and testing by **Jeevesh Vishwavijay**, for educational and prototype use. + +## Features / Specifications +- **Processor:** STM32F405RGT6 (168 MHz ARM Cortex-M4F) +- **Flash:** 1MB internal flash +- **IMUs:** MPU6000 (SPI1), BMI270 (SPI1, shared bus) +- **Barometer:** BMP280 (SPI3) +- **OSD:** MAX7456-compatible (SPI3) +- **Power:** VBAT & RSSI analog inputs +- **USB:** Micro-USB (OTG1) +- **UARTs:** Up to 6 hardware serial ports +- **PWM outputs:** 8 motor/servo outputs (M1–M8) +- **No onboard SD card** +- **Supported firmware:** INAV, PX4, ArduPilot + +## Pinout +Follows the OmnibusF4 layout with modifications for CipherWing: +- **RSSI input:** PC1 +- **VBAT:** PC2 +- **PWM1–8:** PB0, PB1, PC8, PC9, PB14, PA8, PB15, PB7 +- **IMU:** SPI1 +- **OSD & BARO:** SPI3 + +## UART Mapping +| Serial # | Function | Port | Notes | +|-----------|-----------|------|-------| +| SERIAL0 | USB | OTG1 | Default console | +| SERIAL1 | USART1 | PA9 / PA10 | Telemetry | +| SERIAL2 | USART2 | PA2 / PA3 | GPS1 | +| SERIAL3 | USART3 | PB10 / PB11 | GPS2 / Telem2 | +| SERIAL4 | UART4 | PA0 / PA1 | Optional | +| SERIAL5 | UART5 | PD2 (RX only) | Optional | +| SERIAL6 | USART6 | PC6 / PC7 | ESC telemetry | + +## PWM Outputs +| PWM Channel | MCU Pin | Timer | Function | +|--------------|----------|--------|-----------| +| M1 | PB0 | TIM3_CH3 | Motor 1 | +| M2 | PB1 | TIM3_CH4 | Motor 2 | +| M3 | PC8 | TIM8_CH3 | Motor 3 | +| M4 | PC9 | TIM8_CH4 | Motor 4 | +| M5 | PB14 | TIM1_CH2N | Motor 5 | +| M6 | PA8 | TIM1_CH1 | Motor 6 | +| M7 | PB15 | TIM1_CH3N | Motor 7 | +| M8 | PB7 | TIM4_CH2 | Motor 8 | + + +### RC Input +- **SBUS (Inverted)** — connected to UART5_RX (PD2) via onboard BSS138 inverter. +- Compatible with FrSky SBUS, Futaba SBUS2, etc. +- **CRSF/ELRS** — supported on UART1 or UART6 (DMA-enabled). + + +## OSD Support +Onboard analog **MAX7456 OSD** supported (SPI3). +Set `OSD_TYPE=1` for analog OSD, or `OSD_TYPE=5` for DisplayPort. + +## Battery Monitor +Default analog monitor configured: +- Voltage: `PC2` +- RSSI: `PC1` +- Parameters: + - `BATT_MONITOR = 4` + - `BATT_VOLT_PIN = 12` + - `BATT_VOLT_MULT = 11` + - `BATT_CURR_PIN = -1` (disabled, no current sense) + - `RSSI_ANA_PIN = PC1` + +## Compass +No onboard compass. +Use external I²C compass via SDA (PB9) and SCL (PB8). + +## Firmware +Firmware binaries will be available under: +`https://firmware.ardupilot.org/CipherWingF4/` + +## Loading Firmware +This board supports ArduPilot `.apj` firmware upload via **Mission Planner** or **QGroundControl** once bootloader is flashed. +To flash bootloader manually: +```bash +Tools/scripts/build_bootloaders.py CIPHERWINGF4 +Notes +Designed for development and educational purposes. + +Future versions may include SD card and CAN. + +Board tested for compatibility with ArduCopter and ArduPlane builds. + +Author: Jeevesh Vishwavijay +Project: CipherWing F4 diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CIPHERWINGF4/hwdef-bl.dat b/libraries/AP_HAL_ChibiOS/hwdef/CIPHERWINGF4/hwdef-bl.dat new file mode 100644 index 0000000000000..3429f1c47243e --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/CIPHERWINGF4/hwdef-bl.dat @@ -0,0 +1,48 @@ +# hw definition file for processing by chibios_pins.py +# for CIPHERWINGF4 bootloader (derived from omnibusf4pro) + +BOARD_NAME CIPHERWINGF4 + +# MCU class and specific type +MCU STM32F4xx STM32F405xx + +# board ID. See Tools/AP_Bootloader/board_types.txt +APJ_BOARD_ID AP_HW_CIPHERWINGF4 + + +# crystal frequency +OSCILLATOR_HZ 8000000 + +FLASH_SIZE_KB 1024 + +# don't allow bootloader to use more than 16k +FLASH_USE_MAX_KB 16 + +# bootloader is installed at zero offset +FLASH_RESERVE_START_KB 0 + +# LEDs +PB5 LED_BOOTLOADER OUTPUT LOW +define HAL_LED_ON 0 + +# the location where the bootloader will put the firmware +FLASH_BOOTLOADER_LOAD_KB 64 + +PB4 BUZZER OUTPUT LOW PULLDOWN + +# order of UARTs +SERIAL_ORDER OTG1 + +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 + +# Ensure active SPI peripherals are deasserted (CS high) in bootloader +PA4 MPU6000_CS CS # IMU CS (also used by ICM20689/BMI270 via same CS) +PA15 OSD_CS CS # MAX7456 OSD CS +PB3 BMP280_CS CS # BMP280 baro CS + +# NOTE: +# - SD card was removed from the main hwdef.dat, so PB12 SDCARD_CS is omitted here. +# - No bootloader changes are needed for I2C1 on PB8/PB9 or for PWM/UART remaps. +# The application firmware will configure those after boot. + diff --git a/libraries/AP_HAL_ChibiOS/hwdef/CIPHERWINGF4/hwdef.dat b/libraries/AP_HAL_ChibiOS/hwdef/CIPHERWINGF4/hwdef.dat new file mode 100644 index 0000000000000..fc3f372cc7c23 --- /dev/null +++ b/libraries/AP_HAL_ChibiOS/hwdef/CIPHERWINGF4/hwdef.dat @@ -0,0 +1,181 @@ +# hw definition file for processing by chibios_pins.py +# Cipherwing F4 with STM32F405 +# mpu6000 / bmi270 / icm20689 IMU options, bmp280 barometer, +# 7456 series OSD and NO sdcard + +BOARD_NAME CIPHERWINGF4 + +MCU STM32F4xx STM32F405xx + +# board ID. See Tools/AP_Bootloader/board_types.txt +APJ_BOARD_ID AP_HW_CIPHERWINGF4 + + +# crystal frequency +OSCILLATOR_HZ 8000000 + +STM32_ST_USE_TIMER 5 + +# flash size +FLASH_SIZE_KB 1024 +FLASH_RESERVE_START_KB 64 + +# order of I2C buses (moved to I2C1) +I2C_ORDER I2C1 + +# order of UARTs (include USART2 and UART5) +SERIAL_ORDER OTG1 USART1 USART2 USART3 USART6 UART4 UART5 + +# ---------- ADC ---------- +# VBAT stays on PC2 +PC2 BAT_VOLT_SENS ADC1 SCALE(1) + +# RSSI moved to PC1 (per request) +PC1 RSSI_IN ADC1 +define BOARD_RSSI_ANA_PIN 1 + +# (REMOVED to avoid conflict) Current sensor on PC1: +# PC1 BAT_CURR_SENS ADC1 SCALE(1) + +# ---------- PWM outputs remapped to match requested INAV-style layout ---------- +# M1 PB0 TIM3_CH3 +# M2 PB1 TIM3_CH4 +# M3 PC8 TIM8_CH3 +# M4 PC9 TIM8_CH4 +# M5 PB14 TIM1_CH2N (F405-valid replacement for TIM12_CH1) +# M6 PA8 TIM1_CH1 +# M7 PB15 TIM1_CH3N (F405-valid replacement for TIM12_CH2) +# M8 PB7 TIM4_CH2 +PB0 TIM3_CH3 TIM3 PWM(1) GPIO(50) +PB1 TIM3_CH4 TIM3 PWM(2) GPIO(51) +PC8 TIM8_CH3 TIM8 PWM(3) GPIO(52) +PC9 TIM8_CH4 TIM8 PWM(4) GPIO(53) +PB14 TIM1_CH2N TIM1 PWM(5) GPIO(54) +PA8 TIM1_CH1 TIM1 PWM(6) GPIO(55) +PB15 TIM1_CH3N TIM1 PWM(7) GPIO(56) +PB7 TIM4_CH2 TIM4 PWM(8) GPIO(57) + +# ---------- IMU on SPI1 with CS=PA4 ---------- +PA4 MPU6000_CS CS +PA5 SPI1_SCK SPI1 +PA6 SPI1_MISO SPI1 +PA7 SPI1_MOSI SPI1 + +# ---------- I2C1 on PB8/PB9 (pullups). (Freed PB10/PB11 for USART3 ALTs) ---------- +PB8 I2C1_SCL I2C1 PULLUP +PB9 I2C1_SDA I2C1 PULLUP + +# Keep USART3 available on PB10/PB11 via ALTs if needed +PB10 USART3_TX USART3 ALT(1) +PB11 USART3_RX USART3 ALT(1) +PB10 USART3_TX USART3 ALT(4) +PB11 USART3_RX USART3 ALT(4) + +# ---------- SPI2 / SD card REMOVED (per request) ---------- +# (PB15 SPI2_MOSI SPI2) +# (PB14 SPI2_MISO SPI2) +# (PB13 SPI2_SCK SPI2) +# (PB12 SDCARD_CS CS) + +# ---------- UARTs ---------- +PA10 USART1_RX USART1 +PA9 USART1_TX USART1 + +PA3 USART2_RX USART2 +PA2 USART2_TX USART2 + +PC6 USART6_TX USART6 +PC7 USART6_RX USART6 + +# UART4 on PA0/PA1 via ALT configs +PA0 UART4_TX UART4 ALT(2) +PA0 UART4_TX UART4 ALT(3) +PA1 UART4_RX UART4 ALT(3) +PA0 UART4_TX UART4 ALT(4) +PA1 UART4_RX UART4 ALT(4) + +# ---------- UART5 for SBUS (via BSS138 inverter) ---------- +PD2 UART5_RX UART5 INVERTED +# TX intentionally unassigned +define HAL_RCIN_UART 5 +define SERIAL_PORTS_RCIN_DEFAULT SERIAL5 +# ---------- SWD ---------- +PA13 JTMS-SWDIO SWD +PA14 JTCK-SWCLK SWD + +# ---------- OSD + BMP on SPI3 ---------- +PA15 OSD_CS CS +PB3 BMP280_CS CS +PC12 SPI3_MOSI SPI3 +PC11 SPI3_MISO SPI3 +PC10 SPI3_SCK SPI3 + +# ---------- LEDs / Beeper ---------- +define AP_NOTIFY_GPIO_LED_2_ENABLED 1 +PB5 LED_BLUE OUTPUT LOW GPIO(1) +define HAL_GPIO_A_LED_PIN 1 + +# dummy assignment required to allow AP_NOTIFY to use board led +define HAL_GPIO_B_LED_PIN 2 + +PB4 TIM3_CH1 TIM3 GPIO(58) ALARM LOW + +# use LED-STRIP output as general purpose GPIO (PB6 kept for LED strip) +PB6 GP_GPIO OUTPUT LOW GPIO(70) + +# ---------- USB ---------- +PA11 OTG_FS_DM OTG1 +PA12 OTG_FS_DP OTG1 +PC5 VBUS INPUT OPENDRAIN + +# RCIN on PB8 removed because PB8 is now I2C1_SCL. Use a UART-based RC input (e.g., SBUS on USART1/USART6). +# PB8 TIM4_CH3 TIM4 RCININT PULLDOWN LOW (REMOVED) + +# ---------- SPI Device table (sdcard removed, ICM20689 added) ---------- +SPIDEV bmi270 SPI1 DEVID1 MPU6000_CS MODE3 1*MHZ 10*MHZ +SPIDEV mpu6000 SPI1 DEVID1 MPU6000_CS MODE3 1*MHZ 8*MHZ +SPIDEV icm20689 SPI1 DEVID1 MPU6000_CS MODE3 1*MHZ 8*MHZ +SPIDEV bmp280 SPI3 DEVID3 BMP280_CS MODE3 1*MHZ 8*MHZ +SPIDEV osd SPI3 DEVID4 OSD_CS MODE0 10*MHZ 10*MHZ + +# one IMU present on board. Allow MPU6000, BMI270, or ICM20689 +IMU Invensense SPI:mpu6000 ROTATION_YAW_180 +IMU BMI270 SPI:bmi270 ROTATION_ROLL_180 +IMU Invensense SPI:icm20689 ROTATION_YAW_180 + +# one baro +BARO BMP280 SPI:bmp280 +define AP_BARO_BACKEND_DEFAULT_ENABLED 0 +define AP_BARO_BMP280_ENABLED 1 + +# no built-in compass, but probe the i2c bus for all possible external compass types +define ALLOW_ARM_NO_COMPASS +define AP_COMPASS_PROBING_ENABLED 1 +define HAL_I2C_INTERNAL_MASK 0 +define HAL_COMPASS_AUTO_ROT_DEFAULT 2 + +STORAGE_FLASH_PAGE 1 +define HAL_STORAGE_SIZE 15360 + +define HAL_OS_FATFS_IO 0 + +# ---------- default battery setup ---------- +# VBAT pin index unchanged +define HAL_BATT_VOLT_PIN 12 +define HAL_BATT_VOLT_SCALE 11 + +# Current sensor disabled (per request / to avoid conflict) +define HAL_BATT_CURR_PIN -1 +define HAL_BATT_CURR_SCALE 0 + +define OSD_ENABLED 1 +define HAL_OSD_TYPE_DEFAULT 1 + +# font for the osd +ROMFS_WILDCARD libraries/AP_OSD/fonts/font0.bin + +# disable parachute and sprayer to save flash +define HAL_PARACHUTE_ENABLED 0 + +include ../include/minimize_fpv_osd.inc +