From dc4791f0242e4fd770ae73e964f34d8e1feecae1 Mon Sep 17 00:00:00 2001 From: nathan Date: Wed, 29 Jun 2016 02:02:57 -0700 Subject: [PATCH 1/7] betaflight font mapping accounts for logo at the end of the font file, starting at 0xA0 --- src/main/drivers/max7456_symbols.h | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/main/drivers/max7456_symbols.h b/src/main/drivers/max7456_symbols.h index 68de428937..2030cb956b 100644 --- a/src/main/drivers/max7456_symbols.h +++ b/src/main/drivers/max7456_symbols.h @@ -125,16 +125,9 @@ #define SYM_MAG11 0xB6 // AH Center screen Graphics -//#define SYM_AH_CENTER 0x01 -#ifdef ALT_CENTER - #define SYM_AH_CENTER_LINE 0xB0 - #define SYM_AH_CENTER 0xB1 - #define SYM_AH_CENTER_LINE_RIGHT 0xB2 -#else - #define SYM_AH_CENTER_LINE 0x26 - #define SYM_AH_CENTER 0x7E - #define SYM_AH_CENTER_LINE_RIGHT 0xBC -#endif +#define SYM_AH_CENTER_LINE 0x26 +#define SYM_AH_CENTER_LINE_RIGHT 0x27 +#define SYM_AH_CENTER 0x7E #define SYM_AH_RIGHT 0x02 #define SYM_AH_LEFT 0x03 #define SYM_AH_DECORATION_UP 0xC9 @@ -183,7 +176,7 @@ #define SYM_FT 0x0F // Voltage and amperage -#define SYM_VOLT 0xA9 +#define SYM_VOLT 0x00 #define SYM_AMP 0x9A #define SYM_MAH 0xA4 #define SYM_WATT 0x57 @@ -214,11 +207,11 @@ #define SYM_FLY_H 0x71 // Throttle Position (%) -#define SYM_THR 0xC8 -#define SYM_THR1 0xC9 +#define SYM_THR 0x04 +#define SYM_THR1 0x05 // RSSI -#define SYM_RSSI 0xBA +#define SYM_RSSI 0x01 // Menu cursor #define SYM_CURSOR SYM_AH_LEFT From 562a193033d86e32bbd3fd3afed72acfe42037b0 Mon Sep 17 00:00:00 2001 From: nathan Date: Fri, 1 Jul 2016 01:30:04 -0700 Subject: [PATCH 2/7] 0x00 is reserved for string null byte termination, move the voltage symbol to 0x06 --- src/main/drivers/max7456_symbols.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/drivers/max7456_symbols.h b/src/main/drivers/max7456_symbols.h index 2030cb956b..b2e8da72b5 100644 --- a/src/main/drivers/max7456_symbols.h +++ b/src/main/drivers/max7456_symbols.h @@ -176,7 +176,7 @@ #define SYM_FT 0x0F // Voltage and amperage -#define SYM_VOLT 0x00 +#define SYM_VOLT 0x06 #define SYM_AMP 0x9A #define SYM_MAH 0xA4 #define SYM_WATT 0x57 From e0c28c30d5fa1c8292cc1c170435d170053fd3ae Mon Sep 17 00:00:00 2001 From: Read Error Date: Fri, 1 Jul 2016 06:34:41 -0400 Subject: [PATCH 3/7] USART5 doesn't exist on F3 or F4, should be UART5. --- src/main/io/serial.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/io/serial.c b/src/main/io/serial.c index b2effbb4b7..6fbdad7c0c 100644 --- a/src/main/io/serial.c +++ b/src/main/io/serial.c @@ -316,7 +316,7 @@ serialPort_t *openSerialPort( #endif #ifdef USE_USART5 case SERIAL_PORT_USART5: - serialPort = uartOpen(USART5, callback, baudRate, mode, options); + serialPort = uartOpen(UART5, callback, baudRate, mode, options); break; #endif #ifdef USE_USART6 From 7529213e9c9cdbdf00b4d0da98f5515f261fbf02 Mon Sep 17 00:00:00 2001 From: Read Error Date: Sat, 2 Jul 2016 07:01:13 -0400 Subject: [PATCH 4/7] Addition of UART4/5 to F3 --- src/main/drivers/serial_uart_stm32f30x.c | 160 +++++++++++++++++++++++ 1 file changed, 160 insertions(+) diff --git a/src/main/drivers/serial_uart_stm32f30x.c b/src/main/drivers/serial_uart_stm32f30x.c index c124f05e20..f457288ac9 100644 --- a/src/main/drivers/serial_uart_stm32f30x.c +++ b/src/main/drivers/serial_uart_stm32f30x.c @@ -71,6 +71,24 @@ #define UART3_RX_PINSOURCE GPIO_PinSource11 #endif +#ifndef UART4_GPIO +#define UART4_TX_PIN GPIO_Pin_10 // PC10 (AF5) +#define UART4_RX_PIN GPIO_Pin_11 // PC11 (AF5) +#define UART4_GPIO_AF GPIO_AF_5 +#define UART4_GPIO GPIOC +#define UART4_TX_PINSOURCE GPIO_PinSource10 +#define UART4_RX_PINSOURCE GPIO_PinSource11 +#endif + +#ifndef UART5_GPIO // The real UART5_RX is on PD2, no board is using. +#define UART5_TX_PIN GPIO_Pin_12 // PC12 (AF5) +#define UART5_RX_PIN GPIO_Pin_12 // PC12 (AF5) +#define UART5_GPIO_AF GPIO_AF_5 +#define UART5_GPIO GPIOC +#define UART5_TX_PINSOURCE GPIO_PinSource12 +#define UART5_RX_PINSOURCE GPIO_PinSource12 +#endif + #ifdef USE_USART1 static uartPort_t uartPort1; #endif @@ -80,6 +98,12 @@ static uartPort_t uartPort2; #ifdef USE_USART3 static uartPort_t uartPort3; #endif +#ifdef USE_USART4 +static uartPort_t uartPort4; +#endif +#ifdef USE_USART5 +static uartPort_t uartPort5; +#endif #ifdef USE_USART1 uartPort_t *serialUSART1(uint32_t baudRate, portMode_t mode, portOptions_t options) @@ -324,6 +348,124 @@ uartPort_t *serialUSART3(uint32_t baudRate, portMode_t mode, portOptions_t optio } #endif +#ifdef USE_USART4 +uartPort_t *serialUSART4(uint32_t baudRate, portMode_t mode, portOptions_t options) +{ + uartPort_t *s; + static volatile uint8_t rx4Buffer[UART4_RX_BUFFER_SIZE]; + static volatile uint8_t tx4Buffer[UART4_TX_BUFFER_SIZE]; + NVIC_InitTypeDef NVIC_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + + s = &uartPort4; + s->port.vTable = uartVTable; + + s->port.baudRate = baudRate; + + s->port.rxBufferSize = UART4_RX_BUFFER_SIZE; + s->port.txBufferSize = UART4_TX_BUFFER_SIZE; + s->port.rxBuffer = rx4Buffer; + s->port.txBuffer = tx4Buffer; + + s->USARTx = UART4; + + RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE); + + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = (options & SERIAL_INVERTED) ? GPIO_PuPd_DOWN : GPIO_PuPd_UP; + + if (options & SERIAL_BIDIR) { + GPIO_InitStructure.GPIO_Pin = UART4_TX_PIN; + GPIO_InitStructure.GPIO_OType = (options & SERIAL_INVERTED) ? GPIO_OType_PP : GPIO_OType_OD; + GPIO_PinAFConfig(UART4_GPIO, UART4_TX_PINSOURCE, UART4_GPIO_AF); + GPIO_Init(UART4_GPIO, &GPIO_InitStructure); + if(!(options & SERIAL_INVERTED)) + GPIO_SetBits(UART4_GPIO, UART4_TX_PIN); // OpenDrain output should be inactive + } else { + if (mode & MODE_TX) { + GPIO_InitStructure.GPIO_Pin = UART4_TX_PIN; + GPIO_PinAFConfig(UART4_GPIO, UART4_TX_PINSOURCE, UART4_GPIO_AF); + GPIO_Init(UART4_GPIO, &GPIO_InitStructure); + } + + if (mode & MODE_RX) { + GPIO_InitStructure.GPIO_Pin = UART4_RX_PIN; + GPIO_PinAFConfig(UART4_GPIO, UART4_RX_PINSOURCE, UART4_GPIO_AF); + GPIO_Init(UART4_GPIO, &GPIO_InitStructure); + } + } + + NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_PRIORITY_BASE(NVIC_PRIO_SERIALUART4); + NVIC_InitStructure.NVIC_IRQChannelSubPriority = NVIC_PRIORITY_SUB(NVIC_PRIO_SERIALUART4); + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + return s; +} +#endif + +#ifdef USE_USART5 +uartPort_t *serialUSART5(uint32_t baudRate, portMode_t mode, portOptions_t options) +{ + uartPort_t *s; + static volatile uint8_t rx5Buffer[UART5_RX_BUFFER_SIZE]; + static volatile uint8_t tx5Buffer[UART5_TX_BUFFER_SIZE]; + NVIC_InitTypeDef NVIC_InitStructure; + GPIO_InitTypeDef GPIO_InitStructure; + + s = &uartPort5; + s->port.vTable = uartVTable; + + s->port.baudRate = baudRate; + + s->port.rxBufferSize = UART5_RX_BUFFER_SIZE; + s->port.txBufferSize = UART5_TX_BUFFER_SIZE; + s->port.rxBuffer = rx5Buffer; + s->port.txBuffer = tx5Buffer; + + s->USARTx = UART5; + + RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5, ENABLE); + + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = (options & SERIAL_INVERTED) ? GPIO_PuPd_DOWN : GPIO_PuPd_UP; + + if (options & SERIAL_BIDIR) { + GPIO_InitStructure.GPIO_Pin = UART5_TX_PIN; + GPIO_InitStructure.GPIO_OType = (options & SERIAL_INVERTED) ? GPIO_OType_PP : GPIO_OType_OD; + GPIO_PinAFConfig(UART5_GPIO, UART5_TX_PINSOURCE, UART5_GPIO_AF); + GPIO_Init(UART5_GPIO, &GPIO_InitStructure); + if(!(options & SERIAL_INVERTED)) + GPIO_SetBits(UART5_GPIO, UART5_TX_PIN); // OpenDrain output should be inactive + } else { + if (mode & MODE_TX) { + GPIO_InitStructure.GPIO_Pin = UART5_TX_PIN; + GPIO_PinAFConfig(UART5_GPIO, UART5_TX_PINSOURCE, UART5_GPIO_AF); + GPIO_Init(UART5_GPIO, &GPIO_InitStructure); + } + + if (mode & MODE_RX) { + GPIO_InitStructure.GPIO_Pin = UART5_RX_PIN; + GPIO_PinAFConfig(UART5_GPIO, UART5_RX_PINSOURCE, UART5_GPIO_AF); + GPIO_Init(UART5_GPIO, &GPIO_InitStructure); + } + } + + NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn; + NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = NVIC_PRIORITY_BASE(NVIC_PRIO_SERIALUART5); + NVIC_InitStructure.NVIC_IRQChannelSubPriority = NVIC_PRIORITY_SUB(NVIC_PRIO_SERIALUART5); + NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; + NVIC_Init(&NVIC_InitStructure); + + return s; +} +#endif + static void handleUsartTxDma(uartPort_t *s) { DMA_Cmd(s->txDMAChannel, DISABLE); @@ -424,3 +566,21 @@ void USART3_IRQHandler(void) usartIrqHandler(s); } #endif + +#ifdef USE_USART4 +void UART4_IRQHandler(void) +{ + uartPort_t *s = &uartPort4; + + usartIrqHandler(s); +} +#endif + +#ifdef USE_USART5 +void UART5_IRQHandler(void) +{ + uartPort_t *s = &uartPort5; + + usartIrqHandler(s); +} +#endif From 816c5d1b8b060bf7b62b931f2b71a637a9392fe6 Mon Sep 17 00:00:00 2001 From: Martin Budden Date: Sat, 2 Jul 2016 21:14:56 +0100 Subject: [PATCH 5/7] Fixed Alien F4 serial RX UART. --- src/main/target/ALIENFLIGHTF4/target.h | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/target/ALIENFLIGHTF4/target.h b/src/main/target/ALIENFLIGHTF4/target.h index d5122a486c..2481ea6974 100644 --- a/src/main/target/ALIENFLIGHTF4/target.h +++ b/src/main/target/ALIENFLIGHTF4/target.h @@ -176,6 +176,7 @@ #define DEFAULT_FEATURES (FEATURE_MOTOR_STOP | FEATURE_BLACKBOX) #define DEFAULT_RX_FEATURE FEATURE_RX_SERIAL #define SERIALRX_PROVIDER SERIALRX_SPEKTRUM2048 +#define SERIALRX_UART SERIAL_PORT_USART3 #define USE_SERIAL_4WAY_BLHELI_INTERFACE From 72a6e701eb2bb0af06931807d50a9081c85ab4a6 Mon Sep 17 00:00:00 2001 From: blckmn Date: Sun, 3 Jul 2016 07:44:35 +1000 Subject: [PATCH 6/7] Fixed build issue for F1, and added dfu CLI command (for restart in DFU mode) --- src/main/drivers/io.h | 2 -- src/main/drivers/system.h | 1 + src/main/drivers/system_stm32f10x.c | 8 +++++++- src/main/drivers/system_stm32f30x.c | 9 ++++++++- src/main/drivers/system_stm32f4xx.c | 15 +++++++++++++++ src/main/io/serial_4way.c | 4 ++-- src/main/io/serial_cli.c | 24 +++++++++++++++++++++--- 7 files changed, 54 insertions(+), 9 deletions(-) diff --git a/src/main/drivers/io.h b/src/main/drivers/io.h index 121e7a0e1d..315560e430 100644 --- a/src/main/drivers/io.h +++ b/src/main/drivers/io.h @@ -40,14 +40,12 @@ typedef uint8_t ioConfig_t; // packed IO configuration #define IO_CONFIG(mode, speed) ((mode) | (speed)) #define IOCFG_OUT_PP IO_CONFIG(GPIO_Mode_Out_PP, GPIO_Speed_2MHz) -#define IOCFG_OUT_PP_25 IO_CONFIG(GPIO_Mode_Out_PP, GPIO_Speed_25MHz) #define IOCFG_OUT_OD IO_CONFIG(GPIO_Mode_Out_OD, GPIO_Speed_2MHz) #define IOCFG_AF_PP IO_CONFIG(GPIO_Mode_AF_PP, GPIO_Speed_2MHz) #define IOCFG_AF_OD IO_CONFIG(GPIO_Mode_AF_OD, GPIO_Speed_2MHz) #define IOCFG_IPD IO_CONFIG(GPIO_Mode_IPD, GPIO_Speed_2MHz) #define IOCFG_IPU IO_CONFIG(GPIO_Mode_IPU, GPIO_Speed_2MHz) #define IOCFG_IN_FLOATING IO_CONFIG(GPIO_Mode_IN_FLOATING, GPIO_Speed_2MHz) -#define IOCFG_IPU_25 IO_CONFIG(GPIO_Mode_IPU, GPIO_Speed_25MHz) #elif defined(STM32F3) || defined(STM32F4) diff --git a/src/main/drivers/system.h b/src/main/drivers/system.h index 92e17f8a82..c6d58aa744 100644 --- a/src/main/drivers/system.h +++ b/src/main/drivers/system.h @@ -42,6 +42,7 @@ void systemReset(void); void systemResetToBootloader(void); bool isMPUSoftReset(void); void cycleCounterInit(void); +void checkForBootLoaderRequest(void); void enableGPIOPowerUsageAndNoiseReductions(void); // current crystal frequency - 8 or 12MHz diff --git a/src/main/drivers/system_stm32f10x.c b/src/main/drivers/system_stm32f10x.c index 4ad526850a..3e59fe7342 100644 --- a/src/main/drivers/system_stm32f10x.c +++ b/src/main/drivers/system_stm32f10x.c @@ -37,7 +37,8 @@ void systemReset(void) SCB->AIRCR = AIRCR_VECTKEY_MASK | (uint32_t)0x04; } -void systemResetToBootloader(void) { +void systemResetToBootloader(void) +{ // 1FFFF000 -> 20000200 -> SP // 1FFFF004 -> 1FFFF021 -> PC @@ -68,6 +69,8 @@ bool isMPUSoftReset(void) void systemInit(void) { + checkForBootLoaderRequest(); + SetSysClock(false); #ifdef CC3D @@ -110,3 +113,6 @@ void systemInit(void) SysTick_Config(SystemCoreClock / 1000); } +void checkForBootLoaderRequest(void) +{ +} \ No newline at end of file diff --git a/src/main/drivers/system_stm32f30x.c b/src/main/drivers/system_stm32f30x.c index 7e58ab061a..ee8aef1a0e 100644 --- a/src/main/drivers/system_stm32f30x.c +++ b/src/main/drivers/system_stm32f30x.c @@ -35,7 +35,8 @@ void systemReset(void) SCB->AIRCR = AIRCR_VECTKEY_MASK | (uint32_t)0x04; } -void systemResetToBootloader(void) { +void systemResetToBootloader(void) +{ // 1FFFF000 -> 20000200 -> SP // 1FFFF004 -> 1FFFF021 -> PC @@ -82,6 +83,8 @@ bool isMPUSoftReset(void) void systemInit(void) { + checkForBootLoaderRequest(); + // Enable FPU SCB->CPACR = (0x3 << (10 * 2)) | (0x3 << (11 * 2)); SetSysClock(); @@ -102,3 +105,7 @@ void systemInit(void) // SysTick SysTick_Config(SystemCoreClock / 1000); } + +void checkForBootLoaderRequest(void) +{ +} diff --git a/src/main/drivers/system_stm32f4xx.c b/src/main/drivers/system_stm32f4xx.c index f0042026f9..697b2b743d 100644 --- a/src/main/drivers/system_stm32f4xx.c +++ b/src/main/drivers/system_stm32f4xx.c @@ -169,6 +169,8 @@ bool isMPUSoftReset(void) void systemInit(void) { + checkForBootLoaderRequest(); + SetSysClock(); // Configure NVIC preempt/priority groups @@ -194,3 +196,16 @@ void systemInit(void) SysTick_Config(SystemCoreClock / 1000); } +void(*bootJump)(void); +void checkForBootLoaderRequest(void) +{ + __enable_irq(); + if (*((uint32_t *)0x2001FFFC) == 0xDEADBEEF) { + *((uint32_t *)0x2001FFFC) = 0x0; + __set_MSP(0x20001000); + + bootJump = (void(*)(void))(*((uint32_t *) 0x1fff0004)); + bootJump(); + while (1); + } +} \ No newline at end of file diff --git a/src/main/io/serial_4way.c b/src/main/io/serial_4way.c index 49c5805417..bcea2f8a1e 100644 --- a/src/main/io/serial_4way.c +++ b/src/main/io/serial_4way.c @@ -120,12 +120,12 @@ void setEscLo(uint8_t selEsc) void setEscInput(uint8_t selEsc) { - IOConfigGPIO(escHardware[selEsc].io, IOCFG_IPU_25); + IOConfigGPIO(escHardware[selEsc].io, IOCFG_IPU); } void setEscOutput(uint8_t selEsc) { - IOConfigGPIO(escHardware[selEsc].io, IOCFG_OUT_PP_25); + IOConfigGPIO(escHardware[selEsc].io, IOCFG_OUT_PP); } // Initialize 4way ESC interface diff --git a/src/main/io/serial_cli.c b/src/main/io/serial_cli.c index a51f828eda..e160869df0 100644 --- a/src/main/io/serial_cli.c +++ b/src/main/io/serial_cli.c @@ -112,6 +112,7 @@ static void cliRxFail(char *cmdline); static void cliAdjustmentRange(char *cmdline); static void cliMotorMix(char *cmdline); static void cliDefaults(char *cmdline); +void cliDfu(char *cmdLine); static void cliDump(char *cmdLine); void cliDumpProfile(uint8_t profileIndex); void cliDumpRateProfile(uint8_t rateProfileIndex) ; @@ -122,6 +123,7 @@ static void cliPlaySound(char *cmdline); static void cliProfile(char *cmdline); static void cliRateProfile(char *cmdline); static void cliReboot(void); +static void cliRebootEx(bool bootLoader); static void cliSave(char *cmdline); static void cliSerial(char *cmdline); #ifndef SKIP_SERIAL_PASSTHROUGH @@ -263,8 +265,8 @@ const clicmd_t cmdTable[] = { CLI_COMMAND_DEF("color", "configure colors", NULL, cliColor), #endif CLI_COMMAND_DEF("defaults", "reset to defaults and reboot", NULL, cliDefaults), - CLI_COMMAND_DEF("dump", "dump configuration", - "[master|profile]", cliDump), + CLI_COMMAND_DEF("dfu", "DFU mode on reboot", NULL, cliDfu), + CLI_COMMAND_DEF("dump", "dump configuration", "[master|profile]", cliDump), CLI_COMMAND_DEF("exit", NULL, NULL, cliExit), CLI_COMMAND_DEF("feature", "configure features", "list\r\n" @@ -2564,10 +2566,19 @@ static void cliRateProfile(char *cmdline) { static void cliReboot(void) { - cliPrint("\r\nRebooting"); + cliRebootEx(false); +} + +static void cliRebootEx(bool bootLoader) +{ + cliPrint("\r\nRebooting"); bufWriterFlush(cliWriter); waitForSerialPortToFinishTransmitting(cliPort); stopMotors(); + if (bootLoader) { + systemResetToBootloader(); + return; + } systemReset(); } @@ -3107,6 +3118,13 @@ static void cliResource(char *cmdline) } } +void cliDfu(char *cmdLine) +{ + UNUSED(cmdLine); + cliPrint("\r\nRestarting in DFU mode"); + cliRebootEx(true); +} + void cliInit(serialConfig_t *serialConfig) { UNUSED(serialConfig); From f499041c8e16476459a911902c8c046e6c17f355 Mon Sep 17 00:00:00 2001 From: blckmn Date: Sun, 3 Jul 2016 08:00:21 +1000 Subject: [PATCH 7/7] STM32F4: execute extra enable irq on startup only if rebooting into DFU --- src/main/drivers/system_stm32f4xx.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/drivers/system_stm32f4xx.c b/src/main/drivers/system_stm32f4xx.c index 697b2b743d..53f3767a5e 100644 --- a/src/main/drivers/system_stm32f4xx.c +++ b/src/main/drivers/system_stm32f4xx.c @@ -199,9 +199,11 @@ void systemInit(void) void(*bootJump)(void); void checkForBootLoaderRequest(void) { - __enable_irq(); if (*((uint32_t *)0x2001FFFC) == 0xDEADBEEF) { + *((uint32_t *)0x2001FFFC) = 0x0; + + __enable_irq(); __set_MSP(0x20001000); bootJump = (void(*)(void))(*((uint32_t *) 0x1fff0004));