313 lines
8.6 KiB
C
313 lines
8.6 KiB
C
/*
|
|
* Copyright 2024 Google LLC
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
// ----------------------------------------------
|
|
// Board definitions for robert_bb, robert_bb2, robert_evt, cutts_bb
|
|
// ----------------------------------------------
|
|
//
|
|
|
|
#include "drivers/imu/bmi160/bmi160.h"
|
|
#include "services/imu/units.h"
|
|
#include "util/size.h"
|
|
|
|
#define BOARD_LSE_MODE RCC_LSE_Bypass
|
|
|
|
static const BoardConfig BOARD_CONFIG = {
|
|
.ambient_light_dark_threshold = 3220,
|
|
.ambient_k_delta_threshold = 96,
|
|
.photo_en = { GPIOF, GPIO_Pin_5, true },
|
|
.als_always_on = true,
|
|
|
|
.dbgserial_int = { EXTI_PortSourceGPIOH, 9 },
|
|
.dbgserial_int_gpio = { GPIOH, GPIO_Pin_9 },
|
|
|
|
// Only used with Sharp displays
|
|
.lcd_com = { 0 },
|
|
|
|
.power_5v0_options = OptionNotPresent,
|
|
.power_ctl_5v0 = { 0 },
|
|
|
|
.backlight_on_percent = 45,
|
|
.backlight_max_duty_cycle_percent = 100,
|
|
|
|
.num_avail_gpios = 140,
|
|
|
|
.has_mic = true,
|
|
};
|
|
|
|
static const BoardConfigButton BOARD_CONFIG_BUTTON = {
|
|
.buttons = {
|
|
#if BOARD_ROBERT_BB || BOARD_CUTTS_BB || BOARD_ROBERT_BB2
|
|
[BUTTON_ID_BACK] =
|
|
{ "Back", GPIOG, GPIO_Pin_6, { EXTI_PortSourceGPIOG, 6 }, GPIO_PuPd_UP },
|
|
[BUTTON_ID_UP] =
|
|
{ "Up", GPIOG, GPIO_Pin_3, { EXTI_PortSourceGPIOG, 3 }, GPIO_PuPd_NOPULL },
|
|
[BUTTON_ID_DOWN] =
|
|
{ "Down", GPIOG, GPIO_Pin_4, { EXTI_PortSourceGPIOG, 4 }, GPIO_PuPd_UP },
|
|
#elif BOARD_ROBERT_EVT
|
|
[BUTTON_ID_BACK] =
|
|
{ "Back", GPIOG, GPIO_Pin_3, { EXTI_PortSourceGPIOG, 3 }, GPIO_PuPd_NOPULL },
|
|
[BUTTON_ID_UP] =
|
|
{ "Up", GPIOG, GPIO_Pin_4, { EXTI_PortSourceGPIOG, 4 }, GPIO_PuPd_UP },
|
|
[BUTTON_ID_DOWN] =
|
|
{ "Down", GPIOG, GPIO_Pin_6, { EXTI_PortSourceGPIOG, 6 }, GPIO_PuPd_UP },
|
|
#else
|
|
#error "Unknown board"
|
|
#endif
|
|
[BUTTON_ID_SELECT] =
|
|
{ "Select", GPIOG, GPIO_Pin_5, { EXTI_PortSourceGPIOG, 5 }, GPIO_PuPd_UP },
|
|
},
|
|
|
|
.button_com = { 0 },
|
|
.active_high = false,
|
|
};
|
|
|
|
static const BoardConfigPower BOARD_CONFIG_POWER = {
|
|
.pmic_int = { EXTI_PortSourceGPIOF, 12 },
|
|
.pmic_int_gpio = {
|
|
.gpio = GPIOF,
|
|
.gpio_pin = GPIO_Pin_12,
|
|
},
|
|
|
|
.rail_4V5_ctrl = {
|
|
.gpio = GPIOH,
|
|
.gpio_pin = GPIO_Pin_5,
|
|
.active_high = true,
|
|
},
|
|
#if BOARD_CUTTS_BB
|
|
.rail_6V6_ctrl = {
|
|
.gpio = GPIOH,
|
|
.gpio_pin = GPIO_Pin_3,
|
|
.active_high = true,
|
|
},
|
|
.rail_6V6_ctrl_otype = GPIO_OType_PP,
|
|
#elif BOARD_ROBERT_BB || BOARD_ROBERT_BB2 || BOARD_ROBERT_EVT
|
|
.rail_6V6_ctrl = { GPIO_Port_NULL },
|
|
#else
|
|
#error "Unknown board"
|
|
#endif
|
|
|
|
.battery_vmon_scale = {
|
|
// The PMIC divides the battery voltage by a ratio of 3:1 in order to move it down to a voltage
|
|
// our ADC is capable of reading. The battery voltage varies around 4V~ and we're only capable
|
|
// of reading up to 1.8V in the ADC.
|
|
.numerator = 3,
|
|
.denominator = 1,
|
|
},
|
|
|
|
.vusb_stat = { .gpio = GPIO_Port_NULL, },
|
|
.chg_stat = { GPIO_Port_NULL },
|
|
.chg_fast = { GPIO_Port_NULL },
|
|
.chg_en = { GPIO_Port_NULL },
|
|
.has_vusb_interrupt = false,
|
|
|
|
.wake_on_usb_power = false,
|
|
|
|
#if defined(IS_BIGBOARD) && !defined(BATTERY_DEBUG)
|
|
.charging_cutoff_voltage = 4200,
|
|
#else
|
|
.charging_cutoff_voltage = 4300,
|
|
#endif
|
|
.charging_status_led_voltage_compensation = 0,
|
|
|
|
.low_power_threshold = 2,
|
|
.battery_capacity_hours = 204,
|
|
};
|
|
|
|
static const BoardConfigAccel BOARD_CONFIG_ACCEL = {
|
|
.accel_config = {
|
|
.axes_offsets[AXIS_X] = 0,
|
|
.axes_offsets[AXIS_Y] = 1,
|
|
.axes_offsets[AXIS_Z] = 2,
|
|
#if BOARD_ROBERT_BB || BOARD_ROBERT_BB2 || BOARD_CUTTS_BB
|
|
.axes_inverts[AXIS_X] = true,
|
|
.axes_inverts[AXIS_Y] = false,
|
|
.axes_inverts[AXIS_Z] = true,
|
|
#elif BOARD_ROBERT_EVT
|
|
.axes_inverts[AXIS_X] = false,
|
|
.axes_inverts[AXIS_Y] = true,
|
|
.axes_inverts[AXIS_Z] = false,
|
|
#else
|
|
#error "Unknown board"
|
|
#endif
|
|
.shake_thresholds[AccelThresholdHigh] = 0x64,
|
|
.shake_thresholds[AccelThresholdLow] = 0xf,
|
|
.double_tap_threshold = 12500,
|
|
},
|
|
.accel_int_gpios = {
|
|
[0] = { GPIOH, GPIO_Pin_15 },
|
|
[1] = { GPIOH, GPIO_Pin_14 },
|
|
},
|
|
.accel_ints = {
|
|
[0] = { EXTI_PortSourceGPIOH, 15 },
|
|
[1] = { EXTI_PortSourceGPIOH, 14 }
|
|
},
|
|
};
|
|
|
|
static const BoardConfigMag BOARD_CONFIG_MAG = {
|
|
.mag_config = {
|
|
.axes_offsets[AXIS_X] = 1,
|
|
.axes_offsets[AXIS_Y] = 0,
|
|
.axes_offsets[AXIS_Z] = 2,
|
|
#if BOARD_ROBERT_BB || BOARD_ROBERT_BB2 || BOARD_CUTTS_BB
|
|
.axes_inverts[AXIS_X] = false,
|
|
.axes_inverts[AXIS_Y] = true,
|
|
.axes_inverts[AXIS_Z] = true,
|
|
#elif BOARD_ROBERT_EVT
|
|
.axes_inverts[AXIS_X] = true,
|
|
.axes_inverts[AXIS_Y] = true,
|
|
.axes_inverts[AXIS_Z] = false,
|
|
#else
|
|
#error "Unknown board"
|
|
#endif
|
|
},
|
|
.mag_int_gpio = { GPIOF, GPIO_Pin_11 },
|
|
.mag_int = { EXTI_PortSourceGPIOF, 11 },
|
|
};
|
|
|
|
static const BoardConfigActuator BOARD_CONFIG_VIBE = {
|
|
.options = ActuatorOptions_Ctl | ActuatorOptions_Pwm | ActuatorOptions_HBridge,
|
|
#if BOARD_ROBERT_BB || BOARD_CUTTS_BB
|
|
.ctl = { GPIOD, GPIO_Pin_14, true },
|
|
.pwm = {
|
|
.output = { GPIOD, GPIO_Pin_12, true },
|
|
.timer = {
|
|
.peripheral = TIM4,
|
|
.config_clock = RCC_APB1Periph_TIM4,
|
|
.init = TIM_OC1Init,
|
|
.preload = TIM_OC1PreloadConfig
|
|
},
|
|
.afcfg = { GPIOD, GPIO_Pin_12, GPIO_PinSource12, GPIO_AF2_TIM4 },
|
|
},
|
|
#elif BOARD_ROBERT_BB2 || BOARD_ROBERT_EVT
|
|
.ctl = { GPIOA, GPIO_Pin_12, true },
|
|
.pwm = {
|
|
.output = { GPIOB, GPIO_Pin_14, true },
|
|
.timer = {
|
|
.peripheral = TIM12,
|
|
.config_clock = RCC_APB1Periph_TIM12,
|
|
.init = TIM_OC1Init,
|
|
.preload = TIM_OC1PreloadConfig
|
|
},
|
|
.afcfg = { GPIOB, GPIO_Pin_14, GPIO_PinSource14, GPIO_AF9_TIM12 },
|
|
},
|
|
#else
|
|
#error "Unknown board"
|
|
#endif
|
|
};
|
|
|
|
static const BoardConfigActuator BOARD_CONFIG_BACKLIGHT = {
|
|
.options = ActuatorOptions_Pwm,
|
|
.ctl = {0},
|
|
.pwm = {
|
|
.output = { GPIOG, GPIO_Pin_13, true },
|
|
.timer = {
|
|
.lp_peripheral = LPTIM1,
|
|
.config_clock = RCC_APB1Periph_LPTIM1,
|
|
},
|
|
.afcfg = { GPIOG, GPIO_Pin_13, GPIO_PinSource13, GPIO_AF3_LPTIM1 },
|
|
},
|
|
};
|
|
|
|
static const BoardConfigAccessory BOARD_CONFIG_ACCESSORY = {
|
|
#if BOARD_ROBERT_BB || BOARD_CUTTS_BB
|
|
.power_en = { GPIOA, GPIO_Pin_11, true },
|
|
#elif BOARD_ROBERT_BB2 || BOARD_ROBERT_EVT
|
|
.power_en = { GPIOD, GPIO_Pin_2, true },
|
|
#else
|
|
#error "Unknown board"
|
|
#endif
|
|
.int_gpio = { GPIOH, GPIO_Pin_13 },
|
|
.exti = { EXTI_PortSourceGPIOH, 13 },
|
|
};
|
|
|
|
static const BoardConfigBTCommon BOARD_CONFIG_BT_COMMON = {
|
|
.controller = DA14681,
|
|
.reset = { GPIOG, GPIO_Pin_0, true },
|
|
.wakeup = {
|
|
.int_gpio = { GPIOG, GPIO_Pin_1 },
|
|
.int_exti = { EXTI_PortSourceGPIOG, 1 },
|
|
},
|
|
};
|
|
|
|
static const BoardConfigBTUART BOARD_CONFIG_BT_UART = {
|
|
.rx_af_cfg = { GPIOE, GPIO_Pin_0, GPIO_PinSource0, GPIO_AF8_UART8 },
|
|
.tx_af_cfg = { GPIOE, GPIO_Pin_1, GPIO_PinSource1, GPIO_AF8_UART8 },
|
|
.rx_clk_control = RCC_APB1Periph_UART8,
|
|
.tx_clk_control = RCC_APB1Periph_UART8,
|
|
.rx_uart = UART8,
|
|
.tx_uart = UART8,
|
|
};
|
|
|
|
static const BoardConfigBTSPI BOARD_CONFIG_BT_SPI = {
|
|
.cs = { GPIOE, GPIO_Pin_11, false },
|
|
};
|
|
|
|
static const BoardConfigMCO1 BOARD_CONFIG_MCO1 = {
|
|
.output_enabled = true,
|
|
.af_cfg = {
|
|
.gpio = GPIOA,
|
|
.gpio_pin = GPIO_Pin_8,
|
|
.gpio_pin_source = GPIO_PinSource8,
|
|
.gpio_af = GPIO_AF0_MCO,
|
|
},
|
|
.an_cfg = {
|
|
.gpio = GPIOA,
|
|
.gpio_pin = GPIO_Pin_8,
|
|
},
|
|
};
|
|
|
|
#define DIALOG_TIMER_IRQ_HANDLER TIM6_DAC_IRQHandler
|
|
static const TimerIrqConfig BOARD_BT_WATCHDOG_TIMER = {
|
|
.timer = {
|
|
.peripheral = TIM6,
|
|
.config_clock = RCC_APB1Periph_TIM6,
|
|
},
|
|
.irq_channel = TIM6_DAC_IRQn,
|
|
};
|
|
|
|
extern DMARequest * const COMPOSITOR_DMA;
|
|
|
|
extern UARTDevice * const QEMU_UART;
|
|
extern UARTDevice * const DBG_UART;
|
|
extern UARTDevice * const ACCESSORY_UART;
|
|
extern UARTDevice * const BT_TX_BOOTROM_UART;
|
|
extern UARTDevice * const BT_RX_BOOTROM_UART;
|
|
|
|
extern SPISlavePort * const BMI160_SPI;
|
|
|
|
extern I2CSlavePort * const I2C_MAX14690;
|
|
extern I2CSlavePort * const I2C_MAG3110;
|
|
|
|
extern VoltageMonitorDevice * const VOLTAGE_MONITOR_ALS;
|
|
extern VoltageMonitorDevice * const VOLTAGE_MONITOR_BATTERY;
|
|
|
|
extern TemperatureSensor * const TEMPERATURE_SENSOR;
|
|
|
|
extern QSPIPort * const QSPI;
|
|
extern QSPIFlash * const QSPI_FLASH;
|
|
|
|
extern ICE40LPDevice * const ICE40LP;
|
|
extern SPISlavePort * const DIALOG_SPI;
|
|
|
|
extern MicDevice * const MIC;
|
|
|
|
#if BOARD_CUTTS_BB
|
|
extern TouchSensor * const EWD1000;
|
|
#endif
|