mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-16 12:55:19 +03:00
Fix LED_STRIP feature // Add DMA drivers // UART fixes
This commit is contained in:
parent
2af929797d
commit
3a156f98ab
17 changed files with 309 additions and 196 deletions
1
Makefile
1
Makefile
|
@ -296,6 +296,7 @@ COMMON_SRC = build_config.c \
|
||||||
drivers/sound_beeper.c \
|
drivers/sound_beeper.c \
|
||||||
drivers/system.c \
|
drivers/system.c \
|
||||||
drivers/gyro_sync.c \
|
drivers/gyro_sync.c \
|
||||||
|
drivers/dma.c \
|
||||||
drivers/buf_writer.c \
|
drivers/buf_writer.c \
|
||||||
io/beeper.c \
|
io/beeper.c \
|
||||||
io/rc_controls.c \
|
io/rc_controls.c \
|
||||||
|
|
83
src/main/drivers/dma.c
Normal file
83
src/main/drivers/dma.c
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
/*
|
||||||
|
* This file is part of Cleanflight.
|
||||||
|
*
|
||||||
|
* Cleanflight is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Cleanflight is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#include <platform.h>
|
||||||
|
|
||||||
|
#include "build_config.h"
|
||||||
|
|
||||||
|
#include "drivers/dma.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* DMA handlers for DMA resources that are shared between different features depending on run-time configuration.
|
||||||
|
*/
|
||||||
|
static dmaHandlers_t dmaHandlers;
|
||||||
|
|
||||||
|
void dmaNoOpHandler(DMA_Channel_TypeDef *channel)
|
||||||
|
{
|
||||||
|
UNUSED(channel);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DMA1_Channel2_IRQHandler(void)
|
||||||
|
{
|
||||||
|
dmaHandlers.dma1Channel2IRQHandler(DMA1_Channel2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DMA1_Channel3_IRQHandler(void)
|
||||||
|
{
|
||||||
|
dmaHandlers.dma1Channel3IRQHandler(DMA1_Channel3);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DMA1_Channel6_IRQHandler(void)
|
||||||
|
{
|
||||||
|
dmaHandlers.dma1Channel6IRQHandler(DMA1_Channel6);
|
||||||
|
}
|
||||||
|
|
||||||
|
void DMA1_Channel7_IRQHandler(void)
|
||||||
|
{
|
||||||
|
dmaHandlers.dma1Channel7IRQHandler(DMA1_Channel7);
|
||||||
|
}
|
||||||
|
|
||||||
|
void dmaInit(void)
|
||||||
|
{
|
||||||
|
memset(&dmaHandlers, 0, sizeof(dmaHandlers));
|
||||||
|
dmaHandlers.dma1Channel2IRQHandler = dmaNoOpHandler;
|
||||||
|
dmaHandlers.dma1Channel3IRQHandler = dmaNoOpHandler;
|
||||||
|
dmaHandlers.dma1Channel6IRQHandler = dmaNoOpHandler;
|
||||||
|
dmaHandlers.dma1Channel7IRQHandler = dmaNoOpHandler;
|
||||||
|
}
|
||||||
|
|
||||||
|
void dmaSetHandler(dmaHandlerIdentifier_e identifier, dmaCallbackHandlerFuncPtr callback)
|
||||||
|
{
|
||||||
|
switch (identifier) {
|
||||||
|
case DMA1_CH2_HANDLER:
|
||||||
|
dmaHandlers.dma1Channel2IRQHandler = callback;
|
||||||
|
break;
|
||||||
|
case DMA1_CH3_HANDLER:
|
||||||
|
dmaHandlers.dma1Channel3IRQHandler = callback;
|
||||||
|
break;
|
||||||
|
case DMA1_CH6_HANDLER:
|
||||||
|
dmaHandlers.dma1Channel6IRQHandler = callback;
|
||||||
|
break;
|
||||||
|
case DMA1_CH7_HANDLER:
|
||||||
|
dmaHandlers.dma1Channel7IRQHandler = callback;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
35
src/main/drivers/dma.h
Normal file
35
src/main/drivers/dma.h
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* This file is part of Cleanflight.
|
||||||
|
*
|
||||||
|
* Cleanflight is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* Cleanflight is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef void (*dmaCallbackHandlerFuncPtr)(DMA_Channel_TypeDef *channel);
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
DMA1_CH2_HANDLER = 0,
|
||||||
|
DMA1_CH3_HANDLER,
|
||||||
|
DMA1_CH6_HANDLER,
|
||||||
|
DMA1_CH7_HANDLER,
|
||||||
|
} dmaHandlerIdentifier_e;
|
||||||
|
|
||||||
|
typedef struct dmaHandlers_s {
|
||||||
|
dmaCallbackHandlerFuncPtr dma1Channel2IRQHandler;
|
||||||
|
dmaCallbackHandlerFuncPtr dma1Channel3IRQHandler;
|
||||||
|
dmaCallbackHandlerFuncPtr dma1Channel6IRQHandler;
|
||||||
|
dmaCallbackHandlerFuncPtr dma1Channel7IRQHandler;
|
||||||
|
} dmaHandlers_t;
|
||||||
|
|
||||||
|
void dmaInit(void);
|
||||||
|
void dmaSetHandler(dmaHandlerIdentifier_e identifier, dmaCallbackHandlerFuncPtr callback);
|
|
@ -17,20 +17,15 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
struct {
|
|
||||||
GPIO_TypeDef *gpio;
|
|
||||||
uint16_t pin;
|
|
||||||
} led_config[3];
|
|
||||||
|
|
||||||
// Helpful macros
|
// Helpful macros
|
||||||
#ifdef LED0
|
#ifdef LED0
|
||||||
#define LED0_TOGGLE digitalToggle(led_config[0].gpio, led_config[0].pin)
|
#define LED0_TOGGLE digitalToggle(LED0_GPIO, LED0_PIN)
|
||||||
#ifndef LED0_INVERTED
|
#ifndef LED0_INVERTED
|
||||||
#define LED0_OFF digitalHi(led_config[0].gpio, led_config[0].pin)
|
#define LED0_OFF digitalHi(LED0_GPIO, LED0_PIN)
|
||||||
#define LED0_ON digitalLo(led_config[0].gpio, led_config[0].pin)
|
#define LED0_ON digitalLo(LED0_GPIO, LED0_PIN)
|
||||||
#else
|
#else
|
||||||
#define LED0_OFF digitalLo(led_config[0].gpio, led_config[0].pin)
|
#define LED0_OFF digitalLo(LED0_GPIO, LED0_PIN)
|
||||||
#define LED0_ON digitalHi(led_config[0].gpio, led_config[0].pin)
|
#define LED0_ON digitalHi(LED0_GPIO, LED0_PIN)
|
||||||
#endif // inverted
|
#endif // inverted
|
||||||
#else
|
#else
|
||||||
#define LED0_TOGGLE do {} while(0)
|
#define LED0_TOGGLE do {} while(0)
|
||||||
|
@ -39,13 +34,13 @@ struct {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef LED1
|
#ifdef LED1
|
||||||
#define LED1_TOGGLE digitalToggle(led_config[1].gpio, led_config[1].pin)
|
#define LED1_TOGGLE digitalToggle(LED1_GPIO, LED1_PIN)
|
||||||
#ifndef LED1_INVERTED
|
#ifndef LED1_INVERTED
|
||||||
#define LED1_OFF digitalHi(led_config[1].gpio, led_config[1].pin)
|
#define LED1_OFF digitalHi(LED1_GPIO, LED1_PIN)
|
||||||
#define LED1_ON digitalLo(led_config[1].gpio, led_config[1].pin)
|
#define LED1_ON digitalLo(LED1_GPIO, LED1_PIN)
|
||||||
#else
|
#else
|
||||||
#define LED1_OFF digitalLo(led_config[1].gpio, led_config[1].pin)
|
#define LED1_OFF digitalLo(LED1_GPIO, LED1_PIN)
|
||||||
#define LED1_ON digitalHi(led_config[1].gpio, led_config[1].pin)
|
#define LED1_ON digitalHi(LED1_GPIO, LED1_PIN)
|
||||||
#endif // inverted
|
#endif // inverted
|
||||||
#else
|
#else
|
||||||
#define LED1_TOGGLE do {} while(0)
|
#define LED1_TOGGLE do {} while(0)
|
||||||
|
@ -55,13 +50,13 @@ struct {
|
||||||
|
|
||||||
|
|
||||||
#ifdef LED2
|
#ifdef LED2
|
||||||
#define LED2_TOGGLE digitalToggle(led_config[2].gpio, led_config[2].pin)
|
#define LED2_TOGGLE digitalToggle(LED2_GPIO, LED2_PIN)
|
||||||
#ifndef LED2_INVERTED
|
#ifndef LED2_INVERTED
|
||||||
#define LED2_OFF digitalHi(led_config[2].gpio, led_config[2].pin)
|
#define LED2_OFF digitalHi(LED2_GPIO, LED2_PIN)
|
||||||
#define LED2_ON digitalLo(led_config[2].gpio, led_config[2].pin)
|
#define LED2_ON digitalLo(LED2_GPIO, LED2_PIN)
|
||||||
#else
|
#else
|
||||||
#define LED2_OFF digitalLo(led_config[2].gpio, led_config[2].pin)
|
#define LED2_OFF digitalLo(LED2_GPIO, LED2_PIN)
|
||||||
#define LED2_ON digitalHi(led_config[2].gpio, led_config[2].pin)
|
#define LED2_ON digitalHi(LED2_GPIO, LED2_PIN)
|
||||||
#endif // inverted
|
#endif // inverted
|
||||||
#else
|
#else
|
||||||
#define LED2_TOGGLE do {} while(0)
|
#define LED2_TOGGLE do {} while(0)
|
||||||
|
@ -69,4 +64,4 @@ struct {
|
||||||
#define LED2_ON do {} while(0)
|
#define LED2_ON do {} while(0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void ledInit(bool alternative_led);
|
void ledInit(void);
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "platform.h"
|
#include <platform.h>
|
||||||
|
|
||||||
#include "common/utils.h"
|
#include "common/utils.h"
|
||||||
|
|
||||||
|
@ -28,37 +28,56 @@
|
||||||
|
|
||||||
#include "light_led.h"
|
#include "light_led.h"
|
||||||
|
|
||||||
void ledInit(bool alternative_led)
|
|
||||||
|
void ledInit(void)
|
||||||
{
|
{
|
||||||
UNUSED(alternative_led);
|
|
||||||
#if defined(LED0) || defined(LED1) || defined(LED2)
|
#if defined(LED0) || defined(LED1) || defined(LED2)
|
||||||
gpio_config_t cfg;
|
uint32_t i;
|
||||||
cfg.mode = Mode_Out_PP;
|
|
||||||
cfg.speed = Speed_2MHz;
|
struct {
|
||||||
|
GPIO_TypeDef *gpio;
|
||||||
|
gpio_config_t cfg;
|
||||||
|
} gpio_setup[] = {
|
||||||
|
#ifdef LED0
|
||||||
|
{
|
||||||
|
.gpio = LED0_GPIO,
|
||||||
|
.cfg = { LED0_PIN, Mode_Out_PP, Speed_2MHz }
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
#ifdef LED1
|
||||||
|
{
|
||||||
|
.gpio = LED1_GPIO,
|
||||||
|
.cfg = { LED1_PIN, Mode_Out_PP, Speed_2MHz }
|
||||||
|
},
|
||||||
|
#endif
|
||||||
|
#ifdef LED2
|
||||||
|
{
|
||||||
|
.gpio = LED2_GPIO,
|
||||||
|
.cfg = { LED2_PIN, Mode_Out_PP, Speed_2MHz }
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
uint8_t gpio_count = ARRAYLEN(gpio_setup);
|
||||||
|
|
||||||
#ifdef LED0
|
#ifdef LED0
|
||||||
RCC_APB2PeriphClockCmd(LED0_PERIPHERAL, ENABLE);
|
RCC_APB2PeriphClockCmd(LED0_PERIPHERAL, ENABLE);
|
||||||
led_config[0].gpio = LED0_GPIO;
|
|
||||||
led_config[0].pin = LED0_PIN;
|
|
||||||
cfg.pin = led_config[0].pin;
|
|
||||||
LED0_OFF;
|
|
||||||
gpioInit(led_config[0].gpio, &cfg);
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef LED1
|
#ifdef LED1
|
||||||
RCC_APB2PeriphClockCmd(LED1_PERIPHERAL, ENABLE);
|
RCC_APB2PeriphClockCmd(LED1_PERIPHERAL, ENABLE);
|
||||||
led_config[1].gpio = LED1_GPIO;
|
|
||||||
led_config[1].pin = LED1_PIN;
|
|
||||||
cfg.pin = led_config[1].pin;
|
|
||||||
LED1_OFF;
|
|
||||||
gpioInit(led_config[1].gpio, &cfg);
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef LED2
|
#ifdef LED2
|
||||||
RCC_APB2PeriphClockCmd(LED2_PERIPHERAL, ENABLE);
|
RCC_APB2PeriphClockCmd(LED2_PERIPHERAL, ENABLE);
|
||||||
led_config[2].gpio = LED2_GPIO;
|
|
||||||
led_config[2].pin = LED2_PIN;
|
|
||||||
cfg.pin = led_config[2].pin;
|
|
||||||
LED2_OFF;
|
|
||||||
gpioInit(led_config[2].gpio, &cfg);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
LED0_OFF;
|
||||||
|
LED1_OFF;
|
||||||
|
LED2_OFF;
|
||||||
|
|
||||||
|
for (i = 0; i < gpio_count; i++) {
|
||||||
|
gpioInit(gpio_setup[i].gpio, &gpio_setup[i].cfg);
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "platform.h"
|
#include <platform.h>
|
||||||
|
|
||||||
#include "common/utils.h"
|
#include "common/utils.h"
|
||||||
|
|
||||||
|
@ -27,62 +27,52 @@
|
||||||
|
|
||||||
#include "light_led.h"
|
#include "light_led.h"
|
||||||
|
|
||||||
void ledInit(bool alternative_led)
|
void ledInit(void)
|
||||||
{
|
{
|
||||||
#if defined(LED0) || defined(LED1) || defined(LED2)
|
uint32_t i;
|
||||||
gpio_config_t cfg;
|
|
||||||
cfg.mode = Mode_Out_PP;
|
struct {
|
||||||
cfg.speed = Speed_2MHz;
|
GPIO_TypeDef *gpio;
|
||||||
|
gpio_config_t cfg;
|
||||||
|
} gpio_setup[] = {
|
||||||
#ifdef LED0
|
#ifdef LED0
|
||||||
if (alternative_led) {
|
{
|
||||||
#ifdef LED0_PERIPHERAL_2
|
.gpio = LED0_GPIO,
|
||||||
RCC_AHBPeriphClockCmd(LED0_PERIPHERAL_2, ENABLE);
|
.cfg = { LED0_PIN, Mode_Out_PP, Speed_2MHz }
|
||||||
led_config[0].gpio = LED0_GPIO_2;
|
},
|
||||||
led_config[0].pin = LED0_PIN_2;
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
RCC_AHBPeriphClockCmd(LED0_PERIPHERAL, ENABLE);
|
|
||||||
led_config[0].gpio = LED0_GPIO;
|
|
||||||
led_config[0].pin = LED0_PIN;
|
|
||||||
}
|
|
||||||
cfg.pin = led_config[0].pin;
|
|
||||||
LED0_OFF;
|
|
||||||
gpioInit(led_config[0].gpio, &cfg);
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef LED1
|
#ifdef LED1
|
||||||
if (alternative_led) {
|
{
|
||||||
#ifdef LED1_PERIPHERAL_2
|
.gpio = LED1_GPIO,
|
||||||
RCC_AHBPeriphClockCmd(LED1_PERIPHERAL_2, ENABLE);
|
.cfg = { LED1_PIN, Mode_Out_PP, Speed_2MHz }
|
||||||
led_config[1].gpio = LED1_GPIO_2;
|
},
|
||||||
led_config[1].pin = LED1_PIN_2;
|
|
||||||
#endif
|
|
||||||
} else {
|
|
||||||
RCC_AHBPeriphClockCmd(LED1_PERIPHERAL, ENABLE);
|
|
||||||
led_config[1].gpio = LED1_GPIO;
|
|
||||||
led_config[1].pin = LED1_PIN;
|
|
||||||
}
|
|
||||||
cfg.pin = led_config[1].pin;
|
|
||||||
LED1_OFF;
|
|
||||||
gpioInit(led_config[1].gpio, &cfg);
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef LED2
|
#ifdef LED2
|
||||||
if (alternative_led) {
|
{
|
||||||
#ifdef LED2_PERIPHERAL_2
|
.gpio = LED2_GPIO,
|
||||||
RCC_AHBPeriphClockCmd(LED2_PERIPHERAL_2, ENABLE);
|
.cfg = { LED2_PIN, Mode_Out_PP, Speed_2MHz }
|
||||||
led_config[2].gpio = LED2_GPIO_2;
|
}
|
||||||
led_config[2].pin = LED2_PIN_2;
|
|
||||||
#endif
|
#endif
|
||||||
} else {
|
};
|
||||||
RCC_AHBPeriphClockCmd(LED2_PERIPHERAL, ENABLE);
|
|
||||||
led_config[2].gpio = LED2_GPIO;
|
uint8_t gpio_count = ARRAYLEN(gpio_setup);
|
||||||
led_config[2].pin = LED2_PIN;
|
|
||||||
}
|
#ifdef LED0
|
||||||
cfg.pin = led_config[2].pin;
|
RCC_AHBPeriphClockCmd(LED0_PERIPHERAL, ENABLE);
|
||||||
|
#endif
|
||||||
|
#ifdef LED1
|
||||||
|
RCC_AHBPeriphClockCmd(LED1_PERIPHERAL, ENABLE);
|
||||||
|
#endif
|
||||||
|
#ifdef LED2
|
||||||
|
RCC_AHBPeriphClockCmd(LED2_PERIPHERAL, ENABLE);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
LED0_OFF;
|
||||||
|
LED1_OFF;
|
||||||
LED2_OFF;
|
LED2_OFF;
|
||||||
gpioInit(led_config[2].gpio, &cfg);
|
|
||||||
#endif
|
for (i = 0; i < gpio_count; i++) {
|
||||||
#else
|
gpioInit(gpio_setup[i].gpio, &gpio_setup[i].cfg);
|
||||||
UNUSED(alternative_led);
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -27,12 +27,13 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "platform.h"
|
#include <platform.h>
|
||||||
|
|
||||||
#include "build_config.h"
|
#include "build_config.h"
|
||||||
|
|
||||||
#include "common/color.h"
|
#include "common/color.h"
|
||||||
#include "common/colorconversion.h"
|
#include "common/colorconversion.h"
|
||||||
|
#include "drivers/dma.h"
|
||||||
#include "drivers/light_ws2811strip.h"
|
#include "drivers/light_ws2811strip.h"
|
||||||
|
|
||||||
uint8_t ledStripDMABuffer[WS2811_DMA_BUFFER_SIZE];
|
uint8_t ledStripDMABuffer[WS2811_DMA_BUFFER_SIZE];
|
||||||
|
@ -76,9 +77,18 @@ void setStripColors(const hsvColor_t *colors)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ws2811DMAHandler(DMA_Channel_TypeDef *channel) {
|
||||||
|
if (DMA_GetFlagStatus(WS2811_DMA_TC_FLAG)) {
|
||||||
|
ws2811LedDataTransferInProgress = 0;
|
||||||
|
DMA_Cmd(channel, DISABLE);
|
||||||
|
DMA_ClearFlag(WS2811_DMA_TC_FLAG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void ws2811LedStripInit(void)
|
void ws2811LedStripInit(void)
|
||||||
{
|
{
|
||||||
memset(&ledStripDMABuffer, 0, WS2811_DMA_BUFFER_SIZE);
|
memset(&ledStripDMABuffer, 0, WS2811_DMA_BUFFER_SIZE);
|
||||||
|
dmaSetHandler(WS2811_DMA_HANDLER_IDENTIFER, ws2811DMAHandler);
|
||||||
ws2811LedStripHardwareInit();
|
ws2811LedStripHardwareInit();
|
||||||
ws2811UpdateStrip();
|
ws2811UpdateStrip();
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "platform.h"
|
#include <platform.h>
|
||||||
|
|
||||||
#include "common/color.h"
|
#include "common/color.h"
|
||||||
#include "drivers/light_ws2811strip.h"
|
#include "drivers/light_ws2811strip.h"
|
||||||
|
@ -112,15 +112,6 @@ void ws2811LedStripHardwareInit(void)
|
||||||
ws2811UpdateStrip();
|
ws2811UpdateStrip();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DMA1_Channel6_IRQHandler(void)
|
|
||||||
{
|
|
||||||
if (DMA_GetFlagStatus(DMA1_FLAG_TC6)) {
|
|
||||||
ws2811LedDataTransferInProgress = 0;
|
|
||||||
DMA_Cmd(DMA1_Channel6, DISABLE); // disable DMA channel 6
|
|
||||||
DMA_ClearFlag(DMA1_FLAG_TC6); // clear DMA1 Channel 6 transfer complete flag
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void ws2811LedStripDMAEnable(void)
|
void ws2811LedStripDMAEnable(void)
|
||||||
{
|
{
|
||||||
DMA_SetCurrDataCounter(DMA1_Channel6, WS2811_DMA_BUFFER_SIZE); // load number of bytes to be transferred
|
DMA_SetCurrDataCounter(DMA1_Channel6, WS2811_DMA_BUFFER_SIZE); // load number of bytes to be transferred
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "platform.h"
|
#include <platform.h>
|
||||||
|
|
||||||
#include "gpio.h"
|
#include "gpio.h"
|
||||||
#include "nvic.h"
|
#include "nvic.h"
|
||||||
|
@ -27,7 +27,6 @@
|
||||||
#include "drivers/light_ws2811strip.h"
|
#include "drivers/light_ws2811strip.h"
|
||||||
|
|
||||||
#ifndef WS2811_GPIO
|
#ifndef WS2811_GPIO
|
||||||
#define USE_LED_STRIP_ON_DMA1_CHANNEL3
|
|
||||||
#define WS2811_GPIO GPIOB
|
#define WS2811_GPIO GPIOB
|
||||||
#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOB
|
#define WS2811_GPIO_AHB_PERIPHERAL RCC_AHBPeriph_GPIOB
|
||||||
#define WS2811_GPIO_AF GPIO_AF_1
|
#define WS2811_GPIO_AF GPIO_AF_1
|
||||||
|
@ -37,6 +36,9 @@
|
||||||
#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM16
|
#define WS2811_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM16
|
||||||
#define WS2811_DMA_CHANNEL DMA1_Channel3
|
#define WS2811_DMA_CHANNEL DMA1_Channel3
|
||||||
#define WS2811_IRQ DMA1_Channel3_IRQn
|
#define WS2811_IRQ DMA1_Channel3_IRQn
|
||||||
|
#define WS2811_DMA_TC_FLAG DMA1_FLAG_TC3
|
||||||
|
#define WS2811_DMA_HANDLER_IDENTIFER DMA1_CH3_HANDLER
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void ws2811LedStripHardwareInit(void)
|
void ws2811LedStripHardwareInit(void)
|
||||||
|
@ -124,39 +126,6 @@ void ws2811LedStripHardwareInit(void)
|
||||||
ws2811UpdateStrip();
|
ws2811UpdateStrip();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_LED_STRIP_ON_DMA1_CHANNEL3
|
|
||||||
void DMA1_Channel3_IRQHandler(void)
|
|
||||||
{
|
|
||||||
if (DMA_GetFlagStatus(DMA1_FLAG_TC3)) {
|
|
||||||
ws2811LedDataTransferInProgress = 0;
|
|
||||||
DMA_Cmd(DMA1_Channel3, DISABLE); // disable DMA channel
|
|
||||||
DMA_ClearFlag(DMA1_FLAG_TC3); // clear DMA1 Channel transfer complete flag
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_LED_STRIP_ON_DMA1_CHANNEL2
|
|
||||||
void DMA1_Channel2_IRQHandler(void)
|
|
||||||
{
|
|
||||||
if (DMA_GetFlagStatus(DMA1_FLAG_TC2)) {
|
|
||||||
ws2811LedDataTransferInProgress = 0;
|
|
||||||
DMA_Cmd(DMA1_Channel2, DISABLE); // disable DMA channel
|
|
||||||
DMA_ClearFlag(DMA1_FLAG_TC2); // clear DMA1 Channel transfer complete flag
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_LED_STRIP_ON_DMA1_CHANNEL7
|
|
||||||
void DMA1_Channel7_IRQHandler(void)
|
|
||||||
{
|
|
||||||
if (DMA_GetFlagStatus(DMA1_FLAG_TC7)) {
|
|
||||||
ws2811LedDataTransferInProgress = 0;
|
|
||||||
DMA_Cmd(DMA1_Channel7, DISABLE); // disable DMA channel
|
|
||||||
DMA_ClearFlag(DMA1_FLAG_TC7); // clear DMA1 Channel transfer complete flag
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void ws2811LedStripDMAEnable(void)
|
void ws2811LedStripDMAEnable(void)
|
||||||
{
|
{
|
||||||
DMA_SetCurrDataCounter(WS2811_DMA_CHANNEL, WS2811_DMA_BUFFER_SIZE); // load number of bytes to be transferred
|
DMA_SetCurrDataCounter(WS2811_DMA_CHANNEL, WS2811_DMA_BUFFER_SIZE); // load number of bytes to be transferred
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "platform.h"
|
#include <platform.h>
|
||||||
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "gpio.h"
|
#include "gpio.h"
|
||||||
|
@ -49,7 +49,7 @@ static uartPort_t uartPort3;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Using RX DMA disables the use of receive callbacks
|
// Using RX DMA disables the use of receive callbacks
|
||||||
//#define USE_USART1_RX_DMA
|
#define USE_USART1_RX_DMA
|
||||||
|
|
||||||
#if defined(CC3D) // FIXME move board specific code to target.h files.
|
#if defined(CC3D) // FIXME move board specific code to target.h files.
|
||||||
#undef USE_USART1_RX_DMA
|
#undef USE_USART1_RX_DMA
|
||||||
|
|
|
@ -27,7 +27,7 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "platform.h"
|
#include <platform.h>
|
||||||
|
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "gpio.h"
|
#include "gpio.h"
|
||||||
|
|
|
@ -19,10 +19,11 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "platform.h"
|
#include <platform.h>
|
||||||
|
|
||||||
#include "build_config.h"
|
#include "build_config.h"
|
||||||
|
|
||||||
|
#include "drivers/dma.h"
|
||||||
#include "drivers/transponder_ir.h"
|
#include "drivers/transponder_ir.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -37,9 +38,19 @@ uint8_t transponderIrDMABuffer[TRANSPONDER_DMA_BUFFER_SIZE];
|
||||||
|
|
||||||
volatile uint8_t transponderIrDataTransferInProgress = 0;
|
volatile uint8_t transponderIrDataTransferInProgress = 0;
|
||||||
|
|
||||||
|
void transponderDMAHandler(DMA_Channel_TypeDef *channel)
|
||||||
|
{
|
||||||
|
if (DMA_GetFlagStatus(TRANSPONDER_DMA_TC_FLAG)) {
|
||||||
|
transponderIrDataTransferInProgress = 0;
|
||||||
|
DMA_Cmd(channel, DISABLE);
|
||||||
|
DMA_ClearFlag(TRANSPONDER_DMA_TC_FLAG);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void transponderIrInit(void)
|
void transponderIrInit(void)
|
||||||
{
|
{
|
||||||
memset(&transponderIrDMABuffer, 0, TRANSPONDER_DMA_BUFFER_SIZE);
|
memset(&transponderIrDMABuffer, 0, TRANSPONDER_DMA_BUFFER_SIZE);
|
||||||
|
dmaSetHandler(TRANSPONDER_DMA_HANDLER_IDENTIFER, transponderDMAHandler);
|
||||||
transponderIrHardwareInit();
|
transponderIrHardwareInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,4 +123,3 @@ void transponderIrTransmit(void)
|
||||||
transponderIrDataTransferInProgress = 1;
|
transponderIrDataTransferInProgress = 1;
|
||||||
transponderIrDMAEnable();
|
transponderIrDMAEnable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#define BIT_TOGGLE_0 0
|
#define BIT_TOGGLE_0 0
|
||||||
|
|
||||||
void transponderIrInit(void);
|
void transponderIrInit(void);
|
||||||
|
void transponderIrDisable(void);
|
||||||
|
|
||||||
void transponderIrHardwareInit(void);
|
void transponderIrHardwareInit(void);
|
||||||
void transponderIrDMAEnable(void);
|
void transponderIrDMAEnable(void);
|
||||||
|
|
|
@ -18,10 +18,11 @@
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "platform.h"
|
#include <platform.h>
|
||||||
|
|
||||||
|
#include "drivers/gpio.h"
|
||||||
#include "drivers/transponder_ir.h"
|
#include "drivers/transponder_ir.h"
|
||||||
#include "nvic.h"
|
#include "drivers/nvic.h"
|
||||||
|
|
||||||
#ifndef TRANSPONDER_GPIO
|
#ifndef TRANSPONDER_GPIO
|
||||||
#define USE_TRANSPONDER_ON_DMA1_CHANNEL3
|
#define USE_TRANSPONDER_ON_DMA1_CHANNEL3
|
||||||
|
@ -34,6 +35,8 @@
|
||||||
#define TRANSPONDER_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM16
|
#define TRANSPONDER_TIMER_APB2_PERIPHERAL RCC_APB2Periph_TIM16
|
||||||
#define TRANSPONDER_DMA_CHANNEL DMA1_Channel3
|
#define TRANSPONDER_DMA_CHANNEL DMA1_Channel3
|
||||||
#define TRANSPONDER_IRQ DMA1_Channel3_IRQn
|
#define TRANSPONDER_IRQ DMA1_Channel3_IRQn
|
||||||
|
#define TRANSPONDER_DMA_TC_FLAG DMA1_FLAG_TC3
|
||||||
|
#define TRANSPONDER_DMA_HANDLER_IDENTIFER DMA1_CH3_HANDLER
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void transponderIrHardwareInit(void)
|
void transponderIrHardwareInit(void)
|
||||||
|
@ -116,39 +119,6 @@ void transponderIrHardwareInit(void)
|
||||||
NVIC_Init(&NVIC_InitStructure);
|
NVIC_Init(&NVIC_InitStructure);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_TRANSPONDER_ON_DMA1_CHANNEL3
|
|
||||||
void DMA1_Channel3_IRQHandler(void)
|
|
||||||
{
|
|
||||||
if (DMA_GetFlagStatus(DMA1_FLAG_TC3)) {
|
|
||||||
transponderIrDataTransferInProgress = 0;
|
|
||||||
DMA_Cmd(DMA1_Channel3, DISABLE); // disable DMA channel
|
|
||||||
DMA_ClearFlag(DMA1_FLAG_TC3); // clear DMA1 Channel transfer complete flag
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_TRANSPONDER_ON_DMA1_CHANNEL2
|
|
||||||
void DMA1_Channel2_IRQHandler(void)
|
|
||||||
{
|
|
||||||
if (DMA_GetFlagStatus(DMA1_FLAG_TC2)) {
|
|
||||||
transponderIrDataTransferInProgress = 0;
|
|
||||||
DMA_Cmd(DMA1_Channel2, DISABLE); // disable DMA channel
|
|
||||||
DMA_ClearFlag(DMA1_FLAG_TC2); // clear DMA1 Channel transfer complete flag
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef USE_TRANSPONDER_ON_DMA1_CHANNEL7
|
|
||||||
void DMA1_Channel7_IRQHandler(void)
|
|
||||||
{
|
|
||||||
if (DMA_GetFlagStatus(DMA1_FLAG_TC7)) {
|
|
||||||
transponderIrDataTransferInProgress = 0;
|
|
||||||
DMA_Cmd(DMA1_Channel7, DISABLE); // disable DMA channel
|
|
||||||
DMA_ClearFlag(DMA1_FLAG_TC7); // clear DMA1 Channel transfer complete flag
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void transponderIrDMAEnable(void)
|
void transponderIrDMAEnable(void)
|
||||||
{
|
{
|
||||||
DMA_SetCurrDataCounter(TRANSPONDER_DMA_CHANNEL, TRANSPONDER_DMA_BUFFER_SIZE); // load number of bytes to be transferred
|
DMA_SetCurrDataCounter(TRANSPONDER_DMA_CHANNEL, TRANSPONDER_DMA_BUFFER_SIZE); // load number of bytes to be transferred
|
||||||
|
@ -157,4 +127,24 @@ void transponderIrDMAEnable(void)
|
||||||
DMA_Cmd(TRANSPONDER_DMA_CHANNEL, ENABLE);
|
DMA_Cmd(TRANSPONDER_DMA_CHANNEL, ENABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void transponderIrDisable(void)
|
||||||
|
{
|
||||||
|
GPIO_InitTypeDef GPIO_InitStructure;
|
||||||
|
|
||||||
|
DMA_Cmd(TRANSPONDER_DMA_CHANNEL, DISABLE);
|
||||||
|
TIM_Cmd(TRANSPONDER_TIMER, DISABLE);
|
||||||
|
|
||||||
|
GPIO_StructInit(&GPIO_InitStructure);
|
||||||
|
GPIO_InitStructure.GPIO_Pin = TRANSPONDER_PIN;
|
||||||
|
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
|
||||||
|
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
|
||||||
|
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
|
||||||
|
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
|
||||||
|
GPIO_Init(TRANSPONDER_GPIO, &GPIO_InitStructure);
|
||||||
|
#ifdef TRANSPONDER_INVERTED
|
||||||
|
digitalHi(TRANSPONDER_GPIO, TRANSPONDER_PIN);
|
||||||
|
#else
|
||||||
|
digitalLo(TRANSPONDER_GPIO, TRANSPONDER_PIN);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,13 +37,12 @@
|
||||||
|
|
||||||
#include <common/printf.h>
|
#include <common/printf.h>
|
||||||
|
|
||||||
|
#include "io/rc_controls.h"
|
||||||
|
|
||||||
#include "sensors/battery.h"
|
#include "sensors/battery.h"
|
||||||
|
|
||||||
#include "io/rc_controls.h"
|
|
||||||
#include "io/ledstrip.h"
|
#include "io/ledstrip.h"
|
||||||
|
|
||||||
#include "rx/rx.h"
|
|
||||||
|
|
||||||
#include "flight/failsafe.h"
|
#include "flight/failsafe.h"
|
||||||
|
|
||||||
#include "config/runtime_config.h"
|
#include "config/runtime_config.h"
|
||||||
|
@ -382,6 +381,10 @@ void updateLedCount(void)
|
||||||
ledCount = 0;
|
ledCount = 0;
|
||||||
ledsInRingCount = 0;
|
ledsInRingCount = 0;
|
||||||
|
|
||||||
|
if( ledConfigs == 0 ){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (ledIndex = 0; ledIndex < MAX_LED_STRIP_LENGTH; ledIndex++) {
|
for (ledIndex = 0; ledIndex < MAX_LED_STRIP_LENGTH; ledIndex++) {
|
||||||
|
|
||||||
ledConfig = &ledConfigs[ledIndex];
|
ledConfig = &ledConfigs[ledIndex];
|
||||||
|
@ -778,13 +781,18 @@ void applyLedThrottleLayer()
|
||||||
#define ROTATION_SEQUENCE_LED_COUNT 6 // 2 on, 4 off
|
#define ROTATION_SEQUENCE_LED_COUNT 6 // 2 on, 4 off
|
||||||
#define ROTATION_SEQUENCE_LED_WIDTH 2
|
#define ROTATION_SEQUENCE_LED_WIDTH 2
|
||||||
|
|
||||||
|
#define RING_PATTERN_NOT_CALCULATED 255
|
||||||
|
|
||||||
void applyLedThrustRingLayer(void)
|
void applyLedThrustRingLayer(void)
|
||||||
{
|
{
|
||||||
|
const ledConfig_t *ledConfig;
|
||||||
|
hsvColor_t ringColor;
|
||||||
uint8_t ledIndex;
|
uint8_t ledIndex;
|
||||||
|
|
||||||
|
// initialised to special value instead of using more memory for a flag.
|
||||||
|
static uint8_t rotationSeqLedCount = RING_PATTERN_NOT_CALCULATED;
|
||||||
static uint8_t rotationPhase = ROTATION_SEQUENCE_LED_COUNT;
|
static uint8_t rotationPhase = ROTATION_SEQUENCE_LED_COUNT;
|
||||||
bool nextLedOn = false;
|
bool nextLedOn = false;
|
||||||
hsvColor_t ringColor;
|
|
||||||
const ledConfig_t *ledConfig;
|
|
||||||
|
|
||||||
uint8_t ledRingIndex = 0;
|
uint8_t ledRingIndex = 0;
|
||||||
for (ledIndex = 0; ledIndex < ledCount; ledIndex++) {
|
for (ledIndex = 0; ledIndex < ledCount; ledIndex++) {
|
||||||
|
@ -797,7 +805,7 @@ void applyLedThrustRingLayer(void)
|
||||||
|
|
||||||
bool applyColor = false;
|
bool applyColor = false;
|
||||||
if (ARMING_FLAG(ARMED)) {
|
if (ARMING_FLAG(ARMED)) {
|
||||||
if ((ledRingIndex + rotationPhase) % ROTATION_SEQUENCE_LED_COUNT < ROTATION_SEQUENCE_LED_WIDTH) {
|
if ((ledRingIndex + rotationPhase) % rotationSeqLedCount < ROTATION_SEQUENCE_LED_WIDTH) {
|
||||||
applyColor = true;
|
applyColor = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -818,9 +826,29 @@ void applyLedThrustRingLayer(void)
|
||||||
ledRingIndex++;
|
ledRingIndex++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t ledRingLedCount = ledRingIndex;
|
||||||
|
if (rotationSeqLedCount == RING_PATTERN_NOT_CALCULATED) {
|
||||||
|
// update ring pattern according to total number of ring leds found
|
||||||
|
|
||||||
|
rotationSeqLedCount = ledRingLedCount;
|
||||||
|
|
||||||
|
// try to split in segments/rings of exactly ROTATION_SEQUENCE_LED_COUNT leds
|
||||||
|
if ((ledRingLedCount % ROTATION_SEQUENCE_LED_COUNT) == 0) {
|
||||||
|
rotationSeqLedCount = ROTATION_SEQUENCE_LED_COUNT;
|
||||||
|
} else {
|
||||||
|
// else split up in equal segments/rings of at most ROTATION_SEQUENCE_LED_COUNT leds
|
||||||
|
while ((rotationSeqLedCount > ROTATION_SEQUENCE_LED_COUNT) && ((rotationSeqLedCount % 2) == 0)) {
|
||||||
|
rotationSeqLedCount >>= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// trigger start over
|
||||||
|
rotationPhase = 1;
|
||||||
|
}
|
||||||
|
|
||||||
rotationPhase--;
|
rotationPhase--;
|
||||||
if (rotationPhase == 0) {
|
if (rotationPhase == 0) {
|
||||||
rotationPhase = ROTATION_SEQUENCE_LED_COUNT;
|
rotationPhase = rotationSeqLedCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1017,7 +1045,7 @@ bool parseColor(uint8_t index, const char *colorConfig)
|
||||||
|
|
||||||
void applyDefaultColors(hsvColor_t *colors, uint8_t colorCount)
|
void applyDefaultColors(hsvColor_t *colors, uint8_t colorCount)
|
||||||
{
|
{
|
||||||
memset(colors, 0, colorCount * sizeof(colors));
|
memset(colors, 0, colorCount * sizeof(hsvColor_t));
|
||||||
for (uint8_t colorIndex = 0; colorIndex < colorCount && colorIndex < (sizeof(defaultColors) / sizeof(defaultColors[0])); colorIndex++) {
|
for (uint8_t colorIndex = 0; colorIndex < colorCount && colorIndex < (sizeof(defaultColors) / sizeof(defaultColors[0])); colorIndex++) {
|
||||||
*colors++ = *defaultColors[colorIndex];
|
*colors++ = *defaultColors[colorIndex];
|
||||||
}
|
}
|
||||||
|
|
|
@ -95,4 +95,3 @@ void applyDefaultColors(hsvColor_t *colors, uint8_t colorCount);
|
||||||
|
|
||||||
void ledStripEnable(void);
|
void ledStripEnable(void);
|
||||||
void reevalulateLedConfig(void);
|
void reevalulateLedConfig(void);
|
||||||
|
|
||||||
|
|
|
@ -189,15 +189,7 @@ void init(void)
|
||||||
// Latch active features to be used for feature() in the remainder of init().
|
// Latch active features to be used for feature() in the remainder of init().
|
||||||
latchActiveFeatures();
|
latchActiveFeatures();
|
||||||
|
|
||||||
#ifdef ALIENFLIGHTF3
|
ledInit();
|
||||||
if (hardwareRevision == AFF3_REV_1) {
|
|
||||||
ledInit(false);
|
|
||||||
} else {
|
|
||||||
ledInit(true);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
ledInit(false);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef SPRACINGF3MINI
|
#ifdef SPRACINGF3MINI
|
||||||
gpio_config_t buttonAGpioConfig = {
|
gpio_config_t buttonAGpioConfig = {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue