Patched for Audio example - Add status check when DFSDM's filter and channel de-init.
Dependents: DISCO_F413ZH-AUDIO-demo
The base repository is https://os.mbed.com/teams/ST/code/BSP_DISCO_F413ZH/. I've just added workaround patch for Audio-in demo on DISCO_F413ZH board(Microphone U16, U17)
Revision 0:4af3ca173992, committed 2017-05-17
- Comitter:
- arostm
- Date:
- Wed May 17 10:23:19 2017 +0200
- Child:
- 1:a3f6b8b5a6bf
- Commit message:
- creation of the DISCO_F413ZH BSP library
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/Common/accelero.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,143 @@
+/**
+ ******************************************************************************
+ * @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****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/Common/audio.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,122 @@
+/**
+ ******************************************************************************
+ * @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****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/Common/camera.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,141 @@
+/**
+ ******************************************************************************
+ * @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****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/Common/epd.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,115 @@
+/**
+ ******************************************************************************
+ * @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****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/Common/gyro.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,145 @@
+/**
+ ******************************************************************************
+ * @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****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/Common/idd.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,168 @@
+/**
+ ******************************************************************************
+ * @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****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/Common/io.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,150 @@
+/**
+ ******************************************************************************
+ * @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****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/Common/lcd.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,114 @@
+/**
+ ******************************************************************************
+ * @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****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/Common/magneto.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,125 @@
+/**
+ ******************************************************************************
+ * @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****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/Common/ts.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,107 @@
+/**
+ ******************************************************************************
+ * @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****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/Common/tsensor.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,118 @@
+/**
+ ******************************************************************************
+ * @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****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/ft6x06/ft6x06.c Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,514 @@
+/**
+ ******************************************************************************
+ * @file ft6x06.c
+ * @author MCD Application Team
+ * @version V1.0.1
+ * @date 03-May-2016
+ * @brief This file provides a set of functions needed to manage the FT6X06
+ * IO Expander devices.
+ ******************************************************************************
+ * @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 "ft6x06.h"
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup Component
+ * @{
+ */
+
+/** @defgroup FT6X06
+ * @{
+ */
+
+/* Private typedef -----------------------------------------------------------*/
+
+/** @defgroup FT6X06_Private_Defines FT6X06 Private Defines
+ * @{
+ */
+#define FT6x06_MAX_INSTANCE 2
+/**
+ * @}
+ */
+
+/* Private macro -------------------------------------------------------------*/
+
+/** @defgroup FT6X06_Private_Variables FT6X06 Private Variables
+ * @{
+ */
+
+/* Touch screen driver structure initialization */
+TS_DrvTypeDef ft6x06_ts_drv =
+{
+ ft6x06_Init,
+ ft6x06_ReadID,
+ ft6x06_Reset,
+
+ ft6x06_TS_Start,
+ ft6x06_TS_DetectTouch,
+ ft6x06_TS_GetXY,
+
+ ft6x06_TS_EnableIT,
+ ft6x06_TS_ClearIT,
+ ft6x06_TS_ITStatus,
+ ft6x06_TS_DisableIT
+};
+
+/* ft6x06 instances by address */
+uint8_t ft6x06[FT6x06_MAX_INSTANCE] = {0};
+
+/* Global ft6x06 handle */
+static ft6x06_handle_TypeDef ft6x06_handle = { FT6206_I2C_NOT_INITIALIZED, 0, 0};
+
+/**
+ * @}
+ */
+
+/** @defgroup ft6x06_Private_Function_Prototypes ft6x06 Private Function Prototypes
+ * @{
+ */
+static uint8_t ft6x06_GetInstance(uint16_t DeviceAddr);
+/* Private functions prototypes-----------------------------------------------*/
+#if (TS_AUTO_CALIBRATION_SUPPORTED == 1)
+/**
+ * @brief Start TouchScreen calibration phase
+ * @param DeviceAddr: FT6206 Device address for communication on I2C Bus.
+ * @retval Status FT6206_STATUS_OK or FT6206_STATUS_NOT_OK.
+ */
+static uint32_t ft6x06_TS_Calibration(uint16_t DeviceAddr);
+#endif /* TS_AUTO_CALIBRATION_SUPPORTED == 1 */
+
+/**
+ * @brief Basic static configuration of TouchScreen
+ * @param DeviceAddr: FT6206 Device address for communication on I2C Bus.
+ * @retval Status FT6206_STATUS_OK or FT6206_STATUS_NOT_OK.
+ */
+static uint32_t ft6x06_TS_Configure(uint16_t DeviceAddr);
+
+/**
+ * @}
+ */
+
+/** @defgroup ft6x06_Private_Functions ft6x06 Private Functions
+ * @{
+ */
+
+/**
+ * @brief Initialize the ft6x06 communication bus
+ * from MCU to FT6206 : ie I2C channel initialization (if required).
+ * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT6206).
+ * @retval None
+ */
+void ft6x06_Init(uint16_t DeviceAddr)
+{
+ uint8_t instance;
+ uint8_t empty;
+
+ /* Check if device instance already exists */
+ instance = ft6x06_GetInstance(DeviceAddr);
+
+ /* To prevent double initialization */
+ if(instance == 0xFF)
+ {
+ /* Look for empty instance */
+ empty = ft6x06_GetInstance(0);
+
+ if(empty < FT6x06_MAX_INSTANCE)
+ {
+ /* Register the current device instance */
+ ft6x06[empty] = DeviceAddr;
+
+ /* Initialize IO BUS layer */
+ TS_IO_Init();
+ }
+ }
+}
+
+/**
+ * @brief Software Reset the ft6x06.
+ * @note : Not applicable to FT6206.
+ * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT6206).
+ * @retval None
+ */
+void ft6x06_Reset(uint16_t DeviceAddr)
+{
+ /* Do nothing */
+ /* No software reset sequence available in FT6206 IC */
+}
+
+/**
+ * @brief Read the ft6x06 device ID, pre initialize I2C in case of need to be
+ * able to read the FT6206 device ID, and verify this is a FT6206.
+ * @param DeviceAddr: I2C FT6x06 Slave address.
+ * @retval The Device ID (two bytes).
+ */
+uint16_t ft6x06_ReadID(uint16_t DeviceAddr)
+{
+ /* Initialize I2C link if needed */
+ TS_IO_Init();
+
+ /* Return the device ID value */
+ return (TS_IO_Read(DeviceAddr, FT6206_CHIP_ID_REG));
+}
+
+/**
+ * @brief Configures the touch Screen IC device to start detecting touches
+ * It goes through an internal calibration process (Hw calibration sequence of
+ * the touch screen).
+ * @param DeviceAddr: Device address on communication Bus (I2C slave address).
+ * @retval None.
+ */
+void ft6x06_TS_Start(uint16_t DeviceAddr)
+{
+#if (TS_AUTO_CALIBRATION_SUPPORTED == 1)
+ /* Hw Calibration sequence start : should be done once after each power up */
+ /* This is called internal calibration of the touch screen */
+ ft6x06_TS_Calibration(DeviceAddr);
+#endif
+ /* Minimum static configuration of FT6206 */
+ ft6x06_TS_Configure(DeviceAddr);
+
+ /* By default set FT6206 IC in Polling mode : no INT generation on FT6206 for new touch available */
+ /* Note TS_INT is active low */
+ ft6x06_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 ft6x06_TS_DetectTouch(uint16_t DeviceAddr)
+{
+ volatile uint8_t nbTouch = 0;
+
+ /* Read register FT6206_TD_STAT_REG to check number of touches detection */
+ nbTouch = TS_IO_Read(DeviceAddr, FT6206_TD_STAT_REG);
+ nbTouch &= FT6206_TD_STAT_MASK;
+
+ if(nbTouch > FT6206_MAX_DETECTABLE_TOUCH)
+ {
+ /* If invalid number of touch detected, set it to zero */
+ nbTouch = 0;
+ }
+
+ /* Update ft6x06 driver internal global : current number of active touches */
+ ft6x06_handle.currActiveTouchNb = nbTouch;
+
+ /* Reset current active touch index on which to work on */
+ ft6x06_handle.currActiveTouchIdx = 0;
+
+ return(nbTouch);
+}
+
+/**
+ * @brief Get the touch screen X and Y positions values
+ * Manage multi touch thanks to touch Index global
+ * variable 'ft6x06_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 ft6x06_TS_GetXY(uint16_t DeviceAddr, uint16_t *X, uint16_t *Y)
+{
+ uint8_t regAddress = 0;
+ uint8_t dataxy[4];
+
+ if(ft6x06_handle.currActiveTouchIdx < ft6x06_handle.currActiveTouchNb)
+ {
+ switch(ft6x06_handle.currActiveTouchIdx)
+ {
+ case 0 :
+ regAddress = FT6206_P1_XH_REG;
+ break;
+ case 1 :
+ regAddress = FT6206_P2_XH_REG;
+ break;
+
+ default :
+ break;
+ }
+
+ /* Read X and Y positions */
+ TS_IO_ReadMultiple(DeviceAddr, regAddress, dataxy, sizeof(dataxy));
+
+ /* Send back ready X position to caller */
+ *X = ((dataxy[0] & FT6206_MSB_MASK) << 8) | (dataxy[1] & FT6206_LSB_MASK);
+
+ /* Send back ready Y position to caller */
+ *Y = ((dataxy[2] & FT6206_MSB_MASK) << 8) | (dataxy[3] & FT6206_LSB_MASK);
+
+ ft6x06_handle.currActiveTouchIdx++;
+ }
+}
+
+/**
+ * @brief Configure the FT6206 device to generate IT on given INT pin
+ * connected to MCU as EXTI.
+ * @param DeviceAddr: Device address on communication Bus (Slave I2C address of FT6206).
+ * @retval None
+ */
+void ft6x06_TS_EnableIT(uint16_t DeviceAddr)
+{
+ uint8_t regValue = 0;
+ regValue = (FT6206_G_MODE_INTERRUPT_TRIGGER & (FT6206_G_MODE_INTERRUPT_MASK >> FT6206_G_MODE_INTERRUPT_SHIFT)) << FT6206_G_MODE_INTERRUPT_SHIFT;
+
+ /* Set interrupt trigger mode in FT6206_GMODE_REG */
+ TS_IO_Write(DeviceAddr, FT6206_GMODE_REG, regValue);
+}
+
+/**
+ * @brief Configure the FT6206 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 FT6206).
+ * @retval None
+ */
+void ft6x06_TS_DisableIT(uint16_t DeviceAddr)
+{
+ uint8_t regValue = 0;
+ regValue = (FT6206_G_MODE_INTERRUPT_POLLING & (FT6206_G_MODE_INTERRUPT_MASK >> FT6206_G_MODE_INTERRUPT_SHIFT)) << FT6206_G_MODE_INTERRUPT_SHIFT;
+
+ /* Set interrupt polling mode in FT6206_GMODE_REG */
+ TS_IO_Write(DeviceAddr, FT6206_GMODE_REG, regValue);
+}
+
+/**
+ * @brief Get IT status from FT6206 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 FT6206.
+ * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT6206).
+ * @retval TS interrupts status : always return 0 here
+ */
+uint8_t ft6x06_TS_ITStatus(uint16_t DeviceAddr)
+{
+ /* Always return 0 as feature not applicable to FT6206 */
+ return 0;
+}
+
+/**
+ * @brief Clear IT status in FT6206 interrupt status clear registers
+ * Should be called Following an EXTI coming to the MCU.
+ * @note : This feature is not applicable to FT6206.
+ * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT6206).
+ * @retval None
+ */
+void ft6x06_TS_ClearIT(uint16_t DeviceAddr)
+{
+ /* Nothing to be done here for FT6206 */
+}
+
+/**** 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 FT6x06).
+ * @param pGestureId : Pointer to get last touch gesture Identification.
+ * @retval None.
+ */
+void ft6x06_TS_GetGestureID(uint16_t DeviceAddr, uint32_t * pGestureId)
+{
+ volatile uint8_t ucReadData = 0;
+
+ ucReadData = TS_IO_Read(DeviceAddr, FT6206_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 FT6x06).
+ * @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 ft6x06_TS_GetTouchInfo(uint16_t DeviceAddr,
+ uint32_t touchIdx,
+ uint32_t * pWeight,
+ uint32_t * pArea,
+ uint32_t * pEvent)
+{
+ uint8_t regAddress = 0;
+ uint8_t dataxy[3];
+
+ if(touchIdx < ft6x06_handle.currActiveTouchNb)
+ {
+ switch(touchIdx)
+ {
+ case 0 :
+ regAddress = FT6206_P1_WEIGHT_REG;
+ break;
+
+ case 1 :
+ regAddress = FT6206_P2_WEIGHT_REG;
+ break;
+
+ default :
+ break;
+
+ } /* end switch(touchIdx) */
+
+ /* Read weight, area and Event Id of touch index */
+ TS_IO_ReadMultiple(DeviceAddr, regAddress, dataxy, sizeof(dataxy));
+
+ /* Return weight of touch index */
+ * pWeight = (dataxy[0] & FT6206_TOUCH_WEIGHT_MASK) >> FT6206_TOUCH_WEIGHT_SHIFT;
+ /* Return area of touch index */
+ * pArea = (dataxy[1] & FT6206_TOUCH_AREA_MASK) >> FT6206_TOUCH_AREA_SHIFT;
+ /* Return Event Id of touch index */
+ * pEvent = (dataxy[2] & FT6206_TOUCH_EVT_FLAG_MASK) >> FT6206_TOUCH_EVT_FLAG_SHIFT;
+
+ } /* of if(touchIdx < ft6x06_handle.currActiveTouchNb) */
+}
+
+#endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */
+
+#if (TS_AUTO_CALIBRATION_SUPPORTED == 1)
+/**
+ * @brief Start TouchScreen calibration phase
+ * @param DeviceAddr: FT6206 Device address for communication on I2C Bus.
+ * @retval Status FT6206_STATUS_OK or FT6206_STATUS_NOT_OK.
+ */
+static uint32_t ft6x06_TS_Calibration(uint16_t DeviceAddr)
+{
+ uint32_t nbAttempt = 0;
+ volatile uint8_t ucReadData;
+ volatile uint8_t regValue;
+ uint32_t status = FT6206_STATUS_OK;
+ uint8_t bEndCalibration = 0;
+
+ /* >> Calibration sequence start */
+
+ /* Switch FT6206 back to factory mode to calibrate */
+ regValue = (FT6206_DEV_MODE_FACTORY & FT6206_DEV_MODE_MASK) << FT6206_DEV_MODE_SHIFT;
+ TS_IO_Write(DeviceAddr, FT6206_DEV_MODE_REG, regValue); /* 0x40 */
+
+ /* Read back the same register FT6206_DEV_MODE_REG */
+ ucReadData = TS_IO_Read(DeviceAddr, FT6206_DEV_MODE_REG);
+ TS_IO_Delay(300); /* Wait 300 ms */
+
+ if(((ucReadData & (FT6206_DEV_MODE_MASK << FT6206_DEV_MODE_SHIFT)) >> FT6206_DEV_MODE_SHIFT) != FT6206_DEV_MODE_FACTORY )
+ {
+ /* Return error to caller */
+ return(FT6206_STATUS_NOT_OK);
+ }
+
+ /* Start calibration command */
+ TS_IO_Write(DeviceAddr, FT6206_TD_STAT_REG, 0x04);
+ TS_IO_Delay(300); /* Wait 300 ms */
+
+ /* 100 attempts to wait switch from factory mode (calibration) to working mode */
+ for (nbAttempt=0; ((nbAttempt < 100) && (!bEndCalibration)) ; nbAttempt++)
+ {
+ ucReadData = TS_IO_Read(DeviceAddr, FT6206_DEV_MODE_REG);
+ ucReadData = (ucReadData & (FT6206_DEV_MODE_MASK << FT6206_DEV_MODE_SHIFT)) >> FT6206_DEV_MODE_SHIFT;
+ if(ucReadData == FT6206_DEV_MODE_WORKING)
+ {
+ /* Auto Switch to FT6206_DEV_MODE_WORKING : means calibration have ended */
+ bEndCalibration = 1; /* exit for loop */
+ }
+
+ TS_IO_Delay(200); /* Wait 200 ms */
+ }
+
+ /* Calibration sequence end << */
+
+ return(status);
+}
+#endif /* TS_AUTO_CALIBRATION_SUPPORTED == 1 */
+
+/**
+ * @brief Basic static configuration of TouchScreen
+ * @param DeviceAddr: FT6206 Device address for communication on I2C Bus.
+ * @retval Status FT6206_STATUS_OK or FT6206_STATUS_NOT_OK.
+ */
+static uint32_t ft6x06_TS_Configure(uint16_t DeviceAddr)
+{
+ uint32_t status = FT6206_STATUS_OK;
+
+ /* Nothing special to be done for FT6206 */
+
+ return(status);
+}
+
+/**
+ * @brief Check if the device instance of the selected address is already registered
+ * and return its index
+ * @param DeviceAddr: Device address on communication Bus.
+ * @retval Index of the device instance if registered, 0xFF if not.
+ */
+static uint8_t ft6x06_GetInstance(uint16_t DeviceAddr)
+{
+ uint8_t idx = 0;
+
+ /* Check all the registered instances */
+ for(idx = 0; idx < FT6x06_MAX_INSTANCE ; idx ++)
+ {
+ if(ft6x06[idx] == DeviceAddr)
+ {
+ return idx;
+ }
+ }
+
+ return 0xFF;
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/ft6x06/ft6x06.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,471 @@
+/**
+ ******************************************************************************
+ * @file ft6x06.h
+ * @author MCD Application Team
+ * @version V1.0.1
+ * @date 03-May-2016
+ * @brief This file contains all the functions prototypes for the
+ * ft6x06.c IO expander 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 __FT6X06_H
+#define __FT6X06_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Set Multi-touch as non supported */
+#ifndef TS_MULTI_TOUCH_SUPPORTED
+ #define TS_MULTI_TOUCH_SUPPORTED 0
+#endif
+
+/* Set Auto-calibration as non supported */
+#ifndef TS_AUTO_CALIBRATION_SUPPORTED
+ #define TS_AUTO_CALIBRATION_SUPPORTED 0
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "../Common/ts.h"
+
+/* Macros --------------------------------------------------------------------*/
+
+/** @typedef ft6x06_handle_TypeDef
+ * ft6x06 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;
+
+} ft6x06_handle_TypeDef;
+
+ /** @addtogroup BSP
+ * @{
+ */
+
+ /** @addtogroup Component
+ * @{
+ */
+
+ /** @defgroup FT6X06
+ * @{
+ */
+
+ /* Exported types ------------------------------------------------------------*/
+
+ /** @defgroup FT6X06_Exported_Types
+ * @{
+ */
+
+ /* Exported constants --------------------------------------------------------*/
+
+ /** @defgroup FT6X06_Exported_Constants
+ * @{
+ */
+
+ /* Maximum border values of the touchscreen pad */
+#define FT_6206_MAX_WIDTH ((uint16_t)800) /* Touchscreen pad max width */
+#define FT_6206_MAX_HEIGHT ((uint16_t)480) /* Touchscreen pad max height */
+
+ /* Touchscreen pad max width and height values for FT6x36 Touch*/
+#define FT_6206_MAX_WIDTH_HEIGHT ((uint16_t)240)
+
+ /* Possible values of driver functions return status */
+#define FT6206_STATUS_OK 0
+#define FT6206_STATUS_NOT_OK 1
+
+ /* Possible values of global variable 'TS_I2C_Initialized' */
+#define FT6206_I2C_NOT_INITIALIZED 0
+#define FT6206_I2C_INITIALIZED 1
+
+ /* Max detectable simultaneous touches */
+#define FT6206_MAX_DETECTABLE_TOUCH 2
+
+ /**
+ * @brief : Definitions for FT6206 I2C register addresses on 8 bit
+ **/
+
+ /* Current mode register of the FT6206 (R/W) */
+#define FT6206_DEV_MODE_REG 0x00
+
+ /* Possible values of FT6206_DEV_MODE_REG */
+#define FT6206_DEV_MODE_WORKING 0x00
+#define FT6206_DEV_MODE_FACTORY 0x04
+
+#define FT6206_DEV_MODE_MASK 0x7
+#define FT6206_DEV_MODE_SHIFT 4
+
+ /* Gesture ID register */
+#define FT6206_GEST_ID_REG 0x01
+
+ /* Possible values of FT6206_GEST_ID_REG */
+#define FT6206_GEST_ID_NO_GESTURE 0x00
+#define FT6206_GEST_ID_MOVE_UP 0x10
+#define FT6206_GEST_ID_MOVE_RIGHT 0x14
+#define FT6206_GEST_ID_MOVE_DOWN 0x18
+#define FT6206_GEST_ID_MOVE_LEFT 0x1C
+#define FT6206_GEST_ID_ZOOM_IN 0x48
+#define FT6206_GEST_ID_ZOOM_OUT 0x49
+
+ /* Touch Data Status register : gives number of active touch points (0..2) */
+#define FT6206_TD_STAT_REG 0x02
+
+ /* Values related to FT6206_TD_STAT_REG */
+#define FT6206_TD_STAT_MASK 0x0F
+#define FT6206_TD_STAT_SHIFT 0x00
+
+ /* Values Pn_XH and Pn_YH related */
+#define FT6206_TOUCH_EVT_FLAG_PRESS_DOWN 0x00
+#define FT6206_TOUCH_EVT_FLAG_LIFT_UP 0x01
+#define FT6206_TOUCH_EVT_FLAG_CONTACT 0x02
+#define FT6206_TOUCH_EVT_FLAG_NO_EVENT 0x03
+
+#define FT6206_TOUCH_EVT_FLAG_SHIFT 6
+#define FT6206_TOUCH_EVT_FLAG_MASK (3 << FT6206_TOUCH_EVT_FLAG_SHIFT)
+
+#define FT6206_MSB_MASK 0x0F
+#define FT6206_MSB_SHIFT 0
+
+ /* Values Pn_XL and Pn_YL related */
+#define FT6206_LSB_MASK 0xFF
+#define FT6206_LSB_SHIFT 0
+
+#define FT6206_P1_XH_REG 0x03
+#define FT6206_P1_XL_REG 0x04
+#define FT6206_P1_YH_REG 0x05
+#define FT6206_P1_YL_REG 0x06
+
+ /* Touch Pressure register value (R) */
+#define FT6206_P1_WEIGHT_REG 0x07
+
+ /* Values Pn_WEIGHT related */
+#define FT6206_TOUCH_WEIGHT_MASK 0xFF
+#define FT6206_TOUCH_WEIGHT_SHIFT 0
+
+ /* Touch area register */
+#define FT6206_P1_MISC_REG 0x08
+
+ /* Values related to FT6206_Pn_MISC_REG */
+#define FT6206_TOUCH_AREA_MASK (0x04 << 4)
+#define FT6206_TOUCH_AREA_SHIFT 0x04
+
+#define FT6206_P2_XH_REG 0x09
+#define FT6206_P2_XL_REG 0x0A
+#define FT6206_P2_YH_REG 0x0B
+#define FT6206_P2_YL_REG 0x0C
+#define FT6206_P2_WEIGHT_REG 0x0D
+#define FT6206_P2_MISC_REG 0x0E
+
+ /* Threshold for touch detection */
+#define FT6206_TH_GROUP_REG 0x80
+
+ /* Values FT6206_TH_GROUP_REG : threshold related */
+#define FT6206_THRESHOLD_MASK 0xFF
+#define FT6206_THRESHOLD_SHIFT 0
+
+ /* Filter function coefficients */
+#define FT6206_TH_DIFF_REG 0x85
+
+ /* Control register */
+#define FT6206_CTRL_REG 0x86
+
+ /* Values related to FT6206_CTRL_REG */
+
+ /* Will keep the Active mode when there is no touching */
+#define FT6206_CTRL_KEEP_ACTIVE_MODE 0x00
+
+ /* Switching from Active mode to Monitor mode automatically when there is no touching */
+#define FT6206_CTRL_KEEP_AUTO_SWITCH_MONITOR_MODE 0x01
+
+ /* The time period of switching from Active mode to Monitor mode when there is no touching */
+#define FT6206_TIMEENTERMONITOR_REG 0x87
+
+ /* Report rate in Active mode */
+#define FT6206_PERIODACTIVE_REG 0x88
+
+ /* Report rate in Monitor mode */
+#define FT6206_PERIODMONITOR_REG 0x89
+
+ /* The value of the minimum allowed angle while Rotating gesture mode */
+#define FT6206_RADIAN_VALUE_REG 0x91
+
+ /* Maximum offset while Moving Left and Moving Right gesture */
+#define FT6206_OFFSET_LEFT_RIGHT_REG 0x92
+
+ /* Maximum offset while Moving Up and Moving Down gesture */
+#define FT6206_OFFSET_UP_DOWN_REG 0x93
+
+ /* Minimum distance while Moving Left and Moving Right gesture */
+#define FT6206_DISTANCE_LEFT_RIGHT_REG 0x94
+
+ /* Minimum distance while Moving Up and Moving Down gesture */
+#define FT6206_DISTANCE_UP_DOWN_REG 0x95
+
+ /* Maximum distance while Zoom In and Zoom Out gesture */
+#define FT6206_DISTANCE_ZOOM_REG 0x96
+
+ /* High 8-bit of LIB Version info */
+#define FT6206_LIB_VER_H_REG 0xA1
+
+ /* Low 8-bit of LIB Version info */
+#define FT6206_LIB_VER_L_REG 0xA2
+
+ /* Chip Selecting */
+#define FT6206_CIPHER_REG 0xA3
+
+ /* Interrupt mode register (used when in interrupt mode) */
+#define FT6206_GMODE_REG 0xA4
+
+#define FT6206_G_MODE_INTERRUPT_MASK 0x03
+#define FT6206_G_MODE_INTERRUPT_SHIFT 0x00
+
+ /* Possible values of FT6206_GMODE_REG */
+#define FT6206_G_MODE_INTERRUPT_POLLING 0x00
+#define FT6206_G_MODE_INTERRUPT_TRIGGER 0x01
+
+ /* Current power mode the FT6206 system is in (R) */
+#define FT6206_PWR_MODE_REG 0xA5
+
+ /* FT6206 firmware version */
+#define FT6206_FIRMID_REG 0xA6
+
+ /* FT6206 Chip identification register */
+#define FT6206_CHIP_ID_REG 0xA8
+
+ /* Possible values of FT6206_CHIP_ID_REG */
+#define FT6206_ID_VALUE 0x11
+#define FT6x36_ID_VALUE 0xCD
+
+ /* Release code version */
+#define FT6206_RELEASE_CODE_ID_REG 0xAF
+
+ /* Current operating mode the FT6206 system is in (R) */
+#define FT6206_STATE_REG 0xBC
+
+ /**
+ * @}
+ */
+
+ /* Exported macro ------------------------------------------------------------*/
+
+ /** @defgroup ft6x06_Exported_Macros
+ * @{
+ */
+
+ /* Exported functions --------------------------------------------------------*/
+
+ /** @defgroup ft6x06_Exported_Functions
+ * @{
+ */
+
+ /**
+ * @brief ft6x06 Control functions
+ */
+
+
+/**
+ * @brief Initialize the ft6x06 communication bus
+ * from MCU to FT6206 : ie I2C channel initialization (if required).
+ * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT6206).
+ * @retval None
+ */
+void ft6x06_Init(uint16_t DeviceAddr);
+
+/**
+ * @brief Software Reset the ft6x06.
+ * @param DeviceAddr: Device address on communication Bus (I2C slave address of FT6206).
+ * @retval None
+ */
+void ft6x06_Reset(uint16_t DeviceAddr);
+
+/**
+ * @brief Read the ft6x06 device ID, pre intitalize I2C in case of need to be
+ * able to read the FT6206 device ID, and verify this is a FT6206.
+ * @param DeviceAddr: I2C FT6x06 Slave address.
+ * @retval The Device ID (two bytes).
+ */
+uint16_t ft6x06_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 ft6x06_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 ft6x06_TS_DetectTouch(uint16_t DeviceAddr);
+
+/**
+ * @brief Get the touch screen X and Y positions values
+ * Manage multi touch thanks to touch Index global
+ * variable 'ft6x06_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 ft6x06_TS_GetXY(uint16_t DeviceAddr, uint16_t *X, uint16_t *Y);
+
+/**
+ * @brief Configure the FT6206 device to generate IT on given INT pin
+ * connected to MCU as EXTI.
+ * @param DeviceAddr: Device address on communication Bus (Slave I2C address of FT6206).
+ * @retval None
+ */
+void ft6x06_TS_EnableIT(uint16_t DeviceAddr);
+
+/**
+ * @brief Configure the FT6206 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 FT6206).
+ * @retval None
+ */
+void ft6x06_TS_DisableIT(uint16_t DeviceAddr);
+
+/**
+ * @brief Get IT status from FT6206 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 FT6206).
+ * @retval TS interrupts status
+ */
+uint8_t ft6x06_TS_ITStatus (uint16_t DeviceAddr);
+
+/**
+ * @brief Clear IT status in FT6206 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 FT6206).
+ * @retval TS interrupts status
+ */
+void ft6x06_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 FT6x06).
+ * @param pGestureId : Pointer to get last touch gesture Identification.
+ * @retval None.
+ */
+void ft6x06_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 FT6x06).
+ * @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 ft6x06_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 ft6x06_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 uint16_t TS_IO_ReadMultiple(uint8_t Addr, uint8_t Reg, uint8_t *Buffer, uint16_t Length);
+extern void TS_IO_Delay(uint32_t Delay);
+
+ /**
+ * @}
+ */
+
+ /* Imported global variables --------------------------------------------------------*/
+
+ /** @defgroup ft6x06_Imported_Globals
+ * @{
+ */
+
+
+/* Touch screen driver structure */
+extern TS_DrvTypeDef ft6x06_ts_drv;
+
+ /**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* __FT6X06_H */
+
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/n25q128a/n25q128a.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,219 @@
+/**
+ ******************************************************************************
+ * @file n25q128a.h
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 29-May-2015
+ * @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****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/st7789h2/st7789h2.c Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,725 @@
+/**
+ ******************************************************************************
+ * @file st7789h2.c
+ * @author MCD Application Team
+ * @version V1.1.1
+ * @date 29-December-2016
+ * @brief This file includes the LCD driver for st7789h2 LCD.
+ ******************************************************************************
+ * @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 "st7789h2.h"
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup Components
+ * @{
+ */
+
+/** @defgroup ST7789H2
+ * @brief This file provides a set of functions needed to drive the
+ * FRIDA FRD154BP2901 LCD.
+ * @{
+ */
+
+/** @defgroup ST7789H2_Private_TypesDefinitions ST7789H2 Private TypesDefinitions
+ * @{
+ */
+typedef struct {
+ uint8_t red;
+ uint8_t green;
+ uint8_t blue;
+} ST7789H2_Rgb888;
+
+/**
+ * @}
+ */
+
+/** @defgroup ST7789H2_Private_Defines ST7789H2 Private Defines
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup ST7789H2_Private_Macros ST7789H2 Private Macros
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup ST7789H2_Private_Variables ST7789H2 Private Variables
+ * @{
+ */
+LCD_DrvTypeDef ST7789H2_drv =
+{
+ ST7789H2_Init,
+ ST7789H2_ReadID,
+ ST7789H2_DisplayOn,
+ ST7789H2_DisplayOff,
+ ST7789H2_SetCursor,
+ ST7789H2_WritePixel,
+ ST7789H2_ReadPixel,
+ ST7789H2_SetDisplayWindow,
+ ST7789H2_DrawHLine,
+ ST7789H2_DrawVLine,
+ ST7789H2_GetLcdPixelWidth,
+ ST7789H2_GetLcdPixelHeight,
+ ST7789H2_DrawBitmap,
+ ST7789H2_DrawRGBImage,
+};
+
+static uint16_t WindowsXstart = 0;
+static uint16_t WindowsYstart = 0;
+static uint16_t WindowsXend = ST7789H2_LCD_PIXEL_WIDTH-1;
+static uint16_t WindowsYend = ST7789H2_LCD_PIXEL_HEIGHT-1;
+/**
+ * @}
+ */
+
+/** @defgroup ST7789H2_Private_FunctionPrototypes ST7789H2 Private FunctionPrototypes
+ * @{
+ */
+static ST7789H2_Rgb888 ST7789H2_ReadPixel_rgb888(uint16_t Xpos, uint16_t Ypos);
+static void ST7789H2_DrawRGBHLine(uint16_t Xpos, uint16_t Ypos, uint16_t Xsize, uint8_t *pdata);
+
+/**
+ * @}
+ */
+
+/** @defgroup ST7789H2_Private_Functions ST7789H2 Private Functions
+ * @{
+ */
+
+/**
+ * @brief Initialize the st7789h2 LCD Component.
+ * @param None
+ * @retval None
+ */
+void ST7789H2_Init(void)
+{
+ uint8_t parameter[14];
+
+ /* Initialize st7789h2 low level bus layer ----------------------------------*/
+ LCD_IO_Init();
+ /* Sleep In Command */
+ ST7789H2_WriteReg(ST7789H2_SLEEP_IN, (uint8_t*)NULL, 0);
+ /* Wait for 10ms */
+ LCD_IO_Delay(10);
+
+ /* SW Reset Command */
+ ST7789H2_WriteReg(0x01, (uint8_t*)NULL, 0);
+ /* Wait for 200ms */
+ LCD_IO_Delay(200);
+
+ /* Sleep Out Command */
+ ST7789H2_WriteReg(ST7789H2_SLEEP_OUT, (uint8_t*)NULL, 0);
+ /* Wait for 120ms */
+ LCD_IO_Delay(120);
+
+ /* Normal display for Driver Down side */
+ parameter[0] = 0x00;
+ ST7789H2_WriteReg(ST7789H2_NORMAL_DISPLAY, parameter, 1);
+
+ /* Color mode 16bits/pixel */
+ parameter[0] = 0x05;
+ ST7789H2_WriteReg(ST7789H2_COLOR_MODE, parameter, 1);
+
+ /* Display inversion On */
+ ST7789H2_WriteReg(ST7789H2_DISPLAY_INVERSION, (uint8_t*)NULL, 0);
+
+ /* Set Column address CASET */
+ parameter[0] = 0x00;
+ parameter[1] = 0x00;
+ parameter[2] = 0x00;
+ parameter[3] = 0xEF;
+ ST7789H2_WriteReg(ST7789H2_CASET, parameter, 4);
+ /* Set Row address RASET */
+ parameter[0] = 0x00;
+ parameter[1] = 0x00;
+ parameter[2] = 0x00;
+ parameter[3] = 0xEF;
+ ST7789H2_WriteReg(ST7789H2_RASET, parameter, 4);
+
+ /*--------------- ST7789H2 Frame rate setting -------------------------------*/
+ /* PORCH control setting */
+ parameter[0] = 0x0C;
+ parameter[1] = 0x0C;
+ parameter[2] = 0x00;
+ parameter[3] = 0x33;
+ parameter[4] = 0x33;
+ ST7789H2_WriteReg(ST7789H2_PORCH_CTRL, parameter, 5);
+
+ /* GATE control setting */
+ parameter[0] = 0x35;
+ ST7789H2_WriteReg(ST7789H2_GATE_CTRL, parameter, 1);
+
+ /*--------------- ST7789H2 Power setting ------------------------------------*/
+ /* VCOM setting */
+ parameter[0] = 0x1F;
+ ST7789H2_WriteReg(ST7789H2_VCOM_SET, parameter, 1);
+
+ /* LCM Control setting */
+ parameter[0] = 0x2C;
+ ST7789H2_WriteReg(ST7789H2_LCM_CTRL, parameter, 1);
+
+ /* VDV and VRH Command Enable */
+ parameter[0] = 0x01;
+ parameter[1] = 0xC3;
+ ST7789H2_WriteReg(ST7789H2_VDV_VRH_EN, parameter, 2);
+
+ /* VDV Set */
+ parameter[0] = 0x20;
+ ST7789H2_WriteReg(ST7789H2_VDV_SET, parameter, 1);
+
+ /* Frame Rate Control in normal mode */
+ parameter[0] = 0x0F;
+ ST7789H2_WriteReg(ST7789H2_FR_CTRL, parameter, 1);
+
+ /* Power Control */
+ parameter[0] = 0xA4;
+ parameter[1] = 0xA1;
+ ST7789H2_WriteReg(ST7789H2_POWER_CTRL, parameter, 1);
+
+ /*--------------- ST7789H2 Gamma setting ------------------------------------*/
+ /* Positive Voltage Gamma Control */
+ parameter[0] = 0xD0;
+ parameter[1] = 0x08;
+ parameter[2] = 0x11;
+ parameter[3] = 0x08;
+ parameter[4] = 0x0C;
+ parameter[5] = 0x15;
+ parameter[6] = 0x39;
+ parameter[7] = 0x33;
+ parameter[8] = 0x50;
+ parameter[9] = 0x36;
+ parameter[10] = 0x13;
+ parameter[11] = 0x14;
+ parameter[12] = 0x29;
+ parameter[13] = 0x2D;
+ ST7789H2_WriteReg(ST7789H2_PV_GAMMA_CTRL, parameter, 14);
+
+ /* Negative Voltage Gamma Control */
+ parameter[0] = 0xD0;
+ parameter[1] = 0x08;
+ parameter[2] = 0x10;
+ parameter[3] = 0x08;
+ parameter[4] = 0x06;
+ parameter[5] = 0x06;
+ parameter[6] = 0x39;
+ parameter[7] = 0x44;
+ parameter[8] = 0x51;
+ parameter[9] = 0x0B;
+ parameter[10] = 0x16;
+ parameter[11] = 0x14;
+ parameter[12] = 0x2F;
+ parameter[13] = 0x31;
+ ST7789H2_WriteReg(ST7789H2_NV_GAMMA_CTRL, parameter, 14);
+
+ /* Display ON command */
+ ST7789H2_DisplayOn();
+
+ /* Tearing Effect Line On: Option (00h:VSYNC Interface OFF, 01h:VSYNC Interface ON) */
+ parameter[0] = 0x00;
+ ST7789H2_WriteReg(ST7789H2_TEARING_EFFECT, parameter, 1);
+
+}
+
+/**
+ * @brief Set the Display Orientation.
+ * @param orientation: ST7789H2_ORIENTATION_PORTRAIT, ST7789H2_ORIENTATION_LANDSCAPE
+ * or ST7789H2_ORIENTATION_LANDSCAPE_ROT180
+ * @retval None
+ */
+void ST7789H2_SetOrientation(uint32_t orientation)
+{
+ uint8_t parameter[6];
+
+ if(orientation == ST7789H2_ORIENTATION_LANDSCAPE)
+ {
+ parameter[0] = 0x00;
+ }
+ else if(orientation == ST7789H2_ORIENTATION_LANDSCAPE_ROT180)
+ {
+ /* Vertical Scrolling Definition */
+ /* TFA describes the Top Fixed Area */
+ parameter[0] = 0x00;
+ parameter[1] = 0x00;
+ /* VSA describes the height of the Vertical Scrolling Area */
+ parameter[2] = 0x01;
+ parameter[3] = 0xF0;
+ /* BFA describes the Bottom Fixed Area */
+ parameter[4] = 0x00;
+ parameter[5] = 0x00;
+ ST7789H2_WriteReg(ST7789H2_VSCRDEF, parameter, 6);
+
+ /* Vertical Scroll Start Address of RAM */
+ /* GRAM row nbr (320) - Display row nbr (240) = 80 = 0x50 */
+ parameter[0] = 0x00;
+ parameter[1] = 0x50;
+ ST7789H2_WriteReg(ST7789H2_VSCSAD, parameter, 2);
+
+ parameter[0] = 0xC0;
+ }
+ else
+ {
+ parameter[0] = 0x60;
+ }
+ ST7789H2_WriteReg(ST7789H2_NORMAL_DISPLAY, parameter, 1);
+}
+
+/**
+ * @brief Enables the Display.
+ * @param None
+ * @retval None
+ */
+void ST7789H2_DisplayOn(void)
+{
+ /* Display ON command */
+ ST7789H2_WriteReg(ST7789H2_DISPLAY_ON, (uint8_t*)NULL, 0);
+
+ /* Sleep Out command */
+ ST7789H2_WriteReg(ST7789H2_SLEEP_OUT, (uint8_t*)NULL, 0);
+}
+
+/**
+ * @brief Disables the Display.
+ * @param None
+ * @retval None
+ */
+void ST7789H2_DisplayOff(void)
+{
+ uint8_t parameter[1];
+ parameter[0] = 0xFE;
+ /* Display OFF command */
+ ST7789H2_WriteReg(ST7789H2_DISPLAY_OFF, parameter, 1);
+ /* Sleep In Command */
+ ST7789H2_WriteReg(ST7789H2_SLEEP_IN, (uint8_t*)NULL, 0);
+ /* Wait for 10ms */
+ LCD_IO_Delay(10);
+}
+
+/**
+ * @brief Get the LCD pixel Width.
+ * @param None
+ * @retval The Lcd Pixel Width
+ */
+uint16_t ST7789H2_GetLcdPixelWidth(void)
+{
+ return (uint16_t)ST7789H2_LCD_PIXEL_WIDTH;
+}
+
+/**
+ * @brief Get the LCD pixel Height.
+ * @param None
+ * @retval The Lcd Pixel Height
+ */
+uint16_t ST7789H2_GetLcdPixelHeight(void)
+{
+ return (uint16_t)ST7789H2_LCD_PIXEL_HEIGHT;
+}
+
+/**
+ * @brief Get the st7789h2 ID.
+ * @param None
+ * @retval The st7789h2 ID
+ */
+uint16_t ST7789H2_ReadID(void)
+{
+ LCD_IO_Init();
+
+ return ST7789H2_ReadReg(ST7789H2_LCD_ID);
+}
+
+/**
+ * @brief Set Cursor position.
+ * @param Xpos: specifies the X position.
+ * @param Ypos: specifies the Y position.
+ * @retval None
+ */
+void ST7789H2_SetCursor(uint16_t Xpos, uint16_t Ypos)
+{
+ uint8_t parameter[4];
+ /* CASET: Comumn Addrses Set */
+ parameter[0] = 0x00;
+ parameter[1] = 0x00 + Xpos;
+ parameter[2] = 0x00;
+ parameter[3] = 0xEF + Xpos;
+ ST7789H2_WriteReg(ST7789H2_CASET, parameter, 4);
+ /* RASET: Row Addrses Set */
+ parameter[0] = 0x00;
+ parameter[1] = 0x00 + Ypos;
+ parameter[2] = 0x00;
+ parameter[3] = 0xEF + Ypos;
+ ST7789H2_WriteReg(ST7789H2_RASET, parameter, 4);
+}
+
+/**
+ * @brief Write pixel.
+ * @param Xpos: specifies the X position.
+ * @param Ypos: specifies the Y position.
+ * @param RGBCode: the RGB pixel color in RGB565 format
+ * @retval None
+ */
+void ST7789H2_WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode)
+{
+ /* Set Cursor */
+ ST7789H2_SetCursor(Xpos, Ypos);
+
+ /* Prepare to write to LCD RAM */
+ ST7789H2_WriteReg(ST7789H2_WRITE_RAM, (uint8_t*)NULL, 0); /* RAM write data command */
+
+ /* Write RAM data */
+ LCD_IO_WriteData(RGBCode);
+}
+
+/**
+ * @brief Read pixel.
+ * @param Xpos: specifies the X position.
+ * @param Ypos: specifies the Y position.
+ * @retval The RGB pixel color in RGB565 format
+ */
+uint16_t ST7789H2_ReadPixel(uint16_t Xpos, uint16_t Ypos)
+{
+ ST7789H2_Rgb888 rgb888;
+ uint8_t r, g, b;
+ uint16_t rgb565;
+
+ /* Set Cursor */
+ ST7789H2_SetCursor(Xpos, Ypos);
+
+ /* Read RGB888 data from LCD RAM */
+ rgb888 = ST7789H2_ReadPixel_rgb888(Xpos, Ypos);
+
+ /* Convert RGB888 to RGB565 */
+ r = ((rgb888.red & 0xF8) >> 3); /* Extract the red component 5 most significant bits */
+ g = ((rgb888.green & 0xFC) >> 2); /* Extract the green component 6 most significant bits */
+ b = ((rgb888.blue & 0xF8) >> 3); /* Extract the blue component 5 most significant bits */
+
+ rgb565 = ((uint16_t)(r) << 11) + ((uint16_t)(g) << 5) + ((uint16_t)(b) << 0);
+
+ return (rgb565);
+}
+
+/**
+ * @brief Writes to the selected LCD register.
+ * @param Command: command value (or register address as named in st7789h2 doc).
+ * @param Parameters: pointer on parameters value (if command uses one or several parameters).
+ * @param NbParameters: number of command parameters (0 if no parameter)
+ * @retval None
+ */
+void ST7789H2_WriteReg(uint8_t Command, uint8_t *Parameters, uint8_t NbParameters)
+{
+ uint8_t i;
+
+ /* Send command */
+ LCD_IO_WriteReg(Command);
+
+ /* Send command's parameters if any */
+ for (i=0; i<NbParameters; i++)
+ {
+ LCD_IO_WriteData(Parameters[i]);
+ }
+}
+
+/**
+ * @brief Reads the selected LCD Register.
+ * @param Command: command value (or register address as named in st7789h2 doc).
+ * @retval Register Value.
+ */
+uint8_t ST7789H2_ReadReg(uint8_t Command)
+{
+ /* Send command */
+ LCD_IO_WriteReg(Command);
+
+ /* Read dummy data */
+ LCD_IO_ReadData();
+
+ /* Read register value */
+ return (LCD_IO_ReadData());
+}
+
+/**
+ * @brief Sets a display window
+ * @param Xpos: specifies the X bottom left position.
+ * @param Ypos: specifies the Y bottom left position.
+ * @param Height: display window height.
+ * @param Width: display window width.
+ * @retval None
+ */
+void ST7789H2_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
+{
+ if (Xpos < ST7789H2_LCD_PIXEL_WIDTH)
+ {
+ WindowsXstart = Xpos;
+ }
+ else
+ {
+ WindowsXstart = 0;
+ }
+
+ if (Ypos < ST7789H2_LCD_PIXEL_HEIGHT)
+ {
+ WindowsYstart = Ypos;
+ }
+ else
+ {
+ WindowsYstart = 0;
+ }
+
+ if (Width + Xpos <= ST7789H2_LCD_PIXEL_WIDTH)
+ {
+ WindowsXend = Width + Xpos - 1;
+ }
+ else
+ {
+ WindowsXend = ST7789H2_LCD_PIXEL_WIDTH - 1;
+ }
+
+ if (Height + Ypos <= ST7789H2_LCD_PIXEL_HEIGHT)
+ {
+ WindowsYend = Height + Ypos - 1;
+ }
+ else
+ {
+ WindowsYend = ST7789H2_LCD_PIXEL_HEIGHT-1;
+ }
+}
+
+/**
+ * @brief Draw vertical line.
+ * @param RGBCode: Specifies the RGB color in RGB565 format
+ * @param Xpos: specifies the X position.
+ * @param Ypos: specifies the Y position.
+ * @param Length: specifies the Line length.
+ * @retval None
+ */
+void ST7789H2_DrawHLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length)
+{
+ uint16_t counter = 0;
+
+ /* Set Cursor */
+ ST7789H2_SetCursor(Xpos, Ypos);
+
+ /* Prepare to write to LCD RAM */
+ ST7789H2_WriteReg(ST7789H2_WRITE_RAM, (uint8_t*)NULL, 0); /* RAM write data command */
+
+ /* Sent a complete line */
+ for(counter = 0; counter < Length; counter++)
+ {
+ LCD_IO_WriteData(RGBCode);
+ }
+}
+
+/**
+ * @brief Draw vertical line.
+ * @param RGBCode: Specifies the RGB color
+ * @param Xpos: specifies the X position.
+ * @param Ypos: specifies the Y position.
+ * @param Length: specifies the Line length.
+ * @retval None
+ */
+void ST7789H2_DrawVLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length)
+{
+ uint16_t counter = 0;
+
+ /* Set Cursor */
+ ST7789H2_SetCursor(Xpos, Ypos);
+
+ /* Prepare to write to LCD RAM */
+ ST7789H2_WriteReg(ST7789H2_WRITE_RAM, (uint8_t*)NULL, 0); /* RAM write data command */
+
+ /* Fill a complete vertical line */
+ for(counter = 0; counter < Length; counter++)
+ {
+ ST7789H2_WritePixel(Xpos, Ypos + counter, RGBCode);
+ }
+}
+
+/**
+ * @brief Displays a bitmap picture.
+ * @param BmpAddress: Bmp picture address.
+ * @param Xpos: Bmp X position in the LCD
+ * @param Ypos: Bmp Y position in the LCD
+ * @retval None
+ */
+void ST7789H2_DrawBitmap(uint16_t Xpos, uint16_t Ypos, uint8_t *pbmp)
+{
+ uint32_t index = 0, size = 0;
+ uint32_t posY;
+ uint32_t nb_line = 0;
+ uint16_t Xsize = WindowsXend - WindowsXstart + 1;
+ uint16_t Ysize = WindowsYend - WindowsYstart + 1;
+
+ /* Read bitmap size */
+ size = *(volatile uint16_t *) (pbmp + 2);
+ size |= (*(volatile uint16_t *) (pbmp + 4)) << 16;
+ /* Get bitmap data address offset */
+ index = *(volatile uint16_t *) (pbmp + 10);
+ index |= (*(volatile uint16_t *) (pbmp + 12)) << 16;
+ size = (size - index)/2;
+ pbmp += index;
+
+ for (posY = (Ypos + Ysize); posY > Ypos; posY--) /* In BMP files the line order is inverted */
+ {
+ /* Set Cursor */
+ ST7789H2_SetCursor(Xpos, posY - 1);
+
+ /* Draw one line of the picture */
+ ST7789H2_DrawRGBHLine(Xpos, posY - 1, Xsize, (pbmp + (nb_line * Xsize * 2)));
+ nb_line++;
+ }
+}
+
+/**
+ * @brief Displays picture.
+ * @param pdata: picture address.
+ * @param Xpos: Image X position in the LCD
+ * @param Ypos: Image Y position in the LCD
+ * @param Xsize: Image X size in the LCD
+ * @param Ysize: Image Y size in the LCD
+ * @retval None
+ */
+void ST7789H2_DrawRGBImage(uint16_t Xpos, uint16_t Ypos, uint16_t Xsize, uint16_t Ysize, uint8_t *pdata)
+{
+ uint32_t posY;
+ uint32_t nb_line = 0;
+
+ for (posY = Ypos; posY < (Ypos + Ysize); posY ++)
+ {
+ /* Set Cursor */
+ ST7789H2_SetCursor(Xpos, posY);
+
+ /* Draw one line of the picture */
+ ST7789H2_DrawRGBHLine(Xpos, posY, Xsize, (pdata + (nb_line * Xsize * 2)));
+ nb_line++;
+ }
+}
+
+
+/******************************************************************************
+ Static Functions
+*******************************************************************************/
+
+/**
+ * @brief Read pixel from LCD RAM in RGB888 format
+ * @param Xpos: specifies the X position.
+ * @param Ypos: specifies the Y position.
+ * @retval Each RGB pixel color components in a structure
+ */
+static ST7789H2_Rgb888 ST7789H2_ReadPixel_rgb888(uint16_t Xpos, uint16_t Ypos)
+{
+ ST7789H2_Rgb888 rgb888;
+ uint16_t rgb888_part1, rgb888_part2;
+
+ /* In LCD RAM, pixels are 24 bits packed and read with 16 bits access
+ * Here is the pixels components arrangement in memory :
+ * bits: 15 14 13 12 11 10 09 08 | 07 06 05 04 03 02 01 00
+ * address 0 : red pixel 0 X X | green pixel 0 X X
+ * address 1 : blue pixel 0 X X | red pixel 1 X X
+ * address 2 : green pixel 1 X X | blue pixel 1 X X
+ */
+
+ /* Set Cursor */
+ ST7789H2_SetCursor(Xpos, Ypos);
+ /* Prepare to read LCD RAM */
+ ST7789H2_WriteReg(ST7789H2_READ_RAM, (uint8_t*)NULL, 0); /* RAM read data command */
+ /* Dummy read */
+ LCD_IO_ReadData();
+ /* Read first part of the RGB888 data */
+ rgb888_part1 = LCD_IO_ReadData();
+ /* Read first part of the RGB888 data */
+ rgb888_part2 = LCD_IO_ReadData();
+
+ /* red component */
+ rgb888.red = (rgb888_part1 & 0xFC00) >> 8;
+ /* green component */
+ rgb888.green = (rgb888_part1 & 0x00FC) >> 0;
+ /* blue component */
+ rgb888.blue = (rgb888_part2 & 0xFC00) >> 8;
+
+ return rgb888;
+}
+
+
+/**
+ * @brief Displays a single picture line.
+ * @param pdata: picture address.
+ * @param Xpos: Image X position in the LCD
+ * @param Ypos: Image Y position in the LCD
+ * @param Xsize: Image X size in the LCD
+ * @retval None
+ */
+static void ST7789H2_DrawRGBHLine(uint16_t Xpos, uint16_t Ypos, uint16_t Xsize, uint8_t *pdata)
+{
+ uint32_t i = 0;
+ uint32_t posX;
+ uint16_t *rgb565 = (uint16_t*)pdata;
+
+ /* Prepare to write to LCD RAM */
+ ST7789H2_WriteReg(ST7789H2_WRITE_RAM, (uint8_t*)NULL, 0); /* RAM write data command */
+
+ for (posX = Xpos; posX < (Xsize + Xpos); posX++)
+ {
+ if ((posX >= WindowsXstart) && (Ypos >= WindowsYstart) && /* Check we are in the defined window */
+ (posX <= WindowsXend) && (Ypos <= WindowsYend))
+ {
+ if (posX != (Xsize + Xpos)) /* When writing last pixel when size is odd, the third part is not written */
+ {
+ LCD_IO_WriteData(rgb565[i]);
+ }
+ i++;
+ }
+ }
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/st7789h2/st7789h2.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,188 @@
+/**
+ ******************************************************************************
+ * @file st7789h2.h
+ * @author MCD Application Team
+ * @version V1.1.1
+ * @date 29-December-2016
+ * @brief This file contains all the functions prototypes for the st7789h2.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 __ST7789H2_H
+#define __ST7789H2_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include <stdio.h>
+#include "../Common/lcd.h"
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup Components
+ * @{
+ */
+
+/** @addtogroup ST7789H2
+ * @{
+ */
+
+/** @defgroup ST7789H2_Exported_Types ST7789H2 Exported Types
+ * @{
+ */
+/**
+ * @}
+ */
+
+/** @defgroup ST7789H2_Exported_Constants ST7789H2 Exported Constants
+ * @{
+ */
+/**
+ * @brief ST7789H2 ID
+ */
+#define ST7789H2_ID 0x85
+
+/**
+ * @brief ST7789H2 Size
+ */
+#define ST7789H2_LCD_PIXEL_WIDTH ((uint16_t)240)
+#define ST7789H2_LCD_PIXEL_HEIGHT ((uint16_t)240)
+
+/**
+ * @brief LCD_OrientationTypeDef
+ * Possible values of Display Orientation
+ */
+#define ST7789H2_ORIENTATION_PORTRAIT ((uint32_t)0x00) /* Portrait orientation choice of LCD screen */
+#define ST7789H2_ORIENTATION_LANDSCAPE ((uint32_t)0x01) /* Landscape orientation choice of LCD screen */
+#define ST7789H2_ORIENTATION_LANDSCAPE_ROT180 ((uint32_t)0x02) /* Landscape rotated 180° orientation choice of LCD screen */
+
+/**
+ * @brief ST7789H2 Registers
+ */
+#define ST7789H2_LCD_ID 0x04
+#define ST7789H2_SLEEP_IN 0x10
+#define ST7789H2_SLEEP_OUT 0x11
+#define ST7789H2_PARTIAL_DISPLAY 0x12
+#define ST7789H2_DISPLAY_INVERSION 0x21
+#define ST7789H2_DISPLAY_ON 0x29
+#define ST7789H2_WRITE_RAM 0x2C
+#define ST7789H2_READ_RAM 0x2E
+#define ST7789H2_CASET 0x2A
+#define ST7789H2_RASET 0x2B
+#define ST7789H2_VSCRDEF 0x33 /* Vertical Scroll Definition */
+#define ST7789H2_VSCSAD 0x37 /* Vertical Scroll Start Address of RAM */
+#define ST7789H2_TEARING_EFFECT 0x35
+#define ST7789H2_NORMAL_DISPLAY 0x36
+#define ST7789H2_IDLE_MODE_OFF 0x38
+#define ST7789H2_IDLE_MODE_ON 0x39
+#define ST7789H2_COLOR_MODE 0x3A
+#define ST7789H2_PORCH_CTRL 0xB2
+#define ST7789H2_GATE_CTRL 0xB7
+#define ST7789H2_VCOM_SET 0xBB
+#define ST7789H2_DISPLAY_OFF 0xBD
+#define ST7789H2_LCM_CTRL 0xC0
+#define ST7789H2_VDV_VRH_EN 0xC2
+#define ST7789H2_VDV_SET 0xC4
+#define ST7789H2_VCOMH_OFFSET_SET 0xC5
+#define ST7789H2_FR_CTRL 0xC6
+#define ST7789H2_POWER_CTRL 0xD0
+#define ST7789H2_PV_GAMMA_CTRL 0xE0
+#define ST7789H2_NV_GAMMA_CTRL 0xE1
+
+/**
+ * @}
+ */
+
+/** @defgroup ST7789H2_Exported_Functions ST7789H2 Exported Functions
+ * @{
+ */
+void ST7789H2_Init(void);
+void ST7789H2_SetOrientation(uint32_t orientation);
+uint16_t ST7789H2_ReadID(void);
+void ST7789H2_WriteReg(uint8_t Command, uint8_t *Parameters, uint8_t NbParameters);
+uint8_t ST7789H2_ReadReg(uint8_t Command);
+
+void ST7789H2_DisplayOn(void);
+void ST7789H2_DisplayOff(void);
+void ST7789H2_SetCursor(uint16_t Xpos, uint16_t Ypos);
+void ST7789H2_WritePixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGBCode);
+uint16_t ST7789H2_ReadPixel(uint16_t Xpos, uint16_t Ypos);
+
+void ST7789H2_DrawHLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length);
+void ST7789H2_DrawVLine(uint16_t RGBCode, uint16_t Xpos, uint16_t Ypos, uint16_t Length);
+void ST7789H2_DrawBitmap(uint16_t Xpos, uint16_t Ypos, uint8_t *pbmp);
+void ST7789H2_DrawRGBImage(uint16_t Xpos, uint16_t Ypos, uint16_t Xsize, uint16_t Ysize, uint8_t *pdata);
+
+void ST7789H2_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);
+
+
+uint16_t ST7789H2_GetLcdPixelWidth(void);
+uint16_t ST7789H2_GetLcdPixelHeight(void);
+
+/* LCD driver structure */
+extern LCD_DrvTypeDef ST7789H2_drv;
+
+/* LCD IO functions */
+extern void LCD_IO_Init(void);
+extern void LCD_IO_WriteMultipleData(uint16_t *pData, uint32_t Size);
+extern void LCD_IO_WriteReg(uint8_t Reg);
+extern void LCD_IO_WriteData(uint16_t RegValue);
+extern uint16_t LCD_IO_ReadData(void);
+extern void LCD_IO_Delay(uint32_t delay);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __ST7789H2_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/wm8994/wm8994.c Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,1041 @@
+/**
+ ******************************************************************************
+ * @file wm8994.c
+ * @author MCD Application Team
+ * @version V2.1.0
+ * @date 22-February-2016
+ * @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;
+/**
+ * @}
+ */
+
+/** @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 */
+ {
+ /* 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(250);
+
+ /* 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, 0x0000);
+
+ /* 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, 0x0000);
+
+ /* 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, 0x0000);
+
+ /* Unmute the AIF1 Timeslot 1 DAC2 path L&R */
+ counter += CODEC_IO_Write(DeviceAddr, 0x422, 0x0000);
+ }
+ }
+ 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_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****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/Components/wm8994/wm8994.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,188 @@
+/**
+ ******************************************************************************
+ * @file wm8994.h
+ * @author MCD Application Team
+ * @version V2.1.0
+ * @date 22-February-2016
+ * @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****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/STM32F413H-Discovery/stm32f413h_discovery.c Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,923 @@
+/**
+ ******************************************************************************
+ * @file stm32f413h_discovery.c
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 27-January-2017
+ * @brief This file provides a set of firmware functions to manage LEDs,
+ * push-buttons and COM ports available on STM32F413H-DISCOVERY board
+ * (MB1209) from STMicroelectronics.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2017 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 "stm32f413h_discovery.h"
+
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY STM32F413H_DISCOVERY
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LOW_LEVEL STM32F413H-DISCOVERY LOW LEVEL
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LOW_LEVEL_Private_TypesDefinitions STM32F413H Discovery Low Level Private Typedef
+ * @{
+ */
+typedef struct
+{
+ __IO uint16_t REG;
+ __IO uint16_t RAM;
+}LCD_CONTROLLER_TypeDef;
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LOW_LEVEL_Private_Defines STM32F413H Discovery Low Level Private Def
+ * @{
+ */
+/**
+ * @brief STM32F413H DISCOVERY BSP Driver version number V1.0.0
+ */
+#define __STM32F413H_DISCOVERY_BSP_VERSION_MAIN (0x01) /*!< [31:24] main version */
+#define __STM32F413H_DISCOVERY_BSP_VERSION_SUB1 (0x00) /*!< [23:16] sub1 version */
+#define __STM32F413H_DISCOVERY_BSP_VERSION_SUB2 (0x00) /*!< [15:8] sub2 version */
+#define __STM32F413H_DISCOVERY_BSP_VERSION_RC (0x00) /*!< [7:0] release candidate */
+#define __STM32F413H_DISCOVERY_BSP_VERSION ((__STM32F413H_DISCOVERY_BSP_VERSION_MAIN << 24)\
+ |(__STM32F413H_DISCOVERY_BSP_VERSION_SUB1 << 16)\
+ |(__STM32F413H_DISCOVERY_BSP_VERSION_SUB2 << 8 )\
+ |(__STM32F413H_DISCOVERY_BSP_VERSION_RC))
+
+/* We use BANK3 as we use FMC_NE3 signal */
+#define FMC_BANK3_BASE ((uint32_t)(0x60000000 | 0x08000000))
+#define FMC_BANK3 ((LCD_CONTROLLER_TypeDef *) FMC_BANK3_BASE)
+
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LOW_LEVEL_Private_Variables STM32F413H Discovery Low Level Variables
+ * @{
+ */
+
+const uint32_t GPIO_PIN[LEDn] = {LED3_PIN,
+ LED4_PIN};
+
+
+GPIO_TypeDef* GPIO_PORT[LEDn] = {LED3_GPIO_PORT,
+ LED4_GPIO_PORT};
+
+
+GPIO_TypeDef* BUTTON_PORT[BUTTONn] = {WAKEUP_BUTTON_GPIO_PORT};
+
+const uint16_t BUTTON_PIN[BUTTONn] = {WAKEUP_BUTTON_PIN};
+
+const uint16_t BUTTON_IRQn[BUTTONn] = {WAKEUP_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 FMPI2C_HandleTypeDef hI2cAudioHandler;
+
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LOW_LEVEL_Private_FunctionPrototypes STM32F413H Discovery Low Level Private Prototypes
+ * @{
+ */
+static void FMPI2Cx_Init(FMPI2C_HandleTypeDef *i2c_handler);
+static void FMPI2Cx_DeInit(FMPI2C_HandleTypeDef *i2c_handler);
+
+static HAL_StatusTypeDef FMPI2Cx_ReadMultiple(FMPI2C_HandleTypeDef *fmpi2c_handler, uint8_t Addr, uint16_t Reg, uint16_t MemAddSize, uint8_t *Buffer, uint16_t Length);
+static HAL_StatusTypeDef FMPI2Cx_WriteMultiple(FMPI2C_HandleTypeDef *fmpi2c_handler, uint8_t Addr, uint16_t Reg, uint16_t MemAddSize, uint8_t *Buffer, uint16_t Length);
+static void FMPI2Cx_Error(FMPI2C_HandleTypeDef *fmpi2c_handler, uint8_t Addr);
+
+static void FMC_BANK3_WriteData(uint16_t Data);
+static void FMC_BANK3_WriteReg(uint8_t Reg);
+static uint16_t FMC_BANK3_ReadData(void);
+static void FMC_BANK3_Init(void);
+static void FMC_BANK3_MspInit(void);
+
+/* LCD IO functions */
+void LCD_IO_Init(void);
+void LCD_IO_WriteData(uint16_t RegValue);
+void LCD_IO_WriteReg(uint8_t Reg);
+void LCD_IO_WriteMultipleData(uint16_t *pData, uint32_t Size);
+uint16_t LCD_IO_ReadData(void);
+void LCD_IO_Delay(uint32_t Delay);
+
+/* 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 (TS) IO functions */
+void TS_IO_Init(void);
+void TS_IO_DeInit(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);
+uint16_t TS_IO_ReadMultiple(uint8_t Addr, uint8_t Reg, uint8_t *Buffer, uint16_t Length);
+void TS_IO_WriteMultiple(uint8_t Addr, uint8_t Reg, uint8_t *Buffer, uint16_t Length);
+void TS_IO_Delay(uint32_t Delay);
+
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LOW_LEVEL_Private_Functions STM32F413H Discovery Low Level Private Functions
+ * @{
+ */
+
+/**
+ * @brief This method returns the STM32F413H DISCOVERY BSP Driver revision
+ * @retval version: 0xXYZR (8bits for each decimal, R for RC)
+ */
+uint32_t BSP_GetVersion(void)
+{
+ return __STM32F413H_DISCOVERY_BSP_VERSION;
+}
+
+/**
+ * @brief Configures LEDs.
+ * @param Led: LED to be configured.
+ * This parameter can be one of the following values:
+ * @arg LED3
+ * @arg LED4
+ */
+void BSP_LED_Init(Led_TypeDef Led)
+{
+ GPIO_InitTypeDef gpio_init_structure;
+
+ LEDx_GPIO_CLK_ENABLE(Led);
+ /* 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_PORT[Led], &gpio_init_structure);
+}
+
+/**
+ * @brief DeInit LEDs.
+ * @param Led: LED to be configured.
+ * This parameter can be one of the following values:
+ * @arg LED3
+ * @arg LED4
+ */
+void BSP_LED_DeInit(Led_TypeDef Led)
+{
+ GPIO_InitTypeDef gpio_init_structure;
+
+ /* DeInit the GPIO_LED pin */
+ gpio_init_structure.Pin = GPIO_PIN[Led];
+
+ /* Turn off LED */
+ HAL_GPIO_WritePin(GPIO_PORT[Led], GPIO_PIN[Led], GPIO_PIN_RESET);
+ HAL_GPIO_DeInit(GPIO_PORT[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 LED3
+ * @arg LED4
+ */
+void BSP_LED_On(Led_TypeDef Led)
+{
+ HAL_GPIO_WritePin(GPIO_PORT[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 LED3
+ * @arg LED4
+ */
+void BSP_LED_Off(Led_TypeDef Led)
+{
+ HAL_GPIO_WritePin(GPIO_PORT[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 LED3
+ * @arg LED4
+ */
+void BSP_LED_Toggle(Led_TypeDef Led)
+{
+ HAL_GPIO_TogglePin(GPIO_PORT[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
+ * @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
+ */
+void BSP_PB_Init(Button_TypeDef Button, ButtonMode_TypeDef ButtonMode)
+{
+ GPIO_InitTypeDef gpio_init_structure;
+
+ /* Enable the BUTTON clock */
+ WAKEUP_BUTTON_GPIO_CLK_ENABLE();
+
+ 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_PULLDOWN;
+ 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_PULLDOWN;
+ gpio_init_structure.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+
+ 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
+ * @note PB DeInit does not disable the GPIO clock
+ */
+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
+ * @retval The Button GPIO pin value (GPIO_PIN_RESET = button pressed)
+ */
+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
+ * @param huart: Pointer to a UART_HandleTypeDef structure that contains the
+ * configuration information for the specified USART peripheral.
+ */
+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_FREQ_HIGH;
+ 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
+ * @param huart: Pointer to a UART_HandleTypeDef structure that contains the
+ * configuration information for the specified USART peripheral.
+ */
+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, FMC clock and DMA clock can be shut down in the application
+ by surcharging this __weak function */
+}
+
+
+/*******************************************************************************
+ BUS OPERATIONS
+*******************************************************************************/
+
+/******************************* I2C Routines *********************************/
+/**
+ * @brief Initializes FMPI2C MSP.
+ * @param fmpi2c_handler : FMPI2C handler
+ */
+static void FMPI2Cx_MspInit(FMPI2C_HandleTypeDef *fmpi2c_handler)
+{
+ GPIO_InitTypeDef gpio_init_structure;
+
+ /* AUDIO FMPI2C 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;
+ gpio_init_structure.Alternate = DISCOVERY_AUDIO_I2Cx_SCL_SDA_AF;
+ 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, 0x00);
+ 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, 0x00);
+ HAL_NVIC_EnableIRQ(DISCOVERY_AUDIO_I2Cx_ER_IRQn);
+}
+
+/**
+ * @brief Initializes FMPI2C HAL.
+ * @param fmpi2c_handler : FMPI2C handler
+ */
+static void FMPI2Cx_Init(FMPI2C_HandleTypeDef *fmpi2c_handler)
+{
+ if(HAL_FMPI2C_GetState(fmpi2c_handler) == HAL_FMPI2C_STATE_RESET)
+ {
+ /* Audio FMPI2C configuration */
+ fmpi2c_handler->Instance = DISCOVERY_AUDIO_I2Cx;
+ fmpi2c_handler->Init.Timing = DISCOVERY_I2Cx_TIMING;
+ fmpi2c_handler->Init.OwnAddress1 = 0;
+ fmpi2c_handler->Init.AddressingMode = FMPI2C_ADDRESSINGMODE_7BIT;
+ fmpi2c_handler->Init.DualAddressMode = FMPI2C_DUALADDRESS_DISABLE;
+ fmpi2c_handler->Init.OwnAddress2 = 0;
+ fmpi2c_handler->Init.OwnAddress2Masks = FMPI2C_OA2_NOMASK;
+ fmpi2c_handler->Init.GeneralCallMode = FMPI2C_GENERALCALL_DISABLE;
+ fmpi2c_handler->Init.NoStretchMode = FMPI2C_NOSTRETCH_DISABLE;
+ /* Init the FMPI2C */
+ FMPI2Cx_MspInit(fmpi2c_handler);
+ HAL_FMPI2C_Init(fmpi2c_handler);
+ }
+}
+
+/**
+ * @brief Reads multiple data.
+ * @param fmpi2c_handler : FMPI2C 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 FMPI2Cx_ReadMultiple(FMPI2C_HandleTypeDef *fmpi2c_handler,
+ uint8_t Addr,
+ uint16_t Reg,
+ uint16_t MemAddress,
+ uint8_t *Buffer,
+ uint16_t Length)
+{
+ HAL_StatusTypeDef status = HAL_OK;
+
+ status = HAL_FMPI2C_Mem_Read(fmpi2c_handler, Addr, (uint16_t)Reg, MemAddress, Buffer, Length, 1000);
+
+ /* Check the communication status */
+ if(status != HAL_OK)
+ {
+ /* FMPI2C error occurred */
+ FMPI2Cx_Error(fmpi2c_handler, Addr);
+ }
+ return status;
+}
+
+/**
+ * @brief Writes a value in a register of the device through BUS in using DMA mode.
+ * @param fmpi2c_handler : FMPI2C 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 FMPI2Cx_WriteMultiple(FMPI2C_HandleTypeDef *fmpi2c_handler,
+ uint8_t Addr,
+ uint16_t Reg,
+ uint16_t MemAddress,
+ uint8_t *Buffer,
+ uint16_t Length)
+{
+ HAL_StatusTypeDef status = HAL_OK;
+
+ status = HAL_FMPI2C_Mem_Write(fmpi2c_handler, Addr, (uint16_t)Reg, MemAddress, Buffer, Length, 1000);
+
+ /* Check the communication status */
+ if(status != HAL_OK)
+ {
+ /* Re-Initialize the FMPI2C Bus */
+ FMPI2Cx_Error(fmpi2c_handler, Addr);
+ }
+ return status;
+}
+
+/**
+ * @brief Manages error callback by re-initializing I2C.
+ * @param fmpi2c_handler : FMPI2C handler
+ * @param Addr: I2C Address
+ * @retval None
+ */
+static void FMPI2Cx_Error(FMPI2C_HandleTypeDef *fmpi2c_handler, uint8_t Addr)
+{
+ /* De-initialize the FMPI2C communication bus */
+ HAL_FMPI2C_DeInit(fmpi2c_handler);
+
+ /* Re-Initialize the FMPI2C communication bus */
+ FMPI2Cx_Init(fmpi2c_handler);
+}
+
+/**
+ * @brief Deinitializes FMPI2C interface
+ * @param fmpi2c_handler : FMPI2C handler
+ */
+ static void FMPI2Cx_DeInit(FMPI2C_HandleTypeDef *fmpi2c_handler)
+{
+ /* Audio and LCD I2C configuration */
+ fmpi2c_handler->Instance = DISCOVERY_AUDIO_I2Cx;
+ /* Disable FMPI2C block */
+ __HAL_FMPI2C_DISABLE(fmpi2c_handler);
+
+ /* DeInit the FMPI2C */
+ HAL_FMPI2C_DeInit(fmpi2c_handler);
+}
+/*************************** FMC Routines ************************************/
+/**
+ * @brief Initializes FMC_BANK3 MSP.
+ */
+static void FMC_BANK3_MspInit(void)
+{
+ GPIO_InitTypeDef gpio_init_structure;
+
+ /* Enable FSMC clock */
+ __HAL_RCC_FSMC_CLK_ENABLE();
+
+ /* Enable GPIOs clock */
+ __HAL_RCC_GPIOD_CLK_ENABLE();
+ __HAL_RCC_GPIOE_CLK_ENABLE();
+ __HAL_RCC_GPIOF_CLK_ENABLE();
+ __HAL_RCC_GPIOG_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_FREQ_VERY_HIGH;
+ gpio_init_structure.Alternate = GPIO_AF12_FSMC;
+
+ /* GPIOD configuration: GPIO_PIN_7 is FMC_NE1 , GPIO_PIN_11 ans GPIO_PIN_12 are PSRAM_A16 and PSRAM_A17 */
+ gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_8 |\
+ GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15 | GPIO_PIN_7|\
+ GPIO_PIN_11 | GPIO_PIN_12;
+
+ HAL_GPIO_Init(GPIOD, &gpio_init_structure);
+
+ /* GPIOE configuration */
+ gpio_init_structure.Pin = 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_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_2 | GPIO_PIN_3 | GPIO_PIN_4 |\
+ GPIO_PIN_5 | GPIO_PIN_10 ;
+ HAL_GPIO_Init(GPIOG, &gpio_init_structure);
+}
+
+/**
+ * @brief Initializes LCD IOs.
+ */
+static void FMC_BANK3_Init(void)
+{
+ SRAM_HandleTypeDef hsram;
+ FSMC_NORSRAM_TimingTypeDef sram_timing;
+
+ /* Initialize the SRAM controller */
+ FMC_BANK3_MspInit();
+
+ /*** Configure the SRAM Bank 1 ***/
+ /* Configure IPs */
+ hsram.Instance = FSMC_NORSRAM_DEVICE;
+ hsram.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
+
+ /* Timing config */
+ sram_timing.AddressSetupTime = 3;
+ sram_timing.AddressHoldTime = 1;
+ sram_timing.DataSetupTime = 4;
+ sram_timing.BusTurnAroundDuration = 1;
+ sram_timing.CLKDivision = 2;
+ sram_timing.DataLatency = 2;
+ sram_timing.AccessMode = FSMC_ACCESS_MODE_A;
+
+ hsram.Init.NSBank = FSMC_NORSRAM_BANK3;
+ hsram.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
+ hsram.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
+ hsram.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16;
+ hsram.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE;
+ hsram.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
+ hsram.Init.WrapMode = FSMC_WRAP_MODE_DISABLE;
+ hsram.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
+ hsram.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
+ hsram.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
+ hsram.Init.ExtendedMode = FSMC_EXTENDED_MODE_ENABLE;
+ hsram.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
+ hsram.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE;
+ hsram.Init.WriteFifo = FSMC_WRITE_FIFO_DISABLE;
+ hsram.Init.PageSize = FSMC_PAGE_SIZE_NONE;
+ hsram.Init.ContinuousClock = FSMC_CONTINUOUS_CLOCK_SYNC_ONLY;
+
+ HAL_SRAM_Init(&hsram, &sram_timing, &sram_timing);
+}
+
+/**
+ * @brief Writes register value.
+ * @param Data: Data to be written
+ */
+static void FMC_BANK3_WriteData(uint16_t Data)
+{
+ /* Write 16-bit Reg */
+ FMC_BANK3->RAM = Data;
+ __DSB();
+}
+
+/**
+ * @brief Writes register address.
+ * @param Reg: Register to be written
+ */
+static void FMC_BANK3_WriteReg(uint8_t Reg)
+{
+ /* Write 16-bit Index, then write register */
+ FMC_BANK3->REG = Reg;
+ __DSB();
+}
+
+/**
+ * @brief Reads register value.
+ * @retval Read value
+ */
+static uint16_t FMC_BANK3_ReadData(void)
+{
+ return FMC_BANK3->RAM;
+}
+
+/*******************************************************************************
+ LINK OPERATIONS
+*******************************************************************************/
+
+/********************************* LINK LCD ***********************************/
+/**
+ * @brief Initializes LCD low level.
+ */
+void LCD_IO_Init(void)
+{
+ FMC_BANK3_Init();
+}
+
+/**
+ * @brief Writes data on LCD data register.
+ * @param RegValue: Data to be written
+ */
+void LCD_IO_WriteData(uint16_t RegValue)
+{
+ /* Write 16-bit Reg */
+ FMC_BANK3_WriteData(RegValue);
+}
+
+/**
+ * @brief Writes several data on LCD data register.
+ * @param pData: pointer on data to be written
+ * @param Size: data amount in 16bits short unit
+ */
+void LCD_IO_WriteMultipleData(uint16_t *pData, uint32_t Size)
+{
+ uint32_t i;
+
+ for (i = 0; i < Size; i++)
+ {
+ FMC_BANK3_WriteData(pData[i]);
+ }
+}
+
+/**
+ * @brief Writes register on LCD register.
+ * @param Reg: Register to be written
+ */
+void LCD_IO_WriteReg(uint8_t Reg)
+{
+ /* Write 16-bit Index, then Write Reg */
+ FMC_BANK3_WriteReg(Reg);
+}
+
+/**
+ * @brief Reads data from LCD data register.
+ * @retval Read data.
+ */
+uint16_t LCD_IO_ReadData(void)
+{
+ return FMC_BANK3_ReadData();
+}
+
+/**
+ * @brief LCD delay
+ * @param Delay: Delay in ms
+ */
+void LCD_IO_Delay(uint32_t Delay)
+{
+ HAL_Delay(Delay);
+}
+
+/********************************* LINK AUDIO *********************************/
+
+/**
+ * @brief Initializes Audio low level.
+ */
+void AUDIO_IO_Init(void)
+{
+ FMPI2Cx_Init(&hI2cAudioHandler);
+}
+
+/**
+ * @brief Deinitializes Audio low level.
+ */
+void AUDIO_IO_DeInit(void)
+{
+ FMPI2Cx_DeInit(&hI2cAudioHandler);
+}
+
+/**
+ * @brief Writes a single data.
+ * @param Addr: I2C address
+ * @param Reg: Reg address
+ * @param Value: Data to be written
+ */
+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);
+
+ FMPI2Cx_WriteMultiple(&hI2cAudioHandler, Addr, Reg, FMPI2C_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;
+
+ FMPI2Cx_ReadMultiple(&hI2cAudioHandler, Addr, Reg, FMPI2C_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 Reads multiple data with I2C communication
+ * channel from TouchScreen.
+ * @param Addr: I2C address
+ * @param Reg: Register address
+ * @param Buffer: Pointer to data buffer
+ * @param Length: Length of the data
+ * @retval Number of read data
+ */
+uint16_t TS_IO_ReadMultiple(uint8_t Addr, uint8_t Reg, uint8_t *Buffer, uint16_t Length)
+{
+ return FMPI2Cx_ReadMultiple(&hI2cAudioHandler, Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT, Buffer, Length);
+}
+
+/**
+ * @brief Writes multiple data with I2C communication
+ * channel from MCU to TouchScreen.
+ * @param Addr: I2C address
+ * @param Reg: Register address
+ * @param Buffer: Pointer to data buffer
+ * @param Length: Length of the data
+ */
+void TS_IO_WriteMultiple(uint8_t Addr, uint8_t Reg, uint8_t *Buffer, uint16_t Length)
+{
+ FMPI2Cx_WriteMultiple(&hI2cAudioHandler, Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT, Buffer, Length);
+}
+
+/**
+ * @brief AUDIO Codec delay
+ * @param Delay: Delay in ms
+ */
+void AUDIO_IO_Delay(uint32_t Delay)
+{
+ HAL_Delay(Delay);
+}
+
+/******************************** LINK TS (TouchScreen) *****************************/
+
+/**
+ * @brief Initializes TS low level.
+ */
+void TS_IO_Init(void)
+{
+ GPIO_InitTypeDef gpio_init_structure;
+
+ TS_RESET_GPIO_CLK_ENABLE();
+
+ /* Configure Button pin as input */
+ gpio_init_structure.Pin = TS_RESET_PIN;
+ gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;
+ gpio_init_structure.Pull = GPIO_NOPULL;
+ gpio_init_structure.Speed = GPIO_SPEED_FREQ_LOW;
+ HAL_GPIO_Init(TS_RESET_GPIO_PORT, &gpio_init_structure);
+
+ FMPI2Cx_Init(&hI2cAudioHandler);
+}
+
+/**
+ * @brief Deinitializes TS low level.
+ */
+void TS_IO_DeInit(void)
+{
+ FMPI2Cx_DeInit(&hI2cAudioHandler);
+}
+
+/**
+ * @brief Reads a single data.
+ * @param Addr: I2C address
+ * @param Reg: Register address
+ * @retval Data to be read
+ */
+uint8_t TS_IO_Read(uint8_t Addr, uint8_t Reg)
+{
+ uint8_t read_value = 0;
+
+ FMPI2Cx_ReadMultiple(&hI2cAudioHandler, Addr, Reg, I2C_MEMADD_SIZE_8BIT, (uint8_t*)&read_value, 1);
+
+ return read_value;
+}
+
+/**
+ * @brief Writes a single data.
+ * @param Addr: I2C address
+ * @param Reg: Reg address
+ * @param Value: Data to be written
+ */
+void TS_IO_Write(uint8_t Addr, uint8_t Reg, uint8_t Value)
+{
+ FMPI2Cx_WriteMultiple(&hI2cAudioHandler, Addr, (uint16_t)Reg, I2C_MEMADD_SIZE_8BIT,(uint8_t*)&Value, 1);
+}
+
+/**
+ * @brief Delay function used in TouchScreen low level driver.
+ * @param Delay: Delay in ms
+ */
+void TS_IO_Delay(uint32_t Delay)
+{
+ HAL_Delay(Delay);
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/STM32F413H-Discovery/stm32f413h_discovery.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,304 @@
+/**
+ ******************************************************************************
+ * @file stm32f413h_discovery.h
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 27-January-2017
+ * @brief This file contains definitions for STM32F413H_DISCOVERY's LEDs,
+ * push-buttons and COM ports hardware resources.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2017 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 __STM32F413H_DISCOVERY_H
+#define __STM32F413H_DISCOVERY_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f4xx_hal.h"
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY_LOW_LEVEL
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LOW_LEVEL_Exported_Types STM32F413H DISCOVERY Low Level Exported Types
+ * @{
+ */
+typedef enum
+{
+LED3 = 0,
+LED_GREEN = LED3,
+LED4 = 1,
+LED_RED = LED4,
+}Led_TypeDef;
+
+
+typedef enum
+{
+ BUTTON_WAKEUP = 0
+}Button_TypeDef;
+
+typedef enum
+{
+ BUTTON_MODE_GPIO = 0,
+ BUTTON_MODE_EXTI = 1
+}ButtonMode_TypeDef;
+
+typedef enum
+{
+ COM1 = 0,
+}COM_TypeDef;
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LOW_LEVEL_Exported_Constants STM32F413H DISCOVERY Low Level Exported Constants
+ * @{
+ */
+
+/**
+ * @brief Define for STM32F413H_DISCOVERY board
+ */
+#if !defined (USE_STM32F413H_DISCOVERY)
+ #define USE_STM32F413H_DISCOVERY
+#endif
+
+/** @addtogroup STM32F413H_DISCOVERY_LOW_LEVEL_LED STM32F413H DISCOVERY Low Level Led
+ * @{
+ */
+#define LEDn ((uint8_t)2)
+
+#define LED4_GPIO_PORT GPIOE
+#define LED4_GPIO_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE()
+#define LED4_GPIO_CLK_DISABLE() __HAL_RCC_GPIOE_CLK_DISABLE()
+
+#define LED3_GPIO_PORT GPIOC
+#define LED3_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
+#define LED3_GPIO_CLK_DISABLE() __HAL_RCC_GPIOC_CLK_DISABLE()
+
+#define LED4_PIN GPIO_PIN_3
+#define LED3_PIN GPIO_PIN_5
+
+#define LEDx_GPIO_CLK_ENABLE(__INDEX__) do{if((__INDEX__) == 0) LED3_GPIO_CLK_ENABLE(); else \
+ if((__INDEX__) == 1) LED4_GPIO_CLK_ENABLE(); \
+ }while(0)
+
+#define LEDx_GPIO_CLK_DISABLE(__INDEX__) do{if((__INDEX__) == 0) LED3_GPIO_CLK_DISABLE(); else \
+ if((__INDEX__) == 1) LED4_GPIO_CLK_DISABLE(); \
+ }while(0)
+/**
+ * @}
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY_LOW_LEVEL_BUTTON STM32F413H DISCOVERY Low Level Button
+ * @{
+ */
+/* Only one User/Wakeup button */
+#define BUTTONn ((uint8_t)1)
+
+/**
+ * @brief Wakeup push-button
+ */
+#define WAKEUP_BUTTON_PIN GPIO_PIN_0
+#define WAKEUP_BUTTON_GPIO_PORT GPIOA
+#define WAKEUP_BUTTON_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
+#define WAKEUP_BUTTON_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE()
+#define WAKEUP_BUTTON_EXTI_IRQn EXTI0_IRQn
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY_LOW_LEVEL_SIGNAL
+ * @{
+ */
+/**
+ * @brief SD-detect signal
+ */
+#define SD_DETECT_PIN GPIO_PIN_11
+#define SD_DETECT_GPIO_PORT GPIOF
+#define SD_DETECT_GPIO_CLK_ENABLE() __HAL_RCC_GPIOF_CLK_ENABLE()
+#define SD_DETECT_GPIO_CLK_DISABLE() __HAL_RCC_GPIOF_CLK_DISABLE()
+#define SD_DETECT_EXTI_IRQn EXTI15_10_IRQn
+
+
+/**
+ * @brief TS INT pin
+ */
+#define TS_INT_PIN GPIO_PIN_1
+#define TS_INT_GPIO_PORT GPIOC
+#define TS_INT_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
+#define TS_INT_GPIO_CLK_DISABLE() __HAL_RCC_GPIOC_CLK_DISABLE()
+#define TS_INT_EXTI_IRQn EXTI1_IRQn
+
+/**
+ * @brief TS RST pin
+ */
+#define TS_RESET_PIN GPIO_PIN_13
+#define TS_RESET_GPIO_PORT GPIOB
+#define TS_RESET_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
+#define TS_RESET_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE()
+#define TS_RESET_EXTI_IRQn EXTI15_10_IRQn
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY_LOW_LEVEL_COM STM32F413H DISCOVERY Low Level COM
+ * @{
+ */
+#define COMn ((uint8_t)1)
+
+/**
+ * @brief Definition for COM port1, connected to USART6
+ */
+#define DISCOVERY_COM1 USART6
+#define DISCOVERY_COM1_CLK_ENABLE() __HAL_RCC_USART6_CLK_ENABLE()
+#define DISCOVERY_COM1_CLK_DISABLE() __HAL_RCC_USART6_CLK_DISABLE()
+
+#define DISCOVERY_COM1_TX_PIN GPIO_PIN_14
+#define DISCOVERY_COM1_TX_GPIO_PORT GPIOG
+#define DISCOVERY_COM1_TX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOG_CLK_ENABLE()
+#define DISCOVERY_COM1_TX_GPIO_CLK_DISABLE() __HAL_RCC_GPIOG_CLK_DISABLE()
+#define DISCOVERY_COM1_TX_AF GPIO_AF8_USART6
+
+#define DISCOVERY_COM1_RX_PIN GPIO_PIN_9
+#define DISCOVERY_COM1_RX_GPIO_PORT GPIOG
+#define DISCOVERY_COM1_RX_GPIO_CLK_ENABLE() __HAL_RCC_GPIOG_CLK_ENABLE()
+#define DISCOVERY_COM1_RX_GPIO_CLK_DISABLE() __HAL_RCC_GPIOG_CLK_DISABLE()
+#define DISCOVERY_COM1_RX_AF GPIO_AF8_USART6
+
+#define DISCOVERY_COM1_IRQn USART6_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 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)
+
+/* User can use this section to tailor I2Cx/I2Cx instance used and associated
+ resources */
+/* Definition for AUDIO I2Cx resources */
+#define DISCOVERY_AUDIO_I2Cx FMPI2C1
+#define DISCOVERY_AUDIO_I2Cx_CLK_ENABLE() __HAL_RCC_FMPI2C1_CLK_ENABLE()
+#define DISCOVERY_AUDIO_DMAx_CLK_ENABLE() __HAL_RCC_DMA1_CLK_ENABLE()
+#define DISCOVERY_AUDIO_I2Cx_SCL_SDA_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
+
+#define DISCOVERY_AUDIO_I2Cx_FORCE_RESET() __HAL_RCC_FMPI2C1_FORCE_RESET()
+#define DISCOVERY_AUDIO_I2Cx_RELEASE_RESET() __HAL_RCC_FMPI2C1_RELEASE_RESET()
+
+/* Definition for I2Cx Pins */
+#define DISCOVERY_AUDIO_I2Cx_SCL_PIN GPIO_PIN_6
+#define DISCOVERY_AUDIO_I2Cx_SCL_SDA_GPIO_PORT GPIOC
+#define DISCOVERY_AUDIO_I2Cx_SCL_SDA_AF GPIO_AF4_FMPI2C1
+#define DISCOVERY_AUDIO_I2Cx_SDA_PIN GPIO_PIN_7
+
+/* I2C interrupt requests */
+#define DISCOVERY_AUDIO_I2Cx_EV_IRQn FMPI2C1_EV_IRQn
+#define DISCOVERY_AUDIO_I2Cx_ER_IRQn FMPI2C1_ER_IRQn
+
+/* I2C clock speed configuration (in Hz)
+ WARNING:
+ Make sure that this define is not already declared in other files.
+ It can be used in parallel by other modules. */
+#ifndef DISCOVERY_I2C_SPEED
+ #define DISCOVERY_I2C_SPEED 100000
+#endif /* DISCOVERY_I2C_SPEED */
+
+#ifndef DISCOVERY_I2Cx_TIMING
+#define DISCOVERY_I2Cx_TIMING ((uint32_t)0x00901954)
+#endif /* DISCOVERY_I2Cx_TIMING */
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LOW_LEVEL_Exported_Functions STM32F413H 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 /* __STM32F413H_DISCOVERY_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/STM32F413H-Discovery/stm32f413h_discovery_audio.c Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,2094 @@
+/**
+ ******************************************************************************
+ * @file STM32f413h_discovery_audio.c
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 27-January-2017
+ * @brief This file provides the Audio driver for the STM32F413H-DISCOVERY board.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2017 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.
+ *
+ ******************************************************************************
+ */
+
+/*==============================================================================
+ User NOTES
+
+How To use this driver:
+-----------------------
+ + This driver supports STM32F4xx devices on STM32F413H-DISCOVERY boards.
+ + 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, I2S,
+ 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 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.
+ + Call the function BSP_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 STM32F413H_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, use the functions: BSP_AUDIO_OUT_SetVolume(),
+ AUDIO_OUT_SetFrequency(), 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 STM32F413H_discovery_audio.h file.
+
+
+Driver architecture:
+--------------------
+ + This driver provides the High Audio Layer: consists of the function API exported in the stm32f413h_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 stm32f413h_discovery_audio_codec.c file (I2Sx_Out_Init(), I2Sx_Out_DeInit(), I2Sx_In_Init() and I2Sx_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.
+==============================================================================*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f413h_discovery_audio.h"
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_AUDIO STM32F413H_DISCOVERY AUDIO
+ * @brief This file includes the low layer driver for wm8994 Audio Codec
+ * available on STM32F413H-DISCOVERY board(MB1209).
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_AUDIO_Private_Macros STM32F413H DISCOVERY Audio Private macros
+ * @{
+ */
+
+#define DFSDM_OVER_SAMPLING(__FREQUENCY__) \
+ (__FREQUENCY__ == AUDIO_FREQUENCY_8K) ? 256 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_11K) ? 256 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_16K) ? 128 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_22K) ? 128 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_32K) ? 64 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_44K) ? 64 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_48K) ? 32 : 25 \
+
+#define DFSDM_CLOCK_DIVIDER(__FREQUENCY__) \
+ (__FREQUENCY__ == AUDIO_FREQUENCY_8K) ? 24 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_11K) ? 48 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_16K) ? 24 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_22K) ? 48 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_32K) ? 24 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_44K) ? 48 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_48K) ? 32 : 72 \
+
+#define DFSDM_FILTER_ORDER(__FREQUENCY__) \
+ (__FREQUENCY__ == AUDIO_FREQUENCY_8K) ? DFSDM_FILTER_SINC3_ORDER \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_11K) ? DFSDM_FILTER_SINC3_ORDER \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_16K) ? DFSDM_FILTER_SINC3_ORDER \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_22K) ? DFSDM_FILTER_SINC3_ORDER \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_32K) ? DFSDM_FILTER_SINC4_ORDER \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_44K) ? DFSDM_FILTER_SINC4_ORDER \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_48K) ? DFSDM_FILTER_SINC4_ORDER : DFSDM_FILTER_SINC4_ORDER \
+
+#define DFSDM_MIC_BIT_SHIFT(__FREQUENCY__) \
+ (__FREQUENCY__ == AUDIO_FREQUENCY_8K) ? 5 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_11K) ? 4 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_16K) ? 2 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_22K) ? 2 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_32K) ? 5 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_44K) ? 6 \
+ : (__FREQUENCY__ == AUDIO_FREQUENCY_48K) ? 2 : 0 \
+
+/* Saturate the record PCM sample */
+#define SaturaLH(N, L, H) (((N)<(L))?(L):(((N)>(H))?(H):(N)))
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_AUDIO_Private_Variables STM32F413H DISCOVERY Audio Private Variables
+ * @{
+ */
+
+AUDIO_DrvTypeDef *audio_drv;
+I2S_HandleTypeDef haudio_i2s; /* for Audio_OUT and Audio_IN_analog mic */
+I2S_HandleTypeDef haudio_in_i2sext; /* for Analog mic with full duplex mode */
+AUDIOIN_ContextTypeDef hAudioIn;
+
+DFSDM_Channel_HandleTypeDef hAudioInDfsdmChannel[DFSDM_MIC_NUMBER]; /* 5 DFSDM channel handle used for all microphones */
+DFSDM_Filter_HandleTypeDef hAudioInDfsdmFilter[DFSDM_MIC_NUMBER]; /* 5 DFSDM filter handle */
+DMA_HandleTypeDef hDmaDfsdm[DFSDM_MIC_NUMBER]; /* 5 DMA handle used for DFSDM regular conversions */
+
+/* Buffers for right and left samples */
+int32_t *pScratchBuff[DEFAULT_AUDIO_IN_CHANNEL_NBR];
+int32_t ScratchSize;
+
+uint32_t DmaRecHalfBuffCplt[DFSDM_MIC_NUMBER] = {0};
+uint32_t DmaRecBuffCplt[DFSDM_MIC_NUMBER] = {0};
+
+/* Application Buffer Trigger */
+__IO uint32_t AppBuffTrigger = 0;
+__IO uint32_t AppBuffHalf = 0;
+__IO uint32_t MicBuff[DFSDM_MIC_NUMBER] = {0};
+__IO uint16_t AudioInVolume = DEFAULT_AUDIO_IN_VOLUME;
+
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_AUDIO_Private_Function_Prototypes STM32F413H DISCOVERY Audio Private Prototypes
+ * @{
+ */
+static void I2Sx_In_Init(uint32_t AudioFreq);
+static void I2Sx_In_DeInit(void);
+static void I2Sx_In_MspInit(void);
+static void I2Sx_In_MspDeInit(void);
+
+static void I2Sx_Out_Init(uint32_t AudioFreq);
+static void I2Sx_Out_DeInit(void);
+
+static uint8_t DFSDMx_DeInit(void);
+static void DFSDMx_ChannelMspInit(void);
+static void DFSDMx_ChannelMspDeInit(void);
+static void DFSDMx_FilterMspInit(void);
+static void DFSDMx_FilterMspDeInit(void);
+
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_AUDIO_out_Private_Functions STM32F413H DISCOVERY AUDIO OUT Private 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;
+ uint16_t buffer_fake[16] = {0x00};
+
+ I2Sx_Out_DeInit();
+ AUDIO_IO_DeInit();
+
+ /* PLL clock is set depending on the AudioFreq (44.1 kHz vs 48kHz groups) */
+ BSP_AUDIO_OUT_ClockConfig(&haudio_i2s, AudioFreq, NULL);
+
+ /* Configure the I2S peripheral */
+ haudio_i2s.Instance = AUDIO_OUT_I2Sx;
+ if(HAL_I2S_GetState(&haudio_i2s) == HAL_I2S_STATE_RESET)
+ {
+ /* Initialize the I2S Msp: this __weak function can be rewritten by the application */
+ BSP_AUDIO_OUT_MspInit(&haudio_i2s, NULL);
+ }
+ I2Sx_Out_Init(AudioFreq);
+
+ AUDIO_IO_Init();
+
+ /* 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)
+ {
+ /* Send fake I2S data in order to generate MCLK needed by WM8994 to set its registers
+ * MCLK is generated only when a data stream is sent on I2S */
+ HAL_I2S_Transmit_DMA(&haudio_i2s, buffer_fake, 16);
+ /* Initialize the codec internal registers */
+ audio_drv->Init(AUDIO_I2C_ADDRESS, OutputDevice, Volume, AudioFreq);
+ /* Stop sending fake I2S data */
+ HAL_I2S_DMAStop(&haudio_i2s);
+ }
+
+ 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 BYTES.
+ * @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_I2S_Transmit_DMA(&haudio_i2s, pBuffer, DMA_MAX(Size / AUDIODATA_SIZE));
+
+ return AUDIO_OK;
+ }
+}
+
+/**
+ * @brief Sends n-Bytes on the I2S interface.
+ * @param pData: pointer on data address
+ * @param Size: number of data to be written
+ */
+void BSP_AUDIO_OUT_ChangeBuffer(uint16_t *pData, uint16_t Size)
+{
+ HAL_I2S_Transmit_DMA(&haudio_i2s, 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 behavior).
+ * @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_I2S_DMAPause(&haudio_i2s);
+
+ /* 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 behavior).
+ * @retval AUDIO_OK if correct communication, else wrong communication
+ */
+uint8_t BSP_AUDIO_OUT_Resume(void)
+{
+ /* Call the Media layer pause/resume function */
+ /* DMA stream resumed before accessing WM8994 register as WM8994 needs the MCLK to be generated to access its registers
+ * MCLK is generated only when a data stream is sent on I2S */
+ HAL_I2S_DMAResume(&haudio_i2s);
+
+ /* Call the Audio Codec Pause/Resume function */
+ if(audio_drv->Resume(AUDIO_I2C_ADDRESS) != 0)
+ {
+ return AUDIO_ERROR;
+ }
+ else
+ {
+ /* 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_I2S_DMAStop(&haudio_i2s);
+
+ /* 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_i2s, AudioFreq, NULL);
+
+ /* Disable I2S peripheral to allow access to I2S internal registers */
+ __HAL_I2S_DISABLE(&haudio_i2s);
+
+ /* Update the I2S audio frequency configuration */
+ haudio_i2s.Init.AudioFreq = AudioFreq;
+ HAL_I2S_Init(&haudio_i2s);
+
+ /* Enable I2S peripheral to generate MCLK */
+ __HAL_I2S_ENABLE(&haudio_i2s);
+}
+
+/**
+ * @brief Deinit the audio peripherals.
+ */
+void BSP_AUDIO_OUT_DeInit(void)
+{
+ I2Sx_Out_DeInit();
+ /* DeInit the I2S MSP : this __weak function can be rewritten by the application */
+ BSP_AUDIO_OUT_MspDeInit(&haudio_i2s, NULL);
+}
+
+/**
+ * @brief Tx Transfer completed callbacks.
+ * @param hi2s: I2S handle
+ */
+void HAL_I2S_TxCpltCallback(I2S_HandleTypeDef *hi2s)
+{
+ /* Manage the remaining file size and new address offset: This function
+ should be coded by user (its prototype is already declared in STM32F413H_discovery_audio.h) */
+ BSP_AUDIO_OUT_TransferComplete_CallBack();
+}
+
+/**
+ * @brief Tx Half Transfer completed callbacks.
+ * @param hi2s: I2S handle
+ */
+void HAL_I2S_TxHalfCpltCallback(I2S_HandleTypeDef *hi2s)
+{
+ /* Manage the remaining file size and new address offset: This function
+ should be coded by user (its prototype is already declared in STM32F413H_discovery_audio.h) */
+ BSP_AUDIO_OUT_HalfTransfer_CallBack();
+}
+
+/**
+ * @brief I2S error callbacks.
+ * @param hi2s: I2S handle
+ */
+void HAL_I2S_ErrorCallback(I2S_HandleTypeDef *hi2s)
+{
+ BSP_AUDIO_OUT_Error_CallBack();
+}
+
+/**
+ * @brief Manages the DMA full Transfer complete event.
+ */
+__weak void BSP_AUDIO_OUT_TransferComplete_CallBack(void)
+{
+}
+
+/**
+ * @brief Manages the DMA Half Transfer complete event.
+ */
+__weak void BSP_AUDIO_OUT_HalfTransfer_CallBack(void)
+{
+}
+
+/**
+ * @brief Manages the DMA FIFO error event.
+ */
+__weak void BSP_AUDIO_OUT_Error_CallBack(void)
+{
+}
+
+/**
+ * @brief Initializes BSP_AUDIO_OUT MSP.
+ * @param hi2s: I2S handle
+ * @param Params : pointer on additional configuration parameters, can be NULL.
+ */
+__weak void BSP_AUDIO_OUT_MspInit(I2S_HandleTypeDef *hi2s, void *Params)
+{
+ static DMA_HandleTypeDef hdma_i2s_tx;
+ GPIO_InitTypeDef gpio_init_structure;
+
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Params);
+
+ /* Enable I2S clock */
+ AUDIO_OUT_I2Sx_CLK_ENABLE();
+
+ /* Enable MCK, SCK, WS, SD and CODEC_INT GPIO clock */
+ AUDIO_OUT_I2Sx_MCK_GPIO_CLK_ENABLE();
+ AUDIO_OUT_I2Sx_SCK_GPIO_CLK_ENABLE();
+ AUDIO_OUT_I2Sx_SD_GPIO_CLK_ENABLE();
+ AUDIO_OUT_I2Sx_WS_GPIO_CLK_ENABLE();
+
+ /* CODEC_I2S pins configuration: MCK, SCK, WS and SD pins */
+ gpio_init_structure.Pin = AUDIO_OUT_I2Sx_MCK_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_OUT_I2Sx_MCK_AF;
+ HAL_GPIO_Init(AUDIO_OUT_I2Sx_MCK_GPIO_PORT, &gpio_init_structure);
+
+ gpio_init_structure.Pin = AUDIO_OUT_I2Sx_SCK_PIN;
+ gpio_init_structure.Alternate = AUDIO_OUT_I2Sx_SCK_AF;
+ HAL_GPIO_Init(AUDIO_OUT_I2Sx_SCK_GPIO_PORT, &gpio_init_structure);
+
+ gpio_init_structure.Pin = AUDIO_OUT_I2Sx_WS_PIN;
+ gpio_init_structure.Alternate = AUDIO_OUT_I2Sx_WS_AF;
+ HAL_GPIO_Init(AUDIO_OUT_I2Sx_WS_GPIO_PORT, &gpio_init_structure);
+
+ gpio_init_structure.Pin = AUDIO_OUT_I2Sx_SD_PIN;
+ gpio_init_structure.Alternate = AUDIO_OUT_I2Sx_SD_AF;
+ HAL_GPIO_Init(AUDIO_OUT_I2Sx_SD_GPIO_PORT, &gpio_init_structure);
+
+ /* Enable the DMA clock */
+ AUDIO_OUT_I2Sx_DMAx_CLK_ENABLE();
+
+ if(hi2s->Instance == AUDIO_OUT_I2Sx)
+ {
+ /* Configure the hdma_i2s_rx handle parameters */
+ hdma_i2s_tx.Init.Channel = AUDIO_OUT_I2Sx_DMAx_CHANNEL;
+ hdma_i2s_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
+ hdma_i2s_tx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_i2s_tx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_i2s_tx.Init.PeriphDataAlignment = AUDIO_OUT_I2Sx_DMAx_PERIPH_DATA_SIZE;
+ hdma_i2s_tx.Init.MemDataAlignment = AUDIO_OUT_I2Sx_DMAx_MEM_DATA_SIZE;
+ hdma_i2s_tx.Init.Mode = DMA_CIRCULAR;
+ hdma_i2s_tx.Init.Priority = DMA_PRIORITY_HIGH;
+ hdma_i2s_tx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
+ hdma_i2s_tx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
+ hdma_i2s_tx.Init.MemBurst = DMA_MBURST_SINGLE;
+ hdma_i2s_tx.Init.PeriphBurst = DMA_MBURST_SINGLE;
+
+ hdma_i2s_tx.Instance = AUDIO_OUT_I2Sx_DMAx_STREAM;
+
+ /* Associate the DMA handle */
+ __HAL_LINKDMA(hi2s, hdmatx, hdma_i2s_tx);
+
+ /* Deinitialize the Stream for new transfer */
+ HAL_DMA_DeInit(&hdma_i2s_tx);
+
+ /* Configure the DMA Stream */
+ HAL_DMA_Init(&hdma_i2s_tx);
+ }
+
+ /* Enable and set I2Sx Interrupt to a lower priority */
+ HAL_NVIC_SetPriority(SPI3_IRQn, 0x0F, 0x00);
+ HAL_NVIC_EnableIRQ(SPI3_IRQn);
+
+ /* I2S DMA IRQ Channel configuration */
+ HAL_NVIC_SetPriority(AUDIO_OUT_I2Sx_DMAx_IRQ, AUDIO_OUT_IRQ_PREPRIO, 0);
+ HAL_NVIC_EnableIRQ(AUDIO_OUT_I2Sx_DMAx_IRQ);
+}
+
+/**
+ * @brief Deinitializes I2S MSP.
+ * @param hi2s: I2S handle
+ * @param Params : pointer on additional configuration parameters, can be NULL.
+ */
+__weak void BSP_AUDIO_OUT_MspDeInit(I2S_HandleTypeDef *hi2s, void *Params)
+{
+ GPIO_InitTypeDef gpio_init_structure;
+
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Params);
+
+ /* I2S DMA IRQ Channel deactivation */
+ HAL_NVIC_DisableIRQ(AUDIO_OUT_I2Sx_DMAx_IRQ);
+
+ if(hi2s->Instance == AUDIO_OUT_I2Sx)
+ {
+ /* Deinitialize the DMA stream */
+ HAL_DMA_DeInit(hi2s->hdmatx);
+ }
+
+ /* Disable I2S peripheral */
+ __HAL_I2S_DISABLE(hi2s);
+
+ /* Deactives CODEC_I2S pins MCK, SCK, WS and SD by putting them in input mode */
+ gpio_init_structure.Pin = AUDIO_OUT_I2Sx_MCK_PIN;
+ HAL_GPIO_DeInit(AUDIO_OUT_I2Sx_MCK_GPIO_PORT, gpio_init_structure.Pin);
+
+ gpio_init_structure.Pin = AUDIO_OUT_I2Sx_SCK_PIN;
+ HAL_GPIO_DeInit(AUDIO_OUT_I2Sx_SCK_GPIO_PORT, gpio_init_structure.Pin);
+
+ gpio_init_structure.Pin = AUDIO_OUT_I2Sx_WS_PIN;
+ HAL_GPIO_DeInit(AUDIO_OUT_I2Sx_WS_GPIO_PORT, gpio_init_structure.Pin);
+
+ gpio_init_structure.Pin = AUDIO_OUT_I2Sx_SD_PIN;
+ HAL_GPIO_DeInit(AUDIO_OUT_I2Sx_SD_GPIO_PORT, gpio_init_structure.Pin);
+
+ /* Disable I2S clock */
+ AUDIO_OUT_I2Sx_CLK_DISABLE();
+
+ /* GPIO pins clock and DMA clock can be shut down in the application
+ by surcharging this __weak function */
+}
+
+/**
+ * @brief Clock Config.
+ * @param hi2s: might be required to set audio peripheral predivider if any.
+ * @param AudioFreq: Audio frequency used to play the audio stream.
+ * @param Params : pointer on additional configuration parameters, can be NULL.
+ * @note This API is called by BSP_AUDIO_OUT_Init() and BSP_AUDIO_OUT_SetFrequency()
+ * Being __weak it can be overwritten by the application
+ */
+__weak void BSP_AUDIO_OUT_ClockConfig(I2S_HandleTypeDef *hi2s, uint32_t AudioFreq, void *Params)
+{
+ RCC_PeriphCLKInitTypeDef rcc_ex_clk_init_struct;
+
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Params);
+
+ 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 */
+ rcc_ex_clk_init_struct.PeriphClockSelection = (RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_PLLI2S);
+ rcc_ex_clk_init_struct.I2sApb1ClockSelection = RCC_I2SAPB1CLKSOURCE_PLLI2S;
+ rcc_ex_clk_init_struct.PLLI2SSelection = RCC_PLLI2SCLKSOURCE_PLLSRC;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SM = 8;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SN = 271;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SR = 2;
+
+ HAL_RCCEx_PeriphCLKConfig(&rcc_ex_clk_init_struct);
+ }
+ else if(AudioFreq == AUDIO_FREQUENCY_96K) /* AUDIO_FREQUENCY_96K */
+ {
+ /* I2S clock config */
+ rcc_ex_clk_init_struct.PeriphClockSelection = (RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_PLLI2S);
+ rcc_ex_clk_init_struct.I2sApb1ClockSelection = RCC_I2SAPB1CLKSOURCE_PLLI2S;
+ rcc_ex_clk_init_struct.PLLI2SSelection = RCC_PLLI2SCLKSOURCE_PLLSRC;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SM = 8;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SN = 344;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SR = 2;
+
+ HAL_RCCEx_PeriphCLKConfig(&rcc_ex_clk_init_struct);
+ }
+ else /* AUDIO_FREQUENCY_8K, AUDIO_FREQUENCY_16K, AUDIO_FREQUENCY_48K */
+ {
+ /* I2S clock config
+ PLLI2S_VCO: VCO_344M
+ I2S_CLK(first level) = PLLI2S_VCO/PLLI2SR = 344/7 = 49.142 Mhz
+ I2S_CLK_x = I2S_CLK(first level)/PLLI2SDIVR = 49.142/1 = 49.142 Mhz */
+ rcc_ex_clk_init_struct.PeriphClockSelection = RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_PLLI2S;
+ rcc_ex_clk_init_struct.I2sApb1ClockSelection = RCC_I2SAPB1CLKSOURCE_PLLI2S;
+ rcc_ex_clk_init_struct.PLLI2SSelection = RCC_PLLI2SCLKSOURCE_PLLSRC;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SM = 8;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SN = 344;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SR = 7;
+
+ HAL_RCCEx_PeriphCLKConfig(&rcc_ex_clk_init_struct);
+ }
+}
+
+/*******************************************************************************
+ Static Functions
+*******************************************************************************/
+
+/**
+ * @brief Initializes the Audio Codec audio interface (I2S)
+ * @note This function assumes that the I2S input clock
+ * is already configured and ready to be used.
+ * @param AudioFreq: Audio frequency to be configured for the I2S peripheral.
+ */
+static void I2Sx_Out_Init(uint32_t AudioFreq)
+{
+ /* Initialize the hAudioInI2s Instance parameter */
+ haudio_i2s.Instance = AUDIO_OUT_I2Sx;
+
+ /* Disable I2S block */
+ __HAL_I2S_DISABLE(&haudio_i2s);
+
+ /* I2S peripheral configuration */
+ haudio_i2s.Init.AudioFreq = AudioFreq;
+ haudio_i2s.Init.ClockSource = I2S_CLOCK_PLL;
+ haudio_i2s.Init.CPOL = I2S_CPOL_LOW;
+ haudio_i2s.Init.DataFormat = I2S_DATAFORMAT_16B;
+ haudio_i2s.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;
+ haudio_i2s.Init.Mode = I2S_MODE_MASTER_TX;
+ haudio_i2s.Init.Standard = I2S_STANDARD_PHILIPS;
+ haudio_i2s.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_DISABLE;
+
+ /* Init the I2S */
+ HAL_I2S_Init(&haudio_i2s);
+
+ /* Enable I2S block */
+ __HAL_I2S_ENABLE(&haudio_i2s);
+}
+
+/**
+ * @brief Deinitializes the Audio Codec audio interface (I2S).
+ */
+static void I2Sx_Out_DeInit(void)
+{
+ /* Initialize the hAudioInI2s Instance parameter */
+ haudio_i2s.Instance = AUDIO_OUT_I2Sx;
+
+ /* Disable I2S block */
+ __HAL_I2S_DISABLE(&haudio_i2s);
+
+ /* DeInit the I2S */
+ HAL_I2S_DeInit(&haudio_i2s);
+}
+
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_AUDIO_IN_Private_Functions STM32F413H DISCOVERY AUDIO IN Private functions
+ * @{
+ */
+
+/**
+ * @brief Initializes wave recording.
+ * @param AudioFreq: Audio frequency to be configured for the audio in peripheral.
+ * @param BitRes: Audio bit resolution.
+ * @param ChnlNbr: Audio 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_MIC, AudioFreq, BitRes, ChnlNbr);
+}
+
+/**
+ * @brief Initializes wave recording.
+ * @param InputDevice: INPUT_DEVICE_DIGITAL_MICx or INPUT_DEVICE_ANALOG_MIC.
+ * @param AudioFreq: Audio frequency to be configured for the audio in peripheral.
+ * @param BitRes: Audio bit resolution.
+ * @param ChnlNbr: Audio channel number.
+ * @retval AUDIO_OK if correct communication, else wrong communication
+ */
+uint8_t BSP_AUDIO_IN_InitEx(uint32_t InputDevice, uint32_t AudioFreq, uint32_t BitRes, uint32_t ChnlNbr)
+{
+ uint32_t ret = AUDIO_ERROR;
+ uint32_t deviceid =0;
+ uint32_t mic_enabled =0;
+ uint16_t buffer_fake[16] = {0x00};
+ uint32_t i = 0;
+
+ /* Store the audio record context */
+ hAudioIn.Frequency = AudioFreq;
+ hAudioIn.BitResolution = BitRes;
+ hAudioIn.InputDevice = InputDevice;
+ hAudioIn.ChannelNbr = ChnlNbr;
+
+ /* Store the total number of microphones enabled */
+ for(i = 0; i < DFSDM_MIC_NUMBER; i ++)
+ {
+ if(((hAudioIn.InputDevice >> i) & INPUT_DEVICE_DIGITAL_MIC1) == INPUT_DEVICE_DIGITAL_MIC1)
+ {
+ mic_enabled++;
+ }
+ }
+
+ if (InputDevice == INPUT_DEVICE_ANALOG_MIC)
+ {
+ InputDevice = INPUT_DEVICE_INPUT_LINE_1;
+ /* INPUT_DEVICE_ANALOG_MIC */
+ /* Disable I2S */
+ I2Sx_In_DeInit();
+
+ /* PLL clock is set depending on the AudioFreq (44.1khz vs 48khz groups) */
+ BSP_AUDIO_IN_ClockConfig(AudioFreq, NULL); /* Clock config is shared between AUDIO IN and OUT for analog mic */
+
+ /* I2S data transfer preparation:
+ Prepare the Media to be used for the audio transfer from I2S peripheral to memory */
+ haudio_i2s.Instance = AUDIO_IN_I2Sx;
+ if(HAL_I2S_GetState(&haudio_i2s) == HAL_I2S_STATE_RESET)
+ {
+ BSP_AUDIO_OUT_MspInit(&haudio_i2s, NULL); /* Initialize GPIOs for SPI3 Master signals */
+ /* Init the I2S MSP: this __weak function can be redefined by the application*/
+ BSP_AUDIO_IN_MspInit(NULL);
+ }
+
+ /* Configure I2S */
+ I2Sx_In_Init(AudioFreq);
+
+ AUDIO_IO_Init();
+
+ /* 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)
+ {
+ /* Receive fake I2S data in order to generate MCLK needed by WM8994 to set its registers */
+ HAL_I2S_Receive_DMA(&haudio_i2s, buffer_fake, 16);
+ /* Initialize the codec internal registers */
+ audio_drv->Init(AUDIO_I2C_ADDRESS, (OUTPUT_DEVICE_HEADPHONE|InputDevice), 100, AudioFreq);
+ /* Stop receiving fake I2S data */
+ HAL_I2S_DMAStop(&haudio_i2s);
+ }
+ }
+ else
+ {
+ if(hAudioIn.ChannelNbr != mic_enabled)
+ {
+ return AUDIO_ERROR;
+ }
+ else
+ {
+ /* PLL clock is set depending on the AudioFreq (44.1khz vs 48khz groups) */
+ BSP_AUDIO_IN_ClockConfig(AudioFreq, NULL); /* Clock config is shared between AUDIO IN and OUT for analog mic */
+
+ /* Init the DFSDM MSP: this __weak function can be redefined by the application*/
+ BSP_AUDIO_IN_MspInit(NULL);
+
+ /* Default configuration of DFSDM filters and channels */
+ ret = BSP_AUDIO_IN_ConfigDigitalMic(hAudioIn.InputDevice, NULL);
+ }
+ }
+
+ /* Return AUDIO_OK when all operations are correctly done */
+ return ret;
+}
+
+/**
+ * @brief DeInitializes the audio peripheral.
+ */
+void BSP_AUDIO_IN_DeInit(void)
+{
+ if(hAudioIn.InputDevice != INPUT_DEVICE_ANALOG_MIC)
+ {
+ /* MSP filters/channels initialization */
+ BSP_AUDIO_IN_MspDeInit(NULL);
+
+ DFSDMx_DeInit();
+ }
+ else
+ {
+ I2Sx_In_DeInit();
+ }
+}
+
+/**
+ * @brief Initializes default configuration of the Digital Filter for Sigma-Delta Modulators interface (DFSDM).
+ * @param InputDevice: The microphone to be configured. Can be INPUT_DEVICE_DIGITAL_MIC1..INPUT_DEVICE_DIGITAL_MIC5
+ * @note Channel output Clock Divider and Filter Oversampling are calculated as follow:
+ * - Clock_Divider = CLK(input DFSDM)/CLK(micro) with
+ * 1MHZ < CLK(micro) < 3.2MHZ (TYP 2.4MHZ for MP34DT01TR)
+ * - Oversampling = CLK(input DFSDM)/(Clock_Divider * AudioFreq)
+ * @retval AUDIO_OK if correct communication, else wrong communication
+ */
+uint8_t BSP_AUDIO_IN_ConfigMicDefault(uint32_t InputDevice)
+{
+ uint32_t i = 0, mic_init[DFSDM_MIC_NUMBER] = {0};
+ uint32_t filter_ch = 0, mic_num = 0;
+
+ DFSDM_Filter_TypeDef* FilterInstnace[DFSDM_MIC_NUMBER] = {AUDIO_DFSDMx_MIC1_FILTER, AUDIO_DFSDMx_MIC2_FILTER, AUDIO_DFSDMx_MIC3_FILTER, AUDIO_DFSDMx_MIC4_FILTER, AUDIO_DFSDMx_MIC5_FILTER};
+ DFSDM_Channel_TypeDef* ChannelInstnace[DFSDM_MIC_NUMBER] = {AUDIO_DFSDMx_MIC1_CHANNEL, AUDIO_DFSDMx_MIC2_CHANNEL, AUDIO_DFSDMx_MIC3_CHANNEL, AUDIO_DFSDMx_MIC4_CHANNEL, AUDIO_DFSDMx_MIC5_CHANNEL};
+ uint32_t DigitalMicPins[DFSDM_MIC_NUMBER] = {DFSDM_CHANNEL_SAME_CHANNEL_PINS, DFSDM_CHANNEL_SAME_CHANNEL_PINS, DFSDM_CHANNEL_FOLLOWING_CHANNEL_PINS, DFSDM_CHANNEL_SAME_CHANNEL_PINS, DFSDM_CHANNEL_FOLLOWING_CHANNEL_PINS};
+ uint32_t DigitalMicType[DFSDM_MIC_NUMBER] = {DFSDM_CHANNEL_SPI_RISING, DFSDM_CHANNEL_SPI_RISING, DFSDM_CHANNEL_SPI_FALLING, DFSDM_CHANNEL_SPI_RISING, DFSDM_CHANNEL_SPI_FALLING};
+ uint32_t Channel4Filter[DFSDM_MIC_NUMBER] = {AUDIO_DFSDMx_MIC1_CHANNEL_FOR_FILTER, AUDIO_DFSDMx_MIC2_CHANNEL_FOR_FILTER, AUDIO_DFSDMx_MIC3_CHANNEL_FOR_FILTER, AUDIO_DFSDMx_MIC4_CHANNEL_FOR_FILTER, AUDIO_DFSDMx_MIC5_CHANNEL_FOR_FILTER};
+
+ for(i = 0; i < hAudioIn.ChannelNbr; i++)
+ {
+ if(((InputDevice & INPUT_DEVICE_DIGITAL_MIC1) == INPUT_DEVICE_DIGITAL_MIC1) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)] != 1))
+ {
+ mic_num = POS_VAL(INPUT_DEVICE_DIGITAL_MIC1);
+ }
+ else if(((InputDevice & INPUT_DEVICE_DIGITAL_MIC2) == INPUT_DEVICE_DIGITAL_MIC2) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)] != 1))
+ {
+ mic_num = POS_VAL(INPUT_DEVICE_DIGITAL_MIC2);
+ }
+ else if(((InputDevice & INPUT_DEVICE_DIGITAL_MIC3) == INPUT_DEVICE_DIGITAL_MIC3) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC3)] != 1))
+ {
+ mic_num = POS_VAL(INPUT_DEVICE_DIGITAL_MIC3);
+ }
+ else if(((InputDevice & INPUT_DEVICE_DIGITAL_MIC4) == INPUT_DEVICE_DIGITAL_MIC4) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC4)] != 1))
+ {
+ mic_num = POS_VAL(INPUT_DEVICE_DIGITAL_MIC4);
+ }
+ else if(((InputDevice & INPUT_DEVICE_DIGITAL_MIC5) == INPUT_DEVICE_DIGITAL_MIC5) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC5)] != 1))
+ {
+ mic_num = POS_VAL(INPUT_DEVICE_DIGITAL_MIC5);
+ }
+
+ mic_init[mic_num] = 1;
+
+ HAL_DFSDM_FilterDeInit(&hAudioInDfsdmFilter[mic_num]);
+ /* MIC filters initialization */
+ __HAL_DFSDM_FILTER_RESET_HANDLE_STATE(&hAudioInDfsdmFilter[mic_num]);
+ hAudioInDfsdmFilter[mic_num].Instance = FilterInstnace[mic_num];
+ hAudioInDfsdmFilter[mic_num].Init.RegularParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
+ hAudioInDfsdmFilter[mic_num].Init.RegularParam.FastMode = ENABLE;
+ hAudioInDfsdmFilter[mic_num].Init.RegularParam.DmaMode = ENABLE;
+ hAudioInDfsdmFilter[mic_num].Init.InjectedParam.Trigger = DFSDM_FILTER_SW_TRIGGER;
+ hAudioInDfsdmFilter[mic_num].Init.InjectedParam.ScanMode = DISABLE;
+ hAudioInDfsdmFilter[mic_num].Init.InjectedParam.DmaMode = DISABLE;
+ hAudioInDfsdmFilter[mic_num].Init.InjectedParam.ExtTrigger = DFSDM_FILTER_EXT_TRIG_TIM8_TRGO;
+ hAudioInDfsdmFilter[mic_num].Init.InjectedParam.ExtTriggerEdge = DFSDM_FILTER_EXT_TRIG_BOTH_EDGES;
+ hAudioInDfsdmFilter[mic_num].Init.FilterParam.SincOrder = DFSDM_FILTER_ORDER(hAudioIn.Frequency);
+ hAudioInDfsdmFilter[mic_num].Init.FilterParam.Oversampling = DFSDM_OVER_SAMPLING(hAudioIn.Frequency);
+ hAudioInDfsdmFilter[mic_num].Init.FilterParam.IntOversampling = 1;
+
+ if(HAL_OK != HAL_DFSDM_FilterInit(&hAudioInDfsdmFilter[mic_num]))
+ {
+ return AUDIO_ERROR;
+ }
+
+ HAL_DFSDM_ChannelDeInit(&hAudioInDfsdmChannel[mic_num]);
+ /* MIC channels initialization */
+ __HAL_DFSDM_CHANNEL_RESET_HANDLE_STATE(&hAudioInDfsdmChannel[mic_num]);
+ hAudioInDfsdmChannel[mic_num].Init.OutputClock.Activation = ENABLE;
+ hAudioInDfsdmChannel[mic_num].Init.OutputClock.Selection = DFSDM_CHANNEL_OUTPUT_CLOCK_AUDIO;
+ hAudioInDfsdmChannel[mic_num].Init.OutputClock.Divider = DFSDM_CLOCK_DIVIDER(hAudioIn.Frequency);
+ hAudioInDfsdmChannel[mic_num].Init.Input.Multiplexer = DFSDM_CHANNEL_EXTERNAL_INPUTS;
+ hAudioInDfsdmChannel[mic_num].Init.Input.DataPacking = DFSDM_CHANNEL_STANDARD_MODE;
+ hAudioInDfsdmChannel[mic_num].Init.SerialInterface.SpiClock = DFSDM_CHANNEL_SPI_CLOCK_INTERNAL;
+ hAudioInDfsdmChannel[mic_num].Init.Awd.FilterOrder = DFSDM_CHANNEL_SINC1_ORDER;
+ hAudioInDfsdmChannel[mic_num].Init.Awd.Oversampling = 10;
+ hAudioInDfsdmChannel[mic_num].Init.Offset = 0;
+ hAudioInDfsdmChannel[mic_num].Init.RightBitShift = DFSDM_MIC_BIT_SHIFT(hAudioIn.Frequency);
+ hAudioInDfsdmChannel[mic_num].Instance = ChannelInstnace[mic_num];
+ hAudioInDfsdmChannel[mic_num].Init.Input.Pins = DigitalMicPins[mic_num];
+ hAudioInDfsdmChannel[mic_num].Init.SerialInterface.Type = DigitalMicType[mic_num];
+
+ if(HAL_OK != HAL_DFSDM_ChannelInit(&hAudioInDfsdmChannel[mic_num]))
+ {
+ return AUDIO_ERROR;
+ }
+
+ filter_ch = Channel4Filter[mic_num];
+ /* Configure injected channel */
+ if(HAL_OK != HAL_DFSDM_FilterConfigRegChannel(&hAudioInDfsdmFilter[mic_num], filter_ch, DFSDM_CONTINUOUS_CONV_ON))
+ {
+ return AUDIO_ERROR;
+ }
+ }
+ return AUDIO_OK;
+}
+
+/**
+ * @brief Initializes the Digital Filter for Sigma-Delta Modulators interface (DFSDM).
+ * @param InputDevice: The microphone to be configured. Can be INPUT_DEVICE_DIGITAL_MIC1..INPUT_DEVICE_DIGITAL_MIC5
+ * @param Params : pointer on additional configuration parameters, can be NULL.
+ * @retval AUDIO_OK if correct communication, else wrong communication
+ */
+__weak uint8_t BSP_AUDIO_IN_ConfigDigitalMic(uint32_t InputDevice, void *Params)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Params);
+
+ /* Default configuration of DFSDM filters and channels */
+ return(BSP_AUDIO_IN_ConfigMicDefault(InputDevice));
+ /* Note: This function can be called at application level and default configuration
+ can be ovewritten to fit user's need */
+}
+
+/**
+ * @brief Allocate channel buffer scratch
+ * @param pScratch : pointer to scratch tables.
+ * @param size: size of scratch buffer
+ */
+uint8_t BSP_AUDIO_IN_AllocScratch (int32_t *pScratch, uint32_t size)
+{
+ uint32_t idx;
+
+ ScratchSize = size / DEFAULT_AUDIO_IN_CHANNEL_NBR;
+
+ /* copy scratch pointers */
+ for (idx = 0; idx < DEFAULT_AUDIO_IN_CHANNEL_NBR ; idx++)
+ {
+ pScratchBuff[idx] = (int32_t *)(pScratch + idx * ScratchSize);
+ }
+ /* Return AUDIO_OK */
+ return AUDIO_OK;
+}
+
+/**
+ * @brief Starts audio recording.
+ * @param pBuf: Main buffer pointer for the recorded data storing
+ * @param size: Current size of the recorded buffer
+ * @retval AUDIO_OK if correct communication, else wrong communication
+ */
+uint8_t BSP_AUDIO_IN_Record(uint16_t *pBuf, uint32_t size)
+{
+ hAudioIn.pRecBuf = pBuf;
+ hAudioIn.RecSize = size;
+ /* Reset Application Buffer Trigger */
+ AppBuffTrigger = 0;
+ AppBuffHalf = 0;
+
+ if (hAudioIn.InputDevice == INPUT_DEVICE_DIGITAL_MIC)
+ {
+ /* Call the Media layer start function for MIC1 channel */
+ if(HAL_OK != HAL_DFSDM_FilterRegularStart_DMA(&hAudioInDfsdmFilter[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)], pScratchBuff[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)], ScratchSize))
+ {
+ return AUDIO_ERROR;
+ }
+
+ /* Call the Media layer start function for MIC2 channel */
+ if(HAL_OK != HAL_DFSDM_FilterRegularStart_DMA(&hAudioInDfsdmFilter[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)], pScratchBuff[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)], ScratchSize))
+ {
+ return AUDIO_ERROR;
+ }
+ }
+ else
+ {
+ /* Start the process to receive the DMA */
+ if (HAL_OK != HAL_I2SEx_TransmitReceive_DMA(&haudio_i2s, pBuf, pBuf, size))
+ {
+ return AUDIO_ERROR;
+ }
+ }
+ /* Return AUDIO_OK when all operations are correctly done */
+ return AUDIO_OK;
+}
+
+/**
+ * @brief Starts audio recording.
+ * @param pBuf: Main buffer pointer for the recorded data storing
+ * @param size: Current size of the recorded buffer
+ * @retval AUDIO_OK if correct communication, else wrong communication
+ */
+uint8_t BSP_AUDIO_IN_RecordEx(uint32_t *pBuf, uint32_t size)
+{
+ uint8_t ret = AUDIO_ERROR;
+ hAudioIn.RecSize = size;
+ uint32_t i = 0;
+ uint32_t mic_init[DFSDM_MIC_NUMBER] = {0};
+ if (hAudioIn.InputDevice == INPUT_DEVICE_ANALOG_MIC)
+ {
+ return ret;
+ }
+ else
+ {
+ hAudioIn.MultiBuffMode = 1;
+ for(i = 0; i < hAudioIn.ChannelNbr; i++)
+ {
+ if(((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC1) == INPUT_DEVICE_DIGITAL_MIC1) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)] != 1))
+ {
+ /* Call the Media layer start function for MIC1 channel 1 */
+ if(HAL_OK != HAL_DFSDM_FilterRegularStart_DMA(&hAudioInDfsdmFilter[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)], (int32_t*)pBuf[i], size))
+ {
+ return AUDIO_ERROR;
+ }
+ MicBuff[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)] = i;
+ mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)] = 1;
+ }
+ else if(((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC2) == INPUT_DEVICE_DIGITAL_MIC2) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)] != 1))
+ {
+ /* Call the Media layer start function for MIC2 channel 1 */
+ if(HAL_OK != HAL_DFSDM_FilterRegularStart_DMA(&hAudioInDfsdmFilter[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)], (int32_t*)pBuf[i], size))
+ {
+ return AUDIO_ERROR;
+ }
+ MicBuff[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)] = i;
+ mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)] = 1;
+ }
+ else if(((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC3) == INPUT_DEVICE_DIGITAL_MIC3) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC3)] != 1))
+ {
+ /* Call the Media layer start function for MIC3 channel 0 */
+ if(HAL_OK != HAL_DFSDM_FilterRegularStart_DMA(&hAudioInDfsdmFilter[POS_VAL(INPUT_DEVICE_DIGITAL_MIC3)], (int32_t*)pBuf[i], size))
+ {
+ return AUDIO_ERROR;
+ }
+ MicBuff[POS_VAL(INPUT_DEVICE_DIGITAL_MIC3)] = i;
+ mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC3)] = 1;
+ }
+ else if(((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC4) == INPUT_DEVICE_DIGITAL_MIC4) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC4)] != 1))
+ {
+ /* Call the Media layer start function for MIC4 channel 7 */
+ if(HAL_OK != HAL_DFSDM_FilterRegularStart_DMA(&hAudioInDfsdmFilter[POS_VAL(INPUT_DEVICE_DIGITAL_MIC4)], (int32_t*)pBuf[i], size))
+ {
+ return AUDIO_ERROR;
+ }
+ MicBuff[POS_VAL(INPUT_DEVICE_DIGITAL_MIC4)] = i;
+ mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC4)] = 1;
+ }
+ else if(((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC5) == INPUT_DEVICE_DIGITAL_MIC5) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC5)] != 1))
+ {
+ /* Call the Media layer start function for MIC5 channel 6 */
+ if(HAL_OK != HAL_DFSDM_FilterRegularStart_DMA(&hAudioInDfsdmFilter[POS_VAL(INPUT_DEVICE_DIGITAL_MIC5)], (int32_t*)pBuf[i], size))
+ {
+ return AUDIO_ERROR;
+ }
+ MicBuff[POS_VAL(INPUT_DEVICE_DIGITAL_MIC5)] = i;
+ mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC5)] = 1;
+ }
+ }
+ }
+ /* Return AUDIO_OK when all operations are correctly done */
+ return AUDIO_OK;
+}
+
+/**
+ * @brief Initializes the I2S MSP.
+ */
+static void I2Sx_In_MspInit(void)
+{
+ static DMA_HandleTypeDef hdma_i2s_rx;
+ GPIO_InitTypeDef gpio_init_structure;
+
+ /* Enable I2S clock */
+ AUDIO_IN_I2Sx_CLK_ENABLE();
+
+ /* Enable MCK GPIO clock, needed by the codec */
+ AUDIO_OUT_I2Sx_MCK_GPIO_CLK_ENABLE();
+
+ /* CODEC_I2S pins configuration: MCK pins */
+ gpio_init_structure.Pin = AUDIO_OUT_I2Sx_MCK_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_OUT_I2Sx_MCK_AF;
+ HAL_GPIO_Init(AUDIO_OUT_I2Sx_MCK_GPIO_PORT, &gpio_init_structure);
+
+ /* Enable SD GPIO clock */
+ AUDIO_IN_I2Sx_EXT_SD_GPIO_CLK_ENABLE();
+ /* CODEC_I2S pin configuration: SD pin */
+ gpio_init_structure.Pin = AUDIO_IN_I2Sx_EXT_SD_PIN;
+ gpio_init_structure.Alternate = AUDIO_IN_I2Sx_EXT_SD_AF;
+ HAL_GPIO_Init(AUDIO_IN_I2Sx_EXT_SD_GPIO_PORT, &gpio_init_structure);
+
+ /* Enable the DMA clock */
+ AUDIO_IN_I2Sx_DMAx_CLK_ENABLE();
+
+ if(haudio_i2s.Instance == AUDIO_IN_I2Sx)
+ {
+ /* Configure the hdma_i2s_rx handle parameters */
+ hdma_i2s_rx.Init.Channel = AUDIO_IN_I2Sx_DMAx_CHANNEL;
+ hdma_i2s_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;
+ hdma_i2s_rx.Init.PeriphInc = DMA_PINC_DISABLE;
+ hdma_i2s_rx.Init.MemInc = DMA_MINC_ENABLE;
+ hdma_i2s_rx.Init.PeriphDataAlignment = AUDIO_IN_I2Sx_DMAx_PERIPH_DATA_SIZE;
+ hdma_i2s_rx.Init.MemDataAlignment = AUDIO_IN_I2Sx_DMAx_MEM_DATA_SIZE;
+ hdma_i2s_rx.Init.Mode = DMA_CIRCULAR;
+ hdma_i2s_rx.Init.Priority = DMA_PRIORITY_HIGH;
+ hdma_i2s_rx.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
+ hdma_i2s_rx.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL;
+ hdma_i2s_rx.Init.MemBurst = DMA_MBURST_SINGLE;
+ hdma_i2s_rx.Init.PeriphBurst = DMA_MBURST_SINGLE;
+
+ hdma_i2s_rx.Instance = AUDIO_IN_I2Sx_DMAx_STREAM;
+
+ /* Associate the DMA handle */
+ __HAL_LINKDMA(&haudio_i2s, hdmarx, hdma_i2s_rx);
+
+ /* Deinitialize the Stream for new transfer */
+ HAL_DMA_DeInit(&hdma_i2s_rx);
+
+ /* Configure the DMA Stream */
+ HAL_DMA_Init(&hdma_i2s_rx);
+ }
+
+ /* I2S DMA IRQ Channel configuration */
+ HAL_NVIC_SetPriority(AUDIO_IN_I2Sx_DMAx_IRQ, AUDIO_IN_IRQ_PREPRIO, 0);
+ HAL_NVIC_EnableIRQ(AUDIO_IN_I2Sx_DMAx_IRQ);
+}
+
+/**
+ * @brief De-Initializes the I2S MSP.
+ */
+static void I2Sx_In_MspDeInit(void)
+{
+ GPIO_InitTypeDef gpio_init_structure;
+
+ /* I2S DMA IRQ Channel deactivation */
+ HAL_NVIC_DisableIRQ(AUDIO_IN_I2Sx_DMAx_IRQ);
+
+ if(haudio_i2s.Instance == AUDIO_IN_I2Sx)
+ {
+ /* Deinitialize the DMA stream */
+ HAL_DMA_DeInit(haudio_i2s.hdmarx);
+ }
+
+ /* Disable I2S peripheral */
+ __HAL_I2S_DISABLE(&haudio_i2s);
+
+ /* Deactives CODEC_I2S pins MCK by putting them in input mode */
+ gpio_init_structure.Pin = AUDIO_OUT_I2Sx_MCK_PIN;
+ HAL_GPIO_DeInit(AUDIO_OUT_I2Sx_MCK_GPIO_PORT, gpio_init_structure.Pin);
+
+ gpio_init_structure.Pin = AUDIO_IN_I2Sx_EXT_SD_PIN;
+ HAL_GPIO_DeInit(AUDIO_IN_I2Sx_EXT_SD_GPIO_PORT, gpio_init_structure.Pin);
+
+ /* Disable I2S clock */
+ AUDIO_IN_I2Sx_CLK_DISABLE();
+}
+
+/**
+ * @brief Initializes BSP_AUDIO_IN MSP.
+ * @param Params : pointer on additional configuration parameters, can be NULL.
+ */
+__weak void BSP_AUDIO_IN_MspInit(void *Params)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Params);
+
+ if(hAudioIn.InputDevice == INPUT_DEVICE_ANALOG_MIC)
+ {
+ I2Sx_In_MspInit();
+ }
+ else
+ {
+ /* MSP channels initialization */
+ DFSDMx_ChannelMspInit();
+
+ /* MSP filters initialization */
+ DFSDMx_FilterMspInit();
+ }
+}
+
+/**
+ * @brief De-Initializes BSP_AUDIO_IN MSP.
+ * @param Params : pointer on additional configuration parameters, can be NULL.
+ */
+__weak void BSP_AUDIO_IN_MspDeInit(void *Params)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Params);
+
+ if(hAudioIn.InputDevice == INPUT_DEVICE_ANALOG_MIC)
+ {
+ I2Sx_In_MspDeInit();
+ }
+ else
+ {
+ /* MSP channels initialization */
+ DFSDMx_ChannelMspDeInit();
+
+ /* MSP filters initialization */
+ DFSDMx_FilterMspDeInit();
+ }
+}
+
+/**
+ * @brief Clock Config.
+ * @param AudioFreq: Audio frequency used to play the audio stream.
+ * @param Params : pointer on additional configuration parameters, can be NULL.
+ * @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 AUDIO_OK if correct communication, else wrong communication
+ */
+__weak uint8_t BSP_AUDIO_IN_ClockConfig(uint32_t AudioFreq, void *Params)
+{
+ RCC_PeriphCLKInitTypeDef rcc_ex_clk_init_struct;
+
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Params);
+
+ 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 */
+ rcc_ex_clk_init_struct.PeriphClockSelection = (RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_DFSDM | RCC_PERIPHCLK_DFSDM2);
+ rcc_ex_clk_init_struct.I2sApb1ClockSelection = RCC_I2SAPB1CLKSOURCE_PLLI2S;
+ rcc_ex_clk_init_struct.Dfsdm1ClockSelection = RCC_DFSDM1CLKSOURCE_APB2;
+ rcc_ex_clk_init_struct.Dfsdm2ClockSelection = RCC_DFSDM2CLKSOURCE_APB2;
+ rcc_ex_clk_init_struct.PLLI2SSelection = RCC_PLLI2SCLKSOURCE_PLLSRC;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SM = 8;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SN = 271;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SR = 2;
+
+ HAL_RCCEx_PeriphCLKConfig(&rcc_ex_clk_init_struct);
+ }
+ else if(AudioFreq == AUDIO_FREQUENCY_96K)
+ {
+ /* I2S clock config */
+ rcc_ex_clk_init_struct.PeriphClockSelection = (RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_DFSDM | RCC_PERIPHCLK_DFSDM2);
+ rcc_ex_clk_init_struct.I2sApb1ClockSelection = RCC_I2SAPB1CLKSOURCE_PLLI2S;
+ rcc_ex_clk_init_struct.Dfsdm1ClockSelection = RCC_DFSDM1CLKSOURCE_APB2;
+ rcc_ex_clk_init_struct.Dfsdm2ClockSelection = RCC_DFSDM2CLKSOURCE_APB2;
+ rcc_ex_clk_init_struct.PLLI2SSelection = RCC_PLLI2SCLKSOURCE_PLLSRC;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SM = 8;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SN = 344;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SR = 2;
+
+ HAL_RCCEx_PeriphCLKConfig(&rcc_ex_clk_init_struct);
+ }
+ else /* AUDIO_FREQUENCY_8K, AUDIO_FREQUENCY_16K, AUDIO_FREQUENCY_32K, AUDIO_FREQUENCY_48K */
+ {
+ /* I2S clock config
+ PLLI2S_VCO: VCO_344M
+ I2S_CLK(first level) = PLLI2S_VCO/PLLI2SR = 344/7 = 49.142 Mhz
+ I2S_CLK_x = I2S_CLK(first level)/PLLI2SDIVR = 49.142/1 = 49.142 Mhz */
+ rcc_ex_clk_init_struct.PeriphClockSelection = (RCC_PERIPHCLK_I2S_APB1 | RCC_PERIPHCLK_DFSDM | RCC_PERIPHCLK_DFSDM2);
+ rcc_ex_clk_init_struct.I2sApb1ClockSelection = RCC_I2SAPB1CLKSOURCE_PLLI2S;
+ rcc_ex_clk_init_struct.DfsdmClockSelection = RCC_DFSDM1CLKSOURCE_APB2|RCC_DFSDM2CLKSOURCE_APB2;
+ rcc_ex_clk_init_struct.PLLI2SSelection = RCC_PLLI2SCLKSOURCE_PLLSRC;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SM = 8;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SN = 344;
+ rcc_ex_clk_init_struct.PLLI2S.PLLI2SR = 7;
+
+ HAL_RCCEx_PeriphCLKConfig(&rcc_ex_clk_init_struct);
+ }
+
+ if(hAudioIn.InputDevice != INPUT_DEVICE_ANALOG_MIC)
+ {
+ /* I2S_APB1 selected as DFSDM audio clock source */
+ __HAL_RCC_DFSDM1AUDIO_CONFIG(RCC_DFSDM1AUDIOCLKSOURCE_I2SAPB1);
+ /* I2S_APB1 selected as DFSDM audio clock source */
+ __HAL_RCC_DFSDM2AUDIO_CONFIG(RCC_DFSDM2AUDIOCLKSOURCE_I2SAPB1);
+ }
+
+ return AUDIO_OK;
+}
+
+/**
+ * @brief Regular conversion complete callback.
+ * @note In interrupt mode, user has to read conversion value in this function
+ using HAL_DFSDM_FilterGetRegularValue.
+ * @param hdfsdm_filter : DFSDM filter handle.
+ */
+void HAL_DFSDM_FilterRegConvCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
+{
+ uint32_t index, input_device = 0;
+
+ if(hdfsdm_filter->Instance == AUDIO_DFSDMx_MIC1_FILTER)
+ {
+ DmaRecBuffCplt[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)] = 1;
+ input_device = INPUT_DEVICE_DIGITAL_MIC1;
+ }
+ else if(hdfsdm_filter->Instance == AUDIO_DFSDMx_MIC2_FILTER)
+ {
+ DmaRecBuffCplt[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)] = 1;
+ input_device = INPUT_DEVICE_DIGITAL_MIC2;
+ }
+ else if(hdfsdm_filter->Instance == AUDIO_DFSDMx_MIC3_FILTER)
+ {
+ input_device = INPUT_DEVICE_DIGITAL_MIC3;
+ }
+ else if(hdfsdm_filter->Instance == AUDIO_DFSDMx_MIC4_FILTER)
+ {
+ input_device = INPUT_DEVICE_DIGITAL_MIC4;
+ }
+ else if(hdfsdm_filter->Instance == AUDIO_DFSDMx_MIC5_FILTER)
+ {
+ input_device = INPUT_DEVICE_DIGITAL_MIC5;
+ }
+
+ if(hAudioIn.MultiBuffMode == 1)
+ {
+ BSP_AUDIO_IN_TransferComplete_CallBackEx(input_device);
+ }
+ else
+ {
+ if((DmaRecBuffCplt[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)] == 1) && (DmaRecBuffCplt[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)] == 1))
+ {
+ if(AppBuffTrigger >= hAudioIn.RecSize)
+ AppBuffTrigger = 0;
+
+ for(index = (ScratchSize/2) ; index < ScratchSize; index++)
+ {
+ hAudioIn.pRecBuf[AppBuffTrigger] = (uint16_t)(SaturaLH((pScratchBuff[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)][index] >> 8), -32760, 32760));
+ hAudioIn.pRecBuf[AppBuffTrigger + 1] = (uint16_t)(SaturaLH((pScratchBuff[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)][index] >> 8), -32760, 32760));
+ AppBuffTrigger += 2;
+ }
+ DmaRecBuffCplt[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)] = DmaRecBuffCplt[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)] = 0;
+ }
+
+ /* Update Trigger with Remaining Byte before callback if necessary */
+ if(AppBuffTrigger >= hAudioIn.RecSize)
+ {
+ /* Reset Application Buffer Trigger */
+ AppBuffTrigger = 0;
+ AppBuffHalf = 0;
+
+ /* Call the record update function to get the next buffer to fill and its size (size is ignored) */
+ BSP_AUDIO_IN_TransferComplete_CallBack();
+ }
+ else if((AppBuffTrigger >= hAudioIn.RecSize/2))
+ {
+ if(AppBuffHalf == 0)
+ {
+ AppBuffHalf = 1;
+ /* Manage the remaining file size and new address offset: This function
+ should be coded by user (its prototype is already declared in stm32l476g_eval_audio.h) */
+ BSP_AUDIO_IN_HalfTransfer_CallBack();
+ }
+ }
+ }
+}
+
+/**
+ * @brief Half regular conversion complete callback.
+ * @param hdfsdm_filter : DFSDM filter handle.
+ */
+void HAL_DFSDM_FilterRegConvHalfCpltCallback(DFSDM_Filter_HandleTypeDef *hdfsdm_filter)
+{
+ uint32_t index, input_device = 0;
+
+ if(hdfsdm_filter->Instance == AUDIO_DFSDMx_MIC1_FILTER)
+ {
+ DmaRecHalfBuffCplt[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)] = 1;
+ input_device = INPUT_DEVICE_DIGITAL_MIC1;
+ }
+ else if(hdfsdm_filter->Instance == AUDIO_DFSDMx_MIC2_FILTER)
+ {
+ DmaRecHalfBuffCplt[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)] = 1;
+ input_device = INPUT_DEVICE_DIGITAL_MIC2;
+ }
+ else if(hdfsdm_filter->Instance == AUDIO_DFSDMx_MIC3_FILTER)
+ {
+ input_device = INPUT_DEVICE_DIGITAL_MIC3;
+ }
+ else if(hdfsdm_filter->Instance == AUDIO_DFSDMx_MIC4_FILTER)
+ {
+ input_device = INPUT_DEVICE_DIGITAL_MIC4;
+ }
+ else if(hdfsdm_filter->Instance == AUDIO_DFSDMx_MIC5_FILTER)
+ {
+ input_device = INPUT_DEVICE_DIGITAL_MIC5;
+ }
+
+ if(hAudioIn.MultiBuffMode == 1)
+ {
+ BSP_AUDIO_IN_HalfTransfer_CallBackEx(input_device);
+ }
+ else
+ {
+ if((DmaRecHalfBuffCplt[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)] == 1) && (DmaRecHalfBuffCplt[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)] == 1))
+ {
+ if(AppBuffTrigger >= hAudioIn.RecSize)
+ AppBuffTrigger = 0;
+
+ for(index = 0; index < ScratchSize/2; index++)
+ {
+ hAudioIn.pRecBuf[AppBuffTrigger] = (int16_t)(SaturaLH((pScratchBuff[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)][index] >> 8), -32760, 32760));
+ hAudioIn.pRecBuf[AppBuffTrigger + 1] = (int16_t)(SaturaLH((pScratchBuff[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)][index] >> 8), -32760, 32760));
+ AppBuffTrigger += 2;
+ }
+ DmaRecHalfBuffCplt[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)] = DmaRecHalfBuffCplt[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)] = 0;
+ }
+
+
+ /* Update Trigger with Remaining Byte before callback if necessary */
+ if(AppBuffTrigger >= hAudioIn.RecSize)
+ {
+ /* Reset Application Buffer Trigger */
+ AppBuffTrigger = 0;
+ AppBuffHalf = 0;
+
+ /* Call the record update function to get the next buffer to fill and its size (size is ignored) */
+ BSP_AUDIO_IN_TransferComplete_CallBack();
+ }
+ else if((AppBuffTrigger >= hAudioIn.RecSize/2))
+ {
+ if(AppBuffHalf == 0)
+ {
+ AppBuffHalf = 1;
+ /* Manage the remaining file size and new address offset: This function
+ should be coded by user */
+ BSP_AUDIO_IN_HalfTransfer_CallBack();
+ }
+ }
+ }
+}
+
+/**
+ * @brief Half reception complete callback.
+ * @param hi2s : I2S handle.
+ */
+void HAL_I2S_RxHalfCpltCallback(I2S_HandleTypeDef *hi2s)
+{
+ /* 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 Reception complete callback.
+ * @param hi2s : I2S handle.
+ */
+void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef *hi2s)
+{
+ /* Call the record update function to get the next buffer to fill and its size (size is ignored) */
+ BSP_AUDIO_IN_TransferComplete_CallBack();
+}
+
+/**
+ * @brief Stops audio recording.
+ * @retval AUDIO_OK if correct communication, else wrong communication
+ */
+uint8_t BSP_AUDIO_IN_Stop(void)
+{
+ AppBuffTrigger = 0;
+ AppBuffHalf = 0;
+
+ if (hAudioIn.InputDevice == INPUT_DEVICE_ANALOG_MIC)
+ {
+ /* Call the Media layer stop function */
+ if(HAL_OK != HAL_I2S_DMAStop(&haudio_i2s))
+ {
+ return AUDIO_ERROR;
+ }
+ /* Call Audio Codec Stop function */
+ if(audio_drv->Stop(AUDIO_I2C_ADDRESS, CODEC_PDWN_HW) != 0)
+ {
+ return AUDIO_ERROR;
+ }
+ /* Wait at least 100us */
+ HAL_Delay(1);
+ }
+ else /* InputDevice = Digital Mic */
+ {
+ /* Call the Media layer stop function for MIC1 channel */
+ if(AUDIO_OK != BSP_AUDIO_IN_PauseEx(INPUT_DEVICE_DIGITAL_MIC1))
+ {
+ return AUDIO_ERROR;
+ }
+
+ /* Call the Media layer stop function for MIC2 channel */
+ if(AUDIO_OK != BSP_AUDIO_IN_PauseEx(INPUT_DEVICE_DIGITAL_MIC2))
+ {
+ return AUDIO_ERROR;
+ }
+ }
+
+ /* Return AUDIO_OK when all operations are correctly done */
+ return AUDIO_OK;
+}
+
+/**
+ * @brief Stops audio recording.
+ * @param InputDevice: Microphone to be stopped. Can be INPUT_DEVICE_DIGITAL_MIC1 .. INPUT_DEVICE_DIGITAL_MIC5.
+ * @retval AUDIO_OK if correct communication, else wrong communication
+ */
+uint8_t BSP_AUDIO_IN_StopEx(uint32_t InputDevice)
+{
+ if((InputDevice < INPUT_DEVICE_DIGITAL_MIC1) || (InputDevice > INPUT_DEVICE_DIGITAL_MIC5))
+ {
+ return AUDIO_ERROR;
+ }
+ else
+ {
+ BSP_AUDIO_IN_PauseEx(InputDevice);
+ }
+
+ /* 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)
+{
+ if (hAudioIn.InputDevice == INPUT_DEVICE_ANALOG_MIC)
+ {
+ return AUDIO_ERROR;
+ }
+ else
+ {
+ /* Call the Media layer stop function */
+ if(HAL_OK != HAL_DFSDM_FilterRegularStop_DMA(&hAudioInDfsdmFilter[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)]))
+ {
+ return AUDIO_ERROR;
+ }
+
+ /* Call the Media layer stop function */
+ if(HAL_OK != HAL_DFSDM_FilterRegularStop_DMA(&hAudioInDfsdmFilter[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)]))
+ {
+ return AUDIO_ERROR;
+ }
+ }
+ /* Return AUDIO_OK when all operations are correctly done */
+ return AUDIO_OK;
+}
+
+/**
+ * @brief Pauses the audio file stream.
+ * @param InputDevice: Microphone to be paused. Can be INPUT_DEVICE_DIGITAL_MIC1 .. INPUT_DEVICE_DIGITAL_MIC5.
+ * @retval AUDIO_OK if correct communication, else wrong communication
+ */
+uint8_t BSP_AUDIO_IN_PauseEx(uint32_t InputDevice)
+{
+ if((InputDevice < INPUT_DEVICE_DIGITAL_MIC1) || (InputDevice > INPUT_DEVICE_DIGITAL_MIC5))
+ {
+ return AUDIO_ERROR;
+ }
+ else
+ {
+ /* Call the Media layer stop function */
+ if(HAL_OK != HAL_DFSDM_FilterRegularStop_DMA(&hAudioInDfsdmFilter[POS_VAL(InputDevice)]))
+ {
+ return AUDIO_ERROR;
+ }
+ }
+ /* 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)
+{
+ if (hAudioIn.InputDevice == INPUT_DEVICE_ANALOG_MIC)
+ {
+ return AUDIO_ERROR;
+ }
+ else
+ {
+ /* Call the Media layer start function for MIC2 channel */
+ if(HAL_OK != HAL_DFSDM_FilterRegularStart_DMA(&hAudioInDfsdmFilter[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)], pScratchBuff[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)], ScratchSize))
+ {
+ return AUDIO_ERROR;
+ }
+
+ /* Call the Media layer start function for MIC1 channel */
+ if(HAL_OK != HAL_DFSDM_FilterRegularStart_DMA(&hAudioInDfsdmFilter[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)], pScratchBuff[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)], ScratchSize))
+ {
+ return AUDIO_ERROR;
+ }
+ }
+ /* Return AUDIO_OK when all operations are correctly done */
+ return AUDIO_OK;
+}
+
+/**
+ * @brief Resumes the audio file stream.
+ * @param pBuf: Main buffer pointer for the recorded data storing
+ * @param InputDevice: Microphone to be paused. Can be INPUT_DEVICE_DIGITAL_MIC1 .. INPUT_DEVICE_DIGITAL_MIC5.
+ * @retval AUDIO_OK if correct communication, else wrong communication
+ */
+uint8_t BSP_AUDIO_IN_ResumeEx(uint32_t *pBuf, uint32_t InputDevice)
+{
+ if((InputDevice < INPUT_DEVICE_DIGITAL_MIC1) || (InputDevice > INPUT_DEVICE_DIGITAL_MIC5))
+ {
+ return AUDIO_ERROR;
+ }
+ else
+ {
+ /* Call the Media layer stop function */
+ if(HAL_OK != HAL_DFSDM_FilterRegularStart_DMA(&hAudioInDfsdmFilter[POS_VAL(InputDevice)], (int32_t*)pBuf[MicBuff[POS_VAL(InputDevice)]], hAudioIn.RecSize))
+ {
+ return AUDIO_ERROR;
+ }
+ }
+ /* Return AUDIO_OK when all operations are correctly done */
+ return AUDIO_OK;
+}
+
+/**
+ * @brief Controls the audio in 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_IN_SetVolume(uint8_t Volume)
+{
+ /* Set the Global variable AudioInVolume */
+ AudioInVolume = Volume;
+
+ /* Return AUDIO_OK when all operations are correctly done */
+ return AUDIO_OK;
+}
+
+/**
+ * @brief User callback when record buffer is filled.
+ */
+__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.
+ */
+__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 User callback when record buffer is filled.
+ * @param InputDevice: INPUT_DEVICE_DIGITAL_MIC1 .. INPUT_DEVICE_DIGITAL_MIC5.
+ */
+__weak void BSP_AUDIO_IN_TransferComplete_CallBackEx(uint32_t InputDevice)
+{
+ /* 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 User callback when record buffer is filled.
+ * @param InputDevice: INPUT_DEVICE_DIGITAL_MIC1 .. INPUT_DEVICE_DIGITAL_MIC5.
+ */
+__weak void BSP_AUDIO_IN_HalfTransfer_CallBackEx(uint32_t InputDevice)
+{
+ /* 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.
+ */
+__weak void BSP_AUDIO_IN_Error_Callback(void)
+{
+ /* This function is called when an Interrupt due to transfer error on or peripheral
+ error occurs. */
+}
+
+/**
+ * @}
+ */
+
+/*******************************************************************************
+ Static Functions
+*******************************************************************************/
+
+/**
+ * @brief De-initializes the Digital Filter for Sigma-Delta Modulators interface (DFSDM).
+ * @retval AUDIO_OK if correct communication, else wrong communication
+ */
+static uint8_t DFSDMx_DeInit(void)
+{
+ for(uint32_t i = 0; i < DFSDM_MIC_NUMBER; i++)
+ {
+ if(hAudioInDfsdmFilter[i].Instance != NULL)
+ {
+ if(HAL_OK != HAL_DFSDM_FilterDeInit(&hAudioInDfsdmFilter[i]))
+ {
+ return AUDIO_ERROR;
+ }
+ hAudioInDfsdmFilter[i].Instance = NULL;
+ }
+ if(hAudioInDfsdmChannel[i].Instance != NULL)
+ {
+ if(HAL_OK != HAL_DFSDM_ChannelDeInit(&hAudioInDfsdmChannel[i]))
+ {
+ return AUDIO_ERROR;
+ }
+ hAudioInDfsdmChannel[i].Instance = NULL;
+ }
+ }
+ return AUDIO_OK;
+}
+
+/**
+ * @brief Initializes the DFSDM channel MSP.
+ */
+static void DFSDMx_ChannelMspInit(void)
+{
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+ GPIO_InitStruct.Pull = GPIO_NOPULL;
+ GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
+
+ if((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC1) == INPUT_DEVICE_DIGITAL_MIC1)
+ {
+ /* Enable DFSDM clock */
+ AUDIO_DFSDMx_MIC1_CLK_ENABLE();
+ /* Enable GPIO clock */
+ AUDIO_DFSDMx_MIC1_CKOUT_DMIC_GPIO_CLK_ENABLE();
+
+ /* DFSDM MIC1 pins configuration: DFSDM_CKOUT, DMIC_DATIN pins -------------*/
+ GPIO_InitStruct.Pin = AUDIO_DFSDMx_MIC1_CKOUT_PIN;
+ GPIO_InitStruct.Alternate = AUDIO_DFSDMx_MIC1_CKOUT_DMIC_AF;
+ HAL_GPIO_Init(AUDIO_DFSDMx_MIC1_CKOUT_DMIC_GPIO_PORT, &GPIO_InitStruct);
+
+ AUDIO_DFSDMx_MIC1_DMIC_GPIO_CLK_ENABLE();
+ GPIO_InitStruct.Pin = AUDIO_DFSDMx_MIC1_DMIC_PIN;
+ GPIO_InitStruct.Alternate = AUDIO_DFSDMx_MIC1_DMIC_AF;
+ HAL_GPIO_Init(AUDIO_DFSDMx_MIC1_DMIC_GPIO_PORT, &GPIO_InitStruct);
+ }
+
+ if(hAudioIn.InputDevice > INPUT_DEVICE_DIGITAL_MIC1)
+ {
+ /* Enable DFSDM clock */
+ AUDIO_DFSDMx_MIC2_5_CLK_ENABLE();
+ /* Enable GPIO clock */
+ AUDIO_DFSDMx_MIC2_5_CKOUT_DMIC_GPIO_CLK_ENABLE();
+
+ /* DFSDM MIC2 pins configuration: DFSDM_CKOUT, DMIC_DATIN pins -------------*/
+ GPIO_InitStruct.Pin = AUDIO_DFSDMx_MIC2_5_CKOUT_PIN;
+ GPIO_InitStruct.Alternate = AUDIO_DFSDMx_MIC2_5_CKOUT_DMIC_AF;
+ HAL_GPIO_Init(AUDIO_DFSDMx_MIC2_5_CKOUT_DMIC_GPIO_PORT, &GPIO_InitStruct);
+
+ if(((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC2) == INPUT_DEVICE_DIGITAL_MIC2) ||\
+ ((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC3) == INPUT_DEVICE_DIGITAL_MIC3))
+ {
+ AUDIO_DFSDMx_MIC23_DMIC_GPIO_CLK_ENABLE();
+ GPIO_InitStruct.Pin = AUDIO_DFSDMx_MIC23_DMIC_PIN;
+ GPIO_InitStruct.Alternate = AUDIO_DFSDMx_MIC23_DMIC_AF;
+ HAL_GPIO_Init(AUDIO_DFSDMx_MIC23_DMIC_GPIO_PORT, &GPIO_InitStruct);
+ }
+
+ if(((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC4) == INPUT_DEVICE_DIGITAL_MIC4) ||\
+ ((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC5) == INPUT_DEVICE_DIGITAL_MIC5))
+ {
+
+ AUDIO_DFSDMx_MIC45_DMIC_GPIO_CLK_ENABLE();
+ GPIO_InitStruct.Pin = AUDIO_DFSDMx_MIC45_DMIC_PIN;
+ GPIO_InitStruct.Alternate = AUDIO_DFSDMx_MIC45_DMIC_AF;
+ HAL_GPIO_Init(AUDIO_DFSDMx_MIC45_DMIC_GPIO_PORT, &GPIO_InitStruct);
+ }
+ }
+}
+
+/**
+ * @brief DeInitializes the DFSDM channel MSP.
+ */
+static void DFSDMx_ChannelMspDeInit(void)
+{
+ GPIO_InitTypeDef GPIO_InitStruct;
+
+ if((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC1) == INPUT_DEVICE_DIGITAL_MIC1)
+ {
+ /* DFSDM MIC1 pins configuration: DFSDM_CKOUT, DMIC_DATIN pins -------------*/
+ GPIO_InitStruct.Pin = AUDIO_DFSDMx_MIC1_CKOUT_PIN;
+ HAL_GPIO_DeInit(AUDIO_DFSDMx_MIC1_CKOUT_DMIC_GPIO_PORT, GPIO_InitStruct.Pin);
+
+ GPIO_InitStruct.Pin = AUDIO_DFSDMx_MIC1_DMIC_PIN;
+ HAL_GPIO_DeInit(AUDIO_DFSDMx_MIC1_DMIC_GPIO_PORT, GPIO_InitStruct.Pin);
+ }
+
+ if(hAudioIn.InputDevice > INPUT_DEVICE_DIGITAL_MIC1)
+ {
+ /* DFSDM MIC2, MIC3, MIC4 and MIC5 pins configuration: DFSDM_CKOUT pin -----*/
+ GPIO_InitStruct.Pin = AUDIO_DFSDMx_MIC2_5_CKOUT_PIN;
+ HAL_GPIO_DeInit(AUDIO_DFSDMx_MIC2_5_CKOUT_DMIC_GPIO_PORT, GPIO_InitStruct.Pin);
+
+ if(((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC2) == INPUT_DEVICE_DIGITAL_MIC2) ||\
+ ((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC3) == INPUT_DEVICE_DIGITAL_MIC3))
+ {
+ /* DFSDM MIC2, MIC3 pins configuration: DMIC_DATIN pin -----*/
+ GPIO_InitStruct.Pin = AUDIO_DFSDMx_MIC23_DMIC_PIN;
+ HAL_GPIO_DeInit(AUDIO_DFSDMx_MIC23_DMIC_GPIO_PORT, GPIO_InitStruct.Pin);
+ }
+
+ if(((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC4) == INPUT_DEVICE_DIGITAL_MIC4) ||\
+ ((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC5) == INPUT_DEVICE_DIGITAL_MIC5))
+ {
+ /* DFSDM MIC4, MIC5 pins configuration: DMIC_DATIN pin -----*/
+ GPIO_InitStruct.Pin = AUDIO_DFSDMx_MIC45_DMIC_PIN;
+ HAL_GPIO_DeInit(AUDIO_DFSDMx_MIC45_DMIC_GPIO_PORT, GPIO_InitStruct.Pin);
+ }
+ }
+}
+
+/**
+ * @brief Initializes the DFSDM filter MSP.
+ */
+static void DFSDMx_FilterMspInit(void)
+{
+ uint32_t i = 0, mic_num = 0, mic_init[DFSDM_MIC_NUMBER] = {0};
+ IRQn_Type AUDIO_DFSDM_DMAx_MIC_IRQHandler[DFSDM_MIC_NUMBER] = {AUDIO_DFSDMx_DMAx_MIC1_IRQ, AUDIO_DFSDMx_DMAx_MIC2_IRQ, AUDIO_DFSDMx_DMAx_MIC3_IRQ, AUDIO_DFSDMx_DMAx_MIC4_IRQ, AUDIO_DFSDMx_DMAx_MIC5_IRQ};
+ DMA_Stream_TypeDef* AUDIO_DFSDMx_DMAx_MIC_STREAM[DFSDM_MIC_NUMBER] = {AUDIO_DFSDMx_DMAx_MIC1_STREAM, AUDIO_DFSDMx_DMAx_MIC2_STREAM, AUDIO_DFSDMx_DMAx_MIC3_STREAM, AUDIO_DFSDMx_DMAx_MIC4_STREAM, AUDIO_DFSDMx_DMAx_MIC5_STREAM};
+ uint32_t AUDIO_DFSDMx_DMAx_MIC_CHANNEL[DFSDM_MIC_NUMBER] = {AUDIO_DFSDMx_DMAx_MIC1_CHANNEL, AUDIO_DFSDMx_DMAx_MIC2_CHANNEL, AUDIO_DFSDMx_DMAx_MIC3_CHANNEL, AUDIO_DFSDMx_DMAx_MIC4_CHANNEL, AUDIO_DFSDMx_DMAx_MIC5_CHANNEL};
+
+ /* Enable the DMA clock */
+ AUDIO_DFSDMx_DMAx_CLK_ENABLE();
+
+ for(i = 0; i < hAudioIn.ChannelNbr; i++)
+ {
+ if(((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC1) == INPUT_DEVICE_DIGITAL_MIC1) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC1)] != 1))
+ {
+ mic_num = POS_VAL(INPUT_DEVICE_DIGITAL_MIC1);
+ mic_init[mic_num] = 1;
+ }
+ else if(((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC2) == INPUT_DEVICE_DIGITAL_MIC2) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC2)] != 1))
+ {
+ mic_num = POS_VAL(INPUT_DEVICE_DIGITAL_MIC2);
+ mic_init[mic_num] = 1;
+ }
+ else if(((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC3) == INPUT_DEVICE_DIGITAL_MIC3) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC3)] != 1))
+ {
+ mic_num = POS_VAL(INPUT_DEVICE_DIGITAL_MIC3);
+ mic_init[mic_num] = 1;
+ }
+ else if(((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC4) == INPUT_DEVICE_DIGITAL_MIC4) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC4)] != 1))
+ {
+ mic_num = POS_VAL(INPUT_DEVICE_DIGITAL_MIC4);
+ mic_init[mic_num] = 1;
+ }
+ else if(((hAudioIn.InputDevice & INPUT_DEVICE_DIGITAL_MIC5) == INPUT_DEVICE_DIGITAL_MIC5) && (mic_init[POS_VAL(INPUT_DEVICE_DIGITAL_MIC5)] != 1))
+ {
+ mic_num = POS_VAL(INPUT_DEVICE_DIGITAL_MIC5);
+ mic_init[mic_num] = 1;
+ }
+
+ /* Configure the hDmaDfsdm[i] handle parameters */
+ hDmaDfsdm[mic_num].Init.Channel = AUDIO_DFSDMx_DMAx_MIC_CHANNEL[mic_num];
+ hDmaDfsdm[mic_num].Instance = AUDIO_DFSDMx_DMAx_MIC_STREAM[mic_num];
+ hDmaDfsdm[mic_num].Init.Direction = DMA_PERIPH_TO_MEMORY;
+ hDmaDfsdm[mic_num].Init.PeriphInc = DMA_PINC_DISABLE;
+ hDmaDfsdm[mic_num].Init.MemInc = DMA_MINC_ENABLE;
+ hDmaDfsdm[mic_num].Init.PeriphDataAlignment = AUDIO_DFSDMx_DMAx_PERIPH_DATA_SIZE;
+ hDmaDfsdm[mic_num].Init.MemDataAlignment = AUDIO_DFSDMx_DMAx_MEM_DATA_SIZE;
+ hDmaDfsdm[mic_num].Init.Mode = DMA_CIRCULAR;
+ hDmaDfsdm[mic_num].Init.Priority = DMA_PRIORITY_HIGH;
+ hDmaDfsdm[mic_num].Init.FIFOMode = DMA_FIFOMODE_DISABLE;
+ hDmaDfsdm[mic_num].Init.MemBurst = DMA_MBURST_SINGLE;
+ hDmaDfsdm[mic_num].Init.PeriphBurst = DMA_PBURST_SINGLE;
+ hDmaDfsdm[mic_num].State = HAL_DMA_STATE_RESET;
+
+ /* Associate the DMA handle */
+ __HAL_LINKDMA(&hAudioInDfsdmFilter[mic_num], hdmaReg, hDmaDfsdm[mic_num]);
+
+ /* Reset DMA handle state */
+ __HAL_DMA_RESET_HANDLE_STATE(&hDmaDfsdm[mic_num]);
+
+ /* Configure the DMA Channel */
+ HAL_DMA_Init(&hDmaDfsdm[mic_num]);
+
+ /* DMA IRQ Channel configuration */
+ HAL_NVIC_SetPriority(AUDIO_DFSDM_DMAx_MIC_IRQHandler[mic_num], AUDIO_IN_IRQ_PREPRIO, 0);
+ HAL_NVIC_EnableIRQ(AUDIO_DFSDM_DMAx_MIC_IRQHandler[mic_num]);
+ }
+}
+
+/**
+ * @brief DeInitializes the DFSDM filter MSP.
+ */
+static void DFSDMx_FilterMspDeInit(void)
+{
+ /* Configure the DMA Channel */
+ for(uint32_t i = 0; i < DFSDM_MIC_NUMBER; i++)
+ {
+ if(hDmaDfsdm[i].Instance != NULL)
+ {
+ HAL_DMA_DeInit(&hDmaDfsdm[i]);
+ }
+ }
+}
+
+/**
+ * @brief Initializes the Audio Codec audio interface (I2S)
+ * @note This function assumes that the I2S input clock
+ * is already configured and ready to be used.
+ * @param AudioFreq: Audio frequency to be configured for the I2S peripheral.
+ */
+static void I2Sx_In_Init(uint32_t AudioFreq)
+{
+ /* Initialize the hAudioInI2s and haudio_in_i2sext Instance parameters */
+ haudio_i2s.Instance = AUDIO_IN_I2Sx;
+ haudio_in_i2sext.Instance = I2S3ext;
+
+ /* Disable I2S block */
+ __HAL_I2S_DISABLE(&haudio_i2s);
+ __HAL_I2S_DISABLE(&haudio_in_i2sext);
+
+ /* I2S peripheral configuration */
+ haudio_i2s.Init.AudioFreq = AudioFreq;
+ haudio_i2s.Init.ClockSource = I2S_CLOCK_PLL;
+ haudio_i2s.Init.CPOL = I2S_CPOL_LOW;
+ haudio_i2s.Init.DataFormat = I2S_DATAFORMAT_16B;
+ haudio_i2s.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;
+ haudio_i2s.Init.Mode = I2S_MODE_MASTER_TX;
+ haudio_i2s.Init.Standard = I2S_STANDARD_PHILIPS;
+ haudio_i2s.Init.FullDuplexMode = I2S_FULLDUPLEXMODE_ENABLE;
+ /* Init the I2S */
+ HAL_I2S_Init(&haudio_i2s);
+
+ /* I2Sext peripheral configuration */
+ haudio_in_i2sext.Init.AudioFreq = AudioFreq;
+ haudio_in_i2sext.Init.ClockSource = I2S_CLOCK_PLL;
+ haudio_in_i2sext.Init.CPOL = I2S_CPOL_HIGH;
+ haudio_in_i2sext.Init.DataFormat = I2S_DATAFORMAT_16B;
+ haudio_in_i2sext.Init.MCLKOutput = I2S_MCLKOUTPUT_ENABLE;
+ haudio_in_i2sext.Init.Mode = I2S_MODE_SLAVE_RX;
+ haudio_in_i2sext.Init.Standard = I2S_STANDARD_PHILIPS;
+
+ /* Init the I2Sext */
+ HAL_I2S_Init(&haudio_in_i2sext);
+
+ /* Enable I2S block */
+ __HAL_I2S_ENABLE(&haudio_i2s);
+ __HAL_I2S_ENABLE(&haudio_in_i2sext);
+}
+
+/**
+ * @brief Deinitializes the Audio Codec audio interface (I2S).
+ */
+static void I2Sx_In_DeInit(void)
+{
+ /* Initialize the hAudioInI2s Instance parameter */
+ haudio_i2s.Instance = AUDIO_IN_I2Sx;
+
+ /* Disable I2S block */
+ __HAL_I2S_DISABLE(&haudio_i2s);
+
+ /* DeInit the I2S */
+ HAL_I2S_DeInit(&haudio_i2s);
+
+ /* Initialize the hAudioInI2s Instance parameter */
+ haudio_in_i2sext.Instance = I2S3ext;
+
+ /* Disable I2S block */
+ __HAL_I2S_DISABLE(&haudio_in_i2sext);
+
+ /* DeInit the I2S */
+ HAL_I2S_DeInit(&haudio_in_i2sext);
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/STM32F413H-Discovery/stm32f413h_discovery_audio.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,412 @@
+/**
+ ******************************************************************************
+ * @file stm32f413h_discovery_audio.h
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 27-January-2017
+ * @brief This file contains the common defines and functions prototypes for
+ * the stm32f413h_discovery_audio.c driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2017 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 __STM32F413H_DISCOVERY_AUDIO_H
+#define __STM32F413H_DISCOVERY_AUDIO_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+/* Include audio component Driver */
+#include "../Components/wm8994/wm8994.h"
+#include "stm32f413h_discovery.h"
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY_AUDIO
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_AUDIO_Exported_Types STM32F413H DISCOVERY Audio Exported Types
+ * @{
+ */
+
+typedef struct
+{
+ uint32_t Frequency; /* Record Frequency */
+ uint32_t BitResolution; /* Record bit resolution */
+ uint32_t ChannelNbr; /* Record Channel Number */
+ uint16_t *pRecBuf; /* Pointer to record user buffer */
+ uint32_t RecSize; /* Size to record in mono, double size to record in stereo */
+ uint32_t InputDevice; /* Audio Input Device */
+ uint32_t MultiBuffMode; /* Multi buffer mode selection */
+}AUDIOIN_ContextTypeDef;
+
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_AUDIO_Exported_Constants STM32F413H DISCOVERY Audio Exported Constants
+ * @{
+ */
+
+/*------------------------------------------------------------------------------
+ AUDIO OUT CONFIGURATION
+------------------------------------------------------------------------------*/
+/* SPI Configuration defines */
+#define AUDIO_OUT_I2Sx SPI2
+#define AUDIO_OUT_I2Sx_CLK_ENABLE() __HAL_RCC_SPI2_CLK_ENABLE()
+#define AUDIO_OUT_I2Sx_CLK_DISABLE() __HAL_RCC_SPI2_CLK_DISABLE()
+
+#define AUDIO_OUT_I2Sx_MCK_PIN GPIO_PIN_3
+#define AUDIO_OUT_I2Sx_MCK_GPIO_PORT GPIOA
+#define AUDIO_OUT_I2Sx_MCK_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
+#define AUDIO_OUT_I2Sx_MCK_GPIO_CLK_DISABLE() __HAL_RCC_GPIOA_CLK_DISABLE()
+#define AUDIO_OUT_I2Sx_MCK_AF GPIO_AF5_SPI2
+
+#define AUDIO_OUT_I2Sx_SCK_PIN GPIO_PIN_3
+#define AUDIO_OUT_I2Sx_SCK_GPIO_PORT GPIOD
+#define AUDIO_OUT_I2Sx_SCK_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE()
+#define AUDIO_OUT_I2Sx_SCK_GPIO_CLK_DISABLE() __HAL_RCC_GPIOD_CLK_DISABLE()
+#define AUDIO_OUT_I2Sx_SCK_AF GPIO_AF5_SPI2
+
+#define AUDIO_OUT_I2Sx_WS_PIN GPIO_PIN_9
+#define AUDIO_OUT_I2Sx_WS_GPIO_PORT GPIOB
+#define AUDIO_OUT_I2Sx_WS_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
+#define AUDIO_OUT_I2Sx_WS_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE()
+#define AUDIO_OUT_I2Sx_WS_AF GPIO_AF5_SPI2
+
+#define AUDIO_OUT_I2Sx_SD_PIN GPIO_PIN_3
+#define AUDIO_OUT_I2Sx_SD_GPIO_PORT GPIOC
+#define AUDIO_OUT_I2Sx_SD_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE()
+#define AUDIO_OUT_I2Sx_SD_GPIO_CLK_DISABLE() __HAL_RCC_GPIOC_CLK_DISABLE()
+#define AUDIO_OUT_I2Sx_SD_AF GPIO_AF5_SPI2
+
+/* I2S DMA Stream Tx definitions */
+#define AUDIO_OUT_I2Sx_DMAx_CLK_ENABLE() __HAL_RCC_DMA1_CLK_ENABLE()
+#define AUDIO_OUT_I2Sx_DMAx_CLK_DISABLE() __HAL_RCC_DMA1_CLK_DISABLE()
+#define AUDIO_OUT_I2Sx_DMAx_STREAM DMA1_Stream4
+#define AUDIO_OUT_I2Sx_DMAx_CHANNEL DMA_CHANNEL_0
+#define AUDIO_OUT_I2Sx_DMAx_IRQ DMA1_Stream4_IRQn
+#define AUDIO_OUT_I2Sx_DMAx_PERIPH_DATA_SIZE DMA_PDATAALIGN_HALFWORD
+#define AUDIO_OUT_I2Sx_DMAx_MEM_DATA_SIZE DMA_MDATAALIGN_HALFWORD
+#define DMA_MAX_SIZE 0xFFFF
+
+#define AUDIO_OUT_I2Sx_DMAx_IRQHandler DMA1_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
+------------------------------------------------------------------------------*/
+/* DFSDM Configuration defines */
+#define AUDIO_DFSDMx_MIC1_CHANNEL DFSDM1_Channel1 /* MP34DT01TR U1 microphone on PCB top side */
+#define AUDIO_DFSDMx_MIC2_CHANNEL DFSDM2_Channel1 /* MP34DT01TR U2 microphone on PCB top side */
+#define AUDIO_DFSDMx_MIC3_CHANNEL DFSDM2_Channel0 /* MP34DT01TR U3 microphone on PCB top side */
+#define AUDIO_DFSDMx_MIC4_CHANNEL DFSDM2_Channel7 /* MP34DT01TR U4 microphone on PCB top side */
+#define AUDIO_DFSDMx_MIC5_CHANNEL DFSDM2_Channel6 /* MP34DT01TR U5 microphone on PCB top side */
+
+#define AUDIO_DFSDMx_MIC1_CHANNEL_FOR_FILTER DFSDM_CHANNEL_1
+#define AUDIO_DFSDMx_MIC2_CHANNEL_FOR_FILTER DFSDM_CHANNEL_1
+#define AUDIO_DFSDMx_MIC3_CHANNEL_FOR_FILTER DFSDM_CHANNEL_0
+#define AUDIO_DFSDMx_MIC4_CHANNEL_FOR_FILTER DFSDM_CHANNEL_7
+#define AUDIO_DFSDMx_MIC5_CHANNEL_FOR_FILTER DFSDM_CHANNEL_6
+
+#define AUDIO_DFSDMx_MIC1_FILTER DFSDM1_Filter0 /* Common MIC1 filter for MP34DT01TR (U1) microphone input */
+#define AUDIO_DFSDMx_MIC2_FILTER DFSDM2_Filter0 /* Common MIC2 filter for MP34DT01TR(U2) microphone input */
+#define AUDIO_DFSDMx_MIC3_FILTER DFSDM2_Filter1 /* Common MIC2 filter for MP34DT01TR(U3) microphone input */
+#define AUDIO_DFSDMx_MIC4_FILTER DFSDM2_Filter2 /* Common MIC2 filter for MP34DT01TR(U4) microphone input */
+#define AUDIO_DFSDMx_MIC5_FILTER DFSDM2_Filter3 /* Common MIC2 filter for MP34DT01TR(U5) microphone input */
+
+#define AUDIO_DFSDMx_MIC2_5_CLK_ENABLE() __HAL_RCC_DFSDM2_CLK_ENABLE()
+#define AUDIO_DFSDMx_MIC1_CLK_ENABLE() __HAL_RCC_DFSDM1_CLK_ENABLE()
+
+#define AUDIO_DFSDMx_MIC1_CKOUT_PIN GPIO_PIN_8
+#define AUDIO_DFSDMx_MIC1_CKOUT_DMIC_GPIO_PORT GPIOA
+#define AUDIO_DFSDMx_MIC1_CKOUT_DMIC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
+#define AUDIO_DFSDMx_MIC1_CKOUT_DMIC_AF GPIO_AF6_DFSDM1
+
+#define AUDIO_DFSDMx_MIC1_DMIC_PIN GPIO_PIN_6
+#define AUDIO_DFSDMx_MIC1_DMIC_GPIO_PORT GPIOD
+#define AUDIO_DFSDMx_MIC1_DMIC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE()
+#define AUDIO_DFSDMx_MIC1_DMIC_AF GPIO_AF6_DFSDM1
+
+#define AUDIO_DFSDMx_MIC2_5_CKOUT_PIN GPIO_PIN_2
+#define AUDIO_DFSDMx_MIC2_5_CKOUT_DMIC_GPIO_PORT GPIOD
+#define AUDIO_DFSDMx_MIC2_5_CKOUT_DMIC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOD_CLK_ENABLE()
+#define AUDIO_DFSDMx_MIC2_5_CKOUT_DMIC_AF GPIO_AF3_DFSDM2
+
+#define AUDIO_DFSDMx_MIC23_DMIC_PIN GPIO_PIN_7
+#define AUDIO_DFSDMx_MIC23_DMIC_GPIO_PORT GPIOA
+#define AUDIO_DFSDMx_MIC23_DMIC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE()
+#define AUDIO_DFSDMx_MIC23_DMIC_AF GPIO_AF7_DFSDM2
+
+#define AUDIO_DFSDMx_MIC45_DMIC_PIN GPIO_PIN_7
+#define AUDIO_DFSDMx_MIC45_DMIC_GPIO_PORT GPIOB
+#define AUDIO_DFSDMx_MIC45_DMIC_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
+#define AUDIO_DFSDMx_MIC45_DMIC_AF GPIO_AF6_DFSDM2
+
+/* DFSDM DMA Right and Left channels definitions */
+#define AUDIO_DFSDMx_DMAx_CLK_ENABLE() __HAL_RCC_DMA2_CLK_ENABLE()
+#define AUDIO_DFSDMx_DMAx_MIC1_STREAM DMA2_Stream6
+#define AUDIO_DFSDMx_DMAx_MIC1_CHANNEL DMA_CHANNEL_3
+#define AUDIO_DFSDMx_DMAx_MIC2_STREAM DMA2_Stream0
+#define AUDIO_DFSDMx_DMAx_MIC2_CHANNEL DMA_CHANNEL_8
+#define AUDIO_DFSDMx_DMAx_MIC3_STREAM DMA2_Stream1
+#define AUDIO_DFSDMx_DMAx_MIC3_CHANNEL DMA_CHANNEL_8
+#define AUDIO_DFSDMx_DMAx_MIC4_STREAM DMA2_Stream2
+#define AUDIO_DFSDMx_DMAx_MIC4_CHANNEL DMA_CHANNEL_8
+#define AUDIO_DFSDMx_DMAx_MIC5_STREAM DMA2_Stream7
+#define AUDIO_DFSDMx_DMAx_MIC5_CHANNEL DMA_CHANNEL_8
+#define AUDIO_DFSDMx_DMAx_MIC1_IRQ DMA2_Stream6_IRQn
+#define AUDIO_DFSDMx_DMAx_MIC2_IRQ DMA2_Stream0_IRQn
+#define AUDIO_DFSDMx_DMAx_MIC3_IRQ DMA2_Stream1_IRQn
+#define AUDIO_DFSDMx_DMAx_MIC4_IRQ DMA2_Stream2_IRQn
+#define AUDIO_DFSDMx_DMAx_MIC5_IRQ DMA2_Stream7_IRQn
+
+#define AUDIO_DFSDMx_DMAx_PERIPH_DATA_SIZE DMA_PDATAALIGN_WORD
+#define AUDIO_DFSDMx_DMAx_MEM_DATA_SIZE DMA_MDATAALIGN_WORD
+
+#define AUDIO_DFSDM_DMAx_MIC1_IRQHandler DMA2_Stream6_IRQHandler
+#define AUDIO_DFSDM_DMAx_MIC2_IRQHandler DMA2_Stream0_IRQHandler
+#define AUDIO_DFSDM_DMAx_MIC3_IRQHandler DMA2_Stream1_IRQHandler
+#define AUDIO_DFSDM_DMAx_MIC4_IRQHandler DMA2_Stream2_IRQHandler
+#define AUDIO_DFSDM_DMAx_MIC5_IRQHandler DMA2_Stream7_IRQHandler
+
+
+/* Select the interrupt preemption priority and subpriority for the IT/DMA interrupt */
+#define AUDIO_IN_IRQ_PREPRIO 0x0F /* Select the preemption priority level(0 is the highest) */
+
+/* HW defines for Analog mic configuration */
+#define AUDIO_IN_I2Sx SPI3
+#define AUDIO_IN_I2Sx_CLK_ENABLE() __HAL_RCC_SPI3_CLK_ENABLE()
+#define AUDIO_IN_I2Sx_CLK_DISABLE() __HAL_RCC_SPI3_CLK_DISABLE()
+
+#define AUDIO_IN_I2Sx_EXT_SD_PIN GPIO_PIN_4
+#define AUDIO_IN_I2Sx_EXT_SD_GPIO_PORT GPIOB
+#define AUDIO_IN_I2Sx_EXT_SD_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
+#define AUDIO_IN_I2Sx_EXT_SD_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE()
+#define AUDIO_IN_I2Sx_EXT_SD_AF GPIO_AF7_SPI3
+
+#define AUDIO_IN_CODEC_INT_PIN GPIO_PIN_2
+#define AUDIO_IN_CODEC_INT_GPIO_PORT GPIOG
+#define AUDIO_IN_CODEC_INT_GPIO_CLK_ENABLE() __HAL_RCC_GPIOG_CLK_ENABLE()
+#define AUDIO_IN_CODEC_INT_GPIO_CLK_DISABLE() __HAL_RCC_GPIOG_CLK_DISABLE()
+#define AUDIO_IN_CODEC_INT_IRQ EXTI2_IRQn
+
+/* I2S DMA Stream Rx definitions */
+#define AUDIO_IN_I2Sx_DMAx_CLK_ENABLE() __HAL_RCC_DMA1_CLK_ENABLE()
+#define AUDIO_IN_I2Sx_DMAx_CLK_DISABLE() __HAL_RCC_DMA1_CLK_DISABLE()
+#define AUDIO_IN_I2Sx_DMAx_STREAM DMA1_Stream0
+#define AUDIO_IN_I2Sx_DMAx_CHANNEL DMA_CHANNEL_3
+#define AUDIO_IN_I2Sx_DMAx_IRQ DMA1_Stream0_IRQn
+#define AUDIO_IN_I2Sx_DMAx_PERIPH_DATA_SIZE DMA_PDATAALIGN_HALFWORD
+#define AUDIO_IN_I2Sx_DMAx_MEM_DATA_SIZE DMA_MDATAALIGN_HALFWORD
+
+#define AUDIO_IN_I2Sx_DMAx_IRQHandler DMA1_Stream0_IRQHandler
+#define AUDIO_IN_I2Sx_DMAx_IRQ DMA1_Stream0_IRQn
+
+/*------------------------------------------------------------------------------
+ CONFIGURATION: Audio Driver Configuration parameters
+------------------------------------------------------------------------------*/
+
+#define AUDIODATA_SIZE 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)
+
+/* Audio out parameters */
+#define DEFAULT_AUDIO_OUT_FREQ I2S_AUDIOFREQ_48K
+#define DEFAULT_AUDIO_OUT_BIT_RESOLUTION ((uint8_t)16)
+#define DEFAULT_AUDIO_OUT_CHANNEL_NBR ((uint8_t)2) /* Mono = 1, Stereo = 2 */
+#define DEFAULT_AUDIO_OUT_VOLUME ((uint16_t)64)
+
+/* Audio in parameters */
+#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)
+
+/*------------------------------------------------------------------------------
+ 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 */
+
+/*------------------------------------------------------------------------------
+ INPUT DEVICES definition
+------------------------------------------------------------------------------*/
+/* Analog microphone input from 3.5 audio jack connector */
+#define INPUT_DEVICE_ANALOG_MIC ((uint32_t)0x00000001)
+/* MP34DT01TR digital microphone on PCB top side */
+#define INPUT_DEVICE_DIGITAL_MIC1 ((uint32_t)0x00000010)
+#define INPUT_DEVICE_DIGITAL_MIC2 ((uint32_t)0x00000020)
+#define INPUT_DEVICE_DIGITAL_MIC3 ((uint32_t)0x00000040)
+#define INPUT_DEVICE_DIGITAL_MIC4 ((uint32_t)0x00000080)
+#define INPUT_DEVICE_DIGITAL_MIC5 ((uint32_t)0x00000100)
+#define INPUT_DEVICE_DIGITAL_MIC ((uint32_t)(INPUT_DEVICE_DIGITAL_MIC1 | INPUT_DEVICE_DIGITAL_MIC2))
+#define INPUT_DEVICE_DIGITAL_MIC_ALL ((uint32_t)(INPUT_DEVICE_DIGITAL_MIC1 | INPUT_DEVICE_DIGITAL_MIC2 |\
+ INPUT_DEVICE_DIGITAL_MIC3 | INPUT_DEVICE_DIGITAL_MIC4 |\
+ INPUT_DEVICE_DIGITAL_MIC5))
+
+#define DFSDM_MIC_NUMBER (5)
+
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_AUDIO_Exported_Variables STM32F413H DISCOVERY Audio Exported Variables
+ * @{
+ */
+extern __IO uint16_t AudioInVolume;
+ /**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_AUDIO_Exported_Macros STM32F413H DISCOVERY Audio Exported Macros
+ * @{
+ */
+#define DMA_MAX(x) (((x) <= DMA_MAX_SIZE)? (x):DMA_MAX_SIZE)
+#define POS_VAL(VAL) (POSITION_VAL(VAL) - 4)
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_AUDIO_OUT_Exported_Functions STM32F413H 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);
+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(I2S_HandleTypeDef *hi2s, uint32_t AudioFreq, void *Params);
+void BSP_AUDIO_OUT_MspInit(I2S_HandleTypeDef *hi2s, void *Params);
+void BSP_AUDIO_OUT_MspDeInit(I2S_HandleTypeDef *hi2s, void *Params);
+
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_AUDIO_IN_Exported_Functions STM32F413H DISCOVERY AudioIN Exported Functions
+ * @{
+ */
+uint8_t BSP_AUDIO_IN_Init(uint32_t AudioFreq, uint32_t BitRes, uint32_t ChnlNbr);
+uint8_t BSP_AUDIO_IN_InitEx(uint32_t InputDevice, uint32_t AudioFreq, uint32_t BitRes, uint32_t ChnlNbr);
+uint8_t BSP_AUDIO_IN_ConfigMicDefault(uint32_t InputDevice);
+uint8_t BSP_AUDIO_IN_ConfigDigitalMic(uint32_t InputDevice, void *Params);
+uint8_t BSP_AUDIO_IN_AllocScratch (int32_t *pScratch, uint32_t size);
+uint8_t BSP_AUDIO_IN_Record(uint16_t *pBuf, uint32_t Size);
+uint8_t BSP_AUDIO_IN_RecordEx(uint32_t *pBuf, uint32_t Size);
+uint8_t BSP_AUDIO_IN_SetFrequency(uint32_t AudioFreq);
+uint8_t BSP_AUDIO_IN_Stop(void);
+uint8_t BSP_AUDIO_IN_StopEx(uint32_t InputDevice);
+uint8_t BSP_AUDIO_IN_Pause(void);
+uint8_t BSP_AUDIO_IN_PauseEx(uint32_t InputDevice);
+uint8_t BSP_AUDIO_IN_Resume(void);
+uint8_t BSP_AUDIO_IN_ResumeEx(uint32_t *pBuf, uint32_t InputDevice);
+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);
+void BSP_AUDIO_IN_TransferComplete_CallBackEx(uint32_t InputDevice);
+void BSP_AUDIO_IN_HalfTransfer_CallBackEx(uint32_t InputDevice);
+
+/* 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 */
+uint8_t BSP_AUDIO_IN_ClockConfig(uint32_t AudioFreq, void *Params);
+void BSP_AUDIO_IN_MspInit(void *Params);
+void BSP_AUDIO_IN_MspDeInit(void *Params);
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32F413H_DISCOVERY_AUDIO_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/STM32F413H-Discovery/stm32f413h_discovery_lcd.c Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,1131 @@
+/**
+ ******************************************************************************
+ * @file stm32f413h_discovery_lcd.c
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 27-January-2017
+ * @brief This file includes the driver for Liquid Crystal Display (LCD) module
+ * mounted on STM32F413H-DISCOVERY board.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2017 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.
+ *
+ ******************************************************************************
+ */
+
+/* File Info : -----------------------------------------------------------------
+ User NOTES
+1. How To use this driver:
+--------------------------
+ - This driver is used to drive indirectly an LCD TFT.
+ - This driver supports the LS016B8UY LCD.
+ - The LS016B8UY component driver MUST be included with this driver.
+
+2. Driver description:
+---------------------
+ + Initialization steps:
+ o Initialize the LCD using the BSP_LCD_Init() function.
+
+ + 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.
+
+------------------------------------------------------------------------------*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f413h_discovery_lcd.h"
+#include "../../../Utilities/Fonts/fonts.h"
+#include "../../../Utilities/Fonts/font24.c"
+#include "../../../Utilities/Fonts/font20.c"
+#include "../../../Utilities/Fonts/font16.c"
+#include "../../../Utilities/Fonts/font12.c"
+#include "../../../Utilities/Fonts/font8.c"
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LCD STM32F413H_DISCOVERY LCD
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LCD_Private_Macros STM32F413H DISCOVERY LCD Private Macros
+ * @{
+ */
+#define POLY_X(Z) ((int32_t)((Points + Z)->X))
+#define POLY_Y(Z) ((int32_t)((Points + Z)->Y))
+#define ABS(X) ((X) > 0 ? (X) : -(X))
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LCD_Private_Variables STM32F413H DISCOVERY LCD Private Variables
+ * @{
+ */
+LCD_DrawPropTypeDef DrawProp;
+static LCD_DrvTypeDef *LcdDrv;
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LCD_Private_FunctionPrototypes STM32F413H DISCOVERY LCD Private Functions Prototypes
+ * @{
+ */
+static void DrawChar(uint16_t Xpos, uint16_t Ypos, const uint8_t *c);
+static void SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);
+static void FillTriangle(uint16_t x1, uint16_t x2, uint16_t x3, uint16_t y1, uint16_t y2, uint16_t y3);
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LCD_Private_Functions STM32F413H DISCOVERY LCD Private Functions
+ * @{
+ */
+/**
+ * @brief Initializes the LCD.
+ * @retval LCD state
+ */
+uint8_t BSP_LCD_Init(void)
+{
+ return (BSP_LCD_InitEx(LCD_ORIENTATION_LANDSCAPE));
+}
+/**
+ * @brief Initializes the LCD with a given orientation.
+ * @param orientation: LCD_ORIENTATION_PORTRAIT or LCD_ORIENTATION_LANDSCAPE
+ * or LCD_ORIENTATION_LANDSCAPE_ROT180
+ * @retval LCD state
+ */
+uint8_t BSP_LCD_InitEx(uint32_t orientation)
+{
+ uint8_t ret = LCD_ERROR;
+
+ /* Default value for draw propriety */
+ DrawProp.BackColor = 0xFFFF;
+ DrawProp.pFont = &Font24;
+ DrawProp.TextColor = 0x0000;
+
+ /* Initialize LCD special pins GPIOs */
+ BSP_LCD_MspInit();
+
+ /* Backlight control signal assertion */
+ HAL_GPIO_WritePin(LCD_BL_CTRL_GPIO_PORT, LCD_BL_CTRL_PIN, GPIO_PIN_SET);
+
+ /* Apply hardware reset according to procedure indicated in FRD154BP2901 documentation */
+ HAL_GPIO_WritePin(LCD_RESET_GPIO_PORT, LCD_RESET_PIN, GPIO_PIN_RESET);
+ HAL_Delay(5); /* Reset signal asserted during 5ms */
+ HAL_GPIO_WritePin(LCD_RESET_GPIO_PORT, LCD_RESET_PIN, GPIO_PIN_SET);
+ HAL_Delay(10); /* Reset signal released during 10ms */
+ HAL_GPIO_WritePin(LCD_RESET_GPIO_PORT, LCD_RESET_PIN, GPIO_PIN_RESET);
+ HAL_Delay(20); /* Reset signal asserted during 20ms */
+ HAL_GPIO_WritePin(LCD_RESET_GPIO_PORT, LCD_RESET_PIN, GPIO_PIN_SET);
+ HAL_Delay(10); /* Reset signal released during 10ms */
+
+ if(ST7789H2_drv.ReadID() == ST7789H2_ID)
+ {
+ LcdDrv = &ST7789H2_drv;
+
+ /* LCD Init */
+ LcdDrv->Init();
+
+ if(orientation == LCD_ORIENTATION_PORTRAIT)
+ {
+ ST7789H2_SetOrientation(ST7789H2_ORIENTATION_PORTRAIT);
+ }
+ else if(orientation == LCD_ORIENTATION_LANDSCAPE_ROT180)
+ {
+ ST7789H2_SetOrientation(ST7789H2_ORIENTATION_LANDSCAPE_ROT180);
+ }
+ else
+ {
+ /* Default landscape orientation is selected */
+ }
+ /* Initialize the font */
+ BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
+
+ ret = LCD_OK;
+ }
+
+ return ret;
+}
+
+/**
+ * @brief DeInitializes the LCD.
+ * @retval LCD state
+ */
+uint8_t BSP_LCD_DeInit(void)
+{
+ /* Actually LcdDrv does not provide a DeInit function */
+ return LCD_OK;
+}
+
+/**
+ * @brief Gets the LCD X size.
+ * @retval Used LCD X size
+ */
+uint32_t BSP_LCD_GetXSize(void)
+{
+ return(LcdDrv->GetLcdPixelWidth());
+}
+
+/**
+ * @brief Gets the LCD Y size.
+ * @retval Used LCD Y size
+ */
+uint32_t BSP_LCD_GetYSize(void)
+{
+ return(LcdDrv->GetLcdPixelHeight());
+}
+
+/**
+ * @brief Gets the LCD text color.
+ * @retval Used text color.
+ */
+uint16_t BSP_LCD_GetTextColor(void)
+{
+ return DrawProp.TextColor;
+}
+
+/**
+ * @brief Gets the LCD background color.
+ * @retval Used background color
+ */
+uint16_t BSP_LCD_GetBackColor(void)
+{
+ return DrawProp.BackColor;
+}
+
+/**
+ * @brief Sets the LCD text color.
+ * @param Color: Text color code
+ */
+void BSP_LCD_SetTextColor(uint16_t Color)
+{
+ DrawProp.TextColor = Color;
+}
+
+/**
+ * @brief Sets the LCD background color.
+ * @param Color: Background color code
+ */
+void BSP_LCD_SetBackColor(uint16_t Color)
+{
+ DrawProp.BackColor = Color;
+}
+
+/**
+ * @brief Sets the LCD text font.
+ * @param fonts: Font to be used
+ */
+void BSP_LCD_SetFont(sFONT *fonts)
+{
+ DrawProp.pFont = fonts;
+}
+
+/**
+ * @brief Gets the LCD text font.
+ * @retval Used font
+ */
+sFONT *BSP_LCD_GetFont(void)
+{
+ return DrawProp.pFont;
+}
+
+/**
+ * @brief Clears the hole LCD.
+ * @param Color: Color of the background
+ */
+void BSP_LCD_Clear(uint16_t Color)
+{
+ uint32_t counter = 0;
+ uint32_t y_size = 0;
+ uint32_t color_backup = DrawProp.TextColor;
+
+ DrawProp.TextColor = Color;
+ y_size = BSP_LCD_GetYSize();
+
+ for(counter = 0; counter < y_size; counter++)
+ {
+ BSP_LCD_DrawHLine(0, counter, BSP_LCD_GetXSize());
+ }
+ DrawProp.TextColor = color_backup;
+ BSP_LCD_SetTextColor(DrawProp.TextColor);
+}
+
+/**
+ * @brief Clears the selected line.
+ * @param Line: Line to be cleared
+ * This parameter can be one of the following values:
+ * @arg 0..9: if the Current fonts is Font16x24
+ * @arg 0..19: if the Current fonts is Font12x12 or Font8x12
+ * @arg 0..29: if the Current fonts is Font8x8
+ */
+void BSP_LCD_ClearStringLine(uint16_t Line)
+{
+ uint32_t color_backup = DrawProp.TextColor;
+
+ DrawProp.TextColor = DrawProp.BackColor;;
+
+ /* Draw a rectangle with background color */
+ BSP_LCD_FillRect(0, (Line * DrawProp.pFont->Height), BSP_LCD_GetXSize(), DrawProp.pFont->Height);
+
+ DrawProp.TextColor = color_backup;
+ BSP_LCD_SetTextColor(DrawProp.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
+ */
+void BSP_LCD_DisplayChar(uint16_t Xpos, uint16_t Ypos, uint8_t Ascii)
+{
+ DrawChar(Xpos, Ypos, &DrawProp.pFont->table[(Ascii-' ') *\
+ DrawProp.pFont->Height * ((DrawProp.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
+ */
+void BSP_LCD_DisplayStringAt(uint16_t Xpos, uint16_t Ypos, uint8_t *Text, Line_ModeTypdef Mode)
+{
+ uint16_t refcolumn = 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.pFont->Width);
+
+ switch (Mode)
+ {
+ case CENTER_MODE:
+ {
+ refcolumn = Xpos + ((xsize - size)* DrawProp.pFont->Width) / 2;
+ break;
+ }
+ case LEFT_MODE:
+ {
+ refcolumn = Xpos;
+ break;
+ }
+ case RIGHT_MODE:
+ {
+ refcolumn = - Xpos + ((xsize - size)*DrawProp.pFont->Width);
+ break;
+ }
+ default:
+ {
+ refcolumn = Xpos;
+ break;
+ }
+ }
+
+ /* Check that the Start column is located in the screen */
+ if ((refcolumn < 1) || (refcolumn >= 0x8000))
+ {
+ refcolumn = 1;
+ }
+
+ /* Send the string character by character on lCD */
+ while ((*Text != 0) & (((BSP_LCD_GetXSize() - (i*DrawProp.pFont->Width)) & 0xFFFF) >= DrawProp.pFont->Width))
+ {
+ /* Display one character on LCD */
+ BSP_LCD_DisplayChar(refcolumn, Ypos, *Text);
+ /* Decrement the column position by 16 */
+ refcolumn += DrawProp.pFont->Width;
+ /* Point on the next character */
+ Text++;
+ i++;
+ }
+}
+
+/**
+ * @brief Displays a character on the LCD.
+ * @param Line: Line where to display the character shape
+ * This parameter can be one of the following values:
+ * @arg 0..9: if the Current fonts is Font16x24
+ * @arg 0..19: if the Current fonts is Font12x12 or Font8x12
+ * @arg 0..29: if the Current fonts is Font8x8
+ * @param ptr: Pointer to string to display on LCD
+ */
+void BSP_LCD_DisplayStringAtLine(uint16_t Line, uint8_t *ptr)
+{
+ BSP_LCD_DisplayStringAt(0, LINE(Line), ptr, LEFT_MODE);
+}
+
+/**
+ * @brief Reads an LCD pixel.
+ * @param Xpos: X position
+ * @param Ypos: Y position
+ * @retval RGB pixel color
+ */
+uint16_t BSP_LCD_ReadPixel(uint16_t Xpos, uint16_t Ypos)
+{
+ uint16_t ret = 0;
+
+ if(LcdDrv->ReadPixel != NULL)
+ {
+ ret = LcdDrv->ReadPixel(Xpos, Ypos);
+ }
+
+ return ret;
+}
+
+/**
+ * @brief Draws a pixel on LCD.
+ * @param Xpos: X position
+ * @param Ypos: Y position
+ * @param RGB_Code: Pixel color in RGB mode (5-6-5)
+ */
+void BSP_LCD_DrawPixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGB_Code)
+{
+ if(LcdDrv->WritePixel != NULL)
+ {
+ LcdDrv->WritePixel(Xpos, Ypos, RGB_Code);
+ }
+}
+
+/**
+ * @brief Draws an horizontal line.
+ * @param Xpos: X position
+ * @param Ypos: Y position
+ * @param Length: Line length
+ */
+void BSP_LCD_DrawHLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length)
+{
+ uint32_t index = 0;
+
+ if(LcdDrv->DrawHLine != NULL)
+ {
+ LcdDrv->DrawHLine(DrawProp.TextColor, Xpos, Ypos, Length);
+ }
+ else
+ {
+ for(index = 0; index < Length; index++)
+ {
+ BSP_LCD_DrawPixel((Xpos + index), Ypos, DrawProp.TextColor);
+ }
+ }
+}
+
+/**
+ * @brief Draws a vertical line.
+ * @param Xpos: X position
+ * @param Ypos: Y position
+ * @param Length: Line length
+ */
+void BSP_LCD_DrawVLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length)
+{
+ uint32_t index = 0;
+
+ if(LcdDrv->DrawVLine != NULL)
+ {
+ LcdDrv->DrawVLine(DrawProp.TextColor, Xpos, Ypos, Length);
+ }
+ else
+ {
+ for(index = 0; index < Length; index++)
+ {
+ BSP_LCD_DrawPixel(Xpos, Ypos + index, DrawProp.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
+ */
+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, numadd = 0, numpixels = 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;
+ numadd = deltay;
+ numpixels = 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;
+ numadd = deltax;
+ numpixels = deltay; /* There are more y-values than x-values */
+ }
+
+ for (curpixel = 0; curpixel <= numpixels; curpixel++)
+ {
+ BSP_LCD_DrawPixel(x, y, DrawProp.TextColor); /* Draw the current pixel */
+ num += numadd; /* 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
+ */
+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
+ */
+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.TextColor);
+
+ BSP_LCD_DrawPixel((Xpos - current_x), (Ypos - current_y), DrawProp.TextColor);
+
+ BSP_LCD_DrawPixel((Xpos + current_y), (Ypos - current_x), DrawProp.TextColor);
+
+ BSP_LCD_DrawPixel((Xpos - current_y), (Ypos - current_x), DrawProp.TextColor);
+
+ BSP_LCD_DrawPixel((Xpos + current_x), (Ypos + current_y), DrawProp.TextColor);
+
+ BSP_LCD_DrawPixel((Xpos - current_x), (Ypos + current_y), DrawProp.TextColor);
+
+ BSP_LCD_DrawPixel((Xpos + current_y), (Ypos + current_x), DrawProp.TextColor);
+
+ BSP_LCD_DrawPixel((Xpos - current_y), (Ypos + current_x), DrawProp.TextColor);
+
+ /* Initialize the font */
+ BSP_LCD_SetFont(&LCD_DEFAULT_FONT);
+
+ 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
+ */
+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
+ */
+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.TextColor);
+ BSP_LCD_DrawPixel((Xpos+(uint16_t)(x/k)), (Ypos+y), DrawProp.TextColor);
+ BSP_LCD_DrawPixel((Xpos+(uint16_t)(x/k)), (Ypos-y), DrawProp.TextColor);
+ BSP_LCD_DrawPixel((Xpos-(uint16_t)(x/k)), (Ypos-y), DrawProp.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 bitmap picture (16 bpp).
+ * @param Xpos: Bmp X position in the LCD
+ * @param Ypos: Bmp Y position in the LCD
+ * @param pbmp: Pointer to Bmp picture address.
+ */
+void BSP_LCD_DrawBitmap(uint16_t Xpos, uint16_t Ypos, uint8_t *pbmp)
+{
+ uint32_t height = 0;
+ uint32_t width = 0;
+
+ /* Read bitmap width */
+ width = *(uint16_t *) (pbmp + 18);
+ width |= (*(uint16_t *) (pbmp + 20)) << 16;
+
+ /* Read bitmap height */
+ height = *(uint16_t *) (pbmp + 22);
+ height |= (*(uint16_t *) (pbmp + 24)) << 16;
+
+ SetDisplayWindow(Xpos, Ypos, width, height);
+
+ if(LcdDrv->DrawBitmap != NULL)
+ {
+ LcdDrv->DrawBitmap(Xpos, Ypos, pbmp);
+ }
+ SetDisplayWindow(0, 0, BSP_LCD_GetXSize(), BSP_LCD_GetYSize());
+}
+
+/**
+ * @brief Draws RGB Image (16 bpp).
+ * @param Xpos: X position in the LCD
+ * @param Ypos: Y position in the LCD
+ * @param Xsize: X size in the LCD
+ * @param Ysize: Y size in the LCD
+ * @param pdata: Pointer to the RGB Image address.
+ */
+void BSP_LCD_DrawRGBImage(uint16_t Xpos, uint16_t Ypos, uint16_t Xsize, uint16_t Ysize, uint8_t *pdata)
+{
+
+ SetDisplayWindow(Xpos, Ypos, Xsize, Ysize);
+
+ if(LcdDrv->DrawRGBImage != NULL)
+ {
+ LcdDrv->DrawRGBImage(Xpos, Ypos, Xsize, Ysize, pdata);
+ }
+ SetDisplayWindow(0, 0, BSP_LCD_GetXSize(), BSP_LCD_GetYSize());
+}
+
+/**
+ * @brief Draws a full rectangle.
+ * @param Xpos: X position
+ * @param Ypos: Y position
+ * @param Width: Rectangle width
+ * @param Height: Rectangle height
+ */
+void BSP_LCD_FillRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
+{
+ BSP_LCD_SetTextColor(DrawProp.TextColor);
+ do
+ {
+ BSP_LCD_DrawHLine(Xpos, Ypos++, Width);
+ }
+ while(Height--);
+}
+
+/**
+ * @brief Draws a full circle.
+ * @param Xpos: X position
+ * @param Ypos: Y position
+ * @param Radius: Circle radius
+ */
+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.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.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
+ */
+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
+ */
+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.
+ */
+void BSP_LCD_DisplayOn(void)
+{
+ LcdDrv->DisplayOn();
+}
+
+/**
+ * @brief Disables the display.
+ */
+void BSP_LCD_DisplayOff(void)
+{
+ LcdDrv->DisplayOff();
+}
+
+/**
+ * @brief Initializes the LCD GPIO special pins MSP.
+ */
+__weak void BSP_LCD_MspInit(void)
+{
+ GPIO_InitTypeDef gpio_init_structure;
+
+ /* Enable GPIOs clock */
+ LCD_RESET_GPIO_CLK_ENABLE();
+ LCD_TE_GPIO_CLK_ENABLE();
+ LCD_BL_CTRL_GPIO_CLK_ENABLE();
+
+ /* LCD_RESET GPIO configuration */
+ gpio_init_structure.Pin = LCD_RESET_PIN; /* LCD_RESET pin has to be manually controlled */
+ gpio_init_structure.Pull = GPIO_NOPULL;
+ gpio_init_structure.Speed = GPIO_SPEED_FAST;
+ gpio_init_structure.Mode = GPIO_MODE_OUTPUT_PP;
+ HAL_GPIO_Init(LCD_RESET_GPIO_PORT, &gpio_init_structure);
+
+ /* LCD_TE GPIO configuration */
+ gpio_init_structure.Pin = LCD_TE_PIN; /* LCD_TE pin has to be manually managed */
+ gpio_init_structure.Mode = GPIO_MODE_INPUT;
+ HAL_GPIO_Init(LCD_TE_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 LCD GPIO special pins MSP.
+ */
+__weak void BSP_LCD_MspDeInit(void)
+{
+ GPIO_InitTypeDef gpio_init_structure;
+
+ /* LCD_RESET GPIO deactivation */
+ gpio_init_structure.Pin = LCD_RESET_PIN;
+ HAL_GPIO_DeInit(LCD_RESET_GPIO_PORT, gpio_init_structure.Pin);
+
+ /* LCD_TE GPIO deactivation */
+ gpio_init_structure.Pin = LCD_TE_PIN;
+ HAL_GPIO_DeInit(LCD_TE_GPIO_PORT, gpio_init_structure.Pin);
+
+ /* LCD_BL_CTRL GPIO deactivation */
+ gpio_init_structure.Pin = LCD_BL_CTRL_PIN;
+ HAL_GPIO_DeInit(LCD_BL_CTRL_GPIO_PORT, gpio_init_structure.Pin);
+
+ /* GPIO pins clock can be shut down in the application
+ by surcharging this __weak function */
+}
+
+/**
+ * @}
+ */
+/******************************************************************************
+ Static Functions
+*******************************************************************************/
+/** @addtogroup STM32F413H_DISCOVERY_LCD_Private_FunctionPrototypes
+ * @{
+ */
+
+/**
+ * @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
+ */
+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.pFont->Height;
+ width = DrawProp.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.TextColor);
+ }
+ else
+ {
+ BSP_LCD_DrawPixel((Xpos + j), Ypos, DrawProp.BackColor);
+ }
+ }
+ Ypos++;
+ }
+}
+
+/**
+ * @brief Sets display window.
+ * @param Xpos: LCD X position
+ * @param Ypos: LCD Y position
+ * @param Width: LCD window width
+ * @param Height: LCD window height
+ */
+static void SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)
+{
+ if(LcdDrv->SetDisplayWindow != NULL)
+ {
+ LcdDrv->SetDisplayWindow(Xpos, Ypos, Width, Height);
+ }
+}
+
+/**
+ * @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
+ */
+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, numadd = 0, numpixels = 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;
+ numadd = deltay;
+ numpixels = 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;
+ numadd = deltax;
+ numpixels = deltay; /* There are more y-values than x-values */
+ }
+
+ for (curpixel = 0; curpixel <= numpixels; curpixel++)
+ {
+ BSP_LCD_DrawLine(x, y, x3, y3);
+
+ num += numadd; /* 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 */
+ }
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/STM32F413H-Discovery/stm32f413h_discovery_lcd.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,234 @@
+/**
+ ******************************************************************************
+ * @file stm32f413h_discovery_lcd.h
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 27-January-2017
+ * @brief This file contains the common defines and functions prototypes for
+ * the stm32f413h_discovery_lcd.c driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2017 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 __STM32F413H_DISCOVERY_LCD_H
+#define __STM32F413H_DISCOVERY_LCD_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f413h_discovery.h"
+#include "../Components/st7789h2/st7789h2.h"
+#include "../../../Utilities/Fonts/fonts.h"
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY_LCD
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LCD_Exported_Types STM32F413H 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 */
+}Line_ModeTypdef;
+
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LCD_Exported_Constants STM32F413H DISCOVERY LCD Exported Constants
+ * @{
+ */
+/**
+ * @brief LCD status structure definition
+ */
+#define LCD_OK ((uint8_t)0x00)
+#define LCD_ERROR ((uint8_t)0x01)
+#define LCD_TIMEOUT ((uint8_t)0x02)
+
+#define LCD_ORIENTATION_PORTRAIT ((uint8_t)0x00) /*!< Portrait orientation choice of LCD screen */
+#define LCD_ORIENTATION_LANDSCAPE ((uint8_t)0x01) /*!< Landscape orientation choice of LCD screen */
+#define LCD_ORIENTATION_LANDSCAPE_ROT180 ((uint8_t)0x02) /*!< Landscape rotated 180° orientation choice of LCD screen */
+
+/**
+ * @brief LCD color
+ */
+#define LCD_COLOR_BLUE ((uint16_t)0x001F)
+#define LCD_COLOR_GREEN ((uint16_t)0x07E0)
+#define LCD_COLOR_RED ((uint16_t)0xF800)
+#define LCD_COLOR_CYAN ((uint16_t)0x07FF)
+#define LCD_COLOR_MAGENTA ((uint16_t)0xF81F)
+#define LCD_COLOR_YELLOW ((uint16_t)0xFFE0)
+#define LCD_COLOR_LIGHTBLUE ((uint16_t)0x841F)
+#define LCD_COLOR_LIGHTGREEN ((uint16_t)0x87F0)
+#define LCD_COLOR_LIGHTRED ((uint16_t)0xFC10)
+#define LCD_COLOR_LIGHTMAGENTA ((uint16_t)0xFC1F)
+#define LCD_COLOR_LIGHTYELLOW ((uint16_t)0xFFF0)
+#define LCD_COLOR_DARKBLUE ((uint16_t)0x0010)
+#define LCD_COLOR_DARKGREEN ((uint16_t)0x0400)
+#define LCD_COLOR_DARKRED ((uint16_t)0x8000)
+#define LCD_COLOR_DARKCYAN ((uint16_t)0x0410)
+#define LCD_COLOR_DARKMAGENTA ((uint16_t)0x8010)
+#define LCD_COLOR_DARKYELLOW ((uint16_t)0x8400)
+#define LCD_COLOR_WHITE ((uint16_t)0xFFFF)
+#define LCD_COLOR_LIGHTGRAY ((uint16_t)0xD69A)
+#define LCD_COLOR_GRAY ((uint16_t)0x8410)
+#define LCD_COLOR_DARKGRAY ((uint16_t)0x4208)
+#define LCD_COLOR_BLACK ((uint16_t)0x0000)
+#define LCD_COLOR_BROWN ((uint16_t)0xA145)
+#define LCD_COLOR_ORANGE ((uint16_t)0xFD20)
+
+/**
+ * @brief LCD default font
+ */
+#define LCD_DEFAULT_FONT Font12
+
+/**
+ * @brief LCD special pins
+ */
+/* LCD reset pin */
+#define LCD_RESET_PIN GPIO_PIN_13
+#define LCD_RESET_GPIO_PORT GPIOB
+#define LCD_RESET_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
+#define LCD_RESET_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE()
+
+/* LCD tearing effect pin */
+#define LCD_TE_PIN GPIO_PIN_14
+#define LCD_TE_GPIO_PORT GPIOB
+#define LCD_TE_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
+#define LCD_TE_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE()
+
+/* Backlight control pin */
+#define LCD_BL_CTRL_PIN GPIO_PIN_5
+#define LCD_BL_CTRL_GPIO_PORT GPIOE
+#define LCD_BL_CTRL_GPIO_CLK_ENABLE() __HAL_RCC_GPIOE_CLK_ENABLE()
+#define LCD_BL_CTRL_GPIO_CLK_DISABLE() __HAL_RCC_GPIOE_CLK_DISABLE()
+
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_LCD_Exported_Functions STM32F413H DISCOVERY LCD Exported Functions
+ * @{
+ */
+uint8_t BSP_LCD_Init(void);
+uint8_t BSP_LCD_InitEx(uint32_t orientation);
+uint8_t BSP_LCD_DeInit(void);
+uint32_t BSP_LCD_GetXSize(void);
+uint32_t BSP_LCD_GetYSize(void);
+
+uint16_t BSP_LCD_GetTextColor(void);
+uint16_t BSP_LCD_GetBackColor(void);
+void BSP_LCD_SetTextColor(__IO uint16_t Color);
+void BSP_LCD_SetBackColor(__IO uint16_t Color);
+void BSP_LCD_SetFont(sFONT *fonts);
+sFONT *BSP_LCD_GetFont(void);
+
+void BSP_LCD_Clear(uint16_t Color);
+void BSP_LCD_ClearStringLine(uint16_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, Line_ModeTypdef Mode);
+void BSP_LCD_DisplayChar(uint16_t Xpos, uint16_t Ypos, uint8_t Ascii);
+
+uint16_t BSP_LCD_ReadPixel(uint16_t Xpos, uint16_t Ypos);
+void BSP_LCD_DrawPixel(uint16_t Xpos, uint16_t Ypos, uint16_t RGB_Code);
+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(uint16_t Xpos, uint16_t Ypos, uint8_t *pbmp);
+void BSP_LCD_DrawRGBImage(uint16_t Xpos, uint16_t Ypos, uint16_t Xsize, uint16_t Ysize, 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(void);
+void BSP_LCD_MspDeInit(void);
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32F413H_DISCOVERY_LCD_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/STM32F413H-Discovery/stm32f413h_discovery_psram.c Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,370 @@
+/**
+ ******************************************************************************
+ * @file stm32f413h_discovery_psram.c
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 27-January-2017
+ * @brief This file includes the PSRAM driver for the IS61WV51216BLL-10MLI memory
+ * device mounted on STM32F413H-DISCOVERY boards.
+ @verbatim
+ How To use this driver:
+ -----------------------
+ - This driver is used to drive the IS61WV51216BLL-10M PSRAM external memory mounted
+ on STM32F413H-DisCovERYevaluation board.
+ - This driver does not need a specific component driver for the PSRAM device
+ to be included with.
+
+ Driver description:
+ ------------------
+ + Initialization steps:
+ o Initialize the PSRAM external memory using the BSP_PSRAM_Init() function. This
+ function includes the MSP layer hardware resources initialization and the
+ FSMC controller configuration to interface with the external PSRAM memory.
+
+ + PSRAM read/write operations
+ o PSRAM 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_PSRAM_ReadData()/BSP_PSRAM_WriteData(), or by DMA transfer using the functions
+ BSP_PSRAM_ReadData_DMA()/BSP_PSRAM_WriteData_DMA().
+ o The AHB access is performed with 16-bit width transaction, the DMA transfer
+ configuration is fixed at single (no burst) halfword transfer
+ (see the PSRAM_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_PSRAM_DMA_IRQHandler()
+ is called in IRQ handler file, to serve the generated interrupt once the DMA
+ transfer is complete.
+ @endverbatim
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2017 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 "stm32f413h_discovery_psram.h"
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_PSRAM STM32F413H_DISCOVERY PSRAM
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_PSRAM_Private_Variables STM32F413H DISCOVERY PSRAM Private Variables
+ * @{
+ */
+SRAM_HandleTypeDef psramHandle;
+static FSMC_NORSRAM_TimingTypeDef Timing;
+
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_PSRAM_Private_Functions STM32F413H DISCOVERY PSRAM Private Functions
+ * @{
+ */
+
+/**
+ * @brief Initializes the PSRAM device.
+ * @retval PSRAM status
+ */
+uint8_t BSP_PSRAM_Init(void)
+{
+ static uint8_t psram_status = PSRAM_ERROR;
+ /* SRAM device configuration */
+ psramHandle.Instance = FSMC_NORSRAM_DEVICE;
+ psramHandle.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
+
+ /* PSRAM device configuration */
+ /* Timing configuration derived from system clock (up to 100Mhz)*/
+ Timing.AddressSetupTime = 3;
+ Timing.AddressHoldTime = 1;
+ Timing.DataSetupTime = 4;
+ Timing.BusTurnAroundDuration = 1;
+ Timing.CLKDivision = 2;
+ Timing.DataLatency = 2;
+ Timing.AccessMode = FSMC_ACCESS_MODE_A;
+
+ psramHandle.Init.NSBank = FSMC_NORSRAM_BANK1;
+ psramHandle.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE;
+ psramHandle.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM;
+ psramHandle.Init.MemoryDataWidth = PSRAM_MEMORY_WIDTH;
+ psramHandle.Init.BurstAccessMode = PSRAM_BURSTACCESS;
+ psramHandle.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW;
+ psramHandle.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS;
+ psramHandle.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE;
+ psramHandle.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE;
+ psramHandle.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE;
+ psramHandle.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE;
+ psramHandle.Init.WriteBurst = PSRAM_WRITEBURST;
+ psramHandle.Init.ContinuousClock = CONTINUOUSCLOCK_FEATURE;
+
+ /* PSRAM controller initialization */
+ BSP_PSRAM_MspInit(&psramHandle, NULL); /* __weak function can be rewritten by the application */
+ if(HAL_SRAM_Init(&psramHandle, &Timing, &Timing) != HAL_OK)
+ {
+ psram_status = PSRAM_ERROR;
+ }
+ else
+ {
+ psram_status = PSRAM_OK;
+ }
+ return psram_status;
+}
+
+/**
+ * @brief DeInitializes the PSRAM device.
+ * @retval PSRAM status
+ */
+uint8_t BSP_PSRAM_DeInit(void)
+{
+ static uint8_t psram_status = PSRAM_ERROR;
+ /* PSRAM device de-initialization */
+ psramHandle.Instance = FSMC_NORSRAM_DEVICE;
+ psramHandle.Extended = FSMC_NORSRAM_EXTENDED_DEVICE;
+
+ if(HAL_SRAM_DeInit(&psramHandle) != HAL_OK)
+ {
+ psram_status = PSRAM_ERROR;
+ }
+ else
+ {
+ psram_status = PSRAM_OK;
+ }
+
+ /* PSRAM controller de-initialization */
+ BSP_PSRAM_MspDeInit(&psramHandle, NULL);
+
+ return psram_status;
+}
+
+/**
+ * @brief Reads an amount of data from the PSRAM device 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 PSRAM status
+ */
+uint8_t BSP_PSRAM_ReadData(uint32_t uwStartAddress, uint16_t *pData, uint32_t uwDataSize)
+{
+ if(HAL_SRAM_Read_16b(&psramHandle, (uint32_t *)uwStartAddress, pData, uwDataSize) != HAL_OK)
+ {
+ return PSRAM_ERROR;
+ }
+ else
+ {
+ return PSRAM_OK;
+ }
+}
+
+/**
+ * @brief Reads an amount of data from the PSRAM device 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 PSRAM status
+ */
+uint8_t BSP_PSRAM_ReadData_DMA(uint32_t uwStartAddress, uint16_t *pData, uint32_t uwDataSize)
+{
+ if(HAL_SRAM_Read_DMA(&psramHandle, (uint32_t *)uwStartAddress, (uint32_t *)pData, uwDataSize) != HAL_OK)
+ {
+ return PSRAM_ERROR;
+ }
+ else
+ {
+ return PSRAM_OK;
+ }
+}
+
+/**
+ * @brief Writes an amount of data from the PSRAM device 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 PSRAM status
+ */
+uint8_t BSP_PSRAM_WriteData(uint32_t uwStartAddress, uint16_t *pData, uint32_t uwDataSize)
+{
+ if(HAL_SRAM_Write_16b(&psramHandle, (uint32_t *)uwStartAddress, pData, uwDataSize) != HAL_OK)
+ {
+ return PSRAM_ERROR;
+ }
+ else
+ {
+ return PSRAM_OK;
+ }
+}
+
+/**
+ * @brief Writes an amount of data from the PSRAM device 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 PSRAM status
+ */
+uint8_t BSP_PSRAM_WriteData_DMA(uint32_t uwStartAddress, uint16_t *pData, uint32_t uwDataSize)
+{
+ if(HAL_SRAM_Write_DMA(&psramHandle, (uint32_t *)uwStartAddress, (uint32_t *)pData, uwDataSize) != HAL_OK)
+ {
+ return PSRAM_ERROR;
+ }
+ else
+ {
+ return PSRAM_OK;
+ }
+}
+
+/**
+ * @brief Initializes PSRAM MSP.
+ * @param hsram: PSRAM handle
+ * @param Params : pointer on additional configuration parameters, can be NULL.
+ */
+__weak void BSP_PSRAM_MspInit(SRAM_HandleTypeDef *hsram, void *Params)
+{
+ static DMA_HandleTypeDef dma_handle;
+ GPIO_InitTypeDef gpio_init_structure;
+
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Params);
+
+ /* Enable FSMC clock */
+ __HAL_RCC_FSMC_CLK_ENABLE();
+
+ /* Enable chosen DMAx clock */
+ PSRAM_DMAx_CLK_ENABLE();
+
+ /* Enable GPIOs clock */
+ __HAL_RCC_GPIOD_CLK_ENABLE();
+ __HAL_RCC_GPIOE_CLK_ENABLE();
+ __HAL_RCC_GPIOF_CLK_ENABLE();
+ __HAL_RCC_GPIOG_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_FREQ_VERY_HIGH;
+ gpio_init_structure.Alternate = GPIO_AF12_FSMC;
+
+ /* GPIOD configuration */
+ gpio_init_structure.Pin = GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_7 |\
+ GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10 | GPIO_PIN_11 | GPIO_PIN_12 |\
+ 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_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_2| GPIO_PIN_3 | GPIO_PIN_4 |\
+ GPIO_PIN_5;
+ HAL_GPIO_Init(GPIOG, &gpio_init_structure);
+
+ /* Configure common DMA parameters */
+ dma_handle.Init.Channel = PSRAM_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_HALFWORD;
+ dma_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
+ 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 = PSRAM_DMAx_STREAM;
+
+ /* Associate the DMA handle */
+ __HAL_LINKDMA(hsram, 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(PSRAM_DMAx_IRQn, 0x0F, 0);
+ HAL_NVIC_EnableIRQ(PSRAM_DMAx_IRQn);
+}
+
+/**
+ * @brief DeInitializes SRAM MSP.
+ * @param hsram: SRAM handle
+ * @param Params : pointer on additional configuration parameters, can be NULL.
+ * @retval None
+ */
+__weak void BSP_PSRAM_MspDeInit(SRAM_HandleTypeDef *hsram, void *Params)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Params);
+
+ /* Disable NVIC configuration for DMA interrupt */
+ HAL_NVIC_DisableIRQ(PSRAM_DMAx_IRQn);
+
+ if(hsram->Instance != NULL)
+ {
+ /* Deinitialize the stream for new transfer */
+ HAL_DMA_DeInit(hsram->hdma);
+ }
+
+ /* GPIO pins clock, FSMC clock and DMA clock can be shut down in the applications
+ by surcharging this __weak function */
+}
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/STM32F413H-Discovery/stm32f413h_discovery_psram.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,129 @@
+/**
+ ******************************************************************************
+ * @file stm32f413H_discovery_psram.h
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 27-January-2017
+ * @brief This file contains the common defines and functions prototypes for
+ * the stm32f413h_discovery_psram.c driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2017 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 __STM32F413H_DISCOVERY_PSRAM_H
+#define __STM32F413H_DISCOVERY_PSRAM_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f4xx_hal.h"
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY_PSRAM
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_PSRAM_Exported_Constants STM32F413H DISCOVERY PSRAM Exported Constants
+ * @{
+ */
+
+/**
+ * @brief PSRAM status structure definition
+ */
+#define PSRAM_OK ((uint8_t)0x00)
+#define PSRAM_ERROR ((uint8_t)0x01)
+
+#define PSRAM_DEVICE_ADDR ((uint32_t)0x60000000)
+#define PSRAM_DEVICE_SIZE ((uint32_t)0x80000) /* SRAM device size in Bytes */
+
+#define PSRAM_MEMORY_WIDTH FSMC_NORSRAM_MEM_BUS_WIDTH_16
+#define PSRAM_BURSTACCESS FSMC_BURST_ACCESS_MODE_DISABLE
+#define PSRAM_WRITEBURST FSMC_WRITE_BURST_DISABLE
+#define CONTINUOUSCLOCK_FEATURE FSMC_CONTINUOUS_CLOCK_SYNC_ONLY
+
+/* DMA definitions for SRAM DMA transfer */
+#define PSRAM_DMAx_CLK_ENABLE __HAL_RCC_DMA2_CLK_ENABLE
+#define PSRAM_DMAx_CLK_DISABLE __HAL_RCC_DMA2_CLK_DISABLE
+#define PSRAM_DMAx_CHANNEL DMA_CHANNEL_0
+#define PSRAM_DMAx_STREAM DMA2_Stream5
+#define PSRAM_DMAx_IRQn DMA2_Stream5_IRQn
+#define BSP_PSRAM_DMA_IRQHandler DMA2_Stream5_IRQHandler
+
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_PSRAM_Exported_Functions STM32F413H DISCOVERY PSRAM Exported Functions
+ * @{
+ */
+uint8_t BSP_PSRAM_Init(void);
+uint8_t BSP_PSRAM_DeInit(void);
+uint8_t BSP_PSRAM_ReadData(uint32_t uwStartAddress, uint16_t *pData, uint32_t uwDataSize);
+uint8_t BSP_PSRAM_ReadData_DMA(uint32_t uwStartAddress, uint16_t *pData, uint32_t uwDataSize);
+uint8_t BSP_PSRAM_WriteData(uint32_t uwStartAddress, uint16_t *pData, uint32_t uwDataSize);
+uint8_t BSP_PSRAM_WriteData_DMA(uint32_t uwStartAddress, uint16_t *pData, uint32_t uwDataSize);
+
+/* These functions can be modified in case the current settings (e.g. DMA stream)
+ need to be changed for specific application needs */
+void BSP_PSRAM_MspInit(SRAM_HandleTypeDef *hsram, void *Params);
+void BSP_PSRAM_MspDeInit(SRAM_HandleTypeDef *hsram, void *Params);
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32F413H_DISCOVERY_PSRAM_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/STM32F413H-Discovery/stm32f413h_discovery_qspi.c Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,794 @@
+/**
+ ******************************************************************************
+ * @file stm32f413h_discovery_qspi.c
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 27-January-2017
+ * @brief This file includes a standard driver for the N25Q128A QSPI
+ * memory mounted on STM32F413H-DISCOVERY board.
+ @verbatim
+ ==============================================================================
+ ##### How to use this driver #####
+ ==============================================================================
+ [..]
+ (#) This driver is used to drive the N25Q128A QSPI external
+ memory mounted on STM32F413H-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) 2017 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 "stm32f413h_discovery_qspi.h"
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_QSPI STM32F413H_DISCOVERY QSPI
+ * @{
+ */
+
+
+/* Private variables ---------------------------------------------------------*/
+
+/** @defgroup STM32F413H_DISCOVERY_QSPI_Private_Variables STM32F413H DISCOVERY Private Variables
+ * @{
+ */
+QSPI_HandleTypeDef QSPIHandle;
+
+/**
+ * @}
+ */
+
+/* Private functions ---------------------------------------------------------*/
+
+/** @defgroup STM32F413H_DISCOVERY_QSPI_Private_FunctionsPrototypes STM32F413H DISCOVERY Private Functions Prototypes
+ * @{
+ */
+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 STM32F413H_DISCOVERY_QSPI_Exported_Functions STM32F413H DISCOVERY 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 = 0; /* QSPI freq = 100 MHz/(0+1) = 100 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_5_CYCLE; /* Min 50ns for nonRead commands */
+ 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: Min 20ns for N25Q128A memory */
+ MODIFY_REG(QSPIHandle.Instance->DCR, QUADSPI_DCR_CSHT, QSPI_CS_HIGH_TIME_2_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_5_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;
+
+ if (HAL_QSPI_MemoryMapped(&QSPIHandle, &s_command, &s_mem_mapped_cfg) != HAL_OK)
+ {
+ return QSPI_ERROR;
+ }
+
+ return QSPI_OK;
+}
+
+/**
+ * @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
+ * @param hqspi: QSPI handle
+ * @param Params : pointer on additional configuration parameters, can be NULL.
+ */
+__weak void BSP_QSPI_MspInit(QSPI_HandleTypeDef *hqspi, void *Params)
+{
+ GPIO_InitTypeDef gpio_init_structure;
+
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Params);
+
+ /*##-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_QSPI;
+ 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_QSPI;
+ 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_AF10_QSPI;
+ 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_AF10_QSPI;
+ 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_QSPI;
+ 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_QSPI;
+ 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, 0x00);
+ 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
+ * @param hqspi: QSPI handle
+ * @param Params : pointer on additional configuration parameters, can be NULL.
+ */
+__weak void BSP_QSPI_MspDeInit(QSPI_HandleTypeDef *hqspi, void *Params)
+{
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(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();
+}
+
+/**
+ * @}
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY_QSPI_Private_Functions
+ * @{
+ */
+
+/**
+ * @brief This function reset the QSPI memory.
+ * @param hqspi: QSPI handle
+ */
+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
+ */
+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
+ */
+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
+ */
+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****/
+
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/STM32F413H-Discovery/stm32f413h_discovery_qspi.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,181 @@
+/**
+ ******************************************************************************
+ * @file stm32f413h_discovery_qspi.h
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 27-January-2017
+ * @brief This file contains the common defines and functions prototypes for
+ * the stm32f413h_discovery_qspi.c driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2017 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 STM32F413H_DISCOVERY
+ * @{
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef __STM32F413H_DISCOVERY_QSPI_H
+#define __STM32F413H_DISCOVERY_QSPI_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f4xx_hal.h"
+#include "../Components/n25q128a/n25q128a.h"
+
+/** @addtogroup STM32F413H_DISCOVERY_QSPI
+ * @{
+ */
+
+
+/* Exported constants --------------------------------------------------------*/
+/** @defgroup STM32F413H_DISCOVERY_QSPI_Exported_Constants STM32F413H DISCOVERY 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_GPIOG_CLK_ENABLE()
+#define QSPI_CS_GPIO_CLK_DISABLE() __HAL_RCC_GPIOG_CLK_DISABLE()
+#define QSPI_CLK_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE()
+#define QSPI_CLK_GPIO_CLK_DISABLE() __HAL_RCC_GPIOB_CLK_DISABLE()
+
+#define QSPI_D0_GPIO_CLK_ENABLE() __HAL_RCC_GPIOF_CLK_ENABLE()
+#define QSPI_D1_GPIO_CLK_ENABLE() __HAL_RCC_GPIOF_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_D0_GPIO_CLK_DISABLE() __HAL_RCC_GPIOF_CLK_DISABLE()
+#define QSPI_D1_GPIO_CLK_DISABLE() __HAL_RCC_GPIOF_CLK_DISABLE()
+#define QSPI_D2_GPIO_CLK_DISABLE() __HAL_RCC_GPIOE_CLK_DISABLE()
+#define QSPI_D3_GPIO_CLK_DISABLE() __HAL_RCC_GPIOD_CLK_DISABLE()
+
+#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 GPIOG
+#define QSPI_CLK_PIN GPIO_PIN_2
+#define QSPI_CLK_GPIO_PORT GPIOB
+#define QSPI_D0_PIN GPIO_PIN_8
+#define QSPI_D0_GPIO_PORT GPIOF
+#define QSPI_D1_PIN GPIO_PIN_9
+#define QSPI_D1_GPIO_PORT GPIOF
+#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
+
+/* N25Q128A13EF840F Micron memory */
+/* Size of the flash */
+#define QSPI_FLASH_SIZE 23 /* Address bus width to access whole memory space */
+#define QSPI_PAGE_SIZE 256
+
+/**
+ * @}
+ */
+
+/* Exported types ------------------------------------------------------------*/
+/** @defgroup STM32F413H_DISCOVERY_QSPI_Exported_Types STM32F413H DISCOVERY 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 --------------------------------------------------------*/
+/** @defgroup STM32F413H_DISCOVERY_QSPI_Exported_Functions STM32F413H DISCOVERY 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);
+/* BSP Aliased function maintained for legacy purpose */
+#define BSP_QSPI_MemoryMappedMode BSP_QSPI_EnableMemoryMappedMode
+
+/* 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 /* __STM32F413H_DISCOVERY_QSPI_H */
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/STM32F413H-Discovery/stm32f413h_discovery_sd.c Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,573 @@
+/**
+ ******************************************************************************
+ * @file stm32f413h_discovery_sd.c
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 27-January-2017
+ * @brief This file includes the uSD card driver mounted on STM32F413H-DISCOVERY
+ * board.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2017 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.
+ *
+ ******************************************************************************
+ */
+
+/* File Info : -----------------------------------------------------------------
+ User NOTES
+1. How To use this driver:
+--------------------------
+ - This driver is used to drive the micro SD external card mounted on STM32F413H-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().
+
+------------------------------------------------------------------------------*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f413h_discovery_sd.h"
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_SD STM32F413H_DISCOVERY SD
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_SD_Private_Variables STM32F413H DISCOVERY SD Private Variables
+ * @{
+ */
+SD_HandleTypeDef uSdHandle;
+
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_SD_Private_Functions STM32F413H DISCOVERY SD Private 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 = SDIO;
+
+ uSdHandle.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING;
+ uSdHandle.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE;
+ uSdHandle.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE;
+ uSdHandle.Init.BusWide = SDIO_BUS_WIDE_1B;
+ uSdHandle.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_ENABLE;
+ uSdHandle.Init.ClockDiv = SDIO_TRANSFER_CLK_DIV;
+
+ /* Msp SD Detect pin initialization */
+ BSP_SD_Detect_MspInit(&uSdHandle, NULL);
+
+ /* Check if SD card is present */
+ if(BSP_SD_IsDetected() != SD_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, SDIO_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 = SDIO;
+
+ /* HAL SD deinitialization */
+ if(HAL_SD_DeInit(&uSdHandle) != HAL_OK)
+ {
+ sd_state = MSD_ERROR;
+ }
+
+ /* Msp SD deinitialization */
+ uSdHandle.Instance = SDIO;
+ 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 : pointer on additional configuration parameters, can be NULL.
+ */
+__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;
+
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Params);
+
+ /* Enable SDIO clock */
+ __HAL_RCC_SDIO_CLK_ENABLE();
+
+ /* Enable DMA2 clocks */
+ __DMAx_TxRx_CLK_ENABLE();
+
+ /* Enable GPIOs clock */
+ __HAL_RCC_GPIOC_CLK_ENABLE();
+ __HAL_RCC_GPIOA_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_SDIO;
+
+ /* GPIOC configuration: SD_D[0..3] and SD_clk */
+ 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);
+
+ /* GPIOA configuration: SD cmd */
+ gpio_init_structure.Pin = GPIO_PIN_6;
+ HAL_GPIO_Init(GPIOA, &gpio_init_structure);
+
+ /* NVIC configuration for SDIO interrupts */
+ HAL_NVIC_SetPriority(SDIO_IRQn, 0x0E, 0x00);
+ HAL_NVIC_EnableIRQ(SDIO_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, 0x00);
+ HAL_NVIC_EnableIRQ(SD_DMAx_Rx_IRQn);
+
+ /* NVIC configuration for DMA transfer complete interrupt */
+ HAL_NVIC_SetPriority(SD_DMAx_Tx_IRQn, 0x0F, 0x00);
+ HAL_NVIC_EnableIRQ(SD_DMAx_Tx_IRQn);
+}
+
+/**
+ * @brief Initializes the SD Detect pin MSP.
+ * @param hsd: SD handle
+ * @param Params : pointer on additional configuration parameters, can be NULL.
+ */
+__weak void BSP_SD_Detect_MspInit(SD_HandleTypeDef *hsd, void *Params)
+{
+ GPIO_InitTypeDef gpio_init_structure;
+
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Params);
+
+ 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 : pointer on additional configuration parameters, can be NULL.
+ */
+__weak void BSP_SD_MspDeInit(SD_HandleTypeDef *hsd, void *Params)
+{
+ static DMA_HandleTypeDef dma_rx_handle;
+ static DMA_HandleTypeDef dma_tx_handle;
+
+ /* Prevent unused argument(s) compilation warning */
+ UNUSED(Params);
+
+ /* 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(SDIO_IRQn);
+
+ /* DeInit GPIO pins can be done in the application
+ (by surcharging this __weak function) */
+
+ /* Disable SDIO clock */
+ __HAL_RCC_SDIO_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
+ */
+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
+ */
+void HAL_SD_AbortCallback(SD_HandleTypeDef *hsd)
+{
+ BSP_SD_AbortCallback();
+}
+
+/**
+ * @brief Tx Transfer completed callbacks
+ * @param hsd: SD handle
+ */
+void HAL_SD_TxCpltCallback(SD_HandleTypeDef *hsd)
+{
+ BSP_SD_WriteCpltCallback();
+}
+
+/**
+ * @brief Rx Transfer completed callbacks
+ * @param hsd: SD handle
+ */
+void HAL_SD_RxCpltCallback(SD_HandleTypeDef *hsd)
+{
+ BSP_SD_ReadCpltCallback();
+}
+
+/**
+ * @brief BSP SD Abort callbacks
+ */
+__weak void BSP_SD_AbortCallback(void)
+{
+
+}
+
+/**
+ * @brief BSP Tx Transfer completed callbacks
+ */
+__weak void BSP_SD_WriteCpltCallback(void)
+{
+
+}
+
+/**
+ * @brief BSP Rx Transfer completed callbacks
+ */
+__weak void BSP_SD_ReadCpltCallback(void)
+{
+
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/STM32F413H-Discovery/stm32f413h_discovery_sd.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,157 @@
+/**
+ ******************************************************************************
+ * @file stm32f413h_discovery_sd.h
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 27-January-2017
+ * @brief This file contains the common defines and functions prototypes for
+ * the stm32413h_discovery_sd.c driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2017 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 __STM32F413H_DISCOVERY_SD_H
+#define __STM32F413H_DISCOVERY_SD_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f413h_discovery.h"
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY_SD
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY_SD_Private_Variables
+ * @{
+ */
+
+/**
+ * @brief SD Card information structure
+ */
+#define BSP_SD_CardInfo HAL_SD_CardInfoTypeDef
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_SD_Exported_Constants STM32F413H DISCOVERY SD Exported Constants
+ * @{
+ */
+
+/**
+ * @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)
+#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_SD_IRQHandler SDIO_IRQHandler
+#define BSP_SD_DMA_Tx_IRQHandler DMA2_Stream6_IRQHandler
+#define BSP_SD_DMA_Rx_IRQHandler DMA2_Stream3_IRQHandler
+#define SD_DetectIRQHandler() HAL_GPIO_EXTI_IRQHandler(SD_DETECT_PIN)
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_SD_Exported_Functions STM32F413H 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 /* __STM32F413H_DISCOVERY_SD_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/STM32F413H-Discovery/stm32f413h_discovery_ts.c Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,427 @@
+/**
+ ******************************************************************************
+ * @file stm32f413h_discovery_ts.c
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 27-January-2017
+ * @brief This file provides a set of functions needed to manage the Touch
+ * Screen on STM32F413h-DISCOVERY evaluation board.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2017 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.
+ *
+ ******************************************************************************
+ */
+
+/* File Info : -----------------------------------------------------------------
+ User NOTES
+1. How To use this driver:
+--------------------------
+ - This driver is used to drive the touch screen module of the STM32F413H-DISCOVERY
+ evaluation board on the FRIDA LCD mounted on MB1209 daughter board.
+ The touch screen driver IC is a FT6x36 type which share the same register naming
+ with FT6206 type.
+
+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.
+
+ + 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.
+------------------------------------------------------------------------------*/
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f413h_discovery.h"
+#include "stm32f413h_discovery_ts.h"
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_TS STM32F413H_DISCOVERY TS
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_TS_Private_Variables STM32F413H DISCOVERY TS Private Variables
+ * @{
+ */
+static TS_DrvTypeDef *tsDriver;
+static uint8_t I2C_Address = 0;
+static uint8_t tsOrientation = TS_SWAP_NONE;
+
+/* Table for touchscreen event information display on LCD : table indexed on enum @ref TS_TouchEventTypeDef information */
+char * ts_event_string_tab[TOUCH_EVENT_NB_MAX] = { "None",
+ "Press down",
+ "Lift up",
+ "Contact"
+ };
+
+/* Table for touchscreen gesture Id information display on LCD : table indexed on enum @ref TS_GestureIdTypeDef information */
+char * ts_gesture_id_string_tab[GEST_ID_NB_MAX] = { "None",
+ "Move Up",
+ "Move Right",
+ "Move Down",
+ "Move Left",
+ "Zoom In",
+ "Zoom Out"
+ };
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_TS_Private_Functions STM32F413H DISCOVERY TS Private 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)
+{
+ return (BSP_TS_InitEx(ts_SizeX, ts_SizeY, TS_ORIENTATION_LANDSCAPE));
+}
+
+/**
+ * @brief Initializes and configures the touch screen functionalities and
+ * configures all necessary hardware resources (GPIOs, I2C, clocks..)
+ * with a given orientation
+ * @param ts_SizeX : Maximum X size of the TS area on LCD
+ * @param ts_SizeY : Maximum Y size of the TS area on LCD
+ * @param orientation : TS_ORIENTATION_LANDSCAPE or TS_ORIENTATION_PORTRAIT
+ * @retval TS_OK if all initializations are OK. Other value if error.
+ */
+uint8_t BSP_TS_InitEx(uint16_t ts_SizeX, uint16_t ts_SizeY, uint8_t orientation)
+{
+ uint8_t ts_status = TS_OK;
+
+ /* Note : I2C_Address is un-initialized here, but is not used at all in init function */
+ /* but the prototype of Init() is like that in template and should be respected */
+
+ /* Initialize the communication channel to sensor (I2C) if necessary */
+ /* that is initialization is done only once after a power up */
+ ft6x06_ts_drv.Init(I2C_Address);
+
+ /* Scan FT6x36 TouchScreen IC controller ID register by I2C Read */
+ /* Verify this is a FT6x36, otherwise this is an error case */
+
+ if(ft6x06_ts_drv.ReadID(TS_I2C_ADDRESS) == FT6x36_ID_VALUE)
+ {
+ /* Found FT6x36 : Initialize the TS driver structure */
+ tsDriver = &ft6x06_ts_drv;
+
+ I2C_Address = TS_I2C_ADDRESS;
+
+ /* Get LCD chosen orientation */
+ if(orientation == TS_ORIENTATION_PORTRAIT)
+ {
+ tsOrientation = TS_SWAP_Y;
+ }
+ else if(orientation == TS_ORIENTATION_LANDSCAPE_ROT180)
+ {
+ tsOrientation = TS_SWAP_XY;
+ }
+ else
+ {
+ tsOrientation = TS_SWAP_XY | TS_SWAP_Y;
+ }
+
+
+ if(ts_status == TS_OK)
+ {
+ /* Software reset the TouchScreen */
+ tsDriver->Reset(I2C_Address);
+
+ /* Calibrate, Configure and Start the TouchScreen driver */
+ tsDriver->Start(I2C_Address);
+
+ } /* of if(ts_status == TS_OK) */
+ }
+ else
+ {
+ ts_status = TS_DEVICE_NOT_FOUND;
+ }
+
+ return (ts_status);
+}
+
+/**
+ * @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)
+{
+ uint8_t ts_status = TS_OK;
+
+ /* Msp Init of GPIO used for TS_INT pin coming from TouchScreen driver IC FT6x36 */
+ /* When touchscreen is operated in interrupt mode */
+ BSP_TS_INT_MspInit();
+
+ /* Enable and set the TS_INT EXTI Interrupt to an intermediate priority */
+ HAL_NVIC_SetPriority((IRQn_Type)(TS_INT_EXTI_IRQn), 0x0F, 0x00);
+ HAL_NVIC_EnableIRQ((IRQn_Type)(TS_INT_EXTI_IRQn));
+
+ /* Enable the TS in interrupt mode */
+ /* In that case the INT output of FT6206 when new touch is available */
+ /* is active on low level and directed on EXTI */
+ tsDriver->EnableIT(I2C_Address);
+
+ return (ts_status);
+}
+
+/**
+ * @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 tmp;
+ uint16_t Raw_x[TS_MAX_NB_TOUCH];
+ uint16_t Raw_y[TS_MAX_NB_TOUCH];
+ uint16_t xDiff;
+ uint16_t yDiff;
+ 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(I2C_Address);
+ if(TS_State->touchDetected)
+ {
+ for(index=0; index < TS_State->touchDetected; index++)
+ {
+ /* Get each touch coordinates */
+ tsDriver->GetXY(I2C_Address, &(Raw_x[index]), &(Raw_y[index]));
+
+ if(tsOrientation & TS_SWAP_XY)
+ {
+ tmp = Raw_x[index];
+ Raw_x[index] = Raw_y[index];
+ Raw_y[index] = tmp;
+ }
+
+ if(tsOrientation & TS_SWAP_X)
+ {
+ Raw_x[index] = FT_6206_MAX_WIDTH_HEIGHT - 1 - Raw_x[index];
+ }
+
+ if(tsOrientation & TS_SWAP_Y)
+ {
+ Raw_y[index] = FT_6206_MAX_WIDTH_HEIGHT - 1 - Raw_y[index];
+ }
+
+ xDiff = Raw_x[index] > _x[index]? (Raw_x[index] - _x[index]): (_x[index] - Raw_x[index]);
+ yDiff = Raw_y[index] > _y[index]? (Raw_y[index] - _y[index]): (_y[index] - Raw_y[index]);
+
+ if ((xDiff + yDiff) > 5)
+ {
+ _x[index] = Raw_x[index];
+ _y[index] = Raw_y[index];
+ }
+
+
+ TS_State->touchX[index] = _x[index];
+ TS_State->touchY[index] = _y[index];
+
+#if (TS_MULTI_TOUCH_SUPPORTED == 1)
+
+ /* Get touch info related to the current touch */
+ ft6x06_TS_GetTouchInfo(I2C_Address, index, &weight, &area, &event);
+
+ /* Update TS_State structure */
+ TS_State->touchWeight[index] = weight;
+ TS_State->touchArea[index] = area;
+
+ /* Remap touch event */
+ switch(event)
+ {
+ case FT6206_TOUCH_EVT_FLAG_PRESS_DOWN :
+ TS_State->touchEventId[index] = TOUCH_EVENT_PRESS_DOWN;
+ break;
+ case FT6206_TOUCH_EVT_FLAG_LIFT_UP :
+ TS_State->touchEventId[index] = TOUCH_EVENT_LIFT_UP;
+ break;
+ case FT6206_TOUCH_EVT_FLAG_CONTACT :
+ TS_State->touchEventId[index] = TOUCH_EVENT_CONTACT;
+ break;
+ case FT6206_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 */
+ ft6x06_TS_GetGestureID(I2C_Address, &gestureId);
+
+ /* Remap gesture Id to a TS_GestureIdTypeDef value */
+ switch(gestureId)
+ {
+ case FT6206_GEST_ID_NO_GESTURE :
+ TS_State->gestureId = GEST_ID_NO_GESTURE;
+ break;
+ case FT6206_GEST_ID_MOVE_UP :
+ TS_State->gestureId = GEST_ID_MOVE_UP;
+ break;
+ case FT6206_GEST_ID_MOVE_RIGHT :
+ TS_State->gestureId = GEST_ID_MOVE_RIGHT;
+ break;
+ case FT6206_GEST_ID_MOVE_DOWN :
+ TS_State->gestureId = GEST_ID_MOVE_DOWN;
+ break;
+ case FT6206_GEST_ID_MOVE_LEFT :
+ TS_State->gestureId = GEST_ID_MOVE_LEFT;
+ break;
+ case FT6206_GEST_ID_ZOOM_IN :
+ TS_State->gestureId = GEST_ID_ZOOM_IN;
+ break;
+ case FT6206_GEST_ID_ZOOM_OUT :
+ TS_State->gestureId = GEST_ID_ZOOM_OUT;
+ break;
+ default :
+ ts_status = TS_ERROR;
+ break;
+ } /* of switch(gestureId) */
+
+ return(ts_status);
+}
+
+/**
+ * @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);
+}
+#endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */
+
+/**
+ * @brief Initializes the TS_INT pin MSP.
+ */
+__weak void BSP_TS_INT_MspInit(void)
+{
+ GPIO_InitTypeDef gpio_init_structure;
+
+ TS_INT_GPIO_CLK_ENABLE();
+
+ /* Configure Interrupt mode for TS_INT pin falling edge : when a new touch is available */
+ /* TS_INT pin is active on low level on new touch available */
+ 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_FALLING;
+ HAL_GPIO_Init(TS_INT_GPIO_PORT, &gpio_init_structure);
+}
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Drivers/BSP/STM32F413H-Discovery/stm32f413h_discovery_ts.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,217 @@
+/**
+ ******************************************************************************
+ * @file stm32f413h_discovery_ts.h
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 27-January-2017
+ * @brief This file contains the common defines and functions prototypes for
+ * the stm32f413h_discovery_ts.c driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2017 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 __STM32F413H_DISCOVERY_TS_H
+#define __STM32F413H_DISCOVERY_TS_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include "stm32f413h_discovery.h"
+#include "stm32f413h_discovery_lcd.h"
+
+/* Include TouchScreen component driver */
+#include "../Components/ft6x06/ft6x06.h"
+
+/** @addtogroup BSP
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY
+ * @{
+ */
+
+/** @addtogroup STM32F413H_DISCOVERY_TS
+ * @{
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_TS_Exported_Constants STM32F413H DISCOVERY TS Exported Constants
+ * @{
+ */
+/** @brief With FT6206 : maximum 2 touches detected simultaneously
+ */
+#define TS_MAX_NB_TOUCH ((uint32_t) FT6206_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)
+
+#define TS_ORIENTATION_PORTRAIT ((uint8_t) 0)
+#define TS_ORIENTATION_LANDSCAPE ((uint8_t) 1)
+#define TS_ORIENTATION_LANDSCAPE_ROT180 ((uint8_t) 2)
+
+/**
+ * @}
+ */
+
+/** @defgroup STM32F413H_DISCOVERY_TS_Exported_Types STM32F413H 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;
+
+/**
+ * @brief TS_StatusTypeDef
+ * Define BSP_TS_xxx() functions possible return value,
+ * when status is returned by those functions.
+ */
+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 STM32F413H_DISCOVERY_TS_Imported_Variables STM32F413H 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];
+/**
+ * @}
+ */
+/** @defgroup STM32F413H_DISCOVERY_TS_Exported_Functions STM32F413H DISCOVERY TS Exported Functions
+ * @{
+ */
+uint8_t BSP_TS_Init(uint16_t ts_SizeX, uint16_t ts_SizeY);
+uint8_t BSP_TS_InitEx(uint16_t ts_SizeX, uint16_t ts_SizeY, uint8_t orientation);
+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);
+uint8_t BSP_TS_ResetTouchData(TS_StateTypeDef *TS_State);
+#endif /* TS_MULTI_TOUCH_SUPPORTED == 1 */
+
+uint8_t BSP_TS_ITConfig(void);
+
+/* These __weak function can be surcharged by application code in case the current settings
+ need to be changed for specific (example GPIO allocation) */
+void BSP_TS_INT_MspInit(void);
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __STM32F413H_DISCOVERY_TS_H */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/Fonts/font12.c Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,1464 @@
+/**
+ ******************************************************************************
+ * @file Font12.c
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 18-February-2014
+ * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2014 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 "fonts.h"
+
+/** @addtogroup Utilities
+ * @{
+ */
+
+/** @addtogroup STM32_EVAL
+ * @{
+ */
+
+/** @addtogroup Common
+ * @{
+ */
+
+/** @addtogroup FONTS
+ * @brief This file provides text Font12 for STM32xx-EVAL's LCD driver.
+ * @{
+ */
+
+/** @defgroup FONTS_Private_Types
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Defines
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Macros
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Variables
+ * @{
+ */
+//
+// Font data for Courier New 12pt
+//
+
+const uint8_t Font12_Table[] =
+{
+ // @0 ' ' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @12 '!' (7 pixels wide)
+ 0x00, //
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @24 '"' (7 pixels wide)
+ 0x00, //
+ 0x6C, // ## ##
+ 0x48, // # #
+ 0x48, // # #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @36 '#' (7 pixels wide)
+ 0x00, //
+ 0x14, // # #
+ 0x14, // # #
+ 0x28, // # #
+ 0x7C, // #####
+ 0x28, // # #
+ 0x7C, // #####
+ 0x28, // # #
+ 0x50, // # #
+ 0x50, // # #
+ 0x00, //
+ 0x00, //
+
+ // @48 '$' (7 pixels wide)
+ 0x00, //
+ 0x10, // #
+ 0x38, // ###
+ 0x40, // #
+ 0x40, // #
+ 0x38, // ###
+ 0x48, // # #
+ 0x70, // ###
+ 0x10, // #
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+
+ // @60 '%' (7 pixels wide)
+ 0x00, //
+ 0x20, // #
+ 0x50, // # #
+ 0x20, // #
+ 0x0C, // ##
+ 0x70, // ###
+ 0x08, // #
+ 0x14, // # #
+ 0x08, // #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @72 '&' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x18, // ##
+ 0x20, // #
+ 0x20, // #
+ 0x54, // # # #
+ 0x48, // # #
+ 0x34, // ## #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @84 ''' (7 pixels wide)
+ 0x00, //
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @96 '(' (7 pixels wide)
+ 0x00, //
+ 0x08, // #
+ 0x08, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x08, // #
+ 0x08, // #
+ 0x00, //
+
+ // @108 ')' (7 pixels wide)
+ 0x00, //
+ 0x20, // #
+ 0x20, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x20, // #
+ 0x20, // #
+ 0x00, //
+
+ // @120 '*' (7 pixels wide)
+ 0x00, //
+ 0x10, // #
+ 0x7C, // #####
+ 0x10, // #
+ 0x28, // # #
+ 0x28, // # #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @132 '+' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0xFE, // #######
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @144 ',' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x18, // ##
+ 0x10, // #
+ 0x30, // ##
+ 0x20, // #
+ 0x00, //
+
+ // @156 '-' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x7C, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @168 '.' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x30, // ##
+ 0x30, // ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @180 '/' (7 pixels wide)
+ 0x00, //
+ 0x04, // #
+ 0x04, // #
+ 0x08, // #
+ 0x08, // #
+ 0x10, // #
+ 0x10, // #
+ 0x20, // #
+ 0x20, // #
+ 0x40, // #
+ 0x00, //
+ 0x00, //
+
+ // @192 '0' (7 pixels wide)
+ 0x00, //
+ 0x38, // ###
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @204 '1' (7 pixels wide)
+ 0x00, //
+ 0x30, // ##
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x7C, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @216 '2' (7 pixels wide)
+ 0x00, //
+ 0x38, // ###
+ 0x44, // # #
+ 0x04, // #
+ 0x08, // #
+ 0x10, // #
+ 0x20, // #
+ 0x44, // # #
+ 0x7C, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @228 '3' (7 pixels wide)
+ 0x00, //
+ 0x38, // ###
+ 0x44, // # #
+ 0x04, // #
+ 0x18, // ##
+ 0x04, // #
+ 0x04, // #
+ 0x44, // # #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @240 '4' (7 pixels wide)
+ 0x00, //
+ 0x0C, // ##
+ 0x14, // # #
+ 0x14, // # #
+ 0x24, // # #
+ 0x44, // # #
+ 0x7E, // ######
+ 0x04, // #
+ 0x0E, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @252 '5' (7 pixels wide)
+ 0x00, //
+ 0x3C, // ####
+ 0x20, // #
+ 0x20, // #
+ 0x38, // ###
+ 0x04, // #
+ 0x04, // #
+ 0x44, // # #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @264 '6' (7 pixels wide)
+ 0x00, //
+ 0x1C, // ###
+ 0x20, // #
+ 0x40, // #
+ 0x78, // ####
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @276 '7' (7 pixels wide)
+ 0x00, //
+ 0x7C, // #####
+ 0x44, // # #
+ 0x04, // #
+ 0x08, // #
+ 0x08, // #
+ 0x08, // #
+ 0x10, // #
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @288 '8' (7 pixels wide)
+ 0x00, //
+ 0x38, // ###
+ 0x44, // # #
+ 0x44, // # #
+ 0x38, // ###
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @300 '9' (7 pixels wide)
+ 0x00, //
+ 0x38, // ###
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x3C, // ####
+ 0x04, // #
+ 0x08, // #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @312 ':' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x30, // ##
+ 0x30, // ##
+ 0x00, //
+ 0x00, //
+ 0x30, // ##
+ 0x30, // ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @324 ';' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x18, // ##
+ 0x18, // ##
+ 0x00, //
+ 0x00, //
+ 0x18, // ##
+ 0x30, // ##
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @336 '<' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x0C, // ##
+ 0x10, // #
+ 0x60, // ##
+ 0x80, // #
+ 0x60, // ##
+ 0x10, // #
+ 0x0C, // ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @348 '=' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x7C, // #####
+ 0x00, //
+ 0x7C, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @360 '>' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xC0, // ##
+ 0x20, // #
+ 0x18, // ##
+ 0x04, // #
+ 0x18, // ##
+ 0x20, // #
+ 0xC0, // ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @372 '?' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x18, // ##
+ 0x24, // # #
+ 0x04, // #
+ 0x08, // #
+ 0x10, // #
+ 0x00, //
+ 0x30, // ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @384 '@' (7 pixels wide)
+ 0x38, // ###
+ 0x44, // # #
+ 0x44, // # #
+ 0x4C, // # ##
+ 0x54, // # # #
+ 0x54, // # # #
+ 0x4C, // # ##
+ 0x40, // #
+ 0x44, // # #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+
+ // @396 'A' (7 pixels wide)
+ 0x00, //
+ 0x30, // ##
+ 0x10, // #
+ 0x28, // # #
+ 0x28, // # #
+ 0x28, // # #
+ 0x7C, // #####
+ 0x44, // # #
+ 0xEE, // ### ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @408 'B' (7 pixels wide)
+ 0x00, //
+ 0xF8, // #####
+ 0x44, // # #
+ 0x44, // # #
+ 0x78, // ####
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0xF8, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @420 'C' (7 pixels wide)
+ 0x00, //
+ 0x3C, // ####
+ 0x44, // # #
+ 0x40, // #
+ 0x40, // #
+ 0x40, // #
+ 0x40, // #
+ 0x44, // # #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @432 'D' (7 pixels wide)
+ 0x00, //
+ 0xF0, // ####
+ 0x48, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x48, // # #
+ 0xF0, // ####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @444 'E' (7 pixels wide)
+ 0x00, //
+ 0xFC, // ######
+ 0x44, // # #
+ 0x50, // # #
+ 0x70, // ###
+ 0x50, // # #
+ 0x40, // #
+ 0x44, // # #
+ 0xFC, // ######
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @456 'F' (7 pixels wide)
+ 0x00, //
+ 0x7E, // ######
+ 0x22, // # #
+ 0x28, // # #
+ 0x38, // ###
+ 0x28, // # #
+ 0x20, // #
+ 0x20, // #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @468 'G' (7 pixels wide)
+ 0x00, //
+ 0x3C, // ####
+ 0x44, // # #
+ 0x40, // #
+ 0x40, // #
+ 0x4E, // # ###
+ 0x44, // # #
+ 0x44, // # #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @480 'H' (7 pixels wide)
+ 0x00, //
+ 0xEE, // ### ###
+ 0x44, // # #
+ 0x44, // # #
+ 0x7C, // #####
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0xEE, // ### ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @492 'I' (7 pixels wide)
+ 0x00, //
+ 0x7C, // #####
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x7C, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @504 'J' (7 pixels wide)
+ 0x00, //
+ 0x3C, // ####
+ 0x08, // #
+ 0x08, // #
+ 0x08, // #
+ 0x48, // # #
+ 0x48, // # #
+ 0x48, // # #
+ 0x30, // ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @516 'K' (7 pixels wide)
+ 0x00, //
+ 0xEE, // ### ###
+ 0x44, // # #
+ 0x48, // # #
+ 0x50, // # #
+ 0x70, // ###
+ 0x48, // # #
+ 0x44, // # #
+ 0xE6, // ### ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @528 'L' (7 pixels wide)
+ 0x00, //
+ 0x70, // ###
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x24, // # #
+ 0x24, // # #
+ 0x7C, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @540 'M' (7 pixels wide)
+ 0x00, //
+ 0xEE, // ### ###
+ 0x6C, // ## ##
+ 0x6C, // ## ##
+ 0x54, // # # #
+ 0x54, // # # #
+ 0x44, // # #
+ 0x44, // # #
+ 0xEE, // ### ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @552 'N' (7 pixels wide)
+ 0x00, //
+ 0xEE, // ### ###
+ 0x64, // ## #
+ 0x64, // ## #
+ 0x54, // # # #
+ 0x54, // # # #
+ 0x54, // # # #
+ 0x4C, // # ##
+ 0xEC, // ### ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @564 'O' (7 pixels wide)
+ 0x00, //
+ 0x38, // ###
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @576 'P' (7 pixels wide)
+ 0x00, //
+ 0x78, // ####
+ 0x24, // # #
+ 0x24, // # #
+ 0x24, // # #
+ 0x38, // ###
+ 0x20, // #
+ 0x20, // #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @588 'Q' (7 pixels wide)
+ 0x00, //
+ 0x38, // ###
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x38, // ###
+ 0x1C, // ###
+ 0x00, //
+ 0x00, //
+
+ // @600 'R' (7 pixels wide)
+ 0x00, //
+ 0xF8, // #####
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x78, // ####
+ 0x48, // # #
+ 0x44, // # #
+ 0xE2, // ### #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @612 'S' (7 pixels wide)
+ 0x00, //
+ 0x34, // ## #
+ 0x4C, // # ##
+ 0x40, // #
+ 0x38, // ###
+ 0x04, // #
+ 0x04, // #
+ 0x64, // ## #
+ 0x58, // # ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @624 'T' (7 pixels wide)
+ 0x00, //
+ 0xFE, // #######
+ 0x92, // # # #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @636 'U' (7 pixels wide)
+ 0x00, //
+ 0xEE, // ### ###
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @648 'V' (7 pixels wide)
+ 0x00, //
+ 0xEE, // ### ###
+ 0x44, // # #
+ 0x44, // # #
+ 0x28, // # #
+ 0x28, // # #
+ 0x28, // # #
+ 0x10, // #
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @660 'W' (7 pixels wide)
+ 0x00, //
+ 0xEE, // ### ###
+ 0x44, // # #
+ 0x44, // # #
+ 0x54, // # # #
+ 0x54, // # # #
+ 0x54, // # # #
+ 0x54, // # # #
+ 0x28, // # #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @672 'X' (7 pixels wide)
+ 0x00, //
+ 0xC6, // ## ##
+ 0x44, // # #
+ 0x28, // # #
+ 0x10, // #
+ 0x10, // #
+ 0x28, // # #
+ 0x44, // # #
+ 0xC6, // ## ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @684 'Y' (7 pixels wide)
+ 0x00, //
+ 0xEE, // ### ###
+ 0x44, // # #
+ 0x28, // # #
+ 0x28, // # #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @696 'Z' (7 pixels wide)
+ 0x00, //
+ 0x7C, // #####
+ 0x44, // # #
+ 0x08, // #
+ 0x10, // #
+ 0x10, // #
+ 0x20, // #
+ 0x44, // # #
+ 0x7C, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @708 '[' (7 pixels wide)
+ 0x00, //
+ 0x38, // ###
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x38, // ###
+ 0x00, //
+
+ // @720 '\' (7 pixels wide)
+ 0x00, //
+ 0x40, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x10, // #
+ 0x10, // #
+ 0x08, // #
+ 0x08, // #
+ 0x08, // #
+ 0x00, //
+ 0x00, //
+
+ // @732 ']' (7 pixels wide)
+ 0x00, //
+ 0x38, // ###
+ 0x08, // #
+ 0x08, // #
+ 0x08, // #
+ 0x08, // #
+ 0x08, // #
+ 0x08, // #
+ 0x08, // #
+ 0x08, // #
+ 0x38, // ###
+ 0x00, //
+
+ // @744 '^' (7 pixels wide)
+ 0x00, //
+ 0x10, // #
+ 0x10, // #
+ 0x28, // # #
+ 0x44, // # #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @756 '_' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xFE, // #######
+
+ // @768 '`' (7 pixels wide)
+ 0x00, //
+ 0x10, // #
+ 0x08, // #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @780 'a' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x38, // ###
+ 0x44, // # #
+ 0x3C, // ####
+ 0x44, // # #
+ 0x44, // # #
+ 0x3E, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @792 'b' (7 pixels wide)
+ 0x00, //
+ 0xC0, // ##
+ 0x40, // #
+ 0x58, // # ##
+ 0x64, // ## #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0xF8, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @804 'c' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x3C, // ####
+ 0x44, // # #
+ 0x40, // #
+ 0x40, // #
+ 0x44, // # #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @816 'd' (7 pixels wide)
+ 0x00, //
+ 0x0C, // ##
+ 0x04, // #
+ 0x34, // ## #
+ 0x4C, // # ##
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x3E, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @828 'e' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x38, // ###
+ 0x44, // # #
+ 0x7C, // #####
+ 0x40, // #
+ 0x40, // #
+ 0x3C, // ####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @840 'f' (7 pixels wide)
+ 0x00, //
+ 0x1C, // ###
+ 0x20, // #
+ 0x7C, // #####
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x7C, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @852 'g' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x36, // ## ##
+ 0x4C, // # ##
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x3C, // ####
+ 0x04, // #
+ 0x38, // ###
+ 0x00, //
+
+ // @864 'h' (7 pixels wide)
+ 0x00, //
+ 0xC0, // ##
+ 0x40, // #
+ 0x58, // # ##
+ 0x64, // ## #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0xEE, // ### ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @876 'i' (7 pixels wide)
+ 0x00, //
+ 0x10, // #
+ 0x00, //
+ 0x70, // ###
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x7C, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @888 'j' (7 pixels wide)
+ 0x00, //
+ 0x10, // #
+ 0x00, //
+ 0x78, // ####
+ 0x08, // #
+ 0x08, // #
+ 0x08, // #
+ 0x08, // #
+ 0x08, // #
+ 0x08, // #
+ 0x70, // ###
+ 0x00, //
+
+ // @900 'k' (7 pixels wide)
+ 0x00, //
+ 0xC0, // ##
+ 0x40, // #
+ 0x5C, // # ###
+ 0x48, // # #
+ 0x70, // ###
+ 0x50, // # #
+ 0x48, // # #
+ 0xDC, // ## ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @912 'l' (7 pixels wide)
+ 0x00, //
+ 0x30, // ##
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x7C, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @924 'm' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xE8, // ### #
+ 0x54, // # # #
+ 0x54, // # # #
+ 0x54, // # # #
+ 0x54, // # # #
+ 0xFE, // #######
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @936 'n' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xD8, // ## ##
+ 0x64, // ## #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0xEE, // ### ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @948 'o' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x38, // ###
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @960 'p' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xD8, // ## ##
+ 0x64, // ## #
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x78, // ####
+ 0x40, // #
+ 0xE0, // ###
+ 0x00, //
+
+ // @972 'q' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x36, // ## ##
+ 0x4C, // # ##
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x3C, // ####
+ 0x04, // #
+ 0x0E, // ###
+ 0x00, //
+
+ // @984 'r' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x6C, // ## ##
+ 0x30, // ##
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x7C, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @996 's' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x3C, // ####
+ 0x44, // # #
+ 0x38, // ###
+ 0x04, // #
+ 0x44, // # #
+ 0x78, // ####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @1008 't' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x20, // #
+ 0x7C, // #####
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x22, // # #
+ 0x1C, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @1020 'u' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xCC, // ## ##
+ 0x44, // # #
+ 0x44, // # #
+ 0x44, // # #
+ 0x4C, // # ##
+ 0x36, // ## ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @1032 'v' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xEE, // ### ###
+ 0x44, // # #
+ 0x44, // # #
+ 0x28, // # #
+ 0x28, // # #
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @1044 'w' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xEE, // ### ###
+ 0x44, // # #
+ 0x54, // # # #
+ 0x54, // # # #
+ 0x54, // # # #
+ 0x28, // # #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @1056 'x' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xCC, // ## ##
+ 0x48, // # #
+ 0x30, // ##
+ 0x30, // ##
+ 0x48, // # #
+ 0xCC, // ## ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @1068 'y' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xEE, // ### ###
+ 0x44, // # #
+ 0x24, // # #
+ 0x28, // # #
+ 0x18, // ##
+ 0x10, // #
+ 0x10, // #
+ 0x78, // ####
+ 0x00, //
+
+ // @1080 'z' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x7C, // #####
+ 0x48, // # #
+ 0x10, // #
+ 0x20, // #
+ 0x44, // # #
+ 0x7C, // #####
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @1092 '{' (7 pixels wide)
+ 0x00, //
+ 0x08, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x20, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x08, // #
+ 0x00, //
+
+ // @1104 '|' (7 pixels wide)
+ 0x00, //
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+
+ // @1116 '}' (7 pixels wide)
+ 0x00, //
+ 0x20, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x08, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x20, // #
+ 0x00, //
+
+ // @1128 '~' (7 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x24, // # #
+ 0x58, // # ##
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+};
+
+sFONT Font12 = {
+ Font12_Table,
+ 7, /* Width */
+ 12, /* Height */
+};
+
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Function_Prototypes
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Functions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/Fonts/font16.c Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,1844 @@
+/**
+ ******************************************************************************
+ * @file font16.c
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 18-February-2014
+ * @brief This file provides text font16 for STM32xx-EVAL's LCD driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2014 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 "fonts.h"
+
+/** @addtogroup Utilities
+ * @{
+ */
+
+/** @addtogroup STM32_EVAL
+ * @{
+ */
+
+/** @addtogroup Common
+ * @{
+ */
+
+/** @addtogroup FONTS
+ * @brief This file provides text font16 for STM32xx-EVAL's LCD driver.
+ * @{
+ */
+
+/** @defgroup FONTS_Private_Types
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Defines
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Macros
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Variables
+ * @{
+ */
+//
+// Font data for Courier New 12pt
+//
+
+const uint8_t Font16_Table[] =
+{
+ // @0 ' ' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @32 '!' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x00, 0x00, //
+ 0x0C, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @64 '"' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1D, 0xC0, // ### ###
+ 0x1D, 0xC0, // ### ###
+ 0x08, 0x80, // # #
+ 0x08, 0x80, // # #
+ 0x08, 0x80, // # #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @96 '#' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x0D, 0x80, // ## ##
+ 0x0D, 0x80, // ## ##
+ 0x0D, 0x80, // ## ##
+ 0x0D, 0x80, // ## ##
+ 0x3F, 0xC0, // ########
+ 0x1B, 0x00, // ## ##
+ 0x3F, 0xC0, // ########
+ 0x1B, 0x00, // ## ##
+ 0x1B, 0x00, // ## ##
+ 0x1B, 0x00, // ## ##
+ 0x1B, 0x00, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @128 '$' (11 pixels wide)
+ 0x04, 0x00, // #
+ 0x1F, 0x80, // ######
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x38, 0x00, // ###
+ 0x1E, 0x00, // ####
+ 0x0F, 0x00, // ####
+ 0x03, 0x80, // ###
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x3F, 0x00, // ######
+ 0x04, 0x00, // #
+ 0x04, 0x00, // #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @160 '%' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x18, 0x00, // ##
+ 0x24, 0x00, // # #
+ 0x24, 0x00, // # #
+ 0x18, 0xC0, // ## ##
+ 0x07, 0x80, // ####
+ 0x1E, 0x00, // ####
+ 0x31, 0x80, // ## ##
+ 0x02, 0x40, // # #
+ 0x02, 0x40, // # #
+ 0x01, 0x80, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @192 '&' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x0F, 0x00, // ####
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x1D, 0x80, // ### ##
+ 0x37, 0x00, // ## ###
+ 0x33, 0x00, // ## ##
+ 0x1D, 0x80, // ### ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @224 ''' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x07, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x02, 0x00, // #
+ 0x02, 0x00, // #
+ 0x02, 0x00, // #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @256 '(' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0E, 0x00, // ###
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0E, 0x00, // ###
+ 0x06, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @288 ')' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x1C, 0x00, // ###
+ 0x18, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @320 '*' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x3F, 0xC0, // ########
+ 0x3F, 0xC0, // ########
+ 0x0F, 0x00, // ####
+ 0x1F, 0x80, // ######
+ 0x19, 0x80, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @352 '+' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x04, 0x00, // #
+ 0x04, 0x00, // #
+ 0x04, 0x00, // #
+ 0x3F, 0x80, // #######
+ 0x04, 0x00, // #
+ 0x04, 0x00, // #
+ 0x04, 0x00, // #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @384 ',' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x06, 0x00, // ##
+ 0x04, 0x00, // #
+ 0x0C, 0x00, // ##
+ 0x08, 0x00, // #
+ 0x08, 0x00, // #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @416 '-' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3F, 0x80, // #######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @448 '.' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @480 '/' (11 pixels wide)
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @512 '0' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x0E, 0x00, // ###
+ 0x1B, 0x00, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x1B, 0x00, // ## ##
+ 0x0E, 0x00, // ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @544 '1' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x06, 0x00, // ##
+ 0x3E, 0x00, // #####
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x3F, 0xC0, // ########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @576 '2' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x0F, 0x00, // ####
+ 0x19, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x03, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x3F, 0x80, // #######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @608 '3' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x3F, 0x00, // ######
+ 0x61, 0x80, // ## ##
+ 0x01, 0x80, // ##
+ 0x03, 0x00, // ##
+ 0x1F, 0x00, // #####
+ 0x03, 0x80, // ###
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x61, 0x80, // ## ##
+ 0x3F, 0x00, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @640 '4' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x07, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x0F, 0x00, // ####
+ 0x0B, 0x00, // # ##
+ 0x1B, 0x00, // ## ##
+ 0x13, 0x00, // # ##
+ 0x33, 0x00, // ## ##
+ 0x3F, 0x80, // #######
+ 0x03, 0x00, // ##
+ 0x0F, 0x80, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @672 '5' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x1F, 0x80, // ######
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x1F, 0x00, // #####
+ 0x11, 0x80, // # ##
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x21, 0x80, // # ##
+ 0x1F, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @704 '6' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x07, 0x80, // ####
+ 0x1C, 0x00, // ###
+ 0x18, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x37, 0x00, // ## ###
+ 0x39, 0x80, // ### ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x19, 0x80, // ## ##
+ 0x0F, 0x00, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @736 '7' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x7F, 0x00, // #######
+ 0x43, 0x00, // # ##
+ 0x03, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @768 '8' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x1F, 0x00, // #####
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x1F, 0x00, // #####
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x1F, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @800 '9' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x1E, 0x00, // ####
+ 0x33, 0x00, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x33, 0x80, // ## ###
+ 0x1D, 0x80, // ### ##
+ 0x01, 0x80, // ##
+ 0x03, 0x00, // ##
+ 0x07, 0x00, // ###
+ 0x3C, 0x00, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @832 ':' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @864 ';' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x06, 0x00, // ##
+ 0x04, 0x00, // #
+ 0x08, 0x00, // #
+ 0x08, 0x00, // #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @896 '<' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0xC0, // ##
+ 0x03, 0x00, // ##
+ 0x04, 0x00, // #
+ 0x18, 0x00, // ##
+ 0x60, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x04, 0x00, // #
+ 0x03, 0x00, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @928 '=' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7F, 0xC0, // #########
+ 0x00, 0x00, //
+ 0x7F, 0xC0, // #########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @960 '>' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x60, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x04, 0x00, // #
+ 0x03, 0x00, // ##
+ 0x00, 0xC0, // ##
+ 0x03, 0x00, // ##
+ 0x04, 0x00, // #
+ 0x18, 0x00, // ##
+ 0x60, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @992 '?' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0x00, // #####
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x01, 0x80, // ##
+ 0x07, 0x00, // ###
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x00, 0x00, //
+ 0x0C, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1024 '@' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x0E, 0x00, // ###
+ 0x11, 0x00, // # #
+ 0x21, 0x00, // # #
+ 0x21, 0x00, // # #
+ 0x27, 0x00, // # ###
+ 0x29, 0x00, // # # #
+ 0x29, 0x00, // # # #
+ 0x27, 0x00, // # ###
+ 0x20, 0x00, // #
+ 0x11, 0x00, // # #
+ 0x0E, 0x00, // ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1056 'A' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3F, 0x00, // ######
+ 0x0F, 0x00, // ####
+ 0x09, 0x00, // # #
+ 0x19, 0x80, // ## ##
+ 0x19, 0x80, // ## ##
+ 0x1F, 0x80, // ######
+ 0x30, 0xC0, // ## ##
+ 0x30, 0xC0, // ## ##
+ 0x79, 0xE0, // #### ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1088 'B' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7F, 0x00, // #######
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x3F, 0x00, // ######
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x7F, 0x00, // #######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1120 'C' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0x40, // ##### #
+ 0x30, 0xC0, // ## ##
+ 0x60, 0x40, // ## #
+ 0x60, 0x00, // ##
+ 0x60, 0x00, // ##
+ 0x60, 0x00, // ##
+ 0x60, 0x40, // ## #
+ 0x30, 0x80, // ## #
+ 0x1F, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1152 'D' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7F, 0x00, // #######
+ 0x31, 0x80, // ## ##
+ 0x30, 0xC0, // ## ##
+ 0x30, 0xC0, // ## ##
+ 0x30, 0xC0, // ## ##
+ 0x30, 0xC0, // ## ##
+ 0x30, 0xC0, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x7F, 0x00, // #######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1184 'E' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7F, 0x80, // ########
+ 0x30, 0x80, // ## #
+ 0x30, 0x80, // ## #
+ 0x32, 0x00, // ## #
+ 0x3E, 0x00, // #####
+ 0x32, 0x00, // ## #
+ 0x30, 0x80, // ## #
+ 0x30, 0x80, // ## #
+ 0x7F, 0x80, // ########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1216 'F' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7F, 0xC0, // #########
+ 0x30, 0x40, // ## #
+ 0x30, 0x40, // ## #
+ 0x32, 0x00, // ## #
+ 0x3E, 0x00, // #####
+ 0x32, 0x00, // ## #
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x7C, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1248 'G' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1E, 0x80, // #### #
+ 0x31, 0x80, // ## ##
+ 0x60, 0x80, // ## #
+ 0x60, 0x00, // ##
+ 0x60, 0x00, // ##
+ 0x67, 0xC0, // ## #####
+ 0x61, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x1F, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1280 'H' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7B, 0xC0, // #### ####
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x3F, 0x80, // #######
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x7B, 0xC0, // #### ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1312 'I' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3F, 0xC0, // ########
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x3F, 0xC0, // ########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1344 'J' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0xC0, // #######
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x63, 0x00, // ## ##
+ 0x63, 0x00, // ## ##
+ 0x63, 0x00, // ## ##
+ 0x3E, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1376 'K' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7B, 0xC0, // #### ####
+ 0x31, 0x80, // ## ##
+ 0x33, 0x00, // ## ##
+ 0x36, 0x00, // ## ##
+ 0x3C, 0x00, // ####
+ 0x3E, 0x00, // #####
+ 0x33, 0x00, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x79, 0xC0, // #### ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1408 'L' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7E, 0x00, // ######
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x40, // ## #
+ 0x18, 0x40, // ## #
+ 0x18, 0x40, // ## #
+ 0x7F, 0xC0, // #########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1440 'M' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xE0, 0xE0, // ### ###
+ 0x60, 0xC0, // ## ##
+ 0x71, 0xC0, // ### ###
+ 0x7B, 0xC0, // #### ####
+ 0x6A, 0xC0, // ## # # ##
+ 0x6E, 0xC0, // ## ### ##
+ 0x64, 0xC0, // ## # ##
+ 0x60, 0xC0, // ## ##
+ 0xFB, 0xE0, // ##### #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1472 'N' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x73, 0xC0, // ### ####
+ 0x31, 0x80, // ## ##
+ 0x39, 0x80, // ### ##
+ 0x3D, 0x80, // #### ##
+ 0x35, 0x80, // ## # ##
+ 0x37, 0x80, // ## ####
+ 0x33, 0x80, // ## ###
+ 0x31, 0x80, // ## ##
+ 0x79, 0x80, // #### ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1504 'O' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0x00, // #####
+ 0x31, 0x80, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x1F, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1536 'P' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7F, 0x00, // #######
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x3F, 0x00, // ######
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x7E, 0x00, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1568 'Q' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0x00, // #####
+ 0x31, 0x80, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x1F, 0x00, // #####
+ 0x0C, 0xC0, // ## ##
+ 0x1F, 0x80, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1600 'R' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7F, 0x00, // #######
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x3E, 0x00, // #####
+ 0x33, 0x00, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x7C, 0xE0, // ##### ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1632 'S' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0x80, // ######
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x38, 0x00, // ###
+ 0x1F, 0x00, // #####
+ 0x03, 0x80, // ###
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x3F, 0x00, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1664 'T' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7F, 0x80, // ########
+ 0x4C, 0x80, // # ## #
+ 0x4C, 0x80, // # ## #
+ 0x4C, 0x80, // # ## #
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x3F, 0x00, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1696 'U' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7B, 0xC0, // #### ####
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x1F, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1728 'V' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7B, 0xC0, // #### ####
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x1B, 0x00, // ## ##
+ 0x1B, 0x00, // ## ##
+ 0x1B, 0x00, // ## ##
+ 0x0A, 0x00, // # #
+ 0x0E, 0x00, // ###
+ 0x0E, 0x00, // ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1760 'W' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFB, 0xE0, // ##### #####
+ 0x60, 0xC0, // ## ##
+ 0x64, 0xC0, // ## # ##
+ 0x6E, 0xC0, // ## ### ##
+ 0x6E, 0xC0, // ## ### ##
+ 0x2A, 0x80, // # # # #
+ 0x3B, 0x80, // ### ###
+ 0x3B, 0x80, // ### ###
+ 0x31, 0x80, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1792 'X' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7B, 0xC0, // #### ####
+ 0x31, 0x80, // ## ##
+ 0x1B, 0x00, // ## ##
+ 0x0E, 0x00, // ###
+ 0x0E, 0x00, // ###
+ 0x0E, 0x00, // ###
+ 0x1B, 0x00, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x7B, 0xC0, // #### ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1824 'Y' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x79, 0xE0, // #### ####
+ 0x30, 0xC0, // ## ##
+ 0x19, 0x80, // ## ##
+ 0x0F, 0x00, // ####
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x1F, 0x80, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1856 'Z' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3F, 0x80, // #######
+ 0x21, 0x80, // # ##
+ 0x23, 0x00, // # ##
+ 0x06, 0x00, // ##
+ 0x04, 0x00, // #
+ 0x0C, 0x00, // ##
+ 0x18, 0x80, // ## #
+ 0x30, 0x80, // ## #
+ 0x3F, 0x80, // #######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1888 '[' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x07, 0x80, // ####
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x07, 0x80, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1920 '\' (11 pixels wide)
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1952 ']' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x1E, 0x00, // ####
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x1E, 0x00, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1984 '^' (11 pixels wide)
+ 0x04, 0x00, // #
+ 0x0A, 0x00, // # #
+ 0x0A, 0x00, // # #
+ 0x11, 0x00, // # #
+ 0x20, 0x80, // # #
+ 0x20, 0x80, // # #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2016 '_' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFF, 0xE0, // ###########
+
+ // @2048 '`' (11 pixels wide)
+ 0x08, 0x00, // #
+ 0x04, 0x00, // #
+ 0x02, 0x00, // #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2080 'a' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0x00, // #####
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x1F, 0x80, // ######
+ 0x31, 0x80, // ## ##
+ 0x33, 0x80, // ## ###
+ 0x1D, 0xC0, // ### ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2112 'b' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x70, 0x00, // ###
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x37, 0x00, // ## ###
+ 0x39, 0x80, // ### ##
+ 0x30, 0xC0, // ## ##
+ 0x30, 0xC0, // ## ##
+ 0x30, 0xC0, // ## ##
+ 0x39, 0x80, // ### ##
+ 0x77, 0x00, // ### ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2144 'c' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1E, 0x80, // #### #
+ 0x31, 0x80, // ## ##
+ 0x60, 0x80, // ## #
+ 0x60, 0x00, // ##
+ 0x60, 0x80, // ## #
+ 0x31, 0x80, // ## ##
+ 0x1F, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2176 'd' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x03, 0x80, // ###
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x1D, 0x80, // ### ##
+ 0x33, 0x80, // ## ###
+ 0x61, 0x80, // ## ##
+ 0x61, 0x80, // ## ##
+ 0x61, 0x80, // ## ##
+ 0x33, 0x80, // ## ###
+ 0x1D, 0xC0, // ### ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2208 'e' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0x00, // #####
+ 0x31, 0x80, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x7F, 0xC0, // #########
+ 0x60, 0x00, // ##
+ 0x30, 0xC0, // ## ##
+ 0x1F, 0x80, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2240 'f' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x07, 0xE0, // ######
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x3F, 0x80, // #######
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x3F, 0x80, // #######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2272 'g' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1D, 0xC0, // ### ###
+ 0x33, 0x80, // ## ###
+ 0x61, 0x80, // ## ##
+ 0x61, 0x80, // ## ##
+ 0x61, 0x80, // ## ##
+ 0x33, 0x80, // ## ###
+ 0x1D, 0x80, // ### ##
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x1F, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2304 'h' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x70, 0x00, // ###
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x37, 0x00, // ## ###
+ 0x39, 0x80, // ### ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x7B, 0xC0, // #### ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2336 'i' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x00, 0x00, //
+ 0x1E, 0x00, // ####
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x3F, 0xC0, // ########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2368 'j' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x00, 0x00, //
+ 0x3F, 0x00, // ######
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x3E, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2400 'k' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x70, 0x00, // ###
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x37, 0x80, // ## ####
+ 0x36, 0x00, // ## ##
+ 0x3C, 0x00, // ####
+ 0x3C, 0x00, // ####
+ 0x36, 0x00, // ## ##
+ 0x33, 0x00, // ## ##
+ 0x77, 0xC0, // ### #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2432 'l' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x1E, 0x00, // ####
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x3F, 0xC0, // ########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2464 'm' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7F, 0x80, // ########
+ 0x36, 0xC0, // ## ## ##
+ 0x36, 0xC0, // ## ## ##
+ 0x36, 0xC0, // ## ## ##
+ 0x36, 0xC0, // ## ## ##
+ 0x36, 0xC0, // ## ## ##
+ 0x76, 0xE0, // ### ## ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2496 'n' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x77, 0x00, // ### ###
+ 0x39, 0x80, // ### ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x7B, 0xC0, // #### ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2528 'o' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0x00, // #####
+ 0x31, 0x80, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x60, 0xC0, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x1F, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2560 'p' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x77, 0x00, // ### ###
+ 0x39, 0x80, // ### ##
+ 0x30, 0xC0, // ## ##
+ 0x30, 0xC0, // ## ##
+ 0x30, 0xC0, // ## ##
+ 0x39, 0x80, // ### ##
+ 0x37, 0x00, // ## ###
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x7C, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2592 'q' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1D, 0xC0, // ### ###
+ 0x33, 0x80, // ## ###
+ 0x61, 0x80, // ## ##
+ 0x61, 0x80, // ## ##
+ 0x61, 0x80, // ## ##
+ 0x33, 0x80, // ## ###
+ 0x1D, 0x80, // ### ##
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x07, 0xC0, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2624 'r' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7B, 0x80, // #### ###
+ 0x1C, 0xC0, // ### ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x7F, 0x00, // #######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2656 's' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0x80, // ######
+ 0x31, 0x80, // ## ##
+ 0x3C, 0x00, // ####
+ 0x1F, 0x00, // #####
+ 0x03, 0x80, // ###
+ 0x31, 0x80, // ## ##
+ 0x3F, 0x00, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2688 't' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x7F, 0x00, // #######
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x80, // ## #
+ 0x0F, 0x00, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2720 'u' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x73, 0x80, // ### ###
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x33, 0x80, // ## ###
+ 0x1D, 0xC0, // ### ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2752 'v' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7B, 0xC0, // #### ####
+ 0x31, 0x80, // ## ##
+ 0x31, 0x80, // ## ##
+ 0x1B, 0x00, // ## ##
+ 0x1B, 0x00, // ## ##
+ 0x0E, 0x00, // ###
+ 0x0E, 0x00, // ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2784 'w' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xF1, 0xE0, // #### ####
+ 0x60, 0xC0, // ## ##
+ 0x64, 0xC0, // ## # ##
+ 0x6E, 0xC0, // ## ### ##
+ 0x3B, 0x80, // ### ###
+ 0x3B, 0x80, // ### ###
+ 0x31, 0x80, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2816 'x' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7B, 0xC0, // #### ####
+ 0x1B, 0x00, // ## ##
+ 0x0E, 0x00, // ###
+ 0x0E, 0x00, // ###
+ 0x0E, 0x00, // ###
+ 0x1B, 0x00, // ## ##
+ 0x7B, 0xC0, // #### ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2848 'y' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x79, 0xE0, // #### ####
+ 0x30, 0xC0, // ## ##
+ 0x19, 0x80, // ## ##
+ 0x19, 0x80, // ## ##
+ 0x0B, 0x00, // # ##
+ 0x0F, 0x00, // ####
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x3E, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2880 'z' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3F, 0x80, // #######
+ 0x21, 0x80, // # ##
+ 0x03, 0x00, // ##
+ 0x0E, 0x00, // ###
+ 0x18, 0x00, // ##
+ 0x30, 0x80, // ## #
+ 0x3F, 0x80, // #######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2912 '{' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x06, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2944 '|' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2976 '}' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x0C, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3008 '~' (11 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x18, 0x00, // ##
+ 0x24, 0x80, // # # #
+ 0x03, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+};
+
+sFONT Font16 = {
+ Font16_Table,
+ 11, /* Width */
+ 16, /* Height */
+};
+
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Function_Prototypes
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Functions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/Fonts/font20.c Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,2223 @@
+/**
+ ******************************************************************************
+ * @file font20.c
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 18-February-2014
+ * @brief This file provides text font20 for STM32xx-EVAL's LCD driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2014 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 "fonts.h"
+
+/** @addtogroup Utilities
+ * @{
+ */
+
+/** @addtogroup STM32_EVAL
+ * @{
+ */
+
+/** @addtogroup Common
+ * @{
+ */
+
+/** @addtogroup FONTS
+ * @brief This file provides text font20 for STM32xx-EVAL's LCD driver.
+ * @{
+ */
+
+/** @defgroup FONTS_Private_Types
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Defines
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Macros
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Variables
+ * @{
+ */
+
+// Character bitmaps for Courier New 15pt
+const uint8_t Font20_Table[] =
+{
+ // @0 ' ' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @40 '!' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x07, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x02, 0x00, // #
+ 0x02, 0x00, // #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x07, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @80 '"' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1C, 0xE0, // ### ###
+ 0x1C, 0xE0, // ### ###
+ 0x1C, 0xE0, // ### ###
+ 0x08, 0x40, // # #
+ 0x08, 0x40, // # #
+ 0x08, 0x40, // # #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @120 '#' (14 pixels wide)
+ 0x0C, 0xC0, // ## ##
+ 0x0C, 0xC0, // ## ##
+ 0x0C, 0xC0, // ## ##
+ 0x0C, 0xC0, // ## ##
+ 0x0C, 0xC0, // ## ##
+ 0x3F, 0xF0, // ##########
+ 0x3F, 0xF0, // ##########
+ 0x0C, 0xC0, // ## ##
+ 0x0C, 0xC0, // ## ##
+ 0x3F, 0xF0, // ##########
+ 0x3F, 0xF0, // ##########
+ 0x0C, 0xC0, // ## ##
+ 0x0C, 0xC0, // ## ##
+ 0x0C, 0xC0, // ## ##
+ 0x0C, 0xC0, // ## ##
+ 0x0C, 0xC0, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @160 '$' (14 pixels wide)
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x07, 0xE0, // ######
+ 0x0F, 0xE0, // #######
+ 0x18, 0x60, // ## ##
+ 0x18, 0x00, // ##
+ 0x1F, 0x00, // #####
+ 0x0F, 0xC0, // ######
+ 0x00, 0xE0, // ###
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x1F, 0xC0, // #######
+ 0x1F, 0x80, // ######
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @200 '%' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x1C, 0x00, // ###
+ 0x22, 0x00, // # #
+ 0x22, 0x00, // # #
+ 0x22, 0x00, // # #
+ 0x1C, 0x60, // ### ##
+ 0x01, 0xE0, // ####
+ 0x0F, 0x80, // #####
+ 0x3C, 0x00, // ####
+ 0x31, 0xC0, // ## ###
+ 0x02, 0x20, // # #
+ 0x02, 0x20, // # #
+ 0x02, 0x20, // # #
+ 0x01, 0xC0, // ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @240 '&' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x03, 0xE0, // #####
+ 0x0F, 0xE0, // #######
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0F, 0x30, // #### ##
+ 0x1F, 0xF0, // #########
+ 0x19, 0xE0, // ## ####
+ 0x18, 0xC0, // ## ##
+ 0x1F, 0xF0, // #########
+ 0x07, 0xB0, // #### ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @280 ''' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x03, 0x80, // ###
+ 0x03, 0x80, // ###
+ 0x03, 0x80, // ###
+ 0x01, 0x00, // #
+ 0x01, 0x00, // #
+ 0x01, 0x00, // #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @320 '(' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @360 ')' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @400 '*' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x1B, 0x60, // ## ## ##
+ 0x1F, 0xE0, // ########
+ 0x07, 0x80, // ####
+ 0x07, 0x80, // ####
+ 0x0F, 0xC0, // ######
+ 0x0C, 0xC0, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @440 '+' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x3F, 0xF0, // ##########
+ 0x3F, 0xF0, // ##########
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @480 ',' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x03, 0x80, // ###
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x04, 0x00, // #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @520 '-' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3F, 0xE0, // #########
+ 0x3F, 0xE0, // #########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @560 '.' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x03, 0x80, // ###
+ 0x03, 0x80, // ###
+ 0x03, 0x80, // ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @600 '/' (14 pixels wide)
+ 0x00, 0x60, // ##
+ 0x00, 0x60, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @640 '0' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x0F, 0x80, // #####
+ 0x1F, 0xC0, // #######
+ 0x18, 0xC0, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x1F, 0xC0, // #######
+ 0x0F, 0x80, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @680 '1' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x03, 0x00, // ##
+ 0x1F, 0x00, // #####
+ 0x1F, 0x00, // #####
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x1F, 0xE0, // ########
+ 0x1F, 0xE0, // ########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @720 '2' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x0F, 0x80, // #####
+ 0x1F, 0xC0, // #######
+ 0x38, 0xE0, // ### ###
+ 0x30, 0x60, // ## ##
+ 0x00, 0x60, // ##
+ 0x00, 0xC0, // ##
+ 0x01, 0x80, // ##
+ 0x03, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x3F, 0xE0, // #########
+ 0x3F, 0xE0, // #########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @760 '3' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x0F, 0x80, // #####
+ 0x3F, 0xC0, // ########
+ 0x30, 0xE0, // ## ###
+ 0x00, 0x60, // ##
+ 0x00, 0xE0, // ###
+ 0x07, 0xC0, // #####
+ 0x07, 0xC0, // #####
+ 0x00, 0xE0, // ###
+ 0x00, 0x60, // ##
+ 0x00, 0x60, // ##
+ 0x60, 0xE0, // ## ###
+ 0x7F, 0xC0, // #########
+ 0x3F, 0x80, // #######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @800 '4' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x01, 0xC0, // ###
+ 0x03, 0xC0, // ####
+ 0x03, 0xC0, // ####
+ 0x06, 0xC0, // ## ##
+ 0x0C, 0xC0, // ## ##
+ 0x0C, 0xC0, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x30, 0xC0, // ## ##
+ 0x3F, 0xE0, // #########
+ 0x3F, 0xE0, // #########
+ 0x00, 0xC0, // ##
+ 0x03, 0xE0, // #####
+ 0x03, 0xE0, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @840 '5' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x1F, 0xC0, // #######
+ 0x1F, 0xC0, // #######
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x1F, 0x80, // ######
+ 0x1F, 0xC0, // #######
+ 0x18, 0xE0, // ## ###
+ 0x00, 0x60, // ##
+ 0x00, 0x60, // ##
+ 0x00, 0x60, // ##
+ 0x30, 0xE0, // ## ###
+ 0x3F, 0xC0, // ########
+ 0x1F, 0x80, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @880 '6' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x03, 0xE0, // #####
+ 0x0F, 0xE0, // #######
+ 0x1E, 0x00, // ####
+ 0x18, 0x00, // ##
+ 0x38, 0x00, // ###
+ 0x37, 0x80, // ## ####
+ 0x3F, 0xC0, // ########
+ 0x38, 0xE0, // ### ###
+ 0x30, 0x60, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x18, 0xE0, // ## ###
+ 0x1F, 0xC0, // #######
+ 0x07, 0x80, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @920 '7' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x3F, 0xE0, // #########
+ 0x3F, 0xE0, // #########
+ 0x30, 0x60, // ## ##
+ 0x00, 0x60, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @960 '8' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x0F, 0x80, // #####
+ 0x1F, 0xC0, // #######
+ 0x38, 0xE0, // ### ###
+ 0x30, 0x60, // ## ##
+ 0x38, 0xE0, // ### ###
+ 0x1F, 0xC0, // #######
+ 0x1F, 0xC0, // #######
+ 0x38, 0xE0, // ### ###
+ 0x30, 0x60, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x38, 0xE0, // ### ###
+ 0x1F, 0xC0, // #######
+ 0x0F, 0x80, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1000 '9' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x0F, 0x00, // ####
+ 0x1F, 0xC0, // #######
+ 0x38, 0xC0, // ### ##
+ 0x30, 0x60, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x38, 0xE0, // ### ###
+ 0x1F, 0xE0, // ########
+ 0x0F, 0x60, // #### ##
+ 0x00, 0xE0, // ###
+ 0x00, 0xC0, // ##
+ 0x03, 0xC0, // ####
+ 0x3F, 0x80, // #######
+ 0x3E, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1040 ':' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x03, 0x80, // ###
+ 0x03, 0x80, // ###
+ 0x03, 0x80, // ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x03, 0x80, // ###
+ 0x03, 0x80, // ###
+ 0x03, 0x80, // ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1080 ';' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x01, 0xC0, // ###
+ 0x01, 0xC0, // ###
+ 0x01, 0xC0, // ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x03, 0x80, // ###
+ 0x03, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x04, 0x00, // #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1120 '<' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x30, // ##
+ 0x00, 0xF0, // ####
+ 0x03, 0xC0, // ####
+ 0x07, 0x00, // ###
+ 0x1C, 0x00, // ###
+ 0x78, 0x00, // ####
+ 0x1C, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x03, 0xC0, // ####
+ 0x00, 0xF0, // ####
+ 0x00, 0x30, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1160 '=' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7F, 0xF0, // ###########
+ 0x7F, 0xF0, // ###########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7F, 0xF0, // ###########
+ 0x7F, 0xF0, // ###########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1200 '>' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x30, 0x00, // ##
+ 0x3C, 0x00, // ####
+ 0x0F, 0x00, // ####
+ 0x03, 0x80, // ###
+ 0x00, 0xE0, // ###
+ 0x00, 0x78, // ####
+ 0x00, 0xE0, // ###
+ 0x03, 0x80, // ###
+ 0x0F, 0x00, // ####
+ 0x3C, 0x00, // ####
+ 0x30, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1240 '?' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x0F, 0x80, // #####
+ 0x1F, 0xC0, // #######
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x00, 0x60, // ##
+ 0x01, 0xC0, // ###
+ 0x03, 0x80, // ###
+ 0x03, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x07, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1280 '@' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x03, 0x80, // ###
+ 0x0C, 0x80, // ## #
+ 0x08, 0x40, // # #
+ 0x10, 0x40, // # #
+ 0x10, 0x40, // # #
+ 0x11, 0xC0, // # ###
+ 0x12, 0x40, // # # #
+ 0x12, 0x40, // # # #
+ 0x12, 0x40, // # # #
+ 0x11, 0xC0, // # ###
+ 0x10, 0x00, // #
+ 0x08, 0x00, // #
+ 0x08, 0x40, // # #
+ 0x07, 0x80, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1320 'A' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0x80, // ######
+ 0x1F, 0x80, // ######
+ 0x03, 0x80, // ###
+ 0x06, 0xC0, // ## ##
+ 0x06, 0xC0, // ## ##
+ 0x0C, 0xC0, // ## ##
+ 0x0C, 0x60, // ## ##
+ 0x1F, 0xE0, // ########
+ 0x1F, 0xE0, // ########
+ 0x30, 0x30, // ## ##
+ 0x78, 0x78, // #### ####
+ 0x78, 0x78, // #### ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1360 'B' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3F, 0x80, // #######
+ 0x3F, 0xC0, // ########
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0xE0, // ## ###
+ 0x1F, 0xC0, // #######
+ 0x1F, 0xE0, // ########
+ 0x18, 0x70, // ## ###
+ 0x18, 0x30, // ## ##
+ 0x18, 0x30, // ## ##
+ 0x3F, 0xF0, // ##########
+ 0x3F, 0xE0, // #########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1400 'C' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x07, 0xB0, // #### ##
+ 0x0F, 0xF0, // ########
+ 0x1C, 0x70, // ### ###
+ 0x38, 0x30, // ### ##
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x38, 0x30, // ### ##
+ 0x1C, 0x70, // ### ###
+ 0x0F, 0xE0, // #######
+ 0x07, 0xC0, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1440 'D' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7F, 0x80, // ########
+ 0x7F, 0xC0, // #########
+ 0x30, 0xE0, // ## ###
+ 0x30, 0x70, // ## ###
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x70, // ## ###
+ 0x30, 0xE0, // ## ###
+ 0x7F, 0xC0, // #########
+ 0x7F, 0x80, // ########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1480 'E' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3F, 0xF0, // ##########
+ 0x3F, 0xF0, // ##########
+ 0x18, 0x30, // ## ##
+ 0x18, 0x30, // ## ##
+ 0x19, 0x80, // ## ##
+ 0x1F, 0x80, // ######
+ 0x1F, 0x80, // ######
+ 0x19, 0x80, // ## ##
+ 0x18, 0x30, // ## ##
+ 0x18, 0x30, // ## ##
+ 0x3F, 0xF0, // ##########
+ 0x3F, 0xF0, // ##########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1520 'F' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3F, 0xF0, // ##########
+ 0x3F, 0xF0, // ##########
+ 0x18, 0x30, // ## ##
+ 0x18, 0x30, // ## ##
+ 0x19, 0x80, // ## ##
+ 0x1F, 0x80, // ######
+ 0x1F, 0x80, // ######
+ 0x19, 0x80, // ## ##
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x3F, 0x00, // ######
+ 0x3F, 0x00, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1560 'G' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x07, 0xB0, // #### ##
+ 0x1F, 0xF0, // #########
+ 0x18, 0x70, // ## ###
+ 0x30, 0x30, // ## ##
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x31, 0xF8, // ## ######
+ 0x31, 0xF8, // ## ######
+ 0x30, 0x30, // ## ##
+ 0x18, 0x30, // ## ##
+ 0x1F, 0xF0, // #########
+ 0x07, 0xC0, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1600 'H' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3C, 0xF0, // #### ####
+ 0x3C, 0xF0, // #### ####
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x1F, 0xE0, // ########
+ 0x1F, 0xE0, // ########
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x3C, 0xF0, // #### ####
+ 0x3C, 0xF0, // #### ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1640 'I' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0xE0, // ########
+ 0x1F, 0xE0, // ########
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x1F, 0xE0, // ########
+ 0x1F, 0xE0, // ########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1680 'J' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x03, 0xF8, // #######
+ 0x03, 0xF8, // #######
+ 0x00, 0x60, // ##
+ 0x00, 0x60, // ##
+ 0x00, 0x60, // ##
+ 0x00, 0x60, // ##
+ 0x30, 0x60, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x30, 0xE0, // ## ###
+ 0x3F, 0xC0, // ########
+ 0x0F, 0x80, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1720 'K' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3E, 0xF8, // ##### #####
+ 0x3E, 0xF8, // ##### #####
+ 0x18, 0xE0, // ## ###
+ 0x19, 0x80, // ## ##
+ 0x1B, 0x00, // ## ##
+ 0x1F, 0x00, // #####
+ 0x1D, 0x80, // ### ##
+ 0x18, 0xC0, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x3E, 0x78, // ##### ####
+ 0x3E, 0x38, // ##### ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1760 'L' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3F, 0x00, // ######
+ 0x3F, 0x00, // ######
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x30, // ## ##
+ 0x0C, 0x30, // ## ##
+ 0x0C, 0x30, // ## ##
+ 0x3F, 0xF0, // ##########
+ 0x3F, 0xF0, // ##########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1800 'M' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x78, 0x78, // #### ####
+ 0x78, 0x78, // #### ####
+ 0x38, 0x70, // ### ###
+ 0x3C, 0xF0, // #### ####
+ 0x34, 0xB0, // ## # # ##
+ 0x37, 0xB0, // ## #### ##
+ 0x37, 0xB0, // ## #### ##
+ 0x33, 0x30, // ## ## ##
+ 0x33, 0x30, // ## ## ##
+ 0x30, 0x30, // ## ##
+ 0x7C, 0xF8, // ##### #####
+ 0x7C, 0xF8, // ##### #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1840 'N' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x39, 0xF0, // ### #####
+ 0x3D, 0xF0, // #### #####
+ 0x1C, 0x60, // ### ##
+ 0x1E, 0x60, // #### ##
+ 0x1E, 0x60, // #### ##
+ 0x1B, 0x60, // ## ## ##
+ 0x1B, 0x60, // ## ## ##
+ 0x19, 0xE0, // ## ####
+ 0x19, 0xE0, // ## ####
+ 0x18, 0xE0, // ## ###
+ 0x3E, 0xE0, // ##### ###
+ 0x3E, 0x60, // ##### ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1880 'O' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x07, 0x80, // ####
+ 0x0F, 0xC0, // ######
+ 0x1C, 0xE0, // ### ###
+ 0x38, 0x70, // ### ###
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x38, 0x70, // ### ###
+ 0x1C, 0xE0, // ### ###
+ 0x0F, 0xC0, // ######
+ 0x07, 0x80, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1920 'P' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3F, 0xC0, // ########
+ 0x3F, 0xE0, // #########
+ 0x18, 0x70, // ## ###
+ 0x18, 0x30, // ## ##
+ 0x18, 0x30, // ## ##
+ 0x18, 0x70, // ## ###
+ 0x1F, 0xE0, // ########
+ 0x1F, 0xC0, // #######
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x3F, 0x00, // ######
+ 0x3F, 0x00, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @1960 'Q' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x07, 0x80, // ####
+ 0x0F, 0xC0, // ######
+ 0x1C, 0xE0, // ### ###
+ 0x38, 0x70, // ### ###
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x38, 0x70, // ### ###
+ 0x1C, 0xE0, // ### ###
+ 0x0F, 0xC0, // ######
+ 0x07, 0x80, // ####
+ 0x07, 0xB0, // #### ##
+ 0x0F, 0xF0, // ########
+ 0x0C, 0xE0, // ## ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2000 'R' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3F, 0xC0, // ########
+ 0x3F, 0xE0, // #########
+ 0x18, 0x70, // ## ###
+ 0x18, 0x30, // ## ##
+ 0x18, 0x70, // ## ###
+ 0x1F, 0xE0, // ########
+ 0x1F, 0xC0, // #######
+ 0x18, 0xE0, // ## ###
+ 0x18, 0x60, // ## ##
+ 0x18, 0x70, // ## ###
+ 0x3E, 0x38, // ##### ###
+ 0x3E, 0x18, // ##### ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2040 'S' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x0F, 0xB0, // ##### ##
+ 0x1F, 0xF0, // #########
+ 0x38, 0x70, // ### ###
+ 0x30, 0x30, // ## ##
+ 0x38, 0x00, // ###
+ 0x1F, 0x80, // ######
+ 0x07, 0xE0, // ######
+ 0x00, 0x70, // ###
+ 0x30, 0x30, // ## ##
+ 0x38, 0x70, // ### ###
+ 0x3F, 0xE0, // #########
+ 0x37, 0xC0, // ## #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2080 'T' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3F, 0xF0, // ##########
+ 0x3F, 0xF0, // ##########
+ 0x33, 0x30, // ## ## ##
+ 0x33, 0x30, // ## ## ##
+ 0x33, 0x30, // ## ## ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x0F, 0xC0, // ######
+ 0x0F, 0xC0, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2120 'U' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3C, 0xF0, // #### ####
+ 0x3C, 0xF0, // #### ####
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x1C, 0xE0, // ### ###
+ 0x0F, 0xC0, // ######
+ 0x07, 0x80, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2160 'V' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x78, 0xF0, // #### ####
+ 0x78, 0xF0, // #### ####
+ 0x30, 0x60, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x0D, 0x80, // ## ##
+ 0x0D, 0x80, // ## ##
+ 0x0D, 0x80, // ## ##
+ 0x07, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2200 'W' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7C, 0x7C, // ##### #####
+ 0x7C, 0x7C, // ##### #####
+ 0x30, 0x18, // ## ##
+ 0x33, 0x98, // ## ### ##
+ 0x33, 0x98, // ## ### ##
+ 0x33, 0x98, // ## ### ##
+ 0x36, 0xD8, // ## ## ## ##
+ 0x16, 0xD0, // # ## ## #
+ 0x1C, 0x70, // ### ###
+ 0x1C, 0x70, // ### ###
+ 0x1C, 0x70, // ### ###
+ 0x18, 0x30, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2240 'X' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x78, 0xF0, // #### ####
+ 0x78, 0xF0, // #### ####
+ 0x30, 0x60, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x0D, 0x80, // ## ##
+ 0x07, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x0D, 0x80, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x78, 0xF0, // #### ####
+ 0x78, 0xF0, // #### ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2280 'Y' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3C, 0xF0, // #### ####
+ 0x3C, 0xF0, // #### ####
+ 0x18, 0x60, // ## ##
+ 0x0C, 0xC0, // ## ##
+ 0x07, 0x80, // ####
+ 0x07, 0x80, // ####
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x0F, 0xC0, // ######
+ 0x0F, 0xC0, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2320 'Z' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0xE0, // ########
+ 0x1F, 0xE0, // ########
+ 0x18, 0x60, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x01, 0x80, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0C, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x1F, 0xE0, // ########
+ 0x1F, 0xE0, // ########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2360 '[' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x03, 0xC0, // ####
+ 0x03, 0xC0, // ####
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0xC0, // ####
+ 0x03, 0xC0, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2400 '\' (14 pixels wide)
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x01, 0x80, // ##
+ 0x01, 0x80, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0x60, // ##
+ 0x00, 0x60, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2440 ']' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x0F, 0x00, // ####
+ 0x0F, 0x00, // ####
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x0F, 0x00, // ####
+ 0x0F, 0x00, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2480 '^' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x02, 0x00, // #
+ 0x07, 0x00, // ###
+ 0x0D, 0x80, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x30, 0x60, // ## ##
+ 0x20, 0x20, // # #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2520 '_' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0xFF, 0xFC, // ##############
+ 0xFF, 0xFC, // ##############
+
+ // @2560 '`' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x04, 0x00, // #
+ 0x03, 0x00, // ##
+ 0x00, 0x80, // #
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2600 'a' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x0F, 0xC0, // ######
+ 0x1F, 0xE0, // ########
+ 0x00, 0x60, // ##
+ 0x0F, 0xE0, // #######
+ 0x1F, 0xE0, // ########
+ 0x38, 0x60, // ### ##
+ 0x30, 0xE0, // ## ###
+ 0x3F, 0xF0, // ##########
+ 0x1F, 0x70, // ##### ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2640 'b' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x70, 0x00, // ###
+ 0x70, 0x00, // ###
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x37, 0x80, // ## ####
+ 0x3F, 0xE0, // #########
+ 0x38, 0x60, // ### ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x38, 0x60, // ### ##
+ 0x7F, 0xE0, // ##########
+ 0x77, 0x80, // ### ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2680 'c' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x07, 0xB0, // #### ##
+ 0x1F, 0xF0, // #########
+ 0x18, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x38, 0x30, // ### ##
+ 0x1F, 0xF0, // #########
+ 0x0F, 0xC0, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2720 'd' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x70, // ###
+ 0x00, 0x70, // ###
+ 0x00, 0x30, // ##
+ 0x00, 0x30, // ##
+ 0x07, 0xB0, // #### ##
+ 0x1F, 0xF0, // #########
+ 0x18, 0x70, // ## ###
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x38, 0x70, // ### ###
+ 0x1F, 0xF8, // ##########
+ 0x07, 0xB8, // #### ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2760 'e' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x07, 0x80, // ####
+ 0x1F, 0xE0, // ########
+ 0x18, 0x60, // ## ##
+ 0x3F, 0xF0, // ##########
+ 0x3F, 0xF0, // ##########
+ 0x30, 0x00, // ##
+ 0x18, 0x30, // ## ##
+ 0x1F, 0xF0, // #########
+ 0x07, 0xC0, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2800 'f' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x03, 0xF0, // ######
+ 0x07, 0xF0, // #######
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x1F, 0xE0, // ########
+ 0x1F, 0xE0, // ########
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x1F, 0xE0, // ########
+ 0x1F, 0xE0, // ########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2840 'g' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x07, 0xB8, // #### ###
+ 0x1F, 0xF8, // ##########
+ 0x18, 0x70, // ## ###
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x18, 0x70, // ## ###
+ 0x1F, 0xF0, // #########
+ 0x07, 0xB0, // #### ##
+ 0x00, 0x30, // ##
+ 0x00, 0x70, // ###
+ 0x0F, 0xE0, // #######
+ 0x0F, 0xC0, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2880 'h' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x38, 0x00, // ###
+ 0x38, 0x00, // ###
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x1B, 0xC0, // ## ####
+ 0x1F, 0xE0, // ########
+ 0x1C, 0x60, // ### ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x3C, 0xF0, // #### ####
+ 0x3C, 0xF0, // #### ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2920 'i' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0x00, // #####
+ 0x1F, 0x00, // #####
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x1F, 0xE0, // ########
+ 0x1F, 0xE0, // ########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @2960 'j' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0xC0, // #######
+ 0x1F, 0xC0, // #######
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x00, 0xC0, // ##
+ 0x01, 0xC0, // ###
+ 0x3F, 0x80, // #######
+ 0x3F, 0x00, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3000 'k' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x38, 0x00, // ###
+ 0x38, 0x00, // ###
+ 0x18, 0x00, // ##
+ 0x18, 0x00, // ##
+ 0x1B, 0xE0, // ## #####
+ 0x1B, 0xE0, // ## #####
+ 0x1B, 0x00, // ## ##
+ 0x1E, 0x00, // ####
+ 0x1E, 0x00, // ####
+ 0x1B, 0x00, // ## ##
+ 0x19, 0x80, // ## ##
+ 0x39, 0xF0, // ### #####
+ 0x39, 0xF0, // ### #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3040 'l' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x1F, 0x00, // #####
+ 0x1F, 0x00, // #####
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x1F, 0xE0, // ########
+ 0x1F, 0xE0, // ########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3080 'm' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x7E, 0xE0, // ###### ###
+ 0x7F, 0xF0, // ###########
+ 0x33, 0x30, // ## ## ##
+ 0x33, 0x30, // ## ## ##
+ 0x33, 0x30, // ## ## ##
+ 0x33, 0x30, // ## ## ##
+ 0x33, 0x30, // ## ## ##
+ 0x7B, 0xB8, // #### ### ###
+ 0x7B, 0xB8, // #### ### ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3120 'n' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3B, 0xC0, // ### ####
+ 0x3F, 0xE0, // #########
+ 0x1C, 0x60, // ### ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x3C, 0xF0, // #### ####
+ 0x3C, 0xF0, // #### ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3160 'o' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x07, 0x80, // ####
+ 0x1F, 0xE0, // ########
+ 0x18, 0x60, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x1F, 0xE0, // ########
+ 0x07, 0x80, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3200 'p' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x77, 0x80, // ### ####
+ 0x7F, 0xE0, // ##########
+ 0x38, 0x60, // ### ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x38, 0x60, // ### ##
+ 0x3F, 0xE0, // #########
+ 0x37, 0x80, // ## ####
+ 0x30, 0x00, // ##
+ 0x30, 0x00, // ##
+ 0x7C, 0x00, // #####
+ 0x7C, 0x00, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3240 'q' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x07, 0xB8, // #### ###
+ 0x1F, 0xF8, // ##########
+ 0x18, 0x70, // ## ###
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x30, 0x30, // ## ##
+ 0x18, 0x70, // ## ###
+ 0x1F, 0xF0, // #########
+ 0x07, 0xB0, // #### ##
+ 0x00, 0x30, // ##
+ 0x00, 0x30, // ##
+ 0x00, 0xF8, // #####
+ 0x00, 0xF8, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3280 'r' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3C, 0xE0, // #### ###
+ 0x3D, 0xF0, // #### #####
+ 0x0F, 0x30, // #### ##
+ 0x0E, 0x00, // ###
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x3F, 0xC0, // ########
+ 0x3F, 0xC0, // ########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3320 's' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x07, 0xE0, // ######
+ 0x1F, 0xE0, // ########
+ 0x18, 0x60, // ## ##
+ 0x1E, 0x00, // ####
+ 0x0F, 0xC0, // ######
+ 0x01, 0xE0, // ####
+ 0x18, 0x60, // ## ##
+ 0x1F, 0xE0, // ########
+ 0x1F, 0x80, // ######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3360 't' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x3F, 0xE0, // #########
+ 0x3F, 0xE0, // #########
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x0C, 0x30, // ## ##
+ 0x0F, 0xF0, // ########
+ 0x07, 0xC0, // #####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3400 'u' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x38, 0xE0, // ### ###
+ 0x38, 0xE0, // ### ###
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0x60, // ## ##
+ 0x18, 0xE0, // ## ###
+ 0x1F, 0xF0, // #########
+ 0x0F, 0x70, // #### ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3440 'v' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x78, 0xF0, // #### ####
+ 0x78, 0xF0, // #### ####
+ 0x30, 0x60, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x0D, 0x80, // ## ##
+ 0x0D, 0x80, // ## ##
+ 0x07, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3480 'w' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x78, 0xF0, // #### ####
+ 0x78, 0xF0, // #### ####
+ 0x32, 0x60, // ## # ##
+ 0x32, 0x60, // ## # ##
+ 0x37, 0xE0, // ## ######
+ 0x1D, 0xC0, // ### ###
+ 0x1D, 0xC0, // ### ###
+ 0x18, 0xC0, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3520 'x' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x3C, 0xF0, // #### ####
+ 0x3C, 0xF0, // #### ####
+ 0x0C, 0xC0, // ## ##
+ 0x07, 0x80, // ####
+ 0x03, 0x00, // ##
+ 0x07, 0x80, // ####
+ 0x0C, 0xC0, // ## ##
+ 0x3C, 0xF0, // #### ####
+ 0x3C, 0xF0, // #### ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3560 'y' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x78, 0xF0, // #### ####
+ 0x78, 0xF0, // #### ####
+ 0x30, 0x60, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x18, 0xC0, // ## ##
+ 0x0D, 0x80, // ## ##
+ 0x0F, 0x80, // #####
+ 0x07, 0x00, // ###
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0C, 0x00, // ##
+ 0x7F, 0x00, // #######
+ 0x7F, 0x00, // #######
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3600 'z' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x1F, 0xE0, // ########
+ 0x1F, 0xE0, // ########
+ 0x18, 0xC0, // ## ##
+ 0x01, 0x80, // ##
+ 0x03, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x0C, 0x60, // ## ##
+ 0x1F, 0xE0, // ########
+ 0x1F, 0xE0, // ########
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3640 '{' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x01, 0xC0, // ###
+ 0x03, 0xC0, // ####
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x07, 0x00, // ###
+ 0x0E, 0x00, // ###
+ 0x07, 0x00, // ###
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0xC0, // ####
+ 0x01, 0xC0, // ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3680 '|' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x03, 0x00, // ##
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3720 '}' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x1C, 0x00, // ###
+ 0x1E, 0x00, // ####
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x07, 0x00, // ###
+ 0x03, 0x80, // ###
+ 0x07, 0x00, // ###
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x06, 0x00, // ##
+ 0x1E, 0x00, // ####
+ 0x1C, 0x00, // ###
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+
+ // @3760 '~' (14 pixels wide)
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x0E, 0x00, // ###
+ 0x3F, 0x30, // ###### ##
+ 0x33, 0xF0, // ## ######
+ 0x01, 0xE0, // ####
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+ 0x00, 0x00, //
+};
+
+
+sFONT Font20 = {
+ Font20_Table,
+ 14, /* Width */
+ 20, /* Height */
+};
+
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Function_Prototypes
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Functions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/Fonts/font24.c Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,2600 @@
+/**
+ ******************************************************************************
+ * @file font24.c
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 18-February-2014
+ * @brief This file provides text font24 for STM32xx-EVAL's LCD driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2014 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 "fonts.h"
+
+/** @addtogroup Utilities
+ * @{
+ */
+
+/** @addtogroup STM32_EVAL
+ * @{
+ */
+
+/** @addtogroup Common
+ * @{
+ */
+
+/** @addtogroup FONTS
+ * @brief This file provides text font24 for STM32xx-EVAL's LCD driver.
+ * @{
+ */
+
+/** @defgroup FONTS_Private_Types
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Defines
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Macros
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Variables
+ * @{
+ */
+const uint8_t Font24_Table [] =
+{
+ // @0 ' ' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @72 '!' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x01, 0x00, 0x00, // #
+ 0x01, 0x00, 0x00, // #
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @144 '"' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x0E, 0x70, 0x00, // ### ###
+ 0x0E, 0x70, 0x00, // ### ###
+ 0x0E, 0x70, 0x00, // ### ###
+ 0x04, 0x20, 0x00, // # #
+ 0x04, 0x20, 0x00, // # #
+ 0x04, 0x20, 0x00, // # #
+ 0x04, 0x20, 0x00, // # #
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @216 '#' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x06, 0x60, 0x00, // ## ##
+ 0x06, 0x60, 0x00, // ## ##
+ 0x06, 0x60, 0x00, // ## ##
+ 0x06, 0x60, 0x00, // ## ##
+ 0x06, 0x60, 0x00, // ## ##
+ 0x3F, 0xF8, 0x00, // ###########
+ 0x3F, 0xF8, 0x00, // ###########
+ 0x06, 0x60, 0x00, // ## ##
+ 0x0C, 0xC0, 0x00, // ## ##
+ 0x3F, 0xF8, 0x00, // ###########
+ 0x3F, 0xF8, 0x00, // ###########
+ 0x0C, 0xC0, 0x00, // ## ##
+ 0x0C, 0xC0, 0x00, // ## ##
+ 0x0C, 0xC0, 0x00, // ## ##
+ 0x0C, 0xC0, 0x00, // ## ##
+ 0x0C, 0xC0, 0x00, // ## ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @288 '$' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x07, 0xB0, 0x00, // #### ##
+ 0x0F, 0xF0, 0x00, // ########
+ 0x18, 0x70, 0x00, // ## ###
+ 0x18, 0x70, 0x00, // ## ###
+ 0x1C, 0x00, 0x00, // ###
+ 0x0F, 0x80, 0x00, // #####
+ 0x07, 0xE0, 0x00, // ######
+ 0x00, 0xF0, 0x00, // ####
+ 0x18, 0x30, 0x00, // ## ##
+ 0x1C, 0x30, 0x00, // ### ##
+ 0x1C, 0x70, 0x00, // ### ###
+ 0x1F, 0xE0, 0x00, // ########
+ 0x1B, 0xC0, 0x00, // ## ####
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @360 '%' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x07, 0x80, 0x00, // ####
+ 0x0F, 0xC0, 0x00, // ######
+ 0x1C, 0xE0, 0x00, // ### ###
+ 0x18, 0x60, 0x00, // ## ##
+ 0x18, 0x60, 0x00, // ## ##
+ 0x1C, 0xE0, 0x00, // ### ###
+ 0x0F, 0xF8, 0x00, // #########
+ 0x07, 0xE0, 0x00, // ######
+ 0x1F, 0xF0, 0x00, // #########
+ 0x07, 0x38, 0x00, // ### ###
+ 0x06, 0x18, 0x00, // ## ##
+ 0x06, 0x18, 0x00, // ## ##
+ 0x07, 0x38, 0x00, // ### ###
+ 0x03, 0xF0, 0x00, // ######
+ 0x01, 0xE0, 0x00, // ####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @432 '&' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x03, 0xF0, 0x00, // ######
+ 0x07, 0xF0, 0x00, // #######
+ 0x0C, 0x60, 0x00, // ## ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x06, 0x00, 0x00, // ##
+ 0x07, 0x00, 0x00, // ###
+ 0x0F, 0x9C, 0x00, // ##### ###
+ 0x1D, 0xFC, 0x00, // ### #######
+ 0x18, 0xF0, 0x00, // ## ####
+ 0x18, 0x70, 0x00, // ## ###
+ 0x0F, 0xFC, 0x00, // ##########
+ 0x07, 0xDC, 0x00, // ##### ###
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @504 ''' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x01, 0x00, 0x00, // #
+ 0x01, 0x00, 0x00, // #
+ 0x01, 0x00, 0x00, // #
+ 0x01, 0x00, 0x00, // #
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @576 '(' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x38, 0x00, // ###
+ 0x00, 0x70, 0x00, // ###
+ 0x00, 0xF0, 0x00, // ####
+ 0x00, 0xE0, 0x00, // ###
+ 0x00, 0xE0, 0x00, // ###
+ 0x01, 0xC0, 0x00, // ###
+ 0x01, 0xC0, 0x00, // ###
+ 0x01, 0xC0, 0x00, // ###
+ 0x01, 0xC0, 0x00, // ###
+ 0x01, 0xC0, 0x00, // ###
+ 0x01, 0xC0, 0x00, // ###
+ 0x00, 0xE0, 0x00, // ###
+ 0x00, 0xE0, 0x00, // ###
+ 0x00, 0x70, 0x00, // ###
+ 0x00, 0x70, 0x00, // ###
+ 0x00, 0x38, 0x00, // ###
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @648 ')' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x18, 0x00, 0x00, // ##
+ 0x1C, 0x00, 0x00, // ###
+ 0x0E, 0x00, 0x00, // ###
+ 0x0E, 0x00, 0x00, // ###
+ 0x07, 0x00, 0x00, // ###
+ 0x07, 0x00, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x07, 0x00, 0x00, // ###
+ 0x07, 0x00, 0x00, // ###
+ 0x0F, 0x00, 0x00, // ####
+ 0x0E, 0x00, 0x00, // ###
+ 0x1C, 0x00, 0x00, // ###
+ 0x18, 0x00, 0x00, // ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @720 '*' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x1D, 0xB8, 0x00, // ### ## ###
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x07, 0xE0, 0x00, // ######
+ 0x03, 0xC0, 0x00, // ####
+ 0x03, 0xC0, 0x00, // ####
+ 0x06, 0x60, 0x00, // ## ##
+ 0x06, 0x60, 0x00, // ## ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @792 '+' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x3F, 0xFC, 0x00, // ############
+ 0x3F, 0xFC, 0x00, // ############
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @864 ',' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0xE0, 0x00, // ###
+ 0x00, 0xC0, 0x00, // ##
+ 0x01, 0xC0, 0x00, // ###
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x03, 0x00, 0x00, // ##
+ 0x03, 0x00, 0x00, // ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @936 '-' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @1008 '.' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x03, 0xC0, 0x00, // ####
+ 0x03, 0xC0, 0x00, // ####
+ 0x03, 0xC0, 0x00, // ####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @1080 '/' (17 pixels wide)
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x38, 0x00, // ###
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x70, 0x00, // ###
+ 0x00, 0x60, 0x00, // ##
+ 0x00, 0x60, 0x00, // ##
+ 0x00, 0xC0, 0x00, // ##
+ 0x00, 0xC0, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x03, 0x00, 0x00, // ##
+ 0x03, 0x00, 0x00, // ##
+ 0x06, 0x00, 0x00, // ##
+ 0x06, 0x00, 0x00, // ##
+ 0x0E, 0x00, 0x00, // ###
+ 0x0C, 0x00, 0x00, // ##
+ 0x1C, 0x00, 0x00, // ###
+ 0x18, 0x00, 0x00, // ##
+ 0x18, 0x00, 0x00, // ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @1152 '0' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x03, 0xC0, 0x00, // ####
+ 0x07, 0xE0, 0x00, // ######
+ 0x0C, 0x30, 0x00, // ## ##
+ 0x0C, 0x30, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x0C, 0x30, 0x00, // ## ##
+ 0x0C, 0x30, 0x00, // ## ##
+ 0x07, 0xE0, 0x00, // ######
+ 0x03, 0xC0, 0x00, // ####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @1224 '1' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x80, 0x00, // #
+ 0x07, 0x80, 0x00, // ####
+ 0x1F, 0x80, 0x00, // ######
+ 0x1D, 0x80, 0x00, // ### ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @1296 '2' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x07, 0xC0, 0x00, // #####
+ 0x1F, 0xF0, 0x00, // #########
+ 0x38, 0x30, 0x00, // ### ##
+ 0x30, 0x18, 0x00, // ## ##
+ 0x30, 0x18, 0x00, // ## ##
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x60, 0x00, // ##
+ 0x01, 0xC0, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x06, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x18, 0x00, 0x00, // ##
+ 0x3F, 0xF8, 0x00, // ###########
+ 0x3F, 0xF8, 0x00, // ###########
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @1368 '3' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x03, 0xC0, 0x00, // ####
+ 0x0F, 0xE0, 0x00, // #######
+ 0x0C, 0x70, 0x00, // ## ###
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x60, 0x00, // ##
+ 0x03, 0xC0, 0x00, // ####
+ 0x03, 0xE0, 0x00, // #####
+ 0x00, 0x70, 0x00, // ###
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x18, 0x00, // ##
+ 0x18, 0x38, 0x00, // ## ###
+ 0x1F, 0xF0, 0x00, // #########
+ 0x0F, 0xC0, 0x00, // ######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @1440 '4' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0xE0, 0x00, // ###
+ 0x01, 0xE0, 0x00, // ####
+ 0x01, 0xE0, 0x00, // ####
+ 0x03, 0x60, 0x00, // ## ##
+ 0x06, 0x60, 0x00, // ## ##
+ 0x06, 0x60, 0x00, // ## ##
+ 0x0C, 0x60, 0x00, // ## ##
+ 0x0C, 0x60, 0x00, // ## ##
+ 0x18, 0x60, 0x00, // ## ##
+ 0x30, 0x60, 0x00, // ## ##
+ 0x3F, 0xF8, 0x00, // ###########
+ 0x3F, 0xF8, 0x00, // ###########
+ 0x00, 0x60, 0x00, // ##
+ 0x03, 0xF8, 0x00, // #######
+ 0x03, 0xF8, 0x00, // #######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @1512 '5' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x1F, 0xF0, 0x00, // #########
+ 0x1F, 0xF0, 0x00, // #########
+ 0x18, 0x00, 0x00, // ##
+ 0x18, 0x00, 0x00, // ##
+ 0x18, 0x00, 0x00, // ##
+ 0x1B, 0xC0, 0x00, // ## ####
+ 0x1F, 0xF0, 0x00, // #########
+ 0x1C, 0x30, 0x00, // ### ##
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x18, 0x00, // ##
+ 0x30, 0x30, 0x00, // ## ##
+ 0x3F, 0xF0, 0x00, // ##########
+ 0x0F, 0xC0, 0x00, // ######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @1584 '6' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0xF8, 0x00, // #####
+ 0x03, 0xF8, 0x00, // #######
+ 0x07, 0x00, 0x00, // ###
+ 0x0E, 0x00, 0x00, // ###
+ 0x0C, 0x00, 0x00, // ##
+ 0x18, 0x00, 0x00, // ##
+ 0x1B, 0xC0, 0x00, // ## ####
+ 0x1F, 0xF0, 0x00, // #########
+ 0x1C, 0x30, 0x00, // ### ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x0C, 0x38, 0x00, // ## ###
+ 0x0F, 0xF0, 0x00, // ########
+ 0x03, 0xE0, 0x00, // #####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @1656 '7' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x38, 0x00, // ## ###
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x70, 0x00, // ###
+ 0x00, 0x60, 0x00, // ##
+ 0x00, 0x60, 0x00, // ##
+ 0x00, 0xE0, 0x00, // ###
+ 0x00, 0xC0, 0x00, // ##
+ 0x00, 0xC0, 0x00, // ##
+ 0x01, 0xC0, 0x00, // ###
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @1728 '8' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x07, 0xE0, 0x00, // ######
+ 0x0F, 0xF0, 0x00, // ########
+ 0x1C, 0x38, 0x00, // ### ###
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x0C, 0x30, 0x00, // ## ##
+ 0x07, 0xE0, 0x00, // ######
+ 0x07, 0xE0, 0x00, // ######
+ 0x0C, 0x30, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x1C, 0x38, 0x00, // ### ###
+ 0x0F, 0xF0, 0x00, // ########
+ 0x07, 0xE0, 0x00, // ######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @1800 '9' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x07, 0xC0, 0x00, // #####
+ 0x0F, 0xF0, 0x00, // ########
+ 0x1C, 0x30, 0x00, // ### ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x0C, 0x38, 0x00, // ## ###
+ 0x0F, 0xF8, 0x00, // #########
+ 0x03, 0xD8, 0x00, // #### ##
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x70, 0x00, // ###
+ 0x00, 0xE0, 0x00, // ###
+ 0x1F, 0xC0, 0x00, // #######
+ 0x1F, 0x00, 0x00, // #####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @1872 ':' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x03, 0xC0, 0x00, // ####
+ 0x03, 0xC0, 0x00, // ####
+ 0x03, 0xC0, 0x00, // ####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x03, 0xC0, 0x00, // ####
+ 0x03, 0xC0, 0x00, // ####
+ 0x03, 0xC0, 0x00, // ####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @1944 ';' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0xF0, 0x00, // ####
+ 0x00, 0xF0, 0x00, // ####
+ 0x00, 0xF0, 0x00, // ####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0xE0, 0x00, // ###
+ 0x01, 0xC0, 0x00, // ###
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x03, 0x00, 0x00, // ##
+ 0x02, 0x00, 0x00, // #
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @2016 '<' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x1C, 0x00, // ###
+ 0x00, 0x3C, 0x00, // ####
+ 0x00, 0xF0, 0x00, // ####
+ 0x03, 0xC0, 0x00, // ####
+ 0x0F, 0x00, 0x00, // ####
+ 0x3C, 0x00, 0x00, // ####
+ 0xF0, 0x00, 0x00, // ####
+ 0x3C, 0x00, 0x00, // ####
+ 0x0F, 0x00, 0x00, // ####
+ 0x03, 0xC0, 0x00, // ####
+ 0x00, 0xF0, 0x00, // ####
+ 0x00, 0x3C, 0x00, // ####
+ 0x00, 0x1C, 0x00, // ###
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @2088 '=' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7F, 0xFC, 0x00, // #############
+ 0x7F, 0xFC, 0x00, // #############
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7F, 0xFC, 0x00, // #############
+ 0x7F, 0xFC, 0x00, // #############
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @2160 '>' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x70, 0x00, 0x00, // ###
+ 0x78, 0x00, 0x00, // ####
+ 0x1E, 0x00, 0x00, // ####
+ 0x07, 0x80, 0x00, // ####
+ 0x01, 0xE0, 0x00, // ####
+ 0x00, 0x78, 0x00, // ####
+ 0x00, 0x1E, 0x00, // ####
+ 0x00, 0x78, 0x00, // ####
+ 0x01, 0xE0, 0x00, // ####
+ 0x07, 0x80, 0x00, // ####
+ 0x1E, 0x00, 0x00, // ####
+ 0x78, 0x00, 0x00, // ####
+ 0x70, 0x00, 0x00, // ###
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @2232 '?' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x07, 0xC0, 0x00, // #####
+ 0x0F, 0xE0, 0x00, // #######
+ 0x18, 0x70, 0x00, // ## ###
+ 0x18, 0x30, 0x00, // ## ##
+ 0x18, 0x30, 0x00, // ## ##
+ 0x00, 0x70, 0x00, // ###
+ 0x00, 0xE0, 0x00, // ###
+ 0x03, 0xC0, 0x00, // ####
+ 0x03, 0x80, 0x00, // ###
+ 0x03, 0x00, 0x00, // ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x07, 0x00, 0x00, // ###
+ 0x07, 0x00, 0x00, // ###
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @2304 '@' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x03, 0xE0, 0x00, // #####
+ 0x07, 0xF0, 0x00, // #######
+ 0x0E, 0x38, 0x00, // ### ###
+ 0x0C, 0x18, 0x00, // ## ##
+ 0x18, 0x78, 0x00, // ## ####
+ 0x18, 0xF8, 0x00, // ## #####
+ 0x19, 0xD8, 0x00, // ## ### ##
+ 0x19, 0x98, 0x00, // ## ## ##
+ 0x19, 0x98, 0x00, // ## ## ##
+ 0x19, 0x98, 0x00, // ## ## ##
+ 0x18, 0xF8, 0x00, // ## #####
+ 0x18, 0x78, 0x00, // ## ####
+ 0x18, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0E, 0x18, 0x00, // ### ##
+ 0x07, 0xF8, 0x00, // ########
+ 0x03, 0xE0, 0x00, // #####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @2376 'A' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x1F, 0x80, 0x00, // ######
+ 0x1F, 0xC0, 0x00, // #######
+ 0x01, 0xC0, 0x00, // ###
+ 0x03, 0x60, 0x00, // ## ##
+ 0x03, 0x60, 0x00, // ## ##
+ 0x06, 0x30, 0x00, // ## ##
+ 0x06, 0x30, 0x00, // ## ##
+ 0x0C, 0x30, 0x00, // ## ##
+ 0x0F, 0xF8, 0x00, // #########
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x30, 0x0C, 0x00, // ## ##
+ 0xFC, 0x7F, 0x00, // ###### #######
+ 0xFC, 0x7F, 0x00, // ###### #######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @2448 'B' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7F, 0xE0, 0x00, // ##########
+ 0x7F, 0xF0, 0x00, // ###########
+ 0x18, 0x38, 0x00, // ## ###
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x38, 0x00, // ## ###
+ 0x1F, 0xF0, 0x00, // #########
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x18, 0x1C, 0x00, // ## ###
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x7F, 0xF8, 0x00, // ############
+ 0x7F, 0xF0, 0x00, // ###########
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @2520 'C' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x03, 0xEC, 0x00, // ##### ##
+ 0x0F, 0xFC, 0x00, // ##########
+ 0x1C, 0x1C, 0x00, // ### ###
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x30, 0x00, 0x00, // ##
+ 0x30, 0x00, 0x00, // ##
+ 0x30, 0x00, 0x00, // ##
+ 0x30, 0x00, 0x00, // ##
+ 0x30, 0x00, 0x00, // ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x1C, 0x1C, 0x00, // ### ###
+ 0x0F, 0xF8, 0x00, // #########
+ 0x03, 0xF0, 0x00, // ######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @2592 'D' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7F, 0xC0, 0x00, // #########
+ 0x7F, 0xF0, 0x00, // ###########
+ 0x18, 0x38, 0x00, // ## ###
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x38, 0x00, // ## ###
+ 0x7F, 0xF0, 0x00, // ###########
+ 0x7F, 0xE0, 0x00, // ##########
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @2664 'E' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7F, 0xF8, 0x00, // ############
+ 0x7F, 0xF8, 0x00, // ############
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x19, 0x98, 0x00, // ## ## ##
+ 0x19, 0x80, 0x00, // ## ##
+ 0x1F, 0x80, 0x00, // ######
+ 0x1F, 0x80, 0x00, // ######
+ 0x19, 0x80, 0x00, // ## ##
+ 0x19, 0x98, 0x00, // ## ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x7F, 0xF8, 0x00, // ############
+ 0x7F, 0xF8, 0x00, // ############
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @2736 'F' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x3F, 0xFC, 0x00, // ############
+ 0x3F, 0xFC, 0x00, // ############
+ 0x0C, 0x0C, 0x00, // ## ##
+ 0x0C, 0x0C, 0x00, // ## ##
+ 0x0C, 0xCC, 0x00, // ## ## ##
+ 0x0C, 0xC0, 0x00, // ## ##
+ 0x0F, 0xC0, 0x00, // ######
+ 0x0F, 0xC0, 0x00, // ######
+ 0x0C, 0xC0, 0x00, // ## ##
+ 0x0C, 0xC0, 0x00, // ## ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x3F, 0xC0, 0x00, // ########
+ 0x3F, 0xC0, 0x00, // ########
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @2808 'G' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x03, 0xEC, 0x00, // ##### ##
+ 0x0F, 0xFC, 0x00, // ##########
+ 0x1C, 0x1C, 0x00, // ### ###
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x30, 0x00, 0x00, // ##
+ 0x30, 0x00, 0x00, // ##
+ 0x30, 0xFE, 0x00, // ## #######
+ 0x30, 0xFE, 0x00, // ## #######
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x38, 0x0C, 0x00, // ### ##
+ 0x1C, 0x1C, 0x00, // ### ###
+ 0x0F, 0xFC, 0x00, // ##########
+ 0x03, 0xF0, 0x00, // ######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @2880 'H' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7E, 0x7E, 0x00, // ###### ######
+ 0x7E, 0x7E, 0x00, // ###### ######
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x7E, 0x7E, 0x00, // ###### ######
+ 0x7E, 0x7E, 0x00, // ###### ######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @2952 'I' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @3024 'J' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x07, 0xFE, 0x00, // ##########
+ 0x07, 0xFE, 0x00, // ##########
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x30, 0x30, 0x00, // ## ##
+ 0x30, 0x30, 0x00, // ## ##
+ 0x30, 0x30, 0x00, // ## ##
+ 0x30, 0x30, 0x00, // ## ##
+ 0x30, 0x60, 0x00, // ## ##
+ 0x3F, 0xE0, 0x00, // #########
+ 0x0F, 0x80, 0x00, // #####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @3096 'K' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7F, 0x3E, 0x00, // ####### #####
+ 0x7F, 0x3E, 0x00, // ####### #####
+ 0x18, 0x30, 0x00, // ## ##
+ 0x18, 0x60, 0x00, // ## ##
+ 0x18, 0xC0, 0x00, // ## ##
+ 0x19, 0x80, 0x00, // ## ##
+ 0x1B, 0x80, 0x00, // ## ###
+ 0x1F, 0xC0, 0x00, // #######
+ 0x1C, 0xE0, 0x00, // ### ###
+ 0x18, 0x70, 0x00, // ## ###
+ 0x18, 0x30, 0x00, // ## ##
+ 0x18, 0x38, 0x00, // ## ###
+ 0x7F, 0x1F, 0x00, // ####### #####
+ 0x7F, 0x1F, 0x00, // ####### #####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @3168 'L' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7F, 0x80, 0x00, // ########
+ 0x7F, 0x80, 0x00, // ########
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x0C, 0x00, // ## ##
+ 0x0C, 0x0C, 0x00, // ## ##
+ 0x0C, 0x0C, 0x00, // ## ##
+ 0x0C, 0x0C, 0x00, // ## ##
+ 0x7F, 0xFC, 0x00, // #############
+ 0x7F, 0xFC, 0x00, // #############
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @3240 'M' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0xF0, 0x0F, 0x00, // #### ####
+ 0xF8, 0x1F, 0x00, // ##### #####
+ 0x38, 0x1C, 0x00, // ### ###
+ 0x3C, 0x3C, 0x00, // #### ####
+ 0x3C, 0x3C, 0x00, // #### ####
+ 0x36, 0x6C, 0x00, // ## ## ## ##
+ 0x36, 0x6C, 0x00, // ## ## ## ##
+ 0x33, 0xCC, 0x00, // ## #### ##
+ 0x33, 0xCC, 0x00, // ## #### ##
+ 0x31, 0x8C, 0x00, // ## ## ##
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x30, 0x0C, 0x00, // ## ##
+ 0xFE, 0x7F, 0x00, // ####### #######
+ 0xFE, 0x7F, 0x00, // ####### #######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @3312 'N' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x78, 0xFE, 0x00, // #### #######
+ 0x78, 0xFE, 0x00, // #### #######
+ 0x1C, 0x18, 0x00, // ### ##
+ 0x1E, 0x18, 0x00, // #### ##
+ 0x1F, 0x18, 0x00, // ##### ##
+ 0x1B, 0x18, 0x00, // ## ## ##
+ 0x1B, 0x98, 0x00, // ## ### ##
+ 0x19, 0xD8, 0x00, // ## ### ##
+ 0x18, 0xD8, 0x00, // ## ## ##
+ 0x18, 0xF8, 0x00, // ## #####
+ 0x18, 0x78, 0x00, // ## ####
+ 0x18, 0x38, 0x00, // ## ###
+ 0x7F, 0x18, 0x00, // ####### ##
+ 0x7F, 0x18, 0x00, // ####### ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @3384 'O' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x03, 0xC0, 0x00, // ####
+ 0x0F, 0xF0, 0x00, // ########
+ 0x1C, 0x38, 0x00, // ### ###
+ 0x18, 0x18, 0x00, // ## ##
+ 0x38, 0x1C, 0x00, // ### ###
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x38, 0x1C, 0x00, // ### ###
+ 0x18, 0x18, 0x00, // ## ##
+ 0x1C, 0x38, 0x00, // ### ###
+ 0x0F, 0xF0, 0x00, // ########
+ 0x03, 0xC0, 0x00, // ####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @3456 'P' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x3F, 0xF0, 0x00, // ##########
+ 0x3F, 0xF8, 0x00, // ###########
+ 0x0C, 0x1C, 0x00, // ## ###
+ 0x0C, 0x0C, 0x00, // ## ##
+ 0x0C, 0x0C, 0x00, // ## ##
+ 0x0C, 0x0C, 0x00, // ## ##
+ 0x0C, 0x18, 0x00, // ## ##
+ 0x0F, 0xF8, 0x00, // #########
+ 0x0F, 0xE0, 0x00, // #######
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x3F, 0xC0, 0x00, // ########
+ 0x3F, 0xC0, 0x00, // ########
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @3528 'Q' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x03, 0xC0, 0x00, // ####
+ 0x0F, 0xF0, 0x00, // ########
+ 0x1C, 0x38, 0x00, // ### ###
+ 0x18, 0x18, 0x00, // ## ##
+ 0x38, 0x1C, 0x00, // ### ###
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x38, 0x1C, 0x00, // ### ###
+ 0x18, 0x18, 0x00, // ## ##
+ 0x1C, 0x38, 0x00, // ### ###
+ 0x0F, 0xF0, 0x00, // ########
+ 0x07, 0xC0, 0x00, // #####
+ 0x07, 0xCC, 0x00, // ##### ##
+ 0x0F, 0xFC, 0x00, // ##########
+ 0x0C, 0x38, 0x00, // ## ###
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @3600 'R' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7F, 0xE0, 0x00, // ##########
+ 0x7F, 0xF0, 0x00, // ###########
+ 0x18, 0x38, 0x00, // ## ###
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x38, 0x00, // ## ###
+ 0x1F, 0xF0, 0x00, // #########
+ 0x1F, 0xC0, 0x00, // #######
+ 0x18, 0xE0, 0x00, // ## ###
+ 0x18, 0x70, 0x00, // ## ###
+ 0x18, 0x30, 0x00, // ## ##
+ 0x18, 0x38, 0x00, // ## ###
+ 0x7F, 0x1E, 0x00, // ####### ####
+ 0x7F, 0x0E, 0x00, // ####### ###
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @3672 'S' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x07, 0xD8, 0x00, // ##### ##
+ 0x0F, 0xF8, 0x00, // #########
+ 0x1C, 0x38, 0x00, // ### ###
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x1E, 0x00, 0x00, // ####
+ 0x0F, 0xC0, 0x00, // ######
+ 0x03, 0xF0, 0x00, // ######
+ 0x00, 0x78, 0x00, // ####
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x1C, 0x38, 0x00, // ### ###
+ 0x1F, 0xF0, 0x00, // #########
+ 0x1B, 0xE0, 0x00, // ## #####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @3744 'T' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x3F, 0xFC, 0x00, // ############
+ 0x3F, 0xFC, 0x00, // ############
+ 0x31, 0x8C, 0x00, // ## ## ##
+ 0x31, 0x8C, 0x00, // ## ## ##
+ 0x31, 0x8C, 0x00, // ## ## ##
+ 0x31, 0x8C, 0x00, // ## ## ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x0F, 0xF0, 0x00, // ########
+ 0x0F, 0xF0, 0x00, // ########
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @3816 'U' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7E, 0x7E, 0x00, // ###### ######
+ 0x7E, 0x7E, 0x00, // ###### ######
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x0C, 0x30, 0x00, // ## ##
+ 0x0F, 0xF0, 0x00, // ########
+ 0x03, 0xC0, 0x00, // ####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @3888 'V' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7F, 0x7F, 0x00, // ####### #######
+ 0x7F, 0x7F, 0x00, // ####### #######
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x0C, 0x18, 0x00, // ## ##
+ 0x0C, 0x18, 0x00, // ## ##
+ 0x0C, 0x18, 0x00, // ## ##
+ 0x06, 0x30, 0x00, // ## ##
+ 0x06, 0x30, 0x00, // ## ##
+ 0x03, 0x60, 0x00, // ## ##
+ 0x03, 0x60, 0x00, // ## ##
+ 0x03, 0x60, 0x00, // ## ##
+ 0x01, 0xC0, 0x00, // ###
+ 0x01, 0xC0, 0x00, // ###
+ 0x00, 0x80, 0x00, // #
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @3960 'W' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0xFE, 0x3F, 0x80, // ####### #######
+ 0xFE, 0x3F, 0x80, // ####### #######
+ 0x30, 0x06, 0x00, // ## ##
+ 0x30, 0x06, 0x00, // ## ##
+ 0x30, 0x86, 0x00, // ## # ##
+ 0x19, 0xCC, 0x00, // ## ### ##
+ 0x19, 0xCC, 0x00, // ## ### ##
+ 0x1B, 0x6C, 0x00, // ## ## ## ##
+ 0x1B, 0x6C, 0x00, // ## ## ## ##
+ 0x1E, 0x7C, 0x00, // #### #####
+ 0x0E, 0x38, 0x00, // ### ###
+ 0x0E, 0x38, 0x00, // ### ###
+ 0x0C, 0x18, 0x00, // ## ##
+ 0x0C, 0x18, 0x00, // ## ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @4032 'X' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7E, 0x7E, 0x00, // ###### ######
+ 0x7E, 0x7E, 0x00, // ###### ######
+ 0x18, 0x18, 0x00, // ## ##
+ 0x0C, 0x30, 0x00, // ## ##
+ 0x06, 0x60, 0x00, // ## ##
+ 0x03, 0xC0, 0x00, // ####
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x03, 0xC0, 0x00, // ####
+ 0x06, 0x60, 0x00, // ## ##
+ 0x0C, 0x30, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x7E, 0x7E, 0x00, // ###### ######
+ 0x7E, 0x7E, 0x00, // ###### ######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @4104 'Y' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7C, 0x7E, 0x00, // ##### ######
+ 0x7C, 0x7E, 0x00, // ##### ######
+ 0x18, 0x18, 0x00, // ## ##
+ 0x0C, 0x30, 0x00, // ## ##
+ 0x06, 0x60, 0x00, // ## ##
+ 0x06, 0x60, 0x00, // ## ##
+ 0x03, 0xC0, 0x00, // ####
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x0F, 0xF0, 0x00, // ########
+ 0x0F, 0xF0, 0x00, // ########
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @4176 'Z' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x30, 0x00, // ## ##
+ 0x18, 0x60, 0x00, // ## ##
+ 0x18, 0xC0, 0x00, // ## ##
+ 0x01, 0x80, 0x00, // ##
+ 0x03, 0x00, 0x00, // ##
+ 0x06, 0x18, 0x00, // ## ##
+ 0x0C, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x30, 0x18, 0x00, // ## ##
+ 0x3F, 0xF8, 0x00, // ###########
+ 0x3F, 0xF8, 0x00, // ###########
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @4248 '[' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x01, 0xF0, 0x00, // #####
+ 0x01, 0xF0, 0x00, // #####
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0xF0, 0x00, // #####
+ 0x01, 0xF0, 0x00, // #####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @4320 '\' (17 pixels wide)
+ 0x18, 0x00, 0x00, // ##
+ 0x18, 0x00, 0x00, // ##
+ 0x1C, 0x00, 0x00, // ###
+ 0x0C, 0x00, 0x00, // ##
+ 0x0E, 0x00, 0x00, // ###
+ 0x06, 0x00, 0x00, // ##
+ 0x06, 0x00, 0x00, // ##
+ 0x03, 0x00, 0x00, // ##
+ 0x03, 0x00, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x00, 0xC0, 0x00, // ##
+ 0x00, 0xC0, 0x00, // ##
+ 0x00, 0x60, 0x00, // ##
+ 0x00, 0x60, 0x00, // ##
+ 0x00, 0x70, 0x00, // ###
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x38, 0x00, // ###
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @4392 ']' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x0F, 0x80, 0x00, // #####
+ 0x0F, 0x80, 0x00, // #####
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x0F, 0x80, 0x00, // #####
+ 0x0F, 0x80, 0x00, // #####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @4464 '^' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x80, 0x00, // #
+ 0x01, 0xC0, 0x00, // ###
+ 0x03, 0xE0, 0x00, // #####
+ 0x07, 0x70, 0x00, // ### ###
+ 0x06, 0x30, 0x00, // ## ##
+ 0x0C, 0x18, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x10, 0x04, 0x00, // # #
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @4536 '_' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0xFF, 0xFF, 0x00, // ################
+ 0xFF, 0xFF, 0x00, // ################
+
+ // @4608 '`' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x03, 0x00, 0x00, // ##
+ 0x03, 0x80, 0x00, // ###
+ 0x00, 0xE0, 0x00, // ###
+ 0x00, 0x60, 0x00, // ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @4680 'a' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x0F, 0xC0, 0x00, // ######
+ 0x1F, 0xE0, 0x00, // ########
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x07, 0xF0, 0x00, // #######
+ 0x1F, 0xF0, 0x00, // #########
+ 0x38, 0x30, 0x00, // ### ##
+ 0x30, 0x30, 0x00, // ## ##
+ 0x30, 0x70, 0x00, // ## ###
+ 0x1F, 0xFC, 0x00, // ###########
+ 0x0F, 0xBC, 0x00, // ##### ####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @4752 'b' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x78, 0x00, 0x00, // ####
+ 0x78, 0x00, 0x00, // ####
+ 0x18, 0x00, 0x00, // ##
+ 0x18, 0x00, 0x00, // ##
+ 0x1B, 0xE0, 0x00, // ## #####
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x1C, 0x18, 0x00, // ### ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x1C, 0x18, 0x00, // ### ##
+ 0x7F, 0xF8, 0x00, // ############
+ 0x7B, 0xE0, 0x00, // #### #####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @4824 'c' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x03, 0xEC, 0x00, // ##### ##
+ 0x0F, 0xFC, 0x00, // ##########
+ 0x1C, 0x1C, 0x00, // ### ###
+ 0x38, 0x0C, 0x00, // ### ##
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x30, 0x00, 0x00, // ##
+ 0x30, 0x00, 0x00, // ##
+ 0x38, 0x0C, 0x00, // ### ##
+ 0x1C, 0x1C, 0x00, // ### ###
+ 0x0F, 0xF8, 0x00, // #########
+ 0x03, 0xF0, 0x00, // ######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @4896 'd' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x78, 0x00, // ####
+ 0x00, 0x78, 0x00, // ####
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x18, 0x00, // ##
+ 0x07, 0xD8, 0x00, // ##### ##
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x18, 0x38, 0x00, // ## ###
+ 0x30, 0x18, 0x00, // ## ##
+ 0x30, 0x18, 0x00, // ## ##
+ 0x30, 0x18, 0x00, // ## ##
+ 0x30, 0x18, 0x00, // ## ##
+ 0x30, 0x18, 0x00, // ## ##
+ 0x18, 0x38, 0x00, // ## ###
+ 0x1F, 0xFE, 0x00, // ############
+ 0x07, 0xDE, 0x00, // ##### ####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @4968 'e' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x07, 0xE0, 0x00, // ######
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x18, 0x18, 0x00, // ## ##
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x3F, 0xFC, 0x00, // ############
+ 0x3F, 0xFC, 0x00, // ############
+ 0x30, 0x00, 0x00, // ##
+ 0x30, 0x00, 0x00, // ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x1F, 0xFC, 0x00, // ###########
+ 0x07, 0xF0, 0x00, // #######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @5040 'f' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x01, 0xFC, 0x00, // #######
+ 0x03, 0xFC, 0x00, // ########
+ 0x06, 0x00, 0x00, // ##
+ 0x06, 0x00, 0x00, // ##
+ 0x3F, 0xF8, 0x00, // ###########
+ 0x3F, 0xF8, 0x00, // ###########
+ 0x06, 0x00, 0x00, // ##
+ 0x06, 0x00, 0x00, // ##
+ 0x06, 0x00, 0x00, // ##
+ 0x06, 0x00, 0x00, // ##
+ 0x06, 0x00, 0x00, // ##
+ 0x06, 0x00, 0x00, // ##
+ 0x06, 0x00, 0x00, // ##
+ 0x3F, 0xF0, 0x00, // ##########
+ 0x3F, 0xF0, 0x00, // ##########
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @5112 'g' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x07, 0xDE, 0x00, // ##### ####
+ 0x1F, 0xFE, 0x00, // ############
+ 0x18, 0x38, 0x00, // ## ###
+ 0x30, 0x18, 0x00, // ## ##
+ 0x30, 0x18, 0x00, // ## ##
+ 0x30, 0x18, 0x00, // ## ##
+ 0x30, 0x18, 0x00, // ## ##
+ 0x30, 0x18, 0x00, // ## ##
+ 0x18, 0x38, 0x00, // ## ###
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x07, 0xD8, 0x00, // ##### ##
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x38, 0x00, // ###
+ 0x0F, 0xF0, 0x00, // ########
+ 0x0F, 0xC0, 0x00, // ######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @5184 'h' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x78, 0x00, 0x00, // ####
+ 0x78, 0x00, 0x00, // ####
+ 0x18, 0x00, 0x00, // ##
+ 0x18, 0x00, 0x00, // ##
+ 0x1B, 0xE0, 0x00, // ## #####
+ 0x1F, 0xF0, 0x00, // #########
+ 0x1C, 0x38, 0x00, // ### ###
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x7E, 0x7E, 0x00, // ###### ######
+ 0x7E, 0x7E, 0x00, // ###### ######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @5256 'i' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x1F, 0x80, 0x00, // ######
+ 0x1F, 0x80, 0x00, // ######
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x3F, 0xFC, 0x00, // ############
+ 0x3F, 0xFC, 0x00, // ############
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @5328 'j' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0xC0, 0x00, // ##
+ 0x00, 0xC0, 0x00, // ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x1F, 0xF0, 0x00, // #########
+ 0x1F, 0xF0, 0x00, // #########
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x30, 0x00, // ##
+ 0x00, 0x70, 0x00, // ###
+ 0x1F, 0xE0, 0x00, // ########
+ 0x1F, 0x80, 0x00, // ######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @5400 'k' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x3C, 0x00, 0x00, // ####
+ 0x3C, 0x00, 0x00, // ####
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0xF8, 0x00, // ## #####
+ 0x0C, 0xF8, 0x00, // ## #####
+ 0x0C, 0xC0, 0x00, // ## ##
+ 0x0D, 0x80, 0x00, // ## ##
+ 0x0F, 0x80, 0x00, // #####
+ 0x0F, 0x00, 0x00, // ####
+ 0x0F, 0x80, 0x00, // #####
+ 0x0D, 0xC0, 0x00, // ## ###
+ 0x0C, 0xE0, 0x00, // ## ###
+ 0x3C, 0x7C, 0x00, // #### #####
+ 0x3C, 0x7C, 0x00, // #### #####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @5472 'l' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x1F, 0x80, 0x00, // ######
+ 0x1F, 0x80, 0x00, // ######
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x3F, 0xFC, 0x00, // ############
+ 0x3F, 0xFC, 0x00, // ############
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @5544 'm' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0xF7, 0x78, 0x00, // #### ### ####
+ 0xFF, 0xFC, 0x00, // ##############
+ 0x39, 0xCC, 0x00, // ### ### ##
+ 0x31, 0x8C, 0x00, // ## ## ##
+ 0x31, 0x8C, 0x00, // ## ## ##
+ 0x31, 0x8C, 0x00, // ## ## ##
+ 0x31, 0x8C, 0x00, // ## ## ##
+ 0x31, 0x8C, 0x00, // ## ## ##
+ 0x31, 0x8C, 0x00, // ## ## ##
+ 0xFD, 0xEF, 0x00, // ###### #### ####
+ 0xFD, 0xEF, 0x00, // ###### #### ####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @5616 'n' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7B, 0xE0, 0x00, // #### #####
+ 0x7F, 0xF0, 0x00, // ###########
+ 0x1C, 0x38, 0x00, // ### ###
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x7E, 0x7E, 0x00, // ###### ######
+ 0x7E, 0x7E, 0x00, // ###### ######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @5688 'o' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x03, 0xC0, 0x00, // ####
+ 0x0F, 0xF0, 0x00, // ########
+ 0x1C, 0x38, 0x00, // ### ###
+ 0x38, 0x1C, 0x00, // ### ###
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x30, 0x0C, 0x00, // ## ##
+ 0x38, 0x1C, 0x00, // ### ###
+ 0x1C, 0x38, 0x00, // ### ###
+ 0x0F, 0xF0, 0x00, // ########
+ 0x03, 0xC0, 0x00, // ####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @5760 'p' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7B, 0xE0, 0x00, // #### #####
+ 0x7F, 0xF8, 0x00, // ############
+ 0x1C, 0x18, 0x00, // ### ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x1C, 0x18, 0x00, // ### ##
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x1B, 0xE0, 0x00, // ## #####
+ 0x18, 0x00, 0x00, // ##
+ 0x18, 0x00, 0x00, // ##
+ 0x18, 0x00, 0x00, // ##
+ 0x7F, 0x00, 0x00, // #######
+ 0x7F, 0x00, 0x00, // #######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @5832 'q' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x07, 0xDE, 0x00, // ##### ####
+ 0x1F, 0xFE, 0x00, // ############
+ 0x18, 0x38, 0x00, // ## ###
+ 0x30, 0x18, 0x00, // ## ##
+ 0x30, 0x18, 0x00, // ## ##
+ 0x30, 0x18, 0x00, // ## ##
+ 0x30, 0x18, 0x00, // ## ##
+ 0x30, 0x18, 0x00, // ## ##
+ 0x18, 0x38, 0x00, // ## ###
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x07, 0xD8, 0x00, // ##### ##
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0x18, 0x00, // ##
+ 0x00, 0xFE, 0x00, // #######
+ 0x00, 0xFE, 0x00, // #######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @5904 'r' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x3E, 0x78, 0x00, // ##### ####
+ 0x3E, 0xFC, 0x00, // ##### ######
+ 0x07, 0xCC, 0x00, // ##### ##
+ 0x07, 0x00, 0x00, // ###
+ 0x06, 0x00, 0x00, // ##
+ 0x06, 0x00, 0x00, // ##
+ 0x06, 0x00, 0x00, // ##
+ 0x06, 0x00, 0x00, // ##
+ 0x06, 0x00, 0x00, // ##
+ 0x3F, 0xF0, 0x00, // ##########
+ 0x3F, 0xF0, 0x00, // ##########
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @5976 's' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x07, 0xF8, 0x00, // ########
+ 0x0F, 0xF8, 0x00, // #########
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x1F, 0x80, 0x00, // ######
+ 0x0F, 0xF0, 0x00, // ########
+ 0x00, 0xF8, 0x00, // #####
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x38, 0x00, // ## ###
+ 0x1F, 0xF0, 0x00, // #########
+ 0x1F, 0xE0, 0x00, // ########
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @6048 't' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x3F, 0xF0, 0x00, // ##########
+ 0x3F, 0xF0, 0x00, // ##########
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x00, 0x00, // ##
+ 0x0C, 0x1C, 0x00, // ## ###
+ 0x07, 0xFC, 0x00, // #########
+ 0x03, 0xF0, 0x00, // ######
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @6120 'u' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x78, 0x78, 0x00, // #### ####
+ 0x78, 0x78, 0x00, // #### ####
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x38, 0x00, // ## ###
+ 0x0F, 0xFE, 0x00, // ###########
+ 0x07, 0xDE, 0x00, // ##### ####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @6192 'v' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7C, 0x3E, 0x00, // ##### #####
+ 0x7C, 0x3E, 0x00, // ##### #####
+ 0x18, 0x18, 0x00, // ## ##
+ 0x18, 0x18, 0x00, // ## ##
+ 0x0C, 0x30, 0x00, // ## ##
+ 0x0C, 0x30, 0x00, // ## ##
+ 0x06, 0x60, 0x00, // ## ##
+ 0x06, 0x60, 0x00, // ## ##
+ 0x07, 0xE0, 0x00, // ######
+ 0x03, 0xC0, 0x00, // ####
+ 0x03, 0xC0, 0x00, // ####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @6264 'w' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x78, 0x3C, 0x00, // #### ####
+ 0x78, 0x3C, 0x00, // #### ####
+ 0x31, 0x18, 0x00, // ## # ##
+ 0x33, 0x98, 0x00, // ## ### ##
+ 0x33, 0x98, 0x00, // ## ### ##
+ 0x1A, 0xB0, 0x00, // ## # # ##
+ 0x1E, 0xF0, 0x00, // #### ####
+ 0x1E, 0xF0, 0x00, // #### ####
+ 0x1C, 0x60, 0x00, // ### ##
+ 0x0C, 0x60, 0x00, // ## ##
+ 0x0C, 0x60, 0x00, // ## ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @6336 'x' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x3E, 0x7C, 0x00, // ##### #####
+ 0x3E, 0x7C, 0x00, // ##### #####
+ 0x0C, 0x30, 0x00, // ## ##
+ 0x06, 0x60, 0x00, // ## ##
+ 0x03, 0xC0, 0x00, // ####
+ 0x01, 0x80, 0x00, // ##
+ 0x03, 0xC0, 0x00, // ####
+ 0x06, 0x60, 0x00, // ## ##
+ 0x0C, 0x30, 0x00, // ## ##
+ 0x3E, 0x7C, 0x00, // ##### #####
+ 0x3E, 0x7C, 0x00, // ##### #####
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @6408 'y' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x7E, 0x1F, 0x00, // ###### #####
+ 0x7E, 0x1F, 0x00, // ###### #####
+ 0x18, 0x0C, 0x00, // ## ##
+ 0x0C, 0x18, 0x00, // ## ##
+ 0x0C, 0x18, 0x00, // ## ##
+ 0x06, 0x30, 0x00, // ## ##
+ 0x06, 0x30, 0x00, // ## ##
+ 0x03, 0x60, 0x00, // ## ##
+ 0x03, 0xE0, 0x00, // #####
+ 0x01, 0xC0, 0x00, // ###
+ 0x00, 0xC0, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x03, 0x00, 0x00, // ##
+ 0x3F, 0xC0, 0x00, // ########
+ 0x3F, 0xC0, 0x00, // ########
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @6480 'z' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x18, 0x30, 0x00, // ## ##
+ 0x18, 0x60, 0x00, // ## ##
+ 0x00, 0xC0, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x03, 0x00, 0x00, // ##
+ 0x06, 0x18, 0x00, // ## ##
+ 0x0C, 0x18, 0x00, // ## ##
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x1F, 0xF8, 0x00, // ##########
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @6552 '{' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0xE0, 0x00, // ###
+ 0x01, 0xE0, 0x00, // ####
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x03, 0x80, 0x00, // ###
+ 0x07, 0x00, 0x00, // ###
+ 0x03, 0x80, 0x00, // ###
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0xE0, 0x00, // ####
+ 0x00, 0xE0, 0x00, // ###
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @6624 '|' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @6696 '}' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x07, 0x00, 0x00, // ###
+ 0x07, 0x80, 0x00, // ####
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0xC0, 0x00, // ###
+ 0x00, 0xE0, 0x00, // ###
+ 0x01, 0xC0, 0x00, // ###
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x01, 0x80, 0x00, // ##
+ 0x07, 0x80, 0x00, // ####
+ 0x07, 0x00, 0x00, // ###
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+
+ // @6768 '~' (17 pixels wide)
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x0E, 0x00, 0x00, // ###
+ 0x1F, 0x18, 0x00, // ##### ##
+ 0x3B, 0xB8, 0x00, // ### ### ###
+ 0x31, 0xF0, 0x00, // ## #####
+ 0x00, 0xE0, 0x00, // ###
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+ 0x00, 0x00, 0x00, //
+};
+
+sFONT Font24 = {
+ Font24_Table,
+ 17, /* Width */
+ 24, /* Height */
+};
+
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Function_Prototypes
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Functions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/Fonts/font8.c Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,1084 @@
+/**
+ ******************************************************************************
+ * @file Font8.c
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 18-February-2014
+ * @brief This file provides text Font8 for STM32xx-EVAL's LCD driver.
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2014 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 "fonts.h"
+
+/** @addtogroup Utilities
+ * @{
+ */
+
+/** @addtogroup STM32_EVAL
+ * @{
+ */
+
+/** @addtogroup Common
+ * @{
+ */
+
+/** @addtogroup FONTS
+ * @brief This file provides text Font8 for STM32xx-EVAL's LCD driver.
+ * @{
+ */
+
+/** @defgroup FONTS_Private_Types
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Defines
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Macros
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Variables
+ * @{
+ */
+//
+// Font data for Courier New 12pt
+//
+
+const uint8_t Font8_Table[] =
+{
+ // @0 ' ' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @8 '!' (5 pixels wide)
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x00, //
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @16 '"' (5 pixels wide)
+ 0x50, // # #
+ 0x50, // # #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @24 '#' (5 pixels wide)
+ 0x28, // # #
+ 0x50, // # #
+ 0xF8, // #####
+ 0x50, // # #
+ 0xF8, // #####
+ 0x50, // # #
+ 0xA0, // # #
+ 0x00, //
+
+ // @32 '$' (5 pixels wide)
+ 0x20, // #
+ 0x30, // ##
+ 0x60, // ##
+ 0x30, // ##
+ 0x10, // #
+ 0x60, // ##
+ 0x20, // #
+ 0x00, //
+
+ // @40 '%' (5 pixels wide)
+ 0x20, // #
+ 0x20, // #
+ 0x18, // ##
+ 0x60, // ##
+ 0x10, // #
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+
+ // @48 '&' (5 pixels wide)
+ 0x00, //
+ 0x38, // ###
+ 0x20, // #
+ 0x60, // ##
+ 0x50, // # #
+ 0x78, // ####
+ 0x00, //
+ 0x00, //
+
+ // @56 ''' (5 pixels wide)
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @64 '(' (5 pixels wide)
+ 0x10, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x10, // #
+ 0x00, //
+
+ // @72 ')' (5 pixels wide)
+ 0x40, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x40, // #
+ 0x00, //
+
+ // @80 '*' (5 pixels wide)
+ 0x20, // #
+ 0x70, // ###
+ 0x20, // #
+ 0x50, // # #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @88 '+' (5 pixels wide)
+ 0x00, //
+ 0x20, // #
+ 0x20, // #
+ 0xF8, // #####
+ 0x20, // #
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @96 ',' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x10, // #
+ 0x20, // #
+ 0x20, // #
+ 0x00, //
+
+ // @104 '-' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @112 '.' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @120 '/' (5 pixels wide)
+ 0x10, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x40, // #
+ 0x40, // #
+ 0x80, // #
+ 0x00, //
+
+ // @128 '0' (5 pixels wide)
+ 0x20, // #
+ 0x50, // # #
+ 0x50, // # #
+ 0x50, // # #
+ 0x50, // # #
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @136 '1' (5 pixels wide)
+ 0x60, // ##
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0xF8, // #####
+ 0x00, //
+ 0x00, //
+
+ // @144 '2' (5 pixels wide)
+ 0x20, // #
+ 0x50, // # #
+ 0x20, // #
+ 0x20, // #
+ 0x40, // #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+
+ // @152 '3' (5 pixels wide)
+ 0x20, // #
+ 0x50, // # #
+ 0x10, // #
+ 0x20, // #
+ 0x10, // #
+ 0x60, // ##
+ 0x00, //
+ 0x00, //
+
+ // @160 '4' (5 pixels wide)
+ 0x10, // #
+ 0x30, // ##
+ 0x50, // # #
+ 0x78, // ####
+ 0x10, // #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+
+ // @168 '5' (5 pixels wide)
+ 0x70, // ###
+ 0x40, // #
+ 0x60, // ##
+ 0x10, // #
+ 0x50, // # #
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @176 '6' (5 pixels wide)
+ 0x30, // ##
+ 0x40, // #
+ 0x60, // ##
+ 0x50, // # #
+ 0x50, // # #
+ 0x60, // ##
+ 0x00, //
+ 0x00, //
+
+ // @184 '7' (5 pixels wide)
+ 0x70, // ###
+ 0x50, // # #
+ 0x10, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @192 '8' (5 pixels wide)
+ 0x20, // #
+ 0x50, // # #
+ 0x20, // #
+ 0x50, // # #
+ 0x50, // # #
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @200 '9' (5 pixels wide)
+ 0x30, // ##
+ 0x50, // # #
+ 0x50, // # #
+ 0x30, // ##
+ 0x10, // #
+ 0x60, // ##
+ 0x00, //
+ 0x00, //
+
+ // @208 ':' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @216 ';' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x10, // #
+ 0x00, //
+ 0x10, // #
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @224 '<' (5 pixels wide)
+ 0x00, //
+ 0x10, // #
+ 0x20, // #
+ 0xC0, // ##
+ 0x20, // #
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+
+ // @232 '=' (5 pixels wide)
+ 0x00, //
+ 0x70, // ###
+ 0x00, //
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @240 '>' (5 pixels wide)
+ 0x00, //
+ 0x40, // #
+ 0x20, // #
+ 0x18, // ##
+ 0x20, // #
+ 0x40, // #
+ 0x00, //
+ 0x00, //
+
+ // @248 '?' (5 pixels wide)
+ 0x20, // #
+ 0x50, // # #
+ 0x10, // #
+ 0x20, // #
+ 0x00, //
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @256 '@' (5 pixels wide)
+ 0x30, // ##
+ 0x48, // # #
+ 0x48, // # #
+ 0x58, // # ##
+ 0x48, // # #
+ 0x40, // #
+ 0x38, // ###
+ 0x00, //
+
+ // @264 'A' (5 pixels wide)
+ 0x60, // ##
+ 0x20, // #
+ 0x50, // # #
+ 0x70, // ###
+ 0x88, // # #
+ 0xD8, // ## ##
+ 0x00, //
+ 0x00, //
+
+ // @272 'B' (5 pixels wide)
+ 0xF0, // ####
+ 0x48, // # #
+ 0x70, // ###
+ 0x48, // # #
+ 0x48, // # #
+ 0xF0, // ####
+ 0x00, //
+ 0x00, //
+
+ // @280 'C' (5 pixels wide)
+ 0x70, // ###
+ 0x50, // # #
+ 0x40, // #
+ 0x40, // #
+ 0x40, // #
+ 0x30, // ##
+ 0x00, //
+ 0x00, //
+
+ // @288 'D' (5 pixels wide)
+ 0xF0, // ####
+ 0x48, // # #
+ 0x48, // # #
+ 0x48, // # #
+ 0x48, // # #
+ 0xF0, // ####
+ 0x00, //
+ 0x00, //
+
+ // @296 'E' (5 pixels wide)
+ 0xF8, // #####
+ 0x48, // # #
+ 0x60, // ##
+ 0x40, // #
+ 0x48, // # #
+ 0xF8, // #####
+ 0x00, //
+ 0x00, //
+
+ // @304 'F' (5 pixels wide)
+ 0xF8, // #####
+ 0x48, // # #
+ 0x60, // ##
+ 0x40, // #
+ 0x40, // #
+ 0xE0, // ###
+ 0x00, //
+ 0x00, //
+
+ // @312 'G' (5 pixels wide)
+ 0x70, // ###
+ 0x40, // #
+ 0x40, // #
+ 0x58, // # ##
+ 0x50, // # #
+ 0x30, // ##
+ 0x00, //
+ 0x00, //
+
+ // @320 'H' (5 pixels wide)
+ 0xE8, // ### #
+ 0x48, // # #
+ 0x78, // ####
+ 0x48, // # #
+ 0x48, // # #
+ 0xE8, // ### #
+ 0x00, //
+ 0x00, //
+
+ // @328 'I' (5 pixels wide)
+ 0x70, // ###
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+
+ // @336 'J' (5 pixels wide)
+ 0x38, // ###
+ 0x10, // #
+ 0x10, // #
+ 0x50, // # #
+ 0x50, // # #
+ 0x20, // #
+ 0x00, //
+ 0x00, //
+
+ // @344 'K' (5 pixels wide)
+ 0xD8, // ## ##
+ 0x50, // # #
+ 0x60, // ##
+ 0x70, // ###
+ 0x50, // # #
+ 0xD8, // ## ##
+ 0x00, //
+ 0x00, //
+
+ // @352 'L' (5 pixels wide)
+ 0xE0, // ###
+ 0x40, // #
+ 0x40, // #
+ 0x40, // #
+ 0x48, // # #
+ 0xF8, // #####
+ 0x00, //
+ 0x00, //
+
+ // @360 'M' (5 pixels wide)
+ 0xD8, // ## ##
+ 0xD8, // ## ##
+ 0xD8, // ## ##
+ 0xA8, // # # #
+ 0x88, // # #
+ 0xD8, // ## ##
+ 0x00, //
+ 0x00, //
+
+ // @368 'N' (5 pixels wide)
+ 0xD8, // ## ##
+ 0x68, // ## #
+ 0x68, // ## #
+ 0x58, // # ##
+ 0x58, // # ##
+ 0xE8, // ### #
+ 0x00, //
+ 0x00, //
+
+ // @376 'O' (5 pixels wide)
+ 0x30, // ##
+ 0x48, // # #
+ 0x48, // # #
+ 0x48, // # #
+ 0x48, // # #
+ 0x30, // ##
+ 0x00, //
+ 0x00, //
+
+ // @384 'P' (5 pixels wide)
+ 0xF0, // ####
+ 0x48, // # #
+ 0x48, // # #
+ 0x70, // ###
+ 0x40, // #
+ 0xE0, // ###
+ 0x00, //
+ 0x00, //
+
+ // @392 'Q' (5 pixels wide)
+ 0x30, // ##
+ 0x48, // # #
+ 0x48, // # #
+ 0x48, // # #
+ 0x48, // # #
+ 0x30, // ##
+ 0x18, // ##
+ 0x00, //
+
+ // @400 'R' (5 pixels wide)
+ 0xF0, // ####
+ 0x48, // # #
+ 0x48, // # #
+ 0x70, // ###
+ 0x48, // # #
+ 0xE8, // ### #
+ 0x00, //
+ 0x00, //
+
+ // @408 'S' (5 pixels wide)
+ 0x70, // ###
+ 0x50, // # #
+ 0x20, // #
+ 0x10, // #
+ 0x50, // # #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+
+ // @416 'T' (5 pixels wide)
+ 0xF8, // #####
+ 0xA8, // # # #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+
+ // @424 'U' (5 pixels wide)
+ 0xD8, // ## ##
+ 0x48, // # #
+ 0x48, // # #
+ 0x48, // # #
+ 0x48, // # #
+ 0x30, // ##
+ 0x00, //
+ 0x00, //
+
+ // @432 'V' (5 pixels wide)
+ 0xD8, // ## ##
+ 0x88, // # #
+ 0x48, // # #
+ 0x50, // # #
+ 0x50, // # #
+ 0x30, // ##
+ 0x00, //
+ 0x00, //
+
+ // @440 'W' (5 pixels wide)
+ 0xD8, // ## ##
+ 0x88, // # #
+ 0xA8, // # # #
+ 0xA8, // # # #
+ 0xA8, // # # #
+ 0x50, // # #
+ 0x00, //
+ 0x00, //
+
+ // @448 'X' (5 pixels wide)
+ 0xD8, // ## ##
+ 0x50, // # #
+ 0x20, // #
+ 0x20, // #
+ 0x50, // # #
+ 0xD8, // ## ##
+ 0x00, //
+ 0x00, //
+
+ // @456 'Y' (5 pixels wide)
+ 0xD8, // ## ##
+ 0x88, // # #
+ 0x50, // # #
+ 0x20, // #
+ 0x20, // #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+
+ // @464 'Z' (5 pixels wide)
+ 0x78, // ####
+ 0x48, // # #
+ 0x10, // #
+ 0x20, // #
+ 0x48, // # #
+ 0x78, // ####
+ 0x00, //
+ 0x00, //
+
+ // @472 '[' (5 pixels wide)
+ 0x30, // ##
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x30, // ##
+ 0x00, //
+
+ // @480 '\' (5 pixels wide)
+ 0x80, // #
+ 0x40, // #
+ 0x40, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x10, // #
+ 0x00, //
+
+ // @488 ']' (5 pixels wide)
+ 0x60, // ##
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x60, // ##
+ 0x00, //
+
+ // @496 '^' (5 pixels wide)
+ 0x20, // #
+ 0x20, // #
+ 0x50, // # #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @504 '_' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0xF8, // #####
+
+ // @512 '`' (5 pixels wide)
+ 0x20, // #
+ 0x10, // #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x00, //
+
+ // @520 'a' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x30, // ##
+ 0x10, // #
+ 0x70, // ###
+ 0x78, // ####
+ 0x00, //
+ 0x00, //
+
+ // @528 'b' (5 pixels wide)
+ 0xC0, // ##
+ 0x40, // #
+ 0x70, // ###
+ 0x48, // # #
+ 0x48, // # #
+ 0xF0, // ####
+ 0x00, //
+ 0x00, //
+
+ // @536 'c' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x70, // ###
+ 0x40, // #
+ 0x40, // #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+
+ // @544 'd' (5 pixels wide)
+ 0x18, // ##
+ 0x08, // #
+ 0x38, // ###
+ 0x48, // # #
+ 0x48, // # #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+
+ // @552 'e' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x70, // ###
+ 0x70, // ###
+ 0x40, // #
+ 0x30, // ##
+ 0x00, //
+ 0x00, //
+
+ // @560 'f' (5 pixels wide)
+ 0x10, // #
+ 0x20, // #
+ 0x70, // ###
+ 0x20, // #
+ 0x20, // #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+
+ // @568 'g' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x38, // ###
+ 0x48, // # #
+ 0x48, // # #
+ 0x38, // ###
+ 0x08, // #
+ 0x30, // ##
+
+ // @576 'h' (5 pixels wide)
+ 0xC0, // ##
+ 0x40, // #
+ 0x70, // ###
+ 0x48, // # #
+ 0x48, // # #
+ 0xE8, // ### #
+ 0x00, //
+ 0x00, //
+
+ // @584 'i' (5 pixels wide)
+ 0x20, // #
+ 0x00, //
+ 0x60, // ##
+ 0x20, // #
+ 0x20, // #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+
+ // @592 'j' (5 pixels wide)
+ 0x20, // #
+ 0x00, //
+ 0x70, // ###
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x10, // #
+ 0x70, // ###
+
+ // @600 'k' (5 pixels wide)
+ 0xC0, // ##
+ 0x40, // #
+ 0x58, // # ##
+ 0x70, // ###
+ 0x50, // # #
+ 0xD8, // ## ##
+ 0x00, //
+ 0x00, //
+
+ // @608 'l' (5 pixels wide)
+ 0x60, // ##
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+
+ // @616 'm' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xD0, // ## #
+ 0xA8, // # # #
+ 0xA8, // # # #
+ 0xA8, // # # #
+ 0x00, //
+ 0x00, //
+
+ // @624 'n' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xF0, // ####
+ 0x48, // # #
+ 0x48, // # #
+ 0xC8, // ## #
+ 0x00, //
+ 0x00, //
+
+ // @632 'o' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x30, // ##
+ 0x48, // # #
+ 0x48, // # #
+ 0x30, // ##
+ 0x00, //
+ 0x00, //
+
+ // @640 'p' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xF0, // ####
+ 0x48, // # #
+ 0x48, // # #
+ 0x70, // ###
+ 0x40, // #
+ 0xE0, // ###
+
+ // @648 'q' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x38, // ###
+ 0x48, // # #
+ 0x48, // # #
+ 0x38, // ###
+ 0x08, // #
+ 0x18, // ##
+
+ // @656 'r' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x78, // ####
+ 0x20, // #
+ 0x20, // #
+ 0x70, // ###
+ 0x00, //
+ 0x00, //
+
+ // @664 's' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x30, // ##
+ 0x20, // #
+ 0x10, // #
+ 0x60, // ##
+ 0x00, //
+ 0x00, //
+
+ // @672 't' (5 pixels wide)
+ 0x00, //
+ 0x40, // #
+ 0xF0, // ####
+ 0x40, // #
+ 0x48, // # #
+ 0x30, // ##
+ 0x00, //
+ 0x00, //
+
+ // @680 'u' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xD8, // ## ##
+ 0x48, // # #
+ 0x48, // # #
+ 0x38, // ###
+ 0x00, //
+ 0x00, //
+
+ // @688 'v' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xC8, // ## #
+ 0x48, // # #
+ 0x30, // ##
+ 0x30, // ##
+ 0x00, //
+ 0x00, //
+
+ // @696 'w' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xD8, // ## ##
+ 0xA8, // # # #
+ 0xA8, // # # #
+ 0x50, // # #
+ 0x00, //
+ 0x00, //
+
+ // @704 'x' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x48, // # #
+ 0x30, // ##
+ 0x30, // ##
+ 0x48, // # #
+ 0x00, //
+ 0x00, //
+
+ // @712 'y' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0xD8, // ## ##
+ 0x50, // # #
+ 0x50, // # #
+ 0x20, // #
+ 0x20, // #
+ 0x60, // ##
+
+ // @720 'z' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x78, // ####
+ 0x50, // # #
+ 0x28, // # #
+ 0x78, // ####
+ 0x00, //
+ 0x00, //
+
+ // @728 '{' (5 pixels wide)
+ 0x10, // #
+ 0x20, // #
+ 0x20, // #
+ 0x60, // ##
+ 0x20, // #
+ 0x20, // #
+ 0x10, // #
+ 0x00, //
+
+ // @736 '|' (5 pixels wide)
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x20, // #
+ 0x00, //
+
+ // @744 '}' (5 pixels wide)
+ 0x40, // #
+ 0x20, // #
+ 0x20, // #
+ 0x30, // ##
+ 0x20, // #
+ 0x20, // #
+ 0x40, // #
+ 0x00, //
+
+ // @752 '~' (5 pixels wide)
+ 0x00, //
+ 0x00, //
+ 0x00, //
+ 0x28, // # #
+ 0x50, // # #
+ 0x00, //
+ 0x00, //
+ 0x00, //
+};
+
+sFONT Font8 = {
+ Font8_Table,
+ 5, /* Width */
+ 8, /* Height */
+};
+
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Function_Prototypes
+ * @{
+ */
+/**
+ * @}
+ */
+
+
+/** @defgroup FONTS_Private_Functions
+ * @{
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Utilities/Fonts/fonts.h Wed May 17 10:23:19 2017 +0200
@@ -0,0 +1,134 @@
+/**
+ ******************************************************************************
+ * @file fonts.h
+ * @author MCD Application Team
+ * @version V1.0.0
+ * @date 18-February-2014
+ * @brief Header for fonts.c file
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>© COPYRIGHT(c) 2014 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 __FONTS_H
+#define __FONTS_H
+
+#ifdef __cplusplus
+ extern "C" {
+#endif
+
+/* Includes ------------------------------------------------------------------*/
+#include <stdint.h>
+
+/** @addtogroup Utilities
+ * @{
+ */
+
+/** @addtogroup STM32_EVAL
+ * @{
+ */
+
+/** @addtogroup Common
+ * @{
+ */
+
+/** @addtogroup FONTS
+ * @{
+ */
+
+/** @defgroup FONTS_Exported_Types
+ * @{
+ */
+typedef struct _tFont
+{
+ const uint8_t *table;
+ uint16_t Width;
+ uint16_t Height;
+
+} sFONT;
+
+extern sFONT Font24;
+extern sFONT Font20;
+extern sFONT Font16;
+extern sFONT Font12;
+extern sFONT Font8;
+/**
+ * @}
+ */
+
+/** @defgroup FONTS_Exported_Constants
+ * @{
+ */
+#define LINE(x) ((x) * (((sFONT *)BSP_LCD_GetFont())->Height))
+
+/**
+ * @}
+ */
+
+/** @defgroup FONTS_Exported_Macros
+ * @{
+ */
+/**
+ * @}
+ */
+
+/** @defgroup FONTS_Exported_Functions
+ * @{
+ */
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __FONTS_H */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Daniel Lee