2017-02-01 05:33:31 +01:00
/*
2017-12-27 18:49:58 +01:00
* Copyright ( C ) 2015 , 2016 by Jonathan Naylor G4KLX
2020-11-08 17:13:54 +01:00
* Copyright ( C ) 2016 , 2017 , 2018 , 2019 , 2020 by Andy Uribe CA6JAU
2017-07-23 00:12:13 +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 .
*/
# include "Config.h"
# include "Globals.h"
# include "IO.h"
# if defined(ARDUINO)
# if defined (__STM32F1__)
// STM32F1 pin definitions, using STM32duino
2017-02-15 22:18:10 +01:00
2020-11-08 17:13:54 +01:00
# if defined(ZUMSPOT_ADF7021) || defined(SKYBRIDGE_HS)
2017-03-15 01:17:33 +01:00
# define PIN_SCLK PB5
# define PIN_SREAD PB6
# define PIN_SDATA PB7
# define PIN_SLE PB8
2017-05-01 06:02:47 +02:00
# define PIN_SLE2 PA6
2017-03-15 01:17:33 +01:00
# define PIN_CE PC14
# define PIN_RXD PB4
2017-05-01 06:02:47 +02:00
# define PIN_RXD2 PA4
2017-03-15 01:17:33 +01:00
# define PIN_TXD PB3
2017-05-01 06:02:47 +02:00
# define PIN_TXD2 PA5
2017-03-15 01:17:33 +01:00
# define PIN_CLKOUT PA15
# define PIN_LED PC13
# define PIN_DEB PB9
# define PIN_DSTAR_LED PB12
# define PIN_DMR_LED PB13
# define PIN_YSF_LED PB1
# define PIN_P25_LED PB0
2018-12-09 22:59:10 +01:00
# if defined(STM32_USB_HOST)
# define PIN_NXDN_LED PA1
# else
# define PIN_NXDN_LED PA7
# endif
# define PIN_POCSAG_LED PA5
2017-03-15 01:17:33 +01:00
# define PIN_PTT_LED PB14
# define PIN_COS_LED PB15
2018-04-04 19:55:54 +02:00
# elif defined(LIBRE_KIT_ADF7021) || defined(MMDVM_HS_HAT_REV12) || defined(MMDVM_HS_DUAL_HAT_REV10) || defined(NANO_HOTSPOT) || defined(NANO_DV_REV10)
2017-02-15 22:18:10 +01:00
2017-02-01 05:33:31 +01:00
# define PIN_SCLK PB5
# define PIN_SREAD PB7
# define PIN_SDATA PB6
# define PIN_SLE PB8
2017-05-01 06:02:47 +02:00
# define PIN_SLE2 PA6
2017-02-14 12:49:22 +01:00
# define PIN_CE PC14
2017-02-01 05:33:31 +01:00
# define PIN_RXD PB4
2017-05-01 06:02:47 +02:00
# define PIN_RXD2 PA4
2017-02-01 05:33:31 +01:00
# define PIN_TXD PB3
2017-05-01 06:02:47 +02:00
# define PIN_TXD2 PA5
2017-02-09 02:36:33 +01:00
# define PIN_CLKOUT PA15
2017-02-01 05:33:31 +01:00
# define PIN_LED PC13
# define PIN_DEB PB9
# define PIN_DSTAR_LED PB12
# define PIN_DMR_LED PB13
# define PIN_YSF_LED PB1
# define PIN_P25_LED PB0
2018-02-13 15:36:40 +01:00
# define PIN_NXDN_LED PA8
2018-12-09 22:59:10 +01:00
# define PIN_POCSAG_LED PA7
2017-02-01 05:33:31 +01:00
# define PIN_PTT_LED PB14
# define PIN_COS_LED PB15
2017-02-15 22:18:10 +01:00
# else
2020-11-08 17:13:54 +01:00
# error "Either ZUMSPOT_ADF7021, LIBRE_KIT_ADF7021, MMDVM_HS_HAT_REV12, MMDVM_HS_DUAL_HAT_REV10, NANO_HOTSPOT, NANO_DV_REV10 or SKYBRIDGE_HS need to be defined"
2017-02-15 22:18:10 +01:00
# endif
2017-07-01 04:53:36 +02:00
# elif defined(__MK20DX256__) || defined(__MK64FX512__) || defined(__MK66FX1M0__)
// Teensy pin definitions
2018-12-09 22:59:10 +01:00
# define PIN_SCLK 2
# define PIN_SDATA 3
# define PIN_SREAD 4
# define PIN_SLE 5
# define PIN_CE 6
# define PIN_RXD 7
# define PIN_TXD 8
# define PIN_CLKOUT 22
# define PIN_LED 13
# define PIN_DEB 23
# define PIN_DSTAR_LED 16
# define PIN_DMR_LED 17
# define PIN_YSF_LED 18
# define PIN_P25_LED 19
# define PIN_NXDN_LED 20
# define PIN_POCSAG_LED 21
# define PIN_PTT_LED 14
# define PIN_COS_LED 15
2017-07-01 04:53:36 +02:00
2017-02-01 05:33:31 +01:00
# else
// Arduino pin definitions (Due and Zero)
2018-12-09 22:59:10 +01:00
# define PIN_SCLK 3
# define PIN_SDATA 4 // 2 in Arduino Zero Pro
# define PIN_SREAD 5
# define PIN_SLE 6
# define PIN_CE 12
# define PIN_RXD 7
# define PIN_TXD 8
# define PIN_CLKOUT 2 // 4 in Arduino Zero Pro
# define PIN_LED 13
# define PIN_DEB 11
# define PIN_DSTAR_LED 14
# define PIN_DMR_LED 15
# define PIN_YSF_LED 16
# define PIN_P25_LED 17
# define PIN_NXDN_LED 18
# define PIN_POCSAG_LED 19
# define PIN_PTT_LED 9
# define PIN_COS_LED 10
2017-02-01 05:33:31 +01:00
# endif
extern " C " {
void EXT_IRQHandler ( void ) {
io . interrupt ( ) ;
}
}
2017-05-01 06:02:47 +02:00
# if defined(DUPLEX)
extern " C " {
void EXT_IRQHandler2 ( void ) {
io . interrupt2 ( ) ;
}
}
# endif
2017-08-12 23:02:31 +02:00
void CIO : : delay_IFcal ( ) {
delayMicroseconds ( 10000 ) ;
2017-04-15 00:03:10 +02:00
}
void CIO : : delay_reset ( ) {
delayMicroseconds ( 300 ) ;
2017-02-01 05:33:31 +01:00
}
void CIO : : Init ( )
{
2017-02-15 22:18:10 +01:00
# if defined (__STM32F1__)
2020-11-08 17:13:54 +01:00
# if defined(ZUMSPOT_ADF7021) || defined(LIBRE_KIT_ADF7021) || defined(MMDVM_HS_HAT_REV12) || defined(MMDVM_HS_DUAL_HAT_REV10) || defined(NANO_HOTSPOT) || defined(NANO_DV_REV10) || defined(SKYBRIDGE_HS)
2017-02-01 05:33:31 +01:00
afio_cfg_debug_ports ( AFIO_DEBUG_SW_ONLY ) ;
2017-02-15 22:18:10 +01:00
# endif
2017-02-01 05:33:31 +01:00
# endif
2018-09-08 20:54:35 +02:00
2017-02-01 05:33:31 +01:00
pinMode ( PIN_SCLK , OUTPUT ) ;
pinMode ( PIN_SDATA , OUTPUT ) ;
2017-02-10 18:03:14 +01:00
pinMode ( PIN_SREAD , INPUT ) ;
2017-02-01 05:33:31 +01:00
pinMode ( PIN_SLE , OUTPUT ) ;
2017-02-14 12:49:22 +01:00
pinMode ( PIN_CE , OUTPUT ) ;
2017-02-01 05:33:31 +01:00
pinMode ( PIN_RXD , INPUT ) ;
2017-02-09 02:36:33 +01:00
pinMode ( PIN_CLKOUT , INPUT ) ;
2017-02-01 05:33:31 +01:00
pinMode ( PIN_LED , OUTPUT ) ;
pinMode ( PIN_DEB , OUTPUT ) ;
pinMode ( PIN_DSTAR_LED , OUTPUT ) ;
pinMode ( PIN_DMR_LED , OUTPUT ) ;
pinMode ( PIN_YSF_LED , OUTPUT ) ;
pinMode ( PIN_P25_LED , OUTPUT ) ;
2018-02-13 15:36:40 +01:00
pinMode ( PIN_NXDN_LED , OUTPUT ) ;
2018-12-09 22:59:10 +01:00
pinMode ( PIN_POCSAG_LED , OUTPUT ) ;
2017-02-01 05:33:31 +01:00
pinMode ( PIN_PTT_LED , OUTPUT ) ;
pinMode ( PIN_COS_LED , OUTPUT ) ;
2018-09-08 20:54:35 +02:00
2017-05-01 06:02:47 +02:00
# if defined(DUPLEX)
pinMode ( PIN_SLE2 , OUTPUT ) ;
pinMode ( PIN_RXD2 , INPUT ) ;
pinMode ( PIN_TXD2 , INPUT ) ;
# endif
2018-09-08 20:54:35 +02:00
2017-02-09 02:36:33 +01:00
# if defined(BIDIR_DATA_PIN)
pinMode ( PIN_TXD , INPUT ) ;
# else
pinMode ( PIN_TXD , OUTPUT ) ;
# endif
2017-02-01 05:33:31 +01:00
}
2017-02-03 02:08:59 +01:00
void CIO : : startInt ( )
2017-02-01 05:33:31 +01:00
{
2017-02-09 02:36:33 +01:00
# if defined(BIDIR_DATA_PIN)
// TXD pin is TxRxCLK of ADF7021, standard TX/RX data interface
# if defined (__STM32F1__)
2017-03-28 07:29:02 +02:00
attachInterrupt ( PIN_TXD , EXT_IRQHandler , CHANGE ) ;
2017-02-09 02:36:33 +01:00
# else
2017-03-28 07:29:02 +02:00
attachInterrupt ( digitalPinToInterrupt ( PIN_TXD ) , EXT_IRQHandler , CHANGE ) ;
2017-02-09 02:36:33 +01:00
# endif
# else
2017-02-01 05:33:31 +01:00
# if defined (__STM32F1__)
2017-03-28 07:29:02 +02:00
attachInterrupt ( PIN_CLKOUT , EXT_IRQHandler , CHANGE ) ;
2017-02-01 05:33:31 +01:00
# else
2017-03-28 07:29:02 +02:00
attachInterrupt ( digitalPinToInterrupt ( PIN_CLKOUT ) , EXT_IRQHandler , CHANGE ) ;
2017-02-01 05:33:31 +01:00
# endif
2017-02-09 02:36:33 +01:00
# endif
2017-05-01 06:02:47 +02:00
# if defined(DUPLEX)
attachInterrupt ( PIN_TXD2 , EXT_IRQHandler2 , RISING ) ;
# endif
2017-02-09 02:36:33 +01:00
}
# if defined(BIDIR_DATA_PIN)
// RXD pin is bidirectional in standard interfaces
void CIO : : Data_dir_out ( bool dir )
{
if ( dir )
pinMode ( PIN_RXD , OUTPUT ) ;
else
pinMode ( PIN_RXD , INPUT ) ;
2017-02-01 05:33:31 +01:00
}
2017-02-09 02:36:33 +01:00
# endif
2017-02-01 05:33:31 +01:00
void CIO : : SCLK_pin ( bool on )
{
digitalWrite ( PIN_SCLK , on ? HIGH : LOW ) ;
}
void CIO : : SDATA_pin ( bool on )
{
digitalWrite ( PIN_SDATA , on ? HIGH : LOW ) ;
}
2017-02-10 18:03:14 +01:00
bool CIO : : SREAD_pin ( )
{
return digitalRead ( PIN_SREAD ) = = HIGH ;
}
2017-02-01 05:33:31 +01:00
void CIO : : SLE_pin ( bool on )
{
digitalWrite ( PIN_SLE , on ? HIGH : LOW ) ;
}
2017-05-01 06:02:47 +02:00
# if defined(DUPLEX)
void CIO : : SLE2_pin ( bool on )
{
digitalWrite ( PIN_SLE2 , on ? HIGH : LOW ) ;
}
bool CIO : : RXD2_pin ( )
{
return digitalRead ( PIN_RXD2 ) = = HIGH ;
}
# endif
2017-02-14 12:49:22 +01:00
void CIO : : CE_pin ( bool on )
{
digitalWrite ( PIN_CE , on ? HIGH : LOW ) ;
}
2017-02-01 05:33:31 +01:00
bool CIO : : RXD_pin ( )
{
return digitalRead ( PIN_RXD ) = = HIGH ;
}
2017-03-28 07:29:02 +02:00
bool CIO : : CLK_pin ( )
{
return digitalRead ( PIN_TXD ) = = HIGH ;
}
2017-02-09 02:36:33 +01:00
# if defined(BIDIR_DATA_PIN)
void CIO : : RXD_pin_write ( bool on )
{
digitalWrite ( PIN_RXD , on ? HIGH : LOW ) ;
}
# endif
2017-02-01 05:33:31 +01:00
void CIO : : TXD_pin ( bool on )
{
digitalWrite ( PIN_TXD , on ? HIGH : LOW ) ;
}
void CIO : : LED_pin ( bool on )
{
digitalWrite ( PIN_LED , on ? HIGH : LOW ) ;
}
void CIO : : DEB_pin ( bool on )
{
digitalWrite ( PIN_DEB , on ? HIGH : LOW ) ;
}
void CIO : : DSTAR_pin ( bool on )
{
digitalWrite ( PIN_DSTAR_LED , on ? HIGH : LOW ) ;
}
void CIO : : DMR_pin ( bool on )
{
digitalWrite ( PIN_DMR_LED , on ? HIGH : LOW ) ;
}
void CIO : : YSF_pin ( bool on )
{
digitalWrite ( PIN_YSF_LED , on ? HIGH : LOW ) ;
}
void CIO : : P25_pin ( bool on )
{
digitalWrite ( PIN_P25_LED , on ? HIGH : LOW ) ;
}
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)
digitalWrite ( PIN_YSF_LED , on ? HIGH : LOW ) ;
digitalWrite ( PIN_P25_LED , on ? HIGH : LOW ) ;
# else
2018-02-13 15:36:40 +01:00
digitalWrite ( PIN_NXDN_LED , on ? HIGH : LOW ) ;
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
digitalWrite ( PIN_DSTAR_LED , on ? HIGH : LOW ) ;
digitalWrite ( PIN_DMR_LED , on ? HIGH : LOW ) ;
2018-12-09 22:59:10 +01:00
# else
digitalWrite ( PIN_POCSAG_LED , on ? HIGH : LOW ) ;
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 )
{
digitalWrite ( PIN_PTT_LED , on ? HIGH : LOW ) ;
}
void CIO : : COS_pin ( bool on )
{
digitalWrite ( PIN_COS_LED , on ? HIGH : LOW ) ;
}
2017-04-02 03:09:30 +02:00
void CIO : : delay_us ( uint32_t us ) {
: : delayMicroseconds ( us ) ;
}
2017-03-31 19:14:17 +02:00
void CIO : : dlybit ( void )
{
asm volatile ( " nop \n \t "
" nop \n \t "
" nop \n \t "
) ;
}
2017-02-01 05:33:31 +01:00
# endif