2 *****************************************************************************
4 * @author The LibrePilot Project, http://www.librepilot.org Copyright (C) 2017.
5 * The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010.
6 * PhoenixPilot, http://github.com/PhoenixPilot, Copyright (C) 2012
7 * @addtogroup LibrePilotSystem LibrePilot System
9 * @addtogroup LibrePilotCore LibrePilot Core
11 * @brief Defines board specific static initializers for hardware for the tinyFISH board.
12 *****************************************************************************/
14 * This program is free software; you can redistribute it and/or modify
15 * it under the terms of the GNU General Public License as published by
16 * the Free Software Foundation; either version 3 of the License, or
17 * (at your option) any later version.
19 * This program is distributed in the hope that it will be useful, but
20 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
21 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
24 * You should have received a copy of the GNU General Public License along
25 * with this program; if not, write to the Free Software Foundation, Inc.,
26 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
29 #include "inc/openpilot.h"
30 #include <pios_board_info.h>
31 #include <uavobjectsinit.h>
32 #include <hwsettings.h>
33 #include <hwtinyfishsettings.h>
34 #include <manualcontrolsettings.h>
35 #include <gcsreceiver.h>
37 #include <sanitycheck.h>
38 #include <actuatorsettings.h>
39 #include <auxmagsettings.h>
40 #include <flightbatterysettings.h>
41 #include <revosettings.h>
42 #ifdef PIOS_INCLUDE_INSTRUMENTATION
43 #include <pios_instrumentation.h>
46 #include <pios_board_io.h>
47 #include <pios_board_sensors.h>
50 * Pull in the board-specific static HW definitions.
51 * Including .c files is a bit ugly but this allows all of
52 * the HW definitions to be const and static to limit their
55 * NOTE: THIS IS THE ONLY PLACE THAT SHOULD EVER INCLUDE THIS FILE
57 #include "../board_hw_defs.c"
59 uintptr_t pios_uavo_settings_fs_id
;
60 uintptr_t pios_user_fs_id
= 0;
62 #ifdef PIOS_INCLUDE_WS2811
63 uint32_t pios_ws2811_id
;
66 void FlightBatterySettingsDataOverrideDefaults(FlightBatterySettingsData
*data
)
68 data
->SensorCalibrations
.VoltageFactor
= 8.8f
;
69 data
->SensorCalibrations
.CurrentFactor
= 0.07f
;
72 void RevoSettingsDataOverrideDefaults(RevoSettingsData
*data
)
74 /* This board has no barometer, so adjust default fusion algorithm to one that does not depend on working baro */
75 data
->FusionAlgorithm
= REVOSETTINGS_FUSIONALGORITHM_ACRONOSENSORS
;
78 static HwTinyFISHSettingsData boardHwSettings
;
80 static void hwTinyFISHSettingsUpdatedCb(__attribute__((unused
)) UAVObjEvent
*ev
)
82 HwTinyFISHSettingsData currentBoardHwSettings
;
84 HwTinyFISHSettingsGet(¤tBoardHwSettings
);
86 if (memcmp(¤tBoardHwSettings
, &boardHwSettings
, sizeof(HwTinyFISHSettingsData
)) != 0) {
87 ExtendedAlarmsSet(SYSTEMALARMS_ALARM_BOOTFAULT
, SYSTEMALARMS_ALARM_CRITICAL
, SYSTEMALARMS_EXTENDEDALARMSTATUS_REBOOTREQUIRED
, 0);
93 * initializes all the core subsystems on this specific hardware
94 * called from System/openpilot.c
97 void PIOS_Board_Init(void)
99 #if defined(PIOS_INCLUDE_LED)
100 const struct pios_gpio_cfg
*led_cfg
= PIOS_BOARD_HW_DEFS_GetLedCfg(pios_board_info_blob
.board_rev
);
101 PIOS_DEBUG_Assert(led_cfg
);
102 PIOS_LED_Init(led_cfg
);
103 #endif /* PIOS_INCLUDE_LED */
105 #ifdef PIOS_INCLUDE_INSTRUMENTATION
106 PIOS_Instrumentation_Init(PIOS_INSTRUMENTATION_MAX_COUNTERS
);
109 #if defined(PIOS_INCLUDE_SPI)
110 /* Set up the SPI interface to the mpu6000 */
112 if (PIOS_SPI_Init(&pios_spi1_id
, &pios_spi1_cfg
)) {
113 PIOS_DEBUG_Assert(0);
116 if (PIOS_SPI_Init(&pios_spi2_id
, &pios_spi2_cfg
)) {
117 PIOS_DEBUG_Assert(0);
121 #if defined(PIOS_INCLUDE_FLASH)
122 /* Connect flash to the appropriate interface and configure it */
125 // initialize the internal settings storage flash
126 if (PIOS_Flash_Internal_Init(&flash_id
, &flash_internal_system_cfg
)) {
127 PIOS_DEBUG_Assert(0);
130 if (PIOS_FLASHFS_Logfs_Init(&pios_uavo_settings_fs_id
, &flashfs_internal_cfg
, &pios_internal_flash_driver
, flash_id
)) {
131 PIOS_DEBUG_Assert(0);
134 /* init SPI flash here */
136 #endif /* if defined(PIOS_INCLUDE_FLASH) */
138 /* Initialize the task monitor */
139 if (PIOS_TASK_MONITOR_Initialize(TASKINFO_RUNNING_NUMELEM
)) {
143 /* Initialize the delayed callback library */
144 PIOS_CALLBACKSCHEDULER_Initialize();
146 /* Initialize UAVObject libraries */
147 EventDispatcherInitialize();
149 SETTINGS_INITIALISE_ALL
;
151 #if defined(PIOS_INCLUDE_RTC)
152 /* Initialize the real-time clock and its associated tick */
153 PIOS_RTC_Init(&pios_rtc_main_cfg
);
156 // check for safe mode commands from gcs
157 if (PIOS_IAP_ReadBootCmd(0) == PIOS_IAP_CLEAR_FLASH_CMD_0
&&
158 PIOS_IAP_ReadBootCmd(1) == PIOS_IAP_CLEAR_FLASH_CMD_1
&&
159 PIOS_IAP_ReadBootCmd(2) == PIOS_IAP_CLEAR_FLASH_CMD_2
) {
160 PIOS_FLASHFS_Format(pios_uavo_settings_fs_id
);
161 PIOS_IAP_WriteBootCmd(0, 0);
162 PIOS_IAP_WriteBootCmd(1, 0);
163 PIOS_IAP_WriteBootCmd(2, 0);
167 #ifdef PIOS_INCLUDE_WDG
168 /* Initialize watchdog as early as possible to catch faults during init */
173 /* Initialize the alarms library */
176 /* Check for repeated boot failures */
177 uint16_t boot_count
= PIOS_IAP_ReadBootCount();
178 if (boot_count
< 3) {
179 PIOS_IAP_WriteBootCount(++boot_count
);
180 AlarmsClear(SYSTEMALARMS_ALARM_BOOTFAULT
);
182 /* Too many failed boot attempts, force hwsettings to defaults */
183 HwSettingsSetDefaults(HwSettingsHandle(), 0);
184 HwTinyFISHSettingsSetDefaults(HwTinyFISHSettingsHandle(), 0);
186 AlarmsSet(SYSTEMALARMS_ALARM_BOOTFAULT
, SYSTEMALARMS_ALARM_CRITICAL
);
190 PIOS_TIM_InitClock(&tim_1_cfg
);
191 PIOS_TIM_InitClock(&tim_2_cfg
);
192 // PIOS_TIM_InitClock(&tim_3_cfg);
193 PIOS_TIM_InitClock(&tim_4_cfg
);
194 PIOS_TIM_InitClock(&tim_8_cfg
);
195 PIOS_TIM_InitClock(&tim_15_cfg
);
196 // PIOS_TIM_InitClock(&tim_16_cfg);
197 // PIOS_TIM_InitClock(&tim_17_cfg);
199 #if defined(PIOS_INCLUDE_USB)
200 PIOS_BOARD_IO_Configure_USB();
203 HwTinyFISHSettingsConnectCallback(hwTinyFISHSettingsUpdatedCb
);
205 HwTinyFISHSettingsGet(&boardHwSettings
);
207 static const PIOS_BOARD_IO_UART_Function uart_function_map
[] = {
208 [HWTINYFISHSETTINGS_UART3PORT_TELEMETRY
] = PIOS_BOARD_IO_UART_TELEMETRY
,
209 [HWTINYFISHSETTINGS_UART3PORT_GPS
] = PIOS_BOARD_IO_UART_GPS
,
210 [HWTINYFISHSETTINGS_UART3PORT_SBUS
] = PIOS_BOARD_IO_UART_SBUS
,
211 [HWTINYFISHSETTINGS_UART3PORT_DSM
] = PIOS_BOARD_IO_UART_DSM_MAIN
, // single DSM instance? ok.
212 [HWTINYFISHSETTINGS_UART3PORT_EXBUS
] = PIOS_BOARD_IO_UART_EXBUS
,
213 [HWTINYFISHSETTINGS_UART3PORT_HOTTSUMD
] = PIOS_BOARD_IO_UART_HOTT_SUMD
,
214 [HWTINYFISHSETTINGS_UART3PORT_HOTTSUMH
] = PIOS_BOARD_IO_UART_HOTT_SUMH
,
215 [HWTINYFISHSETTINGS_UART3PORT_SRXL
] = PIOS_BOARD_IO_UART_SRXL
,
216 [HWTINYFISHSETTINGS_UART3PORT_IBUS
] = PIOS_BOARD_IO_UART_IBUS
,
217 [HWTINYFISHSETTINGS_UART3PORT_DEBUGCONSOLE
] = PIOS_BOARD_IO_UART_DEBUGCONSOLE
,
218 [HWTINYFISHSETTINGS_UART3PORT_COMBRIDGE
] = PIOS_BOARD_IO_UART_COMBRIDGE
,
219 [HWTINYFISHSETTINGS_UART3PORT_MSP
] = PIOS_BOARD_IO_UART_MSP
,
220 [HWTINYFISHSETTINGS_UART3PORT_MAVLINK
] = PIOS_BOARD_IO_UART_MAVLINK
,
221 [HWTINYFISHSETTINGS_UART3PORT_HOTTTELEMETRY
] = PIOS_BOARD_IO_UART_HOTT_BRIDGE
,
222 [HWTINYFISHSETTINGS_UART3PORT_FRSKYSENSORHUB
] = PIOS_BOARD_IO_UART_FRSKY_SENSORHUB
,
225 if (boardHwSettings
.UART3Port
< NELEMENTS(uart_function_map
)) {
226 PIOS_BOARD_IO_Configure_UART(&pios_usart_cfg
[2], uart_function_map
[boardHwSettings
.UART3Port
]);
229 #ifdef PIOS_INCLUDE_PPM
230 if (boardHwSettings
.UART3Port
== HWTINYFISHSETTINGS_UART3PORT_PPM
) {
231 PIOS_BOARD_IO_Configure_PPM_RCVR(&pios_ppm_cfg
);
234 if (PIOS_COM_DEBUG
) {
235 PIOS_COM_ChangeBaud(PIOS_COM_DEBUG
, 57600);
236 DEBUG_PRINTF(0, "\r\n\r\ntinyFISH FC booting\r\n");
239 /* Configure SBus as primary usart client.
240 * PIOS_BOARD_IO_Configure_UART() will also lock COM port config so that secondary client cannot mess with settings */
241 if (boardHwSettings
.UART3Port
!= HWTINYFISHSETTINGS_UART3PORT_SBUS
) {
242 PIOS_BOARD_IO_Configure_UART(&pios_usart_cfg
[1], PIOS_BOARD_IO_UART_SBUS_NOT_INVERTED
);
245 /* Configure Frsky SensorHub as secondary client. */
246 if (boardHwSettings
.UART3Port
!= HWTINYFISHSETTINGS_UART3PORT_FRSKYSENSORHUB
) {
247 PIOS_BOARD_IO_Configure_UART(&pios_usart_cfg
[1], PIOS_BOARD_IO_UART_FRSKY_SENSORHUB
);
250 /* and what to do with UART1? There is RX_DEBUG only connected. Maybe make it into configurable ComBridge? */
251 if (boardHwSettings
.UART1Port
== HWTINYFISHSETTINGS_UART1PORT_COMBRIDGE
) {
252 PIOS_BOARD_IO_Configure_UART(&pios_usart_cfg
[0], PIOS_BOARD_IO_UART_COMBRIDGE
);
255 #ifdef PIOS_INCLUDE_GCSRCVR
256 PIOS_BOARD_IO_Configure_GCS_RCVR();
259 #ifdef PIOS_INCLUDE_OPLINKRCVR
260 PIOS_BOARD_IO_Configure_OPLink_RCVR();
263 #ifdef PIOS_ENABLE_DEBUG_PINS
264 PIOS_DEBUG_Init(&pios_servo_cfg
.channels
, pios_servo_cfg
.num_channels
);
266 if (boardHwSettings
.UART3Port
== HWTINYFISHSETTINGS_UART3PORT_OUTPUTS
) {
267 PIOS_Servo_Init(&pios_servo_uart3_cfg
);
269 PIOS_Servo_Init(&pios_servo_cfg
);
271 #endif /* PIOS_ENABLE_DEBUG_PINS */
273 switch (boardHwSettings
.LEDPort
) {
274 case HWTINYFISHSETTINGS_LEDPORT_WS281X
:
275 #if defined(PIOS_INCLUDE_WS2811)
276 PIOS_WS2811_Init(&pios_ws2811_id
, &pios_ws2811_cfg
);
283 PIOS_BOARD_Sensors_Configure();
285 PIOS_LED_On(PIOS_LED_HEARTBEAT
);