diff --git a/meson.build b/meson.build index 4788d7a9..2c1f1059 100644 --- a/meson.build +++ b/meson.build @@ -217,6 +217,7 @@ mduv380_src = src + stm32f405_src + ['platform/drivers/display/HX8353_MDx.c', 'platform/drivers/ADC/ADC1_MDx.c', 'platform/drivers/tones/toneGenerator_MDx.c', 'platform/drivers/baseband/radio_UV3x0.c', + 'platform/drivers/GPS/GPS_MDx.c', 'platform/targets/MD-UV380/platform.c'] mduv380_inc = inc + stm32f405_inc + ['platform/targets/MD-UV380'] diff --git a/platform/drivers/GPS/GPS_MDx.c b/platform/drivers/GPS/GPS_MDx.c index f1522bab..bbad0508 100644 --- a/platform/drivers/GPS/GPS_MDx.c +++ b/platform/drivers/GPS/GPS_MDx.c @@ -25,7 +25,7 @@ #include #include -static int8_t detectStatus = -1; +int8_t detectStatus = -1; size_t bufPos = 0; size_t maxPos = 0; char *dataBuf; @@ -34,11 +34,21 @@ bool receiving = false; OS_FLAG_GRP sentenceReady; OS_ERR err; +#ifdef PLATFORM_MD3x0 +#define PORT USART3 +#else +#define PORT USART1 +#endif + +#ifdef PLATFORM_MD3x0 void __attribute__((used)) USART3_IRQHandler() +#else +void __attribute__((used)) USART1_IRQHandler() +#endif { - if(USART3->SR & USART_SR_RXNE) + if(PORT->SR & USART_SR_RXNE) { - char value = USART3->DR; + char value = PORT->DR; if((receiving == false) && (value == '$') && (bufPos == 0)) { @@ -70,7 +80,7 @@ void __attribute__((used)) USART3_IRQHandler() } } - USART3->SR = 0; + PORT->SR = 0; } @@ -80,17 +90,27 @@ void gps_init(const uint16_t baud) gpio_setMode(GPS_DATA, ALTERNATE); gpio_setAlternateFunction(GPS_DATA, 7); + #ifdef PLATFORM_MD3x0 + const unsigned int quot = 2*42000000/baud; /* APB1 clock is 42MHz */ RCC->APB1ENR |= RCC_APB1ENR_USART3EN; + #else + const unsigned int quot = 2*84000000/baud; /* APB2 clock is 84MHz */ + RCC->APB2ENR |= RCC_APB2ENR_USART1EN; + #endif __DSB(); - const unsigned int quot = 2*42000000/baud; - USART3->BRR = quot/2 + (quot & 1); - USART3->CR3 |= USART_CR3_ONEBIT; - USART3->CR1 = USART_CR1_RE + PORT->BRR = quot/2 + (quot & 1); + PORT->CR3 |= USART_CR3_ONEBIT; + PORT->CR1 = USART_CR1_RE | USART_CR1_RXNEIE; + #ifdef PLATFORM_MD3x0 NVIC_ClearPendingIRQ(USART3_IRQn); NVIC_SetPriority(USART3_IRQn, 14); + #else + NVIC_ClearPendingIRQ(USART1_IRQn); + NVIC_SetPriority(USART1_IRQn, 14); + #endif OSFlagCreate(&sentenceReady, "", 0, &err); } @@ -99,20 +119,30 @@ void gps_terminate() { OSFlagDel(&sentenceReady, OS_OPT_DEL_NO_PEND, &err); gps_disable(); + + #ifdef PLATFORM_MD3x0 RCC->APB1ENR &= ~RCC_APB1ENR_USART3EN; + #else + RCC->APB2ENR &= ~RCC_APB2ENR_USART1EN; + #endif } void gps_enable() { gpio_setPin(GPS_EN); - USART3->CR1 |= USART_CR1_UE; + PORT->CR1 |= USART_CR1_UE; } void gps_disable() { gpio_clearPin(GPS_EN); - USART3->CR1 &= ~USART_CR1_UE; + PORT->CR1 &= ~USART_CR1_UE; + + #ifdef PLATFORM_MD3x0 NVIC_DisableIRQ(USART3_IRQn); + #else + NVIC_DisableIRQ(USART1_IRQn); + #endif } bool gps_detect(uint16_t timeout) @@ -154,14 +184,22 @@ int gps_getNmeaSentence(char *buf, const size_t maxLength) maxPos = maxLength; dataBuf = buf; + #ifdef PLATFORM_MD3x0 NVIC_EnableIRQ(USART3_IRQn); + #else + NVIC_EnableIRQ(USART1_IRQn); + #endif OS_FLAGS status = OSFlagPend(&sentenceReady, 0x03, 0, OS_OPT_PEND_FLAG_SET_ANY | OS_OPT_PEND_FLAG_CONSUME | OS_OPT_PEND_BLOCKING, NULL, &err); + #ifdef PLATFORM_MD3x0 NVIC_DisableIRQ(USART3_IRQn); + #else + NVIC_DisableIRQ(USART1_IRQn); + #endif if(status & 0x01) { diff --git a/platform/targets/MD-UV380/hwconfig.h b/platform/targets/MD-UV380/hwconfig.h index 758d05d8..48c51a07 100644 --- a/platform/targets/MD-UV380/hwconfig.h +++ b/platform/targets/MD-UV380/hwconfig.h @@ -103,6 +103,10 @@ #define AMP_EN GPIOB,9 #define SPK_MUTE GPIOB,8 +/* GPS, for the devices who have it */ +#define GPS_EN GPIOA,9 +#define GPS_DATA GPIOA,10 + /* * To enable pwm for display backlight dimming uncomment this directive. * diff --git a/tests/platform/gps_test_MDx.c b/tests/platform/gps_test_MDx.c index 5d56a21b..924683f1 100644 --- a/tests/platform/gps_test_MDx.c +++ b/tests/platform/gps_test_MDx.c @@ -25,7 +25,7 @@ #include #include #include -#include +#include char line[MINMEA_MAX_LENGTH*10];