From d209c39dcc7bbda967ba2d498148db66ebd6b487 Mon Sep 17 00:00:00 2001 From: Bryan Biedenkapp Date: Thu, 2 Dec 2021 21:50:53 +0000 Subject: [PATCH] add Makefiles; fix compilation errors; --- ADF7021.cpp | 6 +- ADF7021.h | 1 - BitBuffer.cpp | 8 +- CalRSSI.h | 1 + Defines.h | 5 +- IO.cpp | 47 +++-- IO.h | 55 ++--- IOSTM.cpp | 214 +++++++++++--------- Makefile | 10 + Makefile.STM32FX | 342 ++++++++++++++++++++++++++++++++ SerialPort.cpp | 5 +- dmr/DMRDMORX.cpp | 2 +- dmr/DMRSlotRX.cpp | 2 - dvm-firmware-hs.vcxproj | 4 + dvm-firmware-hs.vcxproj.filters | 4 + p25/P25RX.cpp | 14 +- 16 files changed, 550 insertions(+), 170 deletions(-) create mode 100644 Makefile create mode 100644 Makefile.STM32FX diff --git a/ADF7021.cpp b/ADF7021.cpp index 823908e..13ec434 100644 --- a/ADF7021.cpp +++ b/ADF7021.cpp @@ -35,6 +35,8 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include + +#include "Globals.h" #include "ADF7021.h" #if defined(ENABLE_ADF7021) @@ -94,9 +96,9 @@ static void AD7021_IOCTL_Shift() /// static void AD7021_IOCTL_SLEPulse() { - io.SLE(HIGH); + io.SLE1(HIGH); io.delayBit(); - io.SLE(LOW); + io.SLE1(LOW); } /// diff --git a/ADF7021.h b/ADF7021.h index ad59047..dab3727 100644 --- a/ADF7021.h +++ b/ADF7021.h @@ -38,7 +38,6 @@ #define __ADF7021_H__ #include "Defines.h" -#include "IO.h" // --------------------------------------------------------------------------- // Constants diff --git a/BitBuffer.cpp b/BitBuffer.cpp index 19fa814..5843877 100644 --- a/BitBuffer.cpp +++ b/BitBuffer.cpp @@ -98,8 +98,8 @@ bool BitBuffer::put(uint8_t bit, uint8_t control) return false; } - WRITE_BIT(m_bits, m_head, bit); - WRITE_BIT(m_control, m_head, control); + _WRITE_BIT(m_bits, m_head, bit); + _WRITE_BIT(m_control, m_head, control); m_head++; if (m_head >= m_length) @@ -120,8 +120,8 @@ bool BitBuffer::get(uint8_t& bit, uint8_t& control) if (m_head == m_tail && !m_full) return false; - bit = READ_BIT(m_bits, m_tail); - control = READ_BIT(m_control, m_tail); + bit = _READ_BIT(m_bits, m_tail); + control = _READ_BIT(m_control, m_tail); m_full = false; diff --git a/CalRSSI.h b/CalRSSI.h index f068464..48943e2 100644 --- a/CalRSSI.h +++ b/CalRSSI.h @@ -39,6 +39,7 @@ // --------------------------------------------------------------------------- class DSP_FW_API CalRSSI { +public: /// Initializes a new instance of the CalRSSI class. CalRSSI(); diff --git a/Defines.h b/Defines.h index 3e55f53..a483955 100644 --- a/Defines.h +++ b/Defines.h @@ -33,7 +33,6 @@ #define __DEFINES_H__ #include -#include // --------------------------------------------------------------------------- // Types @@ -109,7 +108,7 @@ typedef unsigned long long ulong64_t; #define BIDIR_DATA_PIN // Enable full duplex support with dual ADF7021 (valid for homebrew hotspots only) -#define DUPLEX +// #define DUPLEX // TCXO of the ADF7021 // For 14.7456 MHz: @@ -138,6 +137,8 @@ typedef unsigned long long ulong64_t; const uint8_t BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U }; +#define CPU_TYPE_STM32 0x02U + // --------------------------------------------------------------------------- // Macros // --------------------------------------------------------------------------- diff --git a/IO.cpp b/IO.cpp index b6962f9..7a112e7 100644 --- a/IO.cpp +++ b/IO.cpp @@ -11,33 +11,32 @@ // Licensed under the GPLv2 License (https://opensource.org/licenses/GPL-2.0) // /* - * Copyright (C) 2015,2016,2020 by Jonathan Naylor G4KLX - * Copyright (C) 2016,2017,2018,2019,2020 by Andy Uribe CA6JAU - * Copyright (C) 2017 by Danilo DB4PLE - * Copyright (C) 2021 Bryan Biedenkapp N2PLL - * - * This program 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 2 of the License, or - * (at your option) any later version. - * - * This program 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 this program; if not, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#include "Config.h" +* Copyright (C) 2015,2016,2020 by Jonathan Naylor G4KLX +* Copyright (C) 2016,2017,2018,2019,2020 by Andy Uribe CA6JAU +* Copyright (C) 2017 by Danilo DB4PLE +* Copyright (C) 2021 Bryan Biedenkapp N2PLL +* +* This program 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 2 of the License, or +* (at your option) any later version. +* +* This program 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 this program; if not, write to the Free Software +* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ #include "Globals.h" +#include "ADF7021.h" #include "IO.h" - // --------------------------------------------------------------------------- - // Globals - // --------------------------------------------------------------------------- +// --------------------------------------------------------------------------- +// Globals +// --------------------------------------------------------------------------- uint32_t m_rxFrequency; uint32_t m_txFrequency; diff --git a/IO.h b/IO.h index 55fcdd9..74ae21c 100644 --- a/IO.h +++ b/IO.h @@ -36,7 +36,6 @@ #include "Defines.h" #include "Globals.h" #include "BitBuffer.h" -#include "ADF7021.h" // --------------------------------------------------------------------------- // Constants @@ -144,6 +143,32 @@ public: /// void getIntCounter(uint16_t& int1, uint16_t& int2); +#if defined(ZUMSPOT_ADF7021) || defined(LONESTAR_USB) || defined(SKYBRIDGE_HS) + /// + bool isDualBand(); +#endif + + /// + void SCLK(bool on); + /// + void SDATA(bool on); + /// + bool SREAD(); + /// + void SLE1(bool on); + +#if defined(DUPLEX) + /// + void SLE2(bool on); + /// + bool RXD2(); +#endif + /// + void CE(bool on); + /// + bool RXD1(); + /// + bool CLK(); private: bool m_started; @@ -168,14 +193,12 @@ private: /// Helper to check the frequencies are within band ranges of the ADF7021. void checkBand(uint32_t rxFreq, uint32_t txFreq); - +#if defined(ZUMSPOT_ADF7021) || defined(LONESTAR_USB) || defined(SKYBRIDGE_HS) /// void setBandVHF(bool enable); /// bool hasSingleADF7021(); - /// - bool isDualBand(); - +#endif /// void configureBand(); @@ -197,28 +220,6 @@ private: /// Starts hardware interrupts. void startInt(); - /// - void SCLK(bool on); - /// - void SDATA(bool on); - /// - bool SREAD(); - /// - void SLE1(bool on); - -#if defined(DUPLEX) - /// - void SLE2(bool on); - /// - bool RXD2(); -#endif - /// - void CE(bool on); - /// - bool RXD1(); - /// - bool CLK(); - /// void setTXDInt(bool on); #if defined(BIDIR_DATA_PIN) diff --git a/IOSTM.cpp b/IOSTM.cpp index c984ff2..033682e 100644 --- a/IOSTM.cpp +++ b/IOSTM.cpp @@ -335,6 +335,24 @@ static inline void delay_ns() // --------------------------------------------------------------------------- // Public Class Members // --------------------------------------------------------------------------- +/// +/// Gets the CPU type the firmware is running on. +/// +/// +uint8_t IO::getCPU() const +{ + return CPU_TYPE_STM32; +} + +/// +/// Gets the unique identifier for the air interface. +/// +/// +void IO::getUDID(uint8_t* buffer) +{ + ::memcpy(buffer, (void*)STM32_UUID, 12U); +} + /// /// /// @@ -343,35 +361,124 @@ void IO::delayBit() delay_ns(); } -// --------------------------------------------------------------------------- -// Private Class Members -// --------------------------------------------------------------------------- #if defined(ZUMSPOT_ADF7021) || defined(LONESTAR_USB) || defined(SKYBRIDGE_HS) /// /// /// -/// -void IO::setBandVHF(bool enable) +/// +bool IO::isDualBand() +{ + return GPIO_ReadInputDataBit(PORT_DL_DPX, PIN_DL_DPX) == Bit_SET; +} +#endif + +/// +/// +/// +/// +void IO::SCLK(bool on) { - GPIO_WriteBit(PORT_SET_BAND, PIN_SET_BAND, vhf_on ? Bit_SET : Bit_RESET); + GPIO_WriteBit(PORT_SCLK, PIN_SCLK, on ? Bit_SET : Bit_RESET); +} + +/// +/// +/// +/// +void IO::SDATA(bool on) +{ + GPIO_WriteBit(PORT_SDATA, PIN_SDATA, on ? Bit_SET : Bit_RESET); } /// /// /// /// -bool IO::hasSingleADF7021() +bool IO::SREAD() { - return GPIO_ReadInputDataBit(PORT_SGL_DBL, PIN_SGL_DBL) == Bit_SET; + return GPIO_ReadInputDataBit(PORT_SREAD, PIN_SREAD) == Bit_SET; +} + +/// +/// +/// +/// +void IO::SLE1(bool on) +{ + GPIO_WriteBit(PORT_SLE, PIN_SLE, on ? Bit_SET : Bit_RESET); +} + +#if defined(DUPLEX) +/// +/// +/// +/// +void IO::SLE2(bool on) +{ + GPIO_WriteBit(PORT_SLE2, PIN_SLE2, on ? Bit_SET : Bit_RESET); } /// /// /// /// -bool IO::isDualBand() +bool IO::RXD2() { - return GPIO_ReadInputDataBit(PORT_DL_DPX, PIN_DL_DPX) == Bit_SET; + return GPIO_ReadInputDataBit(PORT_RXD2, PIN_RXD2) == Bit_SET; +} +#endif + +/// +/// +/// +/// +void IO::CE(bool on) +{ + GPIO_WriteBit(PORT_CE, PIN_CE, on ? Bit_SET : Bit_RESET); +} + +/// +/// +/// +/// +bool IO::RXD1() +{ + return GPIO_ReadInputDataBit(PORT_RXD, PIN_RXD) == Bit_SET; +} + +/// +/// +/// +/// +bool IO::CLK() +{ +#if defined(BIDIR_DATA_PIN) + return GPIO_ReadInputDataBit(PORT_TXD, PIN_TXD) == Bit_SET; +#else + return GPIO_ReadInputDataBit(PORT_CLKOUT, PIN_CLKOUT) == Bit_SET; +#endif +} + +// --------------------------------------------------------------------------- +// Private Class Members +// --------------------------------------------------------------------------- +#if defined(ZUMSPOT_ADF7021) || defined(LONESTAR_USB) || defined(SKYBRIDGE_HS) +/// +/// +/// +/// +void IO::setBandVHF(bool enable) +{ + GPIO_WriteBit(PORT_SET_BAND, PIN_SET_BAND, enable ? Bit_SET : Bit_RESET); +} + +/// +/// +/// +/// +bool IO::hasSingleADF7021() +{ + return GPIO_ReadInputDataBit(PORT_SGL_DBL, PIN_SGL_DBL) == Bit_SET; } #endif @@ -701,93 +808,6 @@ void IO::setDataDirOut(bool dir) } #endif -/// -/// -/// -/// -void IO::SCLK(bool on) -{ - GPIO_WriteBit(PORT_SCLK, PIN_SCLK, on ? Bit_SET : Bit_RESET); -} - -/// -/// -/// -/// -void IO::SDATA(bool on) -{ - GPIO_WriteBit(PORT_SDATA, PIN_SDATA, on ? Bit_SET : Bit_RESET); -} - -/// -/// -/// -/// -bool IO::SREAD() -{ - return GPIO_ReadInputDataBit(PORT_SREAD, PIN_SREAD) == Bit_SET; -} - -/// -/// -/// -/// -void IO::SLE1(bool on) -{ - GPIO_WriteBit(PORT_SLE, PIN_SLE, on ? Bit_SET : Bit_RESET); -} - -#if defined(DUPLEX) -/// -/// -/// -/// -void IO::SLE2(bool on) -{ - GPIO_WriteBit(PORT_SLE2, PIN_SLE2, on ? Bit_SET : Bit_RESET); -} - -/// -/// -/// -/// -bool IO::RXD2() -{ - return GPIO_ReadInputDataBit(PORT_RXD2, PIN_RXD2) == Bit_SET; -} -#endif - -/// -/// -/// -/// -void IO::CE(bool on) -{ - GPIO_WriteBit(PORT_CE, PIN_CE, on ? Bit_SET : Bit_RESET); -} - -/// -/// -/// -/// -bool IO::RXD1() -{ - return GPIO_ReadInputDataBit(PORT_RXD, PIN_RXD) == Bit_SET; -} - -/// -/// -/// -/// -bool IO::CLK() -{ -#if defined(BIDIR_DATA_PIN) - return GPIO_ReadInputDataBit(PORT_TXD, PIN_TXD) == Bit_SET; -#else - return GPIO_ReadInputDataBit(PORT_CLKOUT, PIN_CLKOUT) == Bit_SET; -#endif -} - #if defined(BIDIR_DATA_PIN) /// /// diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0ab7e4d --- /dev/null +++ b/Makefile @@ -0,0 +1,10 @@ +#!/usr/bin/make + +default: + @echo Use the appropriate platform specific Makefile: Makefile.STM32FX. + +clean: + $(MAKE) -f Makefile.STM32FX clean + +.FORCE: + diff --git a/Makefile.STM32FX b/Makefile.STM32FX new file mode 100644 index 0000000..733368d --- /dev/null +++ b/Makefile.STM32FX @@ -0,0 +1,342 @@ +# STM32 library paths +F1_LIB_PATH=/opt/tools/STM32F10X_Lib +F4_LIB_PATH=/opt/tools/STM32F4XX_Lib + +# MCU external clock frequency (Hz) +CLK_PI_F4=12000000 +CLK_DEF=8000000 + +# Directory Structure +BINDIR=bin +OBJDIR_F1=obj_f1 +OBJDIR_F4=obj_f4 + +# Output files +BINELF_F1=mmdvm_f1.elf +BINHEX_F1=mmdvm_f1.hex +BINBIN_F1=mmdvm_f1.bin +BINELF_F1BL=mmdvm_f1bl.elf +BINHEX_F1BL=mmdvm_f1bl.hex +BINBIN_F1BL=mmdvm_f1bl.bin +BINELF_F1NOBL=mmdvm_f1nobl.elf +BINHEX_F1NOBL=mmdvm_f1nobl.hex +BINBIN_F1NOBL=mmdvm_f1nobl.bin +BINELF_F4=mmdvm_f4.elf +BINHEX_F4=mmdvm_f4.hex +BINBIN_F4=mmdvm_f4.bin + +# Header directories +INC_F1= . $(F1_LIB_PATH)/CMSIS/ $(F1_LIB_PATH)/Device/ $(F1_LIB_PATH)/STM32F10x_StdPeriph_Driver/inc/ $(F1_LIB_PATH)/usb/inc/ +INCLUDES_F1=$(INC_F1:%=-I%) +INC_F4= . $(F4_LIB_PATH)/CMSIS/Include/ $(F4_LIB_PATH)/Device/ $(F4_LIB_PATH)/STM32F4xx_StdPeriph_Driver/include/ +INCLUDES_F4=$(INC_F4:%=-I%) + +# CMSIS libraries +INCLUDES_LIBS_F1= +INCLUDES_LIBS_F4=$(F4_LIB_PATH)/CMSIS/Lib/GCC/libarm_cortexM4lf_math.a + +# STM32F1 Standard Peripheral Libraries source path +STD_LIB_F1=$(F1_LIB_PATH)/STM32F10x_StdPeriph_Driver/src + +# STM32F1 USB support source path +USB_F1=$(F1_LIB_PATH)/usb + +# STM32F4 Standard Peripheral Libraries source path +STD_LIB_F4=$(F4_LIB_PATH)/STM32F4xx_StdPeriph_Driver/source + +# STM32F1 system source path +SYS_DIR_F1=$(F1_LIB_PATH)/Device +STARTUP_DIR_F1=$(F1_LIB_PATH)/Device/startup + +# STM32F4 system source path +SYS_DIR_F4=$(F4_LIB_PATH)/Device +STARTUP_DIR_F4=$(F4_LIB_PATH)/Device/startup + +# GNU ARM Embedded Toolchain +CC=arm-none-eabi-gcc +CXX=arm-none-eabi-g++ +LD=arm-none-eabi-ld +AR=arm-none-eabi-ar +AS=arm-none-eabi-as +CP=arm-none-eabi-objcopy +OD=arm-none-eabi-objdump +NM=arm-none-eabi-nm +SIZE=arm-none-eabi-size +A2L=arm-none-eabi-addr2line + +# Configure vars depending on OS +ifeq ($(OS),Windows_NT) + CLEANCMD=del /S *.o *.hex *.bin *.elf + MDDIRS=md $@ + DFU_UTIL=./$(F1_LIB_PATH)/utils/win/dfu-util.exe + STM32FLASH=./$(F1_LIB_PATH)/utils/win/stm32flash.exe +else + CLEANCMD=rm -f $(OBJ_F1BL) $(OBJ_F4) $(OBJ_F7) $(BINDIR)/*.hex $(BINDIR)/mmdvm_f1.bin $(BINDIR)/mmdvm_f1bl.bin $(BINDIR)/mmdvm_f1nobl.bin $(BINDIR)/*.elf + MDDIRS=mkdir $@ + + ifeq ($(shell uname -s),Linux) + ST_FLASH_ON_PATH=$(shell which st-flash) + ST_FLASH_IS_ON_PATH=$(.SHELLSTATUS) + ifeq ($(shell uname -m),x86_64) + DFU_RST=./$(F1_LIB_PATH)/utils/linux64/upload-reset + DFU_UTIL=./$(F1_LIB_PATH)/utils/linux64/dfu-util + DFU_RST=./$(F1_LIB_PATH)/utils/linux64/upload-reset + DFU_UTIL=./$(F1_LIB_PATH)/utils/linux64/dfu-util + ifeq ($(ST_FLASH_IS_ON_PATH),0) + ST_FLASH=$(ST_FLASH_ON_PATH) + ST_FLASH_OPTS=--flash=128k + else + ST_FLASH=./$(F1_LIB_PATH)/utils/linux64/st-flash + ST_FLASH_OPTS= + endif + STM32FLASH=./$(F1_LIB_PATH)/utils/linux64/stm32flash + else ifeq ($(shell uname -m),armv7l) + DFU_RST=./$(F1_LIB_PATH)/utils/rpi32/upload-reset + DFU_UTIL=./$(F1_LIB_PATH)/utils/rpi32/dfu-util + ST_FLASH=./$(F1_LIB_PATH)/utils/rpi32/st-flash + STM32FLASH=./$(F1_LIB_PATH)/utils/rpi32/stm32flash + else ifeq ($(shell uname -m),armv6l) + DFU_RST=./$(F1_LIB_PATH)/utils/rpi32/upload-reset + DFU_UTIL=./$(F1_LIB_PATH)/utils/rpi32/dfu-util + ST_FLASH=./$(F1_LIB_PATH)/utils/rpi32/st-flash + STM32FLASH=./$(F1_LIB_PATH)/utils/rpi32/stm32flash + else + DFU_RST=./$(F1_LIB_PATH)/utils/linux/upload-reset + DFU_UTIL=./$(F1_LIB_PATH)/utils/linux/dfu-util + ifeq ($(ST_FLASH_IS_ON_PATH),0) + ST_FLASH=$(ST_FLASH_ON_PATH) + ST_FLASH_OPTS=--flash=128k + else + ST_FLASH=./$(F1_LIB_PATH)/utils/linux/st-flash + ST_FLASH_OPTS= + endif + STM32FLASH=./$(F1_LIB_PATH)/utils/linux/stm32flash + endif + endif + + ifeq ($(shell uname -s),Darwin) + DFU_RST=./$(F1_LIB_PATH)/utils/macosx/upload-reset + DFU_UTIL=./$(F1_LIB_PATH)/utils/macosx/dfu-util + ST_FLASH=./$(F1_LIB_PATH)/utils/macosx/st-flash + STM32FLASH=./$(F1_LIB_PATH)/utils/macosx/stm32flash + endif +endif + +# Default reference oscillator frequencies +ifndef $(OSC) + ifeq ($(MAKECMDGOALS),pi-f4) + OSC=$(CLK_PI_F4) + else + OSC=$(CLK_DEF) + endif +endif + +# Build object lists +CXXSRC=$(wildcard ./*.cpp) $(wildcard ./dmr/*.cpp) $(wildcard ./p25/*.cpp) +CSRC_STD_F1=$(wildcard $(STD_LIB_F1)/*.c) +SYS_F1=$(wildcard $(SYS_DIR_F1)/*.c) +STARTUP_F1=$(wildcard $(STARTUP_DIR_F1)/*.c) +CXX_USB_F1=$(wildcard $(USB_F1)/*.cpp) +C_USB_F1=$(wildcard $(USB_F1)/*.c) +CSRC_STD_F4=$(wildcard $(STD_LIB_F4)/*.c) +SYS_F4=$(wildcard $(SYS_DIR_F4)/*.c) +STARTUP_F4=$(wildcard $(STARTUP_DIR_F4)/*.c) +OBJ_F1=$(CXXSRC:./%.cpp=$(OBJDIR_F1)/%.o) $(CSRC_STD_F1:$(STD_LIB_F1)/%.c=$(OBJDIR_F1)/%.o) $(SYS_F1:$(SYS_DIR_F1)/%.c=$(OBJDIR_F1)/%.o) $(STARTUP_F1:$(STARTUP_DIR_F1)/%.c=$(OBJDIR_F1)/%.o) +OBJ_F1BL=$(CXXSRC:./%.cpp=$(OBJDIR_F1)/%.o) $(CSRC_STD_F1:$(STD_LIB_F1)/%.c=$(OBJDIR_F1)/%.o) $(SYS_F1:$(SYS_DIR_F1)/%.c=$(OBJDIR_F1)/%.o) $(STARTUP_F1:$(STARTUP_DIR_F1)/%.c=$(OBJDIR_F1)/%.o) $(CXX_USB_F1:$(USB_F1)/%.cpp=$(OBJDIR_F1)/%.o) $(C_USB_F1:$(USB_F1)/%.c=$(OBJDIR_F1)/%.o) +OBJ_F4=$(CXXSRC:./%.cpp=$(OBJDIR_F4)/%.o) $(CSRC_STD_F4:$(STD_LIB_F4)/%.c=$(OBJDIR_F4)/%.o) $(SYS_F4:$(SYS_DIR_F4)/%.c=$(OBJDIR_F4)/%.o) $(STARTUP_F4:$(STARTUP_DIR_F4)/%.c=$(OBJDIR_F4)/%.o) + +# MCU flags +MCFLAGS_F1=-mcpu=cortex-m3 -march=armv7-m -mthumb +MCFLAGS_F4=-mcpu=cortex-m4 -mthumb -mlittle-endian -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb-interwork + +# Compile flags +DEFS_F1_HS=-DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD -DHSE_VALUE=$(OSC) -DVECT_TAB_OFFSET=0x0 -DMADEBYMAKEFILE +DEFS_F1_HS_BL=-DUSE_STDPERIPH_DRIVER -DSTM32F10X_MD -DHSE_VALUE=$(OSC) -DVECT_TAB_OFFSET=0x2000 -DMADEBYMAKEFILE +# STM32F446 Pi-Hat board: +DEFS_PI_F4=-DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DSTM32F446xx -DSTM32F4_PI -DHSE_VALUE=$(OSC) -DMADEBYMAKEFILE +# STM32F4 Nucleo-64 F446RE board: +DEFS_F446=-DUSE_STDPERIPH_DRIVER -DSTM32F4XX -DSTM32F446xx -DSTM32F4_NUCLEO -DHSE_VALUE=$(OSC) -DMADEBYMAKEFILE + +# Build compiler flags +CFLAGS_F1=-c $(MCFLAGS_F1) $(INCLUDES_F1) +CXXFLAGS_F1=-c $(MCFLAGS_F1) $(INCLUDES_F1) +CFLAGS_F4=-c $(MCFLAGS_F4) $(INCLUDES_F4) +CXXFLAGS_F4=-c $(MCFLAGS_F4) $(INCLUDES_F4) +# Linker flags +LDFLAGS_F1_N =-T normal.ld $(MCFLAGS_F1) $(INCLUDES_LIBS_F1) +LDFLAGS_F1_BL =-T bootloader.ld $(MCFLAGS_F1) $(INCLUDES_LIBS_F1) +LDFLAGS_F4 =-T stm32f4xx_link.ld $(MCFLAGS_F4) $(INCLUDES_LIBS_F4) + +# Common flags +CFLAGS=-Os -ffunction-sections -fdata-sections -fno-builtin -Wno-implicit -DCUSTOM_NEW -DNO_EXCEPTIONS +CXXFLAGS=-Os -fno-exceptions -ffunction-sections -fdata-sections -fno-builtin -fno-rtti -DCUSTOM_NEW -DNO_EXCEPTIONS +LDFLAGS=-Os --specs=nano.specs --specs=nosys.specs + +# Build Rules +.PHONY: all release_f1 release_f4 hs bl nobl pi-f4 f446 clean + +all: hs + +#error "Either PI_HAT_7021_REV_02, ZUMSPOT_ADF7021, LONESTAR_USB, MMDVM_HS_HAT_REV12, MMDVM_HS_DUAL_HAT_REV10, NANO_HOTSPOT, NANO_DV_REV11, or SKYBRIDGE_HS + +zumspot-adf7021: CFLAGS+=-DZUMSPOT_ADF7021 -DSTM32_USART1_HOST +zumspot-adf7021: CXXFLAGS+=-DZUMSPOT_ADF7021 -DSTM32_USART1_HOST +zumspot-adf7021: hs +zumspot-adf7021-duplex: CFLAGS+=-DDUPLEX +zumspot-adf7021-duplex: CXXFLAGS+=-DDUPLEX +zumspot-adf7021-duplex: zumspot-adf7021 +zumspot-adf7021-usb: CFLAGS+=-DZUMSPOT_ADF7021 -DSTM32_USB_HOST +zumspot-adf7021-usb: CXXFLAGS+=-DZUMSPOT_ADF7021 -DSTM32_USB_HOST +zumspot-adf7021-usb: hs +zumspot-adf7021-usb-duplex: CFLAGS+=-DDUPLEX +zumspot-adf7021-usb-duplex: CXXFLAGS+=-DDUPLEX +zumspot-adf7021-usb-duplex: zumspot-adf7021-usb + +pihat-7021-r2: CFLAGS+=-DPI_HAT_7021_REV_02 -DSTM32_USART1_HOST +pihat-7021-r2: CXXFLAGS+=-DZUMSPOT_ADF7021 -DSTM32_USART1_HOST +pihat-7021-r2: hs +pihat-7021-r2-duplex: CFLAGS+=-DDUPLEX +pihat-7021-r2-duplex: CXXFLAGS+=-DDUPLEX +pihat-7021-r2-duplex: pihat-7021-r2-duplex + +lonestar-usb: CFLAGS+=-DLONESTAR_USB -DSTM32_USB_HOST +lonestar-usb: CXXFLAGS+=-DLONESTAR_USB -DSTM32_USB_HOST +lonestar-usb: hs + +mmdvm-hs-hat: zumspot-adf7021 +mmdvm-hs-hat-dual: zumspot-adf7021-duplex + +pi-f4: CFLAGS+=$(CFLAGS_F4) $(DEFS_PI_F4) +pi-f4: CXXFLAGS+=$(CXXFLAGS_F4) $(DEFS_PI_F4) +pi-f4: LDFLAGS+=$(LDFLAGS_F4) +pi-f4: release_f4 + +f446: CFLAGS+=$(CFLAGS_F4) $(DEFS_F446) +f446: CXXFLAGS+=$(CXXFLAGS_F4) $(DEFS_F446) +f446: LDFLAGS+=$(LDFLAGS_F4) +f446: release_f4 + +hs: CFLAGS+=$(CFLAGS_F1) $(DEFS_F1_HS) +hs: CXXFLAGS+=$(CXXFLAGS_F1) $(DEFS_F1_HS) +hs: LDFLAGS+=$(LDFLAGS_F1_N) +hs: release_f1 + +bl: CFLAGS+=$(CFLAGS_F1) $(DEFS_F1_HS_BL) +bl: CXXFLAGS+=$(CXXFLAGS_F1) $(DEFS_F1_HS_BL) +bl: LDFLAGS+=$(LDFLAGS_F1_BL) +bl: release_f1bl + +nobl: CFLAGS+=$(CFLAGS_F1) $(DEFS_F1_HS) +nobl: CXXFLAGS+=$(CXXFLAGS_F1) $(DEFS_F1_HS) +nobl: LDFLAGS+=$(LDFLAGS_F1_N) +nobl: release_f1nobl + +release_f1: $(BINDIR) +release_f1: $(OBJDIR_F1) +release_f1: $(BINDIR)/$(BINBIN_F1) + +release_f1bl: $(BINDIR) +release_f1bl: $(OBJDIR_F1) +release_f1bl: $(BINDIR)/$(BINBIN_F1BL) + +release_f1nobl: $(BINDIR) +release_f1nobl: $(OBJDIR_F1) +release_f1nobl: $(BINDIR)/$(BINBIN_F1NOBL) + +release_f4: $(BINDIR) +release_f4: $(OBJDIR_F4) +release_f4: $(BINDIR)/$(BINBIN_F4) + +$(BINDIR): + $(MDDIRS) +$(OBJDIR_F1): + $(MDDIRS) + $(MDDIRS)/dmr + $(MDDIRS)/p25 +$(OBJDIR_F4): + $(MDDIRS) + $(MDDIRS)/dmr + $(MDDIRS)/p25 + +$(BINDIR)/$(BINBIN_F1BL): $(BINDIR)/$(BINELF_F1BL) + $(CP) -O binary $< $@ +$(BINDIR)/$(BINELF_F1BL): $(OBJ_F1BL) + $(CXX) $(OBJ_F1BL) $(LDFLAGS) -o $@ + $(SIZE) $(BINDIR)/$(BINELF_F1BL) +$(BINDIR)/$(BINBIN_F1NOBL): $(BINDIR)/$(BINELF_F1NOBL) + $(CP) -O binary $< $@ +$(BINDIR)/$(BINELF_F1NOBL): $(OBJ_F1BL) + $(CXX) $(OBJ_F1BL) $(LDFLAGS) -o $@ + $(SIZE) $(BINDIR)/$(BINELF_F1NOBL) +$(BINDIR)/$(BINBIN_F1): $(BINDIR)/$(BINELF_F1) + $(CP) -O binary $< $@ +$(BINDIR)/$(BINELF_F1): $(OBJ_F1) + $(CXX) $(OBJ_F1) $(LDFLAGS) -o $@ + $(SIZE) $(BINDIR)/$(BINELF_F1) +$(BINDIR)/$(BINBIN_F4): $(BINDIR)/$(BINELF_F4) + $(CP) -O binary $< $@ +$(BINDIR)/$(BINELF_F4): $(OBJ_F4) + $(CXX) $(OBJ_F4) $(LDFLAGS) -o $@ + $(SIZE) $(BINDIR)/$(BINELF_F4) + +$(OBJDIR_F1)/%.o: ./%.cpp + $(CXX) $(CXXFLAGS) $< -o $@ +$(OBJDIR_F4)/%.o: ./%.cpp + $(CXX) $(CXXFLAGS) $< -o $@ +$(OBJDIR_F1)/%.o: $(STD_LIB_F1)/%.c + $(CC) $(CFLAGS) $< -o $@ +$(OBJDIR_F4)/%.o: $(STD_LIB_F4)/%.c + $(CC) $(CFLAGS) $< -o $@ +$(OBJDIR_F1)/%.o: $(SYS_DIR_F1)/%.c + $(CC) $(CFLAGS) $< -o $@ +$(OBJDIR_F1)/%.o: $(STARTUP_DIR_F1)/%.c + $(CC) $(CFLAGS) $< -o $@ +$(OBJDIR_F4)/%.o: $(SYS_DIR_F4)/%.c + $(CC) $(CFLAGS) $< -o $@ +$(OBJDIR_F4)/%.o: $(STARTUP_DIR_F4)/%.c + $(CC) $(CFLAGS) $< -o $@ +$(OBJDIR_F1)/%.o: $(USB_F1)/%.cpp + $(CXX) $(CXXFLAGS) $< -o $@ +$(OBJDIR_F1)/%.o: $(USB_F1)/%.c + $(CC) $(CFLAGS) $< -o $@ + +clean-objs: + test ! -d $(OBJDIR_F1) || rm -rf $(OBJDIR_F1) + test ! -d $(OBJDIR_F4) || rm -rf $(OBJDIR_F4) +clean: + test ! -d $(OBJDIR_F1) || rm -rf $(OBJDIR_F1) + test ! -d $(OBJDIR_F4) || rm -rf $(OBJDIR_F4) + rm -f $(BINDIR)/*.bin $(BINDIR)/*.elf + +stlink: + $(ST_FLASH) $(ST_FLASH_OPTS) write bin/$(BINBIN_F1) 0x8000000 + +stlink-nobl: + $(ST_FLASH) $(ST_FLASH_OPTS) write bin/$(BINBIN_F1NOBL) 0x8000000 + +stlink-bl: + $(ST_FLASH) $(ST_FLASH_OPTS) write $(F1_LIB_PATH)/utils/bootloader/generic_boot20_pc13_long_rst.bin 0x8000000 + sleep 3 + $(ST_FLASH) $(ST_FLASH_OPTS) write bin/$(BINBIN_F1BL) 0x8002000 + +stlink-bl-old: + $(ST_FLASH) $(ST_FLASH_OPTS) write $(F1_LIB_PATH)/utils/bootloader/generic_boot20_pc13.bin 0x8000000 + sleep 3 + $(ST_FLASH) $(ST_FLASH_OPTS) write bin/$(BINBIN_F1BL) 0x8002000 + +serial: + $(STM32FLASH) -v -w bin/$(BINBIN_F1) -g 0x0 $(devser) + +serial-nobl: + $(STM32FLASH) -v -w bin/$(BINBIN_F1NOBL) -g 0x0 $(devser) + +serial-bl: + $(STM32FLASH) -v -w $(F1_LIB_PATH)/utils/bootloader/generic_boot20_pc13_long_rst.bin -g 0x0 $(devser) + sleep 3 + $(STM32FLASH) -v -w bin/$(BINBIN_F1BL) -g 0x0 -S 0x08002000 $(devser) + +serial-bl-old: + $(STM32FLASH) -v -w $(F1_LIB_PATH)/utils/bootloader/generic_boot20_pc13.bin -g 0x0 $(devser) + sleep 3 + $(STM32FLASH) -v -w bin/$(BINBIN_F1BL) -g 0x0 -S 0x08002000 $(devser) + diff --git a/SerialPort.cpp b/SerialPort.cpp index 1f6b3a9..1dbff83 100644 --- a/SerialPort.cpp +++ b/SerialPort.cpp @@ -931,12 +931,12 @@ uint8_t SerialPort::setConfig(const uint8_t* data, uint8_t length) #if !defined(DUPLEX) if (m_duplex && m_calState == STATE_IDLE) { DEBUG1("Full duplex not supported with this firmware"); - return RSN_INVALID_STATE; + return RSN_INVALID_REQUEST; } #elif defined(DUPLEX) && (defined(ZUMSPOT_ADF7021) || defined(LONESTAR_USB) || defined(SKYBRIDGE_HS)) if (io.isDualBand() && m_duplex && m_calState == STATE_IDLE) { DEBUG1("Full duplex is not supported on this board"); - return RSN_INVALID_STATE; + return RSN_INVALID_REQUEST; } #endif @@ -1078,7 +1078,6 @@ void SerialPort::setMode(DVM_STATE modemState) dmrRX.reset(); #endif dmrDMORX.reset(); - dmrRX.reset(); p25RX.reset(); cwIdTX.reset(); break; diff --git a/dmr/DMRDMORX.cpp b/dmr/DMRDMORX.cpp index 622eabd..5f80a04 100644 --- a/dmr/DMRDMORX.cpp +++ b/dmr/DMRDMORX.cpp @@ -128,7 +128,7 @@ void DMRDMORX::databit(bool bit) // Data sync uint8_t colorCode; uint8_t dataType; - CDMRSlotType slotType; + DMRSlotType slotType; slotType.decode(frame + 1U, colorCode, dataType); if (colorCode == m_colorCode) { diff --git a/dmr/DMRSlotRX.cpp b/dmr/DMRSlotRX.cpp index 0a28179..460481b 100644 --- a/dmr/DMRSlotRX.cpp +++ b/dmr/DMRSlotRX.cpp @@ -55,8 +55,6 @@ const uint8_t CONTROL_NONE = 0x00U; const uint8_t CONTROL_VOICE = 0x20U; const uint8_t CONTROL_DATA = 0x40U; -const uint8_t BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U}; - // --------------------------------------------------------------------------- // Public Class Members // --------------------------------------------------------------------------- diff --git a/dvm-firmware-hs.vcxproj b/dvm-firmware-hs.vcxproj index 943da1d..c95692d 100644 --- a/dvm-firmware-hs.vcxproj +++ b/dvm-firmware-hs.vcxproj @@ -191,6 +191,10 @@ + + + + diff --git a/dvm-firmware-hs.vcxproj.filters b/dvm-firmware-hs.vcxproj.filters index 71a1146..8d5607c 100644 --- a/dvm-firmware-hs.vcxproj.filters +++ b/dvm-firmware-hs.vcxproj.filters @@ -171,4 +171,8 @@ Source Files\p25 + + + + \ No newline at end of file diff --git a/p25/P25RX.cpp b/p25/P25RX.cpp index 15d97b1..f2b54c1 100644 --- a/p25/P25RX.cpp +++ b/p25/P25RX.cpp @@ -206,7 +206,7 @@ void P25RX::processBit(bool bit) switch (m_duid) { case P25_DUID_HDU: { - DEBUG1("P25RX: processBit(): sync found in HDU pos", m_syncPtr); + DEBUG2("P25RX: processBit(): sync found in HDU pos", m_syncPtr); uint8_t frame[P25_HDU_FRAME_LENGTH_BYTES + 1U]; bitsToBytes(m_startPtr + P25_NID_LENGTH_BITS, P25_HDU_FRAME_LENGTH_BITS, frame); @@ -218,7 +218,7 @@ void P25RX::processBit(bool bit) break; case P25_DUID_TDU: { - DEBUG1("P25RX: processBit(): sync found in TDU pos", m_syncPtr); + DEBUG2("P25RX: processBit(): sync found in TDU pos", m_syncPtr); uint8_t frame[P25_TDU_FRAME_LENGTH_BYTES + 1U]; bitsToBytes(m_startPtr + P25_NID_LENGTH_BITS, P25_TDU_FRAME_LENGTH_BITS, frame); @@ -233,7 +233,7 @@ void P25RX::processBit(bool bit) return; case P25_DUID_TSDU: { - DEBUG1("P25RX: processBit(): sync found in TSDU pos", m_syncPtr); + DEBUG2("P25RX: processBit(): sync found in TSDU pos", m_syncPtr); uint8_t frame[P25_TSDU_FRAME_LENGTH_BYTES + 1U]; bitsToBytes(m_startPtr + P25_NID_LENGTH_BITS, P25_TSDU_FRAME_LENGTH_BITS, frame); @@ -251,7 +251,7 @@ void P25RX::processBit(bool bit) return; case P25_DUID_TDULC: { - DEBUG1("P25RX: processBit(): sync found in TDULC pos", m_syncPtr); + DEBUG2("P25RX: processBit(): sync found in TDULC pos", m_syncPtr); uint8_t frame[P25_TDULC_FRAME_LENGTH_BYTES + 1U]; bitsToBytes(m_startPtr + P25_NID_LENGTH_BITS, P25_TDULC_FRAME_LENGTH_BITS, frame); @@ -339,7 +339,7 @@ void P25RX::processVoice(bool bit) } else { if (m_duid == P25_DUID_TDU) { - DEBUG1("P25RX: processBit(): sync found in TDU pos", m_syncPtr); + DEBUG2("P25RX: processBit(): sync found in TDU pos", m_syncPtr); uint8_t frame[P25_TDU_FRAME_LENGTH_BYTES + 1U]; bitsToBytes(m_startPtr + P25_NID_LENGTH_BITS, P25_TDU_FRAME_LENGTH_BITS, frame); @@ -353,7 +353,7 @@ void P25RX::processVoice(bool bit) return; } - DEBUG1("P25RX: processVoice(): sync found in LDU pos", m_syncPtr); + DEBUG2("P25RX: processVoice(): sync found in LDU pos", m_syncPtr); uint8_t frame[P25_LDU_FRAME_LENGTH_BYTES + 3U]; bitsToBytes(m_startPtr + P25_NID_LENGTH_BITS, P25_LDU_FRAME_LENGTH_BITS, frame); @@ -426,7 +426,7 @@ void P25RX::processData(bool bit) reset(); } else { - DEBUG1("P25RX: processVoice(): sync found in PDU pos", m_syncPtr); + DEBUG2("P25RX: processData(): sync found in PDU pos", m_syncPtr); uint8_t frame[P25_LDU_FRAME_LENGTH_BYTES + 3U]; bitsToBytes(m_startPtr + P25_NID_LENGTH_BITS, P25_LDU_FRAME_LENGTH_BITS, frame);