Files
inav/lib/main/STM32H7/Drivers/BSP/Adafruit_Shield/adafruit_802.c
T
admin dac37fd077
Make sure docs are updated / settings_md (push) Canceled after 0s
Build firmware / test (push) Canceled after 0s
Build firmware / build-SITL-Windows (push) Canceled after 0s
Build firmware / build-SITL-Mac (push) Canceled after 0s
Build firmware / build-SITL-Linux (push) Canceled after 0s
Build firmware / build-SITL-Linux-arm64 (push) Canceled after 0s
Build firmware / upload-artifacts (push) Canceled after 0s
Build firmware / build-single-target (push) Canceled after 0s
Build firmware / build (9) (push) Canceled after 0s
Build firmware / build (8) (push) Canceled after 0s
Build firmware / build (7) (push) Canceled after 0s
Build firmware / build (6) (push) Canceled after 0s
Build firmware / build (5) (push) Canceled after 0s
Build firmware / build (4) (push) Canceled after 0s
Build firmware / build (3) (push) Canceled after 0s
Build firmware / build (2) (push) Canceled after 0s
Build firmware / build (14) (push) Canceled after 0s
Build firmware / build (13) (push) Canceled after 0s
Build firmware / build (12) (push) Canceled after 0s
Build firmware / build (11) (push) Canceled after 0s
Build firmware / build (10) (push) Canceled after 0s
Build firmware / build (1) (push) Canceled after 0s
Build firmware / build (0) (push) Canceled after 0s
Build firmware / detect (push) Canceled after 0s
Build pre-release / build (push) Canceled after 0s
Build pre-release / Release (push) Canceled after 0s
Sync inav to Gitea
2026-08-03 16:37:40 +08:00

469 lines
12 KiB
C

