test
Revision 14:1a18e061d0ec, committed 2020-10-15
- Comitter:
- mylene
- Date:
- Thu Oct 15 19:38:32 2020 +0000
- Parent:
- 13:85dbcff443aa
- Commit message:
- l;
Changed in this revision
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/Common/accelero.h --- a/Drivers/BSP/Components/Common/accelero.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,143 +0,0 @@ -/** - ****************************************************************************** - * @file accelero.h - * @author MCD Application Team - * @version V4.0.1 - * @date 21-July-2015 - * @brief This header file contains the functions prototypes for the Accelerometer driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __ACCELERO_H -#define __ACCELERO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include <stdint.h> - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup ACCELERO - * @{ - */ - -/** @defgroup ACCELERO_Exported_Types - * @{ - */ - -/** @defgroup ACCELERO_Driver_structure Accelerometer Driver structure - * @{ - */ -typedef struct -{ - void (*Init)(uint16_t); - void (*DeInit)(void); - uint8_t (*ReadID)(void); - void (*Reset)(void); - void (*LowPower)(void); - void (*ConfigIT)(void); - void (*EnableIT)(uint8_t); - void (*DisableIT)(uint8_t); - uint8_t (*ITStatus)(uint16_t); - void (*ClearIT)(void); - void (*FilterConfig)(uint8_t); - void (*FilterCmd)(uint8_t); - void (*GetXYZ)(int16_t *); -}ACCELERO_DrvTypeDef; -/** - * @} - */ - -/** @defgroup ACCELERO_Configuration_structure Accelerometer Configuration structure - * @{ - */ - -/* ACCELERO struct */ -typedef struct -{ - uint8_t Power_Mode; /* Power-down/Normal Mode */ - uint8_t AccOutput_DataRate; /* OUT data rate */ - uint8_t Axes_Enable; /* Axes enable */ - uint8_t High_Resolution; /* High Resolution enabling/disabling */ - uint8_t BlockData_Update; /* Block Data Update */ - uint8_t Endianness; /* Endian Data selection */ - uint8_t AccFull_Scale; /* Full Scale selection */ - uint8_t Communication_Mode; -}ACCELERO_InitTypeDef; - -/* ACCELERO High Pass Filter struct */ -typedef struct -{ - uint8_t HighPassFilter_Mode_Selection; /* Internal filter mode */ - uint8_t HighPassFilter_CutOff_Frequency; /* High pass filter cut-off frequency */ - uint8_t HighPassFilter_AOI1; /* HPF_enabling/disabling for AOI function on interrupt 1 */ - uint8_t HighPassFilter_AOI2; /* HPF_enabling/disabling for AOI function on interrupt 2 */ - uint8_t HighPassFilter_Data_Sel; - uint8_t HighPassFilter_Stat; -}ACCELERO_FilterConfigTypeDef; - -/** - * @} - */ - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __ACCELERO_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/Common/audio.h --- a/Drivers/BSP/Components/Common/audio.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,122 +0,0 @@ -/** - ****************************************************************************** - * @file audio.h - * @author MCD Application Team - * @version V4.0.1 - * @date 21-July-2015 - * @brief This header file contains the common defines and functions prototypes - * for the Audio driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __AUDIO_H -#define __AUDIO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include <stdint.h> - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup AUDIO - * @{ - */ - -/** @defgroup AUDIO_Exported_Constants - * @{ - */ - -/* Codec audio Standards */ -#define CODEC_STANDARD 0x04 -#define I2S_STANDARD I2S_STANDARD_PHILIPS - -/** - * @} - */ - -/** @defgroup AUDIO_Exported_Types - * @{ - */ - -/** @defgroup AUDIO_Driver_structure Audio Driver structure - * @{ - */ -typedef struct -{ - uint32_t (*Init)(uint16_t, uint16_t, uint8_t, uint32_t); - void (*DeInit)(void); - uint32_t (*ReadID)(uint16_t); - uint32_t (*Play)(uint16_t, uint16_t*, uint16_t); - uint32_t (*Pause)(uint16_t); - uint32_t (*Resume)(uint16_t); - uint32_t (*Stop)(uint16_t, uint32_t); - uint32_t (*SetFrequency)(uint16_t, uint32_t); - uint32_t (*SetVolume)(uint16_t, uint8_t); - uint32_t (*SetMute)(uint16_t, uint32_t); - uint32_t (*SetOutputMode)(uint16_t, uint8_t); - uint32_t (*Reset)(uint16_t); -}AUDIO_DrvTypeDef; -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __AUDIO_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/Common/camera.h --- a/Drivers/BSP/Components/Common/camera.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,141 +0,0 @@ -/** - ****************************************************************************** - * @file camera.h - * @author MCD Application Team - * @version V4.0.1 - * @date 21-July-2015 - * @brief This header file contains the common defines and functions prototypes - * for the camera driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __CAMERA_H -#define __CAMERA_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include <stdint.h> - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup CAMERA - * @{ - */ - - -/** @defgroup CAMERA_Exported_Types - * @{ - */ - -/** @defgroup CAMERA_Driver_structure Camera Driver structure - * @{ - */ -typedef struct -{ - void (*Init)(uint16_t, uint32_t); - uint16_t (*ReadID)(uint16_t); - void (*Config)(uint16_t, uint32_t, uint32_t, uint32_t); -}CAMERA_DrvTypeDef; -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup CAMERA_Exported_Constants - * @{ - */ -#define CAMERA_R160x120 0x00 /* QQVGA Resolution */ -#define CAMERA_R320x240 0x01 /* QVGA Resolution */ -#define CAMERA_R480x272 0x02 /* 480x272 Resolution */ -#define CAMERA_R640x480 0x03 /* VGA Resolution */ - -#define CAMERA_CONTRAST_BRIGHTNESS 0x00 /* Camera contrast brightness features */ -#define CAMERA_BLACK_WHITE 0x01 /* Camera black white feature */ -#define CAMERA_COLOR_EFFECT 0x03 /* Camera color effect feature */ - -#define CAMERA_BRIGHTNESS_LEVEL0 0x00 /* Brightness level -2 */ -#define CAMERA_BRIGHTNESS_LEVEL1 0x01 /* Brightness level -1 */ -#define CAMERA_BRIGHTNESS_LEVEL2 0x02 /* Brightness level 0 */ -#define CAMERA_BRIGHTNESS_LEVEL3 0x03 /* Brightness level +1 */ -#define CAMERA_BRIGHTNESS_LEVEL4 0x04 /* Brightness level +2 */ - -#define CAMERA_CONTRAST_LEVEL0 0x05 /* Contrast level -2 */ -#define CAMERA_CONTRAST_LEVEL1 0x06 /* Contrast level -1 */ -#define CAMERA_CONTRAST_LEVEL2 0x07 /* Contrast level 0 */ -#define CAMERA_CONTRAST_LEVEL3 0x08 /* Contrast level +1 */ -#define CAMERA_CONTRAST_LEVEL4 0x09 /* Contrast level +2 */ - -#define CAMERA_BLACK_WHITE_BW 0x00 /* Black and white effect */ -#define CAMERA_BLACK_WHITE_NEGATIVE 0x01 /* Negative effect */ -#define CAMERA_BLACK_WHITE_BW_NEGATIVE 0x02 /* BW and Negative effect */ -#define CAMERA_BLACK_WHITE_NORMAL 0x03 /* Normal effect */ - -#define CAMERA_COLOR_EFFECT_NONE 0x00 /* No effects */ -#define CAMERA_COLOR_EFFECT_BLUE 0x01 /* Blue effect */ -#define CAMERA_COLOR_EFFECT_GREEN 0x02 /* Green effect */ -#define CAMERA_COLOR_EFFECT_RED 0x03 /* Red effect */ -#define CAMERA_COLOR_EFFECT_ANTIQUE 0x04 /* Antique effect */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __CAMERA_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/Common/epd.h --- a/Drivers/BSP/Components/Common/epd.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,115 +0,0 @@ -/** - ****************************************************************************** - * @file epd.h - * @author MCD Application Team - * @version V4.0.1 - * @date 21-July-2015 - * @brief This file contains all the functions prototypes for the - * EPD (E Paper Display) driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __EPD_H -#define __EPD_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include <stdint.h> - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup Common - * @{ - */ - -/** @addtogroup EPD - * @{ - */ - -/** @defgroup EPD_Exported_Types - * @{ - */ - -/** @defgroup EPD_Driver_structure E Paper Display Driver structure - * @{ - */ -typedef struct -{ - void (*Init)(void); - void (*WritePixel)(uint8_t); - - /* Optimized operation */ - void (*SetDisplayWindow)(uint16_t, uint16_t, uint16_t, uint16_t); - void (*RefreshDisplay)(void); - void (*CloseChargePump)(void); - - uint16_t (*GetEpdPixelWidth)(void); - uint16_t (*GetEpdPixelHeight)(void); - void (*DrawImage)(uint16_t, uint16_t, uint16_t, uint16_t, uint8_t*); -} -EPD_DrvTypeDef; -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - - -#ifdef __cplusplus -} -#endif - -#endif /* EPD_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/Common/gyro.h --- a/Drivers/BSP/Components/Common/gyro.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,145 +0,0 @@ -/** - ****************************************************************************** - * @file gyro.h - * @author MCD Application Team - * @version V4.0.1 - * @date 21-July-2015 - * @brief This header file contains the functions prototypes for the gyroscope driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __GYRO_H -#define __GYRO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include <stdint.h> - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup GYRO - * @{ - */ - -/** @defgroup GYRO_Exported_Types - * @{ - */ - -/** @defgroup GYRO_Driver_structure Gyroscope Driver structure - * @{ - */ -typedef struct -{ - void (*Init)(uint16_t); - void (*DeInit)(void); - uint8_t (*ReadID)(void); - void (*Reset)(void); - void (*LowPower)(uint16_t); - void (*ConfigIT)(uint16_t); - void (*EnableIT)(uint8_t); - void (*DisableIT)(uint8_t); - uint8_t (*ITStatus)(uint16_t, uint16_t); - void (*ClearIT)(uint16_t, uint16_t); - void (*FilterConfig)(uint8_t); - void (*FilterCmd)(uint8_t); - void (*GetXYZ)(float *); -}GYRO_DrvTypeDef; -/** - * @} - */ - -/** @defgroup GYRO_Config_structure Gyroscope Configuration structure - * @{ - */ - -typedef struct -{ - uint8_t Power_Mode; /* Power-down/Sleep/Normal Mode */ - uint8_t Output_DataRate; /* OUT data rate */ - uint8_t Axes_Enable; /* Axes enable */ - uint8_t Band_Width; /* Bandwidth selection */ - uint8_t BlockData_Update; /* Block Data Update */ - uint8_t Endianness; /* Endian Data selection */ - uint8_t Full_Scale; /* Full Scale selection */ -}GYRO_InitTypeDef; - -/* GYRO High Pass Filter struct */ -typedef struct -{ - uint8_t HighPassFilter_Mode_Selection; /* Internal filter mode */ - uint8_t HighPassFilter_CutOff_Frequency; /* High pass filter cut-off frequency */ -}GYRO_FilterConfigTypeDef; - -/*GYRO Interrupt struct */ -typedef struct -{ - uint8_t Latch_Request; /* Latch interrupt request into CLICK_SRC register */ - uint8_t Interrupt_Axes; /* X, Y, Z Axes Interrupts */ - uint8_t Interrupt_ActiveEdge; /* Interrupt Active edge */ -}GYRO_InterruptConfigTypeDef; - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __GYRO_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/Common/idd.h --- a/Drivers/BSP/Components/Common/idd.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,168 +0,0 @@ -/** - ****************************************************************************** - * @file idd.h - * @author MCD Application Team - * @version V4.0.1 - * @date 21-July-2015 - * @brief This file contains all the functions prototypes for the IDD driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __IDD_H -#define __IDD_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include <stdint.h> - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup IDD - * @{ - */ - -/** @defgroup IDD_Exported_Types IDD Exported Types - * @{ - */ - -/** @defgroup IDD_Config_structure IDD Configuration structure - * @{ - */ -typedef struct -{ - uint16_t AmpliGain; /*!< Specifies ampli gain value - */ - uint16_t VddMin; /*!< Specifies minimum MCU VDD can reach to protect MCU from reset - */ - uint16_t Shunt0Value; /*!< Specifies value of Shunt 0 if existing - */ - uint16_t Shunt1Value; /*!< Specifies value of Shunt 1 if existing - */ - uint16_t Shunt2Value; /*!< Specifies value of Shunt 2 if existing - */ - uint16_t Shunt3Value; /*!< Specifies value of Shunt 3 if existing - */ - uint16_t Shunt4Value; /*!< Specifies value of Shunt 4 if existing - */ - uint16_t Shunt0StabDelay; /*!< Specifies delay of Shunt 0 stabilization if existing - */ - uint16_t Shunt1StabDelay; /*!< Specifies delay of Shunt 1 stabilization if existing - */ - uint16_t Shunt2StabDelay; /*!< Specifies delay of Shunt 2 stabilization if existing - */ - uint16_t Shunt3StabDelay; /*!< Specifies delay of Shunt 3 stabilization if existing - */ - uint16_t Shunt4StabDelay; /*!< Specifies delay of Shunt 4 stabilization if existing - */ - uint8_t ShuntNbOnBoard; /*!< Specifies number of shunts that are present on board - This parameter can be a value of @ref IDD_shunt_number */ - uint8_t ShuntNbUsed; /*!< Specifies number of shunts used for measurement - This parameter can be a value of @ref IDD_shunt_number */ - uint8_t VrefMeasurement; /*!< Specifies if Vref is automatically measured before each Idd measurement - This parameter can be a value of @ref IDD_Vref_Measurement */ - uint8_t Calibration; /*!< Specifies if calibration is done before each Idd measurement - */ - uint8_t PreDelayUnit; /*!< Specifies Pre delay unit - This parameter can be a value of @ref IDD_PreDelay */ - uint8_t PreDelayValue; /*!< Specifies Pre delay value in selected unit - */ - uint8_t MeasureNb; /*!< Specifies number of Measure to be performed - This parameter can be a value between 1 and 256 */ - uint8_t DeltaDelayUnit; /*!< Specifies Delta delay unit - This parameter can be a value of @ref IDD_DeltaDelay */ - uint8_t DeltaDelayValue; /*!< Specifies Delta delay between 2 measures - value can be between 1 and 128 */ -}IDD_ConfigTypeDef; -/** - * @} - */ - -/** @defgroup IDD_Driver_structure IDD Driver structure - * @{ - */ -typedef struct -{ - void (*Init)(uint16_t); - void (*DeInit)(uint16_t); - uint16_t (*ReadID)(uint16_t); - void (*Reset)(uint16_t); - void (*LowPower)(uint16_t); - void (*WakeUp)(uint16_t); - void (*Start)(uint16_t); - void (*Config)(uint16_t,IDD_ConfigTypeDef); - void (*GetValue)(uint16_t, uint32_t *); - void (*EnableIT)(uint16_t); - void (*ClearIT)(uint16_t); - uint8_t (*GetITStatus)(uint16_t); - void (*DisableIT)(uint16_t); - void (*ErrorEnableIT)(uint16_t); - void (*ErrorClearIT)(uint16_t); - uint8_t (*ErrorGetITStatus)(uint16_t); - void (*ErrorDisableIT)(uint16_t); - uint8_t (*ErrorGetSrc)(uint16_t); - uint8_t (*ErrorGetCode)(uint16_t); -}IDD_DrvTypeDef; -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __IDD_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/Common/io.h --- a/Drivers/BSP/Components/Common/io.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,150 +0,0 @@ -/** - ****************************************************************************** - * @file io.h - * @author MCD Application Team - * @version V4.0.1 - * @date 21-July-2015 - * @brief This file contains all the functions prototypes for the IO driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __IO_H -#define __IO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include <stdint.h> - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup IO - * @{ - */ - -/** @defgroup IO_Exported_Types - * @{ - */ - -/** - * @brief IO Bit SET and Bit RESET enumeration - */ -typedef enum -{ - IO_PIN_RESET = 0, - IO_PIN_SET -}IO_PinState; - -typedef enum -{ - IO_MODE_INPUT = 0, /* input floating */ - IO_MODE_OUTPUT, /* output Push Pull */ - IO_MODE_IT_RISING_EDGE, /* float input - irq detect on rising edge */ - IO_MODE_IT_FALLING_EDGE, /* float input - irq detect on falling edge */ - IO_MODE_IT_LOW_LEVEL, /* float input - irq detect on low level */ - IO_MODE_IT_HIGH_LEVEL, /* float input - irq detect on high level */ - /* following modes only available on MFX*/ - IO_MODE_ANALOG, /* analog mode */ - IO_MODE_OFF, /* when pin isn't used*/ - IO_MODE_INPUT_PU, /* input with internal pull up resistor */ - IO_MODE_INPUT_PD, /* input with internal pull down resistor */ - IO_MODE_OUTPUT_OD, /* Open Drain output without internal resistor */ - IO_MODE_OUTPUT_OD_PU, /* Open Drain output with internal pullup resistor */ - IO_MODE_OUTPUT_OD_PD, /* Open Drain output with internal pulldown resistor */ - IO_MODE_OUTPUT_PP, /* PushPull output without internal resistor */ - IO_MODE_OUTPUT_PP_PU, /* PushPull output with internal pullup resistor */ - IO_MODE_OUTPUT_PP_PD, /* PushPull output with internal pulldown resistor */ - IO_MODE_IT_RISING_EDGE_PU, /* push up resistor input - irq on rising edge */ - IO_MODE_IT_RISING_EDGE_PD, /* push dw resistor input - irq on rising edge */ - IO_MODE_IT_FALLING_EDGE_PU, /* push up resistor input - irq on falling edge */ - IO_MODE_IT_FALLING_EDGE_PD, /* push dw resistor input - irq on falling edge */ - IO_MODE_IT_LOW_LEVEL_PU, /* push up resistor input - irq detect on low level */ - IO_MODE_IT_LOW_LEVEL_PD, /* push dw resistor input - irq detect on low level */ - IO_MODE_IT_HIGH_LEVEL_PU, /* push up resistor input - irq detect on high level */ - IO_MODE_IT_HIGH_LEVEL_PD, /* push dw resistor input - irq detect on high level */ - -}IO_ModeTypedef; - -/** @defgroup IO_Driver_structure IO Driver structure - * @{ - */ -typedef struct -{ - void (*Init)(uint16_t); - uint16_t (*ReadID)(uint16_t); - void (*Reset)(uint16_t); - - void (*Start)(uint16_t, uint32_t); - uint8_t (*Config)(uint16_t, uint32_t, IO_ModeTypedef); - void (*WritePin)(uint16_t, uint32_t, uint8_t); - uint32_t (*ReadPin)(uint16_t, uint32_t); - - void (*EnableIT)(uint16_t); - void (*DisableIT)(uint16_t); - uint32_t (*ITStatus)(uint16_t, uint32_t); - void (*ClearIT)(uint16_t, uint32_t); - -}IO_DrvTypeDef; -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __IO_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/Common/lcd.h --- a/Drivers/BSP/Components/Common/lcd.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,114 +0,0 @@ -/** - ****************************************************************************** - * @file lcd.h - * @author MCD Application Team - * @version V4.0.1 - * @date 21-July-2015 - * @brief This file contains all the functions prototypes for the LCD driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __LCD_H -#define __LCD_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include <stdint.h> - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup LCD - * @{ - */ - -/** @defgroup LCD_Exported_Types - * @{ - */ - -/** @defgroup LCD_Driver_structure LCD Driver structure - * @{ - */ -typedef struct -{ - void (*Init)(void); - uint16_t (*ReadID)(void); - void (*DisplayOn)(void); - void (*DisplayOff)(void); - void (*SetCursor)(uint16_t, uint16_t); - void (*WritePixel)(uint16_t, uint16_t, uint16_t); - uint16_t (*ReadPixel)(uint16_t, uint16_t); - - /* Optimized operation */ - void (*SetDisplayWindow)(uint16_t, uint16_t, uint16_t, uint16_t); - void (*DrawHLine)(uint16_t, uint16_t, uint16_t, uint16_t); - void (*DrawVLine)(uint16_t, uint16_t, uint16_t, uint16_t); - - uint16_t (*GetLcdPixelWidth)(void); - uint16_t (*GetLcdPixelHeight)(void); - void (*DrawBitmap)(uint16_t, uint16_t, uint8_t*); - void (*DrawRGBImage)(uint16_t, uint16_t, uint16_t, uint16_t, uint8_t*); -}LCD_DrvTypeDef; -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __LCD_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/Common/magneto.h --- a/Drivers/BSP/Components/Common/magneto.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,125 +0,0 @@ -/** - ****************************************************************************** - * @file magneto.h - * @author MCD Application Team - * @version V4.0.1 - * @date 21-July-2015 - * @brief This header file contains the functions prototypes for the MAGNETO driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __MAGNETO_H -#define __MAGNETO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include <stdint.h> - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup MAGNETO - * @{ - */ - -/** @defgroup MAGNETO_Exported_Types - * @{ - */ - -/** @defgroup MAGNETO_Config_structure Magnetometer Configuration structure - * @{ - */ -typedef struct -{ - uint8_t Register1; - uint8_t Register2; - uint8_t Register3; - uint8_t Register4; - uint8_t Register5; -}MAGNETO_InitTypeDef; -/** - * @} - */ - -/** @defgroup MAGNETO_Driver_structure Magnetometer Driver structure - * @{ - */ -typedef struct -{ - void (*Init)(MAGNETO_InitTypeDef); - void (*DeInit)(void); - uint8_t (*ReadID)(void); - void (*Reset)(void); - void (*LowPower)(void); - void (*ConfigIT)(void); - void (*EnableIT)(uint8_t); - void (*DisableIT)(uint8_t); - uint8_t (*ITStatus)(uint16_t); - void (*ClearIT)(void); - void (*FilterConfig)(uint8_t); - void (*FilterCmd)(uint8_t); - void (*GetXYZ)(int16_t *); -}MAGNETO_DrvTypeDef; -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __MAGNETO_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/Common/ts.h --- a/Drivers/BSP/Components/Common/ts.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,107 +0,0 @@ -/** - ****************************************************************************** - * @file ts.h - * @author MCD Application Team - * @version V4.0.1 - * @date 21-July-2015 - * @brief This file contains all the functions prototypes for the Touch Screen driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __TS_H -#define __TS_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include <stdint.h> - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup TS - * @{ - */ - -/** @defgroup TS_Exported_Types - * @{ - */ - -/** @defgroup TS_Driver_structure Touch Sensor Driver structure - * @{ - */ -typedef struct -{ - void (*Init)(uint16_t); - uint16_t (*ReadID)(uint16_t); - void (*Reset)(uint16_t); - void (*Start)(uint16_t); - uint8_t (*DetectTouch)(uint16_t); - void (*GetXY)(uint16_t, uint16_t*, uint16_t*); - void (*EnableIT)(uint16_t); - void (*ClearIT)(uint16_t); - uint8_t (*GetITStatus)(uint16_t); - void (*DisableIT)(uint16_t); -}TS_DrvTypeDef; -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __TS_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/Common/tsensor.h --- a/Drivers/BSP/Components/Common/tsensor.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,118 +0,0 @@ -/** - ****************************************************************************** - * @file tsensor.h - * @author MCD Application Team - * @version V4.0.1 - * @date 21-July-2015 - * @brief This header file contains the functions prototypes for the - * Temperature Sensor driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __TSENSOR_H -#define __TSENSOR_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include <stdint.h> - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup TSENSOR - * @{ - */ - -/** @defgroup TSENSOR_Exported_Types - * @{ - */ - -/** @defgroup TSENSOR_Config_structure Temperature Sensor Configuration structure - * @{ - */ -typedef struct -{ - uint8_t AlertMode; /* Alert Mode Temperature out of range*/ - uint8_t ConversionMode; /* Continuous/One Shot Mode */ - uint8_t ConversionResolution; /* Temperature Resolution */ - uint8_t ConversionRate; /* Number of measure per second */ - uint8_t TemperatureLimitHigh; /* High Temperature Limit Range */ - uint8_t TemperatureLimitLow; /* Low Temperature Limit Range */ -}TSENSOR_InitTypeDef; -/** - * @} - */ - -/** @defgroup TSENSOR_Driver_structure Temperature Sensor Driver structure - * @{ - */ -typedef struct -{ - void (*Init)(uint16_t, TSENSOR_InitTypeDef *); - uint8_t (*IsReady)(uint16_t, uint32_t); - uint8_t (*ReadStatus)(uint16_t); - uint16_t (*ReadTemp)(uint16_t); -}TSENSOR_DrvTypeDef; -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __TSENSOR_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/ft5336/ft5336.c --- a/Drivers/BSP/Components/ft5336/ft5336.c Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,623 +0,0 @@ -/** - ****************************************************************************** - * @file ft5336.c - * @author MCD Application Team - * @brief This file provides a set of functions needed to manage the FT5336 - * touch screen devices. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "ft5336.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Component - * @{ - */ - -/** @defgroup FT5336 - * @{ - */ - -/* Private typedef -----------------------------------------------------------*/ - -/** @defgroup FT5336_Private_Types_Definitions - * @{ - */ - -/* Private define ------------------------------------------------------------*/ - -/** @defgroup FT5336_Private_Defines - * @{ - */ - -/* Private macro -------------------------------------------------------------*/ - -/** @defgroup FT5336_Private_Macros - * @{ - */ - -/* Private variables ---------------------------------------------------------*/ - -/** @defgroup FT5336_Private_Variables - * @{ - */ - -/* Touch screen driver structure initialization */ -TS_DrvTypeDef ft5336_ts_drv = -{ - ft5336_Init, - ft5336_ReadID, - ft5336_Reset, - - ft5336_TS_Start, - ft5336_TS_DetectTouch, - ft5336_TS_GetXY, - - ft5336_TS_EnableIT, - ft5336_TS_ClearIT, - ft5336_TS_ITStatus, - ft5336_TS_DisableIT - -}; - -/* Global ft5336 handle */ -static ft5336_handle_TypeDef ft5336_handle = { FT5336_I2C_NOT_INITIALIZED, 0, 0}; - -/** - * @} - */ - -/** @defgroup ft5336_Private_Function_Prototypes - * @{ - */ - -/* Private functions prototypes-----------------------------------------------*/ - -/** - * @brief Return the status of I2C was initialized or not. - * @param None. - * @retval : I2C initialization status. - */ -static uint8_t ft5336_Get_I2C_InitializedStatus(void); - -/** - * @brief I2C initialize if needed. - * @param None. - * @retval : None. - */ -static void ft5336_I2C_InitializeIfRequired(void); - -/** - * @brief Basic static configuration of TouchScreen - * @param DeviceAddr: FT5336 Device address for communication on I2C Bus. - * @retval Status FT5336_STATUS_OK or FT5336_STATUS_NOT_OK. - */ -static uint32_t ft5336_TS_Configure(uint16_t DeviceAddr); - -/** @defgroup ft5336_Private_Functions - * @{ - */ - -/** @defgroup ft5336_Public_Function_Body - * @{ - */ - -/* Public functions bodies-----------------------------------------------*/ - - -/** - * @brief Initialize the ft5336 communication bus - * from MCU to FT5336 : ie I2C channel initialization (if required). - * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT5336). - * @retval None - */ -void ft5336_Init(uint16_t DeviceAddr) -{ - /* Wait at least 200ms after power up before accessing registers - * Trsi timing (Time of starting to report point after resetting) from FT5336GQQ datasheet */ - TS_IO_Delay(200); - - /* Initialize I2C link if needed */ - ft5336_I2C_InitializeIfRequired(); -} - -/** - * @brief Software Reset the ft5336. - * @note : Not applicable to FT5336. - * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT5336). - * @retval None - */ -void ft5336_Reset(uint16_t DeviceAddr) -{ - /* Do nothing */ - /* No software reset sequence available in FT5336 IC */ -} - -/** - * @brief Read the ft5336 device ID, pre initialize I2C in case of need to be - * able to read the FT5336 device ID, and verify this is a FT5336. - * @param DeviceAddr: I2C FT5336 Slave address. - * @retval The Device ID (two bytes). - */ -uint16_t ft5336_ReadID(uint16_t DeviceAddr) -{ - volatile uint8_t ucReadId = 0; - uint8_t nbReadAttempts = 0; - uint8_t bFoundDevice = 0; /* Device not found by default */ - - /* Initialize I2C link if needed */ - ft5336_I2C_InitializeIfRequired(); - - /* At maximum 4 attempts to read ID : exit at first finding of the searched device ID */ - for(nbReadAttempts = 0; ((nbReadAttempts < 3) && !(bFoundDevice)); nbReadAttempts++) - { - /* Read register FT5336_CHIP_ID_REG as DeviceID detection */ - ucReadId = TS_IO_Read(DeviceAddr, FT5336_CHIP_ID_REG); - - /* Found the searched device ID ? */ - if(ucReadId == FT5336_ID_VALUE) - { - /* Set device as found */ - bFoundDevice = 1; - } - } - - /* Return the device ID value */ - return (ucReadId); -} - -/** - * @brief Configures the touch Screen IC device to start detecting touches - * @param DeviceAddr: Device address on communication Bus (I2C slave address). - * @retval None. - */ -void ft5336_TS_Start(uint16_t DeviceAddr) -{ - /* Minimum static configuration of FT5336 */ - FT5336_ASSERT(ft5336_TS_Configure(DeviceAddr)); - - /* By default set FT5336 IC in Polling mode : no INT generation on FT5336 for new touch available */ - /* Note TS_INT is active low */ - ft5336_TS_DisableIT(DeviceAddr); -} - -/** - * @brief Return if there is touches detected or not. - * Try to detect new touches and forget the old ones (reset internal global - * variables). - * @param DeviceAddr: Device address on communication Bus. - * @retval : Number of active touches detected (can be 0, 1 or 2). - */ -uint8_t ft5336_TS_DetectTouch(uint16_t DeviceAddr) -{ - volatile uint8_t nbTouch = 0; - - /* Read register FT5336_TD_STAT_REG to check number of touches detection */ - nbTouch = TS_IO_Read(DeviceAddr, FT5336_TD_STAT_REG); - nbTouch &= FT5336_TD_STAT_MASK; - - if(nbTouch > FT5336_MAX_DETECTABLE_TOUCH) - { - /* If invalid number of touch detected, set it to zero */ - nbTouch = 0; - } - - /* Update ft5336 driver internal global : current number of active touches */ - ft5336_handle.currActiveTouchNb = nbTouch; - - /* Reset current active touch index on which to work on */ - ft5336_handle.currActiveTouchIdx = 0; - - return(nbTouch); -} - -/** - * @brief Get the touch screen X and Y positions values - * Manage multi touch thanks to touch Index global - * variable 'ft5336_handle.currActiveTouchIdx'. - * @param DeviceAddr: Device address on communication Bus. - * @param X: Pointer to X position value - * @param Y: Pointer to Y position value - * @retval None. - */ -void ft5336_TS_GetXY(uint16_t DeviceAddr, uint16_t *X, uint16_t *Y) -{ - volatile uint8_t ucReadData = 0; - static uint16_t coord; - uint8_t regAddressXLow = 0; - uint8_t regAddressXHigh = 0; - uint8_t regAddressYLow = 0; - uint8_t regAddressYHigh = 0; - - if(ft5336_handle.currActiveTouchIdx < ft5336_handle.currActiveTouchNb) - { - switch(ft5336_handle.currActiveTouchIdx) - { - case 0 : - regAddressXLow = FT5336_P1_XL_REG; - regAddressXHigh = FT5336_P1_XH_REG; - regAddressYLow = FT5336_P1_YL_REG; - regAddressYHigh = FT5336_P1_YH_REG; - break; - - case 1 : - regAddressXLow = FT5336_P2_XL_REG; - regAddressXHigh = FT5336_P2_XH_REG; - regAddressYLow = FT5336_P2_YL_REG; - regAddressYHigh = FT5336_P2_YH_REG; - break; - - case 2 : - regAddressXLow = FT5336_P3_XL_REG; - regAddressXHigh = FT5336_P3_XH_REG; - regAddressYLow = FT5336_P3_YL_REG; - regAddressYHigh = FT5336_P3_YH_REG; - break; - - case 3 : - regAddressXLow = FT5336_P4_XL_REG; - regAddressXHigh = FT5336_P4_XH_REG; - regAddressYLow = FT5336_P4_YL_REG; - regAddressYHigh = FT5336_P4_YH_REG; - break; - - case 4 : - regAddressXLow = FT5336_P5_XL_REG; - regAddressXHigh = FT5336_P5_XH_REG; - regAddressYLow = FT5336_P5_YL_REG; - regAddressYHigh = FT5336_P5_YH_REG; - break; - - case 5 : - regAddressXLow = FT5336_P6_XL_REG; - regAddressXHigh = FT5336_P6_XH_REG; - regAddressYLow = FT5336_P6_YL_REG; - regAddressYHigh = FT5336_P6_YH_REG; - break; - - case 6 : - regAddressXLow = FT5336_P7_XL_REG; - regAddressXHigh = FT5336_P7_XH_REG; - regAddressYLow = FT5336_P7_YL_REG; - regAddressYHigh = FT5336_P7_YH_REG; - break; - - case 7 : - regAddressXLow = FT5336_P8_XL_REG; - regAddressXHigh = FT5336_P8_XH_REG; - regAddressYLow = FT5336_P8_YL_REG; - regAddressYHigh = FT5336_P8_YH_REG; - break; - - case 8 : - regAddressXLow = FT5336_P9_XL_REG; - regAddressXHigh = FT5336_P9_XH_REG; - regAddressYLow = FT5336_P9_YL_REG; - regAddressYHigh = FT5336_P9_YH_REG; - break; - - case 9 : - regAddressXLow = FT5336_P10_XL_REG; - regAddressXHigh = FT5336_P10_XH_REG; - regAddressYLow = FT5336_P10_YL_REG; - regAddressYHigh = FT5336_P10_YH_REG; - break; - - default : - break; - - } /* end switch(ft5336_handle.currActiveTouchIdx) */ - - /* Read low part of X position */ - ucReadData = TS_IO_Read(DeviceAddr, regAddressXLow); - coord = (ucReadData & FT5336_TOUCH_POS_LSB_MASK) >> FT5336_TOUCH_POS_LSB_SHIFT; - - /* Read high part of X position */ - ucReadData = TS_IO_Read(DeviceAddr, regAddressXHigh); - coord |= ((ucReadData & FT5336_TOUCH_POS_MSB_MASK) >> FT5336_TOUCH_POS_MSB_SHIFT) << 8; - - /* Send back ready X position to caller */ - *X = coord; - - /* Read low part of Y position */ - ucReadData = TS_IO_Read(DeviceAddr, regAddressYLow); - coord = (ucReadData & FT5336_TOUCH_POS_LSB_MASK) >> FT5336_TOUCH_POS_LSB_SHIFT; - - /* Read high part of Y position */ - ucReadData = TS_IO_Read(DeviceAddr, regAddressYHigh); - coord |= ((ucReadData & FT5336_TOUCH_POS_MSB_MASK) >> FT5336_TOUCH_POS_MSB_SHIFT) << 8; - - /* Send back ready Y position to caller */ - *Y = coord; - - ft5336_handle.currActiveTouchIdx++; /* next call will work on next touch */ - - } /* of if(ft5336_handle.currActiveTouchIdx < ft5336_handle.currActiveTouchNb) */ -} - -/** - * @brief Configure the FT5336 device to generate IT on given INT pin - * connected to MCU as EXTI. - * @param DeviceAddr: Device address on communication Bus (Slave I2C address of FT5336). - * @retval None - */ -void ft5336_TS_EnableIT(uint16_t DeviceAddr) -{ - uint8_t regValue = 0; - regValue = (FT5336_G_MODE_INTERRUPT_TRIGGER & (FT5336_G_MODE_INTERRUPT_MASK >> FT5336_G_MODE_INTERRUPT_SHIFT)) << FT5336_G_MODE_INTERRUPT_SHIFT; - - /* Set interrupt trigger mode in FT5336_GMODE_REG */ - TS_IO_Write(DeviceAddr, FT5336_GMODE_REG, regValue); -} - -/** - * @brief Configure the FT5336 device to stop generating IT on the given INT pin - * connected to MCU as EXTI. - * @param DeviceAddr: Device address on communication Bus (Slave I2C address of FT5336). - * @retval None - */ -void ft5336_TS_DisableIT(uint16_t DeviceAddr) -{ - uint8_t regValue = 0; - regValue = (FT5336_G_MODE_INTERRUPT_POLLING & (FT5336_G_MODE_INTERRUPT_MASK >> FT5336_G_MODE_INTERRUPT_SHIFT)) << FT5336_G_MODE_INTERRUPT_SHIFT; - - /* Set interrupt polling mode in FT5336_GMODE_REG */ - TS_IO_Write(DeviceAddr, FT5336_GMODE_REG, regValue); -} - -/** - * @brief Get IT status from FT5336 interrupt status registers - * Should be called Following an EXTI coming to the MCU to know the detailed - * reason of the interrupt. - * @note : This feature is not applicable to FT5336. - * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT5336). - * @retval TS interrupts status : always return 0 here - */ -uint8_t ft5336_TS_ITStatus(uint16_t DeviceAddr) -{ - /* Always return 0 as feature not applicable to FT5336 */ - return 0; -} - -/** - * @brief Clear IT status in FT5336 interrupt status clear registers - * Should be called Following an EXTI coming to the MCU. - * @note : This feature is not applicable to FT5336. - * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT5336). - * @retval None - */ -void ft5336_TS_ClearIT(uint16_t DeviceAddr) -{ - /* Nothing to be done here for FT5336 */ -} - -/**** NEW FEATURES enabled when Multi-touch support is enabled ****/ - -#if (TS_MULTI_TOUCH_SUPPORTED == 1) - -/** - * @brief Get the last touch gesture identification (zoom, move up/down...). - * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT5336). - * @param pGestureId : Pointer to get last touch gesture Identification. - * @retval None. - */ -void ft5336_TS_GetGestureID(uint16_t DeviceAddr, uint32_t * pGestureId) -{ - volatile uint8_t ucReadData = 0; - - ucReadData = TS_IO_Read(DeviceAddr, FT5336_GEST_ID_REG); - - * pGestureId = ucReadData; -} - -/** - * @brief Get the touch detailed informations on touch number 'touchIdx' (0..1) - * This touch detailed information contains : - * - weight that was applied to this touch - * - sub-area of the touch in the touch panel - * - event of linked to the touch (press down, lift up, ...) - * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT5336). - * @param touchIdx : Passed index of the touch (0..1) on which we want to get the - * detailed information. - * @param pWeight : Pointer to to get the weight information of 'touchIdx'. - * @param pArea : Pointer to to get the sub-area information of 'touchIdx'. - * @param pEvent : Pointer to to get the event information of 'touchIdx'. - - * @retval None. - */ -void ft5336_TS_GetTouchInfo(uint16_t DeviceAddr, - uint32_t touchIdx, - uint32_t * pWeight, - uint32_t * pArea, - uint32_t * pEvent) -{ - volatile uint8_t ucReadData = 0; - uint8_t regAddressXHigh = 0; - uint8_t regAddressPWeight = 0; - uint8_t regAddressPMisc = 0; - - if(touchIdx < ft5336_handle.currActiveTouchNb) - { - switch(touchIdx) - { - case 0 : - regAddressXHigh = FT5336_P1_XH_REG; - regAddressPWeight = FT5336_P1_WEIGHT_REG; - regAddressPMisc = FT5336_P1_MISC_REG; - break; - - case 1 : - regAddressXHigh = FT5336_P2_XH_REG; - regAddressPWeight = FT5336_P2_WEIGHT_REG; - regAddressPMisc = FT5336_P2_MISC_REG; - break; - - case 2 : - regAddressXHigh = FT5336_P3_XH_REG; - regAddressPWeight = FT5336_P3_WEIGHT_REG; - regAddressPMisc = FT5336_P3_MISC_REG; - break; - - case 3 : - regAddressXHigh = FT5336_P4_XH_REG; - regAddressPWeight = FT5336_P4_WEIGHT_REG; - regAddressPMisc = FT5336_P4_MISC_REG; - break; - - case 4 : - regAddressXHigh = FT5336_P5_XH_REG; - regAddressPWeight = FT5336_P5_WEIGHT_REG; - regAddressPMisc = FT5336_P5_MISC_REG; - break; - - case 5 : - regAddressXHigh = FT5336_P6_XH_REG; - regAddressPWeight = FT5336_P6_WEIGHT_REG; - regAddressPMisc = FT5336_P6_MISC_REG; - break; - - case 6 : - regAddressXHigh = FT5336_P7_XH_REG; - regAddressPWeight = FT5336_P7_WEIGHT_REG; - regAddressPMisc = FT5336_P7_MISC_REG; - break; - - case 7 : - regAddressXHigh = FT5336_P8_XH_REG; - regAddressPWeight = FT5336_P8_WEIGHT_REG; - regAddressPMisc = FT5336_P8_MISC_REG; - break; - - case 8 : - regAddressXHigh = FT5336_P9_XH_REG; - regAddressPWeight = FT5336_P9_WEIGHT_REG; - regAddressPMisc = FT5336_P9_MISC_REG; - break; - - case 9 : - regAddressXHigh = FT5336_P10_XH_REG; - regAddressPWeight = FT5336_P10_WEIGHT_REG; - regAddressPMisc = FT5336_P10_MISC_REG; - break; - - default : - break; - - } /* end switch(touchIdx) */ - - /* Read Event Id of touch index */ - ucReadData = TS_IO_Read(DeviceAddr, regAddressXHigh); - * pEvent = (ucReadData & FT5336_TOUCH_EVT_FLAG_MASK) >> FT5336_TOUCH_EVT_FLAG_SHIFT; - - /* Read weight of touch index */ - ucReadData = TS_IO_Read(DeviceAddr, regAddressPWeight); - * pWeight = (ucReadData & FT5336_TOUCH_WEIGHT_MASK) >> FT5336_TOUCH_WEIGHT_SHIFT; - - /* Read area of touch index */ - ucReadData = TS_IO_Read(DeviceAddr, regAddressPMisc); - * pArea = (ucReadData & FT5336_TOUCH_AREA_MASK) >> FT5336_TOUCH_AREA_SHIFT; - - } /* of if(touchIdx < ft5336_handle.currActiveTouchNb) */ -} - -#endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ - -/** @defgroup ft5336_Static_Function_Body - * @{ - */ - -/* Static functions bodies-----------------------------------------------*/ - - -/** - * @brief Return the status of I2C was initialized or not. - * @param None. - * @retval : I2C initialization status. - */ -static uint8_t ft5336_Get_I2C_InitializedStatus(void) -{ - return(ft5336_handle.i2cInitialized); -} - -/** - * @brief I2C initialize if needed. - * @param None. - * @retval : None. - */ -static void ft5336_I2C_InitializeIfRequired(void) -{ - if(ft5336_Get_I2C_InitializedStatus() == FT5336_I2C_NOT_INITIALIZED) - { - /* Initialize TS IO BUS layer (I2C) */ - TS_IO_Init(); - - /* Set state to initialized */ - ft5336_handle.i2cInitialized = FT5336_I2C_INITIALIZED; - } -} - -/** - * @brief Basic static configuration of TouchScreen - * @param DeviceAddr: FT5336 Device address for communication on I2C Bus. - * @retval Status FT5336_STATUS_OK or FT5336_STATUS_NOT_OK. - */ -static uint32_t ft5336_TS_Configure(uint16_t DeviceAddr) -{ - uint32_t status = FT5336_STATUS_OK; - - /* Nothing special to be done for FT5336 */ - - return(status); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/ft5336/ft5336.h --- a/Drivers/BSP/Components/ft5336/ft5336.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,538 +0,0 @@ -/** - ****************************************************************************** - * @file ft5336.h - * @author MCD Application Team - * @brief This file contains all the functions prototypes for the - * ft5336.c Touch screen driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __FT5336_H -#define __FT5336_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* Set Multi-touch as supported */ -#if !defined(TS_MONO_TOUCH_SUPPORTED) -#define TS_MULTI_TOUCH_SUPPORTED 1 -#endif /* TS_MONO_TOUCH_SUPPORTED */ - -/* Includes ------------------------------------------------------------------*/ -#include "../Common/ts.h" - -/* Macros --------------------------------------------------------------------*/ - -#if defined(FT5336_ENABLE_ASSERT) -/* Assert activated */ -#define FT5336_ASSERT(__condition__) do { if(__condition__) \ - { \ - while(1); \ - } \ - }while(0) -#else -/* Assert not activated : macro has no effect */ -#define FT5336_ASSERT(__condition__) do { if(__condition__) \ - { \ - ; \ - } \ - }while(0) -#endif /* FT5336_ENABLE_ASSERT == 1 */ - -/** @typedef ft5336_handle_TypeDef - * ft5336 Handle definition. - */ -typedef struct -{ - uint8_t i2cInitialized; - - /* field holding the current number of simultaneous active touches */ - uint8_t currActiveTouchNb; - - /* field holding the touch index currently managed */ - uint8_t currActiveTouchIdx; - -} ft5336_handle_TypeDef; - - /** @addtogroup BSP - * @{ - */ - - /** @addtogroup Component - * @{ - */ - - /** @defgroup FT5336 - * @{ - */ - - /* Exported types ------------------------------------------------------------*/ - - /** @defgroup FT5336_Exported_Types - * @{ - */ - - /* Exported constants --------------------------------------------------------*/ - - /** @defgroup FT5336_Exported_Constants - * @{ - */ - - /* I2C Slave address of touchscreen FocalTech FT5336 */ -#define FT5336_I2C_SLAVE_ADDRESS ((uint8_t)0x70) - - /* Maximum border values of the touchscreen pad */ -#define FT5336_MAX_WIDTH ((uint16_t)480) /* Touchscreen pad max width */ -#define FT5336_MAX_HEIGHT ((uint16_t)272) /* Touchscreen pad max height */ - - /* Possible values of driver functions return status */ -#define FT5336_STATUS_OK ((uint8_t)0x00) -#define FT5336_STATUS_NOT_OK ((uint8_t)0x01) - - /* Possible values of global variable 'TS_I2C_Initialized' */ -#define FT5336_I2C_NOT_INITIALIZED ((uint8_t)0x00) -#define FT5336_I2C_INITIALIZED ((uint8_t)0x01) - - /* Max detectable simultaneous touches */ -#define FT5336_MAX_DETECTABLE_TOUCH ((uint8_t)0x05) - - /** - * @brief : Definitions for FT5336 I2C register addresses on 8 bit - **/ - - /* Current mode register of the FT5336 (R/W) */ -#define FT5336_DEV_MODE_REG ((uint8_t)0x00) - - /* Possible values of FT5336_DEV_MODE_REG */ -#define FT5336_DEV_MODE_WORKING ((uint8_t)0x00) -#define FT5336_DEV_MODE_FACTORY ((uint8_t)0x04) - -#define FT5336_DEV_MODE_MASK ((uint8_t)0x07) -#define FT5336_DEV_MODE_SHIFT ((uint8_t)0x04) - - /* Gesture ID register */ -#define FT5336_GEST_ID_REG ((uint8_t)0x01) - - /* Possible values of FT5336_GEST_ID_REG */ -#define FT5336_GEST_ID_NO_GESTURE ((uint8_t)0x00) -#define FT5336_GEST_ID_MOVE_UP ((uint8_t)0x10) -#define FT5336_GEST_ID_MOVE_RIGHT ((uint8_t)0x14) -#define FT5336_GEST_ID_MOVE_DOWN ((uint8_t)0x18) -#define FT5336_GEST_ID_MOVE_LEFT ((uint8_t)0x1C) -#define FT5336_GEST_ID_SINGLE_CLICK ((uint8_t)0x20) -#define FT5336_GEST_ID_DOUBLE_CLICK ((uint8_t)0x22) -#define FT5336_GEST_ID_ROTATE_CLOCKWISE ((uint8_t)0x28) -#define FT5336_GEST_ID_ROTATE_C_CLOCKWISE ((uint8_t)0x29) -#define FT5336_GEST_ID_ZOOM_IN ((uint8_t)0x40) -#define FT5336_GEST_ID_ZOOM_OUT ((uint8_t)0x49) - - /* Touch Data Status register : gives number of active touch points (0..5) */ -#define FT5336_TD_STAT_REG ((uint8_t)0x02) - - /* Values related to FT5336_TD_STAT_REG */ -#define FT5336_TD_STAT_MASK ((uint8_t)0x0F) -#define FT5336_TD_STAT_SHIFT ((uint8_t)0x00) - - /* Values Pn_XH and Pn_YH related */ -#define FT5336_TOUCH_EVT_FLAG_PRESS_DOWN ((uint8_t)0x00) -#define FT5336_TOUCH_EVT_FLAG_LIFT_UP ((uint8_t)0x01) -#define FT5336_TOUCH_EVT_FLAG_CONTACT ((uint8_t)0x02) -#define FT5336_TOUCH_EVT_FLAG_NO_EVENT ((uint8_t)0x03) - -#define FT5336_TOUCH_EVT_FLAG_SHIFT ((uint8_t)0x06) -#define FT5336_TOUCH_EVT_FLAG_MASK ((uint8_t)(3 << FT5336_TOUCH_EVT_FLAG_SHIFT)) - -#define FT5336_TOUCH_POS_MSB_MASK ((uint8_t)0x0F) -#define FT5336_TOUCH_POS_MSB_SHIFT ((uint8_t)0x00) - - /* Values Pn_XL and Pn_YL related */ -#define FT5336_TOUCH_POS_LSB_MASK ((uint8_t)0xFF) -#define FT5336_TOUCH_POS_LSB_SHIFT ((uint8_t)0x00) - -#define FT5336_P1_XH_REG ((uint8_t)0x03) -#define FT5336_P1_XL_REG ((uint8_t)0x04) -#define FT5336_P1_YH_REG ((uint8_t)0x05) -#define FT5336_P1_YL_REG ((uint8_t)0x06) - -/* Touch Pressure register value (R) */ -#define FT5336_P1_WEIGHT_REG ((uint8_t)0x07) - -/* Values Pn_WEIGHT related */ -#define FT5336_TOUCH_WEIGHT_MASK ((uint8_t)0xFF) -#define FT5336_TOUCH_WEIGHT_SHIFT ((uint8_t)0x00) - -/* Touch area register */ -#define FT5336_P1_MISC_REG ((uint8_t)0x08) - -/* Values related to FT5336_Pn_MISC_REG */ -#define FT5336_TOUCH_AREA_MASK ((uint8_t)(0x04 << 4)) -#define FT5336_TOUCH_AREA_SHIFT ((uint8_t)0x04) - -#define FT5336_P2_XH_REG ((uint8_t)0x09) -#define FT5336_P2_XL_REG ((uint8_t)0x0A) -#define FT5336_P2_YH_REG ((uint8_t)0x0B) -#define FT5336_P2_YL_REG ((uint8_t)0x0C) -#define FT5336_P2_WEIGHT_REG ((uint8_t)0x0D) -#define FT5336_P2_MISC_REG ((uint8_t)0x0E) - -#define FT5336_P3_XH_REG ((uint8_t)0x0F) -#define FT5336_P3_XL_REG ((uint8_t)0x10) -#define FT5336_P3_YH_REG ((uint8_t)0x11) -#define FT5336_P3_YL_REG ((uint8_t)0x12) -#define FT5336_P3_WEIGHT_REG ((uint8_t)0x13) -#define FT5336_P3_MISC_REG ((uint8_t)0x14) - -#define FT5336_P4_XH_REG ((uint8_t)0x15) -#define FT5336_P4_XL_REG ((uint8_t)0x16) -#define FT5336_P4_YH_REG ((uint8_t)0x17) -#define FT5336_P4_YL_REG ((uint8_t)0x18) -#define FT5336_P4_WEIGHT_REG ((uint8_t)0x19) -#define FT5336_P4_MISC_REG ((uint8_t)0x1A) - -#define FT5336_P5_XH_REG ((uint8_t)0x1B) -#define FT5336_P5_XL_REG ((uint8_t)0x1C) -#define FT5336_P5_YH_REG ((uint8_t)0x1D) -#define FT5336_P5_YL_REG ((uint8_t)0x1E) -#define FT5336_P5_WEIGHT_REG ((uint8_t)0x1F) -#define FT5336_P5_MISC_REG ((uint8_t)0x20) - -#define FT5336_P6_XH_REG ((uint8_t)0x21) -#define FT5336_P6_XL_REG ((uint8_t)0x22) -#define FT5336_P6_YH_REG ((uint8_t)0x23) -#define FT5336_P6_YL_REG ((uint8_t)0x24) -#define FT5336_P6_WEIGHT_REG ((uint8_t)0x25) -#define FT5336_P6_MISC_REG ((uint8_t)0x26) - -#define FT5336_P7_XH_REG ((uint8_t)0x27) -#define FT5336_P7_XL_REG ((uint8_t)0x28) -#define FT5336_P7_YH_REG ((uint8_t)0x29) -#define FT5336_P7_YL_REG ((uint8_t)0x2A) -#define FT5336_P7_WEIGHT_REG ((uint8_t)0x2B) -#define FT5336_P7_MISC_REG ((uint8_t)0x2C) - -#define FT5336_P8_XH_REG ((uint8_t)0x2D) -#define FT5336_P8_XL_REG ((uint8_t)0x2E) -#define FT5336_P8_YH_REG ((uint8_t)0x2F) -#define FT5336_P8_YL_REG ((uint8_t)0x30) -#define FT5336_P8_WEIGHT_REG ((uint8_t)0x31) -#define FT5336_P8_MISC_REG ((uint8_t)0x32) - -#define FT5336_P9_XH_REG ((uint8_t)0x33) -#define FT5336_P9_XL_REG ((uint8_t)0x34) -#define FT5336_P9_YH_REG ((uint8_t)0x35) -#define FT5336_P9_YL_REG ((uint8_t)0x36) -#define FT5336_P9_WEIGHT_REG ((uint8_t)0x37) -#define FT5336_P9_MISC_REG ((uint8_t)0x38) - -#define FT5336_P10_XH_REG ((uint8_t)0x39) -#define FT5336_P10_XL_REG ((uint8_t)0x3A) -#define FT5336_P10_YH_REG ((uint8_t)0x3B) -#define FT5336_P10_YL_REG ((uint8_t)0x3C) -#define FT5336_P10_WEIGHT_REG ((uint8_t)0x3D) -#define FT5336_P10_MISC_REG ((uint8_t)0x3E) - - /* Threshold for touch detection */ -#define FT5336_TH_GROUP_REG ((uint8_t)0x80) - - /* Values FT5336_TH_GROUP_REG : threshold related */ -#define FT5336_THRESHOLD_MASK ((uint8_t)0xFF) -#define FT5336_THRESHOLD_SHIFT ((uint8_t)0x00) - - /* Filter function coefficients */ -#define FT5336_TH_DIFF_REG ((uint8_t)0x85) - - /* Control register */ -#define FT5336_CTRL_REG ((uint8_t)0x86) - - /* Values related to FT5336_CTRL_REG */ - - /* Will keep the Active mode when there is no touching */ -#define FT5336_CTRL_KEEP_ACTIVE_MODE ((uint8_t)0x00) - - /* Switching from Active mode to Monitor mode automatically when there is no touching */ -#define FT5336_CTRL_KEEP_AUTO_SWITCH_MONITOR_MODE ((uint8_t)0x01 - - /* The time period of switching from Active mode to Monitor mode when there is no touching */ -#define FT5336_TIMEENTERMONITOR_REG ((uint8_t)0x87) - - /* Report rate in Active mode */ -#define FT5336_PERIODACTIVE_REG ((uint8_t)0x88) - - /* Report rate in Monitor mode */ -#define FT5336_PERIODMONITOR_REG ((uint8_t)0x89) - - /* The value of the minimum allowed angle while Rotating gesture mode */ -#define FT5336_RADIAN_VALUE_REG ((uint8_t)0x91) - - /* Maximum offset while Moving Left and Moving Right gesture */ -#define FT5336_OFFSET_LEFT_RIGHT_REG ((uint8_t)0x92) - - /* Maximum offset while Moving Up and Moving Down gesture */ -#define FT5336_OFFSET_UP_DOWN_REG ((uint8_t)0x93) - - /* Minimum distance while Moving Left and Moving Right gesture */ -#define FT5336_DISTANCE_LEFT_RIGHT_REG ((uint8_t)0x94) - - /* Minimum distance while Moving Up and Moving Down gesture */ -#define FT5336_DISTANCE_UP_DOWN_REG ((uint8_t)0x95) - - /* Maximum distance while Zoom In and Zoom Out gesture */ -#define FT5336_DISTANCE_ZOOM_REG ((uint8_t)0x96) - - /* High 8-bit of LIB Version info */ -#define FT5336_LIB_VER_H_REG ((uint8_t)0xA1) - - /* Low 8-bit of LIB Version info */ -#define FT5336_LIB_VER_L_REG ((uint8_t)0xA2) - - /* Chip Selecting */ -#define FT5336_CIPHER_REG ((uint8_t)0xA3) - - /* Interrupt mode register (used when in interrupt mode) */ -#define FT5336_GMODE_REG ((uint8_t)0xA4) - -#define FT5336_G_MODE_INTERRUPT_MASK ((uint8_t)0x03) -#define FT5336_G_MODE_INTERRUPT_SHIFT ((uint8_t)0x00) - - /* Possible values of FT5336_GMODE_REG */ -#define FT5336_G_MODE_INTERRUPT_POLLING ((uint8_t)0x00) -#define FT5336_G_MODE_INTERRUPT_TRIGGER ((uint8_t)0x01) - - /* Current power mode the FT5336 system is in (R) */ -#define FT5336_PWR_MODE_REG ((uint8_t)0xA5) - - /* FT5336 firmware version */ -#define FT5336_FIRMID_REG ((uint8_t)0xA6) - - /* FT5336 Chip identification register */ -#define FT5336_CHIP_ID_REG ((uint8_t)0xA8) - - /* Possible values of FT5336_CHIP_ID_REG */ -#define FT5336_ID_VALUE ((uint8_t)0x51) - - /* Release code version */ -#define FT5336_RELEASE_CODE_ID_REG ((uint8_t)0xAF) - - /* Current operating mode the FT5336 system is in (R) */ -#define FT5336_STATE_REG ((uint8_t)0xBC) - - /** - * @} - */ - - /* Exported macro ------------------------------------------------------------*/ - - /** @defgroup ft5336_Exported_Macros - * @{ - */ - - /* Exported functions --------------------------------------------------------*/ - - /** @defgroup ft5336_Exported_Functions - * @{ - */ - - /** - * @brief ft5336 Control functions - */ - - -/** - * @brief Initialize the ft5336 communication bus - * from MCU to FT5336 : ie I2C channel initialization (if required). - * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT5336). - * @retval None - */ -void ft5336_Init(uint16_t DeviceAddr); - -/** - * @brief Software Reset the ft5336. - * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT5336). - * @retval None - */ -void ft5336_Reset(uint16_t DeviceAddr); - -/** - * @brief Read the ft5336 device ID, pre initialize I2C in case of need to be - * able to read the FT5336 device ID, and verify this is a FT5336. - * @param DeviceAddr: I2C FT5336 Slave address. - * @retval The Device ID (two bytes). - */ -uint16_t ft5336_ReadID(uint16_t DeviceAddr); - -/** - * @brief Configures the touch Screen IC device to start detecting touches - * @param DeviceAddr: Device address on communication Bus (I2C slave address). - * @retval None. - */ -void ft5336_TS_Start(uint16_t DeviceAddr); - -/** - * @brief Return if there is touches detected or not. - * Try to detect new touches and forget the old ones (reset internal global - * variables). - * @param DeviceAddr: Device address on communication Bus. - * @retval : Number of active touches detected (can be 0, 1 or 2). - */ -uint8_t ft5336_TS_DetectTouch(uint16_t DeviceAddr); - -/** - * @brief Get the touch screen X and Y positions values - * Manage multi touch thanks to touch Index global - * variable 'ft5336_handle.currActiveTouchIdx'. - * @param DeviceAddr: Device address on communication Bus. - * @param X: Pointer to X position value - * @param Y: Pointer to Y position value - * @retval None. - */ -void ft5336_TS_GetXY(uint16_t DeviceAddr, uint16_t *X, uint16_t *Y); - -/** - * @brief Configure the FT5336 device to generate IT on given INT pin - * connected to MCU as EXTI. - * @param DeviceAddr: Device address on communication Bus (Slave I2C address of FT5336). - * @retval None - */ -void ft5336_TS_EnableIT(uint16_t DeviceAddr); - -/** - * @brief Configure the FT5336 device to stop generating IT on the given INT pin - * connected to MCU as EXTI. - * @param DeviceAddr: Device address on communication Bus (Slave I2C address of FT5336). - * @retval None - */ -void ft5336_TS_DisableIT(uint16_t DeviceAddr); - -/** - * @brief Get IT status from FT5336 interrupt status registers - * Should be called Following an EXTI coming to the MCU to know the detailed - * reason of the interrupt. - * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT5336). - * @retval TS interrupts status - */ -uint8_t ft5336_TS_ITStatus (uint16_t DeviceAddr); - -/** - * @brief Clear IT status in FT5336 interrupt status clear registers - * Should be called Following an EXTI coming to the MCU. - * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT5336). - * @retval TS interrupts status - */ -void ft5336_TS_ClearIT (uint16_t DeviceAddr); - -/**** NEW FEATURES enabled when Multi-touch support is enabled ****/ - -#if (TS_MULTI_TOUCH_SUPPORTED == 1) - -/** - * @brief Get the last touch gesture identification (zoom, move up/down...). - * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT5336). - * @param pGestureId : Pointer to get last touch gesture Identification. - * @retval None. - */ -void ft5336_TS_GetGestureID(uint16_t DeviceAddr, uint32_t * pGestureId); - -/** - * @brief Get the touch detailed informations on touch number 'touchIdx' (0..1) - * This touch detailed information contains : - * - weight that was applied to this touch - * - sub-area of the touch in the touch panel - * - event of linked to the touch (press down, lift up, ...) - * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT5336). - * @param touchIdx : Passed index of the touch (0..1) on which we want to get the - * detailed information. - * @param pWeight : Pointer to to get the weight information of 'touchIdx'. - * @param pArea : Pointer to to get the sub-area information of 'touchIdx'. - * @param pEvent : Pointer to to get the event information of 'touchIdx'. - - * @retval None. - */ -void ft5336_TS_GetTouchInfo(uint16_t DeviceAddr, - uint32_t touchIdx, - uint32_t * pWeight, - uint32_t * pArea, - uint32_t * pEvent); - -#endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ - -/* Imported TS IO functions --------------------------------------------------------*/ - -/** @defgroup ft5336_Imported_Functions - * @{ - */ - -/* TouchScreen (TS) external IO functions */ -extern void TS_IO_Init(void); -extern void TS_IO_Write(uint8_t Addr, uint8_t Reg, uint8_t Value); -extern uint8_t TS_IO_Read(uint8_t Addr, uint8_t Reg); -extern void TS_IO_Delay(uint32_t Delay); - - /** - * @} - */ - - /* Imported global variables --------------------------------------------------------*/ - - /** @defgroup ft5336_Imported_Globals - * @{ - */ - - -/* Touch screen driver structure */ -extern TS_DrvTypeDef ft5336_ts_drv; - - /** - * @} - */ - -#ifdef __cplusplus -} -#endif -#endif /* __FT5336_H */ - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/n25q128a/n25q128a.h --- a/Drivers/BSP/Components/n25q128a/n25q128a.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,217 +0,0 @@ -/** - ****************************************************************************** - * @file n25q128a.h - * @author MCD Application Team - * @brief This file contains all the description of the N25Q128A QSPI memory. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __N25Q128A_H -#define __N25Q128A_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup n25q128a - * @{ - */ - -/** @defgroup N25Q128A_Exported_Types - * @{ - */ - -/** - * @} - */ - -/** @defgroup N25Q128A_Exported_Constants - * @{ - */ - -/** - * @brief N25Q128A Configuration - */ -#define N25Q128A_FLASH_SIZE 0x1000000 /* 128 MBits => 16MBytes */ -#define N25Q128A_SECTOR_SIZE 0x10000 /* 256 sectors of 64KBytes */ -#define N25Q128A_SUBSECTOR_SIZE 0x1000 /* 4096 subsectors of 4kBytes */ -#define N25Q128A_PAGE_SIZE 0x100 /* 65536 pages of 256 bytes */ - -#define N25Q128A_DUMMY_CYCLES_READ 8 -#define N25Q128A_DUMMY_CYCLES_READ_QUAD 10 - -#define N25Q128A_BULK_ERASE_MAX_TIME 250000 -#define N25Q128A_SECTOR_ERASE_MAX_TIME 3000 -#define N25Q128A_SUBSECTOR_ERASE_MAX_TIME 800 - -/** - * @brief N25Q128A Commands - */ -/* Reset Operations */ -#define RESET_ENABLE_CMD 0x66 -#define RESET_MEMORY_CMD 0x99 - -/* Identification Operations */ -#define READ_ID_CMD 0x9E -#define READ_ID_CMD2 0x9F -#define MULTIPLE_IO_READ_ID_CMD 0xAF -#define READ_SERIAL_FLASH_DISCO_PARAM_CMD 0x5A - -/* Read Operations */ -#define READ_CMD 0x03 -#define FAST_READ_CMD 0x0B -#define DUAL_OUT_FAST_READ_CMD 0x3B -#define DUAL_INOUT_FAST_READ_CMD 0xBB -#define QUAD_OUT_FAST_READ_CMD 0x6B -#define QUAD_INOUT_FAST_READ_CMD 0xEB - -/* Write Operations */ -#define WRITE_ENABLE_CMD 0x06 -#define WRITE_DISABLE_CMD 0x04 - -/* Register Operations */ -#define READ_STATUS_REG_CMD 0x05 -#define WRITE_STATUS_REG_CMD 0x01 - -#define READ_LOCK_REG_CMD 0xE8 -#define WRITE_LOCK_REG_CMD 0xE5 - -#define READ_FLAG_STATUS_REG_CMD 0x70 -#define CLEAR_FLAG_STATUS_REG_CMD 0x50 - -#define READ_NONVOL_CFG_REG_CMD 0xB5 -#define WRITE_NONVOL_CFG_REG_CMD 0xB1 - -#define READ_VOL_CFG_REG_CMD 0x85 -#define WRITE_VOL_CFG_REG_CMD 0x81 - -#define READ_ENHANCED_VOL_CFG_REG_CMD 0x65 -#define WRITE_ENHANCED_VOL_CFG_REG_CMD 0x61 - -/* Program Operations */ -#define PAGE_PROG_CMD 0x02 -#define DUAL_IN_FAST_PROG_CMD 0xA2 -#define EXT_DUAL_IN_FAST_PROG_CMD 0xD2 -#define QUAD_IN_FAST_PROG_CMD 0x32 -#define EXT_QUAD_IN_FAST_PROG_CMD 0x12 - -/* Erase Operations */ -#define SUBSECTOR_ERASE_CMD 0x20 -#define SECTOR_ERASE_CMD 0xD8 -#define BULK_ERASE_CMD 0xC7 - -#define PROG_ERASE_RESUME_CMD 0x7A -#define PROG_ERASE_SUSPEND_CMD 0x75 - -/* One-Time Programmable Operations */ -#define READ_OTP_ARRAY_CMD 0x4B -#define PROG_OTP_ARRAY_CMD 0x42 - -/** - * @brief N25Q128A Registers - */ -/* Status Register */ -#define N25Q128A_SR_WIP ((uint8_t)0x01) /*!< Write in progress */ -#define N25Q128A_SR_WREN ((uint8_t)0x02) /*!< Write enable latch */ -#define N25Q128A_SR_BLOCKPR ((uint8_t)0x5C) /*!< Block protected against program and erase operations */ -#define N25Q128A_SR_PRBOTTOM ((uint8_t)0x20) /*!< Protected memory area defined by BLOCKPR starts from top or bottom */ -#define N25Q128A_SR_SRWREN ((uint8_t)0x80) /*!< Status register write enable/disable */ - -/* Nonvolatile Configuration Register */ -#define N25Q128A_NVCR_LOCK ((uint16_t)0x0001) /*!< Lock nonvolatile configuration register */ -#define N25Q128A_NVCR_DUAL ((uint16_t)0x0004) /*!< Dual I/O protocol */ -#define N25Q128A_NVCR_QUAB ((uint16_t)0x0008) /*!< Quad I/O protocol */ -#define N25Q128A_NVCR_RH ((uint16_t)0x0010) /*!< Reset/hold */ -#define N25Q128A_NVCR_ODS ((uint16_t)0x01C0) /*!< Output driver strength */ -#define N25Q128A_NVCR_XIP ((uint16_t)0x0E00) /*!< XIP mode at power-on reset */ -#define N25Q128A_NVCR_NB_DUMMY ((uint16_t)0xF000) /*!< Number of dummy clock cycles */ - -/* Volatile Configuration Register */ -#define N25Q128A_VCR_WRAP ((uint8_t)0x03) /*!< Wrap */ -#define N25Q128A_VCR_XIP ((uint8_t)0x08) /*!< XIP */ -#define N25Q128A_VCR_NB_DUMMY ((uint8_t)0xF0) /*!< Number of dummy clock cycles */ - -/* Enhanced Volatile Configuration Register */ -#define N25Q128A_EVCR_ODS ((uint8_t)0x07) /*!< Output driver strength */ -#define N25Q128A_EVCR_VPPA ((uint8_t)0x08) /*!< Vpp accelerator */ -#define N25Q128A_EVCR_RH ((uint8_t)0x10) /*!< Reset/hold */ -#define N25Q128A_EVCR_DUAL ((uint8_t)0x40) /*!< Dual I/O protocol */ -#define N25Q128A_EVCR_QUAD ((uint8_t)0x80) /*!< Quad I/O protocol */ - -/* Flag Status Register */ -#define N25Q128A_FSR_PRERR ((uint8_t)0x02) /*!< Protection error */ -#define N25Q128A_FSR_PGSUS ((uint8_t)0x04) /*!< Program operation suspended */ -#define N25Q128A_FSR_VPPERR ((uint8_t)0x08) /*!< Invalid voltage during program or erase */ -#define N25Q128A_FSR_PGERR ((uint8_t)0x10) /*!< Program error */ -#define N25Q128A_FSR_ERERR ((uint8_t)0x20) /*!< Erase error */ -#define N25Q128A_FSR_ERSUS ((uint8_t)0x40) /*!< Erase operation suspended */ -#define N25Q128A_FSR_READY ((uint8_t)0x80) /*!< Ready or command in progress */ - -/** - * @} - */ - -/** @defgroup N25Q128A_Exported_Functions - * @{ - */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __N25Q128A_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/ov9655/ov9655.c --- a/Drivers/BSP/Components/ov9655/ov9655.c Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,859 +0,0 @@ -/** - ****************************************************************************** - * @file ov9655.c - * @author MCD Application Team - * @brief This file provides the OV9655 camera driver - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "ov9655.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup OV9655 - * @brief This file provides a set of functions needed to drive the - * OV9655 Camera module. - * @{ - */ - -/** @defgroup OV9655_Private_TypesDefinitions - * @{ - */ - -/** - * @} - */ - -/** @defgroup OV9655_Private_Defines - * @{ - */ - -/** - * @} - */ - -/** @defgroup OV9655_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup OV9655_Private_FunctionPrototypes - * @{ - */ -static uint64_t ov9655_ConvertValue(uint32_t feature, uint32_t value); -/** - * @} - */ - -/** @defgroup OV9655_Private_Variables - * @{ - */ - -CAMERA_DrvTypeDef ov9655_drv = -{ - ov9655_Init, - ov9655_ReadID, - ov9655_Config, -}; - -/* Initialization sequence for VGA resolution (640x480)*/ -const unsigned char OV9655_VGA[][2]= -{ - {0x00, 0x00}, - {0x01, 0x80}, - {0x02, 0x80}, - {0xb5, 0x00}, - {0x35, 0x00}, - {0xa8, 0xc1}, - {0x3a, 0xcc}, - {0x3d, 0x99}, - {0x77, 0x02}, - {0x13, 0xe7}, - {0x26, 0x72}, - {0x27, 0x08}, - {0x28, 0x08}, - {0x2c, 0x08}, - {0xab, 0x04}, - {0x6e, 0x00}, - {0x6d, 0x55}, - {0x00, 0x11}, - {0x10, 0x7b}, - {0xbb, 0xae}, - {0x11, 0x03}, - {0x72, 0x00}, - {0x3e, 0x0c}, - {0x74, 0x3a}, - {0x76, 0x01}, - {0x75, 0x35}, - {0x73, 0x00}, - {0xc7, 0x80}, - {0x62, 0x00}, - {0x63, 0x00}, - {0x64, 0x02}, - {0x65, 0x20}, - {0x66, 0x01}, - {0xc3, 0x4e}, - {0x33, 0x00}, - {0xa4, 0x50}, - {0xaa, 0x92}, - {0xc2, 0x01}, - {0xc1, 0xc8}, - {0x1e, 0x04}, - {0xa9, 0xef}, - {0x0e, 0x61}, - {0x39, 0x57}, - {0x0f, 0x48}, - {0x24, 0x3c}, - {0x25, 0x36}, - {0x12, 0x63}, - {0x03, 0x12}, - {0x32, 0xff}, - {0x17, 0x16}, - {0x18, 0x02}, - {0x19, 0x01}, - {0x1a, 0x3d}, - {0x36, 0xfa}, - {0x69, 0x0a}, - {0x8c, 0x8d}, - {0xc0, 0xaa}, - {0x40, 0xd0}, - {0x43, 0x14}, - {0x44, 0xf0}, - {0x45, 0x46}, - {0x46, 0x62}, - {0x47, 0x2a}, - {0x48, 0x3c}, - {0x59, 0x85}, - {0x5a, 0xa9}, - {0x5b, 0x64}, - {0x5c, 0x84}, - {0x5d, 0x53}, - {0x5e, 0x0e}, - {0x6c, 0x0c}, - {0xc6, 0x85}, - {0xcb, 0xf0}, - {0xcc, 0xd8}, - {0x71, 0x78}, - {0xa5, 0x68}, - {0x6f, 0x9e}, - {0x42, 0xc0}, - {0x3f, 0x82}, - {0x8a, 0x23}, - {0x14, 0x3a}, - {0x3b, 0xcc}, - {0x34, 0x3d}, - {0x41, 0x40}, - {0xc9, 0xe0}, - {0xca, 0xe8}, - {0xcd, 0x93}, - {0x7a, 0x20}, - {0x7b, 0x1c}, - {0x7c, 0x28}, - {0x7d, 0x3c}, - {0x7e, 0x5a}, - {0x7f, 0x68}, - {0x80, 0x76}, - {0x81, 0x80}, - {0x82, 0x88}, - {0x83, 0x8f}, - {0x84, 0x96}, - {0x85, 0xa3}, - {0x86, 0xaf}, - {0x87, 0xc4}, - {0x88, 0xd7}, - {0x89, 0xe8}, - {0x4f, 0x98}, - {0x50, 0x98}, - {0x51, 0x00}, - {0x52, 0x28}, - {0x53, 0x70}, - {0x54, 0x98}, - {0x58, 0x1a}, - {0x6b, 0x5a}, - {0x90, 0x92}, - {0x91, 0x92}, - {0x9f, 0x90}, - {0xa0, 0x90}, - {0x16, 0x24}, - {0x2a, 0x00}, - {0x2b, 0x00}, - {0xac, 0x80}, - {0xad, 0x80}, - {0xae, 0x80}, - {0xaf, 0x80}, - {0xb2, 0xf2}, - {0xb3, 0x20}, - {0xb4, 0x20}, - {0xb6, 0xaf}, - {0x29, 0x15}, - {0x9d, 0x02}, - {0x9e, 0x02}, - {0x9e, 0x02}, - {0x04, 0x03}, - {0x05, 0x2e}, - {0x06, 0x2e}, - {0x07, 0x2e}, - {0x08, 0x2e}, - {0x2f, 0x2e}, - {0x4a, 0xe9}, - {0x4b, 0xdd}, - {0x4c, 0xdd}, - {0x4d, 0xdd}, - {0x4e, 0xdd}, - {0x70, 0x06}, - {0xa6, 0x40}, - {0xbc, 0x02}, - {0xbd, 0x01}, - {0xbe, 0x02}, - {0xbf, 0x01}, -}; - -/* Initialization sequence for QVGA resolution (320x240) */ -const unsigned char OV9655_QVGA[][2]= -{ - {0x00, 0x00}, - {0x01, 0x80}, - {0x02, 0x80}, - {0x03, 0x02}, - {0x04, 0x03}, - {0x09, 0x01}, - {0x0b, 0x57}, - {0x0e, 0x61}, - {0x0f, 0x40}, - {0x11, 0x01}, - {0x12, 0x62}, - {0x13, 0xc7}, - {0x14, 0x3a}, - {0x16, 0x24}, - {0x17, 0x18}, - {0x18, 0x04}, - {0x19, 0x01}, - {0x1a, 0x81}, - {0x1e, 0x00}, - {0x24, 0x3c}, - {0x25, 0x36}, - {0x26, 0x72}, - {0x27, 0x08}, - {0x28, 0x08}, - {0x29, 0x15}, - {0x2a, 0x00}, - {0x2b, 0x00}, - {0x2c, 0x08}, - {0x32, 0x12}, - {0x33, 0x00}, - {0x34, 0x3f}, - {0x35, 0x00}, - {0x36, 0x3a}, - {0x38, 0x72}, - {0x39, 0x57}, - {0x3a, 0xcc}, - {0x3b, 0x04}, - {0x3d, 0x99}, - {0x3e, 0x02}, - {0x3f, 0xc1}, - {0x40, 0xc0}, - {0x41, 0x41}, - {0x42, 0xc0}, - {0x43, 0x0a}, - {0x44, 0xf0}, - {0x45, 0x46}, - {0x46, 0x62}, - {0x47, 0x2a}, - {0x48, 0x3c}, - {0x4a, 0xfc}, - {0x4b, 0xfc}, - {0x4c, 0x7f}, - {0x4d, 0x7f}, - {0x4e, 0x7f}, - {0x4f, 0x98}, - {0x50, 0x98}, - {0x51, 0x00}, - {0x52, 0x28}, - {0x53, 0x70}, - {0x54, 0x98}, - {0x58, 0x1a}, - {0x59, 0x85}, - {0x5a, 0xa9}, - {0x5b, 0x64}, - {0x5c, 0x84}, - {0x5d, 0x53}, - {0x5e, 0x0e}, - {0x5f, 0xf0}, - {0x60, 0xf0}, - {0x61, 0xf0}, - {0x62, 0x00}, - {0x63, 0x00}, - {0x64, 0x02}, - {0x65, 0x20}, - {0x66, 0x00}, - {0x69, 0x0a}, - {0x6b, 0x5a}, - {0x6c, 0x04}, - {0x6d, 0x55}, - {0x6e, 0x00}, - {0x6f, 0x9d}, - {0x70, 0x21}, - {0x71, 0x78}, - {0x72, 0x11}, - {0x73, 0x01}, - {0x74, 0x10}, - {0x75, 0x10}, - {0x76, 0x01}, - {0x77, 0x02}, - {0x7A, 0x12}, - {0x7B, 0x08}, - {0x7C, 0x16}, - {0x7D, 0x30}, - {0x7E, 0x5e}, - {0x7F, 0x72}, - {0x80, 0x82}, - {0x81, 0x8e}, - {0x82, 0x9a}, - {0x83, 0xa4}, - {0x84, 0xac}, - {0x85, 0xb8}, - {0x86, 0xc3}, - {0x87, 0xd6}, - {0x88, 0xe6}, - {0x89, 0xf2}, - {0x8a, 0x24}, - {0x8c, 0x80}, - {0x90, 0x7d}, - {0x91, 0x7b}, - {0x9d, 0x02}, - {0x9e, 0x02}, - {0x9f, 0x7a}, - {0xa0, 0x79}, - {0xa1, 0x40}, - {0xa4, 0x50}, - {0xa5, 0x68}, - {0xa6, 0x4a}, - {0xa8, 0xc1}, - {0xa9, 0xef}, - {0xaa, 0x92}, - {0xab, 0x04}, - {0xac, 0x80}, - {0xad, 0x80}, - {0xae, 0x80}, - {0xaf, 0x80}, - {0xb2, 0xf2}, - {0xb3, 0x20}, - {0xb4, 0x20}, - {0xb5, 0x00}, - {0xb6, 0xaf}, - {0xb6, 0xaf}, - {0xbb, 0xae}, - {0xbc, 0x7f}, - {0xbd, 0x7f}, - {0xbe, 0x7f}, - {0xbf, 0x7f}, - {0xbf, 0x7f}, - {0xc0, 0xaa}, - {0xc1, 0xc0}, - {0xc2, 0x01}, - {0xc3, 0x4e}, - {0xc6, 0x05}, - {0xc7, 0x81}, - {0xc9, 0xe0}, - {0xca, 0xe8}, - {0xcb, 0xf0}, - {0xcc, 0xd8}, - {0xcd, 0x93}, - {0x12, 0x63}, - {0x40, 0x10}, -}; - -/* Initialization sequence for QQVGA resolution (160x120) */ -const char OV9655_QQVGA[][2]= -{ - {0x00, 0x00}, - {0x01, 0x80}, - {0x02, 0x80}, - {0x03, 0x02}, - {0x04, 0x03}, - {0x09, 0x01}, - {0x0b, 0x57}, - {0x0e, 0x61}, - {0x0f, 0x40}, - {0x11, 0x01}, - {0x12, 0x62}, - {0x13, 0xc7}, - {0x14, 0x3a}, - {0x16, 0x24}, - {0x17, 0x18}, - {0x18, 0x04}, - {0x19, 0x01}, - {0x1a, 0x81}, - {0x1e, 0x00}, - {0x24, 0x3c}, - {0x25, 0x36}, - {0x26, 0x72}, - {0x27, 0x08}, - {0x28, 0x08}, - {0x29, 0x15}, - {0x2a, 0x00}, - {0x2b, 0x00}, - {0x2c, 0x08}, - {0x32, 0xa4}, - {0x33, 0x00}, - {0x34, 0x3f}, - {0x35, 0x00}, - {0x36, 0x3a}, - {0x38, 0x72}, - {0x39, 0x57}, - {0x3a, 0xcc}, - {0x3b, 0x04}, - {0x3d, 0x99}, - {0x3e, 0x0e}, - {0x3f, 0xc1}, - {0x40, 0xc0}, - {0x41, 0x41}, - {0x42, 0xc0}, - {0x43, 0x0a}, - {0x44, 0xf0}, - {0x45, 0x46}, - {0x46, 0x62}, - {0x47, 0x2a}, - {0x48, 0x3c}, - {0x4a, 0xfc}, - {0x4b, 0xfc}, - {0x4c, 0x7f}, - {0x4d, 0x7f}, - {0x4e, 0x7f}, - {0x4f, 0x98}, - {0x50, 0x98}, - {0x51, 0x00}, - {0x52, 0x28}, - {0x53, 0x70}, - {0x54, 0x98}, - {0x58, 0x1a}, - {0x59, 0x85}, - {0x5a, 0xa9}, - {0x5b, 0x64}, - {0x5c, 0x84}, - {0x5d, 0x53}, - {0x5e, 0x0e}, - {0x5f, 0xf0}, - {0x60, 0xf0}, - {0x61, 0xf0}, - {0x62, 0x00}, - {0x63, 0x00}, - {0x64, 0x02}, - {0x65, 0x20}, - {0x66, 0x00}, - {0x69, 0x0a}, - {0x6b, 0x5a}, - {0x6c, 0x04}, - {0x6d, 0x55}, - {0x6e, 0x00}, - {0x6f, 0x9d}, - {0x70, 0x21}, - {0x71, 0x78}, - {0x72, 0x22}, - {0x73, 0x02}, - {0x74, 0x10}, - {0x75, 0x10}, - {0x76, 0x01}, - {0x77, 0x02}, - {0x7A, 0x12}, - {0x7B, 0x08}, - {0x7C, 0x16}, - {0x7D, 0x30}, - {0x7E, 0x5e}, - {0x7F, 0x72}, - {0x80, 0x82}, - {0x81, 0x8e}, - {0x82, 0x9a}, - {0x83, 0xa4}, - {0x84, 0xac}, - {0x85, 0xb8}, - {0x86, 0xc3}, - {0x87, 0xd6}, - {0x88, 0xe6}, - {0x89, 0xf2}, - {0x8a, 0x24}, - {0x8c, 0x80}, - {0x90, 0x7d}, - {0x91, 0x7b}, - {0x9d, 0x02}, - {0x9e, 0x02}, - {0x9f, 0x7a}, - {0xa0, 0x79}, - {0xa1, 0x40}, - {0xa4, 0x50}, - {0xa5, 0x68}, - {0xa6, 0x4a}, - {0xa8, 0xc1}, - {0xa9, 0xef}, - {0xaa, 0x92}, - {0xab, 0x04}, - {0xac, 0x80}, - {0xad, 0x80}, - {0xae, 0x80}, - {0xaf, 0x80}, - {0xb2, 0xf2}, - {0xb3, 0x20}, - {0xb4, 0x20}, - {0xb5, 0x00}, - {0xb6, 0xaf}, - {0xb6, 0xaf}, - {0xbb, 0xae}, - {0xbc, 0x7f}, - {0xbd, 0x7f}, - {0xbe, 0x7f}, - {0xbf, 0x7f}, - {0xbf, 0x7f}, - {0xc0, 0xaa}, - {0xc1, 0xc0}, - {0xc2, 0x01}, - {0xc3, 0x4e}, - {0xc6, 0x05}, - {0xc7, 0x82}, - {0xc9, 0xe0}, - {0xca, 0xe8}, - {0xcb, 0xf0}, - {0xcc, 0xd8}, - {0xcd, 0x93}, - {0x12, 0x63}, - {0x40, 0x10}, -}; - -/** - * @} - */ - -/** @defgroup OV9655_Private_Functions - * @{ - */ - -/** - * @brief Initializes the OV9655 CAMERA component. - * @param DeviceAddr: Device address on communication Bus. - * @param resolution: Camera resolution - * @retval None - */ -void ov9655_Init(uint16_t DeviceAddr, uint32_t resolution) -{ - uint32_t index; - - /* Initialize I2C */ - CAMERA_IO_Init(); - - /* Prepare the camera to be configured by resetting all its registers */ - CAMERA_IO_Write(DeviceAddr, OV9655_SENSOR_COM7, 0x80); - CAMERA_Delay(200); - - /* Initialize OV9655 */ - switch (resolution) - { - case CAMERA_R160x120: - { - for(index=0; index<(sizeof(OV9655_QQVGA)/2); index++) - { - CAMERA_IO_Write(DeviceAddr, OV9655_QQVGA[index][0], OV9655_QQVGA[index][1]); - CAMERA_Delay(2); - } - break; - } - case CAMERA_R320x240: - { - for(index=0; index<(sizeof(OV9655_QVGA)/2); index++) - { - CAMERA_IO_Write(DeviceAddr, OV9655_QVGA[index][0], OV9655_QVGA[index][1]); - CAMERA_Delay(2); - } - break; - } - case CAMERA_R480x272: - { - /* Not supported resolution */ - break; - } - case CAMERA_R640x480: - { - for(index=0; index<(sizeof(OV9655_VGA)/2); index++) - { - CAMERA_IO_Write(DeviceAddr, OV9655_VGA[index][0], OV9655_VGA[index][1]); - CAMERA_Delay(2); - } - break; - } - default: - { - break; - } - } -} - -/** - * @brief Configures the OV9655 camera feature. - * @param DeviceAddr: Device address on communication Bus. - * @param feature: Camera feature to be configured - * @param value: Value to be configured - * @param brightness_value: Brightness value to be configured - * @retval None - */ -void ov9655_Config(uint16_t DeviceAddr, uint32_t feature, uint32_t value, uint32_t brightness_value) -{ - uint8_t tslb, mtx1, mtx2, mtx3, mtx4, mtx5, mtx6; - uint64_t value_tmp; - uint32_t br_value; - - /* Convert the input value into ov9655 parameters */ - value_tmp = ov9655_ConvertValue(feature, value); - br_value = (uint32_t)ov9655_ConvertValue(CAMERA_CONTRAST_BRIGHTNESS, brightness_value); - - switch(feature) - { - case CAMERA_CONTRAST_BRIGHTNESS: - { - CAMERA_IO_Write(DeviceAddr, OV9655_SENSOR_BRTN, br_value); - CAMERA_IO_Write(DeviceAddr, OV9655_SENSOR_CNST1, value_tmp); - break; - } - case CAMERA_BLACK_WHITE: - case CAMERA_COLOR_EFFECT: - { - tslb = (uint8_t)(value_tmp >> 48); - mtx1 = (uint8_t)(value_tmp >> 40); - mtx2 = (uint8_t)(value_tmp >> 32); - mtx3 = (uint8_t)(value_tmp >> 24); - mtx4 = (uint8_t)(value_tmp >> 16); - mtx5 = (uint8_t)(value_tmp >> 8); - mtx6 = (uint8_t)(value_tmp); - CAMERA_IO_Write(DeviceAddr, OV9655_SENSOR_TSLB, tslb); - CAMERA_IO_Write(DeviceAddr, OV9655_SENSOR_MTX1, mtx1); - CAMERA_IO_Write(DeviceAddr, OV9655_SENSOR_MTX2, mtx2); - CAMERA_IO_Write(DeviceAddr, OV9655_SENSOR_MTX3, mtx3); - CAMERA_IO_Write(DeviceAddr, OV9655_SENSOR_MTX4, mtx4); - CAMERA_IO_Write(DeviceAddr, OV9655_SENSOR_MTX5, mtx5); - CAMERA_IO_Write(DeviceAddr, OV9655_SENSOR_MTX6, mtx6); - break; - } - default: - { - break; - } - } -} - -/** - * @brief Read the OV9655 Camera identity. - * @param DeviceAddr: Device address on communication Bus. - * @retval the OV9655 ID - */ -uint16_t ov9655_ReadID(uint16_t DeviceAddr) -{ - /* Initialize I2C */ - CAMERA_IO_Init(); - - /* Get the camera ID */ - return (CAMERA_IO_Read(DeviceAddr, OV9655_SENSOR_PIDH)); -} - -/****************************************************************************** - Static Functions -*******************************************************************************/ -/** - * @brief Convert input values into ov9655 parameters. - * @param feature: Camera feature to be configured - * @param value: Value to be configured - * @retval The converted value - */ -static uint64_t ov9655_ConvertValue(uint32_t feature, uint32_t value) -{ - uint64_t ret = 0; - - switch(feature) - { - case CAMERA_BLACK_WHITE: - { - switch(value) - { - case CAMERA_BLACK_WHITE_BW: - { - ret = OV9655_BLACK_WHITE_BW; - break; - } - case CAMERA_BLACK_WHITE_NEGATIVE: - { - ret = OV9655_BLACK_WHITE_NEGATIVE; - break; - } - case CAMERA_BLACK_WHITE_BW_NEGATIVE: - { - ret = OV9655_BLACK_WHITE_BW_NEGATIVE; - break; - } - case CAMERA_BLACK_WHITE_NORMAL: - { - ret = OV9655_BLACK_WHITE_NORMAL; - break; - } - default: - { - ret = OV9655_BLACK_WHITE_NORMAL; - break; - } - } - break; - } - case CAMERA_CONTRAST_BRIGHTNESS: - { - switch(value) - { - case CAMERA_BRIGHTNESS_LEVEL0: - { - ret = OV9655_BRIGHTNESS_LEVEL0; - break; - } - case CAMERA_BRIGHTNESS_LEVEL1: - { - ret = OV9655_BRIGHTNESS_LEVEL1; - break; - } - case CAMERA_BRIGHTNESS_LEVEL2: - { - ret = OV9655_BRIGHTNESS_LEVEL2; - break; - } - case CAMERA_BRIGHTNESS_LEVEL3: - { - ret = OV9655_BRIGHTNESS_LEVEL3; - break; - } - case CAMERA_BRIGHTNESS_LEVEL4: - { - ret = OV9655_BRIGHTNESS_LEVEL4; - break; - } - case CAMERA_CONTRAST_LEVEL0: - { - ret = OV9655_CONTRAST_LEVEL0; - break; - } - case CAMERA_CONTRAST_LEVEL1: - { - ret = OV9655_CONTRAST_LEVEL1; - break; - } - case CAMERA_CONTRAST_LEVEL2: - { - ret = OV9655_CONTRAST_LEVEL2; - break; - } - case CAMERA_CONTRAST_LEVEL3: - { - ret = OV9655_CONTRAST_LEVEL3; - break; - } - case CAMERA_CONTRAST_LEVEL4: - { - ret = OV9655_CONTRAST_LEVEL4; - break; - } - default: - { - ret = OV9655_CONTRAST_LEVEL0; - break; - } - } - break; - } - case CAMERA_COLOR_EFFECT: - { - switch(value) - { - case CAMERA_COLOR_EFFECT_ANTIQUE: - { - ret = OV9655_COLOR_EFFECT_ANTIQUE; - break; - } - case CAMERA_COLOR_EFFECT_BLUE: - { - ret = OV9655_COLOR_EFFECT_BLUE; - break; - } - case CAMERA_COLOR_EFFECT_GREEN: - { - ret = OV9655_COLOR_EFFECT_GREEN; - break; - } - case CAMERA_COLOR_EFFECT_RED: - { - ret = OV9655_COLOR_EFFECT_RED; - break; - } - case CAMERA_COLOR_EFFECT_NONE: - default: - { - ret = OV9655_COLOR_EFFECT_NONE; - break; - } - } - break; - default: - { - ret = 0; - break; - } - } - } - - return ret; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/ov9655/ov9655.h --- a/Drivers/BSP/Components/ov9655/ov9655.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,157 +0,0 @@ -/** - ****************************************************************************** - * @file ov9655.h - * @author MCD Application Team - * @brief This file contains all the functions prototypes for the ov9655.c - * driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __OV9655_H -#define __OV9655_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "../Common/camera.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup ov9655 - * @{ - */ - -/** @defgroup OV9655_Exported_Types - * @{ - */ - -/** - * @} - */ - -/** @defgroup OV9655_Exported_Constants - * @{ - */ -/** - * @brief OV9655 ID - */ -#define OV9655_ID 0x96 -/** - * @brief OV9655 Registers - */ - -/* OV9655 Registers definition */ -#define OV9655_SENSOR_PIDH 0x0A -#define OV9655_SENSOR_PIDL 0x0B -#define OV9655_SENSOR_COM7 0x12 -#define OV9655_SENSOR_TSLB 0x3A -#define OV9655_SENSOR_MTX1 0x4F -#define OV9655_SENSOR_MTX2 0x50 -#define OV9655_SENSOR_MTX3 0x51 -#define OV9655_SENSOR_MTX4 0x52 -#define OV9655_SENSOR_MTX5 0x53 -#define OV9655_SENSOR_MTX6 0x54 -#define OV9655_SENSOR_BRTN 0x55 -#define OV9655_SENSOR_CNST1 0x56 -#define OV9655_SENSOR_CNST2 0x57 - -/** - * @brief OV9655 Features Parameters - */ -#define OV9655_BRIGHTNESS_LEVEL0 0xB0 /* Brightness level -2 */ -#define OV9655_BRIGHTNESS_LEVEL1 0x98 /* Brightness level -1 */ -#define OV9655_BRIGHTNESS_LEVEL2 0x00 /* Brightness level 0 */ -#define OV9655_BRIGHTNESS_LEVEL3 0x18 /* Brightness level +1 */ -#define OV9655_BRIGHTNESS_LEVEL4 0x30 /* Brightness level +2 */ - -#define OV9655_BLACK_WHITE_BW 0xCC000000000000 /* Black and white effect */ -#define OV9655_BLACK_WHITE_NEGATIVE 0xEC808000008080 /* Negative effect */ -#define OV9655_BLACK_WHITE_BW_NEGATIVE 0xEC000000000000 /* BW and Negative effect */ -#define OV9655_BLACK_WHITE_NORMAL 0xCC808000008080 /* Normal effect */ - -#define OV9655_CONTRAST_LEVEL0 0x30 /* Contrast level -2 */ -#define OV9655_CONTRAST_LEVEL1 0x38 /* Contrast level -1 */ -#define OV9655_CONTRAST_LEVEL2 0x40 /* Contrast level 0 */ -#define OV9655_CONTRAST_LEVEL3 0x50 /* Contrast level +1 */ -#define OV9655_CONTRAST_LEVEL4 0x60 /* Contrast level +2 */ - -#define OV9655_COLOR_EFFECT_NONE 0xCC808000008080 /* No color effect */ -#define OV9655_COLOR_EFFECT_ANTIQUE 0xCC000020F00000 /* Antique effect */ -#define OV9655_COLOR_EFFECT_BLUE 0xCC000000000060 /* Blue effect */ -#define OV9655_COLOR_EFFECT_GREEN 0xCC000000008000 /* Green effect */ -#define OV9655_COLOR_EFFECT_RED 0xCC600000000000 /* Red effect */ -/** - * @} - */ - -/** @defgroup OV9655_Exported_Functions - * @{ - */ -void ov9655_Init(uint16_t DeviceAddr, uint32_t resolution); -void ov9655_Config(uint16_t DeviceAddr, uint32_t feature, uint32_t value, uint32_t BR_value); -uint16_t ov9655_ReadID(uint16_t DeviceAddr); - -void CAMERA_IO_Init(void); -void CAMERA_IO_Write(uint8_t addr, uint8_t reg, uint8_t value); -uint8_t CAMERA_IO_Read(uint8_t addr, uint8_t reg); -void CAMERA_Delay(uint32_t delay); - -/* CAMERA driver structure */ -extern CAMERA_DrvTypeDef ov9655_drv; -/** - * @} - */ -#ifdef __cplusplus -} -#endif - -#endif /* __OV9655_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/rk043fn48h/rk043fn48h.h --- a/Drivers/BSP/Components/rk043fn48h/rk043fn48h.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,119 +0,0 @@ -/** - ****************************************************************************** - * @file rk043fn48h.h - * @author MCD Application Team - * @brief This file contains all the constants parameters for the RK043FN48H-CT672B - * LCD component. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __RK043FN48H_H -#define __RK043FN48H_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup rk043fn48h - * @{ - */ - -/** @defgroup RK043FN48H_Exported_Types - * @{ - */ - -/** - * @} - */ - -/** @defgroup RK043FN48H_Exported_Constants - * @{ - */ - -/** - * @brief RK043FN48H Size - */ -#define RK043FN48H_WIDTH ((uint16_t)480) /* LCD PIXEL WIDTH */ -#define RK043FN48H_HEIGHT ((uint16_t)272) /* LCD PIXEL HEIGHT */ - -/** - * @brief RK043FN48H Timing - */ -#define RK043FN48H_HSYNC ((uint16_t)41) /* Horizontal synchronization */ -#define RK043FN48H_HBP ((uint16_t)13) /* Horizontal back porch */ -#define RK043FN48H_HFP ((uint16_t)32) /* Horizontal front porch */ -#define RK043FN48H_VSYNC ((uint16_t)10) /* Vertical synchronization */ -#define RK043FN48H_VBP ((uint16_t)2) /* Vertical back porch */ -#define RK043FN48H_VFP ((uint16_t)2) /* Vertical front porch */ - -/** - * @brief RK043FN48H frequency divider - */ -#define RK043FN48H_FREQUENCY_DIVIDER 5 /* LCD Frequency divider */ -/** - * @} - */ - -/** @defgroup RK043FN48H_Exported_Functions - * @{ - */ - -/** - * @} - */ -#ifdef __cplusplus -} -#endif - -#endif /* __RK043FN48H_H */ -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/wm8994/wm8994.c --- a/Drivers/BSP/Components/wm8994/wm8994.c Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1075 +0,0 @@ -/** - ****************************************************************************** - * @file wm8994.c - * @author MCD Application Team - * @brief This file provides the WM8994 Audio Codec driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Includes ------------------------------------------------------------------*/ -#include "wm8994.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Components - * @{ - */ - -/** @addtogroup wm8994 - * @brief This file provides a set of functions needed to drive the - * WM8994 audio codec. - * @{ - */ - -/** @defgroup WM8994_Private_Types - * @{ - */ - -/** - * @} - */ - -/** @defgroup WM8994_Private_Defines - * @{ - */ -/* Uncomment this line to enable verifying data sent to codec after each write - operation (for debug purpose) */ -#if !defined (VERIFY_WRITTENDATA) -/*#define VERIFY_WRITTENDATA*/ -#endif /* VERIFY_WRITTENDATA */ -/** - * @} - */ - -/** @defgroup WM8994_Private_Macros - * @{ - */ - -/** - * @} - */ - -/** @defgroup WM8994_Private_Variables - * @{ - */ - -/* Audio codec driver structure initialization */ -AUDIO_DrvTypeDef wm8994_drv = -{ - wm8994_Init, - wm8994_DeInit, - wm8994_ReadID, - - wm8994_Play, - wm8994_Pause, - wm8994_Resume, - wm8994_Stop, - - wm8994_SetFrequency, - wm8994_SetVolume, - wm8994_SetMute, - wm8994_SetOutputMode, - - wm8994_Reset -}; - -static uint32_t outputEnabled = 0; -static uint32_t inputEnabled = 0; -static uint8_t ColdStartup = 1; - -/** - * @} - */ - -/** @defgroup WM8994_Function_Prototypes - * @{ - */ -static uint8_t CODEC_IO_Write(uint8_t Addr, uint16_t Reg, uint16_t Value); -/** - * @} - */ - - -/** @defgroup WM8994_Private_Functions - * @{ - */ - -/** - * @brief Initializes the audio codec and the control interface. - * @param DeviceAddr: Device address on communication Bus. - * @param OutputInputDevice: can be OUTPUT_DEVICE_SPEAKER, OUTPUT_DEVICE_HEADPHONE, - * OUTPUT_DEVICE_BOTH, OUTPUT_DEVICE_AUTO, INPUT_DEVICE_DIGITAL_MICROPHONE_1, - * INPUT_DEVICE_DIGITAL_MICROPHONE_2, INPUT_DEVICE_DIGITAL_MIC1_MIC2, - * INPUT_DEVICE_INPUT_LINE_1 or INPUT_DEVICE_INPUT_LINE_2. - * @param Volume: Initial volume level (from 0 (Mute) to 100 (Max)) - * @param AudioFreq: Audio Frequency - * @retval 0 if correct communication, else wrong communication - */ -uint32_t wm8994_Init(uint16_t DeviceAddr, uint16_t OutputInputDevice, uint8_t Volume, uint32_t AudioFreq) -{ - uint32_t counter = 0; - uint16_t output_device = OutputInputDevice & 0xFF; - uint16_t input_device = OutputInputDevice & 0xFF00; - uint16_t power_mgnt_reg_1 = 0; - - /* Initialize the Control interface of the Audio Codec */ - AUDIO_IO_Init(); - /* wm8994 Errata Work-Arounds */ - counter += CODEC_IO_Write(DeviceAddr, 0x102, 0x0003); - counter += CODEC_IO_Write(DeviceAddr, 0x817, 0x0000); - counter += CODEC_IO_Write(DeviceAddr, 0x102, 0x0000); - - /* Enable VMID soft start (fast), Start-up Bias Current Enabled */ - counter += CODEC_IO_Write(DeviceAddr, 0x39, 0x006C); - - /* Enable bias generator, Enable VMID */ - if (input_device > 0) - { - counter += CODEC_IO_Write(DeviceAddr, 0x01, 0x0013); - } - else - { - counter += CODEC_IO_Write(DeviceAddr, 0x01, 0x0003); - } - - /* Add Delay */ - AUDIO_IO_Delay(50); - - /* Path Configurations for output */ - if (output_device > 0) - { - outputEnabled = 1; - - switch (output_device) - { - case OUTPUT_DEVICE_SPEAKER: - /* Enable DAC1 (Left), Enable DAC1 (Right), - Disable DAC2 (Left), Disable DAC2 (Right)*/ - counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0C0C); - - /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0000); - - /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0000); - - /* Disable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0002); - - /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0002); - break; - - case OUTPUT_DEVICE_HEADPHONE: - /* Disable DAC1 (Left), Disable DAC1 (Right), - Enable DAC2 (Left), Enable DAC2 (Right)*/ - counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0303); - - /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0001); - - /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0001); - - /* Disable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0000); - - /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0000); - break; - - case OUTPUT_DEVICE_BOTH: - if (input_device == INPUT_DEVICE_DIGITAL_MIC1_MIC2) - { - /* Enable DAC1 (Left), Enable DAC1 (Right), - also Enable DAC2 (Left), Enable DAC2 (Right)*/ - counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0303 | 0x0C0C); - - /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path - Enable the AIF1 Timeslot 1 (Left) to DAC 1 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0003); - - /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path - Enable the AIF1 Timeslot 1 (Right) to DAC 1 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0003); - - /* Enable the AIF1 Timeslot 0 (Left) to DAC 2 (Left) mixer path - Enable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0003); - - /* Enable the AIF1 Timeslot 0 (Right) to DAC 2 (Right) mixer path - Enable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0003); - } - else - { - /* Enable DAC1 (Left), Enable DAC1 (Right), - also Enable DAC2 (Left), Enable DAC2 (Right)*/ - counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0303 | 0x0C0C); - - /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0001); - - /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0001); - - /* Enable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0002); - - /* Enable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0002); - } - break; - - case OUTPUT_DEVICE_AUTO : - default: - /* Disable DAC1 (Left), Disable DAC1 (Right), - Enable DAC2 (Left), Enable DAC2 (Right)*/ - counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0303); - - /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0001); - - /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0001); - - /* Disable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0000); - - /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0000); - break; - } - } - else - { - outputEnabled = 0; - } - - /* Path Configurations for input */ - if (input_device > 0) - { - inputEnabled = 1; - switch (input_device) - { - case INPUT_DEVICE_DIGITAL_MICROPHONE_2 : - /* Enable AIF1ADC2 (Left), Enable AIF1ADC2 (Right) - * Enable DMICDAT2 (Left), Enable DMICDAT2 (Right) - * Enable Left ADC, Enable Right ADC */ - counter += CODEC_IO_Write(DeviceAddr, 0x04, 0x0C30); - - /* Enable AIF1 DRC2 Signal Detect & DRC in AIF1ADC2 Left/Right Timeslot 1 */ - counter += CODEC_IO_Write(DeviceAddr, 0x450, 0x00DB); - - /* Disable IN1L, IN1R, IN2L, IN2R, Enable Thermal sensor & shutdown */ - counter += CODEC_IO_Write(DeviceAddr, 0x02, 0x6000); - - /* Enable the DMIC2(Left) to AIF1 Timeslot 1 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x608, 0x0002); - - /* Enable the DMIC2(Right) to AIF1 Timeslot 1 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x609, 0x0002); - - /* GPIO1 pin configuration GP1_DIR = output, GP1_FN = AIF1 DRC2 signal detect */ - counter += CODEC_IO_Write(DeviceAddr, 0x700, 0x000E); - break; - - case INPUT_DEVICE_INPUT_LINE_1 : - /* IN1LN_TO_IN1L, IN1LP_TO_VMID, IN1RN_TO_IN1R, IN1RP_TO_VMID */ - counter += CODEC_IO_Write(DeviceAddr, 0x28, 0x0011); - - /* Disable mute on IN1L_TO_MIXINL and +30dB on IN1L PGA output */ - counter += CODEC_IO_Write(DeviceAddr, 0x29, 0x0035); - - /* Disable mute on IN1R_TO_MIXINL, Gain = +30dB */ - counter += CODEC_IO_Write(DeviceAddr, 0x2A, 0x0035); - - /* Enable AIF1ADC1 (Left), Enable AIF1ADC1 (Right) - * Enable Left ADC, Enable Right ADC */ - counter += CODEC_IO_Write(DeviceAddr, 0x04, 0x0303); - - /* Enable AIF1 DRC1 Signal Detect & DRC in AIF1ADC1 Left/Right Timeslot 0 */ - counter += CODEC_IO_Write(DeviceAddr, 0x440, 0x00DB); - - /* Enable IN1L and IN1R, Disable IN2L and IN2R, Enable Thermal sensor & shutdown */ - counter += CODEC_IO_Write(DeviceAddr, 0x02, 0x6350); - - /* Enable the ADCL(Left) to AIF1 Timeslot 0 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x606, 0x0002); - - /* Enable the ADCR(Right) to AIF1 Timeslot 0 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x607, 0x0002); - - /* GPIO1 pin configuration GP1_DIR = output, GP1_FN = AIF1 DRC1 signal detect */ - counter += CODEC_IO_Write(DeviceAddr, 0x700, 0x000D); - break; - - case INPUT_DEVICE_DIGITAL_MICROPHONE_1 : - /* Enable AIF1ADC1 (Left), Enable AIF1ADC1 (Right) - * Enable DMICDAT1 (Left), Enable DMICDAT1 (Right) - * Enable Left ADC, Enable Right ADC */ - counter += CODEC_IO_Write(DeviceAddr, 0x04, 0x030C); - - /* Enable AIF1 DRC2 Signal Detect & DRC in AIF1ADC1 Left/Right Timeslot 0 */ - counter += CODEC_IO_Write(DeviceAddr, 0x440, 0x00DB); - - /* Disable IN1L, IN1R, IN2L, IN2R, Enable Thermal sensor & shutdown */ - counter += CODEC_IO_Write(DeviceAddr, 0x02, 0x6350); - - /* Enable the DMIC2(Left) to AIF1 Timeslot 0 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x606, 0x0002); - - /* Enable the DMIC2(Right) to AIF1 Timeslot 0 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x607, 0x0002); - - /* GPIO1 pin configuration GP1_DIR = output, GP1_FN = AIF1 DRC1 signal detect */ - counter += CODEC_IO_Write(DeviceAddr, 0x700, 0x000D); - break; - case INPUT_DEVICE_DIGITAL_MIC1_MIC2 : - /* Enable AIF1ADC1 (Left), Enable AIF1ADC1 (Right) - * Enable DMICDAT1 (Left), Enable DMICDAT1 (Right) - * Enable Left ADC, Enable Right ADC */ - counter += CODEC_IO_Write(DeviceAddr, 0x04, 0x0F3C); - - /* Enable AIF1 DRC2 Signal Detect & DRC in AIF1ADC2 Left/Right Timeslot 1 */ - counter += CODEC_IO_Write(DeviceAddr, 0x450, 0x00DB); - - /* Enable AIF1 DRC2 Signal Detect & DRC in AIF1ADC1 Left/Right Timeslot 0 */ - counter += CODEC_IO_Write(DeviceAddr, 0x440, 0x00DB); - - /* Disable IN1L, IN1R, Enable IN2L, IN2R, Thermal sensor & shutdown */ - counter += CODEC_IO_Write(DeviceAddr, 0x02, 0x63A0); - - /* Enable the DMIC2(Left) to AIF1 Timeslot 0 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x606, 0x0002); - - /* Enable the DMIC2(Right) to AIF1 Timeslot 0 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x607, 0x0002); - - /* Enable the DMIC2(Left) to AIF1 Timeslot 1 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x608, 0x0002); - - /* Enable the DMIC2(Right) to AIF1 Timeslot 1 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x609, 0x0002); - - /* GPIO1 pin configuration GP1_DIR = output, GP1_FN = AIF1 DRC1 signal detect */ - counter += CODEC_IO_Write(DeviceAddr, 0x700, 0x000D); - break; - case INPUT_DEVICE_INPUT_LINE_2 : - default: - /* Actually, no other input devices supported */ - counter++; - break; - } - } - else - { - inputEnabled = 0; - } - - /* Clock Configurations */ - switch (AudioFreq) - { - case AUDIO_FREQUENCY_8K: - /* AIF1 Sample Rate = 8 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0003); - break; - - case AUDIO_FREQUENCY_16K: - /* AIF1 Sample Rate = 16 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0033); - break; - - case AUDIO_FREQUENCY_32K: - /* AIF1 Sample Rate = 32 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0063); - break; - - case AUDIO_FREQUENCY_48K: - /* AIF1 Sample Rate = 48 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0083); - break; - - case AUDIO_FREQUENCY_96K: - /* AIF1 Sample Rate = 96 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x00A3); - break; - - case AUDIO_FREQUENCY_11K: - /* AIF1 Sample Rate = 11.025 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0013); - break; - - case AUDIO_FREQUENCY_22K: - /* AIF1 Sample Rate = 22.050 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0043); - break; - - case AUDIO_FREQUENCY_44K: - /* AIF1 Sample Rate = 44.1 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0073); - break; - - default: - /* AIF1 Sample Rate = 48 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0083); - break; - } - - if(input_device == INPUT_DEVICE_DIGITAL_MIC1_MIC2) - { - /* AIF1 Word Length = 16-bits, AIF1 Format = DSP mode */ - counter += CODEC_IO_Write(DeviceAddr, 0x300, 0x4018); - } - else - { - /* AIF1 Word Length = 16-bits, AIF1 Format = I2S (Default Register Value) */ - counter += CODEC_IO_Write(DeviceAddr, 0x300, 0x4010); - } - - /* slave mode */ - counter += CODEC_IO_Write(DeviceAddr, 0x302, 0x0000); - - /* Enable the DSP processing clock for AIF1, Enable the core clock */ - counter += CODEC_IO_Write(DeviceAddr, 0x208, 0x000A); - - /* Enable AIF1 Clock, AIF1 Clock Source = MCLK1 pin */ - counter += CODEC_IO_Write(DeviceAddr, 0x200, 0x0001); - - if (output_device > 0) /* Audio output selected */ - { - if (output_device == OUTPUT_DEVICE_HEADPHONE) - { - /* Select DAC1 (Left) to Left Headphone Output PGA (HPOUT1LVOL) path */ - counter += CODEC_IO_Write(DeviceAddr, 0x2D, 0x0100); - - /* Select DAC1 (Right) to Right Headphone Output PGA (HPOUT1RVOL) path */ - counter += CODEC_IO_Write(DeviceAddr, 0x2E, 0x0100); - - /* Startup sequence for Headphone */ - if(ColdStartup) - { - counter += CODEC_IO_Write(DeviceAddr,0x110,0x8100); - - ColdStartup=0; - /* Add Delay */ - AUDIO_IO_Delay(300); - } - else /* Headphone Warm Start-Up */ - { - counter += CODEC_IO_Write(DeviceAddr,0x110,0x8108); - /* Add Delay */ - AUDIO_IO_Delay(50); - } - - /* Soft un-Mute the AIF1 Timeslot 0 DAC1 path L&R */ - counter += CODEC_IO_Write(DeviceAddr, 0x420, 0x0000); - } - /* Analog Output Configuration */ - - /* Enable SPKRVOL PGA, Enable SPKMIXR, Enable SPKLVOL PGA, Enable SPKMIXL */ - counter += CODEC_IO_Write(DeviceAddr, 0x03, 0x0300); - - /* Left Speaker Mixer Volume = 0dB */ - counter += CODEC_IO_Write(DeviceAddr, 0x22, 0x0000); - - /* Speaker output mode = Class D, Right Speaker Mixer Volume = 0dB ((0x23, 0x0100) = class AB)*/ - counter += CODEC_IO_Write(DeviceAddr, 0x23, 0x0000); - - /* Unmute DAC2 (Left) to Left Speaker Mixer (SPKMIXL) path, - Unmute DAC2 (Right) to Right Speaker Mixer (SPKMIXR) path */ - counter += CODEC_IO_Write(DeviceAddr, 0x36, 0x0300); - - /* Enable bias generator, Enable VMID, Enable SPKOUTL, Enable SPKOUTR */ - counter += CODEC_IO_Write(DeviceAddr, 0x01, 0x3003); - - /* Headphone/Speaker Enable */ - - if (input_device == INPUT_DEVICE_DIGITAL_MIC1_MIC2) - { - /* Enable Class W, Class W Envelope Tracking = AIF1 Timeslots 0 and 1 */ - counter += CODEC_IO_Write(DeviceAddr, 0x51, 0x0205); - } - else - { - /* Enable Class W, Class W Envelope Tracking = AIF1 Timeslot 0 */ - counter += CODEC_IO_Write(DeviceAddr, 0x51, 0x0005); - } - - /* Enable bias generator, Enable VMID, Enable HPOUT1 (Left) and Enable HPOUT1 (Right) input stages */ - /* idem for Speaker */ - power_mgnt_reg_1 |= 0x0303 | 0x3003; - counter += CODEC_IO_Write(DeviceAddr, 0x01, power_mgnt_reg_1); - - /* Enable HPOUT1 (Left) and HPOUT1 (Right) intermediate stages */ - counter += CODEC_IO_Write(DeviceAddr, 0x60, 0x0022); - - /* Enable Charge Pump */ - counter += CODEC_IO_Write(DeviceAddr, 0x4C, 0x9F25); - - /* Add Delay */ - AUDIO_IO_Delay(15); - - /* Select DAC1 (Left) to Left Headphone Output PGA (HPOUT1LVOL) path */ - counter += CODEC_IO_Write(DeviceAddr, 0x2D, 0x0001); - - /* Select DAC1 (Right) to Right Headphone Output PGA (HPOUT1RVOL) path */ - counter += CODEC_IO_Write(DeviceAddr, 0x2E, 0x0001); - - /* Enable Left Output Mixer (MIXOUTL), Enable Right Output Mixer (MIXOUTR) */ - /* idem for SPKOUTL and SPKOUTR */ - counter += CODEC_IO_Write(DeviceAddr, 0x03, 0x0030 | 0x0300); - - /* Enable DC Servo and trigger start-up mode on left and right channels */ - counter += CODEC_IO_Write(DeviceAddr, 0x54, 0x0033); - - /* Add Delay */ - AUDIO_IO_Delay(257); - - /* Enable HPOUT1 (Left) and HPOUT1 (Right) intermediate and output stages. Remove clamps */ - counter += CODEC_IO_Write(DeviceAddr, 0x60, 0x00EE); - - /* Unmutes */ - - /* Unmute DAC 1 (Left) */ - counter += CODEC_IO_Write(DeviceAddr, 0x610, 0x00C0); - - /* Unmute DAC 1 (Right) */ - counter += CODEC_IO_Write(DeviceAddr, 0x611, 0x00C0); - - /* Unmute the AIF1 Timeslot 0 DAC path */ - counter += CODEC_IO_Write(DeviceAddr, 0x420, 0x0010); - - /* Unmute DAC 2 (Left) */ - counter += CODEC_IO_Write(DeviceAddr, 0x612, 0x00C0); - - /* Unmute DAC 2 (Right) */ - counter += CODEC_IO_Write(DeviceAddr, 0x613, 0x00C0); - - /* Unmute the AIF1 Timeslot 1 DAC2 path */ - counter += CODEC_IO_Write(DeviceAddr, 0x422, 0x0010); - - /* Volume Control */ - wm8994_SetVolume(DeviceAddr, Volume); - } - - if (input_device > 0) /* Audio input selected */ - { - if ((input_device == INPUT_DEVICE_DIGITAL_MICROPHONE_1) || (input_device == INPUT_DEVICE_DIGITAL_MICROPHONE_2)) - { - /* Enable Microphone bias 1 generator, Enable VMID */ - power_mgnt_reg_1 |= 0x0013; - counter += CODEC_IO_Write(DeviceAddr, 0x01, power_mgnt_reg_1); - - /* ADC oversample enable */ - counter += CODEC_IO_Write(DeviceAddr, 0x620, 0x0002); - - /* AIF ADC2 HPF enable, HPF cut = voice mode 1 fc=127Hz at fs=8kHz */ - counter += CODEC_IO_Write(DeviceAddr, 0x411, 0x3800); - } - else if(input_device == INPUT_DEVICE_DIGITAL_MIC1_MIC2) - { - /* Enable Microphone bias 1 generator, Enable VMID */ - power_mgnt_reg_1 |= 0x0013; - counter += CODEC_IO_Write(DeviceAddr, 0x01, power_mgnt_reg_1); - - /* ADC oversample enable */ - counter += CODEC_IO_Write(DeviceAddr, 0x620, 0x0002); - - /* AIF ADC1 HPF enable, HPF cut = voice mode 1 fc=127Hz at fs=8kHz */ - counter += CODEC_IO_Write(DeviceAddr, 0x410, 0x1800); - - /* AIF ADC2 HPF enable, HPF cut = voice mode 1 fc=127Hz at fs=8kHz */ - counter += CODEC_IO_Write(DeviceAddr, 0x411, 0x1800); - } - else if ((input_device == INPUT_DEVICE_INPUT_LINE_1) || (input_device == INPUT_DEVICE_INPUT_LINE_2)) - { - - /* Disable mute on IN1L, IN1L Volume = +0dB */ - counter += CODEC_IO_Write(DeviceAddr, 0x18, 0x000B); - - /* Disable mute on IN1R, IN1R Volume = +0dB */ - counter += CODEC_IO_Write(DeviceAddr, 0x1A, 0x000B); - - /* AIF ADC1 HPF enable, HPF cut = hifi mode fc=4Hz at fs=48kHz */ - counter += CODEC_IO_Write(DeviceAddr, 0x410, 0x1800); - } - /* Volume Control */ - wm8994_SetVolume(DeviceAddr, Volume); - } - /* Return communication control value */ - return counter; -} - -/** - * @brief Deinitializes the audio codec. - * @param None - * @retval None - */ -void wm8994_DeInit(void) -{ - /* Deinitialize Audio Codec interface */ - AUDIO_IO_DeInit(); -} - -/** - * @brief Get the WM8994 ID. - * @param DeviceAddr: Device address on communication Bus. - * @retval The WM8994 ID - */ -uint32_t wm8994_ReadID(uint16_t DeviceAddr) -{ - /* Initialize the Control interface of the Audio Codec */ - AUDIO_IO_Init(); - - return ((uint32_t)AUDIO_IO_Read(DeviceAddr, WM8994_CHIPID_ADDR)); -} - -/** - * @brief Start the audio Codec play feature. - * @note For this codec no Play options are required. - * @param DeviceAddr: Device address on communication Bus. - * @retval 0 if correct communication, else wrong communication - */ -uint32_t wm8994_Play(uint16_t DeviceAddr, uint16_t* pBuffer, uint16_t Size) -{ - uint32_t counter = 0; - - /* Resumes the audio file playing */ - /* Unmute the output first */ - counter += wm8994_SetMute(DeviceAddr, AUDIO_MUTE_OFF); - - return counter; -} - -/** - * @brief Pauses playing on the audio codec. - * @param DeviceAddr: Device address on communication Bus. - * @retval 0 if correct communication, else wrong communication - */ -uint32_t wm8994_Pause(uint16_t DeviceAddr) -{ - uint32_t counter = 0; - - /* Pause the audio file playing */ - /* Mute the output first */ - counter += wm8994_SetMute(DeviceAddr, AUDIO_MUTE_ON); - - /* Put the Codec in Power save mode */ - counter += CODEC_IO_Write(DeviceAddr, 0x02, 0x01); - - return counter; -} - -/** - * @brief Resumes playing on the audio codec. - * @param DeviceAddr: Device address on communication Bus. - * @retval 0 if correct communication, else wrong communication - */ -uint32_t wm8994_Resume(uint16_t DeviceAddr) -{ - uint32_t counter = 0; - - /* Resumes the audio file playing */ - /* Unmute the output first */ - counter += wm8994_SetMute(DeviceAddr, AUDIO_MUTE_OFF); - - return counter; -} - -/** - * @brief Stops audio Codec playing. It powers down the codec. - * @param DeviceAddr: Device address on communication Bus. - * @param CodecPdwnMode: selects the power down mode. - * - CODEC_PDWN_SW: only mutes the audio codec. When resuming from this - * mode the codec keeps the previous initialization - * (no need to re-Initialize the codec registers). - * - CODEC_PDWN_HW: Physically power down the codec. When resuming from this - * mode, the codec is set to default configuration - * (user should re-Initialize the codec in order to - * play again the audio stream). - * @retval 0 if correct communication, else wrong communication - */ -uint32_t wm8994_Stop(uint16_t DeviceAddr, uint32_t CodecPdwnMode) -{ - uint32_t counter = 0; - - if (outputEnabled != 0) - { - /* Mute the output first */ - counter += wm8994_SetMute(DeviceAddr, AUDIO_MUTE_ON); - - if (CodecPdwnMode == CODEC_PDWN_SW) - { - /* Only output mute required*/ - } - else /* CODEC_PDWN_HW */ - { - /* Mute the AIF1 Timeslot 0 DAC1 path */ - counter += CODEC_IO_Write(DeviceAddr, 0x420, 0x0200); - - /* Mute the AIF1 Timeslot 1 DAC2 path */ - counter += CODEC_IO_Write(DeviceAddr, 0x422, 0x0200); - - /* Disable DAC1L_TO_HPOUT1L */ - counter += CODEC_IO_Write(DeviceAddr, 0x2D, 0x0000); - - /* Disable DAC1R_TO_HPOUT1R */ - counter += CODEC_IO_Write(DeviceAddr, 0x2E, 0x0000); - - /* Disable DAC1 and DAC2 */ - counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0000); - - /* Reset Codec by writing in 0x0000 address register */ - counter += CODEC_IO_Write(DeviceAddr, 0x0000, 0x0000); - - outputEnabled = 0; - } - } - return counter; -} - -/** - * @brief Sets higher or lower the codec volume level. - * @param DeviceAddr: Device address on communication Bus. - * @param Volume: a byte value from 0 to 255 (refer to codec registers - * description for more details). - * @retval 0 if correct communication, else wrong communication - */ -uint32_t wm8994_SetVolume(uint16_t DeviceAddr, uint8_t Volume) -{ - uint32_t counter = 0; - uint8_t convertedvol = VOLUME_CONVERT(Volume); - - /* Output volume */ - if (outputEnabled != 0) - { - if(convertedvol > 0x3E) - { - /* Unmute audio codec */ - counter += wm8994_SetMute(DeviceAddr, AUDIO_MUTE_OFF); - - /* Left Headphone Volume */ - counter += CODEC_IO_Write(DeviceAddr, 0x1C, 0x3F | 0x140); - - /* Right Headphone Volume */ - counter += CODEC_IO_Write(DeviceAddr, 0x1D, 0x3F | 0x140); - - /* Left Speaker Volume */ - counter += CODEC_IO_Write(DeviceAddr, 0x26, 0x3F | 0x140); - - /* Right Speaker Volume */ - counter += CODEC_IO_Write(DeviceAddr, 0x27, 0x3F | 0x140); - } - else if (Volume == 0) - { - /* Mute audio codec */ - counter += wm8994_SetMute(DeviceAddr, AUDIO_MUTE_ON); - } - else - { - /* Unmute audio codec */ - counter += wm8994_SetMute(DeviceAddr, AUDIO_MUTE_OFF); - - /* Left Headphone Volume */ - counter += CODEC_IO_Write(DeviceAddr, 0x1C, convertedvol | 0x140); - - /* Right Headphone Volume */ - counter += CODEC_IO_Write(DeviceAddr, 0x1D, convertedvol | 0x140); - - /* Left Speaker Volume */ - counter += CODEC_IO_Write(DeviceAddr, 0x26, convertedvol | 0x140); - - /* Right Speaker Volume */ - counter += CODEC_IO_Write(DeviceAddr, 0x27, convertedvol | 0x140); - } - } - - /* Input volume */ - if (inputEnabled != 0) - { - convertedvol = VOLUME_IN_CONVERT(Volume); - - /* Left AIF1 ADC1 volume */ - counter += CODEC_IO_Write(DeviceAddr, 0x400, convertedvol | 0x100); - - /* Right AIF1 ADC1 volume */ - counter += CODEC_IO_Write(DeviceAddr, 0x401, convertedvol | 0x100); - - /* Left AIF1 ADC2 volume */ - counter += CODEC_IO_Write(DeviceAddr, 0x404, convertedvol | 0x100); - - /* Right AIF1 ADC2 volume */ - counter += CODEC_IO_Write(DeviceAddr, 0x405, convertedvol | 0x100); - } - return counter; -} - -/** - * @brief Enables or disables the mute feature on the audio codec. - * @param DeviceAddr: Device address on communication Bus. - * @param Cmd: AUDIO_MUTE_ON to enable the mute or AUDIO_MUTE_OFF to disable the - * mute mode. - * @retval 0 if correct communication, else wrong communication - */ -uint32_t wm8994_SetMute(uint16_t DeviceAddr, uint32_t Cmd) -{ - uint32_t counter = 0; - - if (outputEnabled != 0) - { - /* Set the Mute mode */ - if(Cmd == AUDIO_MUTE_ON) - { - /* Soft Mute the AIF1 Timeslot 0 DAC1 path L&R */ - counter += CODEC_IO_Write(DeviceAddr, 0x420, 0x0200); - - /* Soft Mute the AIF1 Timeslot 1 DAC2 path L&R */ - counter += CODEC_IO_Write(DeviceAddr, 0x422, 0x0200); - } - else /* AUDIO_MUTE_OFF Disable the Mute */ - { - /* Unmute the AIF1 Timeslot 0 DAC1 path L&R */ - counter += CODEC_IO_Write(DeviceAddr, 0x420, 0x0010); - - /* Unmute the AIF1 Timeslot 1 DAC2 path L&R */ - counter += CODEC_IO_Write(DeviceAddr, 0x422, 0x0010); - } - } - return counter; -} - -/** - * @brief Switch dynamically (while audio file is played) the output target - * (speaker or headphone). - * @param DeviceAddr: Device address on communication Bus. - * @param Output: specifies the audio output target: OUTPUT_DEVICE_SPEAKER, - * OUTPUT_DEVICE_HEADPHONE, OUTPUT_DEVICE_BOTH or OUTPUT_DEVICE_AUTO - * @retval 0 if correct communication, else wrong communication - */ -uint32_t wm8994_SetOutputMode(uint16_t DeviceAddr, uint8_t Output) -{ - uint32_t counter = 0; - - switch (Output) - { - case OUTPUT_DEVICE_SPEAKER: - /* Enable DAC1 (Left), Enable DAC1 (Right), - Disable DAC2 (Left), Disable DAC2 (Right)*/ - counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0C0C); - - /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0000); - - /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0000); - - /* Disable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0002); - - /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0002); - break; - - case OUTPUT_DEVICE_HEADPHONE: - /* Disable DAC1 (Left), Disable DAC1 (Right), - Enable DAC2 (Left), Enable DAC2 (Right)*/ - counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0303); - - /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0001); - - /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0001); - - /* Disable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0000); - - /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0000); - break; - - case OUTPUT_DEVICE_BOTH: - /* Enable DAC1 (Left), Enable DAC1 (Right), - also Enable DAC2 (Left), Enable DAC2 (Right)*/ - counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0303 | 0x0C0C); - - /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0001); - - /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0001); - - /* Enable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0002); - - /* Enable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0002); - break; - - default: - /* Disable DAC1 (Left), Disable DAC1 (Right), - Enable DAC2 (Left), Enable DAC2 (Right)*/ - counter += CODEC_IO_Write(DeviceAddr, 0x05, 0x0303); - - /* Enable the AIF1 Timeslot 0 (Left) to DAC 1 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x601, 0x0001); - - /* Enable the AIF1 Timeslot 0 (Right) to DAC 1 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x602, 0x0001); - - /* Disable the AIF1 Timeslot 1 (Left) to DAC 2 (Left) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x604, 0x0000); - - /* Disable the AIF1 Timeslot 1 (Right) to DAC 2 (Right) mixer path */ - counter += CODEC_IO_Write(DeviceAddr, 0x605, 0x0000); - break; - } - return counter; -} - -/** - * @brief Sets new frequency. - * @param DeviceAddr: Device address on communication Bus. - * @param AudioFreq: Audio frequency used to play the audio stream. - * @retval 0 if correct communication, else wrong communication - */ -uint32_t wm8994_SetFrequency(uint16_t DeviceAddr, uint32_t AudioFreq) -{ - uint32_t counter = 0; - - /* Clock Configurations */ - switch (AudioFreq) - { - case AUDIO_FREQUENCY_8K: - /* AIF1 Sample Rate = 8 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0003); - break; - - case AUDIO_FREQUENCY_16K: - /* AIF1 Sample Rate = 16 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0033); - break; - - case AUDIO_FREQUENCY_32K: - /* AIF1 Sample Rate = 32 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0063); - break; - - case AUDIO_FREQUENCY_48K: - /* AIF1 Sample Rate = 48 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0083); - break; - - case AUDIO_FREQUENCY_96K: - /* AIF1 Sample Rate = 96 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x00A3); - break; - - case AUDIO_FREQUENCY_11K: - /* AIF1 Sample Rate = 11.025 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0013); - break; - - case AUDIO_FREQUENCY_22K: - /* AIF1 Sample Rate = 22.050 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0043); - break; - - case AUDIO_FREQUENCY_44K: - /* AIF1 Sample Rate = 44.1 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0073); - break; - - default: - /* AIF1 Sample Rate = 48 (KHz), ratio=256 */ - counter += CODEC_IO_Write(DeviceAddr, 0x210, 0x0083); - break; - } - return counter; -} - -/** - * @brief Resets wm8994 registers. - * @param DeviceAddr: Device address on communication Bus. - * @retval 0 if correct communication, else wrong communication - */ -uint32_t wm8994_Reset(uint16_t DeviceAddr) -{ - uint32_t counter = 0; - - /* Reset Codec by writing in 0x0000 address register */ - counter = CODEC_IO_Write(DeviceAddr, 0x0000, 0x0000); - outputEnabled = 0; - inputEnabled=0; - - return counter; -} - -/** - * @brief Writes/Read a single data. - * @param Addr: I2C address - * @param Reg: Reg address - * @param Value: Data to be written - * @retval None - */ -static uint8_t CODEC_IO_Write(uint8_t Addr, uint16_t Reg, uint16_t Value) -{ - uint32_t result = 0; - - AUDIO_IO_Write(Addr, Reg, Value); - -#ifdef VERIFY_WRITTENDATA - /* Verify that the data has been correctly written */ - result = (AUDIO_IO_Read(Addr, Reg) == Value)? 0:1; -#endif /* VERIFY_WRITTENDATA */ - - return result; -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/Components/wm8994/wm8994.h --- a/Drivers/BSP/Components/wm8994/wm8994.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,186 +0,0 @@ -/** - ****************************************************************************** - * @file wm8994.h - * @author MCD Application Team - * @brief This file contains all the functions prototypes for the - * wm8994.c driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __WM8994_H -#define __WM8994_H - -/* Includes ------------------------------------------------------------------*/ -#include "../Common/audio.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup Component - * @{ - */ - -/** @addtogroup WM8994 - * @{ - */ - -/** @defgroup WM8994_Exported_Types - * @{ - */ - -/** - * @} - */ - -/** @defgroup WM8994_Exported_Constants - * @{ - */ - -/******************************************************************************/ -/*************************** Codec User defines ******************************/ -/******************************************************************************/ -/* Codec output DEVICE */ -#define OUTPUT_DEVICE_SPEAKER ((uint16_t)0x0001) -#define OUTPUT_DEVICE_HEADPHONE ((uint16_t)0x0002) -#define OUTPUT_DEVICE_BOTH ((uint16_t)0x0003) -#define OUTPUT_DEVICE_AUTO ((uint16_t)0x0004) -#define INPUT_DEVICE_DIGITAL_MICROPHONE_1 ((uint16_t)0x0100) -#define INPUT_DEVICE_DIGITAL_MICROPHONE_2 ((uint16_t)0x0200) -#define INPUT_DEVICE_INPUT_LINE_1 ((uint16_t)0x0300) -#define INPUT_DEVICE_INPUT_LINE_2 ((uint16_t)0x0400) -#define INPUT_DEVICE_DIGITAL_MIC1_MIC2 ((uint16_t)0x0800) - -/* Volume Levels values */ -#define DEFAULT_VOLMIN 0x00 -#define DEFAULT_VOLMAX 0xFF -#define DEFAULT_VOLSTEP 0x04 - -#define AUDIO_PAUSE 0 -#define AUDIO_RESUME 1 - -/* Codec POWER DOWN modes */ -#define CODEC_PDWN_HW 1 -#define CODEC_PDWN_SW 2 - -/* MUTE commands */ -#define AUDIO_MUTE_ON 1 -#define AUDIO_MUTE_OFF 0 - -/* AUDIO FREQUENCY */ -#define AUDIO_FREQUENCY_192K ((uint32_t)192000) -#define AUDIO_FREQUENCY_96K ((uint32_t)96000) -#define AUDIO_FREQUENCY_48K ((uint32_t)48000) -#define AUDIO_FREQUENCY_44K ((uint32_t)44100) -#define AUDIO_FREQUENCY_32K ((uint32_t)32000) -#define AUDIO_FREQUENCY_22K ((uint32_t)22050) -#define AUDIO_FREQUENCY_16K ((uint32_t)16000) -#define AUDIO_FREQUENCY_11K ((uint32_t)11025) -#define AUDIO_FREQUENCY_8K ((uint32_t)8000) - -#define VOLUME_CONVERT(Volume) (((Volume) > 100)? 100:((uint8_t)(((Volume) * 63) / 100))) -#define VOLUME_IN_CONVERT(Volume) (((Volume) >= 100)? 239:((uint8_t)(((Volume) * 240) / 100))) - -/******************************************************************************/ -/****************************** REGISTER MAPPING ******************************/ -/******************************************************************************/ -/** - * @brief WM8994 ID - */ -#define WM8994_ID 0x8994 - -/** - * @brief Device ID Register: Reading from this register will indicate device - * family ID 8994h - */ -#define WM8994_CHIPID_ADDR 0x00 - -/** - * @} - */ - -/** @defgroup WM8994_Exported_Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup WM8994_Exported_Functions - * @{ - */ - -/*------------------------------------------------------------------------------ - Audio Codec functions -------------------------------------------------------------------------------*/ -/* High Layer codec functions */ -uint32_t wm8994_Init(uint16_t DeviceAddr, uint16_t OutputInputDevice, uint8_t Volume, uint32_t AudioFreq); -void wm8994_DeInit(void); -uint32_t wm8994_ReadID(uint16_t DeviceAddr); -uint32_t wm8994_Play(uint16_t DeviceAddr, uint16_t* pBuffer, uint16_t Size); -uint32_t wm8994_Pause(uint16_t DeviceAddr); -uint32_t wm8994_Resume(uint16_t DeviceAddr); -uint32_t wm8994_Stop(uint16_t DeviceAddr, uint32_t Cmd); -uint32_t wm8994_SetVolume(uint16_t DeviceAddr, uint8_t Volume); -uint32_t wm8994_SetMute(uint16_t DeviceAddr, uint32_t Cmd); -uint32_t wm8994_SetOutputMode(uint16_t DeviceAddr, uint8_t Output); -uint32_t wm8994_SetFrequency(uint16_t DeviceAddr, uint32_t AudioFreq); -uint32_t wm8994_Reset(uint16_t DeviceAddr); - -/* AUDIO IO functions */ -void AUDIO_IO_Init(void); -void AUDIO_IO_DeInit(void); -void AUDIO_IO_Write(uint8_t Addr, uint16_t Reg, uint16_t Value); -uint8_t AUDIO_IO_Read(uint8_t Addr, uint16_t Reg); -void AUDIO_IO_Delay(uint32_t Delay); - -/* Audio driver structure */ -extern AUDIO_DrvTypeDef wm8994_drv; - -#endif /* __WM8994_H */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery.c --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery.c Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,902 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery.c - * @author MCD Application Team - * @brief This file provides a set of firmware functions to manage LEDs, - * push-buttons and COM ports available on STM32746G-Discovery - * board(MB1191) from STMicroelectronics. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Dependencies -- stm32f7xx_hal_cortex.c -- stm32f7xx_hal_gpio.c -- stm32f7xx_hal_uart.c -- stm32f7xx_hal_i2c.c -EndDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32746g_discovery.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_LOW_LEVEL STM32746G_DISCOVERY_LOW_LEVEL - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_LOW_LEVEL_Private_TypesDefinitions STM32746G_DISCOVERY_LOW_LEVEL Private Types Definitions - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_LOW_LEVEL_Private_Defines STM32746G_DISCOVERY_LOW_LEVEL Private Defines - * @{ - */ -/** - * @brief STM32746G DISCOVERY BSP Driver version number V2.0.2 - */ -#define __STM32746G_DISCO_BSP_VERSION_MAIN (0x02) /*!< [31:24] main version */ -#define __STM32746G_DISCO_BSP_VERSION_SUB1 (0x00) /*!< [23:16] sub1 version */ -#define __STM32746G_DISCO_BSP_VERSION_SUB2 (0x02) /*!< [15:8] sub2 version */ -#define __STM32746G_DISCO_BSP_VERSION_RC (0x00) /*!< [7:0] release candidate */ -#define __STM32746G_DISCO_BSP_VERSION ((__STM32746G_DISCO_BSP_VERSION_MAIN << 24)\ - |(__STM32746G_DISCO_BSP_VERSION_SUB1 << 16)\ - |(__STM32746G_DISCO_BSP_VERSION_SUB2 << 8 )\ - |(__STM32746G_DISCO_BSP_VERSION_RC)) -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_LOW_LEVEL_Private_Macros STM32746G_DISCOVERY_LOW_LEVEL Private Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_LOW_LEVEL_Private_Variables STM32746G_DISCOVERY_LOW_LEVEL Private Variables - * @{ - */ - -const uint32_t GPIO_PIN[LEDn] = {LED1_PIN}; - -GPIO_TypeDef* BUTTON_PORT[BUTTONn] = {WAKEUP_BUTTON_GPIO_PORT, - TAMPER_BUTTON_GPIO_PORT, - KEY_BUTTON_GPIO_PORT}; - -const uint16_t BUTTON_PIN[BUTTONn] = {WAKEUP_BUTTON_PIN, - TAMPER_BUTTON_PIN, - KEY_BUTTON_PIN}; - -const uint16_t BUTTON_IRQn[BUTTONn] = {WAKEUP_BUTTON_EXTI_IRQn, - TAMPER_BUTTON_EXTI_IRQn, - KEY_BUTTON_EXTI_IRQn}; - -USART_TypeDef* COM_USART[COMn] = {DISCOVERY_COM1}; - -GPIO_TypeDef* COM_TX_PORT[COMn] = {DISCOVERY_COM1_TX_GPIO_PORT}; - -GPIO_TypeDef* COM_RX_PORT[COMn] = {DISCOVERY_COM1_RX_GPIO_PORT}; - -const uint16_t COM_TX_PIN[COMn] = {DISCOVERY_COM1_TX_PIN}; - -const uint16_t COM_RX_PIN[COMn] = {DISCOVERY_COM1_RX_PIN}; - -const uint16_t COM_TX_AF[COMn] = {DISCOVERY_COM1_TX_AF}; - -const uint16_t COM_RX_AF[COMn] = {DISCOVERY_COM1_RX_AF}; - -static I2C_HandleTypeDef hI2cAudioHandler = {0}; -static I2C_HandleTypeDef hI2cExtHandler = {0}; - -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_LOW_LEVEL_Private_FunctionPrototypes STM32746G_DISCOVERY_LOW_LEVEL Private Function Prototypes - * @{ - */ -static void I2Cx_MspInit(I2C_HandleTypeDef *i2c_handler); -static void I2Cx_Init(I2C_HandleTypeDef *i2c_handler); - -static HAL_StatusTypeDef I2Cx_ReadMultiple(I2C_HandleTypeDef *i2c_handler, uint8_t Addr, uint16_t Reg, uint16_t MemAddSize, uint8_t *Buffer, uint16_t Length); -static HAL_StatusTypeDef I2Cx_WriteMultiple(I2C_HandleTypeDef *i2c_handler, uint8_t Addr, uint16_t Reg, uint16_t MemAddSize, uint8_t *Buffer, uint16_t Length); -static HAL_StatusTypeDef I2Cx_IsDeviceReady(I2C_HandleTypeDef *i2c_handler, uint16_t DevAddress, uint32_t Trials); -static void I2Cx_Error(I2C_HandleTypeDef *i2c_handler, uint8_t Addr); - -/* AUDIO IO functions */ -void AUDIO_IO_Init(void); -void AUDIO_IO_DeInit(void); -void AUDIO_IO_Write(uint8_t Addr, uint16_t Reg, uint16_t Value); -uint16_t AUDIO_IO_Read(uint8_t Addr, uint16_t Reg); -void AUDIO_IO_Delay(uint32_t Delay); - -/* TOUCHSCREEN IO functions */ -void TS_IO_Init(void); -void TS_IO_Write(uint8_t Addr, uint8_t Reg, uint8_t Value); -uint8_t TS_IO_Read(uint8_t Addr, uint8_t Reg); -void TS_IO_Delay(uint32_t Delay); - -/* CAMERA IO functions */ -void CAMERA_IO_Init(void); -void CAMERA_Delay(uint32_t Delay); -void CAMERA_IO_Write(uint8_t Addr, uint8_t Reg, uint8_t Value); -uint8_t CAMERA_IO_Read(uint8_t Addr, uint8_t Reg); - -/* I2C EEPROM IO function */ -void EEPROM_IO_Init(void); -HAL_StatusTypeDef EEPROM_IO_WriteData(uint16_t DevAddress, uint16_t MemAddress, uint8_t* pBuffer, uint32_t BufferSize); -HAL_StatusTypeDef EEPROM_IO_ReadData(uint16_t DevAddress, uint16_t MemAddress, uint8_t* pBuffer, uint32_t BufferSize); -HAL_StatusTypeDef EEPROM_IO_IsDeviceReady(uint16_t DevAddress, uint32_t Trials); -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_LOW_LEVEL_Exported_Functions STM32746G_DISCOVERY_LOW_LEVELSTM32746G_DISCOVERY_LOW_LEVEL Exported Functions - * @{ - */ - - /** - * @brief This method returns the STM32746G DISCOVERY BSP Driver revision - * @retval version: 0xXYZR (8bits for each decimal, R for RC) - */ -uint32_t BSP_GetVersion(void) -{ - return __STM32746G_DISCO_BSP_VERSION; -} - -/** - * @brief Configures LED on GPIO. - * @param Led: LED to be configured. - * This parameter can be one of the following values: - * @arg DISCO_LED1 - * @retval None - */ -void BSP_LED_Init(Led_TypeDef Led) -{ - GPIO_InitTypeDef gpio_init_structure; - GPIO_TypeDef* gpio_led; - - if (Led == DISCO_LED1) // MBED - { - gpio_led = LED1_GPIO_PORT; - /* Enable the GPIO_LED clock */ - LED1_GPIO_CLK_ENABLE(); - - /* Configure the GPIO_LED pin */ - gpio_init_structure.Pin = GPIO_PIN[Led]; - gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP; - gpio_init_structure.Pull = GPIO_PULLUP; - gpio_init_structure.Speed = GPIO_SPEED_HIGH; - - HAL_GPIO_Init(gpio_led, &gpio_init_structure); - - /* By default, turn off LED */ - HAL_GPIO_WritePin(gpio_led, GPIO_PIN[Led], GPIO_PIN_RESET); - } -} - -/** - * @brief DeInit LEDs. - * @param Led: LED to be configured. - * This parameter can be one of the following values: - * @arg DISCO_LED1 - * @note Led DeInit does not disable the GPIO clock - * @retval None - */ -void BSP_LED_DeInit(Led_TypeDef Led) -{ - GPIO_InitTypeDef gpio_init_structure; - GPIO_TypeDef* gpio_led; - - if (Led == DISCO_LED1) // MBED - { - gpio_led = LED1_GPIO_PORT; - /* Turn off LED */ - HAL_GPIO_WritePin(gpio_led, GPIO_PIN[Led], GPIO_PIN_RESET); - /* Configure the GPIO_LED pin */ - gpio_init_structure.Pin = GPIO_PIN[Led]; - HAL_GPIO_DeInit(gpio_led, gpio_init_structure.Pin); - } -} - -/** - * @brief Turns selected LED On. - * @param Led: LED to be set on - * This parameter can be one of the following values: - * @arg DISCO_LED1 - * @retval None - */ -void BSP_LED_On(Led_TypeDef Led) -{ - GPIO_TypeDef* gpio_led; - - if (Led == DISCO_LED1) /* Switch On LED connected to GPIO */ // MBED - { - gpio_led = LED1_GPIO_PORT; - HAL_GPIO_WritePin(gpio_led, GPIO_PIN[Led], GPIO_PIN_SET); - } -} - -/** - * @brief Turns selected LED Off. - * @param Led: LED to be set off - * This parameter can be one of the following values: - * @arg DISCO_LED1 - * @retval None - */ -void BSP_LED_Off(Led_TypeDef Led) -{ - GPIO_TypeDef* gpio_led; - - if (Led == DISCO_LED1) /* Switch Off LED connected to GPIO */ // MBED - { - gpio_led = LED1_GPIO_PORT; - HAL_GPIO_WritePin(gpio_led, GPIO_PIN[Led], GPIO_PIN_RESET); - } -} - -/** - * @brief Toggles the selected LED. - * @param Led: LED to be toggled - * This parameter can be one of the following values: - * @arg DISCO_LED1 - * @retval None - */ -void BSP_LED_Toggle(Led_TypeDef Led) -{ - GPIO_TypeDef* gpio_led; - - if (Led == DISCO_LED1) /* Toggle LED connected to GPIO */ // MBED - { - gpio_led = LED1_GPIO_PORT; - HAL_GPIO_TogglePin(gpio_led, GPIO_PIN[Led]); - } -} - -/** - * @brief Configures button GPIO and EXTI Line. - * @param Button: Button to be configured - * This parameter can be one of the following values: - * @arg BUTTON_WAKEUP: Wakeup Push Button - * @arg BUTTON_TAMPER: Tamper Push Button - * @arg BUTTON_KEY: Key Push Button - * @param ButtonMode: Button mode - * This parameter can be one of the following values: - * @arg BUTTON_MODE_GPIO: Button will be used as simple IO - * @arg BUTTON_MODE_EXTI: Button will be connected to EXTI line - * with interrupt generation capability - * @note On STM32746G-Discovery board, the three buttons (Wakeup, Tamper and key buttons) - * are mapped on the same push button named "User" - * on the board serigraphy. - * @retval None - */ -void BSP_PB_Init(Button_TypeDef Button, ButtonMode_TypeDef ButtonMode) -{ - GPIO_InitTypeDef gpio_init_structure; - - /* Enable the BUTTON clock */ - BUTTONx_GPIO_CLK_ENABLE(Button); - - if(ButtonMode == BUTTON_MODE_GPIO) - { - /* Configure Button pin as input */ - gpio_init_structure.Pin = BUTTON_PIN[Button]; - gpio_init_structure.Mode = GPIO_MODE_INPUT; - gpio_init_structure.Pull = GPIO_NOPULL; - gpio_init_structure.Speed = GPIO_SPEED_FAST; - HAL_GPIO_Init(BUTTON_PORT[Button], &gpio_init_structure); - } - - if(ButtonMode == BUTTON_MODE_EXTI) - { - /* Configure Button pin as input with External interrupt */ - gpio_init_structure.Pin = BUTTON_PIN[Button]; - gpio_init_structure.Pull = GPIO_NOPULL; - gpio_init_structure.Speed = GPIO_SPEED_FAST; - - if(Button != BUTTON_WAKEUP) - { - gpio_init_structure.Mode = GPIO_MODE_IT_FALLING; - } - else - { - gpio_init_structure.Mode = GPIO_MODE_IT_RISING; - } - - HAL_GPIO_Init(BUTTON_PORT[Button], &gpio_init_structure); - - /* Enable and set Button EXTI Interrupt to the lowest priority */ - HAL_NVIC_SetPriority((IRQn_Type)(BUTTON_IRQn[Button]), 0x0F, 0x00); - HAL_NVIC_EnableIRQ((IRQn_Type)(BUTTON_IRQn[Button])); - } -} - -/** - * @brief Push Button DeInit. - * @param Button: Button to be configured - * This parameter can be one of the following values: - * @arg BUTTON_WAKEUP: Wakeup Push Button - * @arg BUTTON_TAMPER: Tamper Push Button - * @arg BUTTON_KEY: Key Push Button - * @note On STM32746G-Discovery board, the three buttons (Wakeup, Tamper and key buttons) - * are mapped on the same push button named "User" - * on the board serigraphy. - * @note PB DeInit does not disable the GPIO clock - * @retval None - */ -void BSP_PB_DeInit(Button_TypeDef Button) -{ - GPIO_InitTypeDef gpio_init_structure; - - gpio_init_structure.Pin = BUTTON_PIN[Button]; - HAL_NVIC_DisableIRQ((IRQn_Type)(BUTTON_IRQn[Button])); - HAL_GPIO_DeInit(BUTTON_PORT[Button], gpio_init_structure.Pin); -} - - -/** - * @brief Returns the selected button state. - * @param Button: Button to be checked - * This parameter can be one of the following values: - * @arg BUTTON_WAKEUP: Wakeup Push Button - * @arg BUTTON_TAMPER: Tamper Push Button - * @arg BUTTON_KEY: Key Push Button - * @note On STM32746G-Discovery board, the three buttons (Wakeup, Tamper and key buttons) - * are mapped on the same push button named "User" - * on the board serigraphy. - * @retval The Button GPIO pin value - */ -uint32_t BSP_PB_GetState(Button_TypeDef Button) -{ - return HAL_GPIO_ReadPin(BUTTON_PORT[Button], BUTTON_PIN[Button]); -} - -/** - * @brief Configures COM port. - * @param COM: COM port to be configured. - * This parameter can be one of the following values: - * @arg COM1 - * @arg COM2 - * @param huart: Pointer to a UART_HandleTypeDef structure that contains the - * configuration information for the specified USART peripheral. - * @retval None - */ -void BSP_COM_Init(COM_TypeDef COM, UART_HandleTypeDef *huart) -{ - GPIO_InitTypeDef gpio_init_structure; - - /* Enable GPIO clock */ - DISCOVERY_COMx_TX_GPIO_CLK_ENABLE(COM); - DISCOVERY_COMx_RX_GPIO_CLK_ENABLE(COM); - - /* Enable USART clock */ - DISCOVERY_COMx_CLK_ENABLE(COM); - - /* Configure USART Tx as alternate function */ - gpio_init_structure.Pin = COM_TX_PIN[COM]; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Speed = GPIO_SPEED_FAST; - gpio_init_structure.Pull = GPIO_PULLUP; - gpio_init_structure.Alternate = COM_TX_AF[COM]; - HAL_GPIO_Init(COM_TX_PORT[COM], &gpio_init_structure); - - /* Configure USART Rx as alternate function */ - gpio_init_structure.Pin = COM_RX_PIN[COM]; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Alternate = COM_RX_AF[COM]; - HAL_GPIO_Init(COM_RX_PORT[COM], &gpio_init_structure); - - /* USART configuration */ - huart->Instance = COM_USART[COM]; - HAL_UART_Init(huart); -} - -/** - * @brief DeInit COM port. - * @param COM: COM port to be configured. - * This parameter can be one of the following values: - * @arg COM1 - * @arg COM2 - * @param huart: Pointer to a UART_HandleTypeDef structure that contains the - * configuration information for the specified USART peripheral. - * @retval None - */ -void BSP_COM_DeInit(COM_TypeDef COM, UART_HandleTypeDef *huart) -{ - /* USART configuration */ - huart->Instance = COM_USART[COM]; - HAL_UART_DeInit(huart); - - /* Enable USART clock */ - DISCOVERY_COMx_CLK_DISABLE(COM); - - /* DeInit GPIO pins can be done in the application - (by surcharging this __weak function) */ - - /* GPIO pins clock, DMA clock can be shut down in the application - by surcharging this __weak function */ -} - -/******************************************************************************* - BUS OPERATIONS -*******************************************************************************/ - -/******************************* I2C Routines *********************************/ -/** - * @brief Initializes I2C MSP. - * @param i2c_handler : I2C handler - * @retval None - */ -static void I2Cx_MspInit(I2C_HandleTypeDef *i2c_handler) -{ - GPIO_InitTypeDef gpio_init_structure; - - if (i2c_handler == (I2C_HandleTypeDef*)(&hI2cAudioHandler)) - { - /* AUDIO and LCD I2C MSP init */ - - /*** Configure the GPIOs ***/ - /* Enable GPIO clock */ - DISCOVERY_AUDIO_I2Cx_SCL_SDA_GPIO_CLK_ENABLE(); - - /* Configure I2C Tx as alternate function */ - gpio_init_structure.Pin = DISCOVERY_AUDIO_I2Cx_SCL_PIN; - gpio_init_structure.Mode = GPIO_MODE_AF_OD; - gpio_init_structure.Pull = GPIO_NOPULL; - gpio_init_structure.Speed = GPIO_SPEED_FAST; - gpio_init_structure.Alternate = DISCOVERY_AUDIO_I2Cx_SCL_SDA_AF; - HAL_GPIO_Init(DISCOVERY_AUDIO_I2Cx_SCL_SDA_GPIO_PORT, &gpio_init_structure); - - /* Configure I2C Rx as alternate function */ - gpio_init_structure.Pin = DISCOVERY_AUDIO_I2Cx_SDA_PIN; - HAL_GPIO_Init(DISCOVERY_AUDIO_I2Cx_SCL_SDA_GPIO_PORT, &gpio_init_structure); - - /*** Configure the I2C peripheral ***/ - /* Enable I2C clock */ - DISCOVERY_AUDIO_I2Cx_CLK_ENABLE(); - - /* Force the I2C peripheral clock reset */ - DISCOVERY_AUDIO_I2Cx_FORCE_RESET(); - - /* Release the I2C peripheral clock reset */ - DISCOVERY_AUDIO_I2Cx_RELEASE_RESET(); - - /* Enable and set I2Cx Interrupt to a lower priority */ - HAL_NVIC_SetPriority(DISCOVERY_AUDIO_I2Cx_EV_IRQn, 0x0F, 0); - HAL_NVIC_EnableIRQ(DISCOVERY_AUDIO_I2Cx_EV_IRQn); - - /* Enable and set I2Cx Interrupt to a lower priority */ - HAL_NVIC_SetPriority(DISCOVERY_AUDIO_I2Cx_ER_IRQn, 0x0F, 0); - HAL_NVIC_EnableIRQ(DISCOVERY_AUDIO_I2Cx_ER_IRQn); - } - else - { - /* External, camera and Arduino connector I2C MSP init */ - - /*** Configure the GPIOs ***/ - /* Enable GPIO clock */ - DISCOVERY_EXT_I2Cx_SCL_SDA_GPIO_CLK_ENABLE(); - - /* Configure I2C Tx as alternate function */ - gpio_init_structure.Pin = DISCOVERY_EXT_I2Cx_SCL_PIN; - gpio_init_structure.Mode = GPIO_MODE_AF_OD; - gpio_init_structure.Pull = GPIO_NOPULL; - gpio_init_structure.Speed = GPIO_SPEED_FAST; - gpio_init_structure.Alternate = DISCOVERY_EXT_I2Cx_SCL_SDA_AF; - HAL_GPIO_Init(DISCOVERY_EXT_I2Cx_SCL_SDA_GPIO_PORT, &gpio_init_structure); - - /* Configure I2C Rx as alternate function */ - gpio_init_structure.Pin = DISCOVERY_EXT_I2Cx_SDA_PIN; - HAL_GPIO_Init(DISCOVERY_EXT_I2Cx_SCL_SDA_GPIO_PORT, &gpio_init_structure); - - /*** Configure the I2C peripheral ***/ - /* Enable I2C clock */ - DISCOVERY_EXT_I2Cx_CLK_ENABLE(); - - /* Force the I2C peripheral clock reset */ - DISCOVERY_EXT_I2Cx_FORCE_RESET(); - - /* Release the I2C peripheral clock reset */ - DISCOVERY_EXT_I2Cx_RELEASE_RESET(); - - /* Enable and set I2Cx Interrupt to a lower priority */ - HAL_NVIC_SetPriority(DISCOVERY_EXT_I2Cx_EV_IRQn, 0x0F, 0); - HAL_NVIC_EnableIRQ(DISCOVERY_EXT_I2Cx_EV_IRQn); - - /* Enable and set I2Cx Interrupt to a lower priority */ - HAL_NVIC_SetPriority(DISCOVERY_EXT_I2Cx_ER_IRQn, 0x0F, 0); - HAL_NVIC_EnableIRQ(DISCOVERY_EXT_I2Cx_ER_IRQn); - } -} - -/** - * @brief Initializes I2C HAL. - * @param i2c_handler : I2C handler - * @retval None - */ -static void I2Cx_Init(I2C_HandleTypeDef *i2c_handler) -{ - if(HAL_I2C_GetState(i2c_handler) == HAL_I2C_STATE_RESET) - { - if (i2c_handler == (I2C_HandleTypeDef*)(&hI2cAudioHandler)) - { - /* Audio and LCD I2C configuration */ - i2c_handler->Instance = DISCOVERY_AUDIO_I2Cx; - } - else - { - /* External, camera and Arduino connector I2C configuration */ - i2c_handler->Instance = DISCOVERY_EXT_I2Cx; - } - i2c_handler->Init.Timing = DISCOVERY_I2Cx_TIMING; - i2c_handler->Init.OwnAddress1 = 0; - i2c_handler->Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; - i2c_handler->Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; - i2c_handler->Init.OwnAddress2 = 0; - i2c_handler->Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; - i2c_handler->Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - - /* Init the I2C */ - I2Cx_MspInit(i2c_handler); - HAL_I2C_Init(i2c_handler); - } -} - -/** - * @brief Reads multiple data. - * @param i2c_handler : I2C handler - * @param Addr: I2C address - * @param Reg: Reg address - * @param MemAddress: Memory address - * @param Buffer: Pointer to data buffer - * @param Length: Length of the data - * @retval Number of read data - */ -static HAL_StatusTypeDef I2Cx_ReadMultiple(I2C_HandleTypeDef *i2c_handler, - uint8_t Addr, - uint16_t Reg, - uint16_t MemAddress, - uint8_t *Buffer, - uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - - status = HAL_I2C_Mem_Read(i2c_handler, Addr, (uint16_t)Reg, MemAddress, Buffer, Length, 1000); - - /* Check the communication status */ - if(status != HAL_OK) - { - /* I2C error occurred */ - I2Cx_Error(i2c_handler, Addr); - } - return status; -} - -/** - * @brief Writes a value in a register of the device through BUS in using DMA mode. - * @param i2c_handler : I2C handler - * @param Addr: Device address on BUS Bus. - * @param Reg: The target register address to write - * @param MemAddress: Memory address - * @param Buffer: The target register value to be written - * @param Length: buffer size to be written - * @retval HAL status - */ -static HAL_StatusTypeDef I2Cx_WriteMultiple(I2C_HandleTypeDef *i2c_handler, - uint8_t Addr, - uint16_t Reg, - uint16_t MemAddress, - uint8_t *Buffer, - uint16_t Length) -{ - HAL_StatusTypeDef status = HAL_OK; - - status = HAL_I2C_Mem_Write(i2c_handler, Addr, (uint16_t)Reg, MemAddress, Buffer, Length, 1000); - - /* Check the communication status */ - if(status != HAL_OK) - { - /* Re-Initiaize the I2C Bus */ - I2Cx_Error(i2c_handler, Addr); - } - return status; -} - -/** - * @brief Checks if target device is ready for communication. - * @note This function is used with Memory devices - * @param i2c_handler : I2C handler - * @param DevAddress: Target device address - * @param Trials: Number of trials - * @retval HAL status - */ -static HAL_StatusTypeDef I2Cx_IsDeviceReady(I2C_HandleTypeDef *i2c_handler, uint16_t DevAddress, uint32_t Trials) -{ - return (HAL_I2C_IsDeviceReady(i2c_handler, DevAddress, Trials, 1000)); -} - -/** - * @brief Manages error callback by re-initializing I2C. - * @param i2c_handler : I2C handler - * @param Addr: I2C Address - * @retval None - */ -static void I2Cx_Error(I2C_HandleTypeDef *i2c_handler, uint8_t Addr) -{ - /* De-initialize the I2C communication bus */ - HAL_I2C_DeInit(i2c_handler); - - /* Re-Initialize the I2C communication bus */ - I2Cx_Init(i2c_handler); -} - -/******************************************************************************* - LINK OPERATIONS -*******************************************************************************/ - -/********************************* LINK AUDIO *********************************/ - -/** - * @brief Initializes Audio low level. - * @retval None - */ -void AUDIO_IO_Init(void) -{ - I2Cx_Init(&hI2cAudioHandler); -} - -/** - * @brief Deinitializes Audio low level. - * @retval None - */ -void AUDIO_IO_DeInit(void) -{ -} - -/** - * @brief Writes a single data. - * @param Addr: I2C address - * @param Reg: Reg address - * @param Value: Data to be written - * @retval None - */ -void AUDIO_IO_Write(uint8_t Addr, uint16_t Reg, uint16_t Value) -{ - uint16_t tmp = Value; - - Value = ((uint16_t)(tmp >> 8) & 0x00FF); - - Value |= ((uint16_t)(tmp << 8)& 0xFF00); - - I2Cx_WriteMultiple(&hI2cAudioHandler, Addr, Reg, I2C_MEMADD_SIZE_16BIT,(uint8_t*)&Value, 2); -} - -/** - * @brief Reads a single data. - * @param Addr: I2C address - * @param Reg: Reg address - * @retval Data to be read - */ -uint16_t AUDIO_IO_Read(uint8_t Addr, uint16_t Reg) -{ - uint16_t read_value = 0, tmp = 0; - - I2Cx_ReadMultiple(&hI2cAudioHandler, Addr, Reg, I2C_MEMADD_SIZE_16BIT, (uint8_t*)&read_value, 2); - - tmp = ((uint16_t)(read_value >> 8) & 0x00FF); - - tmp |= ((uint16_t)(read_value << 8)& 0xFF00); - - read_value = tmp; - - return read_value; -} - -/** - * @brief AUDIO Codec delay - * @param Delay: Delay in ms - * @retval None - */ -void AUDIO_IO_Delay(uint32_t Delay) -{ - HAL_Delay(Delay); -} - -/********************************* LINK CAMERA ********************************/ - -/** - * @brief Initializes Camera low level. - * @retval None - */ -void CAMERA_IO_Init(void) -{ - I2Cx_Init(&hI2cExtHandler); -} - -/** - * @brief Camera writes single data. - * @param Addr: I2C address - * @param Reg: Register address - * @param Value: Data to be written - * @retval None - */ -void CAMERA_IO_Write(uint8_t Addr, uint8_t Reg, uint8_t Value) -{ - I2Cx_WriteMultiple(&hI2cExtHandler, Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT,(uint8_t*)&Value, 1); -} - -/** - * @brief Camera reads single data. - * @param Addr: I2C address - * @param Reg: Register address - * @retval Read data - */ -uint8_t CAMERA_IO_Read(uint8_t Addr, uint8_t Reg) -{ - uint8_t read_value = 0; - - I2Cx_ReadMultiple(&hI2cExtHandler, Addr, Reg, I2C_MEMADD_SIZE_8BIT, (uint8_t*)&read_value, 1); - - return read_value; -} - -/** - * @brief Camera delay - * @param Delay: Delay in ms - * @retval None - */ -void CAMERA_Delay(uint32_t Delay) -{ - HAL_Delay(Delay); -} - -/******************************** LINK I2C EEPROM *****************************/ - -/** - * @brief Initializes peripherals used by the I2C EEPROM driver. - * @retval None - */ -void EEPROM_IO_Init(void) -{ - I2Cx_Init(&hI2cExtHandler); -} - -/** - * @brief Write data to I2C EEPROM driver in using DMA channel. - * @param DevAddress: Target device address - * @param MemAddress: Internal memory address - * @param pBuffer: Pointer to data buffer - * @param BufferSize: Amount of data to be sent - * @retval HAL status - */ -HAL_StatusTypeDef EEPROM_IO_WriteData(uint16_t DevAddress, uint16_t MemAddress, uint8_t* pBuffer, uint32_t BufferSize) -{ - return (I2Cx_WriteMultiple(&hI2cExtHandler, DevAddress, MemAddress, I2C_MEMADD_SIZE_16BIT, pBuffer, BufferSize)); -} - -/** - * @brief Read data from I2C EEPROM driver in using DMA channel. - * @param DevAddress: Target device address - * @param MemAddress: Internal memory address - * @param pBuffer: Pointer to data buffer - * @param BufferSize: Amount of data to be read - * @retval HAL status - */ -HAL_StatusTypeDef EEPROM_IO_ReadData(uint16_t DevAddress, uint16_t MemAddress, uint8_t* pBuffer, uint32_t BufferSize) -{ - return (I2Cx_ReadMultiple(&hI2cExtHandler, DevAddress, MemAddress, I2C_MEMADD_SIZE_16BIT, pBuffer, BufferSize)); -} - -/** - * @brief Checks if target device is ready for communication. - * @note This function is used with Memory devices - * @param DevAddress: Target device address - * @param Trials: Number of trials - * @retval HAL status - */ -HAL_StatusTypeDef EEPROM_IO_IsDeviceReady(uint16_t DevAddress, uint32_t Trials) -{ - return (I2Cx_IsDeviceReady(&hI2cExtHandler, DevAddress, Trials)); -} - -/********************************* LINK TOUCHSCREEN *********************************/ - -/** - * @brief Initializes Touchscreen low level. - * @retval None - */ -void TS_IO_Init(void) -{ - I2Cx_Init(&hI2cAudioHandler); -} - -/** - * @brief Writes a single data. - * @param Addr: I2C address - * @param Reg: Reg address - * @param Value: Data to be written - * @retval None - */ -void TS_IO_Write(uint8_t Addr, uint8_t Reg, uint8_t Value) -{ - I2Cx_WriteMultiple(&hI2cAudioHandler, Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT,(uint8_t*)&Value, 1); -} - -/** - * @brief Reads a single data. - * @param Addr: I2C address - * @param Reg: Reg address - * @retval Data to be read - */ -uint8_t TS_IO_Read(uint8_t Addr, uint8_t Reg) -{ - uint8_t read_value = 0; - - I2Cx_ReadMultiple(&hI2cAudioHandler, Addr, Reg, I2C_MEMADD_SIZE_8BIT, (uint8_t*)&read_value, 1); - - return read_value; -} - -/** - * @brief TS delay - * @param Delay: Delay in ms - * @retval None - */ -void TS_IO_Delay(uint32_t Delay) -{ - HAL_Delay(Delay); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery.h --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,339 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery.h - * @author MCD Application Team - * @brief This file contains definitions for STM32746G_DISCOVERY's LEDs, - * push-buttons and COM ports hardware resources. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32746G_DISCOVERY_H -#define __STM32746G_DISCOVERY_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f7xx_hal.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY_LOW_LEVEL - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_LOW_LEVEL_Exported_Types STM32746G_DISCOVERY_LOW_LEVEL Exported Types - * @{ - */ -typedef enum -{ - DISCO_LED1 = 0, // MBED - LED_GREEN = DISCO_LED1, // MBED -}Led_TypeDef; - -typedef enum -{ - BUTTON_WAKEUP = 0, - BUTTON_TAMPER = 1, - BUTTON_KEY = 2 -}Button_TypeDef; - -typedef enum -{ - BUTTON_MODE_GPIO = 0, - BUTTON_MODE_EXTI = 1 -}ButtonMode_TypeDef; - -typedef enum -{ - COM1 = 0, - COM2 = 1 -}COM_TypeDef; -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_LOW_LEVEL_Exported_Constants STM32746G_DISCOVERY_LOW_LEVEL Exported Constants - * @{ - */ - -/** - * @brief Define for STM32746G_DISCOVERY board - */ -#if !defined (USE_STM32746G_DISCO) - #define USE_STM32746G_DISCO -#endif - -/** @addtogroup STM32746G_DISCOVERY_LOW_LEVEL_LED - * @{ - */ - -#define LEDn ((uint8_t)1) - -#define LED1_GPIO_PORT GPIOI -#define LED1_GPIO_CLK_ENABLE() __HAL_RCC_GPIOI_CLK_ENABLE() -#define LED1_GPIO_CLK_DISABLE() __HAL_RCC_GPIOI_CLK_DISABLE() -#define LED1_PIN GPIO_PIN_1 - -/** - * @} - */ - -/** @addtogroup STM32746G_DISCOVERY_LOW_LEVEL_BUTTON - * @{ - */ -#define BUTTONn ((uint8_t)3) - -/** - * @brief Wakeup push-button - */ -#define WAKEUP_BUTTON_PIN GPIO_PIN_11 -#define WAKEUP_BUTTON_GPIO_PORT GPIOI -#define WAKEUP_BUTTON_GPIO_CLK_ENABLE() __HAL_RCC_GPIOI_CLK_ENABLE() -#define WAKEUP_BUTTON_GPIO_CLK_DISABLE() __HAL_RCC_GPIOI_CLK_DISABLE() -#define WAKEUP_BUTTON_EXTI_IRQn EXTI15_10_IRQn - -/** - * @brief Tamper push-button - */ -#define TAMPER_BUTTON_PIN GPIO_PIN_11 -#define TAMPER_BUTTON_GPIO_PORT GPIOI -#define TAMPER_BUTTON_GPIO_CLK_ENABLE() __HAL_RCC_GPIOI_CLK_ENABLE() -#define TAMPER_BUTTON_GPIO_CLK_DISABLE() __HAL_RCC_GPIOI_CLK_DISABLE() -#define TAMPER_BUTTON_EXTI_IRQn EXTI15_10_IRQn - -/** - * @brief Key push-button - */ -#define KEY_BUTTON_PIN GPIO_PIN_11 -#define KEY_BUTTON_GPIO_PORT GPIOI -#define KEY_BUTTON_GPIO_CLK_ENABLE() __HAL_RCC_GPIOI_CLK_ENABLE() -#define KEY_BUTTON_GPIO_CLK_DISABLE() __HAL_RCC_GPIOI_CLK_DISABLE() -#define KEY_BUTTON_EXTI_IRQn EXTI15_10_IRQn - -#define BUTTONx_GPIO_CLK_ENABLE(__INDEX__) do { if((__INDEX__) == 0) WAKEUP_BUTTON_GPIO_CLK_ENABLE(); else\ - if((__INDEX__) == 1) TAMPER_BUTTON_GPIO_CLK_ENABLE(); else\ - KEY_BUTTON_GPIO_CLK_ENABLE(); } while(0) - -#define BUTTONx_GPIO_CLK_DISABLE(__INDEX__) (((__INDEX__) == 0) ? WAKEUP_BUTTON_GPIO_CLK_DISABLE() :\ - ((__INDEX__) == 1) ? TAMPER_BUTTON_GPIO_CLK_DISABLE() : KEY_BUTTON_GPIO_CLK_DISABLE()) - -/** - * @} - */ - -/** @addtogroup STM32746G_DISCOVERY_LOW_LEVEL_SIGNAL - * @{ - */ -#define SIGNALn ((uint8_t)1) - -/** - * @brief SD-detect signal - */ -#define SD_DETECT_PIN GPIO_PIN_13 -#define SD_DETECT_GPIO_PORT GPIOC -#define SD_DETECT_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() -#define SD_DETECT_GPIO_CLK_DISABLE() __HAL_RCC_GPIOC_CLK_DISABLE() -#define SD_DETECT_EXTI_IRQn EXTI15_10_IRQn - -/** - * @brief Touch screen interrupt signal - */ -#define TS_INT_PIN GPIO_PIN_13 -#define TS_INT_GPIO_PORT GPIOI -#define TS_INT_GPIO_CLK_ENABLE() __HAL_RCC_GPIOI_CLK_ENABLE() -#define TS_INT_GPIO_CLK_DISABLE() __HAL_RCC_GPIOI_CLK_DISABLE() -#define TS_INT_EXTI_IRQn EXTI15_10_IRQn - -/** - * @} - */ - -/** @addtogroup STM32746G_DISCOVERY_LOW_LEVEL_COM - * @{ - */ -#define COMn ((uint8_t)1) - -/** - * @brief Definition for COM port1, connected to USART1 - */ -#define DISCOVERY_COM1 USART1 -#define DISCOVERY_COM1_CLK_ENABLE() __HAL_RCC_USART1_CLK_ENABLE() -#define DISCOVERY_COM1_CLK_DISABLE() __HAL_RCC_USART1_CLK_DISABLE() - -#define DISCOVERY_COM1_TX_PIN GPIO_PIN_9 -#define DISCOVERY_COM1_TX_GPIO_PORT GPIOA -#define DISCOVERY_COM1_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() -#define DISCOVERY_COM1_TX_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE() -#define DISCOVERY_COM1_TX_AF GPIO_AF7_USART1 - -#define DISCOVERY_COM1_RX_PIN GPIO_PIN_7 -#define DISCOVERY_COM1_RX_GPIO_PORT GPIOB -#define DISCOVERY_COM1_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() -#define DISCOVERY_COM1_RX_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE() -#define DISCOVERY_COM1_RX_AF GPIO_AF7_USART1 - -#define DISCOVERY_COM1_IRQn USART1_IRQn - -#define DISCOVERY_COMx_CLK_ENABLE(__INDEX__) do { if((__INDEX__) == COM1) DISCOVERY_COM1_CLK_ENABLE(); } while(0) -#define DISCOVERY_COMx_CLK_DISABLE(__INDEX__) (((__INDEX__) == 0) ? DISCOVERY_COM1_CLK_DISABLE() : 0) - -#define DISCOVERY_COMx_TX_GPIO_CLK_ENABLE(__INDEX__) do { if((__INDEX__) == COM1) DISCOVERY_COM1_TX_GPIO_CLK_ENABLE(); } while(0) -#define DISCOVERY_COMx_TX_GPIO_CLK_DISABLE(__INDEX__) (((__INDEX__) == 0) ? DISCOVERY_COM1_TX_GPIO_CLK_DISABLE() : 0) - -#define DISCOVERY_COMx_RX_GPIO_CLK_ENABLE(__INDEX__) do { if((__INDEX__) == COM1) DISCOVERY_COM1_RX_GPIO_CLK_ENABLE(); } while(0) -#define DISCOVERY_COMx_RX_GPIO_CLK_DISABLE(__INDEX__) (((__INDEX__) == 0) ? DISCOVERY_COM1_RX_GPIO_CLK_DISABLE() : 0) - -/* Exported constant IO ------------------------------------------------------*/ - -#define LCD_I2C_ADDRESS ((uint16_t)0x70) -#define CAMERA_I2C_ADDRESS ((uint16_t)0x60) -#define AUDIO_I2C_ADDRESS ((uint16_t)0x34) -#define EEPROM_I2C_ADDRESS_A01 ((uint16_t)0xA0) -#define EEPROM_I2C_ADDRESS_A02 ((uint16_t)0xA6) -#define TS_I2C_ADDRESS ((uint16_t)0x70) - -/* I2C clock speed configuration (in Hz) - WARNING: - Make sure that this define is not already declared in other files (ie. - stm32746g_discovery.h file). It can be used in parallel by other modules. */ -#ifndef I2C_SPEED - #define I2C_SPEED ((uint32_t)100000) -#endif /* I2C_SPEED */ - -/* User can use this section to tailor I2Cx/I2Cx instance used and associated - resources */ -/* Definition for AUDIO and LCD I2Cx resources */ -#define DISCOVERY_AUDIO_I2Cx I2C3 -#define DISCOVERY_AUDIO_I2Cx_CLK_ENABLE() __HAL_RCC_I2C3_CLK_ENABLE() -#define DISCOVERY_AUDIO_DMAx_CLK_ENABLE() __HAL_RCC_DMA1_CLK_ENABLE() -#define DISCOVERY_AUDIO_I2Cx_SCL_SDA_GPIO_CLK_ENABLE() __HAL_RCC_GPIOH_CLK_ENABLE() - -#define DISCOVERY_AUDIO_I2Cx_FORCE_RESET() __HAL_RCC_I2C3_FORCE_RESET() -#define DISCOVERY_AUDIO_I2Cx_RELEASE_RESET() __HAL_RCC_I2C3_RELEASE_RESET() - -/* Definition for I2Cx Pins */ -#define DISCOVERY_AUDIO_I2Cx_SCL_PIN GPIO_PIN_7 -#define DISCOVERY_AUDIO_I2Cx_SCL_SDA_GPIO_PORT GPIOH -#define DISCOVERY_AUDIO_I2Cx_SCL_SDA_AF GPIO_AF4_I2C3 -#define DISCOVERY_AUDIO_I2Cx_SDA_PIN GPIO_PIN_8 - -/* I2C interrupt requests */ -#define DISCOVERY_AUDIO_I2Cx_EV_IRQn I2C3_EV_IRQn -#define DISCOVERY_AUDIO_I2Cx_ER_IRQn I2C3_ER_IRQn - -/* Definition for external, camera and Arduino connector I2Cx resources */ -#define DISCOVERY_EXT_I2Cx I2C1 -#define DISCOVERY_EXT_I2Cx_CLK_ENABLE() __HAL_RCC_I2C1_CLK_ENABLE() -#define DISCOVERY_EXT_DMAx_CLK_ENABLE() __HAL_RCC_DMA1_CLK_ENABLE() -#define DISCOVERY_EXT_I2Cx_SCL_SDA_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() - -#define DISCOVERY_EXT_I2Cx_FORCE_RESET() __HAL_RCC_I2C1_FORCE_RESET() -#define DISCOVERY_EXT_I2Cx_RELEASE_RESET() __HAL_RCC_I2C1_RELEASE_RESET() - -/* Definition for I2Cx Pins */ -#define DISCOVERY_EXT_I2Cx_SCL_PIN GPIO_PIN_8 -#define DISCOVERY_EXT_I2Cx_SCL_SDA_GPIO_PORT GPIOB -#define DISCOVERY_EXT_I2Cx_SCL_SDA_AF GPIO_AF4_I2C1 -#define DISCOVERY_EXT_I2Cx_SDA_PIN GPIO_PIN_9 - -/* I2C interrupt requests */ -#define DISCOVERY_EXT_I2Cx_EV_IRQn I2C1_EV_IRQn -#define DISCOVERY_EXT_I2Cx_ER_IRQn I2C1_ER_IRQn - -/* I2C TIMING Register define when I2C clock source is SYSCLK */ -/* I2C TIMING is calculated from APB1 source clock = 50 MHz */ -/* Due to the big MOFSET capacity for adapting the camera level the rising time is very large (>1us) */ -/* 0x40912732 takes in account the big rising and aims a clock of 100khz */ -#ifndef DISCOVERY_I2Cx_TIMING -#define DISCOVERY_I2Cx_TIMING ((uint32_t)0x40912732) -#endif /* DISCOVERY_I2Cx_TIMING */ - -/** - * @} - */ - -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_LOW_LEVEL_Exported_Macros STM32746G_DISCOVERY_LOW_LEVEL Exported Macros - * @{ - */ -/** - * @} - */ - -/** @addtogroup STM32746G_DISCOVERY_LOW_LEVEL_Exported_Functions - * @{ - */ -uint32_t BSP_GetVersion(void); -void BSP_LED_Init(Led_TypeDef Led); -void BSP_LED_DeInit(Led_TypeDef Led); -void BSP_LED_On(Led_TypeDef Led); -void BSP_LED_Off(Led_TypeDef Led); -void BSP_LED_Toggle(Led_TypeDef Led); -void BSP_PB_Init(Button_TypeDef Button, ButtonMode_TypeDef ButtonMode); -void BSP_PB_DeInit(Button_TypeDef Button); -uint32_t BSP_PB_GetState(Button_TypeDef Button); -void BSP_COM_Init(COM_TypeDef COM, UART_HandleTypeDef *husart); -void BSP_COM_DeInit(COM_TypeDef COM, UART_HandleTypeDef *huart); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32746G_DISCOVERY_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_audio.c --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_audio.c Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1401 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery_audio.c - * @author MCD Application Team - * @brief This file provides the Audio driver for the STM32746G-Discovery board. - @verbatim - How To use this driver: - ----------------------- - + This driver supports STM32F7xx devices on STM32746G-Discovery (MB1191) board. - + Call the function BSP_AUDIO_OUT_Init( - OutputDevice: physical output mode (OUTPUT_DEVICE_SPEAKER, - OUTPUT_DEVICE_HEADPHONE or OUTPUT_DEVICE_BOTH) - Volume : Initial volume to be set (0 is min (mute), 100 is max (100%) - AudioFreq : Audio frequency in Hz (8000, 16000, 22500, 32000...) - this parameter is relative to the audio file/stream type. - ) - This function configures all the hardware required for the audio application (codec, I2C, SAI, - GPIOs, DMA and interrupt if needed). This function returns AUDIO_OK if configuration is OK. - If the returned value is different from AUDIO_OK or the function is stuck then the communication with - the codec or the MFX has failed (try to un-plug the power or reset device in this case). - - OUTPUT_DEVICE_SPEAKER : only speaker will be set as output for the audio stream. - - OUTPUT_DEVICE_HEADPHONE: only headphones will be set as output for the audio stream. - - OUTPUT_DEVICE_BOTH : both Speaker and Headphone are used as outputs for the audio stream - at the same time. - Note. On STM32746G-Discovery SAI_DMA is configured in CIRCULAR mode. Due to this the application - does NOT need to call BSP_AUDIO_OUT_ChangeBuffer() to assure streaming. - + Call the function BSP_DISCOVERY_AUDIO_OUT_Play( - pBuffer: pointer to the audio data file address - Size : size of the buffer to be sent in Bytes - ) - to start playing (for the first time) from the audio file/stream. - + Call the function BSP_AUDIO_OUT_Pause() to pause playing - + Call the function BSP_AUDIO_OUT_Resume() to resume playing. - Note. After calling BSP_AUDIO_OUT_Pause() function for pause, only BSP_AUDIO_OUT_Resume() should be called - for resume (it is not allowed to call BSP_AUDIO_OUT_Play() in this case). - Note. This function should be called only when the audio file is played or paused (not stopped). - + For each mode, you may need to implement the relative callback functions into your code. - The Callback functions are named AUDIO_OUT_XXX_CallBack() and only their prototypes are declared in - the stm32746g_discovery_audio.h file. (refer to the example for more details on the callbacks implementations) - + To Stop playing, to modify the volume level, the frequency, the audio frame slot, - the device output mode the mute or the stop, use the functions: BSP_AUDIO_OUT_SetVolume(), - AUDIO_OUT_SetFrequency(), BSP_AUDIO_OUT_SetAudioFrameSlot(), BSP_AUDIO_OUT_SetOutputMode(), - BSP_AUDIO_OUT_SetMute() and BSP_AUDIO_OUT_Stop(). - + The driver API and the callback functions are at the end of the stm32746g_discovery_audio.h file. - - Driver architecture: - -------------------- - + This driver provides the High Audio Layer: consists of the function API exported in the stm32746g_discovery_audio.h file - (BSP_AUDIO_OUT_Init(), BSP_AUDIO_OUT_Play() ...) - + This driver provide also the Media Access Layer (MAL): which consists of functions allowing to access the media containing/ - providing the audio file/stream. These functions are also included as local functions into - the stm32746g_discovery_audio_codec.c file (SAIx_Out_Init() and SAIx_Out_DeInit(), SAIx_In_Init() and SAIx_In_DeInit()) - - Known Limitations: - ------------------ - 1- If the TDM Format used to play in parallel 2 audio Stream (the first Stream is configured in codec SLOT0 and second - Stream in SLOT1) the Pause/Resume, volume and mute feature will control the both streams. - 2- Parsing of audio file is not implemented (in order to determine audio file properties: Mono/Stereo, Data size, - File size, Audio Frequency, Audio Data header size ...). The configuration is fixed for the given audio file. - 3- Supports only Stereo audio streaming. - 4- Supports only 16-bits audio data size. - @endverbatim - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Dependencies -- stm32746g_discovery.c -- stm32f7xx_hal_sai.c -- stm32f7xx_hal_dma.c -- stm32f7xx_hal_gpio.c -- stm32f7xx_hal_cortex.c -- stm32f7xx_hal_rcc_ex.h -- wm8994.c -EndDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32746g_discovery_audio.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_AUDIO STM32746G_DISCOVERY AUDIO - * @brief This file includes the low layer driver for wm8994 Audio Codec - * available on STM32746G-Discovery board(MB1191). - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_AUDIO_Private_Types STM32746G_DISCOVERY AUDIO Private Types - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_AUDIO_Private_Defines STM32746G_DISCOVERY AUDIO Private Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_AUDIO_Private_Macros STM32746G_DISCOVERY AUDIO Private Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_AUDIO_Private_Variables STM32746G_DISCOVERY AUDIO Private Variables - * @{ - */ -AUDIO_DrvTypeDef *audio_drv; -SAI_HandleTypeDef haudio_out_sai={0}; -SAI_HandleTypeDef haudio_in_sai={0}; -TIM_HandleTypeDef haudio_tim; - -uint16_t __IO AudioInVolume = DEFAULT_AUDIO_IN_VOLUME; - -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_AUDIO_Private_Function_Prototypes STM32746G_DISCOVERY AUDIO Private Function Prototypes - * @{ - */ -static void SAIx_Out_Init(uint32_t AudioFreq); -static void SAIx_Out_DeInit(void); -static void SAIx_In_Init(uint32_t SaiOutMode, uint32_t SlotActive, uint32_t AudioFreq); -static void SAIx_In_DeInit(void); -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_AUDIO_OUT_Exported_Functions STM32746G_DISCOVERY AUDIO Out Exported Functions - * @{ - */ - -/** - * @brief Configures the audio peripherals. - * @param OutputDevice: OUTPUT_DEVICE_SPEAKER, OUTPUT_DEVICE_HEADPHONE, - * or OUTPUT_DEVICE_BOTH. - * @param Volume: Initial volume level (from 0 (Mute) to 100 (Max)) - * @param AudioFreq: Audio frequency used to play the audio stream. - * @note The I2S PLL input clock must be done in the user application. - * @retval AUDIO_OK if correct communication, else wrong communication - */ -uint8_t BSP_AUDIO_OUT_Init(uint16_t OutputDevice, uint8_t Volume, uint32_t AudioFreq) -{ - uint8_t ret = AUDIO_ERROR; - uint32_t deviceid = 0x00; - - /* Disable SAI */ - SAIx_Out_DeInit(); - - /* PLL clock is set depending on the AudioFreq (44.1khz vs 48khz groups) */ - BSP_AUDIO_OUT_ClockConfig(&haudio_out_sai, AudioFreq, NULL); - - /* SAI data transfer preparation: - Prepare the Media to be used for the audio transfer from memory to SAI peripheral */ - haudio_out_sai.Instance = AUDIO_OUT_SAIx; - if(HAL_SAI_GetState(&haudio_out_sai) == HAL_SAI_STATE_RESET) - { - /* Init the SAI MSP: this __weak function can be redefined by the application*/ - BSP_AUDIO_OUT_MspInit(&haudio_out_sai, NULL); - } - SAIx_Out_Init(AudioFreq); - - /* wm8994 codec initialization */ - deviceid = wm8994_drv.ReadID(AUDIO_I2C_ADDRESS); - - if((deviceid) == WM8994_ID) - { - /* Reset the Codec Registers */ - wm8994_drv.Reset(AUDIO_I2C_ADDRESS); - /* Initialize the audio driver structure */ - audio_drv = &wm8994_drv; - ret = AUDIO_OK; - } - else - { - ret = AUDIO_ERROR; - } - - if(ret == AUDIO_OK) - { - /* Initialize the codec internal registers */ - audio_drv->Init(AUDIO_I2C_ADDRESS, OutputDevice, Volume, AudioFreq); - } - - return ret; -} - -/** - * @brief Starts playing audio stream from a data buffer for a determined size. - * @param pBuffer: Pointer to the buffer - * @param Size: Number of audio data in BYTES unit. - * In memory, first element is for left channel, second element is for right channel - * @retval AUDIO_OK if correct communication, else wrong communication - */ -uint8_t BSP_AUDIO_OUT_Play(uint16_t* pBuffer, uint32_t Size) -{ - /* Call the audio Codec Play function */ - if(audio_drv->Play(AUDIO_I2C_ADDRESS, pBuffer, Size) != 0) - { - return AUDIO_ERROR; - } - else - { - /* Update the Media layer and enable it for play */ - HAL_SAI_Transmit_DMA(&haudio_out_sai, (uint8_t*) pBuffer, DMA_MAX(Size / AUDIODATA_SIZE)); - - return AUDIO_OK; - } -} - -/** - * @brief Sends n-Bytes on the SAI interface. - * @param pData: pointer on data address - * @param Size: number of data to be written - * @retval None - */ -void BSP_AUDIO_OUT_ChangeBuffer(uint16_t *pData, uint16_t Size) -{ - HAL_SAI_Transmit_DMA(&haudio_out_sai, (uint8_t*) pData, Size); -} - -/** - * @brief This function Pauses the audio file stream. In case - * of using DMA, the DMA Pause feature is used. - * @note When calling BSP_AUDIO_OUT_Pause() function for pause, only - * BSP_AUDIO_OUT_Resume() function should be called for resume (use of BSP_AUDIO_OUT_Play() - * function for resume could lead to unexpected behaviour). - * @retval AUDIO_OK if correct communication, else wrong communication - */ -uint8_t BSP_AUDIO_OUT_Pause(void) -{ - /* Call the Audio Codec Pause/Resume function */ - if(audio_drv->Pause(AUDIO_I2C_ADDRESS) != 0) - { - return AUDIO_ERROR; - } - else - { - /* Call the Media layer pause function */ - HAL_SAI_DMAPause(&haudio_out_sai); - - /* Return AUDIO_OK when all operations are correctly done */ - return AUDIO_OK; - } -} - -/** - * @brief This function Resumes the audio file stream. - * @note When calling BSP_AUDIO_OUT_Pause() function for pause, only - * BSP_AUDIO_OUT_Resume() function should be called for resume (use of BSP_AUDIO_OUT_Play() - * function for resume could lead to unexpected behaviour). - * @retval AUDIO_OK if correct communication, else wrong communication - */ -uint8_t BSP_AUDIO_OUT_Resume(void) -{ - /* Call the Audio Codec Pause/Resume function */ - if(audio_drv->Resume(AUDIO_I2C_ADDRESS) != 0) - { - return AUDIO_ERROR; - } - else - { - /* Call the Media layer pause/resume function */ - HAL_SAI_DMAResume(&haudio_out_sai); - - /* Return AUDIO_OK when all operations are correctly done */ - return AUDIO_OK; - } -} - -/** - * @brief Stops audio playing and Power down the Audio Codec. - * @param Option: could be one of the following parameters - * - CODEC_PDWN_SW: for software power off (by writing registers). - * Then no need to reconfigure the Codec after power on. - * - CODEC_PDWN_HW: completely shut down the codec (physically). - * Then need to reconfigure the Codec after power on. - * @retval AUDIO_OK if correct communication, else wrong communication - */ -uint8_t BSP_AUDIO_OUT_Stop(uint32_t Option) -{ - /* Call the Media layer stop function */ - HAL_SAI_DMAStop(&haudio_out_sai); - - /* Call Audio Codec Stop function */ - if(audio_drv->Stop(AUDIO_I2C_ADDRESS, Option) != 0) - { - return AUDIO_ERROR; - } - else - { - if(Option == CODEC_PDWN_HW) - { - /* Wait at least 100us */ - HAL_Delay(1); - } - /* Return AUDIO_OK when all operations are correctly done */ - return AUDIO_OK; - } -} - -/** - * @brief Controls the current audio volume level. - * @param Volume: Volume level to be set in percentage from 0% to 100% (0 for - * Mute and 100 for Max volume level). - * @retval AUDIO_OK if correct communication, else wrong communication - */ -uint8_t BSP_AUDIO_OUT_SetVolume(uint8_t Volume) -{ - /* Call the codec volume control function with converted volume value */ - if(audio_drv->SetVolume(AUDIO_I2C_ADDRESS, Volume) != 0) - { - return AUDIO_ERROR; - } - else - { - /* Return AUDIO_OK when all operations are correctly done */ - return AUDIO_OK; - } -} - -/** - * @brief Enables or disables the MUTE mode by software - * @param Cmd: Could be AUDIO_MUTE_ON to mute sound or AUDIO_MUTE_OFF to - * unmute the codec and restore previous volume level. - * @retval AUDIO_OK if correct communication, else wrong communication - */ -uint8_t BSP_AUDIO_OUT_SetMute(uint32_t Cmd) -{ - /* Call the Codec Mute function */ - if(audio_drv->SetMute(AUDIO_I2C_ADDRESS, Cmd) != 0) - { - return AUDIO_ERROR; - } - else - { - /* Return AUDIO_OK when all operations are correctly done */ - return AUDIO_OK; - } -} - -/** - * @brief Switch dynamically (while audio file is played) the output target - * (speaker or headphone). - * @param Output: The audio output target: OUTPUT_DEVICE_SPEAKER, - * OUTPUT_DEVICE_HEADPHONE or OUTPUT_DEVICE_BOTH - * @retval AUDIO_OK if correct communication, else wrong communication - */ -uint8_t BSP_AUDIO_OUT_SetOutputMode(uint8_t Output) -{ - /* Call the Codec output device function */ - if(audio_drv->SetOutputMode(AUDIO_I2C_ADDRESS, Output) != 0) - { - return AUDIO_ERROR; - } - else - { - /* Return AUDIO_OK when all operations are correctly done */ - return AUDIO_OK; - } -} - -/** - * @brief Updates the audio frequency. - * @param AudioFreq: Audio frequency used to play the audio stream. - * @note This API should be called after the BSP_AUDIO_OUT_Init() to adjust the - * audio frequency. - * @retval None - */ -void BSP_AUDIO_OUT_SetFrequency(uint32_t AudioFreq) -{ - /* PLL clock is set depending by the AudioFreq (44.1khz vs 48khz groups) */ - BSP_AUDIO_OUT_ClockConfig(&haudio_out_sai, AudioFreq, NULL); - - /* Disable SAI peripheral to allow access to SAI internal registers */ - __HAL_SAI_DISABLE(&haudio_out_sai); - - /* Update the SAI audio frequency configuration */ - haudio_out_sai.Init.AudioFrequency = AudioFreq; - HAL_SAI_Init(&haudio_out_sai); - - /* Enable SAI peripheral to generate MCLK */ - __HAL_SAI_ENABLE(&haudio_out_sai); -} - -/** - * @brief Updates the Audio frame slot configuration. - * @param AudioFrameSlot: specifies the audio Frame slot - * This parameter can be one of the following values - * @arg CODEC_AUDIOFRAME_SLOT_0123 - * @arg CODEC_AUDIOFRAME_SLOT_02 - * @arg CODEC_AUDIOFRAME_SLOT_13 - * @note This API should be called after the BSP_AUDIO_OUT_Init() to adjust the - * audio frame slot. - * @retval None - */ -void BSP_AUDIO_OUT_SetAudioFrameSlot(uint32_t AudioFrameSlot) -{ - /* Disable SAI peripheral to allow access to SAI internal registers */ - __HAL_SAI_DISABLE(&haudio_out_sai); - - /* Update the SAI audio frame slot configuration */ - haudio_out_sai.SlotInit.SlotActive = AudioFrameSlot; - HAL_SAI_Init(&haudio_out_sai); - - /* Enable SAI peripheral to generate MCLK */ - __HAL_SAI_ENABLE(&haudio_out_sai); -} - -/** - * @brief Deinit the audio peripherals. - * @retval None - */ -void BSP_AUDIO_OUT_DeInit(void) -{ - SAIx_Out_DeInit(); - /* DeInit the SAI MSP : this __weak function can be rewritten by the application */ - BSP_AUDIO_OUT_MspDeInit(&haudio_out_sai, NULL); -} - -/** - * @brief Tx Transfer completed callbacks. - * @param hsai: SAI handle - * @retval None - */ -void HAL_SAI_TxCpltCallback(SAI_HandleTypeDef *hsai) -{ - /* Manage the remaining file size and new address offset: This function - should be coded by user (its prototype is already declared in stm32746g_discovery_audio.h) */ - BSP_AUDIO_OUT_TransferComplete_CallBack(); -} - -/** - * @brief Tx Half Transfer completed callbacks. - * @param hsai: SAI handle - * @retval None - */ -void HAL_SAI_TxHalfCpltCallback(SAI_HandleTypeDef *hsai) -{ - /* Manage the remaining file size and new address offset: This function - should be coded by user (its prototype is already declared in stm32746g_discovery_audio.h) */ - BSP_AUDIO_OUT_HalfTransfer_CallBack(); -} - -/** - * @brief SAI error callbacks. - * @param hsai: SAI handle - * @retval None - */ -void HAL_SAI_ErrorCallback(SAI_HandleTypeDef *hsai) -{ - HAL_SAI_StateTypeDef audio_out_state; - HAL_SAI_StateTypeDef audio_in_state; - - audio_out_state = HAL_SAI_GetState(&haudio_out_sai); - audio_in_state = HAL_SAI_GetState(&haudio_in_sai); - - /* Determines if it is an audio out or audio in error */ - if ((audio_out_state == HAL_SAI_STATE_BUSY) || (audio_out_state == HAL_SAI_STATE_BUSY_TX)) - { - BSP_AUDIO_OUT_Error_CallBack(); - } - - if ((audio_in_state == HAL_SAI_STATE_BUSY) || (audio_in_state == HAL_SAI_STATE_BUSY_RX)) - { - BSP_AUDIO_IN_Error_CallBack(); - } -} - -/** - * @brief Manages the DMA full Transfer complete event. - * @retval None - */ -__weak void BSP_AUDIO_OUT_TransferComplete_CallBack(void) -{ -} - -/** - * @brief Manages the DMA Half Transfer complete event. - * @retval None - */ -__weak void BSP_AUDIO_OUT_HalfTransfer_CallBack(void) -{ -} - -/** - * @brief Manages the DMA FIFO error event. - * @retval None - */ -__weak void BSP_AUDIO_OUT_Error_CallBack(void) -{ -} - -/** - * @brief Initializes BSP_AUDIO_OUT MSP. - * @param hsai: SAI handle - * @param Params - * @retval None - */ -__weak void BSP_AUDIO_OUT_MspInit(SAI_HandleTypeDef *hsai, void *Params) -{ - static DMA_HandleTypeDef hdma_sai_tx; - GPIO_InitTypeDef gpio_init_structure; - - /* Enable SAI clock */ - AUDIO_OUT_SAIx_CLK_ENABLE(); - - /* Enable GPIO clock */ - AUDIO_OUT_SAIx_MCLK_ENABLE(); - AUDIO_OUT_SAIx_SCK_SD_ENABLE(); - AUDIO_OUT_SAIx_FS_ENABLE(); - /* CODEC_SAI pins configuration: FS, SCK, MCK and SD pins ------------------*/ - gpio_init_structure.Pin = AUDIO_OUT_SAIx_FS_PIN; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Pull = GPIO_NOPULL; - gpio_init_structure.Speed = GPIO_SPEED_HIGH; - gpio_init_structure.Alternate = AUDIO_OUT_SAIx_FS_SD_MCLK_AF; - HAL_GPIO_Init(AUDIO_OUT_SAIx_FS_GPIO_PORT, &gpio_init_structure); - - gpio_init_structure.Pin = AUDIO_OUT_SAIx_SCK_PIN; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Pull = GPIO_NOPULL; - gpio_init_structure.Speed = GPIO_SPEED_HIGH; - gpio_init_structure.Alternate = AUDIO_OUT_SAIx_SCK_AF; - HAL_GPIO_Init(AUDIO_OUT_SAIx_SCK_SD_GPIO_PORT, &gpio_init_structure); - - gpio_init_structure.Pin = AUDIO_OUT_SAIx_SD_PIN; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Pull = GPIO_NOPULL; - gpio_init_structure.Speed = GPIO_SPEED_HIGH; - gpio_init_structure.Alternate = AUDIO_OUT_SAIx_FS_SD_MCLK_AF; - HAL_GPIO_Init(AUDIO_OUT_SAIx_SCK_SD_GPIO_PORT, &gpio_init_structure); - - gpio_init_structure.Pin = AUDIO_OUT_SAIx_MCLK_PIN; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Pull = GPIO_NOPULL; - gpio_init_structure.Speed = GPIO_SPEED_HIGH; - gpio_init_structure.Alternate = AUDIO_OUT_SAIx_FS_SD_MCLK_AF; - HAL_GPIO_Init(AUDIO_OUT_SAIx_MCLK_GPIO_PORT, &gpio_init_structure); - - /* Enable the DMA clock */ - AUDIO_OUT_SAIx_DMAx_CLK_ENABLE(); - - if(hsai->Instance == AUDIO_OUT_SAIx) - { - /* Configure the hdma_saiTx handle parameters */ - hdma_sai_tx.Init.Channel = AUDIO_OUT_SAIx_DMAx_CHANNEL; - hdma_sai_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; - hdma_sai_tx.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_sai_tx.Init.MemInc = DMA_MINC_ENABLE; - hdma_sai_tx.Init.PeriphDataAlignment = AUDIO_OUT_SAIx_DMAx_PERIPH_DATA_SIZE; - hdma_sai_tx.Init.MemDataAlignment = AUDIO_OUT_SAIx_DMAx_MEM_DATA_SIZE; - hdma_sai_tx.Init.Mode = DMA_CIRCULAR; - hdma_sai_tx.Init.Priority = DMA_PRIORITY_HIGH; - hdma_sai_tx.Init.FIFOMode = DMA_FIFOMODE_ENABLE; - hdma_sai_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; - hdma_sai_tx.Init.MemBurst = DMA_MBURST_SINGLE; - hdma_sai_tx.Init.PeriphBurst = DMA_PBURST_SINGLE; - - hdma_sai_tx.Instance = AUDIO_OUT_SAIx_DMAx_STREAM; - - /* Associate the DMA handle */ - __HAL_LINKDMA(hsai, hdmatx, hdma_sai_tx); - - /* Deinitialize the Stream for new transfer */ - HAL_DMA_DeInit(&hdma_sai_tx); - - /* Configure the DMA Stream */ - HAL_DMA_Init(&hdma_sai_tx); - } - - /* SAI DMA IRQ Channel configuration */ - HAL_NVIC_SetPriority(AUDIO_OUT_SAIx_DMAx_IRQ, AUDIO_OUT_IRQ_PREPRIO, 0); - HAL_NVIC_EnableIRQ(AUDIO_OUT_SAIx_DMAx_IRQ); -} - -/** - * @brief Deinitializes SAI MSP. - * @param hsai: SAI handle - * @param Params - * @retval None - */ -__weak void BSP_AUDIO_OUT_MspDeInit(SAI_HandleTypeDef *hsai, void *Params) -{ - GPIO_InitTypeDef gpio_init_structure; - - /* SAI DMA IRQ Channel deactivation */ - HAL_NVIC_DisableIRQ(AUDIO_OUT_SAIx_DMAx_IRQ); - - if(hsai->Instance == AUDIO_OUT_SAIx) - { - /* Deinitialize the DMA stream */ - HAL_DMA_DeInit(hsai->hdmatx); - } - - /* Disable SAI peripheral */ - __HAL_SAI_DISABLE(hsai); - - /* Deactives CODEC_SAI pins FS, SCK, MCK and SD by putting them in input mode */ - gpio_init_structure.Pin = AUDIO_OUT_SAIx_FS_PIN; - HAL_GPIO_DeInit(AUDIO_OUT_SAIx_FS_GPIO_PORT, gpio_init_structure.Pin); - - gpio_init_structure.Pin = AUDIO_OUT_SAIx_SCK_PIN; - HAL_GPIO_DeInit(AUDIO_OUT_SAIx_SCK_SD_GPIO_PORT, gpio_init_structure.Pin); - - gpio_init_structure.Pin = AUDIO_OUT_SAIx_SD_PIN; - HAL_GPIO_DeInit(AUDIO_OUT_SAIx_SCK_SD_GPIO_PORT, gpio_init_structure.Pin); - - gpio_init_structure.Pin = AUDIO_OUT_SAIx_MCLK_PIN; - HAL_GPIO_DeInit(AUDIO_OUT_SAIx_MCLK_GPIO_PORT, gpio_init_structure.Pin); - - /* Disable SAI clock */ - AUDIO_OUT_SAIx_CLK_DISABLE(); - - /* GPIO pins clock and DMA clock can be shut down in the application - by surcharging this __weak function */ -} - -/** - * @brief Clock Config. - * @param hsai: might be required to set audio peripheral predivider if any. - * @param AudioFreq: Audio frequency used to play the audio stream. - * @param Params - * @note This API is called by BSP_AUDIO_OUT_Init() and BSP_AUDIO_OUT_SetFrequency() - * Being __weak it can be overwritten by the application - * @retval None - */ -__weak void BSP_AUDIO_OUT_ClockConfig(SAI_HandleTypeDef *hsai, uint32_t AudioFreq, void *Params) -{ - RCC_PeriphCLKInitTypeDef rcc_ex_clk_init_struct; - - HAL_RCCEx_GetPeriphCLKConfig(&rcc_ex_clk_init_struct); - - /* Set the PLL configuration according to the audio frequency */ - if((AudioFreq == AUDIO_FREQUENCY_11K) || (AudioFreq == AUDIO_FREQUENCY_22K) || (AudioFreq == AUDIO_FREQUENCY_44K)) - { - /* Configure PLLI2S prescalers */ - /* PLLI2S_VCO: VCO_429M - I2S_CLK(first level) = PLLI2S_VCO/PLLI2SQ = 429/2 = 214.5 Mhz - I2S_CLK_x = I2S_CLK(first level)/PLLI2SDIVQ = 214.5/19 = 11.289 Mhz */ - rcc_ex_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK_SAI2; - rcc_ex_clk_init_struct.Sai2ClockSelection = RCC_SAI2CLKSOURCE_PLLI2S; - rcc_ex_clk_init_struct.PLLI2S.PLLI2SN = 429; - rcc_ex_clk_init_struct.PLLI2S.PLLI2SQ = 2; - rcc_ex_clk_init_struct.PLLI2SDivQ = 19; - - HAL_RCCEx_PeriphCLKConfig(&rcc_ex_clk_init_struct); - - } - else /* AUDIO_FREQUENCY_8K, AUDIO_FREQUENCY_16K, AUDIO_FREQUENCY_48K), AUDIO_FREQUENCY_96K */ - { - /* I2S clock config - PLLI2S_VCO: VCO_344M - I2S_CLK(first level) = PLLI2S_VCO/PLLI2SQ = 344/7 = 49.142 Mhz - I2S_CLK_x = I2S_CLK(first level)/PLLI2SDIVQ = 49.142/1 = 49.142 Mhz */ - rcc_ex_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK_SAI2; - rcc_ex_clk_init_struct.Sai2ClockSelection = RCC_SAI2CLKSOURCE_PLLI2S; - rcc_ex_clk_init_struct.PLLI2S.PLLI2SN = 344; - rcc_ex_clk_init_struct.PLLI2S.PLLI2SQ = 7; - rcc_ex_clk_init_struct.PLLI2SDivQ = 1; - - HAL_RCCEx_PeriphCLKConfig(&rcc_ex_clk_init_struct); - } -} - -/******************************************************************************* - Static Functions -*******************************************************************************/ - -/** - * @brief Initializes the output Audio Codec audio interface (SAI). - * @param AudioFreq: Audio frequency to be configured for the SAI peripheral. - * @note The default SlotActive configuration is set to CODEC_AUDIOFRAME_SLOT_0123 - * and user can update this configuration using - * @retval None - */ -static void SAIx_Out_Init(uint32_t AudioFreq) -{ - /* Initialize the haudio_out_sai Instance parameter */ - haudio_out_sai.Instance = AUDIO_OUT_SAIx; - - /* Disable SAI peripheral to allow access to SAI internal registers */ - __HAL_SAI_DISABLE(&haudio_out_sai); - - /* Configure SAI_Block_x - LSBFirst: Disabled - DataSize: 16 */ - haudio_out_sai.Init.AudioFrequency = AudioFreq; - haudio_out_sai.Init.AudioMode = SAI_MODEMASTER_TX; - haudio_out_sai.Init.NoDivider = SAI_MASTERDIVIDER_ENABLED; - haudio_out_sai.Init.Protocol = SAI_FREE_PROTOCOL; - haudio_out_sai.Init.DataSize = SAI_DATASIZE_16; - haudio_out_sai.Init.FirstBit = SAI_FIRSTBIT_MSB; - haudio_out_sai.Init.ClockStrobing = SAI_CLOCKSTROBING_RISINGEDGE; - haudio_out_sai.Init.Synchro = SAI_ASYNCHRONOUS; - haudio_out_sai.Init.OutputDrive = SAI_OUTPUTDRIVE_ENABLED; - haudio_out_sai.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_1QF; - - /* Configure SAI_Block_x Frame - Frame Length: 64 - Frame active Length: 32 - FS Definition: Start frame + Channel Side identification - FS Polarity: FS active Low - FS Offset: FS asserted one bit before the first bit of slot 0 */ - haudio_out_sai.FrameInit.FrameLength = 64; - haudio_out_sai.FrameInit.ActiveFrameLength = 32; - haudio_out_sai.FrameInit.FSDefinition = SAI_FS_CHANNEL_IDENTIFICATION; - haudio_out_sai.FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW; - haudio_out_sai.FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT; - - /* Configure SAI Block_x Slot - Slot First Bit Offset: 0 - Slot Size : 16 - Slot Number: 4 - Slot Active: All slot actives */ - haudio_out_sai.SlotInit.FirstBitOffset = 0; - haudio_out_sai.SlotInit.SlotSize = SAI_SLOTSIZE_DATASIZE; - haudio_out_sai.SlotInit.SlotNumber = 4; - haudio_out_sai.SlotInit.SlotActive = CODEC_AUDIOFRAME_SLOT_0123; - - HAL_SAI_Init(&haudio_out_sai); - - /* Enable SAI peripheral to generate MCLK */ - __HAL_SAI_ENABLE(&haudio_out_sai); -} - - - -/** - * @brief Deinitializes the output Audio Codec audio interface (SAI). - * @retval None - */ -static void SAIx_Out_DeInit(void) -{ - /* Initialize the haudio_out_sai Instance parameter */ - haudio_out_sai.Instance = AUDIO_OUT_SAIx; - - /* Disable SAI peripheral */ - __HAL_SAI_DISABLE(&haudio_out_sai); - - HAL_SAI_DeInit(&haudio_out_sai); -} - -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_AUDIO_Out_Private_Functions STM32746G_DISCOVERY_AUDIO Out Private Functions - * @{ - */ - -/** - * @brief Initializes wave recording. - * @param AudioFreq: Audio frequency to be configured for the SAI peripheral. - * @param BitRes: Audio frequency to be configured. - * @param ChnlNbr: Channel number. - * @retval AUDIO_OK if correct communication, else wrong communication - */ -uint8_t BSP_AUDIO_IN_Init(uint32_t AudioFreq, uint32_t BitRes, uint32_t ChnlNbr) -{ - return BSP_AUDIO_IN_InitEx(INPUT_DEVICE_DIGITAL_MICROPHONE_2, AudioFreq, BitRes, ChnlNbr); -} - -/** - * @brief Initializes wave recording. - * @param InputDevice: INPUT_DEVICE_DIGITAL_MICROPHONE_2 or INPUT_DEVICE_INPUT_LINE_1 - * @param AudioFreq: Audio frequency to be configured for the SAI peripheral. - * @param BitRes: Audio frequency to be configured. - * @param ChnlNbr: Channel number. - * @retval AUDIO_OK if correct communication, else wrong communication - */ -uint8_t BSP_AUDIO_IN_InitEx(uint16_t InputDevice, uint32_t AudioFreq, uint32_t BitRes, uint32_t ChnlNbr) -{ - uint8_t ret = AUDIO_ERROR; - uint32_t deviceid = 0x00; - uint32_t slot_active; - - if ((InputDevice != INPUT_DEVICE_INPUT_LINE_1) && /* Only INPUT_LINE_1 and MICROPHONE_2 inputs supported */ - (InputDevice != INPUT_DEVICE_DIGITAL_MICROPHONE_2)) - { - ret = AUDIO_ERROR; - } - else - { - /* Disable SAI */ - SAIx_In_DeInit(); - - /* PLL clock is set depending on the AudioFreq (44.1khz vs 48khz groups) */ - BSP_AUDIO_OUT_ClockConfig(&haudio_in_sai, AudioFreq, NULL); /* Clock config is shared between AUDIO IN and OUT */ - - /* SAI data transfer preparation: - Prepare the Media to be used for the audio transfer from SAI peripheral to memory */ - haudio_in_sai.Instance = AUDIO_IN_SAIx; - if(HAL_SAI_GetState(&haudio_in_sai) == HAL_SAI_STATE_RESET) - { - /* Init the SAI MSP: this __weak function can be redefined by the application*/ - BSP_AUDIO_OUT_MspInit(&haudio_in_sai, NULL); /* Initialize GPIOs for SAI2 block A Master signals */ - BSP_AUDIO_IN_MspInit(&haudio_in_sai, NULL); - } - - /* Configure SAI in master RX mode : - * - SAI2_block_A in master RX mode - * - SAI2_block_B in slave RX mode synchronous from SAI2_block_A - */ - if (InputDevice == INPUT_DEVICE_DIGITAL_MICROPHONE_2) - { - slot_active = CODEC_AUDIOFRAME_SLOT_13; - } - else - { - slot_active = CODEC_AUDIOFRAME_SLOT_02; - } - SAIx_In_Init(SAI_MODEMASTER_RX, slot_active, AudioFreq); - - /* wm8994 codec initialization */ - deviceid = wm8994_drv.ReadID(AUDIO_I2C_ADDRESS); - - if((deviceid) == WM8994_ID) - { - /* Reset the Codec Registers */ - wm8994_drv.Reset(AUDIO_I2C_ADDRESS); - /* Initialize the audio driver structure */ - audio_drv = &wm8994_drv; - ret = AUDIO_OK; - } - else - { - ret = AUDIO_ERROR; - } - - if(ret == AUDIO_OK) - { - /* Initialize the codec internal registers */ - audio_drv->Init(AUDIO_I2C_ADDRESS, InputDevice, 100, AudioFreq); - } - } - return ret; -} - -/** - * @brief Initializes wave recording and playback in parallel. - * @param InputDevice: INPUT_DEVICE_DIGITAL_MICROPHONE_2 - * @param OutputDevice: OUTPUT_DEVICE_SPEAKER, OUTPUT_DEVICE_HEADPHONE, - * or OUTPUT_DEVICE_BOTH. - * @param AudioFreq: Audio frequency to be configured for the SAI peripheral. - * @param BitRes: Audio frequency to be configured. - * @param ChnlNbr: Channel number. - * @retval AUDIO_OK if correct communication, else wrong communication - */ -uint8_t BSP_AUDIO_IN_OUT_Init(uint16_t InputDevice, uint16_t OutputDevice, uint32_t AudioFreq, uint32_t BitRes, uint32_t ChnlNbr) -{ - uint8_t ret = AUDIO_ERROR; - uint32_t deviceid = 0x00; - uint32_t slot_active; - - if (InputDevice != INPUT_DEVICE_DIGITAL_MICROPHONE_2) /* Only MICROPHONE_2 input supported */ - { - ret = AUDIO_ERROR; - } - else - { - /* Disable SAI */ - SAIx_In_DeInit(); - SAIx_Out_DeInit(); - - /* PLL clock is set depending on the AudioFreq (44.1khz vs 48khz groups) */ - BSP_AUDIO_OUT_ClockConfig(&haudio_in_sai, AudioFreq, NULL); /* Clock config is shared between AUDIO IN and OUT */ - - /* SAI data transfer preparation: - Prepare the Media to be used for the audio transfer from SAI peripheral to memory */ - haudio_in_sai.Instance = AUDIO_IN_SAIx; - if(HAL_SAI_GetState(&haudio_in_sai) == HAL_SAI_STATE_RESET) - { - /* Init the SAI MSP: this __weak function can be redefined by the application*/ - BSP_AUDIO_IN_MspInit(&haudio_in_sai, NULL); - } - - /* SAI data transfer preparation: - Prepare the Media to be used for the audio transfer from memory to SAI peripheral */ - haudio_out_sai.Instance = AUDIO_OUT_SAIx; - if(HAL_SAI_GetState(&haudio_out_sai) == HAL_SAI_STATE_RESET) - { - /* Init the SAI MSP: this __weak function can be redefined by the application*/ - BSP_AUDIO_OUT_MspInit(&haudio_out_sai, NULL); - } - - /* Configure SAI in master mode : - * - SAI2_block_A in master TX mode - * - SAI2_block_B in slave RX mode synchronous from SAI2_block_A - */ - if (InputDevice == INPUT_DEVICE_DIGITAL_MICROPHONE_2) - { - slot_active = CODEC_AUDIOFRAME_SLOT_13; - } - else - { - slot_active = CODEC_AUDIOFRAME_SLOT_02; - } - SAIx_In_Init(SAI_MODEMASTER_TX, slot_active, AudioFreq); - - /* wm8994 codec initialization */ - deviceid = wm8994_drv.ReadID(AUDIO_I2C_ADDRESS); - - if((deviceid) == WM8994_ID) - { - /* Reset the Codec Registers */ - wm8994_drv.Reset(AUDIO_I2C_ADDRESS); - /* Initialize the audio driver structure */ - audio_drv = &wm8994_drv; - ret = AUDIO_OK; - } - else - { - ret = AUDIO_ERROR; - } - - if(ret == AUDIO_OK) - { - /* Initialize the codec internal registers */ - audio_drv->Init(AUDIO_I2C_ADDRESS, InputDevice | OutputDevice, 100, AudioFreq); - } - } - return ret; -} - - -/** - * @brief Starts audio recording. - * @param pbuf: Main buffer pointer for the recorded data storing - * @param size: size of the recorded buffer in number of elements (typically number of half-words) - * Be careful that it is not the same unit than BSP_AUDIO_OUT_Play function - * @retval AUDIO_OK if correct communication, else wrong communication - */ -uint8_t BSP_AUDIO_IN_Record(uint16_t* pbuf, uint32_t size) -{ - uint32_t ret = AUDIO_ERROR; - - /* Start the process receive DMA */ - HAL_SAI_Receive_DMA(&haudio_in_sai, (uint8_t*)pbuf, size); - - /* Return AUDIO_OK when all operations are correctly done */ - ret = AUDIO_OK; - - return ret; -} - -/** - * @brief Stops audio recording. - * @param Option: could be one of the following parameters - * - CODEC_PDWN_SW: for software power off (by writing registers). - * Then no need to reconfigure the Codec after power on. - * - CODEC_PDWN_HW: completely shut down the codec (physically). - * Then need to reconfigure the Codec after power on. - * @retval AUDIO_OK if correct communication, else wrong communication - */ -uint8_t BSP_AUDIO_IN_Stop(uint32_t Option) -{ - /* Call the Media layer stop function */ - HAL_SAI_DMAStop(&haudio_in_sai); - - /* Call Audio Codec Stop function */ - if(audio_drv->Stop(AUDIO_I2C_ADDRESS, Option) != 0) - { - return AUDIO_ERROR; - } - else - { - if(Option == CODEC_PDWN_HW) - { - /* Wait at least 100us */ - HAL_Delay(1); - } - /* Return AUDIO_OK when all operations are correctly done */ - return AUDIO_OK; - } -} - -/** - * @brief Pauses the audio file stream. - * @retval AUDIO_OK if correct communication, else wrong communication - */ -uint8_t BSP_AUDIO_IN_Pause(void) -{ - /* Call the Media layer pause function */ - HAL_SAI_DMAPause(&haudio_in_sai); - /* Return AUDIO_OK when all operations are correctly done */ - return AUDIO_OK; -} - -/** - * @brief Resumes the audio file stream. - * @retval AUDIO_OK if correct communication, else wrong communication - */ -uint8_t BSP_AUDIO_IN_Resume(void) -{ - /* Call the Media layer pause/resume function */ - HAL_SAI_DMAResume(&haudio_in_sai); - /* Return AUDIO_OK when all operations are correctly done */ - return AUDIO_OK; -} - -/** - * @brief Controls the audio in volume level. - * @param Volume: Volume level in range 0(Mute)..80(+0dB)..100(+17.625dB) - * @retval AUDIO_OK if correct communication, else wrong communication - */ -uint8_t BSP_AUDIO_IN_SetVolume(uint8_t Volume) -{ - /* Call the codec volume control function with converted volume value */ - if(audio_drv->SetVolume(AUDIO_I2C_ADDRESS, Volume) != 0) - { - return AUDIO_ERROR; - } - else - { - /* Set the Global variable AudioInVolume */ - AudioInVolume = Volume; - /* Return AUDIO_OK when all operations are correctly done */ - return AUDIO_OK; - } -} - -/** - * @brief Deinit the audio IN peripherals. - * @retval None - */ -void BSP_AUDIO_IN_DeInit(void) -{ - SAIx_In_DeInit(); - /* DeInit the SAI MSP : this __weak function can be rewritten by the application */ - BSP_AUDIO_IN_MspDeInit(&haudio_in_sai, NULL); -} - - /** - * @brief Rx Transfer completed callbacks. - * @param hsai: SAI handle - * @retval None - */ -void HAL_SAI_RxCpltCallback(SAI_HandleTypeDef *hsai) -{ - /* Call the record update function to get the next buffer to fill and its size (size is ignored) */ - BSP_AUDIO_IN_TransferComplete_CallBack(); -} - -/** - * @brief Rx Half Transfer completed callbacks. - * @param hsai: SAI handle - * @retval None - */ -void HAL_SAI_RxHalfCpltCallback(SAI_HandleTypeDef *hsai) -{ - /* Manage the remaining file size and new address offset: This function - should be coded by user (its prototype is already declared in stm32746g_discovery_audio.h) */ - BSP_AUDIO_IN_HalfTransfer_CallBack(); -} - -/** - * @brief User callback when record buffer is filled. - * @retval None - */ -__weak void BSP_AUDIO_IN_TransferComplete_CallBack(void) -{ - /* This function should be implemented by the user application. - It is called into this driver when the current buffer is filled - to prepare the next buffer pointer and its size. */ -} - -/** - * @brief Manages the DMA Half Transfer complete event. - * @retval None - */ -__weak void BSP_AUDIO_IN_HalfTransfer_CallBack(void) -{ - /* This function should be implemented by the user application. - It is called into this driver when the current buffer is filled - to prepare the next buffer pointer and its size. */ -} - -/** - * @brief Audio IN Error callback function. - * @retval None - */ -__weak void BSP_AUDIO_IN_Error_CallBack(void) -{ - /* This function is called when an Interrupt due to transfer error on or peripheral - error occurs. */ -} - -/** - * @brief Initializes BSP_AUDIO_IN MSP. - * @param hsai: SAI handle - * @param Params - * @retval None - */ -__weak void BSP_AUDIO_IN_MspInit(SAI_HandleTypeDef *hsai, void *Params) -{ - static DMA_HandleTypeDef hdma_sai_rx; - GPIO_InitTypeDef gpio_init_structure; - - /* Enable SAI clock */ - AUDIO_IN_SAIx_CLK_ENABLE(); - - /* Enable SD GPIO clock */ - AUDIO_IN_SAIx_SD_ENABLE(); - /* CODEC_SAI pin configuration: SD pin */ - gpio_init_structure.Pin = AUDIO_IN_SAIx_SD_PIN; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Pull = GPIO_NOPULL; - gpio_init_structure.Speed = GPIO_SPEED_FAST; - gpio_init_structure.Alternate = AUDIO_IN_SAIx_SD_AF; - HAL_GPIO_Init(AUDIO_IN_SAIx_SD_GPIO_PORT, &gpio_init_structure); - - /* Enable Audio INT GPIO clock */ - AUDIO_IN_INT_GPIO_ENABLE(); - /* Audio INT pin configuration: input */ - gpio_init_structure.Pin = AUDIO_IN_INT_GPIO_PIN; - gpio_init_structure.Mode = GPIO_MODE_INPUT; - gpio_init_structure.Pull = GPIO_NOPULL; - gpio_init_structure.Speed = GPIO_SPEED_FAST; - HAL_GPIO_Init(AUDIO_IN_INT_GPIO_PORT, &gpio_init_structure); - - /* Enable the DMA clock */ - AUDIO_IN_SAIx_DMAx_CLK_ENABLE(); - - if(hsai->Instance == AUDIO_IN_SAIx) - { - /* Configure the hdma_sai_rx handle parameters */ - hdma_sai_rx.Init.Channel = AUDIO_IN_SAIx_DMAx_CHANNEL; - hdma_sai_rx.Init.Direction = DMA_PERIPH_TO_MEMORY; - hdma_sai_rx.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_sai_rx.Init.MemInc = DMA_MINC_ENABLE; - hdma_sai_rx.Init.PeriphDataAlignment = AUDIO_IN_SAIx_DMAx_PERIPH_DATA_SIZE; - hdma_sai_rx.Init.MemDataAlignment = AUDIO_IN_SAIx_DMAx_MEM_DATA_SIZE; - hdma_sai_rx.Init.Mode = DMA_CIRCULAR; - hdma_sai_rx.Init.Priority = DMA_PRIORITY_HIGH; - hdma_sai_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - hdma_sai_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; - hdma_sai_rx.Init.MemBurst = DMA_MBURST_SINGLE; - hdma_sai_rx.Init.PeriphBurst = DMA_MBURST_SINGLE; - - hdma_sai_rx.Instance = AUDIO_IN_SAIx_DMAx_STREAM; - - /* Associate the DMA handle */ - __HAL_LINKDMA(hsai, hdmarx, hdma_sai_rx); - - /* Deinitialize the Stream for new transfer */ - HAL_DMA_DeInit(&hdma_sai_rx); - - /* Configure the DMA Stream */ - HAL_DMA_Init(&hdma_sai_rx); - } - - /* SAI DMA IRQ Channel configuration */ - HAL_NVIC_SetPriority(AUDIO_IN_SAIx_DMAx_IRQ, AUDIO_IN_IRQ_PREPRIO, 0); - HAL_NVIC_EnableIRQ(AUDIO_IN_SAIx_DMAx_IRQ); - - /* Audio INT IRQ Channel configuration */ - HAL_NVIC_SetPriority(AUDIO_IN_INT_IRQ, AUDIO_IN_IRQ_PREPRIO, 0); - HAL_NVIC_EnableIRQ(AUDIO_IN_INT_IRQ); -} - -/** - * @brief DeInitializes BSP_AUDIO_IN MSP. - * @param hsai: SAI handle - * @param Params - * @retval None - */ -__weak void BSP_AUDIO_IN_MspDeInit(SAI_HandleTypeDef *hsai, void *Params) -{ - GPIO_InitTypeDef gpio_init_structure; - - static DMA_HandleTypeDef hdma_sai_rx; - - /* SAI IN DMA IRQ Channel deactivation */ - HAL_NVIC_DisableIRQ(AUDIO_IN_SAIx_DMAx_IRQ); - - if(hsai->Instance == AUDIO_IN_SAIx) - { - /* Deinitialize the Stream for new transfer */ - HAL_DMA_DeInit(&hdma_sai_rx); - } - - /* Disable SAI block */ - __HAL_SAI_DISABLE(hsai); - - /* Disable pin: SD pin */ - gpio_init_structure.Pin = AUDIO_IN_SAIx_SD_PIN; - HAL_GPIO_DeInit(AUDIO_IN_SAIx_SD_GPIO_PORT, gpio_init_structure.Pin); - - /* Disable SAI clock */ - AUDIO_IN_SAIx_CLK_DISABLE(); - - /* GPIO pins clock and DMA clock can be shut down in the application - by surcharging this __weak function */ -} - - -/******************************************************************************* - Static Functions -*******************************************************************************/ - -/** - * @brief Initializes the input Audio Codec audio interface (SAI). - * @param SaiOutMode: SAI_MODEMASTER_TX (for record and playback in parallel) - * or SAI_MODEMASTER_RX (for record only). - * @param SlotActive: CODEC_AUDIOFRAME_SLOT_02 or CODEC_AUDIOFRAME_SLOT_13 - * @param AudioFreq: Audio frequency to be configured for the SAI peripheral. - * @retval None - */ -static void SAIx_In_Init(uint32_t SaiOutMode, uint32_t SlotActive, uint32_t AudioFreq) -{ - /* Initialize SAI2 block A in MASTER RX */ - /* Initialize the haudio_out_sai Instance parameter */ - haudio_out_sai.Instance = AUDIO_OUT_SAIx; - - /* Disable SAI peripheral to allow access to SAI internal registers */ - __HAL_SAI_DISABLE(&haudio_out_sai); - - /* Configure SAI_Block_x - LSBFirst: Disabled - DataSize: 16 */ - haudio_out_sai.Init.AudioFrequency = AudioFreq; - haudio_out_sai.Init.AudioMode = SaiOutMode; - haudio_out_sai.Init.NoDivider = SAI_MASTERDIVIDER_ENABLED; - haudio_out_sai.Init.Protocol = SAI_FREE_PROTOCOL; - haudio_out_sai.Init.DataSize = SAI_DATASIZE_16; - haudio_out_sai.Init.FirstBit = SAI_FIRSTBIT_MSB; - haudio_out_sai.Init.ClockStrobing = SAI_CLOCKSTROBING_RISINGEDGE; - haudio_out_sai.Init.Synchro = SAI_ASYNCHRONOUS; - haudio_out_sai.Init.OutputDrive = SAI_OUTPUTDRIVE_ENABLED; - haudio_out_sai.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_1QF; - - /* Configure SAI_Block_x Frame - Frame Length: 64 - Frame active Length: 32 - FS Definition: Start frame + Channel Side identification - FS Polarity: FS active Low - FS Offset: FS asserted one bit before the first bit of slot 0 */ - haudio_out_sai.FrameInit.FrameLength = 64; - haudio_out_sai.FrameInit.ActiveFrameLength = 32; - haudio_out_sai.FrameInit.FSDefinition = SAI_FS_CHANNEL_IDENTIFICATION; - haudio_out_sai.FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW; - haudio_out_sai.FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT; - - /* Configure SAI Block_x Slot - Slot First Bit Offset: 0 - Slot Size : 16 - Slot Number: 4 - Slot Active: All slot actives */ - haudio_out_sai.SlotInit.FirstBitOffset = 0; - haudio_out_sai.SlotInit.SlotSize = SAI_SLOTSIZE_DATASIZE; - haudio_out_sai.SlotInit.SlotNumber = 4; - haudio_out_sai.SlotInit.SlotActive = SlotActive; - - HAL_SAI_Init(&haudio_out_sai); - - /* Initialize SAI2 block B in SLAVE RX synchronous from SAI2 block A */ - /* Initialize the haudio_in_sai Instance parameter */ - haudio_in_sai.Instance = AUDIO_IN_SAIx; - - /* Disable SAI peripheral to allow access to SAI internal registers */ - __HAL_SAI_DISABLE(&haudio_in_sai); - - /* Configure SAI_Block_x - LSBFirst: Disabled - DataSize: 16 */ - haudio_in_sai.Init.AudioFrequency = AudioFreq; - haudio_in_sai.Init.AudioMode = SAI_MODESLAVE_RX; - haudio_in_sai.Init.NoDivider = SAI_MASTERDIVIDER_ENABLED; - haudio_in_sai.Init.Protocol = SAI_FREE_PROTOCOL; - haudio_in_sai.Init.DataSize = SAI_DATASIZE_16; - haudio_in_sai.Init.FirstBit = SAI_FIRSTBIT_MSB; - haudio_in_sai.Init.ClockStrobing = SAI_CLOCKSTROBING_RISINGEDGE; - haudio_in_sai.Init.Synchro = SAI_SYNCHRONOUS; - haudio_in_sai.Init.OutputDrive = SAI_OUTPUTDRIVE_DISABLED; - haudio_in_sai.Init.FIFOThreshold = SAI_FIFOTHRESHOLD_1QF; - - /* Configure SAI_Block_x Frame - Frame Length: 64 - Frame active Length: 32 - FS Definition: Start frame + Channel Side identification - FS Polarity: FS active Low - FS Offset: FS asserted one bit before the first bit of slot 0 */ - haudio_in_sai.FrameInit.FrameLength = 64; - haudio_in_sai.FrameInit.ActiveFrameLength = 32; - haudio_in_sai.FrameInit.FSDefinition = SAI_FS_CHANNEL_IDENTIFICATION; - haudio_in_sai.FrameInit.FSPolarity = SAI_FS_ACTIVE_LOW; - haudio_in_sai.FrameInit.FSOffset = SAI_FS_BEFOREFIRSTBIT; - - /* Configure SAI Block_x Slot - Slot First Bit Offset: 0 - Slot Size : 16 - Slot Number: 4 - Slot Active: All slot active */ - haudio_in_sai.SlotInit.FirstBitOffset = 0; - haudio_in_sai.SlotInit.SlotSize = SAI_SLOTSIZE_DATASIZE; - haudio_in_sai.SlotInit.SlotNumber = 4; - haudio_in_sai.SlotInit.SlotActive = SlotActive; - - HAL_SAI_Init(&haudio_in_sai); - - /* Enable SAI peripheral to generate MCLK */ - __HAL_SAI_ENABLE(&haudio_out_sai); - - /* Enable SAI peripheral */ - __HAL_SAI_ENABLE(&haudio_in_sai); -} - - - -/** - * @brief Deinitializes the output Audio Codec audio interface (SAI). - * @retval None - */ -static void SAIx_In_DeInit(void) -{ - /* Initialize the haudio_in_sai Instance parameter */ - haudio_in_sai.Instance = AUDIO_IN_SAIx; - - /* Disable SAI peripheral */ - __HAL_SAI_DISABLE(&haudio_in_sai); - - HAL_SAI_DeInit(&haudio_in_sai); -} - - -/** - * @brief This function handles DMA2 Stream 7 interrupt request. - * @param None - * @retval None - */ -void AUDIO_IN_SAIx_DMAx_IRQHandler(void) // MBED -{ - HAL_DMA_IRQHandler(haudio_in_sai.hdmarx); -} - -/** - * @brief This function handles DMA2 Stream 6 interrupt request. - * @param None - * @retval None - */ -void AUDIO_OUT_SAIx_DMAx_IRQHandler(void) // MBED -{ - HAL_DMA_IRQHandler(haudio_out_sai.hdmatx); -} - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_audio.h --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_audio.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,293 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery_audio.h - * @author MCD Application Team - * @brief This file contains the common defines and functions prototypes for - * the stm32746g_discovery_audio.c driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32746G_DISCOVERY_AUDIO_H -#define __STM32746G_DISCOVERY_AUDIO_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -/* Include audio component Driver */ -#include "../Components/wm8994/wm8994.h" -#include "stm32746g_discovery.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_AUDIO STM32746G_DISCOVERY_AUDIO - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_AUDIO_Exported_Types STM32746G_DISCOVERY_AUDIO Exported Types - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_AUDIO_Exported_Constants STM32746G_DISCOVERY_AUDIO Exported Constants - * @{ - */ - -/*------------------------------------------------------------------------------ - USER SAI defines parameters - -----------------------------------------------------------------------------*/ -/* CODEC_AudioFrame_SLOT_TDMMode - In W8994 codec the Audio frame contains 4 slots : TDM Mode - TDM format : - +------------------|------------------|--------------------|-------------------+ - | CODEC_SLOT0 Left | CODEC_SLOT1 Left | CODEC_SLOT0 Right | CODEC_SLOT1 Right | - +------------------------------------------------------------------------------+ - */ -/* To have 2 separate audio stream in Both headphone and speaker the 4 slot must be activated */ -#define CODEC_AUDIOFRAME_SLOT_0123 SAI_SLOTACTIVE_0 | SAI_SLOTACTIVE_1 | SAI_SLOTACTIVE_2 | SAI_SLOTACTIVE_3 -/* To have an audio stream in headphone only SAI Slot 0 and Slot 2 must be activated */ -#define CODEC_AUDIOFRAME_SLOT_02 SAI_SLOTACTIVE_0 | SAI_SLOTACTIVE_2 -/* To have an audio stream in speaker only SAI Slot 1 and Slot 3 must be activated */ -#define CODEC_AUDIOFRAME_SLOT_13 SAI_SLOTACTIVE_1 | SAI_SLOTACTIVE_3 - -/* SAI OUT peripheral configuration defines */ -#define AUDIO_OUT_SAIx SAI2_Block_A -#define AUDIO_OUT_SAIx_CLK_ENABLE() __HAL_RCC_SAI2_CLK_ENABLE() -#define AUDIO_OUT_SAIx_CLK_DISABLE() __HAL_RCC_SAI2_CLK_DISABLE() -#define AUDIO_OUT_SAIx_SCK_AF GPIO_AF10_SAI2 -#define AUDIO_OUT_SAIx_FS_SD_MCLK_AF GPIO_AF10_SAI2 - -#define AUDIO_OUT_SAIx_MCLK_ENABLE() __HAL_RCC_GPIOI_CLK_ENABLE() -#define AUDIO_OUT_SAIx_MCLK_GPIO_PORT GPIOI -#define AUDIO_OUT_SAIx_MCLK_PIN GPIO_PIN_4 -#define AUDIO_OUT_SAIx_SCK_SD_ENABLE() __HAL_RCC_GPIOI_CLK_ENABLE() -#define AUDIO_OUT_SAIx_SCK_SD_GPIO_PORT GPIOI -#define AUDIO_OUT_SAIx_SCK_PIN GPIO_PIN_5 -#define AUDIO_OUT_SAIx_SD_PIN GPIO_PIN_6 -#define AUDIO_OUT_SAIx_FS_ENABLE() __HAL_RCC_GPIOI_CLK_ENABLE() -#define AUDIO_OUT_SAIx_FS_GPIO_PORT GPIOI -#define AUDIO_OUT_SAIx_FS_PIN GPIO_PIN_7 - -/* SAI DMA Stream definitions */ -#define AUDIO_OUT_SAIx_DMAx_CLK_ENABLE() __HAL_RCC_DMA2_CLK_ENABLE() -#define AUDIO_OUT_SAIx_DMAx_STREAM DMA2_Stream4 -#define AUDIO_OUT_SAIx_DMAx_CHANNEL DMA_CHANNEL_3 -#define AUDIO_OUT_SAIx_DMAx_IRQ DMA2_Stream4_IRQn -#define AUDIO_OUT_SAIx_DMAx_PERIPH_DATA_SIZE DMA_PDATAALIGN_HALFWORD -#define AUDIO_OUT_SAIx_DMAx_MEM_DATA_SIZE DMA_MDATAALIGN_HALFWORD -#define DMA_MAX_SZE ((uint16_t)0xFFFF) - -#define AUDIO_OUT_SAIx_DMAx_IRQHandler DMA2_Stream4_IRQHandler - -/* Select the interrupt preemption priority for the DMA interrupt */ -#define AUDIO_OUT_IRQ_PREPRIO ((uint32_t)0x0E) /* Select the preemption priority level(0 is the highest) */ - -/*------------------------------------------------------------------------------ - AUDIO IN CONFIGURATION -------------------------------------------------------------------------------*/ -/* SAI IN peripheral configuration defines */ -#define AUDIO_IN_SAIx SAI2_Block_B -#define AUDIO_IN_SAIx_CLK_ENABLE() __HAL_RCC_SAI2_CLK_ENABLE() -#define AUDIO_IN_SAIx_CLK_DISABLE() __HAL_RCC_SAI2_CLK_DISABLE() -#define AUDIO_IN_SAIx_SD_AF GPIO_AF10_SAI2 - -#define AUDIO_IN_SAIx_SD_ENABLE() __HAL_RCC_GPIOG_CLK_ENABLE() -#define AUDIO_IN_SAIx_SD_GPIO_PORT GPIOG -#define AUDIO_IN_SAIx_SD_PIN GPIO_PIN_10 - -#define AUDIO_IN_INT_GPIO_ENABLE() __HAL_RCC_GPIOH_CLK_ENABLE() -#define AUDIO_IN_INT_GPIO_PORT GPIOH -#define AUDIO_IN_INT_GPIO_PIN GPIO_PIN_15 -#define AUDIO_IN_INT_IRQ EXTI15_10_IRQn - -/* SAI DMA Stream definitions */ -#define AUDIO_IN_SAIx_DMAx_CLK_ENABLE() __HAL_RCC_DMA2_CLK_ENABLE() -#define AUDIO_IN_SAIx_DMAx_STREAM DMA2_Stream7 -#define AUDIO_IN_SAIx_DMAx_CHANNEL DMA_CHANNEL_0 -#define AUDIO_IN_SAIx_DMAx_IRQ DMA2_Stream7_IRQn -#define AUDIO_IN_SAIx_DMAx_PERIPH_DATA_SIZE DMA_PDATAALIGN_HALFWORD -#define AUDIO_IN_SAIx_DMAx_MEM_DATA_SIZE DMA_MDATAALIGN_HALFWORD - -#define AUDIO_IN_SAIx_DMAx_IRQHandler DMA2_Stream7_IRQHandler -#define AUDIO_IN_INT_IRQHandler EXTI15_10_IRQHandler - -/* Select the interrupt preemption priority and subpriority for the IT/DMA interrupt */ -#define AUDIO_IN_IRQ_PREPRIO ((uint32_t)0x0F) /* Select the preemption priority level(0 is the highest) */ - -/*------------------------------------------------------------------------------ - CONFIGURATION: Audio Driver Configuration parameters -------------------------------------------------------------------------------*/ - -#define AUDIODATA_SIZE ((uint16_t)2) /* 16-bits audio data size */ - -/* Audio status definition */ -#define AUDIO_OK ((uint8_t)0) -#define AUDIO_ERROR ((uint8_t)1) -#define AUDIO_TIMEOUT ((uint8_t)2) - -/* AudioFreq * DataSize (2 bytes) * NumChannels (Stereo: 2) */ -#define DEFAULT_AUDIO_IN_FREQ I2S_AUDIOFREQ_16K -#define DEFAULT_AUDIO_IN_BIT_RESOLUTION ((uint8_t)16) -#define DEFAULT_AUDIO_IN_CHANNEL_NBR ((uint8_t)2) /* Mono = 1, Stereo = 2 */ -#define DEFAULT_AUDIO_IN_VOLUME ((uint16_t)64) - -/*------------------------------------------------------------------------------ - OPTIONAL Configuration defines parameters -------------------------------------------------------------------------------*/ - -/* Delay for the Codec to be correctly reset */ -#define CODEC_RESET_DELAY ((uint8_t)5) - - -/*------------------------------------------------------------------------------ - OUTPUT DEVICES definition -------------------------------------------------------------------------------*/ -/* Alias on existing output devices to adapt for 2 headphones output */ -#define OUTPUT_DEVICE_HEADPHONE1 OUTPUT_DEVICE_HEADPHONE -#define OUTPUT_DEVICE_HEADPHONE2 OUTPUT_DEVICE_SPEAKER /* Headphone2 is connected to Speaker output of the wm8994 */ - -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_AUDIO_Exported_Variables STM32746G_DISCOVERY_AUDIO Exported Variables - * @{ - */ -extern __IO uint16_t AudioInVolume; - /** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_AUDIO_Exported_Macros STM32746G_DISCOVERY_AUDIO Exported Macros - * @{ - */ -#define DMA_MAX(x) (((x) <= DMA_MAX_SZE)? (x):DMA_MAX_SZE) -/** - * @} - */ - -/** @addtogroup STM32746G_DISCOVERY_AUDIO_OUT_Exported_Functions - * @{ - */ -uint8_t BSP_AUDIO_OUT_Init(uint16_t OutputDevice, uint8_t Volume, uint32_t AudioFreq); -uint8_t BSP_AUDIO_OUT_Play(uint16_t* pBuffer, uint32_t Size); -void BSP_AUDIO_OUT_ChangeBuffer(uint16_t *pData, uint16_t Size); -uint8_t BSP_AUDIO_OUT_Pause(void); -uint8_t BSP_AUDIO_OUT_Resume(void); -uint8_t BSP_AUDIO_OUT_Stop(uint32_t Option); -uint8_t BSP_AUDIO_OUT_SetVolume(uint8_t Volume); -void BSP_AUDIO_OUT_SetFrequency(uint32_t AudioFreq); -void BSP_AUDIO_OUT_SetAudioFrameSlot(uint32_t AudioFrameSlot); -uint8_t BSP_AUDIO_OUT_SetMute(uint32_t Cmd); -uint8_t BSP_AUDIO_OUT_SetOutputMode(uint8_t Output); -void BSP_AUDIO_OUT_DeInit(void); - -/* User Callbacks: user has to implement these functions in his code if they are needed. */ -/* This function is called when the requested data has been completely transferred.*/ -void BSP_AUDIO_OUT_TransferComplete_CallBack(void); - -/* This function is called when half of the requested buffer has been transferred. */ -void BSP_AUDIO_OUT_HalfTransfer_CallBack(void); - -/* This function is called when an Interrupt due to transfer error on or peripheral - error occurs. */ -void BSP_AUDIO_OUT_Error_CallBack(void); - -/* These function can be modified in case the current settings (e.g. DMA stream) - need to be changed for specific application needs */ -void BSP_AUDIO_OUT_ClockConfig(SAI_HandleTypeDef *hsai, uint32_t AudioFreq, void *Params); -void BSP_AUDIO_OUT_MspInit(SAI_HandleTypeDef *hsai, void *Params); -void BSP_AUDIO_OUT_MspDeInit(SAI_HandleTypeDef *hsai, void *Params); - -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_AUDIO_IN_Exported_Functions STM32746G_DISCOVERY_AUDIO_IN Exported Functions - * @{ - */ -uint8_t BSP_AUDIO_IN_Init(uint32_t AudioFreq, uint32_t BitRes, uint32_t ChnlNbr); -uint8_t BSP_AUDIO_IN_InitEx(uint16_t InputDevice, uint32_t AudioFreq, uint32_t BitRes, uint32_t ChnlNbr); -uint8_t BSP_AUDIO_IN_OUT_Init(uint16_t InputDevice, uint16_t OutputDevice, uint32_t AudioFreq, uint32_t BitRes, uint32_t ChnlNbr); -uint8_t BSP_AUDIO_IN_Record(uint16_t *pData, uint32_t Size); -uint8_t BSP_AUDIO_IN_Stop(uint32_t Option); -uint8_t BSP_AUDIO_IN_Pause(void); -uint8_t BSP_AUDIO_IN_Resume(void); -uint8_t BSP_AUDIO_IN_SetVolume(uint8_t Volume); -void BSP_AUDIO_IN_DeInit(void); -/* User Callbacks: user has to implement these functions in his code if they are needed. */ -/* This function should be implemented by the user application. - It is called into this driver when the current buffer is filled to prepare the next - buffer pointer and its size. */ -void BSP_AUDIO_IN_TransferComplete_CallBack(void); -void BSP_AUDIO_IN_HalfTransfer_CallBack(void); - -/* This function is called when an Interrupt due to transfer error on or peripheral - error occurs. */ -void BSP_AUDIO_IN_Error_CallBack(void); - -/* These function can be modified in case the current settings (e.g. DMA stream) - need to be changed for specific application needs */ -void BSP_AUDIO_IN_MspInit(SAI_HandleTypeDef *hsai, void *Params); -void BSP_AUDIO_IN_MspDeInit(SAI_HandleTypeDef *hsai, void *Params); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32746G_DISCOVERY_AUDIO_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_camera.c --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_camera.c Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,678 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery_camera.c - * @author MCD Application Team - * @brief This file includes the driver for Camera modules mounted on - * STM32746G-Discovery board. - @verbatim - How to use this driver: - ------------------------ - - This driver is used to drive the camera. - - The OV9655 component driver MUST be included with this driver. - - Driver description: - ------------------- - + Initialization steps: - o Initialize the camera using the BSP_CAMERA_Init() function. - o Start the camera capture/snapshot using the CAMERA_Start() function. - o Suspend, resume or stop the camera capture using the following functions: - - BSP_CAMERA_Suspend() - - BSP_CAMERA_Resume() - - BSP_CAMERA_Stop() - - + Options - o Increase or decrease on the fly the brightness and/or contrast - using the following function: - - BSP_CAMERA_ContrastBrightnessConfig - o Add a special effect on the fly using the following functions: - - BSP_CAMERA_BlackWhiteConfig() - - BSP_CAMERA_ColorEffectConfig() - @endverbatim - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Dependencies -- stm32746g_discovery.c -- stm32f7xx_hal_dcmi.c -- stm32f7xx_hal_dma.c -- stm32f7xx_hal_gpio.c -- stm32f7xx_hal_cortex.c -- stm32f7xx_hal_rcc_ex.h -- ov9655.c -EndDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32746g_discovery_camera.h" -#include "stm32746g_discovery.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY_CAMERA - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_CAMERA_Private_TypesDefinitions STM32746G_DISCOVERY_CAMERA Private Types Definitions - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_CAMERA_Private_Defines STM32746G_DISCOVERY_CAMERA Private Defines - * @{ - */ -#define CAMERA_VGA_RES_X 640 -#define CAMERA_VGA_RES_Y 480 -#define CAMERA_480x272_RES_X 480 -#define CAMERA_480x272_RES_Y 272 -#define CAMERA_QVGA_RES_X 320 -#define CAMERA_QVGA_RES_Y 240 -#define CAMERA_QQVGA_RES_X 160 -#define CAMERA_QQVGA_RES_Y 120 -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_CAMERA_Private_Macros STM32746G_DISCOVERY_CAMERA Private Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_CAMERA_Private_Variables STM32746G_DISCOVERY_CAMERA Private Variables - * @{ - */ -DCMI_HandleTypeDef hDcmiHandler; -CAMERA_DrvTypeDef *camera_drv; -/* Camera current resolution naming (QQVGA, VGA, ...) */ -static uint32_t CameraCurrentResolution; - -/* Camera module I2C HW address */ -static uint32_t CameraHwAddress; -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_CAMERA_Private_FunctionPrototypes STM32746G_DISCOVERY_CAMERA Private Function Prototypes - * @{ - */ -static uint32_t GetSize(uint32_t resolution); -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_CAMERA_Exported_Functions STM32746G_DISCOVERY_CAMERA Exported Functions - * @{ - */ - -/** - * @brief Initializes the camera. - * @param Resolution : camera sensor requested resolution (x, y) : standard resolution - * naming QQVGA, QVGA, VGA ... - * @retval Camera status - */ -uint8_t BSP_CAMERA_Init(uint32_t Resolution) -{ - DCMI_HandleTypeDef *phdcmi; - uint8_t status = CAMERA_ERROR; - - /* Get the DCMI handle structure */ - phdcmi = &hDcmiHandler; - - /*** Configures the DCMI to interface with the camera module ***/ - /* DCMI configuration */ - phdcmi->Init.CaptureRate = DCMI_CR_ALL_FRAME; - phdcmi->Init.HSPolarity = DCMI_HSPOLARITY_LOW; - phdcmi->Init.SynchroMode = DCMI_SYNCHRO_HARDWARE; - phdcmi->Init.VSPolarity = DCMI_VSPOLARITY_HIGH; - phdcmi->Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B; - phdcmi->Init.PCKPolarity = DCMI_PCKPOLARITY_RISING; - phdcmi->Instance = DCMI; - - /* Power up camera */ - BSP_CAMERA_PwrUp(); - - /* Read ID of Camera module via I2C */ - if(ov9655_ReadID(CAMERA_I2C_ADDRESS) == OV9655_ID) - { - /* Initialize the camera driver structure */ - camera_drv = &ov9655_drv; - CameraHwAddress = CAMERA_I2C_ADDRESS; - - /* DCMI Initialization */ - BSP_CAMERA_MspInit(&hDcmiHandler, NULL); - HAL_DCMI_Init(phdcmi); - - /* Camera Module Initialization via I2C to the wanted 'Resolution' */ - if (Resolution == CAMERA_R480x272) - { /* For 480x272 resolution, the OV9655 sensor is set to VGA resolution - * as OV9655 doesn't supports 480x272 resolution, - * then DCMI is configured to output a 480x272 cropped window */ - camera_drv->Init(CameraHwAddress, CAMERA_R640x480); - HAL_DCMI_ConfigCROP(phdcmi, /* Crop in the middle of the VGA picture */ - (CAMERA_VGA_RES_X - CAMERA_480x272_RES_X)/2, - (CAMERA_VGA_RES_Y - CAMERA_480x272_RES_Y)/2, - (CAMERA_480x272_RES_X * 2) - 1, - CAMERA_480x272_RES_Y - 1); - HAL_DCMI_EnableCROP(phdcmi); - } - else - { - camera_drv->Init(CameraHwAddress, Resolution); - HAL_DCMI_DisableCROP(phdcmi); - } - - CameraCurrentResolution = Resolution; - - /* Return CAMERA_OK status */ - status = CAMERA_OK; - } - else - { - /* Return CAMERA_NOT_SUPPORTED status */ - status = CAMERA_NOT_SUPPORTED; - } - - return status; -} - -/** - * @brief DeInitializes the camera. - * @retval Camera status - */ -uint8_t BSP_CAMERA_DeInit(void) -{ - hDcmiHandler.Instance = DCMI; - - HAL_DCMI_DeInit(&hDcmiHandler); - BSP_CAMERA_MspDeInit(&hDcmiHandler, NULL); - return CAMERA_OK; -} - -/** - * @brief Starts the camera capture in continuous mode. - * @param buff: pointer to the camera output buffer - * @retval None - */ -void BSP_CAMERA_ContinuousStart(uint8_t *buff) -{ - /* Start the camera capture */ - HAL_DCMI_Start_DMA(&hDcmiHandler, DCMI_MODE_CONTINUOUS, (uint32_t)buff, GetSize(CameraCurrentResolution)); -} - -/** - * @brief Starts the camera capture in snapshot mode. - * @param buff: pointer to the camera output buffer - * @retval None - */ -void BSP_CAMERA_SnapshotStart(uint8_t *buff) -{ - /* Start the camera capture */ - HAL_DCMI_Start_DMA(&hDcmiHandler, DCMI_MODE_SNAPSHOT, (uint32_t)buff, GetSize(CameraCurrentResolution)); -} - -/** - * @brief Suspend the CAMERA capture - * @retval None - */ -void BSP_CAMERA_Suspend(void) -{ - /* Suspend the Camera Capture */ - HAL_DCMI_Suspend(&hDcmiHandler); -} - -/** - * @brief Resume the CAMERA capture - * @retval None - */ -void BSP_CAMERA_Resume(void) -{ - /* Start the Camera Capture */ - HAL_DCMI_Resume(&hDcmiHandler); -} - -/** - * @brief Stop the CAMERA capture - * @retval Camera status - */ -uint8_t BSP_CAMERA_Stop(void) -{ - uint8_t status = CAMERA_ERROR; - - if(HAL_DCMI_Stop(&hDcmiHandler) == HAL_OK) - { - status = CAMERA_OK; - } - - /* Set Camera in Power Down */ - BSP_CAMERA_PwrDown(); - - return status; -} - -/** - * @brief CANERA power up - * @retval None - */ -void BSP_CAMERA_PwrUp(void) -{ - GPIO_InitTypeDef gpio_init_structure; - - /* Enable GPIO clock */ - __HAL_RCC_GPIOH_CLK_ENABLE(); - - /*** Configure the GPIO ***/ - /* Configure DCMI GPIO as alternate function */ - gpio_init_structure.Pin = GPIO_PIN_13; - gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP; - gpio_init_structure.Pull = GPIO_NOPULL; - gpio_init_structure.Speed = GPIO_SPEED_HIGH; - HAL_GPIO_Init(GPIOH, &gpio_init_structure); - - /* De-assert the camera POWER_DOWN pin (active high) */ - HAL_GPIO_WritePin(GPIOH, GPIO_PIN_13, GPIO_PIN_RESET); - - HAL_Delay(3); /* POWER_DOWN de-asserted during 3ms */ -} - -/** - * @brief CAMERA power down - * @retval None - */ -void BSP_CAMERA_PwrDown(void) -{ - GPIO_InitTypeDef gpio_init_structure; - - /* Enable GPIO clock */ - __HAL_RCC_GPIOH_CLK_ENABLE(); - - /*** Configure the GPIO ***/ - /* Configure DCMI GPIO as alternate function */ - gpio_init_structure.Pin = GPIO_PIN_13; - gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP; - gpio_init_structure.Pull = GPIO_NOPULL; - gpio_init_structure.Speed = GPIO_SPEED_HIGH; - HAL_GPIO_Init(GPIOH, &gpio_init_structure); - - /* Assert the camera POWER_DOWN pin (active high) */ - HAL_GPIO_WritePin(GPIOH, GPIO_PIN_13, GPIO_PIN_SET); -} - -/** - * @brief Configures the camera contrast and brightness. - * @param contrast_level: Contrast level - * This parameter can be one of the following values: - * @arg CAMERA_CONTRAST_LEVEL4: for contrast +2 - * @arg CAMERA_CONTRAST_LEVEL3: for contrast +1 - * @arg CAMERA_CONTRAST_LEVEL2: for contrast 0 - * @arg CAMERA_CONTRAST_LEVEL1: for contrast -1 - * @arg CAMERA_CONTRAST_LEVEL0: for contrast -2 - * @param brightness_level: Contrast level - * This parameter can be one of the following values: - * @arg CAMERA_BRIGHTNESS_LEVEL4: for brightness +2 - * @arg CAMERA_BRIGHTNESS_LEVEL3: for brightness +1 - * @arg CAMERA_BRIGHTNESS_LEVEL2: for brightness 0 - * @arg CAMERA_BRIGHTNESS_LEVEL1: for brightness -1 - * @arg CAMERA_BRIGHTNESS_LEVEL0: for brightness -2 - * @retval None - */ -void BSP_CAMERA_ContrastBrightnessConfig(uint32_t contrast_level, uint32_t brightness_level) -{ - if(camera_drv->Config != NULL) - { - camera_drv->Config(CameraHwAddress, CAMERA_CONTRAST_BRIGHTNESS, contrast_level, brightness_level); - } -} - -/** - * @brief Configures the camera white balance. - * @param Mode: black_white mode - * This parameter can be one of the following values: - * @arg CAMERA_BLACK_WHITE_BW - * @arg CAMERA_BLACK_WHITE_NEGATIVE - * @arg CAMERA_BLACK_WHITE_BW_NEGATIVE - * @arg CAMERA_BLACK_WHITE_NORMAL - * @retval None - */ -void BSP_CAMERA_BlackWhiteConfig(uint32_t Mode) -{ - if(camera_drv->Config != NULL) - { - camera_drv->Config(CameraHwAddress, CAMERA_BLACK_WHITE, Mode, 0); - } -} - -/** - * @brief Configures the camera color effect. - * @param Effect: Color effect - * This parameter can be one of the following values: - * @arg CAMERA_COLOR_EFFECT_ANTIQUE - * @arg CAMERA_COLOR_EFFECT_BLUE - * @arg CAMERA_COLOR_EFFECT_GREEN - * @arg CAMERA_COLOR_EFFECT_RED - * @retval None - */ -void BSP_CAMERA_ColorEffectConfig(uint32_t Effect) -{ - if(camera_drv->Config != NULL) - { - camera_drv->Config(CameraHwAddress, CAMERA_COLOR_EFFECT, Effect, 0); - } -} - - -/** - * @brief Handles DCMI interrupt request. - * @retval None - */ -void BSP_CAMERA_IRQHandler(void) -{ - HAL_DCMI_IRQHandler(&hDcmiHandler); -} - -/** - * @brief Handles DMA interrupt request. - * @retval None - */ -void BSP_CAMERA_DMA_IRQHandler(void) -{ - HAL_DMA_IRQHandler(hDcmiHandler.DMA_Handle); -} - -/** - * @brief Get the capture size in pixels unit. - * @param resolution: the current resolution. - * @retval capture size in pixels unit. - */ -static uint32_t GetSize(uint32_t resolution) -{ - uint32_t size = 0; - - /* Get capture size */ - switch (resolution) - { - case CAMERA_R160x120: - { - size = 0x2580; - } - break; - case CAMERA_R320x240: - { - size = 0x9600; - } - break; - case CAMERA_R480x272: - { - size = 0xFF00; - } - break; - case CAMERA_R640x480: - { - size = 0x25800; - } - break; - default: - { - break; - } - } - - return size; -} - -/** - * @brief Initializes the DCMI MSP. - * @param hdcmi: HDMI handle - * @param Params - * @retval None - */ -__weak void BSP_CAMERA_MspInit(DCMI_HandleTypeDef *hdcmi, void *Params) -{ - static DMA_HandleTypeDef hdma_handler; - GPIO_InitTypeDef gpio_init_structure; - - /*** Enable peripherals and GPIO clocks ***/ - /* Enable DCMI clock */ - __HAL_RCC_DCMI_CLK_ENABLE(); - - /* Enable DMA2 clock */ - __HAL_RCC_DMA2_CLK_ENABLE(); - - /* Enable GPIO clocks */ - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOD_CLK_ENABLE(); - __HAL_RCC_GPIOE_CLK_ENABLE(); - __HAL_RCC_GPIOG_CLK_ENABLE(); - __HAL_RCC_GPIOH_CLK_ENABLE(); - - /*** Configure the GPIO ***/ - /* Configure DCMI GPIO as alternate function */ - gpio_init_structure.Pin = GPIO_PIN_4 | GPIO_PIN_6; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Pull = GPIO_PULLUP; - gpio_init_structure.Speed = GPIO_SPEED_HIGH; - gpio_init_structure.Alternate = GPIO_AF13_DCMI; - HAL_GPIO_Init(GPIOA, &gpio_init_structure); - - gpio_init_structure.Pin = GPIO_PIN_3; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Pull = GPIO_PULLUP; - gpio_init_structure.Speed = GPIO_SPEED_HIGH; - gpio_init_structure.Alternate = GPIO_AF13_DCMI; - HAL_GPIO_Init(GPIOD, &gpio_init_structure); - - gpio_init_structure.Pin = GPIO_PIN_5 | GPIO_PIN_6; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Pull = GPIO_PULLUP; - gpio_init_structure.Speed = GPIO_SPEED_HIGH; - gpio_init_structure.Alternate = GPIO_AF13_DCMI; - HAL_GPIO_Init(GPIOE, &gpio_init_structure); - - gpio_init_structure.Pin = GPIO_PIN_9; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Pull = GPIO_PULLUP; - gpio_init_structure.Speed = GPIO_SPEED_HIGH; - gpio_init_structure.Alternate = GPIO_AF13_DCMI; - HAL_GPIO_Init(GPIOG, &gpio_init_structure); - - gpio_init_structure.Pin = GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 |\ - GPIO_PIN_12 | GPIO_PIN_14; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Pull = GPIO_PULLUP; - gpio_init_structure.Speed = GPIO_SPEED_HIGH; - gpio_init_structure.Alternate = GPIO_AF13_DCMI; - HAL_GPIO_Init(GPIOH, &gpio_init_structure); - - /*** Configure the DMA ***/ - /* Set the parameters to be configured */ - hdma_handler.Init.Channel = DMA_CHANNEL_1; - hdma_handler.Init.Direction = DMA_PERIPH_TO_MEMORY; - hdma_handler.Init.PeriphInc = DMA_PINC_DISABLE; - hdma_handler.Init.MemInc = DMA_MINC_ENABLE; - hdma_handler.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; - hdma_handler.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; - hdma_handler.Init.Mode = DMA_CIRCULAR; - hdma_handler.Init.Priority = DMA_PRIORITY_HIGH; - hdma_handler.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - hdma_handler.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; - hdma_handler.Init.MemBurst = DMA_MBURST_SINGLE; - hdma_handler.Init.PeriphBurst = DMA_PBURST_SINGLE; - - hdma_handler.Instance = DMA2_Stream1; - - /* Associate the initialized DMA handle to the DCMI handle */ - __HAL_LINKDMA(hdcmi, DMA_Handle, hdma_handler); - - /*** Configure the NVIC for DCMI and DMA ***/ - /* NVIC configuration for DCMI transfer complete interrupt */ - HAL_NVIC_SetPriority(DCMI_IRQn, 0x0F, 0); - HAL_NVIC_EnableIRQ(DCMI_IRQn); - - /* NVIC configuration for DMA2D transfer complete interrupt */ - HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 0x0F, 0); - HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn); - - /* Configure the DMA stream */ - HAL_DMA_Init(hdcmi->DMA_Handle); -} - - -/** - * @brief DeInitializes the DCMI MSP. - * @param hdcmi: HDMI handle - * @param Params - * @retval None - */ -__weak void BSP_CAMERA_MspDeInit(DCMI_HandleTypeDef *hdcmi, void *Params) -{ - /* Disable NVIC for DCMI transfer complete interrupt */ - HAL_NVIC_DisableIRQ(DCMI_IRQn); - - /* Disable NVIC for DMA2 transfer complete interrupt */ - HAL_NVIC_DisableIRQ(DMA2_Stream1_IRQn); - - /* Configure the DMA stream */ - HAL_DMA_DeInit(hdcmi->DMA_Handle); - - /* Disable DCMI clock */ - __HAL_RCC_DCMI_CLK_DISABLE(); - - /* GPIO pins clock and DMA clock can be shut down in the application - by surcharging this __weak function */ -} - -/** - * @brief Line event callback - * @param hdcmi: pointer to the DCMI handle - * @retval None - */ -void HAL_DCMI_LineEventCallback(DCMI_HandleTypeDef *hdcmi) -{ - BSP_CAMERA_LineEventCallback(); -} - -/** - * @brief Line Event callback. - * @retval None - */ -__weak void BSP_CAMERA_LineEventCallback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DCMI_LineEventCallback could be implemented in the user file - */ -} - -/** - * @brief VSYNC event callback - * @param hdcmi: pointer to the DCMI handle - * @retval None - */ -void HAL_DCMI_VsyncEventCallback(DCMI_HandleTypeDef *hdcmi) -{ - BSP_CAMERA_VsyncEventCallback(); -} - -/** - * @brief VSYNC Event callback. - * @retval None - */ -__weak void BSP_CAMERA_VsyncEventCallback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DCMI_VsyncEventCallback could be implemented in the user file - */ -} - -/** - * @brief Frame event callback - * @param hdcmi: pointer to the DCMI handle - * @retval None - */ -void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi) -{ - BSP_CAMERA_FrameEventCallback(); -} - -/** - * @brief Frame Event callback. - * @retval None - */ -__weak void BSP_CAMERA_FrameEventCallback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DCMI_FrameEventCallback could be implemented in the user file - */ -} - -/** - * @brief Error callback - * @param hdcmi: pointer to the DCMI handle - * @retval None - */ -void HAL_DCMI_ErrorCallback(DCMI_HandleTypeDef *hdcmi) -{ - BSP_CAMERA_ErrorCallback(); -} - -/** - * @brief Error callback. - * @retval None - */ -__weak void BSP_CAMERA_ErrorCallback(void) -{ - /* NOTE : This function Should not be modified, when the callback is needed, - the HAL_DCMI_ErrorCallback could be implemented in the user file - */ -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_camera.h --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_camera.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,147 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery_camera.h - * @author MCD Application Team - * @brief This file contains the common defines and functions prototypes for - * the stm32746g_discovery_camera.c driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32746G_DISCOVERY_CAMERA_H -#define __STM32746G_DISCOVERY_CAMERA_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -/* Include Camera component Driver */ -#include "../Components/ov9655/ov9655.h" -#include "stm32746g_discovery.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY_CAMERA - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_CAMERA_Exported_Types STM32746G_DISCOVERY_CAMERA Exported Types - * @{ - */ - -/** - * @brief Camera State structures definition - */ -typedef enum -{ - CAMERA_OK = 0x00, - CAMERA_ERROR = 0x01, - CAMERA_TIMEOUT = 0x02, - CAMERA_NOT_DETECTED = 0x03, - CAMERA_NOT_SUPPORTED = 0x04 - -} Camera_StatusTypeDef; - -#define RESOLUTION_R160x120 CAMERA_R160x120 /* QQVGA Resolution */ -#define RESOLUTION_R320x240 CAMERA_R320x240 /* QVGA Resolution */ -#define RESOLUTION_R480x272 CAMERA_R480x272 /* 480x272 Resolution */ -#define RESOLUTION_R640x480 CAMERA_R640x480 /* VGA Resolution */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_CAMERA_Exported_Constants STM32746G_DISCOVERY_CAMERA Exported Constants - * @{ - */ -#define BSP_CAMERA_IRQHandler DCMI_IRQHandler -#define BSP_CAMERA_DMA_IRQHandler DMA2_Stream1_IRQHandler - -/** - * @} - */ - -/** @addtogroup STM32746G_DISCOVERY_CAMERA_Exported_Functions - * @{ - */ -uint8_t BSP_CAMERA_Init(uint32_t Resolution); -uint8_t BSP_CAMERA_DeInit(void); -void BSP_CAMERA_ContinuousStart(uint8_t *buff); -void BSP_CAMERA_SnapshotStart(uint8_t *buff); -void BSP_CAMERA_Suspend(void); -void BSP_CAMERA_Resume(void); -uint8_t BSP_CAMERA_Stop(void); -void BSP_CAMERA_PwrUp(void); -void BSP_CAMERA_PwrDown(void); -void BSP_CAMERA_LineEventCallback(void); -void BSP_CAMERA_VsyncEventCallback(void); -void BSP_CAMERA_FrameEventCallback(void); -void BSP_CAMERA_ErrorCallback(void); - -/* Camera features functions prototype */ -void BSP_CAMERA_ContrastBrightnessConfig(uint32_t contrast_level, uint32_t brightness_level); -void BSP_CAMERA_BlackWhiteConfig(uint32_t Mode); -void BSP_CAMERA_ColorEffectConfig(uint32_t Effect); - -/* These functions can be modified in case the current settings (e.g. DMA stream) - need to be changed for specific application needs */ -void BSP_CAMERA_MspInit(DCMI_HandleTypeDef *hdcmi, void *Params); -void BSP_CAMERA_MspDeInit(DCMI_HandleTypeDef *hdcmi, void *Params); - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32746G_DISCOVERY_CAMERA_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_eeprom.c --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_eeprom.c Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,477 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery_eeprom.c - * @author MCD Application Team - * @brief This file provides a set of functions needed to manage an I2C M24LR64 - * EEPROM memory. - @verbatim - To be able to use this driver, the switch EE_M24LR64 must be defined - in your toolchain compiler preprocessor - - =================================================================== - Notes: - - The I2C EEPROM memory (M24LR64) is available on separate daughter - board ANT7-M24LR-A, which is not provided with the STM32746G_DISCOVERY - board. - To use this driver you have to connect the ANT7-M24LR-A to CN3 - connector of STM32746G_DISCOVERY board. - =================================================================== - - It implements a high level communication layer for read and write - from/to this memory. The needed STM32F7xx hardware resources (I2C and - GPIO) are defined in stm32746g_discovery.h file, and the initialization is - performed in EEPROM_IO_Init() function declared in stm32746g_discovery.c - file. - You can easily tailor this driver to any other development board, - by just adapting the defines for hardware resources and - EEPROM_IO_Init() function. - - @note In this driver, basic read and write functions (BSP_EEPROM_ReadBuffer() - and BSP_EEPROM_WritePage()) use DMA mode to perform the data - transfer to/from EEPROM memory. - - @note Regarding BSP_EEPROM_WritePage(), it is an optimized function to perform - small write (less than 1 page) BUT the number of bytes (combined to write start address) must not - cross the EEPROM page boundary. This function can only writes into - the boundaries of an EEPROM page. - This function doesn't check on boundaries condition (in this driver - the function BSP_EEPROM_WriteBuffer() which calls BSP_EEPROM_WritePage() is - responsible of checking on Page boundaries). - - - +-----------------------------------------------------------------+ - | Pin assignment for M24LR64 EEPROM | - +---------------------------------------+-----------+-------------+ - | STM32F7xx I2C Pins | EEPROM | Pin | - +---------------------------------------+-----------+-------------+ - | . | E0(GND) | 1 (0V) | - | . | AC0 | 2 | - | . | AC1 | 3 | - | . | VSS | 4 (0V) | - | SDA | SDA | 5 | - | SCL | SCL | 6 | - | . | E1(GND) | 7 (0V) | - | . | VDD | 8 (3.3V) | - +---------------------------------------+-----------+-------------+ - @endverbatim - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Dependencies -- stm32746g_discovery.c -EndDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32746g_discovery_eeprom.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY_EEPROM - * @brief This file includes the I2C EEPROM driver of STM32746G-Discovery board. - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_EEPROM_Private_Types STM32746G_DISCOVERY_EEPROM Private Types - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_EEPROM_Private_Defines STM32746G_DISCOVERY_EEPROM Private Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_EEPROM_Private_Macros STM32746G_DISCOVERY_EEPROM Private Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_EEPROM_Private_Variables STM32746G_DISCOVERY_EEPROM Private Variables - * @{ - */ -__IO uint16_t EEPROMAddress = 0; -__IO uint16_t EEPROMDataRead; -__IO uint8_t EEPROMDataWrite; -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_EEPROM_Private_Function_Prototypes STM32746G_DISCOVERY_EEPROM Private Function Prototypes - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_EEPROM_Exported_Functions STM32746G_DISCOVERY_EEPROM Exported Functions - * @{ - */ - -/** - * @brief Initializes peripherals used by the I2C EEPROM driver. - * - * @note There are 2 different versions of M24LR64 (A01 & A02). - * Then try to connect on 1st one (EEPROM_I2C_ADDRESS_A01) - * and if problem, check the 2nd one (EEPROM_I2C_ADDRESS_A02) - * @retval EEPROM_OK (0) if operation is correctly performed, else return value - * different from EEPROM_OK (0) - */ -uint32_t BSP_EEPROM_Init(void) -{ - /* I2C Initialization */ - EEPROM_IO_Init(); - - /* Select the EEPROM address for A01 and check if OK */ - EEPROMAddress = EEPROM_I2C_ADDRESS_A01; - if(EEPROM_IO_IsDeviceReady(EEPROMAddress, EEPROM_MAX_TRIALS) != HAL_OK) - { - /* Select the EEPROM address for A02 and check if OK */ - EEPROMAddress = EEPROM_I2C_ADDRESS_A02; - if(EEPROM_IO_IsDeviceReady(EEPROMAddress, EEPROM_MAX_TRIALS) != HAL_OK) - { - return EEPROM_FAIL; - } - } - return EEPROM_OK; -} - -/** - * @brief DeInitializes the EEPROM. - * @retval EEPROM state - */ -uint8_t BSP_EEPROM_DeInit(void) -{ - /* I2C won't be disabled because common to other functionalities */ - return EEPROM_OK; -} - -/** - * @brief Reads a block of data from the EEPROM. - * @param pBuffer: pointer to the buffer that receives the data read from - * the EEPROM. - * @param ReadAddr: EEPROM's internal address to start reading from. - * @param NumByteToRead: pointer to the variable holding number of bytes to - * be read from the EEPROM. - * - * @note The variable pointed by NumByteToRead is reset to 0 when all the - * data are read from the EEPROM. Application should monitor this - * variable in order know when the transfer is complete. - * - * @retval EEPROM_OK (0) if operation is correctly performed, else return value - * different from EEPROM_OK (0) or the timeout user callback. - */ -uint32_t BSP_EEPROM_ReadBuffer(uint8_t* pBuffer, uint16_t ReadAddr, uint16_t* NumByteToRead) -{ - uint32_t buffersize = *NumByteToRead; - - /* Set the pointer to the Number of data to be read. This pointer will be used - by the DMA Transfer Completer interrupt Handler in order to reset the - variable to 0. User should check on this variable in order to know if the - DMA transfer has been complete or not. */ - EEPROMDataRead = *NumByteToRead; - - if(EEPROM_IO_ReadData(EEPROMAddress, ReadAddr, pBuffer, buffersize) != HAL_OK) - { - BSP_EEPROM_TIMEOUT_UserCallback(); - return EEPROM_FAIL; - } - - /* If all operations OK, return EEPROM_OK (0) */ - return EEPROM_OK; -} - -/** - * @brief Writes more than one byte to the EEPROM with a single WRITE cycle. - * - * @note The number of bytes (combined to write start address) must not - * cross the EEPROM page boundary. This function can only write into - * the boundaries of an EEPROM page. - * This function doesn't check on boundaries condition (in this driver - * the function BSP_EEPROM_WriteBuffer() which calls BSP_EEPROM_WritePage() is - * responsible of checking on Page boundaries). - * - * @param pBuffer: pointer to the buffer containing the data to be written to - * the EEPROM. - * @param WriteAddr: EEPROM's internal address to write to. - * @param NumByteToWrite: pointer to the variable holding number of bytes to - * be written into the EEPROM. - * - * @note The variable pointed by NumByteToWrite is reset to 0 when all the - * data are written to the EEPROM. Application should monitor this - * variable in order know when the transfer is complete. - * - * @note This function just configure the communication and enable the DMA - * channel to transfer data. Meanwhile, the user application may perform - * other tasks in parallel. - * - * @retval EEPROM_OK (0) if operation is correctly performed, else return value - * different from EEPROM_OK (0) or the timeout user callback. - */ -uint32_t BSP_EEPROM_WritePage(uint8_t* pBuffer, uint16_t WriteAddr, uint8_t* NumByteToWrite) -{ - uint32_t buffersize = *NumByteToWrite; - uint32_t status = EEPROM_OK; - - /* Set the pointer to the Number of data to be written. This pointer will be used - by the DMA Transfer Completer interrupt Handler in order to reset the - variable to 0. User should check on this variable in order to know if the - DMA transfer has been complete or not. */ - EEPROMDataWrite = *NumByteToWrite; - - if(EEPROM_IO_WriteData(EEPROMAddress, WriteAddr, pBuffer, buffersize) != HAL_OK) - { - BSP_EEPROM_TIMEOUT_UserCallback(); - status = EEPROM_FAIL; - } - - if(BSP_EEPROM_WaitEepromStandbyState() != EEPROM_OK) - { - return EEPROM_FAIL; - } - - /* If all operations OK, return EEPROM_OK (0) */ - return status; -} - -/** - * @brief Writes buffer of data to the I2C EEPROM. - * @param pBuffer: pointer to the buffer containing the data to be written - * to the EEPROM. - * @param WriteAddr: EEPROM's internal address to write to. - * @param NumByteToWrite: number of bytes to write to the EEPROM. - * @retval EEPROM_OK (0) if operation is correctly performed, else return value - * different from EEPROM_OK (0) or the timeout user callback. - */ -uint32_t BSP_EEPROM_WriteBuffer(uint8_t *pBuffer, uint16_t WriteAddr, uint16_t NumByteToWrite) -{ - uint16_t numofpage = 0, numofsingle = 0, count = 0; - uint16_t addr = 0; - uint8_t dataindex = 0; - uint32_t status = EEPROM_OK; - - addr = WriteAddr % EEPROM_PAGESIZE; - count = EEPROM_PAGESIZE - addr; - numofpage = NumByteToWrite / EEPROM_PAGESIZE; - numofsingle = NumByteToWrite % EEPROM_PAGESIZE; - - /* If WriteAddr is EEPROM_PAGESIZE aligned */ - if(addr == 0) - { - /* If NumByteToWrite < EEPROM_PAGESIZE */ - if(numofpage == 0) - { - /* Store the number of data to be written */ - dataindex = numofsingle; - /* Start writing data */ - status = BSP_EEPROM_WritePage(pBuffer, WriteAddr, (uint8_t*)(&dataindex)); - if(status != EEPROM_OK) - { - return status; - } - } - /* If NumByteToWrite > EEPROM_PAGESIZE */ - else - { - while(numofpage--) - { - /* Store the number of data to be written */ - dataindex = EEPROM_PAGESIZE; - status = BSP_EEPROM_WritePage(pBuffer, WriteAddr, (uint8_t*)(&dataindex)); - if(status != EEPROM_OK) - { - return status; - } - - WriteAddr += EEPROM_PAGESIZE; - pBuffer += EEPROM_PAGESIZE; - } - - if(numofsingle!=0) - { - /* Store the number of data to be written */ - dataindex = numofsingle; - status = BSP_EEPROM_WritePage(pBuffer, WriteAddr, (uint8_t*)(&dataindex)); - if(status != EEPROM_OK) - { - return status; - } - } - } - } - /* If WriteAddr is not EEPROM_PAGESIZE aligned */ - else - { - /* If NumByteToWrite < EEPROM_PAGESIZE */ - if(numofpage== 0) - { - /* If the number of data to be written is more than the remaining space - in the current page: */ - if(NumByteToWrite > count) - { - /* Store the number of data to be written */ - dataindex = count; - /* Write the data contained in same page */ - status = BSP_EEPROM_WritePage(pBuffer, WriteAddr, (uint8_t*)(&dataindex)); - if(status != EEPROM_OK) - { - return status; - } - - /* Store the number of data to be written */ - dataindex = (NumByteToWrite - count); - /* Write the remaining data in the following page */ - status = BSP_EEPROM_WritePage((uint8_t*)(pBuffer + count), (WriteAddr + count), (uint8_t*)(&dataindex)); - if(status != EEPROM_OK) - { - return status; - } - } - else - { - /* Store the number of data to be written */ - dataindex = numofsingle; - status = BSP_EEPROM_WritePage(pBuffer, WriteAddr, (uint8_t*)(&dataindex)); - if(status != EEPROM_OK) - { - return status; - } - } - } - /* If NumByteToWrite > EEPROM_PAGESIZE */ - else - { - NumByteToWrite -= count; - numofpage = NumByteToWrite / EEPROM_PAGESIZE; - numofsingle = NumByteToWrite % EEPROM_PAGESIZE; - - if(count != 0) - { - /* Store the number of data to be written */ - dataindex = count; - status = BSP_EEPROM_WritePage(pBuffer, WriteAddr, (uint8_t*)(&dataindex)); - if(status != EEPROM_OK) - { - return status; - } - WriteAddr += count; - pBuffer += count; - } - - while(numofpage--) - { - /* Store the number of data to be written */ - dataindex = EEPROM_PAGESIZE; - status = BSP_EEPROM_WritePage(pBuffer, WriteAddr, (uint8_t*)(&dataindex)); - if(status != EEPROM_OK) - { - return status; - } - WriteAddr += EEPROM_PAGESIZE; - pBuffer += EEPROM_PAGESIZE; - } - if(numofsingle != 0) - { - /* Store the number of data to be written */ - dataindex = numofsingle; - status = BSP_EEPROM_WritePage(pBuffer, WriteAddr, (uint8_t*)(&dataindex)); - if(status != EEPROM_OK) - { - return status; - } - } - } - } - - /* If all operations OK, return EEPROM_OK (0) */ - return EEPROM_OK; -} - -/** - * @brief Wait for EEPROM Standby state. - * - * @note This function allows to wait and check that EEPROM has finished the - * last operation. It is mostly used after Write operation: after receiving - * the buffer to be written, the EEPROM may need additional time to actually - * perform the write operation. During this time, it doesn't answer to - * I2C packets addressed to it. Once the write operation is complete - * the EEPROM responds to its address. - * - * @retval EEPROM_OK (0) if operation is correctly performed, else return value - * different from EEPROM_OK (0) or the timeout user callback. - */ -uint32_t BSP_EEPROM_WaitEepromStandbyState(void) -{ - /* Check if the maximum allowed number of trials has bee reached */ - if(EEPROM_IO_IsDeviceReady(EEPROMAddress, EEPROM_MAX_TRIALS) != HAL_OK) - { - /* If the maximum number of trials has been reached, exit the function */ - BSP_EEPROM_TIMEOUT_UserCallback(); - return EEPROM_TIMEOUT; - } - return EEPROM_OK; -} - -/** - * @brief Basic management of the timeout situation. - * @retval None - */ -__weak void BSP_EEPROM_TIMEOUT_UserCallback(void) -{ -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_eeprom.h --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_eeprom.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,138 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery_eeprom.h - * @author MCD Application Team - * @brief This file contains all the functions prototypes for - * the stm32746g_discovery_eeprom.c firmware driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32746G_DISCOVERY_EEPROM_H -#define __STM32746G_DISCOVERY_EEPROM_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32746g_discovery.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY_EEPROM - * @brief This file includes the I2C EEPROM driver of STM32746G-Discovery board. - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_EEPROM_Exported_Types STM32746G_DISCOVERY_EEPROM Exported Types - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_EEPROM_Exported_Constants STM32746G_DISCOVERY_EEPROM Exported Constants - * @{ - */ -/* EEPROM hardware address and page size */ -#define EEPROM_PAGESIZE ((uint8_t)4) -#define EEPROM_MAX_SIZE ((uint16_t)0x2000) /* 64Kbit */ - - -/* Maximum number of trials for EEPROM_WaitEepromStandbyState() function */ -#define EEPROM_MAX_TRIALS ((uint32_t)3000) - -#define EEPROM_OK ((uint32_t)0) -#define EEPROM_FAIL ((uint32_t)1) -#define EEPROM_TIMEOUT ((uint32_t)2) -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_EEPROM_Exported_Macros STM32746G_DISCOVERY_EEPROM Exported Macros - * @{ - */ -/** - * @} - */ - -/** @addtogroup STM32746G_DISCOVERY_EEPROM_Exported_Functions - * @{ - */ -uint32_t BSP_EEPROM_Init(void); -uint8_t BSP_EEPROM_DeInit(void); -uint32_t BSP_EEPROM_ReadBuffer(uint8_t* pBuffer, uint16_t ReadAddr, uint16_t* NumByteToRead); -uint32_t BSP_EEPROM_WritePage(uint8_t* pBuffer, uint16_t WriteAddr, uint8_t* NumByteToWrite); -uint32_t BSP_EEPROM_WriteBuffer(uint8_t* pBuffer, uint16_t WriteAddr, uint16_t NumByteToWrite); -uint32_t BSP_EEPROM_WaitEepromStandbyState(void); - -/* USER Callbacks: This function is declared as __weak in EEPROM driver and - should be implemented into user application. - BSP_EEPROM_TIMEOUT_UserCallback() function is called whenever a timeout condition - occurs during communication (waiting on an event that doesn't occur, bus - errors, busy devices ...). */ -void BSP_EEPROM_TIMEOUT_UserCallback(void); - -/* Link function for I2C EEPROM peripheral */ -void EEPROM_IO_Init(void); -HAL_StatusTypeDef EEPROM_IO_WriteData(uint16_t DevAddress, uint16_t MemAddress, uint8_t *pBuffer, uint32_t BufferSize); -HAL_StatusTypeDef EEPROM_IO_ReadData(uint16_t DevAddress, uint16_t MemAddress, uint8_t *pBuffer, uint32_t BufferSize); -HAL_StatusTypeDef EEPROM_IO_IsDeviceReady(uint16_t DevAddress, uint32_t Trials); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32746G_DISCOVERY_EEPROM_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_lcd.c --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_lcd.c Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1663 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery_lcd.c - * @author MCD Application Team - * @brief This file includes the driver for Liquid Crystal Display (LCD) module - * mounted on STM32746G-Discovery board. - @verbatim - 1. How To use this driver: - -------------------------- - - This driver is used to drive directly an LCD TFT using the LTDC controller. - - This driver uses timing and setting for RK043FN48H LCD. - - 2. Driver description: - --------------------- - + Initialization steps: - o Initialize the LCD using the BSP_LCD_Init() function. - o Apply the Layer configuration using the BSP_LCD_LayerDefaultInit() function. - o Select the LCD layer to be used using the BSP_LCD_SelectLayer() function. - o Enable the LCD display using the BSP_LCD_DisplayOn() function. - - + Options - o Configure and enable the color keying functionality using the - BSP_LCD_SetColorKeying() function. - o Modify in the fly the transparency and/or the frame buffer address - using the following functions: - - BSP_LCD_SetTransparency() - - BSP_LCD_SetLayerAddress() - - + Display on LCD - o Clear the hole LCD using BSP_LCD_Clear() function or only one specified string - line using the BSP_LCD_ClearStringLine() function. - o Display a character on the specified line and column using the BSP_LCD_DisplayChar() - function or a complete string line using the BSP_LCD_DisplayStringAtLine() function. - o Display a string line on the specified position (x,y in pixel) and align mode - using the BSP_LCD_DisplayStringAtLine() function. - o Draw and fill a basic shapes (dot, line, rectangle, circle, ellipse, .. bitmap) - on LCD using the available set of functions. - @endverbatim - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Dependencies -- stm32746g_discovery.c -- stm32746g_discovery_sdram.c -- stm32f7xx_hal_ltdc.c -- stm32f7xx_hal_ltdc_ex.c -- stm32f7xx_hal_dma2d.c -- stm32f7xx_hal_rcc_ex.c -- stm32f7xx_hal_gpio.c -- stm32f7xx_hal_cortex.c -- rk043fn48h.h -- fonts.h -- font24.c -- font20.c -- font16.c -- font12.c -- font8.c" -EndDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32746g_discovery_lcd.h" -#include "../../../Utilities/Fonts/fonts.h" -// MBED #include "../../../Utilities/Fonts/font24.c" -// MBED #include "../../../Utilities/Fonts/font20.c" -// MBED #include "../../../Utilities/Fonts/font16.c" -// MBED #include "../../../Utilities/Fonts/font12.c" -// MBED #include "../../../Utilities/Fonts/font8.c" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY_LCD - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_LCD_Private_TypesDefinitions STM32746G_DISCOVERY_LCD Private Types Definitions - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_LCD_Private_Defines STM32746G_DISCOVERY LCD Private Defines - * @{ - */ -#define POLY_X(Z) ((int32_t)((Points + Z)->X)) -#define POLY_Y(Z) ((int32_t)((Points + Z)->Y)) -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_LCD_Private_Macros STM32746G_DISCOVERY_LCD Private Macros - * @{ - */ -#define ABS(X) ((X) > 0 ? (X) : -(X)) -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_LCD_Private_Variables STM32746G_DISCOVERY_LCD Private Variables - * @{ - */ -LTDC_HandleTypeDef hLtdcHandler; -static DMA2D_HandleTypeDef hDma2dHandler; - -/* Default LCD configuration with LCD Layer 1 */ -static uint32_t ActiveLayer = 0; -static LCD_DrawPropTypeDef DrawProp[MAX_LAYER_NUMBER]; -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_LCD_Private_FunctionPrototypes STM32746G_DISCOVERY_LCD Private Function Prototypes - * @{ - */ -static void DrawChar(uint16_t Xpos, uint16_t Ypos, const uint8_t *c); -static void FillTriangle(uint16_t x1, uint16_t x2, uint16_t x3, uint16_t y1, uint16_t y2, uint16_t y3); -static void LL_FillBuffer(uint32_t LayerIndex, void *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t ColorIndex); -static void LL_ConvertLineToARGB8888(void * pSrc, void *pDst, uint32_t xSize, uint32_t ColorMode); -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_LCD_Exported_Functions STM32746G_DISCOVERY_LCD Exported Functions - * @{ - */ - -/** - * @brief Initializes the LCD. - * @retval LCD state - */ -uint8_t BSP_LCD_Init(void) -{ - /* Select the used LCD */ - - /* The RK043FN48H LCD 480x272 is selected */ - /* Timing Configuration */ - hLtdcHandler.Init.HorizontalSync = (RK043FN48H_HSYNC - 1); - hLtdcHandler.Init.VerticalSync = (RK043FN48H_VSYNC - 1); - hLtdcHandler.Init.AccumulatedHBP = (RK043FN48H_HSYNC + RK043FN48H_HBP - 1); - hLtdcHandler.Init.AccumulatedVBP = (RK043FN48H_VSYNC + RK043FN48H_VBP - 1); - hLtdcHandler.Init.AccumulatedActiveH = (RK043FN48H_HEIGHT + RK043FN48H_VSYNC + RK043FN48H_VBP - 1); - hLtdcHandler.Init.AccumulatedActiveW = (RK043FN48H_WIDTH + RK043FN48H_HSYNC + RK043FN48H_HBP - 1); - hLtdcHandler.Init.TotalHeigh = (RK043FN48H_HEIGHT + RK043FN48H_VSYNC + RK043FN48H_VBP + RK043FN48H_VFP - 1); - hLtdcHandler.Init.TotalWidth = (RK043FN48H_WIDTH + RK043FN48H_HSYNC + RK043FN48H_HBP + RK043FN48H_HFP - 1); - - /* LCD clock configuration */ - BSP_LCD_ClockConfig(&hLtdcHandler, NULL); - - /* Initialize the LCD pixel width and pixel height */ - hLtdcHandler.LayerCfg->ImageWidth = RK043FN48H_WIDTH; - hLtdcHandler.LayerCfg->ImageHeight = RK043FN48H_HEIGHT; - - /* Background value */ - hLtdcHandler.Init.Backcolor.Blue = 0; - hLtdcHandler.Init.Backcolor.Green = 0; - hLtdcHandler.Init.Backcolor.Red = 0; - - /* Polarity */ - hLtdcHandler.Init.HSPolarity = LTDC_HSPOLARITY_AL; - hLtdcHandler.Init.VSPolarity = LTDC_VSPOLARITY_AL; - hLtdcHandler.Init.DEPolarity = LTDC_DEPOLARITY_AL; - hLtdcHandler.Init.PCPolarity = LTDC_PCPOLARITY_IPC; - hLtdcHandler.Instance = LTDC; - - if(HAL_LTDC_GetState(&hLtdcHandler) == HAL_LTDC_STATE_RESET) - { - /* Initialize the LCD Msp: this __weak function can be rewritten by the application */ - BSP_LCD_MspInit(&hLtdcHandler, NULL); - } - HAL_LTDC_Init(&hLtdcHandler); - - /* Assert display enable LCD_DISP pin */ - HAL_GPIO_WritePin(LCD_DISP_GPIO_PORT, LCD_DISP_PIN, GPIO_PIN_SET); - - /* Assert backlight LCD_BL_CTRL pin */ - HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_PORT, LCD_BL_CTRL_PIN, GPIO_PIN_SET); - -#if !defined(DATA_IN_ExtSDRAM) - /* Initialize the SDRAM */ - BSP_SDRAM_Init(); -#endif - - /* Initialize the font */ - BSP_LCD_SetFont(&LCD_DEFAULT_FONT); - - return LCD_OK; -} - -/** - * @brief DeInitializes the LCD. - * @retval LCD state - */ -uint8_t BSP_LCD_DeInit(void) -{ - /* Initialize the hLtdcHandler Instance parameter */ - hLtdcHandler.Instance = LTDC; - - /* Disable LTDC block */ - __HAL_LTDC_DISABLE(&hLtdcHandler); - - /* DeInit the LTDC */ - HAL_LTDC_DeInit(&hLtdcHandler); - - /* DeInit the LTDC MSP : this __weak function can be rewritten by the application */ - BSP_LCD_MspDeInit(&hLtdcHandler, NULL); - - return LCD_OK; -} - -/** - * @brief Gets the LCD X size. - * @retval Used LCD X size - */ -uint32_t BSP_LCD_GetXSize(void) -{ - return hLtdcHandler.LayerCfg[ActiveLayer].ImageWidth; -} - -/** - * @brief Gets the LCD Y size. - * @retval Used LCD Y size - */ -uint32_t BSP_LCD_GetYSize(void) -{ - return hLtdcHandler.LayerCfg[ActiveLayer].ImageHeight; -} - -/** - * @brief Set the LCD X size. - * @param imageWidthPixels : image width in pixels unit - * @retval None - */ -void BSP_LCD_SetXSize(uint32_t imageWidthPixels) -{ - hLtdcHandler.LayerCfg[ActiveLayer].ImageWidth = imageWidthPixels; -} - -/** - * @brief Set the LCD Y size. - * @param imageHeightPixels : image height in lines unit - * @retval None - */ -void BSP_LCD_SetYSize(uint32_t imageHeightPixels) -{ - hLtdcHandler.LayerCfg[ActiveLayer].ImageHeight = imageHeightPixels; -} - -/** - * @brief Initializes the LCD layer in ARGB8888 format (32 bits per pixel). - * @param LayerIndex: Layer foreground or background - * @param FB_Address: Layer frame buffer - * @retval None - */ -void BSP_LCD_LayerDefaultInit(uint16_t LayerIndex, uint32_t FB_Address) -{ - LCD_LayerCfgTypeDef layer_cfg; - - /* Layer Init */ - layer_cfg.WindowX0 = 0; - layer_cfg.WindowX1 = BSP_LCD_GetXSize(); - layer_cfg.WindowY0 = 0; - layer_cfg.WindowY1 = BSP_LCD_GetYSize(); - layer_cfg.PixelFormat = LTDC_PIXEL_FORMAT_ARGB8888; - layer_cfg.FBStartAdress = FB_Address; - layer_cfg.Alpha = 255; - layer_cfg.Alpha0 = 0; - layer_cfg.Backcolor.Blue = 0; - layer_cfg.Backcolor.Green = 0; - layer_cfg.Backcolor.Red = 0; - layer_cfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA; - layer_cfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA; - layer_cfg.ImageWidth = BSP_LCD_GetXSize(); - layer_cfg.ImageHeight = BSP_LCD_GetYSize(); - - HAL_LTDC_ConfigLayer(&hLtdcHandler, &layer_cfg, LayerIndex); - - DrawProp[LayerIndex].BackColor = LCD_COLOR_WHITE; - DrawProp[LayerIndex].pFont = &Font24; - DrawProp[LayerIndex].TextColor = LCD_COLOR_BLACK; -} - -/** - * @brief Initializes the LCD layer in RGB565 format (16 bits per pixel). - * @param LayerIndex: Layer foreground or background - * @param FB_Address: Layer frame buffer - * @retval None - */ -void BSP_LCD_LayerRgb565Init(uint16_t LayerIndex, uint32_t FB_Address) -{ - LCD_LayerCfgTypeDef layer_cfg; - - /* Layer Init */ - layer_cfg.WindowX0 = 0; - layer_cfg.WindowX1 = BSP_LCD_GetXSize(); - layer_cfg.WindowY0 = 0; - layer_cfg.WindowY1 = BSP_LCD_GetYSize(); - layer_cfg.PixelFormat = LTDC_PIXEL_FORMAT_RGB565; - layer_cfg.FBStartAdress = FB_Address; - layer_cfg.Alpha = 255; - layer_cfg.Alpha0 = 0; - layer_cfg.Backcolor.Blue = 0; - layer_cfg.Backcolor.Green = 0; - layer_cfg.Backcolor.Red = 0; - layer_cfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_PAxCA; - layer_cfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_PAxCA; - layer_cfg.ImageWidth = BSP_LCD_GetXSize(); - layer_cfg.ImageHeight = BSP_LCD_GetYSize(); - - HAL_LTDC_ConfigLayer(&hLtdcHandler, &layer_cfg, LayerIndex); - - DrawProp[LayerIndex].BackColor = LCD_COLOR_WHITE; - DrawProp[LayerIndex].pFont = &Font24; - DrawProp[LayerIndex].TextColor = LCD_COLOR_BLACK; -} - -/** - * @brief Selects the LCD Layer. - * @param LayerIndex: Layer foreground or background - * @retval None - */ -void BSP_LCD_SelectLayer(uint32_t LayerIndex) -{ - ActiveLayer = LayerIndex; -} - -/** - * @brief Sets an LCD Layer visible - * @param LayerIndex: Visible Layer - * @param State: New state of the specified layer - * This parameter can be one of the following values: - * @arg ENABLE - * @arg DISABLE - * @retval None - */ -void BSP_LCD_SetLayerVisible(uint32_t LayerIndex, FunctionalState State) -{ - if(State == ENABLE) - { - __HAL_LTDC_LAYER_ENABLE(&hLtdcHandler, LayerIndex); - } - else - { - __HAL_LTDC_LAYER_DISABLE(&hLtdcHandler, LayerIndex); - } - __HAL_LTDC_RELOAD_CONFIG(&hLtdcHandler); -} - -/** - * @brief Sets an LCD Layer visible without reloading. - * @param LayerIndex: Visible Layer - * @param State: New state of the specified layer - * This parameter can be one of the following values: - * @arg ENABLE - * @arg DISABLE - * @retval None - */ -void BSP_LCD_SetLayerVisible_NoReload(uint32_t LayerIndex, FunctionalState State) -{ - if(State == ENABLE) - { - __HAL_LTDC_LAYER_ENABLE(&hLtdcHandler, LayerIndex); - } - else - { - __HAL_LTDC_LAYER_DISABLE(&hLtdcHandler, LayerIndex); - } - /* Do not Sets the Reload */ -} - -/** - * @brief Configures the transparency. - * @param LayerIndex: Layer foreground or background. - * @param Transparency: Transparency - * This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF - * @retval None - */ -void BSP_LCD_SetTransparency(uint32_t LayerIndex, uint8_t Transparency) -{ - HAL_LTDC_SetAlpha(&hLtdcHandler, Transparency, LayerIndex); -} - -/** - * @brief Configures the transparency without reloading. - * @param LayerIndex: Layer foreground or background. - * @param Transparency: Transparency - * This parameter must be a number between Min_Data = 0x00 and Max_Data = 0xFF - * @retval None - */ -void BSP_LCD_SetTransparency_NoReload(uint32_t LayerIndex, uint8_t Transparency) -{ - HAL_LTDC_SetAlpha_NoReload(&hLtdcHandler, Transparency, LayerIndex); -} - -/** - * @brief Sets an LCD layer frame buffer address. - * @param LayerIndex: Layer foreground or background - * @param Address: New LCD frame buffer value - * @retval None - */ -void BSP_LCD_SetLayerAddress(uint32_t LayerIndex, uint32_t Address) -{ - HAL_LTDC_SetAddress(&hLtdcHandler, Address, LayerIndex); -} - -/** - * @brief Sets an LCD layer frame buffer address without reloading. - * @param LayerIndex: Layer foreground or background - * @param Address: New LCD frame buffer value - * @retval None - */ -void BSP_LCD_SetLayerAddress_NoReload(uint32_t LayerIndex, uint32_t Address) -{ - HAL_LTDC_SetAddress_NoReload(&hLtdcHandler, Address, LayerIndex); -} - -/** - * @brief Sets display window. - * @param LayerIndex: Layer index - * @param Xpos: LCD X position - * @param Ypos: LCD Y position - * @param Width: LCD window width - * @param Height: LCD window height - * @retval None - */ -void BSP_LCD_SetLayerWindow(uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height) -{ - /* Reconfigure the layer size */ - HAL_LTDC_SetWindowSize(&hLtdcHandler, Width, Height, LayerIndex); - - /* Reconfigure the layer position */ - HAL_LTDC_SetWindowPosition(&hLtdcHandler, Xpos, Ypos, LayerIndex); -} - -/** - * @brief Sets display window without reloading. - * @param LayerIndex: Layer index - * @param Xpos: LCD X position - * @param Ypos: LCD Y position - * @param Width: LCD window width - * @param Height: LCD window height - * @retval None - */ -void BSP_LCD_SetLayerWindow_NoReload(uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height) -{ - /* Reconfigure the layer size */ - HAL_LTDC_SetWindowSize_NoReload(&hLtdcHandler, Width, Height, LayerIndex); - - /* Reconfigure the layer position */ - HAL_LTDC_SetWindowPosition_NoReload(&hLtdcHandler, Xpos, Ypos, LayerIndex); -} - -/** - * @brief Configures and sets the color keying. - * @param LayerIndex: Layer foreground or background - * @param RGBValue: Color reference - * @retval None - */ -void BSP_LCD_SetColorKeying(uint32_t LayerIndex, uint32_t RGBValue) -{ - /* Configure and Enable the color Keying for LCD Layer */ - HAL_LTDC_ConfigColorKeying(&hLtdcHandler, RGBValue, LayerIndex); - HAL_LTDC_EnableColorKeying(&hLtdcHandler, LayerIndex); -} - -/** - * @brief Configures and sets the color keying without reloading. - * @param LayerIndex: Layer foreground or background - * @param RGBValue: Color reference - * @retval None - */ -void BSP_LCD_SetColorKeying_NoReload(uint32_t LayerIndex, uint32_t RGBValue) -{ - /* Configure and Enable the color Keying for LCD Layer */ - HAL_LTDC_ConfigColorKeying_NoReload(&hLtdcHandler, RGBValue, LayerIndex); - HAL_LTDC_EnableColorKeying_NoReload(&hLtdcHandler, LayerIndex); -} - -/** - * @brief Disables the color keying. - * @param LayerIndex: Layer foreground or background - * @retval None - */ -void BSP_LCD_ResetColorKeying(uint32_t LayerIndex) -{ - /* Disable the color Keying for LCD Layer */ - HAL_LTDC_DisableColorKeying(&hLtdcHandler, LayerIndex); -} - -/** - * @brief Disables the color keying without reloading. - * @param LayerIndex: Layer foreground or background - * @retval None - */ -void BSP_LCD_ResetColorKeying_NoReload(uint32_t LayerIndex) -{ - /* Disable the color Keying for LCD Layer */ - HAL_LTDC_DisableColorKeying_NoReload(&hLtdcHandler, LayerIndex); -} - -/** - * @brief Disables the color keying without reloading. - * @param ReloadType: can be one of the following values - * - LCD_RELOAD_IMMEDIATE - * - LCD_RELOAD_VERTICAL_BLANKING - * @retval None - */ -void BSP_LCD_Reload(uint32_t ReloadType) -{ - HAL_LTDC_Reload (&hLtdcHandler, ReloadType); -} - -/** - * @brief Sets the LCD text color. - * @param Color: Text color code ARGB(8-8-8-8) - * @retval None - */ -void BSP_LCD_SetTextColor(uint32_t Color) -{ - DrawProp[ActiveLayer].TextColor = Color; -} - -/** - * @brief Gets the LCD text color. - * @retval Used text color. - */ -uint32_t BSP_LCD_GetTextColor(void) -{ - return DrawProp[ActiveLayer].TextColor; -} - -/** - * @brief Sets the LCD background color. - * @param Color: Layer background color code ARGB(8-8-8-8) - * @retval None - */ -void BSP_LCD_SetBackColor(uint32_t Color) -{ - DrawProp[ActiveLayer].BackColor = Color; -} - -/** - * @brief Gets the LCD background color. - * @retval Used background colour - */ -uint32_t BSP_LCD_GetBackColor(void) -{ - return DrawProp[ActiveLayer].BackColor; -} - -/** - * @brief Sets the LCD text font. - * @param fonts: Layer font to be used - * @retval None - */ -void BSP_LCD_SetFont(sFONT *fonts) -{ - DrawProp[ActiveLayer].pFont = fonts; -} - -/** - * @brief Gets the LCD text font. - * @retval Used layer font - */ -sFONT *BSP_LCD_GetFont(void) -{ - return DrawProp[ActiveLayer].pFont; -} - -/** - * @brief Reads an LCD pixel. - * @param Xpos: X position - * @param Ypos: Y position - * @retval RGB pixel color - */ -uint32_t BSP_LCD_ReadPixel(uint16_t Xpos, uint16_t Ypos) -{ - uint32_t ret = 0; - - if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB8888) - { - /* Read data value from SDRAM memory */ - ret = *(__IO uint32_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (4*(Ypos*BSP_LCD_GetXSize() + Xpos))); - } - else if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB888) - { - /* Read data value from SDRAM memory */ - ret = (*(__IO uint32_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (4*(Ypos*BSP_LCD_GetXSize() + Xpos))) & 0x00FFFFFF); - } - else if((hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) || \ - (hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_ARGB4444) || \ - (hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_AL88)) - { - /* Read data value from SDRAM memory */ - ret = *(__IO uint16_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (2*(Ypos*BSP_LCD_GetXSize() + Xpos))); - } - else - { - /* Read data value from SDRAM memory */ - ret = *(__IO uint8_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (2*(Ypos*BSP_LCD_GetXSize() + Xpos))); - } - - return ret; -} - -/** - * @brief Clears the hole LCD. - * @param Color: Color of the background - * @retval None - */ -void BSP_LCD_Clear(uint32_t Color) -{ - /* Clear the LCD */ - LL_FillBuffer(ActiveLayer, (uint32_t *)(hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress), BSP_LCD_GetXSize(), BSP_LCD_GetYSize(), 0, Color); -} - -/** - * @brief Clears the selected line. - * @param Line: Line to be cleared - * @retval None - */ -void BSP_LCD_ClearStringLine(uint32_t Line) -{ - uint32_t color_backup = DrawProp[ActiveLayer].TextColor; - DrawProp[ActiveLayer].TextColor = DrawProp[ActiveLayer].BackColor; - - /* Draw rectangle with background color */ - BSP_LCD_FillRect(0, (Line * DrawProp[ActiveLayer].pFont->Height), BSP_LCD_GetXSize(), DrawProp[ActiveLayer].pFont->Height); - - DrawProp[ActiveLayer].TextColor = color_backup; - BSP_LCD_SetTextColor(DrawProp[ActiveLayer].TextColor); -} - -/** - * @brief Displays one character. - * @param Xpos: Start column address - * @param Ypos: Line where to display the character shape. - * @param Ascii: Character ascii code - * This parameter must be a number between Min_Data = 0x20 and Max_Data = 0x7E - * @retval None - */ -void BSP_LCD_DisplayChar(uint16_t Xpos, uint16_t Ypos, uint8_t Ascii) -{ - DrawChar(Xpos, Ypos, &DrawProp[ActiveLayer].pFont->table[(Ascii-' ') *\ - DrawProp[ActiveLayer].pFont->Height * ((DrawProp[ActiveLayer].pFont->Width + 7) / 8)]); -} - -/** - * @brief Displays characters on the LCD. - * @param Xpos: X position (in pixel) - * @param Ypos: Y position (in pixel) - * @param Text: Pointer to string to display on LCD - * @param Mode: Display mode - * This parameter can be one of the following values: - * @arg CENTER_MODE - * @arg RIGHT_MODE - * @arg LEFT_MODE - * @retval None - */ -void BSP_LCD_DisplayStringAt(uint16_t Xpos, uint16_t Ypos, uint8_t *Text, Text_AlignModeTypdef Mode) -{ - uint16_t ref_column = 1, i = 0; - uint32_t size = 0, xsize = 0; - uint8_t *ptr = Text; - - /* Get the text size */ - while (*ptr++) size ++ ; - - /* Characters number per line */ - xsize = (BSP_LCD_GetXSize()/DrawProp[ActiveLayer].pFont->Width); - - switch (Mode) - { - case CENTER_MODE: - { - ref_column = Xpos + ((xsize - size)* DrawProp[ActiveLayer].pFont->Width) / 2; - break; - } - case LEFT_MODE: - { - ref_column = Xpos; - break; - } - case RIGHT_MODE: - { - ref_column = - Xpos + ((xsize - size)*DrawProp[ActiveLayer].pFont->Width); - break; - } - default: - { - ref_column = Xpos; - break; - } - } - - /* Check that the Start column is located in the screen */ - if ((ref_column < 1) || (ref_column >= 0x8000)) - { - ref_column = 1; - } - - /* Send the string character by character on LCD */ - while ((*Text != 0) & (((BSP_LCD_GetXSize() - (i*DrawProp[ActiveLayer].pFont->Width)) & 0xFFFF) >= DrawProp[ActiveLayer].pFont->Width)) - { - /* Display one character on LCD */ - BSP_LCD_DisplayChar(ref_column, Ypos, *Text); - /* Decrement the column position by 16 */ - ref_column += DrawProp[ActiveLayer].pFont->Width; - /* Point on the next character */ - Text++; - i++; - } -} - -/** - * @brief Displays a maximum of 60 characters on the LCD. - * @param Line: Line where to display the character shape - * @param ptr: Pointer to string to display on LCD - * @retval None - */ -void BSP_LCD_DisplayStringAtLine(uint16_t Line, uint8_t *ptr) -{ - BSP_LCD_DisplayStringAt(0, LINE(Line), ptr, LEFT_MODE); -} - -/** - * @brief Draws an horizontal line. - * @param Xpos: X position - * @param Ypos: Y position - * @param Length: Line length - * @retval None - */ -void BSP_LCD_DrawHLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length) -{ - uint32_t Xaddress = 0; - - /* Get the line address */ - if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) - { /* RGB565 format */ - Xaddress = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 2*(BSP_LCD_GetXSize()*Ypos + Xpos); - } - else - { /* ARGB8888 format */ - Xaddress = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 4*(BSP_LCD_GetXSize()*Ypos + Xpos); - } - - /* Write line */ - LL_FillBuffer(ActiveLayer, (uint32_t *)Xaddress, Length, 1, 0, DrawProp[ActiveLayer].TextColor); -} - -/** - * @brief Draws a vertical line. - * @param Xpos: X position - * @param Ypos: Y position - * @param Length: Line length - * @retval None - */ -void BSP_LCD_DrawVLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length) -{ - uint32_t Xaddress = 0; - - /* Get the line address */ - if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) - { /* RGB565 format */ - Xaddress = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 2*(BSP_LCD_GetXSize()*Ypos + Xpos); - } - else - { /* ARGB8888 format */ - Xaddress = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 4*(BSP_LCD_GetXSize()*Ypos + Xpos); - } - - /* Write line */ - LL_FillBuffer(ActiveLayer, (uint32_t *)Xaddress, 1, Length, (BSP_LCD_GetXSize() - 1), DrawProp[ActiveLayer].TextColor); -} - -/** - * @brief Draws an uni-line (between two points). - * @param x1: Point 1 X position - * @param y1: Point 1 Y position - * @param x2: Point 2 X position - * @param y2: Point 2 Y position - * @retval None - */ -void BSP_LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) -{ - int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0, - yinc1 = 0, yinc2 = 0, den = 0, num = 0, num_add = 0, num_pixels = 0, - curpixel = 0; - - deltax = ABS(x2 - x1); /* The difference between the x's */ - deltay = ABS(y2 - y1); /* The difference between the y's */ - x = x1; /* Start x off at the first pixel */ - y = y1; /* Start y off at the first pixel */ - - if (x2 >= x1) /* The x-values are increasing */ - { - xinc1 = 1; - xinc2 = 1; - } - else /* The x-values are decreasing */ - { - xinc1 = -1; - xinc2 = -1; - } - - if (y2 >= y1) /* The y-values are increasing */ - { - yinc1 = 1; - yinc2 = 1; - } - else /* The y-values are decreasing */ - { - yinc1 = -1; - yinc2 = -1; - } - - if (deltax >= deltay) /* There is at least one x-value for every y-value */ - { - xinc1 = 0; /* Don't change the x when numerator >= denominator */ - yinc2 = 0; /* Don't change the y for every iteration */ - den = deltax; - num = deltax / 2; - num_add = deltay; - num_pixels = deltax; /* There are more x-values than y-values */ - } - else /* There is at least one y-value for every x-value */ - { - xinc2 = 0; /* Don't change the x for every iteration */ - yinc1 = 0; /* Don't change the y when numerator >= denominator */ - den = deltay; - num = deltay / 2; - num_add = deltax; - num_pixels = deltay; /* There are more y-values than x-values */ - } - - for (curpixel = 0; curpixel <= num_pixels; curpixel++) - { - BSP_LCD_DrawPixel(x, y, DrawProp[ActiveLayer].TextColor); /* Draw the current pixel */ - num += num_add; /* Increase the numerator by the top of the fraction */ - if (num >= den) /* Check if numerator >= denominator */ - { - num -= den; /* Calculate the new numerator value */ - x += xinc1; /* Change the x as appropriate */ - y += yinc1; /* Change the y as appropriate */ - } - x += xinc2; /* Change the x as appropriate */ - y += yinc2; /* Change the y as appropriate */ - } -} - -/** - * @brief Draws a rectangle. - * @param Xpos: X position - * @param Ypos: Y position - * @param Width: Rectangle width - * @param Height: Rectangle height - * @retval None - */ -void BSP_LCD_DrawRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height) -{ - /* Draw horizontal lines */ - BSP_LCD_DrawHLine(Xpos, Ypos, Width); - BSP_LCD_DrawHLine(Xpos, (Ypos+ Height), Width); - - /* Draw vertical lines */ - BSP_LCD_DrawVLine(Xpos, Ypos, Height); - BSP_LCD_DrawVLine((Xpos + Width), Ypos, Height); -} - -/** - * @brief Draws a circle. - * @param Xpos: X position - * @param Ypos: Y position - * @param Radius: Circle radius - * @retval None - */ -void BSP_LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius) -{ - int32_t decision; /* Decision Variable */ - uint32_t current_x; /* Current X Value */ - uint32_t current_y; /* Current Y Value */ - - decision = 3 - (Radius << 1); - current_x = 0; - current_y = Radius; - - while (current_x <= current_y) - { - BSP_LCD_DrawPixel((Xpos + current_x), (Ypos - current_y), DrawProp[ActiveLayer].TextColor); - - BSP_LCD_DrawPixel((Xpos - current_x), (Ypos - current_y), DrawProp[ActiveLayer].TextColor); - - BSP_LCD_DrawPixel((Xpos + current_y), (Ypos - current_x), DrawProp[ActiveLayer].TextColor); - - BSP_LCD_DrawPixel((Xpos - current_y), (Ypos - current_x), DrawProp[ActiveLayer].TextColor); - - BSP_LCD_DrawPixel((Xpos + current_x), (Ypos + current_y), DrawProp[ActiveLayer].TextColor); - - BSP_LCD_DrawPixel((Xpos - current_x), (Ypos + current_y), DrawProp[ActiveLayer].TextColor); - - BSP_LCD_DrawPixel((Xpos + current_y), (Ypos + current_x), DrawProp[ActiveLayer].TextColor); - - BSP_LCD_DrawPixel((Xpos - current_y), (Ypos + current_x), DrawProp[ActiveLayer].TextColor); - - if (decision < 0) - { - decision += (current_x << 2) + 6; - } - else - { - decision += ((current_x - current_y) << 2) + 10; - current_y--; - } - current_x++; - } -} - -/** - * @brief Draws an poly-line (between many points). - * @param Points: Pointer to the points array - * @param PointCount: Number of points - * @retval None - */ -void BSP_LCD_DrawPolygon(pPoint Points, uint16_t PointCount) -{ - int16_t x = 0, y = 0; - - if(PointCount < 2) - { - return; - } - - BSP_LCD_DrawLine(Points->X, Points->Y, (Points+PointCount-1)->X, (Points+PointCount-1)->Y); - - while(--PointCount) - { - x = Points->X; - y = Points->Y; - Points++; - BSP_LCD_DrawLine(x, y, Points->X, Points->Y); - } -} - -/** - * @brief Draws an ellipse on LCD. - * @param Xpos: X position - * @param Ypos: Y position - * @param XRadius: Ellipse X radius - * @param YRadius: Ellipse Y radius - * @retval None - */ -void BSP_LCD_DrawEllipse(int Xpos, int Ypos, int XRadius, int YRadius) -{ - int x = 0, y = -YRadius, err = 2-2*XRadius, e2; - float k = 0, rad1 = 0, rad2 = 0; - - rad1 = XRadius; - rad2 = YRadius; - - k = (float)(rad2/rad1); - - do { - BSP_LCD_DrawPixel((Xpos-(uint16_t)(x/k)), (Ypos+y), DrawProp[ActiveLayer].TextColor); - BSP_LCD_DrawPixel((Xpos+(uint16_t)(x/k)), (Ypos+y), DrawProp[ActiveLayer].TextColor); - BSP_LCD_DrawPixel((Xpos+(uint16_t)(x/k)), (Ypos-y), DrawProp[ActiveLayer].TextColor); - BSP_LCD_DrawPixel((Xpos-(uint16_t)(x/k)), (Ypos-y), DrawProp[ActiveLayer].TextColor); - - e2 = err; - if (e2 <= x) { - err += ++x*2+1; - if (-y == x && e2 <= y) e2 = 0; - } - if (e2 > y) err += ++y*2+1; - } - while (y <= 0); -} - -/** - * @brief Draws a pixel on LCD. - * @param Xpos: X position - * @param Ypos: Y position - * @param RGB_Code: Pixel color in ARGB mode (8-8-8-8) - * @retval None - */ -void BSP_LCD_DrawPixel(uint16_t Xpos, uint16_t Ypos, uint32_t RGB_Code) -{ - /* Write data value to all SDRAM memory */ - if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) - { /* RGB565 format */ - *(__IO uint16_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (2*(Ypos*BSP_LCD_GetXSize() + Xpos))) = (uint16_t)RGB_Code; - } - else - { /* ARGB8888 format */ - *(__IO uint32_t*) (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (4*(Ypos*BSP_LCD_GetXSize() + Xpos))) = RGB_Code; - } -} - -/** - * @brief Draws a bitmap picture loaded in the internal Flash in ARGB888 format (32 bits per pixel). - * @param Xpos: Bmp X position in the LCD - * @param Ypos: Bmp Y position in the LCD - * @param pbmp: Pointer to Bmp picture address in the internal Flash - * @retval None - */ -void BSP_LCD_DrawBitmap(uint32_t Xpos, uint32_t Ypos, uint8_t *pbmp) -{ - uint32_t index = 0, width = 0, height = 0, bit_pixel = 0; - uint32_t address; - uint32_t input_color_mode = 0; - - /* Get bitmap data address offset */ - index = pbmp[10] + (pbmp[11] << 8) + (pbmp[12] << 16) + (pbmp[13] << 24); - - /* Read bitmap width */ - width = pbmp[18] + (pbmp[19] << 8) + (pbmp[20] << 16) + (pbmp[21] << 24); - - /* Read bitmap height */ - height = pbmp[22] + (pbmp[23] << 8) + (pbmp[24] << 16) + (pbmp[25] << 24); - - /* Read bit/pixel */ - bit_pixel = pbmp[28] + (pbmp[29] << 8); - - /* Set the address */ - address = hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress + (((BSP_LCD_GetXSize()*Ypos) + Xpos)*(4)); - - /* Get the layer pixel format */ - if ((bit_pixel/8) == 4) - { - input_color_mode = CM_ARGB8888; - } - else if ((bit_pixel/8) == 2) - { - input_color_mode = CM_RGB565; - } - else - { - input_color_mode = CM_RGB888; - } - - /* Bypass the bitmap header */ - pbmp += (index + (width * (height - 1) * (bit_pixel/8))); - - /* Convert picture to ARGB8888 pixel format */ - for(index=0; index < height; index++) - { - /* Pixel format conversion */ - LL_ConvertLineToARGB8888((uint32_t *)pbmp, (uint32_t *)address, width, input_color_mode); - - /* Increment the source and destination buffers */ - address+= (BSP_LCD_GetXSize()*4); - pbmp -= width*(bit_pixel/8); - } -} - -/** - * @brief Draws a full rectangle. - * @param Xpos: X position - * @param Ypos: Y position - * @param Width: Rectangle width - * @param Height: Rectangle height - * @retval None - */ -void BSP_LCD_FillRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height) -{ - uint32_t x_address = 0; - - /* Set the text color */ - BSP_LCD_SetTextColor(DrawProp[ActiveLayer].TextColor); - - /* Get the rectangle start address */ - if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) - { /* RGB565 format */ - x_address = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 2*(BSP_LCD_GetXSize()*Ypos + Xpos); - } - else - { /* ARGB8888 format */ - x_address = (hLtdcHandler.LayerCfg[ActiveLayer].FBStartAdress) + 4*(BSP_LCD_GetXSize()*Ypos + Xpos); - } - /* Fill the rectangle */ - LL_FillBuffer(ActiveLayer, (uint32_t *)x_address, Width, Height, (BSP_LCD_GetXSize() - Width), DrawProp[ActiveLayer].TextColor); -} - -/** - * @brief Draws a full circle. - * @param Xpos: X position - * @param Ypos: Y position - * @param Radius: Circle radius - * @retval None - */ -void BSP_LCD_FillCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius) -{ - int32_t decision; /* Decision Variable */ - uint32_t current_x; /* Current X Value */ - uint32_t current_y; /* Current Y Value */ - - decision = 3 - (Radius << 1); - - current_x = 0; - current_y = Radius; - - BSP_LCD_SetTextColor(DrawProp[ActiveLayer].TextColor); - - while (current_x <= current_y) - { - if(current_y > 0) - { - BSP_LCD_DrawHLine(Xpos - current_y, Ypos + current_x, 2*current_y); - BSP_LCD_DrawHLine(Xpos - current_y, Ypos - current_x, 2*current_y); - } - - if(current_x > 0) - { - BSP_LCD_DrawHLine(Xpos - current_x, Ypos - current_y, 2*current_x); - BSP_LCD_DrawHLine(Xpos - current_x, Ypos + current_y, 2*current_x); - } - if (decision < 0) - { - decision += (current_x << 2) + 6; - } - else - { - decision += ((current_x - current_y) << 2) + 10; - current_y--; - } - current_x++; - } - - BSP_LCD_SetTextColor(DrawProp[ActiveLayer].TextColor); - BSP_LCD_DrawCircle(Xpos, Ypos, Radius); -} - -/** - * @brief Draws a full poly-line (between many points). - * @param Points: Pointer to the points array - * @param PointCount: Number of points - * @retval None - */ -void BSP_LCD_FillPolygon(pPoint Points, uint16_t PointCount) -{ - int16_t X = 0, Y = 0, X2 = 0, Y2 = 0, X_center = 0, Y_center = 0, X_first = 0, Y_first = 0, pixelX = 0, pixelY = 0, counter = 0; - uint16_t image_left = 0, image_right = 0, image_top = 0, image_bottom = 0; - - image_left = image_right = Points->X; - image_top= image_bottom = Points->Y; - - for(counter = 1; counter < PointCount; counter++) - { - pixelX = POLY_X(counter); - if(pixelX < image_left) - { - image_left = pixelX; - } - if(pixelX > image_right) - { - image_right = pixelX; - } - - pixelY = POLY_Y(counter); - if(pixelY < image_top) - { - image_top = pixelY; - } - if(pixelY > image_bottom) - { - image_bottom = pixelY; - } - } - - if(PointCount < 2) - { - return; - } - - X_center = (image_left + image_right)/2; - Y_center = (image_bottom + image_top)/2; - - X_first = Points->X; - Y_first = Points->Y; - - while(--PointCount) - { - X = Points->X; - Y = Points->Y; - Points++; - X2 = Points->X; - Y2 = Points->Y; - - FillTriangle(X, X2, X_center, Y, Y2, Y_center); - FillTriangle(X, X_center, X2, Y, Y_center, Y2); - FillTriangle(X_center, X2, X, Y_center, Y2, Y); - } - - FillTriangle(X_first, X2, X_center, Y_first, Y2, Y_center); - FillTriangle(X_first, X_center, X2, Y_first, Y_center, Y2); - FillTriangle(X_center, X2, X_first, Y_center, Y2, Y_first); -} - -/** - * @brief Draws a full ellipse. - * @param Xpos: X position - * @param Ypos: Y position - * @param XRadius: Ellipse X radius - * @param YRadius: Ellipse Y radius - * @retval None - */ -void BSP_LCD_FillEllipse(int Xpos, int Ypos, int XRadius, int YRadius) -{ - int x = 0, y = -YRadius, err = 2-2*XRadius, e2; - float k = 0, rad1 = 0, rad2 = 0; - - rad1 = XRadius; - rad2 = YRadius; - - k = (float)(rad2/rad1); - - do - { - BSP_LCD_DrawHLine((Xpos-(uint16_t)(x/k)), (Ypos+y), (2*(uint16_t)(x/k) + 1)); - BSP_LCD_DrawHLine((Xpos-(uint16_t)(x/k)), (Ypos-y), (2*(uint16_t)(x/k) + 1)); - - e2 = err; - if (e2 <= x) - { - err += ++x*2+1; - if (-y == x && e2 <= y) e2 = 0; - } - if (e2 > y) err += ++y*2+1; - } - while (y <= 0); -} - -/** - * @brief Enables the display. - * @retval None - */ -void BSP_LCD_DisplayOn(void) -{ - /* Display On */ - __HAL_LTDC_ENABLE(&hLtdcHandler); - HAL_GPIO_WritePin(LCD_DISP_GPIO_PORT, LCD_DISP_PIN, GPIO_PIN_SET); /* Assert LCD_DISP pin */ - HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_PORT, LCD_BL_CTRL_PIN, GPIO_PIN_SET); /* Assert LCD_BL_CTRL pin */ -} - -/** - * @brief Disables the display. - * @retval None - */ -void BSP_LCD_DisplayOff(void) -{ - /* Display Off */ - __HAL_LTDC_DISABLE(&hLtdcHandler); - HAL_GPIO_WritePin(LCD_DISP_GPIO_PORT, LCD_DISP_PIN, GPIO_PIN_RESET); /* De-assert LCD_DISP pin */ - HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_PORT, LCD_BL_CTRL_PIN, GPIO_PIN_RESET);/* De-assert LCD_BL_CTRL pin */ -} - -/** - * @brief Initializes the LTDC MSP. - * @param hltdc: LTDC handle - * @param Params - * @retval None - */ -__weak void BSP_LCD_MspInit(LTDC_HandleTypeDef *hltdc, void *Params) -{ - GPIO_InitTypeDef gpio_init_structure; - - /* Enable the LTDC and DMA2D clocks */ - __HAL_RCC_LTDC_CLK_ENABLE(); - __HAL_RCC_DMA2D_CLK_ENABLE(); - - /* Enable GPIOs clock */ - __HAL_RCC_GPIOE_CLK_ENABLE(); - __HAL_RCC_GPIOG_CLK_ENABLE(); - __HAL_RCC_GPIOI_CLK_ENABLE(); - __HAL_RCC_GPIOJ_CLK_ENABLE(); - __HAL_RCC_GPIOK_CLK_ENABLE(); - LCD_DISP_GPIO_CLK_ENABLE(); - LCD_BL_CTRL_GPIO_CLK_ENABLE(); - - /*** LTDC Pins configuration ***/ - /* GPIOE configuration */ - gpio_init_structure.Pin = GPIO_PIN_4; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Pull = GPIO_NOPULL; - gpio_init_structure.Speed = GPIO_SPEED_FAST; - gpio_init_structure.Alternate = GPIO_AF14_LTDC; - HAL_GPIO_Init(GPIOE, &gpio_init_structure); - - /* GPIOG configuration */ - gpio_init_structure.Pin = GPIO_PIN_12; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Alternate = GPIO_AF9_LTDC; - HAL_GPIO_Init(GPIOG, &gpio_init_structure); - - /* GPIOI LTDC alternate configuration */ - gpio_init_structure.Pin = GPIO_PIN_9 | GPIO_PIN_10 | \ - GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Alternate = GPIO_AF14_LTDC; - HAL_GPIO_Init(GPIOI, &gpio_init_structure); - - /* GPIOJ configuration */ - gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | \ - GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | \ - GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | \ - GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Alternate = GPIO_AF14_LTDC; - HAL_GPIO_Init(GPIOJ, &gpio_init_structure); - - /* GPIOK configuration */ - gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | \ - GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Alternate = GPIO_AF14_LTDC; - HAL_GPIO_Init(GPIOK, &gpio_init_structure); - - /* LCD_DISP GPIO configuration */ - gpio_init_structure.Pin = LCD_DISP_PIN; /* LCD_DISP pin has to be manually controlled */ - gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP; - HAL_GPIO_Init(LCD_DISP_GPIO_PORT, &gpio_init_structure); - - /* LCD_BL_CTRL GPIO configuration */ - gpio_init_structure.Pin = LCD_BL_CTRL_PIN; /* LCD_BL_CTRL pin has to be manually controlled */ - gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP; - HAL_GPIO_Init(LCD_BL_CTRL_GPIO_PORT, &gpio_init_structure); -} - -/** - * @brief DeInitializes BSP_LCD MSP. - * @param hltdc: LTDC handle - * @param Params - * @retval None - */ -__weak void BSP_LCD_MspDeInit(LTDC_HandleTypeDef *hltdc, void *Params) -{ - GPIO_InitTypeDef gpio_init_structure; - - /* Disable LTDC block */ - __HAL_LTDC_DISABLE(hltdc); - - /* LTDC Pins deactivation */ - - /* GPIOE deactivation */ - gpio_init_structure.Pin = GPIO_PIN_4; - HAL_GPIO_DeInit(GPIOE, gpio_init_structure.Pin); - - /* GPIOG deactivation */ - gpio_init_structure.Pin = GPIO_PIN_12; - HAL_GPIO_DeInit(GPIOG, gpio_init_structure.Pin); - - /* GPIOI deactivation */ - gpio_init_structure.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_12 | \ - GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; - HAL_GPIO_DeInit(GPIOI, gpio_init_structure.Pin); - - /* GPIOJ deactivation */ - gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 | \ - GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7 | \ - GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | \ - GPIO_PIN_13 | GPIO_PIN_14 | GPIO_PIN_15; - HAL_GPIO_DeInit(GPIOJ, gpio_init_structure.Pin); - - /* GPIOK deactivation */ - gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_4 | \ - GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; - HAL_GPIO_DeInit(GPIOK, gpio_init_structure.Pin); - - /* Disable LTDC clock */ - __HAL_RCC_LTDC_CLK_DISABLE(); - - /* GPIO pins clock can be shut down in the application - by surcharging this __weak function */ -} - -/** - * @brief Clock Config. - * @param hltdc: LTDC handle - * @param Params - * @note This API is called by BSP_LCD_Init() - * Being __weak it can be overwritten by the application - * @retval None - */ -__weak void BSP_LCD_ClockConfig(LTDC_HandleTypeDef *hltdc, void *Params) -{ - static RCC_PeriphCLKInitTypeDef periph_clk_init_struct; - - /* RK043FN48H LCD clock configuration */ - /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */ - /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAIN = 192 Mhz */ - /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAIR = 192/5 = 38.4 Mhz */ - /* LTDC clock frequency = PLLLCDCLK / LTDC_PLLSAI_DIVR_4 = 38.4/4 = 9.6Mhz */ - periph_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK_LTDC; - periph_clk_init_struct.PLLSAI.PLLSAIN = 192; - periph_clk_init_struct.PLLSAI.PLLSAIR = RK043FN48H_FREQUENCY_DIVIDER; - periph_clk_init_struct.PLLSAIDivR = RCC_PLLSAIDIVR_4; - HAL_RCCEx_PeriphCLKConfig(&periph_clk_init_struct); -} - - -/******************************************************************************* - Static Functions -*******************************************************************************/ - -/** - * @brief Draws a character on LCD. - * @param Xpos: Line where to display the character shape - * @param Ypos: Start column address - * @param c: Pointer to the character data - * @retval None - */ -static void DrawChar(uint16_t Xpos, uint16_t Ypos, const uint8_t *c) -{ - uint32_t i = 0, j = 0; - uint16_t height, width; - uint8_t offset; - uint8_t *pchar; - uint32_t line; - - height = DrawProp[ActiveLayer].pFont->Height; - width = DrawProp[ActiveLayer].pFont->Width; - - offset = 8 *((width + 7)/8) - width ; - - for(i = 0; i < height; i++) - { - pchar = ((uint8_t *)c + (width + 7)/8 * i); - - switch(((width + 7)/8)) - { - - case 1: - line = pchar[0]; - break; - - case 2: - line = (pchar[0]<< 8) | pchar[1]; - break; - - case 3: - default: - line = (pchar[0]<< 16) | (pchar[1]<< 8) | pchar[2]; - break; - } - - for (j = 0; j < width; j++) - { - if(line & (1 << (width- j + offset- 1))) - { - BSP_LCD_DrawPixel((Xpos + j), Ypos, DrawProp[ActiveLayer].TextColor); - } - else - { - BSP_LCD_DrawPixel((Xpos + j), Ypos, DrawProp[ActiveLayer].BackColor); - } - } - Ypos++; - } -} - -/** - * @brief Fills a triangle (between 3 points). - * @param x1: Point 1 X position - * @param y1: Point 1 Y position - * @param x2: Point 2 X position - * @param y2: Point 2 Y position - * @param x3: Point 3 X position - * @param y3: Point 3 Y position - * @retval None - */ -static void FillTriangle(uint16_t x1, uint16_t x2, uint16_t x3, uint16_t y1, uint16_t y2, uint16_t y3) -{ - int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0, - yinc1 = 0, yinc2 = 0, den = 0, num = 0, num_add = 0, num_pixels = 0, - curpixel = 0; - - deltax = ABS(x2 - x1); /* The difference between the x's */ - deltay = ABS(y2 - y1); /* The difference between the y's */ - x = x1; /* Start x off at the first pixel */ - y = y1; /* Start y off at the first pixel */ - - if (x2 >= x1) /* The x-values are increasing */ - { - xinc1 = 1; - xinc2 = 1; - } - else /* The x-values are decreasing */ - { - xinc1 = -1; - xinc2 = -1; - } - - if (y2 >= y1) /* The y-values are increasing */ - { - yinc1 = 1; - yinc2 = 1; - } - else /* The y-values are decreasing */ - { - yinc1 = -1; - yinc2 = -1; - } - - if (deltax >= deltay) /* There is at least one x-value for every y-value */ - { - xinc1 = 0; /* Don't change the x when numerator >= denominator */ - yinc2 = 0; /* Don't change the y for every iteration */ - den = deltax; - num = deltax / 2; - num_add = deltay; - num_pixels = deltax; /* There are more x-values than y-values */ - } - else /* There is at least one y-value for every x-value */ - { - xinc2 = 0; /* Don't change the x for every iteration */ - yinc1 = 0; /* Don't change the y when numerator >= denominator */ - den = deltay; - num = deltay / 2; - num_add = deltax; - num_pixels = deltay; /* There are more y-values than x-values */ - } - - for (curpixel = 0; curpixel <= num_pixels; curpixel++) - { - BSP_LCD_DrawLine(x, y, x3, y3); - - num += num_add; /* Increase the numerator by the top of the fraction */ - if (num >= den) /* Check if numerator >= denominator */ - { - num -= den; /* Calculate the new numerator value */ - x += xinc1; /* Change the x as appropriate */ - y += yinc1; /* Change the y as appropriate */ - } - x += xinc2; /* Change the x as appropriate */ - y += yinc2; /* Change the y as appropriate */ - } -} - -/** - * @brief Fills a buffer. - * @param LayerIndex: Layer index - * @param pDst: Pointer to destination buffer - * @param xSize: Buffer width - * @param ySize: Buffer height - * @param OffLine: Offset - * @param ColorIndex: Color index - * @retval None - */ -static void LL_FillBuffer(uint32_t LayerIndex, void *pDst, uint32_t xSize, uint32_t ySize, uint32_t OffLine, uint32_t ColorIndex) -{ - /* Register to memory mode with ARGB8888 as color Mode */ - hDma2dHandler.Init.Mode = DMA2D_R2M; - if(hLtdcHandler.LayerCfg[ActiveLayer].PixelFormat == LTDC_PIXEL_FORMAT_RGB565) - { /* RGB565 format */ - hDma2dHandler.Init.ColorMode = DMA2D_RGB565; - } - else - { /* ARGB8888 format */ - hDma2dHandler.Init.ColorMode = DMA2D_ARGB8888; - } - hDma2dHandler.Init.OutputOffset = OffLine; - - hDma2dHandler.Instance = DMA2D; - - /* DMA2D Initialization */ - if(HAL_DMA2D_Init(&hDma2dHandler) == HAL_OK) - { - if(HAL_DMA2D_ConfigLayer(&hDma2dHandler, LayerIndex) == HAL_OK) - { - if (HAL_DMA2D_Start(&hDma2dHandler, ColorIndex, (uint32_t)pDst, xSize, ySize) == HAL_OK) - { - /* Polling For DMA transfer */ - HAL_DMA2D_PollForTransfer(&hDma2dHandler, 10); - } - } - } -} - -/** - * @brief Converts a line to an ARGB8888 pixel format. - * @param pSrc: Pointer to source buffer - * @param pDst: Output color - * @param xSize: Buffer width - * @param ColorMode: Input color mode - * @retval None - */ -static void LL_ConvertLineToARGB8888(void *pSrc, void *pDst, uint32_t xSize, uint32_t ColorMode) -{ - /* Configure the DMA2D Mode, Color Mode and output offset */ - hDma2dHandler.Init.Mode = DMA2D_M2M_PFC; - hDma2dHandler.Init.ColorMode = DMA2D_ARGB8888; - hDma2dHandler.Init.OutputOffset = 0; - - /* Foreground Configuration */ - hDma2dHandler.LayerCfg[1].AlphaMode = DMA2D_NO_MODIF_ALPHA; - hDma2dHandler.LayerCfg[1].InputAlpha = 0xFF; - hDma2dHandler.LayerCfg[1].InputColorMode = ColorMode; - hDma2dHandler.LayerCfg[1].InputOffset = 0; - - hDma2dHandler.Instance = DMA2D; - - /* DMA2D Initialization */ - if(HAL_DMA2D_Init(&hDma2dHandler) == HAL_OK) - { - if(HAL_DMA2D_ConfigLayer(&hDma2dHandler, 1) == HAL_OK) - { - if (HAL_DMA2D_Start(&hDma2dHandler, (uint32_t)pSrc, (uint32_t)pDst, xSize, 1) == HAL_OK) - { - /* Polling For DMA transfer */ - HAL_DMA2D_PollForTransfer(&hDma2dHandler, 10); - } - } - } -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_lcd.h --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_lcd.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,267 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery_lcd.h - * @author MCD Application Team - * @brief This file contains the common defines and functions prototypes for - * the stm32746g_discovery_lcd.c driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32746G_DISCOVERY_LCD_H -#define __STM32746G_DISCOVERY_LCD_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -/* Include LCD component Driver */ -/* LCD RK043FN48H-CT672B 4,3" 480x272 pixels */ -#include "../Components/rk043fn48h/rk043fn48h.h" - -/* Include SDRAM Driver */ -#include "stm32746g_discovery_sdram.h" - -#include "stm32746g_discovery.h" -#include "../../../Utilities/Fonts/fonts.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY_LCD - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_LCD_Exported_Types STM32746G_DISCOVERY_LCD Exported Types - * @{ - */ -typedef struct -{ - uint32_t TextColor; - uint32_t BackColor; - sFONT *pFont; -}LCD_DrawPropTypeDef; - -typedef struct -{ - int16_t X; - int16_t Y; -}Point, * pPoint; - -/** - * @brief Line mode structures definition - */ -typedef enum -{ - CENTER_MODE = 0x01, /* Center mode */ - RIGHT_MODE = 0x02, /* Right mode */ - LEFT_MODE = 0x03 /* Left mode */ -}Text_AlignModeTypdef; - -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_LCD_Exported_Constants STM32746G_DISCOVERY_LCD Exported Constants - * @{ - */ -#define MAX_LAYER_NUMBER ((uint32_t)2) - -#define LCD_LayerCfgTypeDef LTDC_LayerCfgTypeDef - -#define LTDC_ACTIVE_LAYER ((uint32_t)1) /* Layer 1 */ -/** - * @brief LCD status structure definition - */ -#define LCD_OK ((uint8_t)0x00) -#define LCD_ERROR ((uint8_t)0x01) -#define LCD_TIMEOUT ((uint8_t)0x02) - -/** - * @brief LCD FB_StartAddress - */ -#define LCD_FB_START_ADDRESS ((uint32_t)0xC0000000) - -/** - * @brief LCD color - */ -#define LCD_COLOR_BLUE ((uint32_t)0xFF0000FF) -#define LCD_COLOR_GREEN ((uint32_t)0xFF00FF00) -#define LCD_COLOR_RED ((uint32_t)0xFFFF0000) -#define LCD_COLOR_CYAN ((uint32_t)0xFF00FFFF) -#define LCD_COLOR_MAGENTA ((uint32_t)0xFFFF00FF) -#define LCD_COLOR_YELLOW ((uint32_t)0xFFFFFF00) -#define LCD_COLOR_LIGHTBLUE ((uint32_t)0xFF8080FF) -#define LCD_COLOR_LIGHTGREEN ((uint32_t)0xFF80FF80) -#define LCD_COLOR_LIGHTRED ((uint32_t)0xFFFF8080) -#define LCD_COLOR_LIGHTCYAN ((uint32_t)0xFF80FFFF) -#define LCD_COLOR_LIGHTMAGENTA ((uint32_t)0xFFFF80FF) -#define LCD_COLOR_LIGHTYELLOW ((uint32_t)0xFFFFFF80) -#define LCD_COLOR_DARKBLUE ((uint32_t)0xFF000080) -#define LCD_COLOR_DARKGREEN ((uint32_t)0xFF008000) -#define LCD_COLOR_DARKRED ((uint32_t)0xFF800000) -#define LCD_COLOR_DARKCYAN ((uint32_t)0xFF008080) -#define LCD_COLOR_DARKMAGENTA ((uint32_t)0xFF800080) -#define LCD_COLOR_DARKYELLOW ((uint32_t)0xFF808000) -#define LCD_COLOR_WHITE ((uint32_t)0xFFFFFFFF) -#define LCD_COLOR_LIGHTGRAY ((uint32_t)0xFFD3D3D3) -#define LCD_COLOR_GRAY ((uint32_t)0xFF808080) -#define LCD_COLOR_DARKGRAY ((uint32_t)0xFF404040) -#define LCD_COLOR_BLACK ((uint32_t)0xFF000000) -#define LCD_COLOR_BROWN ((uint32_t)0xFFA52A2A) -#define LCD_COLOR_ORANGE ((uint32_t)0xFFFFA500) -#define LCD_COLOR_TRANSPARENT ((uint32_t)0xFF000000) - -/** - * @brief LCD default font - */ -#define LCD_DEFAULT_FONT Font24 - -/** - * @brief LCD Reload Types - */ -#define LCD_RELOAD_IMMEDIATE ((uint32_t)LTDC_SRCR_IMR) -#define LCD_RELOAD_VERTICAL_BLANKING ((uint32_t)LTDC_SRCR_VBR) - - -/** - * @brief LCD special pins - */ -/* Display enable pin */ -#define LCD_DISP_PIN GPIO_PIN_12 -#define LCD_DISP_GPIO_PORT GPIOI -#define LCD_DISP_GPIO_CLK_ENABLE() __HAL_RCC_GPIOI_CLK_ENABLE() -#define LCD_DISP_GPIO_CLK_DISABLE() __HAL_RCC_GPIOI_CLK_DISABLE() - -/* Backlight control pin */ -#define LCD_BL_CTRL_PIN GPIO_PIN_3 -#define LCD_BL_CTRL_GPIO_PORT GPIOK -#define LCD_BL_CTRL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOK_CLK_ENABLE() -#define LCD_BL_CTRL_GPIO_CLK_DISABLE() __HAL_RCC_GPIOK_CLK_DISABLE() - -/** - * @} - */ - -/** @addtogroup STM32746G_DISCOVERY_LCD_Exported_Functions - * @{ - */ -uint8_t BSP_LCD_Init(void); -uint8_t BSP_LCD_DeInit(void); -uint32_t BSP_LCD_GetXSize(void); -uint32_t BSP_LCD_GetYSize(void); -void BSP_LCD_SetXSize(uint32_t imageWidthPixels); -void BSP_LCD_SetYSize(uint32_t imageHeightPixels); - -/* Functions using the LTDC controller */ -void BSP_LCD_LayerDefaultInit(uint16_t LayerIndex, uint32_t FrameBuffer); -void BSP_LCD_LayerRgb565Init(uint16_t LayerIndex, uint32_t FB_Address); -void BSP_LCD_SetTransparency(uint32_t LayerIndex, uint8_t Transparency); -void BSP_LCD_SetTransparency_NoReload(uint32_t LayerIndex, uint8_t Transparency); -void BSP_LCD_SetLayerAddress(uint32_t LayerIndex, uint32_t Address); -void BSP_LCD_SetLayerAddress_NoReload(uint32_t LayerIndex, uint32_t Address); -void BSP_LCD_SetColorKeying(uint32_t LayerIndex, uint32_t RGBValue); -void BSP_LCD_SetColorKeying_NoReload(uint32_t LayerIndex, uint32_t RGBValue); -void BSP_LCD_ResetColorKeying(uint32_t LayerIndex); -void BSP_LCD_ResetColorKeying_NoReload(uint32_t LayerIndex); -void BSP_LCD_SetLayerWindow(uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height); -void BSP_LCD_SetLayerWindow_NoReload(uint16_t LayerIndex, uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height); -void BSP_LCD_SelectLayer(uint32_t LayerIndex); -void BSP_LCD_SetLayerVisible(uint32_t LayerIndex, FunctionalState State); -void BSP_LCD_SetLayerVisible_NoReload(uint32_t LayerIndex, FunctionalState State); -void BSP_LCD_Reload(uint32_t ReloadType); - -void BSP_LCD_SetTextColor(uint32_t Color); -uint32_t BSP_LCD_GetTextColor(void); -void BSP_LCD_SetBackColor(uint32_t Color); -uint32_t BSP_LCD_GetBackColor(void); -void BSP_LCD_SetFont(sFONT *fonts); -sFONT *BSP_LCD_GetFont(void); - -uint32_t BSP_LCD_ReadPixel(uint16_t Xpos, uint16_t Ypos); -void BSP_LCD_DrawPixel(uint16_t Xpos, uint16_t Ypos, uint32_t pixel); -void BSP_LCD_Clear(uint32_t Color); -void BSP_LCD_ClearStringLine(uint32_t Line); -void BSP_LCD_DisplayStringAtLine(uint16_t Line, uint8_t *ptr); -void BSP_LCD_DisplayStringAt(uint16_t Xpos, uint16_t Ypos, uint8_t *Text, Text_AlignModeTypdef Mode); -void BSP_LCD_DisplayChar(uint16_t Xpos, uint16_t Ypos, uint8_t Ascii); - -void BSP_LCD_DrawHLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length); -void BSP_LCD_DrawVLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length); -void BSP_LCD_DrawLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); -void BSP_LCD_DrawRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height); -void BSP_LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius); -void BSP_LCD_DrawPolygon(pPoint Points, uint16_t PointCount); -void BSP_LCD_DrawEllipse(int Xpos, int Ypos, int XRadius, int YRadius); -void BSP_LCD_DrawBitmap(uint32_t Xpos, uint32_t Ypos, uint8_t *pbmp); - -void BSP_LCD_FillRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height); -void BSP_LCD_FillCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius); -void BSP_LCD_FillPolygon(pPoint Points, uint16_t PointCount); -void BSP_LCD_FillEllipse(int Xpos, int Ypos, int XRadius, int YRadius); - -void BSP_LCD_DisplayOff(void); -void BSP_LCD_DisplayOn(void); - -/* These functions can be modified in case the current settings - need to be changed for specific application needs */ -void BSP_LCD_MspInit(LTDC_HandleTypeDef *hltdc, void *Params); -void BSP_LCD_MspDeInit(LTDC_HandleTypeDef *hltdc, void *Params); -void BSP_LCD_ClockConfig(LTDC_HandleTypeDef *hltdc, void *Params); - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32746G_DISCOVERY_LCD_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_qspi.c --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_qspi.c Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,798 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery_qspi.c - * @author MCD Application Team - * @brief This file includes a standard driver for the N25Q128A QSPI - * memory mounted on STM32746G-Discovery board. - @verbatim - ============================================================================== - ##### How to use this driver ##### - ============================================================================== - [..] - (#) This driver is used to drive the N25Q128A QSPI external - memory mounted on STM32746G-Discovery board. - - (#) This driver need a specific component driver (N25Q128A) to be included with. - - (#) Initialization steps: - (++) Initialize the QPSI external memory using the BSP_QSPI_Init() function. This - function includes the MSP layer hardware resources initialization and the - QSPI interface with the external memory. - - (#) QSPI memory operations - (++) QSPI memory can be accessed with read/write operations once it is - initialized. - Read/write operation can be performed with AHB access using the functions - BSP_QSPI_Read()/BSP_QSPI_Write(). - (++) The function BSP_QSPI_GetInfo() returns the configuration of the QSPI memory. - (see the QSPI memory data sheet) - (++) Perform erase block operation using the function BSP_QSPI_Erase_Block() and by - specifying the block address. You can perform an erase operation of the whole - chip by calling the function BSP_QSPI_Erase_Chip(). - (++) The function BSP_QSPI_GetStatus() returns the current status of the QSPI memory. - (see the QSPI memory data sheet) - @endverbatim - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Dependencies -- stm32f7xx_hal_qspi.c -- stm32f7xx_hal_gpio.c -- stm32f7xx_hal_cortex.c -- stm32f7xx_hal_rcc_ex.h -- n25q128a.h -EndDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32746g_discovery_qspi.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_QSPI STM32746G-Discovery QSPI - * @{ - */ - - -/* Private variables ---------------------------------------------------------*/ - -/** @defgroup STM32746G_DISCOVERY_QSPI_Private_Variables STM32746G_DISCOVERY QSPI Private Variables - * @{ - */ -QSPI_HandleTypeDef QSPIHandle; - -/** - * @} - */ - - - -/* Private functions ---------------------------------------------------------*/ - -/** @defgroup STM32746G_DISCOVERY_QSPI_Private_Functions STM32746G_DISCOVERY QSPI Private Functions - * @{ - */ -static uint8_t QSPI_ResetMemory (QSPI_HandleTypeDef *hqspi); -static uint8_t QSPI_DummyCyclesCfg (QSPI_HandleTypeDef *hqspi); -static uint8_t QSPI_WriteEnable (QSPI_HandleTypeDef *hqspi); -static uint8_t QSPI_AutoPollingMemReady (QSPI_HandleTypeDef *hqspi, uint32_t Timeout); - -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_QSPI_Exported_Functions STM32746G_DISCOVERY QSPI Exported Functions - * @{ - */ - -/** - * @brief Initializes the QSPI interface. - * @retval QSPI memory status - */ -uint8_t BSP_QSPI_Init(void) -{ - QSPIHandle.Instance = QUADSPI; - - /* Call the DeInit function to reset the driver */ - if (HAL_QSPI_DeInit(&QSPIHandle) != HAL_OK) - { - return QSPI_ERROR; - } - - /* System level initialization */ - BSP_QSPI_MspInit(&QSPIHandle, NULL); - - /* QSPI initialization */ - QSPIHandle.Init.ClockPrescaler = 1; /* QSPI freq = 216 MHz/(1+1) = 108 Mhz */ - QSPIHandle.Init.FifoThreshold = 4; - QSPIHandle.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE; - QSPIHandle.Init.FlashSize = POSITION_VAL(N25Q128A_FLASH_SIZE) - 1; - QSPIHandle.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_6_CYCLE; /* Min 50ns for nonRead */ - QSPIHandle.Init.ClockMode = QSPI_CLOCK_MODE_0; - QSPIHandle.Init.FlashID = QSPI_FLASH_ID_1; - QSPIHandle.Init.DualFlash = QSPI_DUALFLASH_DISABLE; - - if (HAL_QSPI_Init(&QSPIHandle) != HAL_OK) - { - return QSPI_ERROR; - } - - /* QSPI memory reset */ - if (QSPI_ResetMemory(&QSPIHandle) != QSPI_OK) - { - return QSPI_NOT_SUPPORTED; - } - - /* Configuration of the dummy cycles on QSPI memory side */ - if (QSPI_DummyCyclesCfg(&QSPIHandle) != QSPI_OK) - { - return QSPI_NOT_SUPPORTED; - } - - return QSPI_OK; -} - -/** - * @brief De-Initializes the QSPI interface. - * @retval QSPI memory status - */ -uint8_t BSP_QSPI_DeInit(void) -{ - QSPIHandle.Instance = QUADSPI; - - /* Call the DeInit function to reset the driver */ - if (HAL_QSPI_DeInit(&QSPIHandle) != HAL_OK) - { - return QSPI_ERROR; - } - - /* System level De-initialization */ - BSP_QSPI_MspDeInit(&QSPIHandle, NULL); - - return QSPI_OK; -} - -/** - * @brief Reads an amount of data from the QSPI memory. - * @param pData: Pointer to data to be read - * @param ReadAddr: Read start address - * @param Size: Size of data to read - * @retval QSPI memory status - */ -uint8_t BSP_QSPI_Read(uint8_t* pData, uint32_t ReadAddr, uint32_t Size) -{ - QSPI_CommandTypeDef s_command; - - /* Initialize the read command */ - s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE; - s_command.Instruction = QUAD_INOUT_FAST_READ_CMD; - s_command.AddressMode = QSPI_ADDRESS_4_LINES; - s_command.AddressSize = QSPI_ADDRESS_24_BITS; - s_command.Address = ReadAddr; - s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; - s_command.DataMode = QSPI_DATA_4_LINES; - s_command.DummyCycles = N25Q128A_DUMMY_CYCLES_READ_QUAD; - s_command.NbData = Size; - s_command.DdrMode = QSPI_DDR_MODE_DISABLE; - s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; - s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; - - /* Configure the command */ - if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) - { - return QSPI_ERROR; - } - - /* Set S# timing for Read command */ - MODIFY_REG(QSPIHandle.Instance->DCR, QUADSPI_DCR_CSHT, QSPI_CS_HIGH_TIME_3_CYCLE); - - /* Reception of the data */ - if (HAL_QSPI_Receive(&QSPIHandle, pData, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) - { - return QSPI_ERROR; - } - - /* Restore S# timing for nonRead commands */ - MODIFY_REG(QSPIHandle.Instance->DCR, QUADSPI_DCR_CSHT, QSPI_CS_HIGH_TIME_6_CYCLE); - - return QSPI_OK; -} - -/** - * @brief Writes an amount of data to the QSPI memory. - * @param pData: Pointer to data to be written - * @param WriteAddr: Write start address - * @param Size: Size of data to write - * @retval QSPI memory status - */ -uint8_t BSP_QSPI_Write(uint8_t* pData, uint32_t WriteAddr, uint32_t Size) -{ - QSPI_CommandTypeDef s_command; - uint32_t end_addr, current_size, current_addr; - - /* Calculation of the size between the write address and the end of the page */ - current_size = N25Q128A_PAGE_SIZE - (WriteAddr % N25Q128A_PAGE_SIZE); - - /* Check if the size of the data is less than the remaining place in the page */ - if (current_size > Size) - { - current_size = Size; - } - - /* Initialize the adress variables */ - current_addr = WriteAddr; - end_addr = WriteAddr + Size; - - /* Initialize the program command */ - s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE; - s_command.Instruction = EXT_QUAD_IN_FAST_PROG_CMD; - s_command.AddressMode = QSPI_ADDRESS_4_LINES; - s_command.AddressSize = QSPI_ADDRESS_24_BITS; - s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; - s_command.DataMode = QSPI_DATA_4_LINES; - s_command.DummyCycles = 0; - s_command.DdrMode = QSPI_DDR_MODE_DISABLE; - s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; - s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; - - /* Perform the write page by page */ - do - { - s_command.Address = current_addr; - s_command.NbData = current_size; - - /* Enable write operations */ - if (QSPI_WriteEnable(&QSPIHandle) != QSPI_OK) - { - return QSPI_ERROR; - } - - /* Configure the command */ - if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) - { - return QSPI_ERROR; - } - - /* Transmission of the data */ - if (HAL_QSPI_Transmit(&QSPIHandle, pData, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) - { - return QSPI_ERROR; - } - - /* Configure automatic polling mode to wait for end of program */ - if (QSPI_AutoPollingMemReady(&QSPIHandle, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != QSPI_OK) - { - return QSPI_ERROR; - } - - /* Update the address and size variables for next page programming */ - current_addr += current_size; - pData += current_size; - current_size = ((current_addr + N25Q128A_PAGE_SIZE) > end_addr) ? (end_addr - current_addr) : N25Q128A_PAGE_SIZE; - } while (current_addr < end_addr); - - return QSPI_OK; -} - -/** - * @brief Erases the specified block of the QSPI memory. - * @param BlockAddress: Block address to erase - * @retval QSPI memory status - */ -uint8_t BSP_QSPI_Erase_Block(uint32_t BlockAddress) -{ - QSPI_CommandTypeDef s_command; - - /* Initialize the erase command */ - s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE; - s_command.Instruction = SUBSECTOR_ERASE_CMD; - s_command.AddressMode = QSPI_ADDRESS_1_LINE; - s_command.AddressSize = QSPI_ADDRESS_24_BITS; - s_command.Address = BlockAddress; - s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; - s_command.DataMode = QSPI_DATA_NONE; - s_command.DummyCycles = 0; - s_command.DdrMode = QSPI_DDR_MODE_DISABLE; - s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; - s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; - - /* Enable write operations */ - if (QSPI_WriteEnable(&QSPIHandle) != QSPI_OK) - { - return QSPI_ERROR; - } - - /* Send the command */ - if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) - { - return QSPI_ERROR; - } - - /* Configure automatic polling mode to wait for end of erase */ - if (QSPI_AutoPollingMemReady(&QSPIHandle, N25Q128A_SUBSECTOR_ERASE_MAX_TIME) != QSPI_OK) - { - return QSPI_ERROR; - } - - return QSPI_OK; -} - -/** - * @brief Erases the entire QSPI memory. - * @retval QSPI memory status - */ -uint8_t BSP_QSPI_Erase_Chip(void) -{ - QSPI_CommandTypeDef s_command; - - /* Initialize the erase command */ - s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE; - s_command.Instruction = BULK_ERASE_CMD; - s_command.AddressMode = QSPI_ADDRESS_NONE; - s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; - s_command.DataMode = QSPI_DATA_NONE; - s_command.DummyCycles = 0; - s_command.DdrMode = QSPI_DDR_MODE_DISABLE; - s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; - s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; - - /* Enable write operations */ - if (QSPI_WriteEnable(&QSPIHandle) != QSPI_OK) - { - return QSPI_ERROR; - } - - /* Send the command */ - if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) - { - return QSPI_ERROR; - } - - /* Configure automatic polling mode to wait for end of erase */ - if (QSPI_AutoPollingMemReady(&QSPIHandle, N25Q128A_BULK_ERASE_MAX_TIME) != QSPI_OK) - { - return QSPI_ERROR; - } - - return QSPI_OK; -} - -/** - * @brief Reads current status of the QSPI memory. - * @retval QSPI memory status - */ -uint8_t BSP_QSPI_GetStatus(void) -{ - QSPI_CommandTypeDef s_command; - uint8_t reg; - - /* Initialize the read flag status register command */ - s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE; - s_command.Instruction = READ_FLAG_STATUS_REG_CMD; - s_command.AddressMode = QSPI_ADDRESS_NONE; - s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; - s_command.DataMode = QSPI_DATA_1_LINE; - s_command.DummyCycles = 0; - s_command.NbData = 1; - s_command.DdrMode = QSPI_DDR_MODE_DISABLE; - s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; - s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; - - /* Configure the command */ - if (HAL_QSPI_Command(&QSPIHandle, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) - { - return QSPI_ERROR; - } - - /* Reception of the data */ - if (HAL_QSPI_Receive(&QSPIHandle, ®, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) - { - return QSPI_ERROR; - } - - /* Check the value of the register */ - if ((reg & (N25Q128A_FSR_PRERR | N25Q128A_FSR_VPPERR | N25Q128A_FSR_PGERR | N25Q128A_FSR_ERERR)) != 0) - { - return QSPI_ERROR; - } - else if ((reg & (N25Q128A_FSR_PGSUS | N25Q128A_FSR_ERSUS)) != 0) - { - return QSPI_SUSPENDED; - } - else if ((reg & N25Q128A_FSR_READY) != 0) - { - return QSPI_OK; - } - else - { - return QSPI_BUSY; - } -} - -/** - * @brief Return the configuration of the QSPI memory. - * @param pInfo: pointer on the configuration structure - * @retval QSPI memory status - */ -uint8_t BSP_QSPI_GetInfo(QSPI_Info* pInfo) -{ - /* Configure the structure with the memory configuration */ - pInfo->FlashSize = N25Q128A_FLASH_SIZE; - pInfo->EraseSectorSize = N25Q128A_SUBSECTOR_SIZE; - pInfo->EraseSectorsNumber = (N25Q128A_FLASH_SIZE/N25Q128A_SUBSECTOR_SIZE); - pInfo->ProgPageSize = N25Q128A_PAGE_SIZE; - pInfo->ProgPagesNumber = (N25Q128A_FLASH_SIZE/N25Q128A_PAGE_SIZE); - - return QSPI_OK; -} - -/** - * @brief Configure the QSPI in memory-mapped mode - * @retval QSPI memory status - */ -uint8_t BSP_QSPI_EnableMemoryMappedMode(void) -{ - QSPI_CommandTypeDef s_command; - QSPI_MemoryMappedTypeDef s_mem_mapped_cfg; - - /* Configure the command for the read instruction */ - s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE; - s_command.Instruction = QUAD_INOUT_FAST_READ_CMD; - s_command.AddressMode = QSPI_ADDRESS_4_LINES; - s_command.AddressSize = QSPI_ADDRESS_24_BITS; - s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; - s_command.DataMode = QSPI_DATA_4_LINES; - s_command.DummyCycles = N25Q128A_DUMMY_CYCLES_READ_QUAD; - s_command.DdrMode = QSPI_DDR_MODE_DISABLE; - s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; - s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; - - /* Configure the memory mapped mode */ - s_mem_mapped_cfg.TimeOutActivation = QSPI_TIMEOUT_COUNTER_DISABLE; - s_mem_mapped_cfg.TimeOutPeriod = 0; - - if (HAL_QSPI_MemoryMapped(&QSPIHandle, &s_command, &s_mem_mapped_cfg) != HAL_OK) - { - return QSPI_ERROR; - } - - return QSPI_OK; -} - -/** - * @} - */ - -/** @addtogroup STM32746G_DISCOVERY_QSPI_Private_Functions - * @{ - */ - -/** - * @brief QSPI MSP Initialization - * This function configures the hardware resources used in this example: - * - Peripheral's clock enable - * - Peripheral's GPIO Configuration - * - NVIC configuration for QSPI interrupt - * @retval None - */ -__weak void BSP_QSPI_MspInit(QSPI_HandleTypeDef *hqspi, void *Params) -{ - GPIO_InitTypeDef gpio_init_structure; - - /*##-1- Enable peripherals and GPIO Clocks #################################*/ - /* Enable the QuadSPI memory interface clock */ - QSPI_CLK_ENABLE(); - /* Reset the QuadSPI memory interface */ - QSPI_FORCE_RESET(); - QSPI_RELEASE_RESET(); - /* Enable GPIO clocks */ - QSPI_CS_GPIO_CLK_ENABLE(); - QSPI_CLK_GPIO_CLK_ENABLE(); - QSPI_D0_GPIO_CLK_ENABLE(); - QSPI_D1_GPIO_CLK_ENABLE(); - QSPI_D2_GPIO_CLK_ENABLE(); - QSPI_D3_GPIO_CLK_ENABLE(); - - /*##-2- Configure peripheral GPIO ##########################################*/ - /* QSPI CS GPIO pin configuration */ - gpio_init_structure.Pin = QSPI_CS_PIN; - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Pull = GPIO_PULLUP; - gpio_init_structure.Speed = GPIO_SPEED_HIGH; - gpio_init_structure.Alternate = GPIO_AF10_QUADSPI; - HAL_GPIO_Init(QSPI_CS_GPIO_PORT, &gpio_init_structure); - - /* QSPI CLK GPIO pin configuration */ - gpio_init_structure.Pin = QSPI_CLK_PIN; - gpio_init_structure.Pull = GPIO_NOPULL; - gpio_init_structure.Alternate = GPIO_AF9_QUADSPI; - HAL_GPIO_Init(QSPI_CLK_GPIO_PORT, &gpio_init_structure); - - /* QSPI D0 GPIO pin configuration */ - gpio_init_structure.Pin = QSPI_D0_PIN; - gpio_init_structure.Alternate = GPIO_AF9_QUADSPI; - HAL_GPIO_Init(QSPI_D0_GPIO_PORT, &gpio_init_structure); - - /* QSPI D1 GPIO pin configuration */ - gpio_init_structure.Pin = QSPI_D1_PIN; - gpio_init_structure.Alternate = GPIO_AF9_QUADSPI; - HAL_GPIO_Init(QSPI_D1_GPIO_PORT, &gpio_init_structure); - - /* QSPI D2 GPIO pin configuration */ - gpio_init_structure.Pin = QSPI_D2_PIN; - gpio_init_structure.Alternate = GPIO_AF9_QUADSPI; - HAL_GPIO_Init(QSPI_D2_GPIO_PORT, &gpio_init_structure); - - /* QSPI D3 GPIO pin configuration */ - gpio_init_structure.Pin = QSPI_D3_PIN; - gpio_init_structure.Alternate = GPIO_AF9_QUADSPI; - HAL_GPIO_Init(QSPI_D3_GPIO_PORT, &gpio_init_structure); - - /*##-3- Configure the NVIC for QSPI #########################################*/ - /* NVIC configuration for QSPI interrupt */ - HAL_NVIC_SetPriority(QUADSPI_IRQn, 0x0F, 0); - HAL_NVIC_EnableIRQ(QUADSPI_IRQn); -} - -/** - * @brief QSPI MSP De-Initialization - * This function frees the hardware resources used in this example: - * - Disable the Peripheral's clock - * - Revert GPIO and NVIC configuration to their default state - * @retval None - */ -__weak void BSP_QSPI_MspDeInit(QSPI_HandleTypeDef *hqspi, void *Params) -{ - /*##-1- Disable the NVIC for QSPI ###########################################*/ - HAL_NVIC_DisableIRQ(QUADSPI_IRQn); - - /*##-2- Disable peripherals and GPIO Clocks ################################*/ - /* De-Configure QSPI pins */ - HAL_GPIO_DeInit(QSPI_CS_GPIO_PORT, QSPI_CS_PIN); - HAL_GPIO_DeInit(QSPI_CLK_GPIO_PORT, QSPI_CLK_PIN); - HAL_GPIO_DeInit(QSPI_D0_GPIO_PORT, QSPI_D0_PIN); - HAL_GPIO_DeInit(QSPI_D1_GPIO_PORT, QSPI_D1_PIN); - HAL_GPIO_DeInit(QSPI_D2_GPIO_PORT, QSPI_D2_PIN); - HAL_GPIO_DeInit(QSPI_D3_GPIO_PORT, QSPI_D3_PIN); - - /*##-3- Reset peripherals ##################################################*/ - /* Reset the QuadSPI memory interface */ - QSPI_FORCE_RESET(); - QSPI_RELEASE_RESET(); - - /* Disable the QuadSPI memory interface clock */ - QSPI_CLK_DISABLE(); -} - -/** - * @brief This function reset the QSPI memory. - * @param hqspi: QSPI handle - * @retval None - */ -static uint8_t QSPI_ResetMemory(QSPI_HandleTypeDef *hqspi) -{ - QSPI_CommandTypeDef s_command; - - /* Initialize the reset enable command */ - s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE; - s_command.Instruction = RESET_ENABLE_CMD; - s_command.AddressMode = QSPI_ADDRESS_NONE; - s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; - s_command.DataMode = QSPI_DATA_NONE; - s_command.DummyCycles = 0; - s_command.DdrMode = QSPI_DDR_MODE_DISABLE; - s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; - s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; - - /* Send the command */ - if (HAL_QSPI_Command(hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) - { - return QSPI_ERROR; - } - - /* Send the reset memory command */ - s_command.Instruction = RESET_MEMORY_CMD; - if (HAL_QSPI_Command(hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) - { - return QSPI_ERROR; - } - - /* Configure automatic polling mode to wait the memory is ready */ - if (QSPI_AutoPollingMemReady(hqspi, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != QSPI_OK) - { - return QSPI_ERROR; - } - - return QSPI_OK; -} - -/** - * @brief This function configure the dummy cycles on memory side. - * @param hqspi: QSPI handle - * @retval None - */ -static uint8_t QSPI_DummyCyclesCfg(QSPI_HandleTypeDef *hqspi) -{ - QSPI_CommandTypeDef s_command; - uint8_t reg; - - /* Initialize the read volatile configuration register command */ - s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE; - s_command.Instruction = READ_VOL_CFG_REG_CMD; - s_command.AddressMode = QSPI_ADDRESS_NONE; - s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; - s_command.DataMode = QSPI_DATA_1_LINE; - s_command.DummyCycles = 0; - s_command.NbData = 1; - s_command.DdrMode = QSPI_DDR_MODE_DISABLE; - s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; - s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; - - /* Configure the command */ - if (HAL_QSPI_Command(hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) - { - return QSPI_ERROR; - } - - /* Reception of the data */ - if (HAL_QSPI_Receive(hqspi, ®, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) - { - return QSPI_ERROR; - } - - /* Enable write operations */ - if (QSPI_WriteEnable(hqspi) != QSPI_OK) - { - return QSPI_ERROR; - } - - /* Update volatile configuration register (with new dummy cycles) */ - s_command.Instruction = WRITE_VOL_CFG_REG_CMD; - MODIFY_REG(reg, N25Q128A_VCR_NB_DUMMY, (N25Q128A_DUMMY_CYCLES_READ_QUAD << POSITION_VAL(N25Q128A_VCR_NB_DUMMY))); - - /* Configure the write volatile configuration register command */ - if (HAL_QSPI_Command(hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) - { - return QSPI_ERROR; - } - - /* Transmission of the data */ - if (HAL_QSPI_Transmit(hqspi, ®, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) - { - return QSPI_ERROR; - } - - return QSPI_OK; -} - -/** - * @brief This function send a Write Enable and wait it is effective. - * @param hqspi: QSPI handle - * @retval None - */ -static uint8_t QSPI_WriteEnable(QSPI_HandleTypeDef *hqspi) -{ - QSPI_CommandTypeDef s_command; - QSPI_AutoPollingTypeDef s_config; - - /* Enable write operations */ - s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE; - s_command.Instruction = WRITE_ENABLE_CMD; - s_command.AddressMode = QSPI_ADDRESS_NONE; - s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; - s_command.DataMode = QSPI_DATA_NONE; - s_command.DummyCycles = 0; - s_command.DdrMode = QSPI_DDR_MODE_DISABLE; - s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; - s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; - - if (HAL_QSPI_Command(hqspi, &s_command, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) - { - return QSPI_ERROR; - } - - /* Configure automatic polling mode to wait for write enabling */ - s_config.Match = N25Q128A_SR_WREN; - s_config.Mask = N25Q128A_SR_WREN; - s_config.MatchMode = QSPI_MATCH_MODE_AND; - s_config.StatusBytesSize = 1; - s_config.Interval = 0x10; - s_config.AutomaticStop = QSPI_AUTOMATIC_STOP_ENABLE; - - s_command.Instruction = READ_STATUS_REG_CMD; - s_command.DataMode = QSPI_DATA_1_LINE; - - if (HAL_QSPI_AutoPolling(hqspi, &s_command, &s_config, HAL_QPSI_TIMEOUT_DEFAULT_VALUE) != HAL_OK) - { - return QSPI_ERROR; - } - - return QSPI_OK; -} - -/** - * @brief This function read the SR of the memory and wait the EOP. - * @param hqspi: QSPI handle - * @param Timeout - * @retval None - */ -static uint8_t QSPI_AutoPollingMemReady(QSPI_HandleTypeDef *hqspi, uint32_t Timeout) -{ - QSPI_CommandTypeDef s_command; - QSPI_AutoPollingTypeDef s_config; - - /* Configure automatic polling mode to wait for memory ready */ - s_command.InstructionMode = QSPI_INSTRUCTION_1_LINE; - s_command.Instruction = READ_STATUS_REG_CMD; - s_command.AddressMode = QSPI_ADDRESS_NONE; - s_command.AlternateByteMode = QSPI_ALTERNATE_BYTES_NONE; - s_command.DataMode = QSPI_DATA_1_LINE; - s_command.DummyCycles = 0; - s_command.DdrMode = QSPI_DDR_MODE_DISABLE; - s_command.DdrHoldHalfCycle = QSPI_DDR_HHC_ANALOG_DELAY; - s_command.SIOOMode = QSPI_SIOO_INST_EVERY_CMD; - - s_config.Match = 0; - s_config.Mask = N25Q128A_SR_WIP; - s_config.MatchMode = QSPI_MATCH_MODE_AND; - s_config.StatusBytesSize = 1; - s_config.Interval = 0x10; - s_config.AutomaticStop = QSPI_AUTOMATIC_STOP_ENABLE; - - if (HAL_QSPI_AutoPolling(hqspi, &s_command, &s_config, Timeout) != HAL_OK) - { - return QSPI_ERROR; - } - - return QSPI_OK; -} -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ -
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_qspi.h --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_qspi.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,170 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery_qspi.h - * @author MCD Application Team - * @brief This file contains the common defines and functions prototypes for - * the stm32746g_discovery_qspi.c driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32746G_DISCOVERY_QSPI_H -#define __STM32746G_DISCOVERY_QSPI_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f7xx_hal.h" -#include "../Components/n25q128a/n25q128a.h" - -/** @addtogroup STM32746G_DISCOVERY_QSPI - * @{ - */ - - -/* Exported constants --------------------------------------------------------*/ -/** @defgroup STM32746G_DISCOVERY_QSPI_Exported_Constants STM32746G_DISCOVERY_QSPI Exported Constants - * @{ - */ -/* QSPI Error codes */ -#define QSPI_OK ((uint8_t)0x00) -#define QSPI_ERROR ((uint8_t)0x01) -#define QSPI_BUSY ((uint8_t)0x02) -#define QSPI_NOT_SUPPORTED ((uint8_t)0x04) -#define QSPI_SUSPENDED ((uint8_t)0x08) - - -/* Definition for QSPI clock resources */ -#define QSPI_CLK_ENABLE() __HAL_RCC_QSPI_CLK_ENABLE() -#define QSPI_CLK_DISABLE() __HAL_RCC_QSPI_CLK_DISABLE() -#define QSPI_CS_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() -#define QSPI_CLK_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() -#define QSPI_D0_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE() -#define QSPI_D1_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE() -#define QSPI_D2_GPIO_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE() -#define QSPI_D3_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE() - -#define QSPI_FORCE_RESET() __HAL_RCC_QSPI_FORCE_RESET() -#define QSPI_RELEASE_RESET() __HAL_RCC_QSPI_RELEASE_RESET() - -/* Definition for QSPI Pins */ -#define QSPI_CS_PIN GPIO_PIN_6 -#define QSPI_CS_GPIO_PORT GPIOB -#define QSPI_CLK_PIN GPIO_PIN_2 -#define QSPI_CLK_GPIO_PORT GPIOB -#define QSPI_D0_PIN GPIO_PIN_11 -#define QSPI_D0_GPIO_PORT GPIOD -#define QSPI_D1_PIN GPIO_PIN_12 -#define QSPI_D1_GPIO_PORT GPIOD -#define QSPI_D2_PIN GPIO_PIN_2 -#define QSPI_D2_GPIO_PORT GPIOE -#define QSPI_D3_PIN GPIO_PIN_13 -#define QSPI_D3_GPIO_PORT GPIOD - -/* N25Q128A13EF840E Micron memory */ -/* Size of the flash */ -#define QSPI_FLASH_SIZE 23 /* Address bus width to access whole memory space */ -#define QSPI_PAGE_SIZE 256 - -/* This alias is added as the name of Memory mapped fucntion changed */ -#define BSP_QSPI_MemoryMappedMode BSP_QSPI_EnableMemoryMappedMode -/** - * @} - */ - -/* Exported types ------------------------------------------------------------*/ -/** @defgroup STM32746G_DISCOVERY_QSPI_Exported_Types STM32746G_DISCOVERY_QSPI Exported Types - * @{ - */ -/* QSPI Info */ -typedef struct { - uint32_t FlashSize; /*!< Size of the flash */ - uint32_t EraseSectorSize; /*!< Size of sectors for the erase operation */ - uint32_t EraseSectorsNumber; /*!< Number of sectors for the erase operation */ - uint32_t ProgPageSize; /*!< Size of pages for the program operation */ - uint32_t ProgPagesNumber; /*!< Number of pages for the program operation */ -} QSPI_Info; - -/** - * @} - */ - - -/* Exported functions --------------------------------------------------------*/ -/** @addtogroup STM32746G_DISCOVERY_QSPI_Exported_Functions - * @{ - */ -uint8_t BSP_QSPI_Init (void); -uint8_t BSP_QSPI_DeInit (void); -uint8_t BSP_QSPI_Read (uint8_t* pData, uint32_t ReadAddr, uint32_t Size); -uint8_t BSP_QSPI_Write (uint8_t* pData, uint32_t WriteAddr, uint32_t Size); -uint8_t BSP_QSPI_Erase_Block(uint32_t BlockAddress); -uint8_t BSP_QSPI_Erase_Chip (void); -uint8_t BSP_QSPI_GetStatus (void); -uint8_t BSP_QSPI_GetInfo (QSPI_Info* pInfo); -uint8_t BSP_QSPI_EnableMemoryMappedMode(void); - -/* These functions can be modified in case the current settings - need to be changed for specific application needs */ -void BSP_QSPI_MspInit(QSPI_HandleTypeDef *hqspi, void *Params); -void BSP_QSPI_MspDeInit(QSPI_HandleTypeDef *hqspi, void *Params); - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32746G_DISCOVERY_QSPI_H */ -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_sd.c --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_sd.c Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,606 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery_sd.c - * @author MCD Application Team - * @brief This file includes the uSD card driver mounted on STM32746G-Discovery - * board. - @verbatim - 1. How To use this driver: - -------------------------- - - This driver is used to drive the micro SD external card mounted on STM32746G-Discovery - board. - - This driver does not need a specific component driver for the micro SD device - to be included with. - - 2. Driver description: - --------------------- - + Initialization steps: - o Initialize the micro SD card using the BSP_SD_Init() function. This - function includes the MSP layer hardware resources initialization and the - SDIO interface configuration to interface with the external micro SD. It - also includes the micro SD initialization sequence. - o To check the SD card presence you can use the function BSP_SD_IsDetected() which - returns the detection status - o If SD presence detection interrupt mode is desired, you must configure the - SD detection interrupt mode by calling the function BSP_SD_ITConfig(). The interrupt - is generated as an external interrupt whenever the micro SD card is - plugged/unplugged in/from the board. - o The function BSP_SD_GetCardInfo() is used to get the micro SD card information - which is stored in the structure "HAL_SD_CardInfoTypedef". - - + Micro SD card operations - o The micro SD card can be accessed with read/write block(s) operations once - it is ready for access. The access can be performed whether using the polling - mode by calling the functions BSP_SD_ReadBlocks()/BSP_SD_WriteBlocks(), or by DMA - transfer using the functions BSP_SD_ReadBlocks_DMA()/BSP_SD_WriteBlocks_DMA() - o The DMA transfer complete is used with interrupt mode. Once the SD transfer - is complete, the SD interrupt is handled using the function BSP_SD_IRQHandler(), - the DMA Tx/Rx transfer complete are handled using the functions - BSP_SD_DMA_Tx_IRQHandler()/BSP_SD_DMA_Rx_IRQHandler(). The corresponding user callbacks - are implemented by the user at application level. - o The SD erase block(s) is performed using the function BSP_SD_Erase() with specifying - the number of blocks to erase. - o The SD runtime status is returned when calling the function BSP_SD_GetCardState(). - - @endverbatim - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Dependencies -- stm32746g_discovery.c -- stm32f7xx_hal_sd.c -- stm32f7xx_ll_sdmmc.c -- stm32f7xx_hal_dma.c -- stm32f7xx_hal_gpio.c -- stm32f7xx_hal_cortex.c -- stm32f7xx_hal_rcc_ex.h -EndDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32746g_discovery_sd.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_SD STM32746G_DISCOVERY_SD - * @{ - */ - - -/** @defgroup STM32746G_DISCOVERY_SD_Private_TypesDefinitions STM32746G_DISCOVERY_SD Private Types Definitions - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_SD_Private_Defines STM32746G_DISCOVERY_SD Private Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_SD_Private_Macros STM32746G_DISCOVERY_SD Private Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_SD_Private_Variables STM32746G_DISCOVERY_SD Private Variables - * @{ - */ -SD_HandleTypeDef uSdHandle; - -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_SD_Private_FunctionPrototypes STM32746G_DISCOVERY_SD Private Function Prototypes - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_SD_Exported_Functions STM32746G_DISCOVERY_SD Exported Functions - * @{ - */ - -/** - * @brief Initializes the SD card device. - * @retval SD status - */ -uint8_t BSP_SD_Init(void) -{ - uint8_t sd_state = MSD_OK; - - /* uSD device interface configuration */ - uSdHandle.Instance = SDMMC1; - - uSdHandle.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING; - uSdHandle.Init.ClockBypass = SDMMC_CLOCK_BYPASS_DISABLE; - uSdHandle.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE; - uSdHandle.Init.BusWide = SDMMC_BUS_WIDE_1B; - uSdHandle.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE; - uSdHandle.Init.ClockDiv = SDMMC_TRANSFER_CLK_DIV; - - /* Msp SD Detect pin initialization */ - BSP_SD_Detect_MspInit(&uSdHandle, NULL); - if(BSP_SD_IsDetected() != SD_PRESENT) /* Check if SD card is present */ - { - return MSD_ERROR_SD_NOT_PRESENT; - } - - /* Msp SD initialization */ - BSP_SD_MspInit(&uSdHandle, NULL); - - /* HAL SD initialization */ - if(HAL_SD_Init(&uSdHandle) != HAL_OK) - { - sd_state = MSD_ERROR; - } - - /* Configure SD Bus width */ - if(sd_state == MSD_OK) - { - /* Enable wide operation */ - if(HAL_SD_ConfigWideBusOperation(&uSdHandle, SDMMC_BUS_WIDE_4B) != HAL_OK) - { - sd_state = MSD_ERROR; - } - else - { - sd_state = MSD_OK; - } - } - - return sd_state; -} - -/** - * @brief DeInitializes the SD card device. - * @retval SD status - */ -uint8_t BSP_SD_DeInit(void) -{ - uint8_t sd_state = MSD_OK; - - uSdHandle.Instance = SDMMC1; - - /* HAL SD deinitialization */ - if(HAL_SD_DeInit(&uSdHandle) != HAL_OK) - { - sd_state = MSD_ERROR; - } - - /* Msp SD deinitialization */ - uSdHandle.Instance = SDMMC1; - BSP_SD_MspDeInit(&uSdHandle, NULL); - - return sd_state; -} - -/** - * @brief Configures Interrupt mode for SD detection pin. - * @retval Returns MSD_OK - */ -uint8_t BSP_SD_ITConfig(void) -{ - GPIO_InitTypeDef gpio_init_structure; - - /* Configure Interrupt mode for SD detection pin */ - gpio_init_structure.Pin = SD_DETECT_PIN; - gpio_init_structure.Pull = GPIO_PULLUP; - gpio_init_structure.Speed = GPIO_SPEED_FAST; - gpio_init_structure.Mode = GPIO_MODE_IT_RISING_FALLING; - HAL_GPIO_Init(SD_DETECT_GPIO_PORT, &gpio_init_structure); - - /* Enable and set SD detect EXTI Interrupt to the lowest priority */ - HAL_NVIC_SetPriority((IRQn_Type)(SD_DETECT_EXTI_IRQn), 0x0F, 0x00); - HAL_NVIC_EnableIRQ((IRQn_Type)(SD_DETECT_EXTI_IRQn)); - - return MSD_OK; -} - -/** - * @brief Detects if SD card is correctly plugged in the memory slot or not. - * @retval Returns if SD is detected or not - */ -uint8_t BSP_SD_IsDetected(void) -{ - __IO uint8_t status = SD_PRESENT; - - /* Check SD card detect pin */ - if (HAL_GPIO_ReadPin(SD_DETECT_GPIO_PORT, SD_DETECT_PIN) == GPIO_PIN_SET) - { - status = SD_NOT_PRESENT; - } - - return status; -} - -/** - * @brief Reads block(s) from a specified address in an SD card, in polling mode. - * @param pData: Pointer to the buffer that will contain the data to transmit - * @param ReadAddr: Address from where data is to be read - * @param NumOfBlocks: Number of SD blocks to read - * @param Timeout: Timeout for read operation - * @retval SD status - */ -uint8_t BSP_SD_ReadBlocks(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout) -{ - if(HAL_SD_ReadBlocks(&uSdHandle, (uint8_t *)pData, ReadAddr, NumOfBlocks, Timeout) != HAL_OK) - { - return MSD_ERROR; - } - else - { - return MSD_OK; - } -} - -/** - * @brief Writes block(s) to a specified address in an SD card, in polling mode. - * @param pData: Pointer to the buffer that will contain the data to transmit - * @param WriteAddr: Address from where data is to be written - * @param NumOfBlocks: Number of SD blocks to write - * @param Timeout: Timeout for write operation - * @retval SD status - */ -uint8_t BSP_SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout) -{ - if(HAL_SD_WriteBlocks(&uSdHandle, (uint8_t *)pData, WriteAddr, NumOfBlocks, Timeout) != HAL_OK) - { - return MSD_ERROR; - } - else - { - return MSD_OK; - } -} - -/** - * @brief Reads block(s) from a specified address in an SD card, in DMA mode. - * @param pData: Pointer to the buffer that will contain the data to transmit - * @param ReadAddr: Address from where data is to be read - * @param NumOfBlocks: Number of SD blocks to read - * @retval SD status - */ -uint8_t BSP_SD_ReadBlocks_DMA(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks) -{ - /* Read block(s) in DMA transfer mode */ - if(HAL_SD_ReadBlocks_DMA(&uSdHandle, (uint8_t *)pData, ReadAddr, NumOfBlocks) != HAL_OK) - { - return MSD_ERROR; - } - else - { - return MSD_OK; - } -} - -/** - * @brief Writes block(s) to a specified address in an SD card, in DMA mode. - * @param pData: Pointer to the buffer that will contain the data to transmit - * @param WriteAddr: Address from where data is to be written - * @param NumOfBlocks: Number of SD blocks to write - * @retval SD status - */ -uint8_t BSP_SD_WriteBlocks_DMA(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks) -{ - /* Write block(s) in DMA transfer mode */ - if(HAL_SD_WriteBlocks_DMA(&uSdHandle, (uint8_t *)pData, WriteAddr, NumOfBlocks) != HAL_OK) - { - return MSD_ERROR; - } - else - { - return MSD_OK; - } -} - -/** - * @brief Erases the specified memory area of the given SD card. - * @param StartAddr: Start byte address - * @param EndAddr: End byte address - * @retval SD status - */ -uint8_t BSP_SD_Erase(uint32_t StartAddr, uint32_t EndAddr) -{ - if(HAL_SD_Erase(&uSdHandle, StartAddr, EndAddr) != HAL_OK) - { - return MSD_ERROR; - } - else - { - return MSD_OK; - } -} - -/** - * @brief Initializes the SD MSP. - * @param hsd: SD handle - * @param Params - * @retval None - */ -__weak void BSP_SD_MspInit(SD_HandleTypeDef *hsd, void *Params) -{ - static DMA_HandleTypeDef dma_rx_handle; - static DMA_HandleTypeDef dma_tx_handle; - GPIO_InitTypeDef gpio_init_structure; - - /* Enable SDIO clock */ - __HAL_RCC_SDMMC1_CLK_ENABLE(); - - /* Enable DMA2 clocks */ - __DMAx_TxRx_CLK_ENABLE(); - - /* Enable GPIOs clock */ - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOD_CLK_ENABLE(); - - /* Common GPIO configuration */ - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Pull = GPIO_PULLUP; - gpio_init_structure.Speed = GPIO_SPEED_HIGH; - gpio_init_structure.Alternate = GPIO_AF12_SDMMC1; - - /* GPIOC configuration */ - gpio_init_structure.Pin = GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12; - HAL_GPIO_Init(GPIOC, &gpio_init_structure); - - /* GPIOD configuration */ - gpio_init_structure.Pin = GPIO_PIN_2; - HAL_GPIO_Init(GPIOD, &gpio_init_structure); - - /* NVIC configuration for SDIO interrupts */ - HAL_NVIC_SetPriority(SDMMC1_IRQn, 0x0E, 0); - HAL_NVIC_EnableIRQ(SDMMC1_IRQn); - - /* Configure DMA Rx parameters */ - dma_rx_handle.Init.Channel = SD_DMAx_Rx_CHANNEL; - dma_rx_handle.Init.Direction = DMA_PERIPH_TO_MEMORY; - dma_rx_handle.Init.PeriphInc = DMA_PINC_DISABLE; - dma_rx_handle.Init.MemInc = DMA_MINC_ENABLE; - dma_rx_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; - dma_rx_handle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; - dma_rx_handle.Init.Mode = DMA_PFCTRL; - dma_rx_handle.Init.Priority = DMA_PRIORITY_VERY_HIGH; - dma_rx_handle.Init.FIFOMode = DMA_FIFOMODE_ENABLE; - dma_rx_handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; - dma_rx_handle.Init.MemBurst = DMA_MBURST_INC4; - dma_rx_handle.Init.PeriphBurst = DMA_PBURST_INC4; - - dma_rx_handle.Instance = SD_DMAx_Rx_STREAM; - - /* Associate the DMA handle */ - __HAL_LINKDMA(hsd, hdmarx, dma_rx_handle); - - /* Deinitialize the stream for new transfer */ - HAL_DMA_DeInit(&dma_rx_handle); - - /* Configure the DMA stream */ - HAL_DMA_Init(&dma_rx_handle); - - /* Configure DMA Tx parameters */ - dma_tx_handle.Init.Channel = SD_DMAx_Tx_CHANNEL; - dma_tx_handle.Init.Direction = DMA_MEMORY_TO_PERIPH; - dma_tx_handle.Init.PeriphInc = DMA_PINC_DISABLE; - dma_tx_handle.Init.MemInc = DMA_MINC_ENABLE; - dma_tx_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; - dma_tx_handle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; - dma_tx_handle.Init.Mode = DMA_PFCTRL; - dma_tx_handle.Init.Priority = DMA_PRIORITY_VERY_HIGH; - dma_tx_handle.Init.FIFOMode = DMA_FIFOMODE_ENABLE; - dma_tx_handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; - dma_tx_handle.Init.MemBurst = DMA_MBURST_INC4; - dma_tx_handle.Init.PeriphBurst = DMA_PBURST_INC4; - - dma_tx_handle.Instance = SD_DMAx_Tx_STREAM; - - /* Associate the DMA handle */ - __HAL_LINKDMA(hsd, hdmatx, dma_tx_handle); - - /* Deinitialize the stream for new transfer */ - HAL_DMA_DeInit(&dma_tx_handle); - - /* Configure the DMA stream */ - HAL_DMA_Init(&dma_tx_handle); - - /* NVIC configuration for DMA transfer complete interrupt */ - HAL_NVIC_SetPriority(SD_DMAx_Rx_IRQn, 0x0F, 0); - HAL_NVIC_EnableIRQ(SD_DMAx_Rx_IRQn); - - /* NVIC configuration for DMA transfer complete interrupt */ - HAL_NVIC_SetPriority(SD_DMAx_Tx_IRQn, 0x0F, 0); - HAL_NVIC_EnableIRQ(SD_DMAx_Tx_IRQn); -} - -/** - * @brief Initializes the SD Detect pin MSP. - * @param hsd: SD handle - * @param Params - * @retval None - */ -__weak void BSP_SD_Detect_MspInit(SD_HandleTypeDef *hsd, void *Params) -{ - GPIO_InitTypeDef gpio_init_structure; - - SD_DETECT_GPIO_CLK_ENABLE(); - - /* GPIO configuration in input for uSD_Detect signal */ - gpio_init_structure.Pin = SD_DETECT_PIN; - gpio_init_structure.Mode = GPIO_MODE_INPUT; - gpio_init_structure.Pull = GPIO_PULLUP; - gpio_init_structure.Speed = GPIO_SPEED_HIGH; - HAL_GPIO_Init(SD_DETECT_GPIO_PORT, &gpio_init_structure); -} - -/** - * @brief DeInitializes the SD MSP. - * @param hsd: SD handle - * @param Params - * @retval None - */ -__weak void BSP_SD_MspDeInit(SD_HandleTypeDef *hsd, void *Params) -{ - static DMA_HandleTypeDef dma_rx_handle; - static DMA_HandleTypeDef dma_tx_handle; - - /* Disable NVIC for DMA transfer complete interrupts */ - HAL_NVIC_DisableIRQ(SD_DMAx_Rx_IRQn); - HAL_NVIC_DisableIRQ(SD_DMAx_Tx_IRQn); - - /* Deinitialize the stream for new transfer */ - dma_rx_handle.Instance = SD_DMAx_Rx_STREAM; - HAL_DMA_DeInit(&dma_rx_handle); - - /* Deinitialize the stream for new transfer */ - dma_tx_handle.Instance = SD_DMAx_Tx_STREAM; - HAL_DMA_DeInit(&dma_tx_handle); - - /* Disable NVIC for SDIO interrupts */ - HAL_NVIC_DisableIRQ(SDMMC1_IRQn); - - /* DeInit GPIO pins can be done in the application - (by surcharging this __weak function) */ - - /* Disable SDMMC1 clock */ - __HAL_RCC_SDMMC1_CLK_DISABLE(); - - /* GPIO pins clock and DMA clocks can be shut down in the application - by surcharging this __weak function */ -} - -/** - * @brief Gets the current SD card data status. - * @retval Data transfer state. - * This value can be one of the following values: - * @arg SD_TRANSFER_OK: No data transfer is acting - * @arg SD_TRANSFER_BUSY: Data transfer is acting - */ -uint8_t BSP_SD_GetCardState(void) -{ - return((HAL_SD_GetCardState(&uSdHandle) == HAL_SD_CARD_TRANSFER ) ? SD_TRANSFER_OK : SD_TRANSFER_BUSY); -} - - -/** - * @brief Get SD information about specific SD card. - * @param CardInfo: Pointer to HAL_SD_CardInfoTypedef structure - * @retval None - */ -void BSP_SD_GetCardInfo(HAL_SD_CardInfoTypeDef *CardInfo) -{ - /* Get SD card Information */ - HAL_SD_GetCardInfo(&uSdHandle, CardInfo); -} - -/** - * @brief SD Abort callbacks - * @param hsd: SD handle - * @retval None - */ -void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd) -{ - BSP_SD_AbortCallback(); -} - -/** - * @brief Tx Transfer completed callbacks - * @param hsd: SD handle - * @retval None - */ -void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd) -{ - BSP_SD_WriteCpltCallback(); -} - -/** - * @brief Rx Transfer completed callbacks - * @param hsd: SD handle - * @retval None - */ -void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd) -{ - BSP_SD_ReadCpltCallback(); -} - -/** - * @brief BSP SD Abort callbacks - * @retval None - */ -__weak void BSP_SD_AbortCallback(void) -{ - -} - -/** - * @brief BSP Tx Transfer completed callbacks - * @retval None - */ -__weak void BSP_SD_WriteCpltCallback(void) -{ - -} - -/** - * @brief BSP Rx Transfer completed callbacks - * @retval None - */ -__weak void BSP_SD_ReadCpltCallback(void) -{ - -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_sd.h --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_sd.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,161 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery_sd.h - * @author MCD Application Team - * @brief This file contains the common defines and functions prototypes for - * the stm32746g_discovery_sd.c driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32746G_DISCOVERY_SD_H -#define __STM32746G_DISCOVERY_SD_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32746g_discovery.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY_SD - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_SD_Exported_Types STM32746G_DISCOVERY_SD Exported Types - * @{ - */ - -/** - * @brief SD Card information structure - */ -#define BSP_SD_CardInfo HAL_SD_CardInfoTypeDef -/** - * @} - */ - -/** - * @brief SD status structure definition - */ -#define MSD_OK ((uint8_t)0x00) -#define MSD_ERROR ((uint8_t)0x01) -#define MSD_ERROR_SD_NOT_PRESENT ((uint8_t)0x02) - -/** - * @brief SD transfer state definition - */ -#define SD_TRANSFER_OK ((uint8_t)0x00) -#define SD_TRANSFER_BUSY ((uint8_t)0x01) - -/** @defgroup STM32746G_DISCOVERY_SD_Exported_Constants STM32746G_DISCOVERY_SD Exported Constants - * @{ - */ -#define SD_PRESENT ((uint8_t)0x01) -#define SD_NOT_PRESENT ((uint8_t)0x00) - -#define SD_DATATIMEOUT ((uint32_t)100000000) - -/* DMA definitions for SD DMA transfer */ -#define __DMAx_TxRx_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE -#define SD_DMAx_Tx_CHANNEL DMA_CHANNEL_4 -#define SD_DMAx_Rx_CHANNEL DMA_CHANNEL_4 -#define SD_DMAx_Tx_STREAM DMA2_Stream6 -#define SD_DMAx_Rx_STREAM DMA2_Stream3 -#define SD_DMAx_Tx_IRQn DMA2_Stream6_IRQn -#define SD_DMAx_Rx_IRQn DMA2_Stream3_IRQn -#define BSP_SDMMC_IRQHandler SDMMC1_IRQHandler -#define BSP_SDMMC_DMA_Tx_IRQHandler DMA2_Stream6_IRQHandler -#define BSP_SDMMC_DMA_Rx_IRQHandler DMA2_Stream3_IRQHandler -#define SD_DetectIRQHandler() HAL_GPIO_EXTI_IRQHandler(SD_DETECT_PIN) -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_SD_Exported_Macro STM32746G_DISCOVERY_SD Exported Macro - * @{ - */ -/** - * @} - */ - -/** @addtogroup STM32746G_DISCOVERY_SD_Exported_Functions - * @{ - */ -uint8_t BSP_SD_Init(void); -uint8_t BSP_SD_DeInit(void); -uint8_t BSP_SD_ITConfig(void); -uint8_t BSP_SD_ReadBlocks(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks, uint32_t Timeout); -uint8_t BSP_SD_WriteBlocks(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks, uint32_t Timeout); -uint8_t BSP_SD_ReadBlocks_DMA(uint32_t *pData, uint32_t ReadAddr, uint32_t NumOfBlocks); -uint8_t BSP_SD_WriteBlocks_DMA(uint32_t *pData, uint32_t WriteAddr, uint32_t NumOfBlocks); -uint8_t BSP_SD_Erase(uint32_t StartAddr, uint32_t EndAddr); -uint8_t BSP_SD_GetCardState(void); -void BSP_SD_GetCardInfo(HAL_SD_CardInfoTypeDef *CardInfo); -uint8_t BSP_SD_IsDetected(void); - -/* These functions can be modified in case the current settings (e.g. DMA stream) - need to be changed for specific application needs */ -void BSP_SD_MspInit(SD_HandleTypeDef *hsd, void *Params); -void BSP_SD_Detect_MspInit(SD_HandleTypeDef *hsd, void *Params); -void BSP_SD_MspDeInit(SD_HandleTypeDef *hsd, void *Params); -void BSP_SD_AbortCallback(void); -void BSP_SD_WriteCpltCallback(void); -void BSP_SD_ReadCpltCallback(void); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32746G_DISCOVERY_SD_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_sdram.c --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_sdram.c Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,497 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery_sdram.c - * @author MCD Application Team - * @brief This file includes the SDRAM driver for the MT48LC4M32B2B5-7 memory - * device mounted on STM32746G-Discovery board. - @verbatim - 1. How To use this driver: - -------------------------- - - This driver is used to drive the MT48LC4M32B2B5-7 SDRAM external memory mounted - on STM32746G-Discovery board. - - This driver does not need a specific component driver for the SDRAM device - to be included with. - - 2. Driver description: - --------------------- - + Initialization steps: - o Initialize the SDRAM external memory using the BSP_SDRAM_Init() function. This - function includes the MSP layer hardware resources initialization and the - FMC controller configuration to interface with the external SDRAM memory. - o It contains the SDRAM initialization sequence to program the SDRAM external - device using the function BSP_SDRAM_Initialization_sequence(). Note that this - sequence is standard for all SDRAM devices, but can include some differences - from a device to another. If it is the case, the right sequence should be - implemented separately. - - + SDRAM read/write operations - o SDRAM external memory can be accessed with read/write operations once it is - initialized. - Read/write operation can be performed with AHB access using the functions - BSP_SDRAM_ReadData()/BSP_SDRAM_WriteData(), or by DMA transfer using the functions - BSP_SDRAM_ReadData_DMA()/BSP_SDRAM_WriteData_DMA(). - o The AHB access is performed with 32-bit width transaction, the DMA transfer - configuration is fixed at single (no burst) word transfer (see the - SDRAM_MspInit() static function). - o User can implement his own functions for read/write access with his desired - configurations. - o If interrupt mode is used for DMA transfer, the function BSP_SDRAM_DMA_IRQHandler() - is called in IRQ handler file, to serve the generated interrupt once the DMA - transfer is complete. - o You can send a command to the SDRAM device in runtime using the function - BSP_SDRAM_Sendcmd(), and giving the desired command as parameter chosen between - the predefined commands of the "FMC_SDRAM_CommandTypeDef" structure. - - @endverbatim - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Dependencies -- stm32f7xx_hal_sdram.c -- stm32f7xx_ll_fmc.c -- stm32f7xx_hal_dma.c -- stm32f7xx_hal_gpio.c -- stm32f7xx_hal_cortex.c -- stm32f7xx_hal_rcc_ex.h -EndDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32746g_discovery_sdram.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_SDRAM STM32746G_DISCOVERY_SDRAM - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_SDRAM_Private_Types_Definitions STM32746G_DISCOVERY_SDRAM Private Types Definitions - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_SDRAM_Private_Defines STM32746G_DISCOVERY_SDRAM Private Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_SDRAM_Private_Macros STM32746G_DISCOVERY_SDRAM Private Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_SDRAM_Private_Variables STM32746G_DISCOVERY_SDRAM Private Variables - * @{ - */ -SDRAM_HandleTypeDef sdramHandle; -static FMC_SDRAM_TimingTypeDef Timing; -static FMC_SDRAM_CommandTypeDef Command; -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_SDRAM_Private_Function_Prototypes STM32746G_DISCOVERY_SDRAM Private Function Prototypes - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_SDRAM_Exported_Functions STM32746G_DISCOVERY_SDRAM Exported Functions - * @{ - */ - -/** - * @brief Initializes the SDRAM device. - * @retval SDRAM status - */ -uint8_t BSP_SDRAM_Init(void) -{ - static uint8_t sdramstatus = SDRAM_ERROR; - /* SDRAM device configuration */ - sdramHandle.Instance = FMC_SDRAM_DEVICE; - - /* Timing configuration for 100Mhz as SD clock frequency (System clock is up to 200Mhz) */ - Timing.LoadToActiveDelay = 2; - Timing.ExitSelfRefreshDelay = 7; - Timing.SelfRefreshTime = 4; - Timing.RowCycleDelay = 7; - Timing.WriteRecoveryTime = 2; - Timing.RPDelay = 2; - Timing.RCDDelay = 2; - - sdramHandle.Init.SDBank = FMC_SDRAM_BANK1; - sdramHandle.Init.ColumnBitsNumber = FMC_SDRAM_COLUMN_BITS_NUM_8; - sdramHandle.Init.RowBitsNumber = FMC_SDRAM_ROW_BITS_NUM_12; - sdramHandle.Init.MemoryDataWidth = SDRAM_MEMORY_WIDTH; - sdramHandle.Init.InternalBankNumber = FMC_SDRAM_INTERN_BANKS_NUM_4; - sdramHandle.Init.CASLatency = FMC_SDRAM_CAS_LATENCY_2; - sdramHandle.Init.WriteProtection = FMC_SDRAM_WRITE_PROTECTION_DISABLE; - sdramHandle.Init.SDClockPeriod = SDCLOCK_PERIOD; - sdramHandle.Init.ReadBurst = FMC_SDRAM_RBURST_ENABLE; - sdramHandle.Init.ReadPipeDelay = FMC_SDRAM_RPIPE_DELAY_0; - - /* SDRAM controller initialization */ - - BSP_SDRAM_MspInit(&sdramHandle, NULL); /* __weak function can be rewritten by the application */ - - if(HAL_SDRAM_Init(&sdramHandle, &Timing) != HAL_OK) - { - sdramstatus = SDRAM_ERROR; - } - else - { - sdramstatus = SDRAM_OK; - } - - /* SDRAM initialization sequence */ - BSP_SDRAM_Initialization_sequence(REFRESH_COUNT); - - return sdramstatus; -} - -/** - * @brief DeInitializes the SDRAM device. - * @retval SDRAM status - */ -uint8_t BSP_SDRAM_DeInit(void) -{ - static uint8_t sdramstatus = SDRAM_ERROR; - /* SDRAM device de-initialization */ - sdramHandle.Instance = FMC_SDRAM_DEVICE; - - if(HAL_SDRAM_DeInit(&sdramHandle) != HAL_OK) - { - sdramstatus = SDRAM_ERROR; - } - else - { - sdramstatus = SDRAM_OK; - } - - /* SDRAM controller de-initialization */ - BSP_SDRAM_MspDeInit(&sdramHandle, NULL); - - return sdramstatus; -} - -/** - * @brief Programs the SDRAM device. - * @param RefreshCount: SDRAM refresh counter value - * @retval None - */ -void BSP_SDRAM_Initialization_sequence(uint32_t RefreshCount) -{ - __IO uint32_t tmpmrd = 0; - - /* Step 1: Configure a clock configuration enable command */ - Command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE; - Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; - Command.AutoRefreshNumber = 1; - Command.ModeRegisterDefinition = 0; - - /* Send the command */ - HAL_SDRAM_SendCommand(&sdramHandle, &Command, SDRAM_TIMEOUT); - - /* Step 2: Insert 100 us minimum delay */ - /* Inserted delay is equal to 1 ms due to systick time base unit (ms) */ - HAL_Delay(1); - - /* Step 3: Configure a PALL (precharge all) command */ - Command.CommandMode = FMC_SDRAM_CMD_PALL; - Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; - Command.AutoRefreshNumber = 1; - Command.ModeRegisterDefinition = 0; - - /* Send the command */ - HAL_SDRAM_SendCommand(&sdramHandle, &Command, SDRAM_TIMEOUT); - - /* Step 4: Configure an Auto Refresh command */ - Command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE; - Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; - Command.AutoRefreshNumber = 8; - Command.ModeRegisterDefinition = 0; - - /* Send the command */ - HAL_SDRAM_SendCommand(&sdramHandle, &Command, SDRAM_TIMEOUT); - - /* Step 5: Program the external memory mode register */ - tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1 |\ - SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL |\ - SDRAM_MODEREG_CAS_LATENCY_2 |\ - SDRAM_MODEREG_OPERATING_MODE_STANDARD |\ - SDRAM_MODEREG_WRITEBURST_MODE_SINGLE; - - Command.CommandMode = FMC_SDRAM_CMD_LOAD_MODE; - Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1; - Command.AutoRefreshNumber = 1; - Command.ModeRegisterDefinition = tmpmrd; - - /* Send the command */ - HAL_SDRAM_SendCommand(&sdramHandle, &Command, SDRAM_TIMEOUT); - - /* Step 6: Set the refresh rate counter */ - /* Set the device refresh rate */ - HAL_SDRAM_ProgramRefreshRate(&sdramHandle, RefreshCount); -} - -/** - * @brief Reads an amount of data from the SDRAM memory in polling mode. - * @param uwStartAddress: Read start address - * @param pData: Pointer to data to be read - * @param uwDataSize: Size of read data from the memory - * @retval SDRAM status - */ -uint8_t BSP_SDRAM_ReadData(uint32_t uwStartAddress, uint32_t *pData, uint32_t uwDataSize) -{ - if(HAL_SDRAM_Read_32b(&sdramHandle, (uint32_t *)uwStartAddress, pData, uwDataSize) != HAL_OK) - { - return SDRAM_ERROR; - } - else - { - return SDRAM_OK; - } -} - -/** - * @brief Reads an amount of data from the SDRAM memory in DMA mode. - * @param uwStartAddress: Read start address - * @param pData: Pointer to data to be read - * @param uwDataSize: Size of read data from the memory - * @retval SDRAM status - */ -uint8_t BSP_SDRAM_ReadData_DMA(uint32_t uwStartAddress, uint32_t *pData, uint32_t uwDataSize) -{ - if(HAL_SDRAM_Read_DMA(&sdramHandle, (uint32_t *)uwStartAddress, pData, uwDataSize) != HAL_OK) - { - return SDRAM_ERROR; - } - else - { - return SDRAM_OK; - } -} - -/** - * @brief Writes an amount of data to the SDRAM memory in polling mode. - * @param uwStartAddress: Write start address - * @param pData: Pointer to data to be written - * @param uwDataSize: Size of written data from the memory - * @retval SDRAM status - */ -uint8_t BSP_SDRAM_WriteData(uint32_t uwStartAddress, uint32_t *pData, uint32_t uwDataSize) -{ - if(HAL_SDRAM_Write_32b(&sdramHandle, (uint32_t *)uwStartAddress, pData, uwDataSize) != HAL_OK) - { - return SDRAM_ERROR; - } - else - { - return SDRAM_OK; - } -} - -/** - * @brief Writes an amount of data to the SDRAM memory in DMA mode. - * @param uwStartAddress: Write start address - * @param pData: Pointer to data to be written - * @param uwDataSize: Size of written data from the memory - * @retval SDRAM status - */ -uint8_t BSP_SDRAM_WriteData_DMA(uint32_t uwStartAddress, uint32_t *pData, uint32_t uwDataSize) -{ - if(HAL_SDRAM_Write_DMA(&sdramHandle, (uint32_t *)uwStartAddress, pData, uwDataSize) != HAL_OK) - { - return SDRAM_ERROR; - } - else - { - return SDRAM_OK; - } -} - -/** - * @brief Sends command to the SDRAM bank. - * @param SdramCmd: Pointer to SDRAM command structure - * @retval SDRAM status - */ -uint8_t BSP_SDRAM_Sendcmd(FMC_SDRAM_CommandTypeDef *SdramCmd) -{ - if(HAL_SDRAM_SendCommand(&sdramHandle, SdramCmd, SDRAM_TIMEOUT) != HAL_OK) - { - return SDRAM_ERROR; - } - else - { - return SDRAM_OK; - } -} - -/** - * @brief Initializes SDRAM MSP. - * @param hsdram: SDRAM handle - * @param Params - * @retval None - */ -__weak void BSP_SDRAM_MspInit(SDRAM_HandleTypeDef *hsdram, void *Params) -{ - static DMA_HandleTypeDef dma_handle; - GPIO_InitTypeDef gpio_init_structure; - - /* Enable FMC clock */ - __HAL_RCC_FMC_CLK_ENABLE(); - - /* Enable chosen DMAx clock */ - __DMAx_CLK_ENABLE(); - - /* Enable GPIOs clock */ - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOD_CLK_ENABLE(); - __HAL_RCC_GPIOE_CLK_ENABLE(); - __HAL_RCC_GPIOF_CLK_ENABLE(); - __HAL_RCC_GPIOG_CLK_ENABLE(); - __HAL_RCC_GPIOH_CLK_ENABLE(); - - /* Common GPIO configuration */ - gpio_init_structure.Mode = GPIO_MODE_AF_PP; - gpio_init_structure.Pull = GPIO_PULLUP; - gpio_init_structure.Speed = GPIO_SPEED_FAST; - gpio_init_structure.Alternate = GPIO_AF12_FMC; - - /* GPIOC configuration */ - gpio_init_structure.Pin = GPIO_PIN_3; - HAL_GPIO_Init(GPIOC, &gpio_init_structure); - - /* GPIOD configuration */ - gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_8 | GPIO_PIN_9 | - GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15; - HAL_GPIO_Init(GPIOD, &gpio_init_structure); - - /* GPIOE configuration */ - gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_7| GPIO_PIN_8 | GPIO_PIN_9 |\ - GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |\ - GPIO_PIN_15; - HAL_GPIO_Init(GPIOE, &gpio_init_structure); - - /* GPIOF configuration */ - gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2| GPIO_PIN_3 | GPIO_PIN_4 |\ - GPIO_PIN_5 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_14 |\ - GPIO_PIN_15; - HAL_GPIO_Init(GPIOF, &gpio_init_structure); - - /* GPIOG configuration */ - gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4| GPIO_PIN_5 | GPIO_PIN_8 |\ - GPIO_PIN_15; - HAL_GPIO_Init(GPIOG, &gpio_init_structure); - - /* GPIOH configuration */ - gpio_init_structure.Pin = GPIO_PIN_3 | GPIO_PIN_5; - HAL_GPIO_Init(GPIOH, &gpio_init_structure); - - /* Configure common DMA parameters */ - dma_handle.Init.Channel = SDRAM_DMAx_CHANNEL; - dma_handle.Init.Direction = DMA_MEMORY_TO_MEMORY; - dma_handle.Init.PeriphInc = DMA_PINC_ENABLE; - dma_handle.Init.MemInc = DMA_MINC_ENABLE; - dma_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; - dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; - dma_handle.Init.Mode = DMA_NORMAL; - dma_handle.Init.Priority = DMA_PRIORITY_HIGH; - dma_handle.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - dma_handle.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; - dma_handle.Init.MemBurst = DMA_MBURST_SINGLE; - dma_handle.Init.PeriphBurst = DMA_PBURST_SINGLE; - - dma_handle.Instance = SDRAM_DMAx_STREAM; - - /* Associate the DMA handle */ - __HAL_LINKDMA(hsdram, hdma, dma_handle); - - /* Deinitialize the stream for new transfer */ - HAL_DMA_DeInit(&dma_handle); - - /* Configure the DMA stream */ - HAL_DMA_Init(&dma_handle); - - /* NVIC configuration for DMA transfer complete interrupt */ - HAL_NVIC_SetPriority(SDRAM_DMAx_IRQn, 0x0F, 0); - HAL_NVIC_EnableIRQ(SDRAM_DMAx_IRQn); -} - -/** - * @brief DeInitializes SDRAM MSP. - * @param hsdram: SDRAM handle - * @param Params - * @retval None - */ -__weak void BSP_SDRAM_MspDeInit(SDRAM_HandleTypeDef *hsdram, void *Params) -{ - static DMA_HandleTypeDef dma_handle; - - /* Disable NVIC configuration for DMA interrupt */ - HAL_NVIC_DisableIRQ(SDRAM_DMAx_IRQn); - - /* Deinitialize the stream for new transfer */ - dma_handle.Instance = SDRAM_DMAx_STREAM; - HAL_DMA_DeInit(&dma_handle); - - /* GPIO pins clock, FMC clock and DMA clock can be shut down in the applications - by surcharging this __weak function */ -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_sdram.h --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_sdram.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,162 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery_sdram.h - * @author MCD Application Team - * @brief This file contains the common defines and functions prototypes for - * the stm32746g_discovery_sdram.c driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32746G_DISCOVERY_SDRAM_H -#define __STM32746G_DISCOVERY_SDRAM_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32f7xx_hal.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY_SDRAM - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_SDRAM_Exported_Types STM32746G_DISCOVERY_SDRAM Exported Types - * @{ - */ - -/** - * @brief SDRAM status structure definition - */ -#define SDRAM_OK ((uint8_t)0x00) -#define SDRAM_ERROR ((uint8_t)0x01) - -/** @defgroup STM32746G_DISCOVERY_SDRAM_Exported_Constants STM32746G_DISCOVERY_SDRAM Exported Constants - * @{ - */ -#define SDRAM_DEVICE_ADDR ((uint32_t)0xC0000000) -#define SDRAM_DEVICE_SIZE ((uint32_t)0x800000) /* SDRAM device size in MBytes */ - -/* #define SDRAM_MEMORY_WIDTH FMC_SDRAM_MEM_BUS_WIDTH_8 */ -#define SDRAM_MEMORY_WIDTH FMC_SDRAM_MEM_BUS_WIDTH_16 - -#define SDCLOCK_PERIOD FMC_SDRAM_CLOCK_PERIOD_2 -/* #define SDCLOCK_PERIOD FMC_SDRAM_CLOCK_PERIOD_3 */ - -#define REFRESH_COUNT ((uint32_t)0x0603) /* SDRAM refresh counter (100Mhz SD clock) */ - -#define SDRAM_TIMEOUT ((uint32_t)0xFFFF) - -/* DMA definitions for SDRAM DMA transfer */ -#define __DMAx_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE -#define __DMAx_CLK_DISABLE __HAL_RCC_DMA2_CLK_DISABLE -#define SDRAM_DMAx_CHANNEL DMA_CHANNEL_0 -#define SDRAM_DMAx_STREAM DMA2_Stream0 -#define SDRAM_DMAx_IRQn DMA2_Stream0_IRQn -#define BSP_SDRAM_DMA_IRQHandler DMA2_Stream0_IRQHandler -/** - * @} - */ - -/** - * @brief FMC SDRAM Mode definition register defines - */ -#define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000) -#define SDRAM_MODEREG_BURST_LENGTH_2 ((uint16_t)0x0001) -#define SDRAM_MODEREG_BURST_LENGTH_4 ((uint16_t)0x0002) -#define SDRAM_MODEREG_BURST_LENGTH_8 ((uint16_t)0x0004) -#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000) -#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED ((uint16_t)0x0008) -#define SDRAM_MODEREG_CAS_LATENCY_2 ((uint16_t)0x0020) -#define SDRAM_MODEREG_CAS_LATENCY_3 ((uint16_t)0x0030) -#define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint16_t)0x0000) -#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000) -#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200) -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_SDRAM_Exported_Macro STM32746G_DISCOVERY_SDRAM Exported Macro - * @{ - */ -/** - * @} - */ - -/** @addtogroup STM32746G_DISCOVERY_SDRAM_Exported_Functions - * @{ - */ -uint8_t BSP_SDRAM_Init(void); -uint8_t BSP_SDRAM_DeInit(void); -void BSP_SDRAM_Initialization_sequence(uint32_t RefreshCount); -uint8_t BSP_SDRAM_ReadData(uint32_t uwStartAddress, uint32_t *pData, uint32_t uwDataSize); -uint8_t BSP_SDRAM_ReadData_DMA(uint32_t uwStartAddress, uint32_t *pData, uint32_t uwDataSize); -uint8_t BSP_SDRAM_WriteData(uint32_t uwStartAddress, uint32_t *pData, uint32_t uwDataSize); -uint8_t BSP_SDRAM_WriteData_DMA(uint32_t uwStartAddress, uint32_t *pData, uint32_t uwDataSize); -uint8_t BSP_SDRAM_Sendcmd(FMC_SDRAM_CommandTypeDef *SdramCmd); - -/* These functions can be modified in case the current settings (e.g. DMA stream) - need to be changed for specific application needs */ -void BSP_SDRAM_MspInit(SDRAM_HandleTypeDef *hsdram, void *Params); -void BSP_SDRAM_MspDeInit(SDRAM_HandleTypeDef *hsdram, void *Params); - - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32746G_DISCOVERY_SDRAM_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_ts.c --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_ts.c Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,450 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery_ts.c - * @author MCD Application Team - * @brief This file provides a set of functions needed to manage the Touch - * Screen on STM32746G-Discovery board. - @verbatim - 1. How To use this driver: - -------------------------- - - This driver is used to drive the touch screen module of the STM32746G-Discovery - board on the RK043FN48H-CT672B 480x272 LCD screen with capacitive touch screen. - - The FT5336 component driver must be included in project files according to - the touch screen driver present on this board. - - 2. Driver description: - --------------------- - + Initialization steps: - o Initialize the TS module using the BSP_TS_Init() function. This - function includes the MSP layer hardware resources initialization and the - communication layer configuration to start the TS use. The LCD size properties - (x and y) are passed as parameters. - o If TS interrupt mode is desired, you must configure the TS interrupt mode - by calling the function BSP_TS_ITConfig(). The TS interrupt mode is generated - as an external interrupt whenever a touch is detected. - The interrupt mode internally uses the IO functionalities driver driven by - the IO expander, to configure the IT line. - - + Touch screen use - o The touch screen state is captured whenever the function BSP_TS_GetState() is - used. This function returns information about the last LCD touch occurred - in the TS_StateTypeDef structure. - o If TS interrupt mode is used, the function BSP_TS_ITGetStatus() is needed to get - the interrupt status. To clear the IT pending bits, you should call the - function BSP_TS_ITClear(). - o The IT is handled using the corresponding external interrupt IRQ handler, - the user IT callback treatment is implemented on the same external interrupt - callback. - @endverbatim - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Dependencies -- stm32746g_discovery_lcd.c -- ft5336.c -EndDependencies */ - -/* Includes ------------------------------------------------------------------*/ -#include "stm32746g_discovery_ts.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_TS STM32746G_DISCOVERY_TS - * @{ - */ - -/** @defgroup STM32746G_DISCOVERY_TS_Private_Types_Definitions STM32746G_DISCOVERY_TS Types Definitions - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_TS_Private_Defines STM32746G_DISCOVERY_TS Types Defines - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_TS_Private_Macros STM32746G_DISCOVERY_TS Private Macros - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_TS_Imported_Variables STM32746G_DISCOVERY_TS Imported Variables - * @{ - */ - /** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_TS_Private_Variables STM32746G_DISCOVERY_TS Private Variables - * @{ - */ -static TS_DrvTypeDef *tsDriver; -static uint16_t tsXBoundary, tsYBoundary; -static uint8_t tsOrientation; -static uint8_t I2cAddress; -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_TS_Private_Function_Prototypes STM32746G_DISCOVERY_TS Private Function Prototypes - * @{ - */ -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_TS_Exported_Functions STM32746G_DISCOVERY_TS Exported Functions - * @{ - */ - -/** - * @brief Initializes and configures the touch screen functionalities and - * configures all necessary hardware resources (GPIOs, I2C, clocks..). - * @param ts_SizeX: Maximum X size of the TS area on LCD - * @param ts_SizeY: Maximum Y size of the TS area on LCD - * @retval TS_OK if all initializations are OK. Other value if error. - */ -uint8_t BSP_TS_Init(uint16_t ts_SizeX, uint16_t ts_SizeY) -{ - uint8_t status = TS_OK; - tsXBoundary = ts_SizeX; - tsYBoundary = ts_SizeY; - - /* Read ID and verify if the touch screen driver is ready */ - ft5336_ts_drv.Init(TS_I2C_ADDRESS); - if(ft5336_ts_drv.ReadID(TS_I2C_ADDRESS) == FT5336_ID_VALUE) - { - /* Initialize the TS driver structure */ - tsDriver = &ft5336_ts_drv; - I2cAddress = TS_I2C_ADDRESS; - tsOrientation = TS_SWAP_XY; - - /* Initialize the TS driver */ - tsDriver->Start(I2cAddress); - } - else - { - status = TS_DEVICE_NOT_FOUND; - } - - return status; -} - -/** - * @brief DeInitializes the TouchScreen. - * @retval TS state - */ -uint8_t BSP_TS_DeInit(void) -{ - /* Actually ts_driver does not provide a DeInit function */ - return TS_OK; -} - -/** - * @brief Configures and enables the touch screen interrupts. - * @retval TS_OK if all initializations are OK. Other value if error. - */ -uint8_t BSP_TS_ITConfig(void) -{ - GPIO_InitTypeDef gpio_init_structure; - - /* Configure Interrupt mode for SD detection pin */ - gpio_init_structure.Pin = TS_INT_PIN; - gpio_init_structure.Pull = GPIO_NOPULL; - gpio_init_structure.Speed = GPIO_SPEED_FAST; - gpio_init_structure.Mode = GPIO_MODE_IT_RISING; - HAL_GPIO_Init(TS_INT_GPIO_PORT, &gpio_init_structure); - - /* Enable and set Touch screen EXTI Interrupt to the lowest priority */ - HAL_NVIC_SetPriority((IRQn_Type)(TS_INT_EXTI_IRQn), 0x0F, 0x00); - HAL_NVIC_EnableIRQ((IRQn_Type)(TS_INT_EXTI_IRQn)); - - /* Enable the TS ITs */ - tsDriver->EnableIT(I2cAddress); - - return TS_OK; -} - -/** - * @brief Gets the touch screen interrupt status. - * @retval TS_OK if all initializations are OK. Other value if error. - */ -uint8_t BSP_TS_ITGetStatus(void) -{ - /* Return the TS IT status */ - return (tsDriver->GetITStatus(I2cAddress)); -} - -/** - * @brief Returns status and positions of the touch screen. - * @param TS_State: Pointer to touch screen current state structure - * @retval TS_OK if all initializations are OK. Other value if error. - */ -uint8_t BSP_TS_GetState(TS_StateTypeDef *TS_State) -{ - static uint32_t _x[TS_MAX_NB_TOUCH] = {0, 0}; - static uint32_t _y[TS_MAX_NB_TOUCH] = {0, 0}; - uint8_t ts_status = TS_OK; - uint16_t x[TS_MAX_NB_TOUCH]; - uint16_t y[TS_MAX_NB_TOUCH]; - uint16_t brute_x[TS_MAX_NB_TOUCH]; - uint16_t brute_y[TS_MAX_NB_TOUCH]; - uint16_t x_diff; - uint16_t y_diff; - uint32_t index; -#if (TS_MULTI_TOUCH_SUPPORTED == 1) - uint32_t weight = 0; - uint32_t area = 0; - uint32_t event = 0; -#endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ - - /* Check and update the number of touches active detected */ - TS_State->touchDetected = tsDriver->DetectTouch(I2cAddress); - - if(TS_State->touchDetected) - { - for(index=0; index < TS_State->touchDetected; index++) - { - /* Get each touch coordinates */ - tsDriver->GetXY(I2cAddress, &(brute_x[index]), &(brute_y[index])); - - if(tsOrientation == TS_SWAP_NONE) - { - x[index] = brute_x[index]; - y[index] = brute_y[index]; - } - - if(tsOrientation & TS_SWAP_X) - { - x[index] = 4096 - brute_x[index]; - } - - if(tsOrientation & TS_SWAP_Y) - { - y[index] = 4096 - brute_y[index]; - } - - if(tsOrientation & TS_SWAP_XY) - { - y[index] = brute_x[index]; - x[index] = brute_y[index]; - } - - x_diff = x[index] > _x[index]? (x[index] - _x[index]): (_x[index] - x[index]); - y_diff = y[index] > _y[index]? (y[index] - _y[index]): (_y[index] - y[index]); - - if ((x_diff + y_diff) > 5) - { - _x[index] = x[index]; - _y[index] = y[index]; - } - - if(I2cAddress == FT5336_I2C_SLAVE_ADDRESS) - { - TS_State->touchX[index] = x[index]; - TS_State->touchY[index] = y[index]; - } - else - { - /* 2^12 = 4096 : indexes are expressed on a dynamic of 4096 */ - TS_State->touchX[index] = (tsXBoundary * _x[index]) >> 12; - TS_State->touchY[index] = (tsYBoundary * _y[index]) >> 12; - } - -#if (TS_MULTI_TOUCH_SUPPORTED == 1) - - /* Get touch info related to the current touch */ - ft5336_TS_GetTouchInfo(I2cAddress, index, &weight, &area, &event); - - /* Update TS_State structure */ - TS_State->touchWeight[index] = weight; - TS_State->touchArea[index] = area; - - /* Remap touch event */ - switch(event) - { - case FT5336_TOUCH_EVT_FLAG_PRESS_DOWN : - TS_State->touchEventId[index] = TOUCH_EVENT_PRESS_DOWN; - break; - case FT5336_TOUCH_EVT_FLAG_LIFT_UP : - TS_State->touchEventId[index] = TOUCH_EVENT_LIFT_UP; - break; - case FT5336_TOUCH_EVT_FLAG_CONTACT : - TS_State->touchEventId[index] = TOUCH_EVENT_CONTACT; - break; - case FT5336_TOUCH_EVT_FLAG_NO_EVENT : - TS_State->touchEventId[index] = TOUCH_EVENT_NO_EVT; - break; - default : - ts_status = TS_ERROR; - break; - } /* of switch(event) */ - -#endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ - - } /* of for(index=0; index < TS_State->touchDetected; index++) */ - -#if (TS_MULTI_TOUCH_SUPPORTED == 1) - /* Get gesture Id */ - ts_status = BSP_TS_Get_GestureId(TS_State); -#endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ - - } /* end of if(TS_State->touchDetected != 0) */ - - return (ts_status); -} - -#if (TS_MULTI_TOUCH_SUPPORTED == 1) -/** - * @brief Update gesture Id following a touch detected. - * @param TS_State: Pointer to touch screen current state structure - * @retval TS_OK if all initializations are OK. Other value if error. - */ -uint8_t BSP_TS_Get_GestureId(TS_StateTypeDef *TS_State) -{ - uint32_t gestureId = 0; - uint8_t ts_status = TS_OK; - - /* Get gesture Id */ - ft5336_TS_GetGestureID(I2cAddress, &gestureId); - - /* Remap gesture Id to a TS_GestureIdTypeDef value */ - switch(gestureId) - { - case FT5336_GEST_ID_NO_GESTURE : - TS_State->gestureId = GEST_ID_NO_GESTURE; - break; - case FT5336_GEST_ID_MOVE_UP : - TS_State->gestureId = GEST_ID_MOVE_UP; - break; - case FT5336_GEST_ID_MOVE_RIGHT : - TS_State->gestureId = GEST_ID_MOVE_RIGHT; - break; - case FT5336_GEST_ID_MOVE_DOWN : - TS_State->gestureId = GEST_ID_MOVE_DOWN; - break; - case FT5336_GEST_ID_MOVE_LEFT : - TS_State->gestureId = GEST_ID_MOVE_LEFT; - break; - case FT5336_GEST_ID_ZOOM_IN : - TS_State->gestureId = GEST_ID_ZOOM_IN; - break; - case FT5336_GEST_ID_ZOOM_OUT : - TS_State->gestureId = GEST_ID_ZOOM_OUT; - break; - default : - ts_status = TS_ERROR; - break; - } /* of switch(gestureId) */ - - return(ts_status); -} -#endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ - -/** - * @brief Clears all touch screen interrupts. - */ -void BSP_TS_ITClear(void) -{ - /* Clear TS IT pending bits */ - tsDriver->ClearIT(I2cAddress); -} - - -/** @defgroup STM32756G_DISCOVERY_TS_Private_Functions TS Private Functions - * @{ - */ - - -/** - * @brief Function used to reset all touch data before a new acquisition - * of touch information. - * @param TS_State: Pointer to touch screen current state structure - * @retval TS_OK if OK, TE_ERROR if problem found. - */ -uint8_t BSP_TS_ResetTouchData(TS_StateTypeDef *TS_State) -{ - uint8_t ts_status = TS_ERROR; - uint32_t index; - - if (TS_State != (TS_StateTypeDef *)NULL) - { - TS_State->gestureId = GEST_ID_NO_GESTURE; - TS_State->touchDetected = 0; - - for(index = 0; index < TS_MAX_NB_TOUCH; index++) - { - TS_State->touchX[index] = 0; - TS_State->touchY[index] = 0; - TS_State->touchArea[index] = 0; - TS_State->touchEventId[index] = TOUCH_EVENT_NO_EVT; - TS_State->touchWeight[index] = 0; - } - - ts_status = TS_OK; - - } /* of if (TS_State != (TS_StateTypeDef *)NULL) */ - - return (ts_status); -} - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
diff -r 85dbcff443aa -r 1a18e061d0ec Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_ts.h --- a/Drivers/BSP/STM32746G-Discovery/stm32746g_discovery_ts.h Wed Nov 27 08:29:42 2019 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,212 +0,0 @@ -/** - ****************************************************************************** - * @file stm32746g_discovery_ts.h - * @author MCD Application Team - * @brief This file contains the common defines and functions prototypes for - * the stm32746g_discovery_ts.c driver. - ****************************************************************************** - * @attention - * - * <h2><center>© COPYRIGHT(c) 2016 STMicroelectronics</center></h2> - * - * Redistribution and use in source and binary forms, with or without modification, - * are permitted provided that the following conditions are met: - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. Neither the name of STMicroelectronics nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - ****************************************************************************** - */ - -/* Define to prevent recursive inclusion -------------------------------------*/ -#ifndef __STM32746G_DISCOVERY_TS_H -#define __STM32746G_DISCOVERY_TS_H - -#ifdef __cplusplus - extern "C" { -#endif - -/* Includes ------------------------------------------------------------------*/ -#include "stm32746g_discovery.h" -/* Include touch screen FT5336 component Driver */ -#include "../Components/ft5336/ft5336.h" - -/** @addtogroup BSP - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY - * @{ - */ - -/** @addtogroup STM32746G_DISCOVERY_TS - * @{ - */ - - /** @defgroup STM32746G_DISCOVERY_TS_Exported_Constants STM32746G_DISCOVERY_TS Exported Constants - * @{ - */ - -/** @brief With FT5336 : maximum 5 touches detected simultaneously - */ -#define TS_MAX_NB_TOUCH ((uint32_t) FT5336_MAX_DETECTABLE_TOUCH) - -#define TS_NO_IRQ_PENDING ((uint8_t) 0) -#define TS_IRQ_PENDING ((uint8_t) 1) - -#define TS_SWAP_NONE ((uint8_t) 0x01) -#define TS_SWAP_X ((uint8_t) 0x02) -#define TS_SWAP_Y ((uint8_t) 0x04) -#define TS_SWAP_XY ((uint8_t) 0x08) - -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_TS_Exported_Types STM32746G_DISCOVERY_TS Exported Types - * @{ - */ -/** -* @brief TS_StateTypeDef -* Define TS State structure -*/ -typedef struct -{ - uint8_t touchDetected; /*!< Total number of active touches detected at last scan */ - uint16_t touchX[TS_MAX_NB_TOUCH]; /*!< Touch X[0], X[1] coordinates on 12 bits */ - uint16_t touchY[TS_MAX_NB_TOUCH]; /*!< Touch Y[0], Y[1] coordinates on 12 bits */ - -#if (TS_MULTI_TOUCH_SUPPORTED == 1) - uint8_t touchWeight[TS_MAX_NB_TOUCH]; /*!< Touch_Weight[0], Touch_Weight[1] : weight property of touches */ - uint8_t touchEventId[TS_MAX_NB_TOUCH]; /*!< Touch_EventId[0], Touch_EventId[1] : take value of type @ref TS_TouchEventTypeDef */ - uint8_t touchArea[TS_MAX_NB_TOUCH]; /*!< Touch_Area[0], Touch_Area[1] : touch area of each touch */ - uint32_t gestureId; /*!< type of gesture detected : take value of type @ref TS_GestureIdTypeDef */ -#endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ - -} TS_StateTypeDef; - -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_TS_Exported_Constants STM32746G_DISCOVERY_TS Exported Constants - * @{ - */ - -typedef enum -{ - TS_OK = 0x00, /*!< Touch Ok */ - TS_ERROR = 0x01, /*!< Touch Error */ - TS_TIMEOUT = 0x02, /*!< Touch Timeout */ - TS_DEVICE_NOT_FOUND = 0x03 /*!< Touchscreen device not found */ -}TS_StatusTypeDef; - -/** - * @brief TS_GestureIdTypeDef - * Define Possible managed gesture identification values returned by touch screen - * driver. - */ -typedef enum -{ - GEST_ID_NO_GESTURE = 0x00, /*!< Gesture not defined / recognized */ - GEST_ID_MOVE_UP = 0x01, /*!< Gesture Move Up */ - GEST_ID_MOVE_RIGHT = 0x02, /*!< Gesture Move Right */ - GEST_ID_MOVE_DOWN = 0x03, /*!< Gesture Move Down */ - GEST_ID_MOVE_LEFT = 0x04, /*!< Gesture Move Left */ - GEST_ID_ZOOM_IN = 0x05, /*!< Gesture Zoom In */ - GEST_ID_ZOOM_OUT = 0x06, /*!< Gesture Zoom Out */ - GEST_ID_NB_MAX = 0x07 /*!< max number of gesture id */ - -} TS_GestureIdTypeDef; - -/** - * @brief TS_TouchEventTypeDef - * Define Possible touch events kind as returned values - * by touch screen IC Driver. - */ -typedef enum -{ - TOUCH_EVENT_NO_EVT = 0x00, /*!< Touch Event : undetermined */ - TOUCH_EVENT_PRESS_DOWN = 0x01, /*!< Touch Event Press Down */ - TOUCH_EVENT_LIFT_UP = 0x02, /*!< Touch Event Lift Up */ - TOUCH_EVENT_CONTACT = 0x03, /*!< Touch Event Contact */ - TOUCH_EVENT_NB_MAX = 0x04 /*!< max number of touch events kind */ - -} TS_TouchEventTypeDef; -/** - * @} - */ - -/** @defgroup STM32746G_DISCOVERY_TS_Imported_Variables STM32746G_DISCOVERY_TS Imported Variables - * @{ - */ -/** - * @brief Table for touchscreen event information display on LCD : - * table indexed on enum @ref TS_TouchEventTypeDef information - */ -extern char * ts_event_string_tab[TOUCH_EVENT_NB_MAX]; - -/** - * @brief Table for touchscreen gesture Id information display on LCD : table indexed - * on enum @ref TS_GestureIdTypeDef information - */ -extern char * ts_gesture_id_string_tab[GEST_ID_NB_MAX]; -/** - * @} - */ - -/** @addtogroup STM32746G_DISCOVERY_TS_Exported_Functions - * @{ - */ -uint8_t BSP_TS_Init(uint16_t ts_SizeX, uint16_t ts_SizeY); -uint8_t BSP_TS_DeInit(void); -uint8_t BSP_TS_GetState(TS_StateTypeDef *TS_State); - -#if (TS_MULTI_TOUCH_SUPPORTED == 1) -uint8_t BSP_TS_Get_GestureId(TS_StateTypeDef *TS_State); -#endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */ - -uint8_t BSP_TS_ITConfig(void); -uint8_t BSP_TS_ITGetStatus(void); -void BSP_TS_ITClear(void); -uint8_t BSP_TS_ResetTouchData(TS_StateTypeDef *TS_State); -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - -/** - * @} - */ - - -#ifdef __cplusplus -} -#endif - -#endif /* __STM32746G_DISCOVERY_TS_H */ - -/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/