2017-02-01 05:33:31 +01:00
/*
* Copyright ( C ) 2016 by Jim McLaughlin KI6ZUM
2018-01-27 05:14:00 +01:00
* Copyright ( C ) 2016 , 2017 , 2018 by Andy Uribe CA6JAU
2019-05-26 05:30:32 +02:00
* Copyright ( C ) 2017 by Danilo DB4PLE
2017-02-01 05:33:31 +01:00
* 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 0213 9 , USA .
*/
2017-03-31 19:14:17 +02:00
2017-02-01 05:33:31 +01:00
# include "Config.h"
2017-07-26 06:49:22 +02:00
// Select initial release of ZUMspot RPi:
// #define PI_HAT_7021_REV_02
2017-02-01 05:33:31 +01:00
# if defined(STM32F10X_MD)
# include "Globals.h"
# include "IO.h"
2017-02-15 22:18:10 +01:00
# if defined(PI_HAT_7021_REV_02)
# define PIN_SCLK GPIO_Pin_4
# define PORT_SCLK GPIOB
2017-02-16 13:15:29 +01:00
# define PIN_SREAD GPIO_Pin_5
2017-02-15 22:18:10 +01:00
# define PORT_SREAD GPIOB
2017-02-16 13:15:29 +01:00
# define PIN_SDATA GPIO_Pin_6
2017-02-15 22:18:10 +01:00
# define PORT_SDATA GPIOB
# define PIN_SLE GPIO_Pin_7
# define PORT_SLE GPIOB
# define PIN_CE GPIO_Pin_14
# define PORT_CE GPIOC
# define PIN_RXD GPIO_Pin_3
# define PORT_RXD GPIOB
// TXD used in SPI Data mode of ADF7021
// TXD is TxRxCLK of ADF7021, standard TX/RX data interface
# define PIN_TXD GPIO_Pin_15
# define PORT_TXD GPIOA
# define PIN_TXD_INT GPIO_PinSource15
# define PORT_TXD_INT GPIO_PortSourceGPIOA
// CLKOUT used in SPI Data mode of ADF7021
# define PIN_CLKOUT GPIO_Pin_14
# define PORT_CLKOUT GPIOA
# define PIN_CLKOUT_INT GPIO_PinSource14
# define PORT_CLKOUT_INT GPIO_PortSourceGPIOA
# define PIN_LED GPIO_Pin_13
# define PORT_LED GPIOC
# define PIN_DEB GPIO_Pin_11
# define PORT_DEB GPIOA
# define PIN_DSTAR_LED GPIO_Pin_14
# define PORT_DSTAR_LED GPIOB
# define PIN_DMR_LED GPIO_Pin_15
# define PORT_DMR_LED GPIOB
# define PIN_YSF_LED GPIO_Pin_13
# define PORT_YSF_LED GPIOA
# define PIN_P25_LED GPIO_Pin_12
# define PORT_P25_LED GPIOA
2018-02-13 15:36:40 +01:00
# define PIN_NXDN_LED GPIO_Pin_8
# define PORT_NXDN_LED GPIOA
2018-12-09 22:59:10 +01:00
# define PIN_POCSAG_LED GPIO_Pin_5
# define PORT_POCSAG_LED GPIOA
2017-02-15 22:18:10 +01:00
# define PIN_PTT_LED GPIO_Pin_12
# define PORT_PTT_LED GPIOB
# define PIN_COS_LED GPIO_Pin_13
# define PORT_COS_LED GPIOB
2017-12-26 21:49:58 +01:00
# elif defined(ZUMSPOT_ADF7021)
2017-03-15 01:17:33 +01:00
# define PIN_SCLK GPIO_Pin_5
# define PORT_SCLK GPIOB
# define PIN_SREAD GPIO_Pin_6
# define PORT_SREAD GPIOB
# define PIN_SDATA GPIO_Pin_7
# define PORT_SDATA GPIOB
# define PIN_SLE GPIO_Pin_8
# define PORT_SLE GPIOB
2017-05-01 06:02:47 +02:00
# define PIN_SLE2 GPIO_Pin_6
# define PORT_SLE2 GPIOA
2017-03-15 01:17:33 +01:00
# define PIN_CE GPIO_Pin_14
# define PORT_CE GPIOC
# define PIN_RXD GPIO_Pin_4
# define PORT_RXD GPIOB
2019-05-08 22:34:59 +02:00
# define PIN_SGL_DBL GPIO_Pin_12
# define PORT_SGL_DBL GPIOA
# define PIN_DL_DPX GPIO_Pin_15
# define PORT_DL_DPX GPIOC
# define PIN_SET_BAND GPIO_Pin_15
# define PORT_SET_BAND GPIOA
2017-03-15 01:17:33 +01:00
// TXD used in SPI Data mode of ADF7021
// TXD is TxRxCLK of ADF7021, standard TX/RX data interface
# define PIN_TXD GPIO_Pin_3
# define PORT_TXD GPIOB
# define PIN_TXD_INT GPIO_PinSource3
# define PORT_TXD_INT GPIO_PortSourceGPIOB
2019-09-19 00:29:12 +02:00
# if defined(DUPLEX)
# define PIN_RXD2 GPIO_Pin_11
# define PORT_RXD2 GPIOA
2019-05-26 05:30:32 +02:00
// TXD2 is TxRxCLK of the second ADF7021, standard TX/RX data interface
# define PIN_TXD2 GPIO_Pin_8
# define PORT_TXD2 GPIOA
# define PIN_TXD2_INT GPIO_PinSource8
# define PORT_TXD2_INT GPIO_PortSourceGPIOA
2019-09-19 00:29:12 +02:00
# endif
2019-05-26 05:30:32 +02:00
2017-03-15 01:17:33 +01:00
// CLKOUT used in SPI Data mode of ADF7021
# define PIN_CLKOUT GPIO_Pin_15
# define PORT_CLKOUT GPIOA
# define PIN_CLKOUT_INT GPIO_PinSource15
# define PORT_CLKOUT_INT GPIO_PortSourceGPIOA
# define PIN_LED GPIO_Pin_13
# define PORT_LED GPIOC
2019-09-19 00:29:12 +02:00
# define PIN_DEB GPIO_Pin_9
# define PORT_DEB GPIOB
2017-03-15 01:17:33 +01:00
# define PIN_DSTAR_LED GPIO_Pin_12
# define PORT_DSTAR_LED GPIOB
# define PIN_DMR_LED GPIO_Pin_13
# define PORT_DMR_LED GPIOB
# define PIN_YSF_LED GPIO_Pin_1
# define PORT_YSF_LED GPIOB
# define PIN_P25_LED GPIO_Pin_0
# define PORT_P25_LED GPIOB
2018-12-09 22:59:10 +01:00
# if defined(STM32_USB_HOST)
# define PIN_NXDN_LED GPIO_Pin_1
# else
# define PIN_NXDN_LED GPIO_Pin_7
# endif
2018-02-13 15:36:40 +01:00
# define PORT_NXDN_LED GPIOA
2018-12-09 22:59:10 +01:00
# define PIN_POCSAG_LED GPIO_Pin_5
# define PORT_POCSAG_LED GPIOA
2017-03-15 01:17:33 +01:00
# define PIN_PTT_LED GPIO_Pin_14
# define PORT_PTT_LED GPIOB
# define PIN_COS_LED GPIO_Pin_15
# define PORT_COS_LED GPIOB
2019-03-11 13:56:16 +01:00
# elif defined(LIBRE_KIT_ADF7021) || defined(MMDVM_HS_HAT_REV12) || defined(MMDVM_HS_DUAL_HAT_REV10) || defined(NANO_HOTSPOT) || defined(NANO_DV_REV11)
2017-02-15 22:18:10 +01:00
2017-02-01 05:33:31 +01:00
# define PIN_SCLK GPIO_Pin_5
# define PORT_SCLK GPIOB
# define PIN_SREAD GPIO_Pin_7
# define PORT_SREAD GPIOB
# define PIN_SDATA GPIO_Pin_6
# define PORT_SDATA GPIOB
# define PIN_SLE GPIO_Pin_8
# define PORT_SLE GPIOB
2017-05-01 06:02:47 +02:00
# define PIN_SLE2 GPIO_Pin_6
# define PORT_SLE2 GPIOA
2017-02-14 12:49:22 +01:00
# define PIN_CE GPIO_Pin_14
# define PORT_CE GPIOC
2017-02-01 05:33:31 +01:00
# define PIN_RXD GPIO_Pin_4
# define PORT_RXD GPIOB
2017-05-01 06:02:47 +02:00
# define PIN_RXD2 GPIO_Pin_4
# define PORT_RXD2 GPIOA
2017-02-09 02:36:33 +01:00
// TXD used in SPI Data mode of ADF7021
// TXD is TxRxCLK of ADF7021, standard TX/RX data interface
2017-02-01 05:33:31 +01:00
# define PIN_TXD GPIO_Pin_3
# define PORT_TXD GPIOB
2017-02-09 02:36:33 +01:00
# define PIN_TXD_INT GPIO_PinSource3
# define PORT_TXD_INT GPIO_PortSourceGPIOB
2017-02-01 05:33:31 +01:00
2017-05-01 06:02:47 +02:00
// TXD2 is TxRxCLK of the second ADF7021, standard TX/RX data interface
# define PIN_TXD2 GPIO_Pin_5
# define PORT_TXD2 GPIOA
# define PIN_TXD2_INT GPIO_PinSource5
# define PORT_TXD2_INT GPIO_PortSourceGPIOA
2017-02-09 02:36:33 +01:00
// CLKOUT used in SPI Data mode of ADF7021
# define PIN_CLKOUT GPIO_Pin_15
# define PORT_CLKOUT GPIOA
# define PIN_CLKOUT_INT GPIO_PinSource15
# define PORT_CLKOUT_INT GPIO_PortSourceGPIOA
2017-02-01 05:33:31 +01:00
# define PIN_LED GPIO_Pin_13
# define PORT_LED GPIOC
# define PIN_DEB GPIO_Pin_9
# define PORT_DEB GPIOB
# define PIN_DSTAR_LED GPIO_Pin_12
# define PORT_DSTAR_LED GPIOB
# define PIN_DMR_LED GPIO_Pin_13
# define PORT_DMR_LED GPIOB
# define PIN_YSF_LED GPIO_Pin_1
# define PORT_YSF_LED GPIOB
# define PIN_P25_LED GPIO_Pin_0
# define PORT_P25_LED GPIOB
2018-02-13 15:36:40 +01:00
# define PIN_NXDN_LED GPIO_Pin_8
# define PORT_NXDN_LED GPIOA
2018-12-09 22:59:10 +01:00
# define PIN_POCSAG_LED GPIO_Pin_7
# define PORT_POCSAG_LED GPIOA
2017-02-01 05:33:31 +01:00
# define PIN_PTT_LED GPIO_Pin_14
# define PORT_PTT_LED GPIOB
# define PIN_COS_LED GPIO_Pin_15
# define PORT_COS_LED GPIOB
2017-02-15 22:18:10 +01:00
# else
2019-03-11 13:56:16 +01:00
# error "Either PI_HAT_7021_REV_02, ZUMSPOT_ADF7021, LIBRE_KIT_ADF7021, MMDVM_HS_HAT_REV12, MMDVM_HS_DUAL_HAT_REV10, NANO_HOTSPOT or NANO_DV_REV11 need to be defined"
2017-02-15 22:18:10 +01:00
# endif
2017-02-01 05:33:31 +01:00
extern " C " {
2017-02-15 22:18:10 +01:00
# if defined(PI_HAT_7021_REV_02)
# if defined(BIDIR_DATA_PIN)
void EXTI15_10_IRQHandler ( void ) {
if ( EXTI_GetITStatus ( EXTI_Line15 ) ! = RESET ) {
io . interrupt ( ) ;
EXTI_ClearITPendingBit ( EXTI_Line15 ) ;
}
}
# else
void EXTI15_10_IRQHandler ( void ) {
if ( EXTI_GetITStatus ( EXTI_Line14 ) ! = RESET ) {
io . interrupt ( ) ;
EXTI_ClearITPendingBit ( EXTI_Line14 ) ;
}
}
# endif
2019-03-11 13:56:16 +01:00
# elif defined(ZUMSPOT_ADF7021) || defined(LIBRE_KIT_ADF7021) || defined(MMDVM_HS_HAT_REV12) || defined(MMDVM_HS_DUAL_HAT_REV10) || defined(NANO_HOTSPOT) || defined(NANO_DV_REV11)
2017-02-15 22:18:10 +01:00
2017-02-09 02:36:33 +01:00
# if defined(BIDIR_DATA_PIN)
void EXTI3_IRQHandler ( void ) {
if ( EXTI_GetITStatus ( EXTI_Line3 ) ! = RESET ) {
io . interrupt ( ) ;
EXTI_ClearITPendingBit ( EXTI_Line3 ) ;
}
}
# else
2017-02-01 05:33:31 +01:00
void EXTI15_10_IRQHandler ( void ) {
if ( EXTI_GetITStatus ( EXTI_Line15 ) ! = RESET ) {
io . interrupt ( ) ;
EXTI_ClearITPendingBit ( EXTI_Line15 ) ;
}
}
2017-02-09 02:36:33 +01:00
# endif
2017-02-15 22:18:10 +01:00
2017-05-01 06:02:47 +02:00
# if defined(DUPLEX)
void EXTI9_5_IRQHandler ( void ) {
2019-09-19 00:29:12 +02:00
# if defined(ZUMSPOT_ADF7021)
2019-05-26 05:30:32 +02:00
if ( EXTI_GetITStatus ( EXTI_Line8 ) ! = RESET ) {
2017-05-01 06:02:47 +02:00
io . interrupt2 ( ) ;
2019-05-26 05:30:32 +02:00
EXTI_ClearITPendingBit ( EXTI_Line8 ) ;
2017-05-01 06:02:47 +02:00
}
2019-09-19 00:29:12 +02:00
# else
if ( EXTI_GetITStatus ( EXTI_Line5 ) ! = RESET ) {
io . interrupt2 ( ) ;
EXTI_ClearITPendingBit ( EXTI_Line5 ) ;
}
# endif
2017-05-01 06:02:47 +02:00
}
# endif
2017-02-15 22:18:10 +01:00
# endif
2017-02-01 05:33:31 +01:00
}
void CIO : : Init ( )
2018-09-08 20:54:35 +02:00
{
GPIO_InitTypeDef GPIO_InitStruct ;
GPIO_StructInit ( & GPIO_InitStruct ) ;
EXTI_InitTypeDef EXTI_InitStructure ;
# if defined(DUPLEX)
EXTI_InitTypeDef EXTI_InitStructure2 ;
# endif
2017-02-01 05:33:31 +01:00
RCC_APB2PeriphClockCmd ( RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO , ENABLE ) ;
2019-05-26 05:30:32 +02:00
2017-02-15 22:18:10 +01:00
# if defined(PI_HAT_7021_REV_02)
GPIO_PinRemapConfig ( GPIO_Remap_SWJ_Disable , ENABLE ) ;
2019-03-11 13:56:16 +01:00
# elif defined(ZUMSPOT_ADF7021) || defined(LIBRE_KIT_ADF7021) || defined(MMDVM_HS_HAT_REV12) || defined(MMDVM_HS_DUAL_HAT_REV10) || defined(NANO_HOTSPOT) || defined(NANO_DV_REV11)
2017-02-01 05:33:31 +01:00
GPIO_PinRemapConfig ( GPIO_Remap_SWJ_JTAGDisable , ENABLE ) ;
2017-02-15 22:18:10 +01:00
# endif
2017-02-01 05:33:31 +01:00
2019-05-08 22:34:59 +02:00
# if defined(ZUMSPOT_ADF7021)
// Pin defines if the board has a single ADF7021 or double
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_SGL_DBL ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_IPU ;
GPIO_Init ( PORT_SGL_DBL , & GPIO_InitStruct ) ;
// Pin defines if the board is dual band or duplex
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_DL_DPX ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_IPU ;
GPIO_Init ( PORT_DL_DPX , & GPIO_InitStruct ) ;
// Pin will set UHF or VHF
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_SET_BAND ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( PORT_SET_BAND , & GPIO_InitStruct ) ;
// TODO: Remove this line
// GPIO_WriteBit(PORT_SET_BAND, PIN_SET_BAND, Bit_RESET);
# endif
# if defined(STM32_USB_HOST)
2018-09-08 20:54:35 +02:00
// Pin PA11,PA12 = LOW, USB Reset
2017-02-01 05:33:31 +01:00
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
2018-09-08 20:54:35 +02:00
GPIO_InitStruct . GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 ;
2017-02-01 05:33:31 +01:00
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( GPIOA , & GPIO_InitStruct ) ;
2018-09-08 20:54:35 +02:00
GPIO_WriteBit ( GPIOA , GPIO_Pin_11 , Bit_RESET ) ;
2017-02-01 05:33:31 +01:00
GPIO_WriteBit ( GPIOA , GPIO_Pin_12 , Bit_RESET ) ;
2019-05-08 22:34:59 +02:00
# endif
2018-09-18 19:02:11 +02:00
# if defined(LONG_USB_RESET)
2018-09-08 20:54:35 +02:00
// 10 ms delay
delay_us ( 10000U ) ;
2018-09-18 19:02:11 +02:00
# else
volatile unsigned int delay ;
for ( delay = 0 ; delay < 512 ; delay + + ) ;
# endif
2017-02-01 05:33:31 +01:00
2018-09-08 20:54:35 +02:00
GPIO_InitStruct . GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_12 ;
2017-02-01 05:33:31 +01:00
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_IN_FLOATING ;
GPIO_Init ( GPIOA , & GPIO_InitStruct ) ;
2018-09-08 20:54:35 +02:00
RCC_USBCLKConfig ( RCC_USBCLKSource_PLLCLK_1Div5 ) ;
RCC_APB1PeriphClockCmd ( RCC_APB1Periph_USB , ENABLE ) ;
NVIC_PriorityGroupConfig ( NVIC_PriorityGroup_4 ) ;
2017-02-01 05:33:31 +01:00
// Pin SCLK
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_SCLK ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( PORT_SCLK , & GPIO_InitStruct ) ;
// Pin SDATA
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_SDATA ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( PORT_SDATA , & GPIO_InitStruct ) ;
2019-05-26 05:30:32 +02:00
2017-02-10 18:03:14 +01:00
// Pin SREAD
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_SREAD ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_IN_FLOATING ;
GPIO_Init ( PORT_SREAD , & GPIO_InitStruct ) ;
2017-02-01 05:33:31 +01:00
// Pin SLE
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_SLE ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( PORT_SLE , & GPIO_InitStruct ) ;
2019-05-26 05:30:32 +02:00
2017-05-01 06:02:47 +02:00
# if defined(DUPLEX)
// Pin SLE2
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_SLE2 ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( PORT_SLE2 , & GPIO_InitStruct ) ;
2019-05-26 05:30:32 +02:00
2017-05-01 06:02:47 +02:00
// Pin RXD2
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_RXD2 ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_IN_FLOATING ;
GPIO_Init ( PORT_RXD2 , & GPIO_InitStruct ) ;
# endif
2017-02-01 05:33:31 +01:00
2017-02-14 12:49:22 +01:00
// Pin CE
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_CE ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( PORT_CE , & GPIO_InitStruct ) ;
2017-02-01 05:33:31 +01:00
// Pin RXD
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_RXD ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_IN_FLOATING ;
GPIO_Init ( PORT_RXD , & GPIO_InitStruct ) ;
// Pin TXD
2017-02-09 02:36:33 +01:00
// TXD is TxRxCLK of ADF7021, standard TX/RX data interface
2017-02-01 05:33:31 +01:00
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_TXD ;
2017-02-09 02:36:33 +01:00
# if defined(BIDIR_DATA_PIN)
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_IN_FLOATING ;
# else
2017-02-01 05:33:31 +01:00
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
2017-02-09 02:36:33 +01:00
# endif
2017-02-01 05:33:31 +01:00
GPIO_Init ( PORT_TXD , & GPIO_InitStruct ) ;
2017-05-01 06:02:47 +02:00
# if defined(DUPLEX)
2019-05-26 05:30:32 +02:00
GPIO_InitStruct . GPIO_Pin = PIN_TXD2 ;
2017-05-01 06:02:47 +02:00
GPIO_Init ( PORT_TXD2 , & GPIO_InitStruct ) ;
# endif
2017-02-01 05:33:31 +01:00
// Pin TXRX_CLK
2017-02-09 02:36:33 +01:00
# if !defined(BIDIR_DATA_PIN)
2017-02-01 05:33:31 +01:00
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
2017-02-09 02:36:33 +01:00
GPIO_InitStruct . GPIO_Pin = PIN_CLKOUT ;
2017-02-01 05:33:31 +01:00
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_IN_FLOATING ;
2017-02-09 02:36:33 +01:00
GPIO_Init ( PORT_CLKOUT , & GPIO_InitStruct ) ;
# endif
2019-05-26 05:30:32 +02:00
2017-02-01 05:33:31 +01:00
// Pin LED
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_LED ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( PORT_LED , & GPIO_InitStruct ) ;
// Pin Debug
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_DEB ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( PORT_DEB , & GPIO_InitStruct ) ;
2019-05-26 05:30:32 +02:00
// D-Star LED
2017-02-01 05:33:31 +01:00
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_DSTAR_LED ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( PORT_DSTAR_LED , & GPIO_InitStruct ) ;
2019-05-26 05:30:32 +02:00
// DMR LED
2017-02-01 05:33:31 +01:00
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_DMR_LED ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( PORT_DMR_LED , & GPIO_InitStruct ) ;
2019-05-26 05:30:32 +02:00
// YSF LED
2017-02-01 05:33:31 +01:00
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_YSF_LED ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( PORT_YSF_LED , & GPIO_InitStruct ) ;
2019-05-26 05:30:32 +02:00
// P25 LED
2017-02-01 05:33:31 +01:00
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_P25_LED ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( PORT_P25_LED , & GPIO_InitStruct ) ;
2019-05-26 05:30:32 +02:00
// NXDN LED
2018-02-13 15:36:40 +01:00
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_NXDN_LED ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( PORT_NXDN_LED , & GPIO_InitStruct ) ;
2019-05-26 05:30:32 +02:00
// POCSAG LED
2018-12-09 22:59:10 +01:00
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_POCSAG_LED ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( PORT_POCSAG_LED , & GPIO_InitStruct ) ;
2017-02-01 05:33:31 +01:00
// PTT LED
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_PTT_LED ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( PORT_PTT_LED , & GPIO_InitStruct ) ;
2019-05-26 05:30:32 +02:00
// COS LED
2017-02-01 05:33:31 +01:00
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_COS_LED ;
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
GPIO_Init ( PORT_COS_LED , & GPIO_InitStruct ) ;
2017-02-15 22:18:10 +01:00
# if defined(PI_HAT_7021_REV_02)
# if defined(BIDIR_DATA_PIN)
// Connect EXTI15 Line
GPIO_EXTILineConfig ( PORT_TXD_INT , PIN_TXD_INT ) ;
// Configure EXTI15 line
EXTI_InitStructure . EXTI_Line = EXTI_Line15 ;
# else
// Connect EXTI14 Line
GPIO_EXTILineConfig ( PORT_CLKOUT_INT , PIN_CLKOUT_INT ) ;
// Configure EXTI14 line
EXTI_InitStructure . EXTI_Line = EXTI_Line14 ;
# endif
2019-03-11 13:56:16 +01:00
# elif defined(ZUMSPOT_ADF7021) || defined(LIBRE_KIT_ADF7021) || defined(MMDVM_HS_HAT_REV12) || defined(MMDVM_HS_DUAL_HAT_REV10) || defined(NANO_HOTSPOT) || defined(NANO_DV_REV11)
2017-02-15 22:18:10 +01:00
2017-02-09 02:36:33 +01:00
# if defined(BIDIR_DATA_PIN)
// Connect EXTI3 Line
GPIO_EXTILineConfig ( PORT_TXD_INT , PIN_TXD_INT ) ;
// Configure EXTI3 line
EXTI_InitStructure . EXTI_Line = EXTI_Line3 ;
# else
2017-02-01 05:33:31 +01:00
// Connect EXTI15 Line
2017-02-09 02:36:33 +01:00
GPIO_EXTILineConfig ( PORT_CLKOUT_INT , PIN_CLKOUT_INT ) ;
2017-02-01 05:33:31 +01:00
// Configure EXTI15 line
EXTI_InitStructure . EXTI_Line = EXTI_Line15 ;
2017-02-15 22:18:10 +01:00
# endif
2017-05-01 06:02:47 +02:00
# if defined(DUPLEX)
// Connect EXTI5 Line
GPIO_EXTILineConfig ( PORT_TXD2_INT , PIN_TXD2_INT ) ;
// Configure EXT5 line
2019-09-19 00:29:12 +02:00
# if defined(ZUMSPOT_ADF7021)
2019-05-26 05:30:32 +02:00
EXTI_InitStructure2 . EXTI_Line = EXTI_Line8 ;
2019-09-19 00:29:12 +02:00
# else
EXTI_InitStructure2 . EXTI_Line = EXTI_Line5 ;
# endif
2017-05-01 06:02:47 +02:00
# endif
2017-02-09 02:36:33 +01:00
# endif
2017-02-01 05:33:31 +01:00
EXTI_InitStructure . EXTI_Mode = EXTI_Mode_Interrupt ;
2017-03-28 07:29:02 +02:00
EXTI_InitStructure . EXTI_Trigger = EXTI_Trigger_Rising_Falling ;
2017-02-01 05:33:31 +01:00
EXTI_InitStructure . EXTI_LineCmd = ENABLE ;
EXTI_Init ( & EXTI_InitStructure ) ;
2019-05-26 05:30:32 +02:00
2017-05-01 06:02:47 +02:00
# if defined(DUPLEX)
EXTI_InitStructure2 . EXTI_Mode = EXTI_Mode_Interrupt ;
EXTI_InitStructure2 . EXTI_Trigger = EXTI_Trigger_Rising ;
EXTI_InitStructure2 . EXTI_LineCmd = ENABLE ;
EXTI_Init ( & EXTI_InitStructure2 ) ;
# endif
2017-02-03 02:08:59 +01:00
}
void CIO : : startInt ( )
{
NVIC_InitTypeDef NVIC_InitStructure ;
2019-05-26 05:30:32 +02:00
2017-07-23 00:58:36 +02:00
# if defined(DUPLEX)
2017-05-01 06:02:47 +02:00
NVIC_InitTypeDef NVIC_InitStructure2 ;
2017-07-23 00:58:36 +02:00
# endif
2017-02-09 02:36:33 +01:00
2017-02-15 22:18:10 +01:00
# if defined(PI_HAT_7021_REV_02)
NVIC_InitStructure . NVIC_IRQChannel = EXTI15_10_IRQn ;
2019-03-11 13:56:16 +01:00
# elif defined(ZUMSPOT_ADF7021) || defined(LIBRE_KIT_ADF7021) || defined(MMDVM_HS_HAT_REV12) || defined(MMDVM_HS_DUAL_HAT_REV10) || defined(NANO_HOTSPOT) || defined(NANO_DV_REV11)
2017-02-15 22:18:10 +01:00
2017-02-09 02:36:33 +01:00
# if defined(BIDIR_DATA_PIN)
// Enable and set EXTI3 Interrupt
NVIC_InitStructure . NVIC_IRQChannel = EXTI3_IRQn ;
# else
2017-02-01 05:33:31 +01:00
// Enable and set EXTI15 Interrupt
NVIC_InitStructure . NVIC_IRQChannel = EXTI15_10_IRQn ;
2017-02-15 22:18:10 +01:00
# endif
2017-05-01 06:02:47 +02:00
# if defined(DUPLEX)
NVIC_InitStructure2 . NVIC_IRQChannel = EXTI9_5_IRQn ;
# endif
2017-02-09 02:36:33 +01:00
# endif
2017-03-28 07:29:02 +02:00
NVIC_InitStructure . NVIC_IRQChannelPreemptionPriority = 1 ;
2017-02-12 20:23:44 +01:00
NVIC_InitStructure . NVIC_IRQChannelSubPriority = 15 ;
2017-02-01 05:33:31 +01:00
NVIC_InitStructure . NVIC_IRQChannelCmd = ENABLE ;
NVIC_Init ( & NVIC_InitStructure ) ;
2019-05-26 05:30:32 +02:00
2017-05-01 06:02:47 +02:00
# if defined(DUPLEX)
NVIC_InitStructure2 . NVIC_IRQChannelPreemptionPriority = 1 ;
NVIC_InitStructure2 . NVIC_IRQChannelSubPriority = 15 ;
NVIC_InitStructure2 . NVIC_IRQChannelCmd = ENABLE ;
NVIC_Init ( & NVIC_InitStructure2 ) ;
# endif
2017-02-01 05:33:31 +01:00
}
2017-02-09 02:36:33 +01:00
# if defined(BIDIR_DATA_PIN)
// RXD pin is bidirectional in standard interfaces
2019-05-26 05:30:32 +02:00
void CIO : : Data_dir_out ( bool dir )
2017-02-09 02:36:33 +01:00
{
GPIO_InitTypeDef GPIO_InitStruct ;
GPIO_InitStruct . GPIO_Speed = GPIO_Speed_50MHz ;
GPIO_InitStruct . GPIO_Pin = PIN_RXD ;
2019-05-26 05:30:32 +02:00
2017-02-09 02:36:33 +01:00
if ( dir )
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_Out_PP ;
else
GPIO_InitStruct . GPIO_Mode = GPIO_Mode_IN_FLOATING ;
2019-05-26 05:30:32 +02:00
2017-02-09 02:36:33 +01:00
GPIO_Init ( PORT_RXD , & GPIO_InitStruct ) ;
}
# endif
2017-02-01 05:33:31 +01:00
void CIO : : SCLK_pin ( bool on )
{
GPIO_WriteBit ( PORT_SCLK , PIN_SCLK , on ? Bit_SET : Bit_RESET ) ;
}
void CIO : : SDATA_pin ( bool on )
{
GPIO_WriteBit ( PORT_SDATA , PIN_SDATA , on ? Bit_SET : Bit_RESET ) ;
}
2017-02-10 18:03:14 +01:00
bool CIO : : SREAD_pin ( )
{
return GPIO_ReadInputDataBit ( PORT_SREAD , PIN_SREAD ) = = Bit_SET ;
}
2017-02-01 05:33:31 +01:00
void CIO : : SLE_pin ( bool on )
{
GPIO_WriteBit ( PORT_SLE , PIN_SLE , on ? Bit_SET : Bit_RESET ) ;
}
2017-05-01 06:02:47 +02:00
# if defined(DUPLEX)
void CIO : : SLE2_pin ( bool on )
{
GPIO_WriteBit ( PORT_SLE2 , PIN_SLE2 , on ? Bit_SET : Bit_RESET ) ;
}
bool CIO : : RXD2_pin ( )
{
return GPIO_ReadInputDataBit ( PORT_RXD2 , PIN_RXD2 ) = = Bit_SET ;
}
# endif
2017-02-14 12:49:22 +01:00
void CIO : : CE_pin ( bool on )
{
GPIO_WriteBit ( PORT_CE , PIN_CE , on ? Bit_SET : Bit_RESET ) ;
}
2017-02-01 05:33:31 +01:00
bool CIO : : RXD_pin ( )
{
return GPIO_ReadInputDataBit ( PORT_RXD , PIN_RXD ) = = Bit_SET ;
}
2017-03-28 07:29:02 +02:00
bool CIO : : CLK_pin ( )
{
# 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
}
2017-02-09 02:36:33 +01:00
# if defined(BIDIR_DATA_PIN)
void CIO : : RXD_pin_write ( bool on )
{
GPIO_WriteBit ( PORT_RXD , PIN_RXD , on ? Bit_SET : Bit_RESET ) ;
}
# endif
2017-02-01 05:33:31 +01:00
void CIO : : TXD_pin ( bool on )
{
GPIO_WriteBit ( PORT_TXD , PIN_TXD , on ? Bit_SET : Bit_RESET ) ;
}
void CIO : : LED_pin ( bool on )
{
GPIO_WriteBit ( PORT_LED , PIN_LED , on ? Bit_SET : Bit_RESET ) ;
}
void CIO : : DEB_pin ( bool on )
{
GPIO_WriteBit ( PORT_DEB , PIN_DEB , on ? Bit_SET : Bit_RESET ) ;
}
void CIO : : DSTAR_pin ( bool on )
{
GPIO_WriteBit ( PORT_DSTAR_LED , PIN_DSTAR_LED , on ? Bit_SET : Bit_RESET ) ;
}
void CIO : : DMR_pin ( bool on )
{
GPIO_WriteBit ( PORT_DMR_LED , PIN_DMR_LED , on ? Bit_SET : Bit_RESET ) ;
}
void CIO : : YSF_pin ( bool on )
{
GPIO_WriteBit ( PORT_YSF_LED , PIN_YSF_LED , on ? Bit_SET : Bit_RESET ) ;
}
void CIO : : P25_pin ( bool on )
{
GPIO_WriteBit ( PORT_P25_LED , PIN_P25_LED , on ? Bit_SET : Bit_RESET ) ;
}
2018-02-13 15:36:40 +01:00
void CIO : : NXDN_pin ( bool on )
{
2018-07-04 22:19:25 +02:00
# if defined(USE_ALTERNATE_NXDN_LEDS)
GPIO_WriteBit ( PORT_YSF_LED , PIN_YSF_LED , on ? Bit_SET : Bit_RESET ) ;
GPIO_WriteBit ( PORT_P25_LED , PIN_P25_LED , on ? Bit_SET : Bit_RESET ) ;
# else
2018-02-13 15:36:40 +01:00
GPIO_WriteBit ( PORT_NXDN_LED , PIN_NXDN_LED , on ? Bit_SET : Bit_RESET ) ;
2018-07-04 22:19:25 +02:00
# endif
2018-02-13 15:36:40 +01:00
}
2018-06-18 02:10:00 +02:00
void CIO : : POCSAG_pin ( bool on )
{
2018-07-04 22:19:25 +02:00
# if defined(USE_ALTERNATE_POCSAG_LEDS)
2018-07-04 10:12:21 +02:00
GPIO_WriteBit ( PORT_DSTAR_LED , PIN_DSTAR_LED , on ? Bit_SET : Bit_RESET ) ;
GPIO_WriteBit ( PORT_DMR_LED , PIN_DMR_LED , on ? Bit_SET : Bit_RESET ) ;
2018-12-09 22:59:10 +01:00
# else
GPIO_WriteBit ( PORT_POCSAG_LED , PIN_POCSAG_LED , on ? Bit_SET : Bit_RESET ) ;
2018-07-04 22:19:25 +02:00
# endif
2018-06-18 02:10:00 +02:00
}
2017-02-01 05:33:31 +01:00
void CIO : : PTT_pin ( bool on )
{
GPIO_WriteBit ( PORT_PTT_LED , PIN_PTT_LED , on ? Bit_SET : Bit_RESET ) ;
}
void CIO : : COS_pin ( bool on )
{
GPIO_WriteBit ( PORT_COS_LED , PIN_COS_LED , on ? Bit_SET : Bit_RESET ) ;
}
2019-05-08 22:34:59 +02:00
void CIO : : setBandVHF ( bool vhf_on ) {
GPIO_WriteBit ( PORT_SET_BAND , PIN_SET_BAND , vhf_on ? Bit_SET : Bit_RESET ) ;
}
bool CIO : : hasSingleADF7021 ( ) {
return GPIO_ReadInputDataBit ( PORT_SGL_DBL , PIN_SGL_DBL ) = = Bit_SET ;
}
bool CIO : : isDualBand ( ) {
return GPIO_ReadInputDataBit ( PORT_DL_DPX , PIN_DL_DPX ) = = Bit_SET ;
}
2017-03-31 19:14:17 +02:00
/**
* Function delay_us ( ) from stm32duino project
*
* @ brief Delay the given number of microseconds .
*
* @ param us Number of microseconds to delay .
*/
static inline void delay_us ( uint32_t us ) {
us * = 12 ;
/* fudge for function call overhead */
us - - ;
asm volatile ( " mov r0, %[us] \n \t "
" 1: subs r0, #1 \n \t "
" bhi 1b \n \t "
:
: [ us ] " r " ( us )
: " r0 " ) ;
}
2017-08-12 23:02:31 +02:00
void CIO : : delay_IFcal ( ) {
delay_us ( 10000 ) ;
2017-04-15 00:03:10 +02:00
}
void CIO : : delay_reset ( ) {
delay_us ( 300 ) ;
2017-03-31 19:14:17 +02:00
}
2017-04-02 03:09:30 +02:00
void CIO : : delay_us ( uint32_t us ) {
: : delay_us ( us ) ;
}
2017-03-31 19:14:17 +02:00
static inline void delay_ns ( ) {
2017-04-02 03:09:30 +02:00
asm volatile ( " nop \n \t "
" nop \n \t "
" nop \n \t "
2017-03-31 19:14:17 +02:00
) ;
}
void CIO : : dlybit ( void )
{
delay_ns ( ) ;
}
2017-02-01 05:33:31 +01:00
# endif