/**
******************************************************************************
* @file adafruit_802.c
* @author MCD Application Team
* @brief This file provides set of firmware functions to manage:
* - Joystick available on Adafruit 1.8" TFT LCD shield (reference ID 802)
*
******************************************************************************
* @attention
*
* <h2><center>&copy; Copyright (c) 2018 STMicroelectronics.
* All rights reserved.</center></h2>
*
* This software component is licensed by ST under BSD 3-Clause license,
* the "License"; You may not use this file except in compliance with the
* License. You may obtain a copy of the License at:
* opensource.org/licenses/BSD-3-Clause
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "adafruit_802.h"
/** @addtogroup BSP
* @{
*/
/** @addtogroup ADAFRUIT_802
* @{
*/
/** @addtogroup ADAFRUIT_802_LOW_LEVEL
* @{
*/
/** @defgroup ADAFRUIT_802_LOW_LEVEL_Private_Variables LOW LEVEL Private Variables
* @{
*/
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
static uint32_t IsJoyMspCbValid = 0;
#endif
static ADC_HandleTypeDef hJoyHandle;
/**
* @}
*/
/** @defgroup ADAFRUIT_802_LOW_LEVEL_Private_FunctionPrototypes LOW LEVEL Private FunctionPrototypes
* @{
*/
static void JOY1_MspInit(ADC_HandleTypeDef *hadc);
static void JOY1_MspDeInit(ADC_HandleTypeDef *hadc);
/**
* @}
*/
/** @addtogroup ADAFRUIT_802_LOW_LEVEL_Exported_Functions
* @{
*/
/**
* @brief Configures the joystick.
* @param JOY Joystick to be initialized
* @param JoyMode Button mode.
* This parameter is not used as the ADC pin should be always configured
* in analog mode.
* @param JoyPins There are no physical pins but voltage levels
* @retval BSP status
*/
int32_t ADAFRUIT_802_JOY_Init(JOY_TypeDef JOY, JOYMode_TypeDef JoyMode, JOYPin_TypeDef JoyPins)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(JoyPins);
UNUSED(JoyMode);
int32_t ret = BSP_ERROR_NONE;
if(JOY >= JOYn)
{
ret = BSP_ERROR_WRONG_PARAM;
}
else
{
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 0)
/* Init the UART Msp */
JOY1_MspInit(&hJoyHandle);
#else
if(IsJoyMspCbValid == 0U)
{
if(ADAFRUIT_802_JOY_RegisterDefaultMspCallbacks(JOY) != BSP_ERROR_NONE)
{
return BSP_ERROR_MSP_FAILURE;
}
}
#endif
if(MX_ADAFRUIT_802_ADC_Init(&hJoyHandle) != HAL_OK)
{
ret = BSP_ERROR_PERIPH_FAILURE;
}
else
{
#if defined(ADC_CALFACT_CALFACT_S)
/* Run ADC calibration */
#if defined(ADC_CR_ADCALLIN)
if(HAL_ADCEx_Calibration_Start(&hJoyHandle, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
{
ret = BSP_ERROR_PERIPH_FAILURE;
}
else
{
if(HAL_ADCEx_Calibration_Start(&hJoyHandle, ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED) != HAL_OK)
{
ret = BSP_ERROR_PERIPH_FAILURE;
}
}
#else
if(HAL_ADCEx_Calibration_Start(&hJoyHandle, ADC_SINGLE_ENDED) != HAL_OK)
{
ret = BSP_ERROR_PERIPH_FAILURE;
}
#endif
#endif /* defined(ADC_CALFACT_CALFACT_S) */
}
}
return ret;
}
/**
* @brief DeInit joystick GPIOs.
* @param JOY Joystick to be de-initialized
* @param JoyPins There are no physical pins but voltage levels
* @retval BSP status
*/
int32_t ADAFRUIT_802_JOY_DeInit(JOY_TypeDef JOY, JOYPin_TypeDef JoyPins)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(JoyPins);
int32_t ret = BSP_ERROR_NONE;
/* ADC configuration */
hJoyHandle.Instance = ADAFRUIT_802_ADCx;
if(JOY >= JOYn)
{
ret = BSP_ERROR_WRONG_PARAM;
}
else
{
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 0)
JOY1_MspDeInit(&hJoyHandle);
#endif /* (USE_HAL_UART_REGISTER_CALLBACKS == 0) */
if(HAL_ADC_DeInit(&hJoyHandle) != HAL_OK)
{
ret = BSP_ERROR_PERIPH_FAILURE;
}
}
return ret;
}
/**
* @brief Returns the Joystick key pressed.
* @param JOY Joystick to get its pins' state
* @retval BSP error code if value is negative or one of the following values:
* - JOY_NONE : 3.3 V / 4095
* - JOY_SEL : 1.055 V / 1308
* - JOY_DOWN : 0.71 V / 88
* - JOY_LEFT : 3.0 V / 3720
* - JOY_RIGHT : 0.595 V / 737
* - JOY_UP : 1.65 V / 2046
*/
int32_t ADAFRUIT_802_JOY_GetState(JOY_TypeDef JOY)
{
int32_t ret;
uint32_t keyconvertedvalue;
if(JOY >= JOYn)
{
ret = BSP_ERROR_WRONG_PARAM;
}/* Start the conversion process */
else if(HAL_ADC_Start(&hJoyHandle) != HAL_OK)
{
ret = BSP_ERROR_PERIPH_FAILURE;
}/* Wait for the end of conversion */
else if(HAL_ADC_PollForConversion(&hJoyHandle, ADAFRUIT_802_ADCx_POLL_TIMEOUT) != HAL_OK)
{
ret = BSP_ERROR_PERIPH_FAILURE;
}/* Check if the continuous conversion of regular channel is finished */
else if((HAL_ADC_GetState(&hJoyHandle) & HAL_ADC_STATE_REG_EOC) != HAL_ADC_STATE_REG_EOC)
{
ret = BSP_ERROR_BUSY;
}
else
{
/* Get the converted value of regular channel */
keyconvertedvalue = HAL_ADC_GetValue(&hJoyHandle);
if((keyconvertedvalue > 2010U) && (keyconvertedvalue < 2500U))
{
ret = (int32_t)JOY_UP;
}
else if((keyconvertedvalue > 680U) && (keyconvertedvalue < 900U))
{
ret = (int32_t)JOY_RIGHT;
}
else if((keyconvertedvalue > 1270U) && (keyconvertedvalue < 1500U))
{
ret = (int32_t)JOY_SEL;
}
else if((keyconvertedvalue > 50U) && (keyconvertedvalue < 200U))
{
ret = (int32_t)JOY_DOWN;
}
else if((keyconvertedvalue > 3400U) && (keyconvertedvalue < 3760U))
{
ret = (int32_t)JOY_LEFT;
}
else
{
ret = (int32_t)JOY_NONE;
}
}
/* Return the code of the Joystick key pressed */
return ret;
}
/**
* @brief Configures ADC peripheral
* @param hadc ADC handle
* @retval HAL error code
*/
__weak HAL_StatusTypeDef MX_ADAFRUIT_802_ADC_Init(ADC_HandleTypeDef *hadc)
{
HAL_StatusTypeDef ret = HAL_OK;
ADC_ChannelConfTypeDef sConfig;
/* ADC configuration */
hadc->Instance = ADAFRUIT_802_ADCx;
hadc->Init.ClockPrescaler = ADAFRUIT_802_ADCx_PRESCALER;
hadc->Init.Resolution = ADC_RESOLUTION_12B;
#if defined(ADC_CR2_ALIGN)
hadc->Init.DataAlign = ADC_DATAALIGN_RIGHT;
#endif
hadc->Init.ScanConvMode = (uint32_t)DISABLE;
#if defined(ADC_EOC_SINGLE_CONV)
hadc->Init.EOCSelection = ADC_EOC_SINGLE_CONV;
#endif
hadc->Init.ContinuousConvMode = DISABLE;
hadc->Init.NbrOfConversion = 1;
hadc->Init.DiscontinuousConvMode = DISABLE;
#if defined(ADC_CFGR_DISCNUM)
hadc->Init.NbrOfDiscConversion = 0;
#endif
hadc->Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc->Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
#if defined(ADC_CR2_DMA)
hadc->Init.DMAContinuousRequests = DISABLE;
#endif
#if defined(ADC_SMPR_SMP1) && defined(ADC_SMPR_SMP2)
hadc->Init.SamplingTimeCommon1 = ADC_SAMPLETIME_39CYCLES_5;
hadc->Init.SamplingTimeCommon2 = ADC_SAMPLETIME_39CYCLES_5;
#endif
#if defined(ADC_CFGR2_LFTRIG)
hadc->Init.TriggerFrequencyMode = ADC_TRIGGER_FREQ_HIGH;
#endif
if (HAL_ADC_Init(hadc) != HAL_OK)
{
ret = HAL_ERROR;
}
else
{
/**Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
*/
sConfig.Channel = ADAFRUIT_802_ADCx_CHANNEL;
sConfig.Rank = ADAFRUIT_802_ADCx_RANK;
sConfig.SamplingTime = ADAFRUIT_802_ADCx_SAMPLETIME;
#if defined(ADC_OFR1_OFFSET1)
sConfig.Offset = 0;
#endif
#if defined(ADC_SINGLE_ENDED)
sConfig.SingleDiff = ADC_SINGLE_ENDED;
#endif
#if defined(ADC_OFFSET_NONE)
sConfig.OffsetNumber = ADC_OFFSET_NONE;
#endif
if (HAL_ADC_ConfigChannel(hadc, &sConfig) != HAL_OK)
{
ret = HAL_ERROR;
}
}
return ret;
}
#if (USE_HAL_ADC_REGISTER_CALLBACKS == 1)
/**
* @brief Register Default ADCx Bus Msp Callbacks
* @param JOY Joystick to be configured.
* This parameter can be JOY1
* @retval BSP status
*/
int32_t ADAFRUIT_802_JOY_RegisterDefaultMspCallbacks(JOY_TypeDef JOY)
{
int32_t ret = BSP_ERROR_NONE;
if(JOY >= JOYn)
{
ret = BSP_ERROR_WRONG_PARAM;
}
else
{
__HAL_ADC_RESET_HANDLE_STATE(&hJoyHandle);
/* Register default MspInit/MspDeInit Callback */
if(HAL_ADC_RegisterCallback(&hJoyHandle, HAL_ADC_MSPINIT_CB_ID, JOY1_MspInit) != HAL_OK)
{
ret = BSP_ERROR_PERIPH_FAILURE;
}
else if(HAL_ADC_RegisterCallback(&hJoyHandle, HAL_ADC_MSPDEINIT_CB_ID, JOY1_MspDeInit) != HAL_OK)
{
ret = BSP_ERROR_PERIPH_FAILURE;
}
else
{
IsJoyMspCbValid = 1U;
}
}
/* BSP status */
return ret;
}
/**
* @brief Register ADCx Bus Msp Callback registering
* @param JOY Joystick to be configured.
* This parameter can be JOY1
* @param Callbacks pointer to ADCx MspInit/MspDeInit callback functions
* @retval BSP status
*/
int32_t ADAFRUIT_802_JOY_RegisterMspCallbacks(JOY_TypeDef JOY, ADAFRUIT_802_JOY_Cb_t *Callback)
{
int32_t ret = BSP_ERROR_NONE;
if(JOY >= JOYn)
{
ret = BSP_ERROR_WRONG_PARAM;
}
else
{
__HAL_ADC_RESET_HANDLE_STATE(&hJoyHandle);
/* Register MspInit/MspDeInit Callbacks */
if(HAL_ADC_RegisterCallback(&hJoyHandle, HAL_ADC_MSPINIT_CB_ID, Callback->pMspInitCb) != HAL_OK)
{
ret = BSP_ERROR_PERIPH_FAILURE;
}
else if(HAL_ADC_RegisterCallback(&hJoyHandle, HAL_ADC_MSPDEINIT_CB_ID, Callback->pMspDeInitCb) != HAL_OK)
{
ret = BSP_ERROR_PERIPH_FAILURE;
}
else
{
IsJoyMspCbValid = 1U;
}
}
/* BSP status */
return ret;
}
#endif /* USE_HAL_ADC_REGISTER_CALLBACKS */
/**
* @}
*/
/** @defgroup ADAFRUIT_802_LOW_LEVEL_Private_Functions LOW LEVEL Private Functions
* @{
*/
/**
* @brief Initializes ADC MSP.
* @param hadc ADC handle
* @retval None
*/
static void JOY1_MspInit(ADC_HandleTypeDef *hadc)
{
GPIO_InitTypeDef GPIO_InitStruct;
#if defined (RCC_ADCCLKSOURCE_SYSCLK) || defined (RCC_ADC12CLKSOURCE_SYSCLK)
RCC_PeriphCLKInitTypeDef RCC_PeriphCLKInitStruct;
#endif
/* Prevent unused argument(s) compilation warning */
UNUSED(hadc);
/*** Configure the GPIOs ***/
/* Enable GPIO clock */
ADAFRUIT_802_ADCx_GPIO_CLK_ENABLE();
/* Configure the selected ADC Channel as analog input */
GPIO_InitStruct.Pin = ADAFRUIT_802_ADCx_GPIO_PIN;
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
#if defined (RCC_ADCCLKSOURCE_SYSCLK) || defined (RCC_ADC12CLKSOURCE_SYSCLK)
GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
#endif
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(ADAFRUIT_802_ADCx_GPIO_PORT, &GPIO_InitStruct);
/*** Configure the ADC peripheral ***/
/* Enable ADC clock */
ADAFRUIT_802_ADCx_CLK_ENABLE();
#if defined (RCC_ADCCLKSOURCE_SYSCLK)
/* Configure SYSCLK as source clock for ADC */
RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC;
RCC_PeriphCLKInitStruct.AdcClockSelection = RCC_ADCCLKSOURCE_SYSCLK;
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);
#elif defined (RCC_ADC12CLKSOURCE_SYSCLK)
RCC_PeriphCLKInitStruct.PeriphClockSelection = RCC_PERIPHCLK_ADC12;
RCC_PeriphCLKInitStruct.Adc12ClockSelection = RCC_ADC12CLKSOURCE_SYSCLK;
HAL_RCCEx_PeriphCLKConfig(&RCC_PeriphCLKInitStruct);
#endif
}
/**
* @brief DeInitializes ADC MSP.
* @param hadc ADC handle
* @note ADC DeInit does not disable the GPIO clock
* @retval None
*/
static void JOY1_MspDeInit(ADC_HandleTypeDef *hadc)
{
GPIO_InitTypeDef GPIO_InitStruct;
/* Prevent unused argument(s) compilation warning */
UNUSED(hadc);
/*** DeInit the ADC peripheral ***/
/* Disable ADC clock */
ADAFRUIT_802_ADCx_CLK_DISABLE();
/* Configure the selected ADC Channel as analog input */
GPIO_InitStruct.Pin = ADAFRUIT_802_ADCx_GPIO_PIN ;
HAL_GPIO_DeInit(ADAFRUIT_802_ADCx_GPIO_PORT, GPIO_InitStruct.Pin);
}
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/