Add TYT MD380 build target

Add meson cross-compilation configuration for building for the TYT
MD-380 and MD-UV380 radios.
replace/84072224f9f96c34a264256354cbd32d42d1318e
Niccolò Izzo 2020-10-11 00:25:59 +02:00
rodzic 603fddfdb0
commit 6420d2b2c1
4 zmienionych plików z 148 dodań i 132 usunięć

Wyświetl plik

@ -9,7 +9,7 @@ Currently OpenRTX is being actively developed for the TYT MD-380/390 and MD-UV38
This firmware is *highly experimental* and is not in a usable state right now,
however contributions and testing are welcome and accepted.
## Installation
## Compilation
To build and install the firmware, first clone this repository:
@ -17,6 +17,24 @@ To build and install the firmware, first clone this repository:
git clone https://github.com/n1zzo/OpenRTX
```
The following steps depend on the selected platform:
### Linux
The OpenRTX linux build depends on libSDL, on Ubuntu you can install it with:
```
sudo apt install libsdl2-dev
```
The firmware can be compiled with:
```
meson builddir
meson compile -C builddir openrtx-linux
```
### TYT MD-380 / TYT MD-UV380
To build the firmware you need to have a toolchain for the ARM ISA installed
on you system, you can install one using your package manager.
@ -28,8 +46,8 @@ sudo apt install gcc-arm-none-eabi
You can then proceed in building the firmware:
```
meson builddir
meson compile -C builddir linux
meson builddir --cross-file cross_arm.txt
meson compile -C builddir openrtx-md380
```
If everything compiled without errors you can connect your radio via USB,

43
cross_arm.txt 100644
Wyświetl plik

@ -0,0 +1,43 @@
[binaries]
c = 'arm-none-eabi-gcc'
cpp = 'arm-none-eabi-g++'
ld = 'arm-none-eabi-ld'
ar = 'arm-none-eabi-ar'
as = 'arm-none-eabi-as'
size = 'arm-none-eabi-size'
objdump = 'arm-none-eabi-objdump'
objcopy = 'arm-none-eabi-objcopy'
strip = 'arm-none-eabi-strip'
gdb = 'arm-none-eabi-gdb'
terminal= 'x-terminal-emulator'
openocd = '/usr/local/bin/openocd'
[properties]
c_args = [
'-mcpu=cortex-m4', # Cortex-M4 CPU
'-mthumb', # ARM Thumb2 ISA
'-mfloat-abi=hard', # Hard floating point support
'-mfpu=fpv4-sp-d16',
]
c_link_args = [
'-mcpu=cortex-m4',
'-mthumb',
'-mfloat-abi=hard',
'-mfpu=fpv4-sp-d16',
'-Wl,--gc-sections',
'-Wl,-Map,main.map',
'-nostdlib',
'-Wl,-T../platform/mcu/STM32F4xx/linker_script.ld',
'-Wl,--start-group',
'-lc',
'-lgcc',
'-lm',
'-Wl,--end-group'
]
[host_machine]
system = 'none'
cpu_family = 'arm'
cpu = 'cortex-m4'
endian = 'little'

Wyświetl plik

@ -25,10 +25,8 @@ rtos_src = ['rtos/uC-OS3/Source/__dbg_uCOS-III.c',
'rtos/uC-OS3/Source/os_time.c',
'rtos/uC-OS3/Source/os_tmr.c',
'rtos/uC-OS3/Source/os_var.c',
'rtos/uC-OS3/Ports/POSIX/os_cpu_c.c',
'rtos/uC-OS3/Cfg/os_app_hooks.c',
'rtos/uC-CPU/cpu_core.c',
'rtos/uC-CPU/Posix/cpu_c.c',
'rtos/uC-LIB/lib_ascii.c',
'rtos/uC-LIB/lib_math.c',
'rtos/uC-LIB/lib_mem.c',
@ -36,12 +34,15 @@ rtos_src = ['rtos/uC-OS3/Source/__dbg_uCOS-III.c',
src = rtos_src
##
## Headers
## Includes
##
interfaces = ['openrtx/include/interfaces']
rtos_inc = ['rtos/uC-OS3/Source', 'rtos/uC-OS3/Ports/POSIX', 'rtos/uC-OS3/Cfg',
'rtos/uC-CPU/Posix', 'rtos/uC-CPU', 'rtos/uC-CPU/Cfg', \
'rtos/uC-LIB', 'rtos/uC-LIB/Cfg']
rtos_inc = ['rtos/uC-OS3/Source',
'rtos/uC-OS3/Cfg',
'rtos/uC-CPU',
'rtos/uC-CPU/Cfg',
'rtos/uC-LIB',
'rtos/uC-LIB/Cfg']
inc = interfaces + rtos_inc
##
@ -50,34 +51,98 @@ inc = interfaces + rtos_inc
def = {'DONT_USE_CMSIS_INIT': ''}
##
## Dependencies
## Platform specializations
##
sdl_dep = dependency('SDL2')
threads_dep = dependency('threads')
dep = [sdl_dep, threads_dep]
##
## Platform specialization
##
## Linux
linux_src = src + ['tests/platform/x64_uC.c',
'platform/drivers/display/display_libSDL.c',
'openrtx/src/graphics/graphics_rgb565.c']
linux_def = def + {'SCREEN_WIDTH': 160, 'SCREEN_HEIGHT': 128}
'openrtx/src/graphics/graphics_rgb565.c',
'rtos/uC-OS3/Ports/POSIX/os_cpu_c.c',
'rtos/uC-CPU/Posix/cpu_c.c']
linux_def = def + {'SCREEN_WIDTH': '160', 'SCREEN_HEIGHT': '128'}
linux_inc = inc + ['rtos/uC-OS3/Ports/POSIX',
'rtos/uC-CPU/Posix']
if not meson.is_cross_build()
sdl_dep = dependency('SDL2')
threads_dep = dependency('threads')
linux_dep = [sdl_dep, threads_dep]
else
linux_dep = []
endif
## TYT MD380
md380_src = src + ['tests/platform/stm32f4_uC.c',
'platform/mcu/STM32F4xx/boot/startup.c',
'platform/mcu/STM32F4xx/boot/libc_integration.c',
'platform/mcu/STM32F4xx/drivers/usb/usb_bsp.c',
'platform/mcu/STM32F4xx/drivers/usb/usb_core.c',
'platform/mcu/STM32F4xx/drivers/usb/usb_dcd.c',
'platform/mcu/STM32F4xx/drivers/usb/usb_dcd_int.c',
'platform/mcu/STM32F4xx/drivers/usb/usbd_desc.c',
'platform/mcu/STM32F4xx/drivers/usb/usbd_core.c',
'platform/mcu/STM32F4xx/drivers/usb/usbd_ioreq.c',
'platform/mcu/STM32F4xx/drivers/usb/usbd_req.c',
'platform/mcu/STM32F4xx/drivers/usb/usbd_usr.c',
'platform/mcu/STM32F4xx/drivers/gpio.c',
'platform/mcu/STM32F4xx/drivers/usb_vcom.c',
'platform/mcu/STM32F4xx/drivers/delays.c',
'platform/mcu/STM32F4xx/drivers/gpio.c',
'platform/mcu/CMSIS/Device/ST/STM32F4xx/Source/system_stm32f4xx.c',
'platform/drivers/display/HX83XX_md380.c',
'openrtx/src/graphics/graphics_rgb565.c',
'rtos/uC-OS3/Ports/ARM-Cortex-M/ARMv7-M/os_cpu_c.c',
'rtos/uC-OS3/Ports/ARM-Cortex-M/ARMv7-M/os_cpu_a.s',
'rtos/uC-CPU/ARM-Cortex-M/ARMv7-M/cpu_c.c',
'rtos/uC-CPU/ARM-Cortex-M/ARMv7-M/cpu_a.s']
md380_def = def + {'SCREEN_WIDTH': '160', 'SCREEN_HEIGHT': '128', 'STM32F40_41xxx': ''}
md380_inc = inc + ['platform/mcu/CMSIS/Include',
'platform/mcu/CMSIS/Device/ST/STM32F4xx/Include',
'platform/mcu/STM32F4xx',
'platform/mcu/STM32F4xx/drivers/usb',
'rtos/uC-OS3/Ports/ARM-Cortex-M/ARMv7-M',
'rtos/uC-CPU/ARM-Cortex-M/ARMv7-M']
##
## Compute define string
## Compilation defines
##
linux_args = []
foreach k, v : linux_def
linux_args += '-D@0@=@1@'.format(k, v)
if v == ''
linux_args += '-D@0@'.format(k)
else
linux_args += '-D@0@=@1@'.format(k, v)
endif
endforeach
md380_args = []
foreach k, v : md380_def
if v == ''
md380_args += '-D@0@'.format(k)
else
md380_args += '-D@0@=@1@'.format(k, v)
endif
endforeach
linux = {'sources': linux_src,
'c_args': linux_args,
'include_directories': inc,
'dependencies': dep}
'include_directories': linux_inc,
'dependencies': linux_dep}
md380 = {'sources': md380_src,
'c_args': md380_args,
'include_directories': md380_inc}
##
## Select your radio model among the supported ones: MD-380, MD-UV380
##
executable('openrtx-linux', kwargs:linux)
executable('openrtx-md380', kwargs:md380)
executable('openrtx-mduv380', kwargs:md380)

Wyświetl plik

@ -1,110 +0,0 @@
/***************************************************************************
* Copyright (C) 2020 by Silvano Seva IU2KWO *
* *
* 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 3 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, see <http://www.gnu.org/licenses/> *
***************************************************************************/
#ifndef GPIO_H
#define GPIO_H
#include <stdint.h>
#include "stm32f4xx.h"
/**
* GPIO functional modes.
* For more details see microcontroller's reference manual.
*/
enum Mode
{
INPUT = 0, ///Floating Input
INPUT_PULL_UP = 1, ///Pullup Input
INPUT_PULL_DOWN = 2, ///Pulldown Input
INPUT_ANALOG = 3, ///Analog Input
OUTPUT = 4, ///Push Pull Output
OPEN_DRAIN = 5, ///Open Drain Output
ALTERNATE = 6, ///Alternate function
ALTERNATE_OD = 7, ///Alternate Open Drain
};
/**
* Maximum GPIO switching speed.
* For more details see microcontroller's reference manual and datasheet.
*/
enum Speed
{
LOW = 0x0, /// 2MHz for STM32
MEDIUM = 0x1, /// 25MHz for STM32
FAST = 0x2, /// 50MHz for STM32
HIGH = 0x3 /// 100MHz for STM32
};
/**
* Configure GPIO pin functional mode.
* @param port: GPIO port, it has to be equal to GPIOA_BASE, GPIOB_BASE, ...
* @param pin: GPIO pin number, between 0 and 15.
* @param mode: GPIO functional mode to be set.
*/
void gpio_setMode(GPIO_TypeDef *port, uint8_t pin, enum Mode mode);
/**
* Map alternate function to GPIO pin. The pin has to be configured in alternate
* mode by calling 'gpio_setMode'.
* @param port: GPIO port, it has to be equal to GPIOA_BASE, GPIOB_BASE, ...
* @param pin: GPIO pin number, between 0 and 15.
* @param afNum: alternate function number, retrieved from mapping table in
* microcontroller's datasheet.
*/
void gpio_setAlternateFunction(GPIO_TypeDef *port, uint8_t pin, uint8_t afNum);
/**
* Configure GPIO pin maximum output speed.
* @param port: GPIO port, it has to be equal to GPIOA_BASE, GPIOB_BASE, ...
* @param pin: GPIO pin number, between 0 and 15.
* @param spd: GPIO output speed to be set.
*/
void gpio_setOutputSpeed(GPIO_TypeDef *port, uint8_t pin, enum Speed spd);
/**
* Set GPIO pin to high logic level.
* NOTE: this operation is performed atomically.
* @param port: GPIO port, it has to be equal to GPIOA_BASE, GPIOB_BASE, ...
* @param pin: GPIO pin number, between 0 and 15.
*/
void gpio_setPin(GPIO_TypeDef *port, uint8_t pin);
/**
* Set GPIO pin to low logic level.
* NOTE: this operation is performed atomically.
* @param port: GPIO port, it has to be equal to GPIOA_BASE, GPIOB_BASE, ...
* @param pin: GPIO pin number, between 0 and 15.
*/
void gpio_clearPin(GPIO_TypeDef *port, uint8_t pin);
/**
* Toggle logic level of a GPIO pin, with respect to its state before calling
* this function.
* @param port: GPIO port, it has to be equal to GPIOA_BASE, GPIOB_BASE, ...
* @param pin: GPIO pin number, between 0 and 15.
*/
void gpio_togglePin(GPIO_TypeDef *port, uint8_t pin);
/**
* Read GPIO pin's logic level.
* @param port: GPIO port, it has to be equal to GPIOA_BASE, GPIOB_BASE, ...
* @param pin: GPIO pin number, between 0 and 15.
* @return 1 if pin is at high logic level, 0 if pin is at low logic level.
*/
uint8_t gpio_readPin(const GPIO_TypeDef *port, uint8_t pin);
#endif /* GPIO_H */