init
authorThomas Pietrzak <thomas.pietrzak@gmail.com>
Sun, 23 Sep 2018 15:19:17 +0000 (17:19 +0200)
committerThomas Pietrzak <thomas.pietrzak@gmail.com>
Sun, 23 Sep 2018 15:19:17 +0000 (17:19 +0200)
14 files changed:
Makefile [new file with mode: 0644]
lcdexample.c [new file with mode: 0644]
lib/Makefile [new file with mode: 0644]
lib/config.mk [new file with mode: 0644]
lib/fonts.c [new file with mode: 0755]
lib/fonts.h [new file with mode: 0755]
lib/stm32f429i_discovery.c [new file with mode: 0755]
lib/stm32f429i_discovery.h [new file with mode: 0755]
lib/stm32f429i_discovery_l3gd20.c [new file with mode: 0755]
lib/stm32f429i_discovery_l3gd20.h [new file with mode: 0755]
lib/stm32f429i_discovery_lcd.c [new file with mode: 0755]
lib/stm32f429i_discovery_lcd.h [new file with mode: 0755]
lib/stm32f429i_discovery_sdram.c [new file with mode: 0755]
lib/stm32f429i_discovery_sdram.h [new file with mode: 0755]

diff --git a/Makefile b/Makefile
new file mode 100644 (file)
index 0000000..5ed284e
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,61 @@
+export VERBOSE = true
+export DEBUG = true
+ROOTDIR = $(CURDIR)/uC-sdk
+export BOARD = stm32f429discovery
+
+TARGET = lcdexample.bin
+#TARGET_OBJS = lib/stm32f429i_discovery.o lib/stm32f429i_discovery_lcd.o lib/stm32f429i_discovery_sdram.o lib/fonts.o
+TARGET_SRCS = lcdexample.c lib/stm32f429i_discovery.c lib/stm32f429i_discovery_lcd.c lib/stm32f429i_discovery_sdram.c lib/fonts.c
+
+LIBDEPS = uC-sdk/chips/libchips.a uC-sdk/hardware/libhardware.a uC-sdk/FreeRTOS/libFreeRTOS.a uC-sdk/arch/libarch.a uC-sdk/os/libos.a uC-sdk/libc/libc.a uC-sdk/libm/libm.a uC-sdk/acorn/libacorn.a
+LIBS = -Wl,--start-group $(LIBDEPS) -Wl,--end-group
+TARGET_INCLUDES = include
+
+export MAINDIR = $(CURDIR)
+export ROOTDIR = $(MAINDIR)/uC-sdk/
+
+include $(MAINDIR)/lib/config.mk
+include $(ROOTDIR)/common.mk
+
+all: deps uC-sdk lib $(TARGET)
+
+clean: clean-generic
+       $(Q)rm -f $(TARGET)
+       $(Q)$(MAKE) $(MAKE_OPTS) -C uC-sdk clean
+       $(Q)$(MAKE) $(MAKE_OPTS) -C lib clean
+
+.PHONY: uC-sdk lib
+
+uC-sdk/FreeRTOS/libFreeRTOS.a: uC-sdk
+uC-sdk/arch/libarch.a: uC-sdk
+uC-sdk/os/libos.a: uC-sdk
+uC-sdk/libc/libc.a: uC-sdk
+uC-sdk/libm/libm.a: uC-sdk
+uC-sdk/acorn/libacorn.a: uC-sdk
+uC-sdk/hardware/libhardware.a: uC-sdk
+uC-sdk/chips/libchips.a: uC-sdk
+
+lib:
+       $(E) "[MAKE]   Entering lib"
+       $(Q)$(MAKE) $(MAKE_OPTS) -C lib
+
+uC-sdk:
+       $(E) "[MAKE]   Entering uC-sdk"
+       $(Q)$(MAKE) $(MAKE_OPTS) -C uC-sdk
+
+deps: ldeps
+       $(E) "[DEPS]   Creating dependency tree for uC-sdk"
+       $(Q)$(MAKE) $(MAKE_OPTS) -C uC-sdk ldeps
+       $(E) "[DEPS]   Creating dependency tree for lib"
+       $(Q)$(MAKE) $(MAKE_OPTS) -C lib ldeps
+
+include $(ROOTDIR)/FreeRTOS/config.mk
+include $(ROOTDIR)/hardware/config.mk
+include $(ROOTDIR)/arch/config.mk
+include $(ROOTDIR)/os/config.mk
+include $(ROOTDIR)/libc/config.mk
+include $(ROOTDIR)/libm/config.mk
+include $(ROOTDIR)/chips/config.mk
+include $(ROOTDIR)/acorn/config.mk
+include $(ROOTDIR)/target-rules.mk
+
diff --git a/lcdexample.c b/lcdexample.c
new file mode 100644 (file)
index 0000000..09187f0
--- /dev/null
@@ -0,0 +1,250 @@
+/*
+st-util:
+openocd -f board/stm32f4discovery.cfg
+
+arm-none-eabi-gdbtui -ex "target extended-remote :3333" lcdexample.elf
+monitor reset halt
+load 
+continue
+*/
+
+
+
+#include <FreeRTOS.h>
+#include <task.h>
+#include <stdio.h>
+#include <string.h>
+#include <malloc_wrapper.h>
+#include <semiio.h>
+#include <semifs.h>
+
+#include <gpio.h>
+//#include <spi.h>
+#include <ssp.h>
+#include <l3gd20.h>
+
+#include <stm32f4xx.h>
+#include <stm32f4xx_gpio.h>
+#include <stm32f4xx_ltdc.h>
+
+//Accelerometer
+#include <stm32f429i_discovery_lcd.h>
+//#include <stm32f429i_discovery_l3gd20.h>
+
+pin_t led[2];
+l3gd20_t gyro;
+float gyrovalues[3];
+float angles[2];
+
+float xvalues[240], yvalues[240];
+uint8_t currentvalue;
+
+float rx = 0, ry = 0;
+
+void initLed()
+{
+    led[0] = make_pin(GPIO_PORT_G, 13);
+    led[1] = make_pin(GPIO_PORT_G, 14);
+    gpio_config(led[0], pin_dir_write, pull_down);
+    gpio_config(led[1], pin_dir_write, pull_down);
+}
+
+void initLCD()
+{
+    LCD_Init();
+
+    LCD_LayerInit(); 
+    LTDC_Cmd(ENABLE);
+
+    LCD_SetFont(&Font8x8);
+    LCD_SetLayer(LCD_BACKGROUND_LAYER);
+//    LCD_Clear(ASSEMBLE_RGB(0x00, 0x66, 0x00));
+    LCD_SetLayer(LCD_FOREGROUND_LAYER);
+    LCD_SetBackColor(ASSEMBLE_RGB(0x00, 0x00, 0xFF));
+}
+
+void initGyro()
+{
+    pin_t sclk = make_pin(GPIO_PORT_F, 7);
+    pin_t mosi = make_pin(GPIO_PORT_F, 9);
+    pin_t miso = make_pin(GPIO_PORT_F, 8);
+    pin_t cs   = make_pin(GPIO_PORT_C, 1);
+    ssp_port_t gyroport = { .ssp = ssp_port_5, .sclk = sclk, .mosi = mosi, .miso = miso };
+
+    if (!l3gd20_init_ssp(&gyro, gyroport, cs))
+        printf("Cannot initialize gyroscope");
+}
+
+void setLed(int n)
+{
+    gpio_set(led[n], 1);
+}
+
+void resetLed(int n)
+{
+    gpio_set(led[n], 0);
+}
+
+
+void gyroTask()
+{
+    while(1)
+    {
+        setLed(1);
+
+        l3gd20_read(&gyro, gyrovalues);
+        angles[0] = (gyrovalues[0] - xvalues[currentvalue])/0.01;
+        angles[1] = (gyrovalues[1] - yvalues[currentvalue])/0.01;
+        xvalues[currentvalue] = gyrovalues[0];
+        yvalues[currentvalue] = gyrovalues[1];
+        currentvalue = (currentvalue + 1) % 240;
+
+        vTaskDelay(10);
+
+        resetLed(1);
+    }
+}
+
+void drawValues(uint16_t xpos, uint16_t ypos)
+{
+    uint8_t i;
+    LCD_SetTextColor(ASSEMBLE_RGB(0xff, 0xff, 0x00));
+    for (i = 0 ; i < 240 ; i++)
+        LCD_DrawRect(i, xpos - (xvalues[i])/2000, 1, 1);
+    LCD_SetTextColor(ASSEMBLE_RGB(0x00, 0xff, 0xff));
+    for (i = 0 ; i < 240 ; i++)
+        LCD_DrawRect(i, ypos - (yvalues[i])/2000, 1, 1);
+}
+
+void drawSquare(uint8_t x, uint8_t y)
+{
+    uint8_t size = 20;
+    LCD_SetTextColor(ASSEMBLE_RGB(0xff, 0x00, 0x00));
+    LCD_DrawFullRect(x - size, y - size, size, size);
+    LCD_SetTextColor(ASSEMBLE_RGB(0xff, 0xff, 0x00));
+    LCD_DrawFullRect(x, y - size, size, size);
+    LCD_SetTextColor(ASSEMBLE_RGB(0x00, 0x00, 0xff));
+    LCD_DrawFullRect(x - size, y, size, size);
+    LCD_SetTextColor(ASSEMBLE_RGB(0x00, 0xff, 0x00));
+    LCD_DrawFullRect(x, y, size, size);
+}
+
+void drawRainbow()
+{
+    uint16_t i = 0;
+    //rouge => jaune
+    for (i = 0 ; i < 40 ; i++)
+    {
+        LCD_SetTextColor(ASSEMBLE_RGB(0xff, i * 0xff / 40, 0x00));
+        LCD_DrawFullRect(i, 0, 1, 10);
+    }
+    //jaune => vert
+    for (i = 0 ; i < 40 ; i++)
+    {
+        LCD_SetTextColor(ASSEMBLE_RGB(0xff - i * 0xff / 40, 0xff, 0x00));
+        LCD_DrawFullRect(i + 40, 0, 1, 10);
+    }
+    //vert => cyan
+    for (i = 0 ; i < 40 ; i++)
+    {
+        LCD_SetTextColor(ASSEMBLE_RGB(0x00, 0xff, i * 0xff / 40));
+        LCD_DrawFullRect(i + 80, 0, 1, 10);
+    }
+    //cyan => bleu
+    for (i = 0 ; i < 40 ; i++)
+    {
+        LCD_SetTextColor(ASSEMBLE_RGB(0x00, 0xff - i * 0xff / 40, 0xff));
+        LCD_DrawFullRect(i + 120, 0, 1, 10);
+    }
+    //bleu => violet
+    for (i = 0 ; i < 40 ; i++)
+    {
+        LCD_SetTextColor(ASSEMBLE_RGB(i * 0xff / 40, 0x00, 0xff));
+        LCD_DrawFullRect(i + 160, 0, 1, 10);
+    }
+    //violet => rouge
+    for (i = 0 ; i < 40 ; i++)
+    {
+        LCD_SetTextColor(ASSEMBLE_RGB(0xff, 0x00, 0xff - i * 0xff / 40));
+        LCD_DrawFullRect(i + 200, 0, 1, 10);
+    }
+}
+
+void drawGradient()
+{
+    uint16_t i = 0;
+
+    for (i = 0 ; i < 0x100 ; i++)
+    {
+        LCD_SetTextColor(ASSEMBLE_RGB(i, i, i));
+        LCD_DrawFullRect(0, 320 - 0xff + i - 1, 240, 1);
+    }
+}
+
+void drawing()
+{
+    drawRainbow();
+    
+
+    LCD_SetTextColor(ASSEMBLE_RGB(0x00, 0x00, 0x00));
+    LCD_DrawFullRect(00, 10, 240, 64);
+
+    drawGradient();
+
+    LCD_SetBackColor(ASSEMBLE_RGB(0x00, 0x00, 0x00));
+    LCD_SetTextColor(ASSEMBLE_RGB(0x33, 0xff, 0x33));
+
+    char buffer[32];
+    sprintf(buffer, "rx=%f", gyrovalues[0]);
+    LCD_DisplayStringLine(24, (uint8_t *)buffer);
+    sprintf(buffer, "ry=%.2f", gyrovalues[1]);
+    LCD_DisplayStringLine(36, (uint8_t *)buffer);
+
+    drawValues(200, 200);
+
+    uint32_t posx = rx * 50 / 600;
+    uint32_t posy = ry * 50 / 600;
+    drawSquare(120 + posx, 160 + posy);
+}
+
+void drawTask()
+{
+    while(1)
+    {
+        setLed(0);
+        drawing();
+//        resetLed(1);
+//        vTaskDelay(500);
+        resetLed(0);
+//        setLed(1);
+        vTaskDelay(100);
+    }
+}
+
+int main() 
+{
+    init_malloc_wrapper();
+
+    //monitor arm semihosting enable
+    //register_semiio();
+    //register_semifs();
+
+    printf("Init led\n");
+    initLed();
+
+    printf("Init lcd\n");
+    initLCD();
+
+    printf("Init gyro\n");
+    initGyro();
+
+
+    printf("Start task\n");
+    xTaskCreate(drawTask, (const signed char *)NULL, configMINIMAL_STACK_SIZE, (void *)NULL, tskIDLE_PRIORITY, NULL);
+    xTaskCreate(gyroTask, (const signed char *)NULL, configMINIMAL_STACK_SIZE, (void *)NULL, tskIDLE_PRIORITY, NULL);
+
+    //start task scheduler
+    vTaskStartScheduler();
+
+    return 0;
+}
diff --git a/lib/Makefile b/lib/Makefile
new file mode 100644 (file)
index 0000000..332afd4
--- /dev/null
@@ -0,0 +1,19 @@
+all:  $(TARGET_OBJ)
+
+export BOARD = stm32f429discovery
+
+include $(ROOTDIR)/common.mk
+include config.mk
+include $(ROOTDIR)/arch/config.mk
+include $(ROOTDIR)/FreeRTOS/config.mk
+
+#TARGET_SRCS += i2c.c
+TARGET_SRCS += fonts
+TARGET_SRCS += stm32f429i_discovery.c
+TARGET_SRCS += stm32f429i_discovery_lcd.c
+TARGET_SRCS += stm32f429i_discovery_sdram.c
+#TARGET_SRCS += stm32f4xx_discovery_lis302dl.c
+
+include $(ROOTDIR)/target-rules.mk
+
+clean: clean-generic
diff --git a/lib/config.mk b/lib/config.mk
new file mode 100644 (file)
index 0000000..10ef728
--- /dev/null
@@ -0,0 +1,5 @@
+TARGET_INCLUDES += $(MAINDIR)/lib
+
+ifeq ($(USE_MPU),true)
+TARGET_CPPFLAGS += -DportUSING_MPU_WRAPPERS=1
+endif
diff --git a/lib/fonts.c b/lib/fonts.c
new file mode 100755 (executable)
index 0000000..66b6e4d
--- /dev/null
@@ -0,0 +1,1003 @@
+/**\r
+  ******************************************************************************\r
+  * @file    fonts.c\r
+  * @author  MCD Application Team\r
+  * @version V5.0.2\r
+  * @date    05-March-2012\r
+  * @brief   This file provides text fonts for STM32xx-EVAL's LCD driver. \r
+  ******************************************************************************\r
+  * @attention\r
+  *\r
+  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>\r
+  *\r
+  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+  * You may not use this file except in compliance with the License.\r
+  * You may obtain a copy of the License at:\r
+  *\r
+  *        http://www.st.com/software_license_agreement_liberty_v2\r
+  *\r
+  * Unless required by applicable law or agreed to in writing, software \r
+  * distributed under the License is distributed on an "AS IS" BASIS, \r
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+  * See the License for the specific language governing permissions and\r
+  * limitations under the License.\r
+  *\r
+  ******************************************************************************\r
+  */\r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "fonts.h"\r
+\r
+/** @addtogroup Utilities\r
+  * @{\r
+  */\r
+  \r
+/** @addtogroup STM32_EVAL\r
+  * @{\r
+  */ \r
+\r
+/** @addtogroup Common\r
+  * @{\r
+  */\r
+\r
+/** @addtogroup FONTS\r
+  * @brief      This file includes the Fonts driver of STM32xx-EVAL boards.\r
+  * @{\r
+  */  \r
+\r
+/** @defgroup FONTS_Private_Types\r
+  * @{\r
+  */ \r
+/**\r
+  * @}\r
+  */ \r
+\r
+\r
+/** @defgroup FONTS_Private_Defines\r
+  * @{\r
+  */\r
+/**\r
+  * @}\r
+  */ \r
+\r
+\r
+/** @defgroup FONTS_Private_Macros\r
+  * @{\r
+  */\r
+/**\r
+  * @}\r
+  */ \r
+  \r
+\r
+/** @defgroup FONTS_Private_Variables\r
+  * @{\r
+  */\r
+const uint16_t ASCII16x24_Table [] = {\r
+/** \r
+  * @brief        Space ' '  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '!'  \r
+  */ \r
+         0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+         0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, 0x0000,\r
+         0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '"'  \r
+  */ \r
+         0x0000, 0x0000, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '#'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C60, 0x0C60,\r
+         0x0C60, 0x0630, 0x0630, 0x1FFE, 0x1FFE, 0x0630, 0x0738, 0x0318,\r
+         0x1FFE, 0x1FFE, 0x0318, 0x0318, 0x018C, 0x018C, 0x018C, 0x0000,\r
+/** \r
+  * @brief        '$'  \r
+  */ \r
+         0x0000, 0x0080, 0x03E0, 0x0FF8, 0x0E9C, 0x1C8C, 0x188C, 0x008C,\r
+         0x0098, 0x01F8, 0x07E0, 0x0E80, 0x1C80, 0x188C, 0x188C, 0x189C,\r
+         0x0CB8, 0x0FF0, 0x03E0, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '%'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x180E, 0x0C1B, 0x0C11, 0x0611, 0x0611,\r
+         0x0311, 0x0311, 0x019B, 0x018E, 0x38C0, 0x6CC0, 0x4460, 0x4460,\r
+         0x4430, 0x4430, 0x4418, 0x6C18, 0x380C, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '&'  \r
+  */ \r
+         0x0000, 0x01E0, 0x03F0, 0x0738, 0x0618, 0x0618, 0x0330, 0x01F0,\r
+         0x00F0, 0x00F8, 0x319C, 0x330E, 0x1E06, 0x1C06, 0x1C06, 0x3F06,\r
+         0x73FC, 0x21F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '''  \r
+  */ \r
+         0x0000, 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '('  \r
+  */ \r
+         0x0000, 0x0200, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x0060, 0x0060,\r
+         0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030,\r
+         0x0060, 0x0060, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0200, 0x0000,\r
+/** \r
+  * @brief        ')'  \r
+  */ \r
+         0x0000, 0x0020, 0x0060, 0x00C0, 0x0180, 0x0180, 0x0300, 0x0300,\r
+         0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600,\r
+         0x0300, 0x0300, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0020, 0x0000,\r
+/** \r
+  * @brief        '*'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0,\r
+         0x06D8, 0x07F8, 0x01E0, 0x0330, 0x0738, 0x0000, 0x0000, 0x0000,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '+'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180,\r
+         0x0180, 0x0180, 0x0180, 0x3FFC, 0x3FFC, 0x0180, 0x0180, 0x0180,\r
+         0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        ','  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0000, 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '-'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x07E0, 0x0000, 0x0000,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '.'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '/'  \r
+  */ \r
+         0x0000, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0600, 0x0300, 0x0300,\r
+         0x0300, 0x0380, 0x0180, 0x0180, 0x0180, 0x00C0, 0x00C0, 0x00C0,\r
+         0x0060, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '0'  \r
+  */ \r
+         0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x180C, 0x180C, 0x180C,\r
+         0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C18, 0x0E38,\r
+         0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '1'  \r
+  */ \r
+         0x0000, 0x0100, 0x0180, 0x01C0, 0x01F0, 0x0198, 0x0188, 0x0180,\r
+         0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+         0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '2'  \r
+  */ \r
+         0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x1800,\r
+         0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018,\r
+         0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '3'  \r
+  */ \r
+         0x0000, 0x01E0, 0x07F8, 0x0E18, 0x0C0C, 0x0C0C, 0x0C00, 0x0600,\r
+         0x03C0, 0x07C0, 0x0C00, 0x1800, 0x1800, 0x180C, 0x180C, 0x0C18,\r
+         0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '4'  \r
+  */ \r
+         0x0000, 0x0C00, 0x0E00, 0x0F00, 0x0F00, 0x0D80, 0x0CC0, 0x0C60,\r
+         0x0C60, 0x0C30, 0x0C18, 0x0C0C, 0x3FFC, 0x3FFC, 0x0C00, 0x0C00,\r
+         0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '5'  \r
+  */ \r
+         0x0000, 0x0FF8, 0x0FF8, 0x0018, 0x0018, 0x000C, 0x03EC, 0x07FC,\r
+         0x0E1C, 0x1C00, 0x1800, 0x1800, 0x1800, 0x180C, 0x0C1C, 0x0E18,\r
+         0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '6'  \r
+  */ \r
+         0x0000, 0x07C0, 0x0FF0, 0x1C38, 0x1818, 0x0018, 0x000C, 0x03CC,\r
+         0x0FEC, 0x0E3C, 0x1C1C, 0x180C, 0x180C, 0x180C, 0x1C18, 0x0E38,\r
+         0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '7'  \r
+  */ \r
+         0x0000, 0x1FFC, 0x1FFC, 0x0C00, 0x0600, 0x0600, 0x0300, 0x0380,\r
+         0x0180, 0x01C0, 0x00C0, 0x00E0, 0x0060, 0x0060, 0x0070, 0x0030,\r
+         0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '8'  \r
+  */ \r
+         0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x0C18, 0x0C18, 0x0638,\r
+         0x07F0, 0x07F0, 0x0C18, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C38,\r
+         0x0FF8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '9'  \r
+  */ \r
+         0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C1C, 0x180C, 0x180C, 0x180C,\r
+         0x1C1C, 0x1E38, 0x1BF8, 0x19E0, 0x1800, 0x0C00, 0x0C00, 0x0E1C,\r
+         0x07F8, 0x01F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        ':'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        ';'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '<'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x1000, 0x1C00, 0x0F80, 0x03E0, 0x00F8, 0x0018, 0x00F8, 0x03E0,\r
+         0x0F80, 0x1C00, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '='  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x1FF8, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000, 0x0000,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '>'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0008, 0x0038, 0x01F0, 0x07C0, 0x1F00, 0x1800, 0x1F00, 0x07C0,\r
+         0x01F0, 0x0038, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '?'  \r
+  */ \r
+         0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x0C00,\r
+         0x0600, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x0000, 0x0000,\r
+         0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '@'  \r
+  */ \r
+         0x0000, 0x0000, 0x07E0, 0x1818, 0x2004, 0x29C2, 0x4A22, 0x4411,\r
+         0x4409, 0x4409, 0x4409, 0x2209, 0x1311, 0x0CE2, 0x4002, 0x2004,\r
+         0x1818, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'A'  \r
+  */ \r
+         0x0000, 0x0380, 0x0380, 0x06C0, 0x06C0, 0x06C0, 0x0C60, 0x0C60,\r
+         0x1830, 0x1830, 0x1830, 0x3FF8, 0x3FF8, 0x701C, 0x600C, 0x600C,\r
+         0xC006, 0xC006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'B'  \r
+  */ \r
+         0x0000, 0x03FC, 0x0FFC, 0x0C0C, 0x180C, 0x180C, 0x180C, 0x0C0C,\r
+         0x07FC, 0x0FFC, 0x180C, 0x300C, 0x300C, 0x300C, 0x300C, 0x180C,\r
+         0x1FFC, 0x07FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'C'  \r
+  */ \r
+         0x0000, 0x07C0, 0x1FF0, 0x3838, 0x301C, 0x700C, 0x6006, 0x0006,\r
+         0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x6006, 0x700C, 0x301C,\r
+         0x1FF0, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'D'  \r
+  */ \r
+         0x0000, 0x03FE, 0x0FFE, 0x0E06, 0x1806, 0x1806, 0x3006, 0x3006,\r
+         0x3006, 0x3006, 0x3006, 0x3006, 0x3006, 0x1806, 0x1806, 0x0E06,\r
+         0x0FFE, 0x03FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'E'  \r
+  */ \r
+         0x0000, 0x3FFC, 0x3FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,\r
+         0x1FFC, 0x1FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,\r
+         0x3FFC, 0x3FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'F'  \r
+  */ \r
+         0x0000, 0x3FF8, 0x3FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,\r
+         0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,\r
+         0x0018, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'G'  \r
+  */ \r
+         0x0000, 0x0FE0, 0x3FF8, 0x783C, 0x600E, 0xE006, 0xC007, 0x0003,\r
+         0x0003, 0xFE03, 0xFE03, 0xC003, 0xC007, 0xC006, 0xC00E, 0xF03C,\r
+         0x3FF8, 0x0FE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'H'  \r
+  */ \r
+         0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C,\r
+         0x3FFC, 0x3FFC, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C,\r
+         0x300C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'I'  \r
+  */ \r
+         0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+         0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+         0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'J'  \r
+  */ \r
+         0x0000, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600,\r
+         0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0618, 0x0618, 0x0738,\r
+         0x03F0, 0x01E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'K'  \r
+  */ \r
+         0x0000, 0x3006, 0x1806, 0x0C06, 0x0606, 0x0306, 0x0186, 0x00C6,\r
+         0x0066, 0x0076, 0x00DE, 0x018E, 0x0306, 0x0606, 0x0C06, 0x1806,\r
+         0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'L'  \r
+  */ \r
+         0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,\r
+         0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018,\r
+         0x1FF8, 0x1FF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'M'  \r
+  */ \r
+         0x0000, 0xE00E, 0xF01E, 0xF01E, 0xF01E, 0xD836, 0xD836, 0xD836,\r
+         0xD836, 0xCC66, 0xCC66, 0xCC66, 0xC6C6, 0xC6C6, 0xC6C6, 0xC6C6,\r
+         0xC386, 0xC386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'N'  \r
+  */ \r
+         0x0000, 0x300C, 0x301C, 0x303C, 0x303C, 0x306C, 0x306C, 0x30CC,\r
+         0x30CC, 0x318C, 0x330C, 0x330C, 0x360C, 0x360C, 0x3C0C, 0x3C0C,\r
+         0x380C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'O'  \r
+  */ \r
+         0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xC003, 0xC003,\r
+         0xC003, 0xC003, 0xC003, 0xC003, 0xC003, 0x6006, 0x700E, 0x381C,\r
+         0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'P'  \r
+  */ \r
+         0x0000, 0x0FFC, 0x1FFC, 0x380C, 0x300C, 0x300C, 0x300C, 0x300C,\r
+         0x180C, 0x1FFC, 0x07FC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C,\r
+         0x000C, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'Q'  \r
+  */ \r
+         0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xE003, 0xC003,\r
+         0xC003, 0xC003, 0xC003, 0xC003, 0xE007, 0x6306, 0x3F0E, 0x3C1C,\r
+         0x3FF8, 0xF7E0, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'R'  \r
+  */ \r
+         0x0000, 0x0FFE, 0x1FFE, 0x3806, 0x3006, 0x3006, 0x3006, 0x3806,\r
+         0x1FFE, 0x07FE, 0x0306, 0x0606, 0x0C06, 0x1806, 0x1806, 0x3006,\r
+         0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'S'  \r
+  */ \r
+         0x0000, 0x03E0, 0x0FF8, 0x0C1C, 0x180C, 0x180C, 0x000C, 0x001C,\r
+         0x03F8, 0x0FE0, 0x1E00, 0x3800, 0x3006, 0x3006, 0x300E, 0x1C1C,\r
+         0x0FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'T'  \r
+  */ \r
+         0x0000, 0x7FFE, 0x7FFE, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+         0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+         0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'U'  \r
+  */ \r
+         0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C,\r
+         0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x1818,\r
+         0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'V'  \r
+  */ \r
+         0x0000, 0x6003, 0x3006, 0x3006, 0x3006, 0x180C, 0x180C, 0x180C,\r
+         0x0C18, 0x0C18, 0x0E38, 0x0630, 0x0630, 0x0770, 0x0360, 0x0360,\r
+         0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'W'  \r
+  */ \r
+         0x0000, 0x6003, 0x61C3, 0x61C3, 0x61C3, 0x3366, 0x3366, 0x3366,\r
+         0x3366, 0x3366, 0x3366, 0x1B6C, 0x1B6C, 0x1B6C, 0x1A2C, 0x1E3C,\r
+         0x0E38, 0x0E38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'X'  \r
+  */ \r
+         0x0000, 0xE00F, 0x700C, 0x3018, 0x1830, 0x0C70, 0x0E60, 0x07C0,\r
+         0x0380, 0x0380, 0x03C0, 0x06E0, 0x0C70, 0x1C30, 0x1818, 0x300C,\r
+         0x600E, 0xE007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'Y'  \r
+  */ \r
+         0x0000, 0xC003, 0x6006, 0x300C, 0x381C, 0x1838, 0x0C30, 0x0660,\r
+         0x07E0, 0x03C0, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+         0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'Z'  \r
+  */ \r
+         0x0000, 0x7FFC, 0x7FFC, 0x6000, 0x3000, 0x1800, 0x0C00, 0x0600,\r
+         0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 0x000C, 0x0006,\r
+         0x7FFE, 0x7FFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '['  \r
+  */ \r
+         0x0000, 0x03E0, 0x03E0, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060,\r
+         0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060,\r
+         0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x03E0, 0x03E0, 0x0000,\r
+/** \r
+  * @brief        '\'  \r
+  */ \r
+         0x0000, 0x0030, 0x0030, 0x0060, 0x0060, 0x0060, 0x00C0, 0x00C0,\r
+         0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0300, 0x0300, 0x0300,\r
+         0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        ']'  \r
+  */ \r
+         0x0000, 0x03E0, 0x03E0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,\r
+         0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300,\r
+         0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x03E0, 0x03E0, 0x0000,\r
+/** \r
+  * @brief        '^'  \r
+  */ \r
+         0x0000, 0x0000, 0x01C0, 0x01C0, 0x0360, 0x0360, 0x0360, 0x0630,\r
+         0x0630, 0x0C18, 0x0C18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '_'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '''  \r
+  */ \r
+         0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0000,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'a'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03F0, 0x07F8,\r
+         0x0C1C, 0x0C0C, 0x0F00, 0x0FF0, 0x0CF8, 0x0C0C, 0x0C0C, 0x0F1C,\r
+         0x0FF8, 0x18F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'b'  \r
+  */ \r
+         0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x03D8, 0x0FF8,\r
+         0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38,\r
+         0x0FF8, 0x03D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'c'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x07F0,\r
+         0x0E30, 0x0C18, 0x0018, 0x0018, 0x0018, 0x0018, 0x0C18, 0x0E30,\r
+         0x07F0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'd'  \r
+  */ \r
+         0x0000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1BC0, 0x1FF0,\r
+         0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30,\r
+         0x1FF0, 0x1BC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'e'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0,\r
+         0x0C30, 0x1818, 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x1838, 0x1C30,\r
+         0x0FF0, 0x07C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'f'  \r
+  */ \r
+         0x0000, 0x0F80, 0x0FC0, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0,\r
+         0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,\r
+         0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'g'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0DE0, 0x0FF8,\r
+         0x0E18, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0E18,\r
+         0x0FF8, 0x0DE0, 0x0C00, 0x0C0C, 0x061C, 0x07F8, 0x01F0, 0x0000,\r
+/** \r
+  * @brief        'h'  \r
+  */ \r
+         0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x07D8, 0x0FF8,\r
+         0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818,\r
+         0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'i'  \r
+  */ \r
+         0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0,\r
+         0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,\r
+         0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'j'  \r
+  */ \r
+         0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0,\r
+         0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,\r
+         0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00F8, 0x0078, 0x0000,\r
+/** \r
+  * @brief        'k'  \r
+  */ \r
+         0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0C0C, 0x060C,\r
+         0x030C, 0x018C, 0x00CC, 0x006C, 0x00FC, 0x019C, 0x038C, 0x030C,\r
+         0x060C, 0x0C0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'l'  \r
+  */ \r
+         0x0000, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,\r
+         0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,\r
+         0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'm'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C7C, 0x7EFF,\r
+         0xE3C7, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183,\r
+         0xC183, 0xC183, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'n'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0798, 0x0FF8,\r
+         0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818,\r
+         0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'o'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0,\r
+         0x0C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C30,\r
+         0x0FF0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'p'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03D8, 0x0FF8,\r
+         0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38,\r
+         0x0FF8, 0x03D8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0000,\r
+/** \r
+  * @brief        'q'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1BC0, 0x1FF0,\r
+         0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30,\r
+         0x1FF0, 0x1BC0, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x0000,\r
+/** \r
+  * @brief        'r'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07B0, 0x03F0,\r
+         0x0070, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030,\r
+         0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        's'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03E0, 0x03F0,\r
+         0x0E38, 0x0C18, 0x0038, 0x03F0, 0x07C0, 0x0C00, 0x0C18, 0x0E38,\r
+         0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        't'  \r
+  */ \r
+         0x0000, 0x0000, 0x0080, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0,\r
+         0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,\r
+         0x07C0, 0x0780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'u'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1818, 0x1818,\r
+         0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C38,\r
+         0x1FF0, 0x19E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'v'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x180C, 0x0C18,\r
+         0x0C18, 0x0C18, 0x0630, 0x0630, 0x0630, 0x0360, 0x0360, 0x0360,\r
+         0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'w'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41C1, 0x41C1,\r
+         0x61C3, 0x6363, 0x6363, 0x6363, 0x3636, 0x3636, 0x3636, 0x1C1C,\r
+         0x1C1C, 0x1C1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'x'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x381C, 0x1C38,\r
+         0x0C30, 0x0660, 0x0360, 0x0360, 0x0360, 0x0360, 0x0660, 0x0C30,\r
+         0x1C38, 0x381C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        'y'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3018, 0x1830,\r
+         0x1830, 0x1870, 0x0C60, 0x0C60, 0x0CE0, 0x06C0, 0x06C0, 0x0380,\r
+         0x0380, 0x0380, 0x0180, 0x0180, 0x01C0, 0x00F0, 0x0070, 0x0000,\r
+/** \r
+  * @brief        'z'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FFC, 0x1FFC,\r
+         0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018,\r
+         0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '{'  \r
+  */ \r
+         0x0000, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0,\r
+         0x00C0, 0x0060, 0x0060, 0x0030, 0x0060, 0x0040, 0x00C0, 0x00C0,\r
+         0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '|'  \r
+  */ \r
+         0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+         0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180,\r
+         0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000,\r
+/** \r
+  * @brief        '}'  \r
+  */ \r
+         0x0000, 0x0060, 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0180,\r
+         0x0180, 0x0300, 0x0300, 0x0600, 0x0300, 0x0100, 0x0180, 0x0180,\r
+         0x0180, 0x0180, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0000, 0x0000,\r
+/** \r
+  * @brief        '~'  \r
+  */ \r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x10F0, 0x1FF8, 0x0F08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,\r
+         0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000};\r
+\r
+const uint16_t ASCII12x12_Table [] = {\r
+    0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+    0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x2000,0x0000,0x0000,\r
+    0x0000,0x5000,0x5000,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+    0x0000,0x0900,0x0900,0x1200,0x7f00,0x1200,0x7f00,0x1200,0x2400,0x2400,0x0000,0x0000,\r
+    0x1000,0x3800,0x5400,0x5000,0x5000,0x3800,0x1400,0x5400,0x5400,0x3800,0x1000,0x0000,\r
+    0x0000,0x3080,0x4900,0x4900,0x4a00,0x32c0,0x0520,0x0920,0x0920,0x10c0,0x0000,0x0000,\r
+    0x0000,0x0c00,0x1200,0x1200,0x1400,0x1800,0x2500,0x2300,0x2300,0x1d80,0x0000,0x0000,\r
+    0x0000,0x4000,0x4000,0x4000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+    0x0000,0x0800,0x1000,0x1000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x1000,0x1000,\r
+    0x0000,0x4000,0x2000,0x2000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x2000,0x2000,\r
+    0x0000,0x2000,0x7000,0x2000,0x5000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x0800,0x0800,0x7f00,0x0800,0x0800,0x0000,0x0000,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x4000,\r
+    0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7000,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x0000,0x0000,\r
+    0x0000,0x1000,0x1000,0x1000,0x2000,0x2000,0x2000,0x2000,0x4000,0x4000,0x0000,0x0000,\r
+    0x0000,0x1000,0x2800,0x4400,0x4400,0x4400,0x4400,0x4400,0x2800,0x1000,0x0000,0x0000,\r
+    0x0000,0x1000,0x3000,0x5000,0x1000,0x1000,0x1000,0x1000,0x1000,0x1000,0x0000,0x0000,\r
+    0x0000,0x3000,0x4800,0x4400,0x0400,0x0800,0x1000,0x2000,0x4000,0x7c00,0x0000,0x0000,\r
+    0x0000,0x3000,0x4800,0x0400,0x0800,0x1000,0x0800,0x4400,0x4800,0x3000,0x0000,0x0000,\r
+    0x0000,0x0800,0x1800,0x1800,0x2800,0x2800,0x4800,0x7c00,0x0800,0x0800,0x0000,0x0000,\r
+    0x0000,0x3c00,0x2000,0x4000,0x7000,0x4800,0x0400,0x4400,0x4800,0x3000,0x0000,0x0000,\r
+    0x0000,0x1800,0x2400,0x4000,0x5000,0x6800,0x4400,0x4400,0x2800,0x1000,0x0000,0x0000,\r
+    0x0000,0x7c00,0x0400,0x0800,0x1000,0x1000,0x1000,0x2000,0x2000,0x2000,0x0000,0x0000,\r
+    0x0000,0x1000,0x2800,0x4400,0x2800,0x1000,0x2800,0x4400,0x2800,0x1000,0x0000,0x0000,\r
+    0x0000,0x1000,0x2800,0x4400,0x4400,0x2c00,0x1400,0x0400,0x4800,0x3000,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x2000,0x2000,0x4000,\r
+    0x0000,0x0000,0x0400,0x0800,0x3000,0x4000,0x3000,0x0800,0x0400,0x0000,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x7c00,0x0000,0x0000,0x7c00,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+    0x0000,0x0000,0x4000,0x2000,0x1800,0x0400,0x1800,0x2000,0x4000,0x0000,0x0000,0x0000,\r
+    0x0000,0x3800,0x6400,0x4400,0x0400,0x0800,0x1000,0x1000,0x0000,0x1000,0x0000,0x0000,\r
+    0x0000,0x0f80,0x1040,0x2ea0,0x51a0,0x5120,0x5120,0x5120,0x5320,0x4dc0,0x2020,0x1040,\r
+    0x0000,0x0800,0x1400,0x1400,0x1400,0x2200,0x3e00,0x2200,0x4100,0x4100,0x0000,0x0000,\r
+    0x0000,0x3c00,0x2200,0x2200,0x2200,0x3c00,0x2200,0x2200,0x2200,0x3c00,0x0000,0x0000,\r
+    0x0000,0x0e00,0x1100,0x2100,0x2000,0x2000,0x2000,0x2100,0x1100,0x0e00,0x0000,0x0000,\r
+    0x0000,0x3c00,0x2200,0x2100,0x2100,0x2100,0x2100,0x2100,0x2200,0x3c00,0x0000,0x0000,\r
+    0x0000,0x3e00,0x2000,0x2000,0x2000,0x3e00,0x2000,0x2000,0x2000,0x3e00,0x0000,0x0000,\r
+    0x0000,0x3e00,0x2000,0x2000,0x2000,0x3c00,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000,\r
+    0x0000,0x0e00,0x1100,0x2100,0x2000,0x2700,0x2100,0x2100,0x1100,0x0e00,0x0000,0x0000,\r
+    0x0000,0x2100,0x2100,0x2100,0x2100,0x3f00,0x2100,0x2100,0x2100,0x2100,0x0000,0x0000,\r
+    0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000,\r
+    0x0000,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x4800,0x4800,0x3000,0x0000,0x0000,\r
+    0x0000,0x2200,0x2400,0x2800,0x2800,0x3800,0x2800,0x2400,0x2400,0x2200,0x0000,0x0000,\r
+    0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x3e00,0x0000,0x0000,\r
+    0x0000,0x2080,0x3180,0x3180,0x3180,0x2a80,0x2a80,0x2a80,0x2a80,0x2480,0x0000,0x0000,\r
+    0x0000,0x2100,0x3100,0x3100,0x2900,0x2900,0x2500,0x2300,0x2300,0x2100,0x0000,0x0000,\r
+    0x0000,0x0c00,0x1200,0x2100,0x2100,0x2100,0x2100,0x2100,0x1200,0x0c00,0x0000,0x0000,\r
+    0x0000,0x3c00,0x2200,0x2200,0x2200,0x3c00,0x2000,0x2000,0x2000,0x2000,0x0000,0x0000,\r
+    0x0000,0x0c00,0x1200,0x2100,0x2100,0x2100,0x2100,0x2100,0x1600,0x0d00,0x0100,0x0000,\r
+    0x0000,0x3e00,0x2100,0x2100,0x2100,0x3e00,0x2400,0x2200,0x2100,0x2080,0x0000,0x0000,\r
+    0x0000,0x1c00,0x2200,0x2200,0x2000,0x1c00,0x0200,0x2200,0x2200,0x1c00,0x0000,0x0000,\r
+    0x0000,0x3e00,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,\r
+    0x0000,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x2100,0x1200,0x0c00,0x0000,0x0000,\r
+    0x0000,0x4100,0x4100,0x2200,0x2200,0x2200,0x1400,0x1400,0x1400,0x0800,0x0000,0x0000,\r
+    0x0000,0x4440,0x4a40,0x2a40,0x2a80,0x2a80,0x2a80,0x2a80,0x2a80,0x1100,0x0000,0x0000,\r
+    0x0000,0x4100,0x2200,0x1400,0x1400,0x0800,0x1400,0x1400,0x2200,0x4100,0x0000,0x0000,\r
+    0x0000,0x4100,0x2200,0x2200,0x1400,0x0800,0x0800,0x0800,0x0800,0x0800,0x0000,0x0000,\r
+    0x0000,0x7e00,0x0200,0x0400,0x0800,0x1000,0x1000,0x2000,0x4000,0x7e00,0x0000,0x0000,\r
+    0x0000,0x3000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,\r
+    0x0000,0x4000,0x4000,0x2000,0x2000,0x2000,0x2000,0x2000,0x1000,0x1000,0x0000,0x0000,\r
+    0x0000,0x6000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,\r
+    0x0000,0x1000,0x2800,0x2800,0x2800,0x4400,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x7e00,\r
+    0x4000,0x2000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x3800,0x4400,0x0400,0x3c00,0x4400,0x4400,0x3c00,0x0000,0x0000,\r
+    0x0000,0x4000,0x4000,0x5800,0x6400,0x4400,0x4400,0x4400,0x6400,0x5800,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x3000,0x4800,0x4000,0x4000,0x4000,0x4800,0x3000,0x0000,0x0000,\r
+    0x0000,0x0400,0x0400,0x3400,0x4c00,0x4400,0x4400,0x4400,0x4c00,0x3400,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x3800,0x4400,0x4400,0x7c00,0x4000,0x4400,0x3800,0x0000,0x0000,\r
+    0x0000,0x6000,0x4000,0xe000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x3400,0x4c00,0x4400,0x4400,0x4400,0x4c00,0x3400,0x0400,0x4400,\r
+    0x0000,0x4000,0x4000,0x5800,0x6400,0x4400,0x4400,0x4400,0x4400,0x4400,0x0000,0x0000,\r
+    0x0000,0x4000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,\r
+    0x0000,0x4000,0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,\r
+    0x0000,0x4000,0x4000,0x4800,0x5000,0x6000,0x5000,0x5000,0x4800,0x4800,0x0000,0x0000,\r
+    0x0000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x5200,0x6d00,0x4900,0x4900,0x4900,0x4900,0x4900,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x5800,0x6400,0x4400,0x4400,0x4400,0x4400,0x4400,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x3800,0x4400,0x4400,0x4400,0x4400,0x4400,0x3800,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x5800,0x6400,0x4400,0x4400,0x4400,0x6400,0x5800,0x4000,0x4000,\r
+    0x0000,0x0000,0x0000,0x3400,0x4c00,0x4400,0x4400,0x4400,0x4c00,0x3400,0x0400,0x0400,\r
+    0x0000,0x0000,0x0000,0x5000,0x6000,0x4000,0x4000,0x4000,0x4000,0x4000,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x3000,0x4800,0x4000,0x3000,0x0800,0x4800,0x3000,0x0000,0x0000,\r
+    0x0000,0x4000,0x4000,0xe000,0x4000,0x4000,0x4000,0x4000,0x4000,0x6000,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x4400,0x4400,0x4400,0x4400,0x4400,0x4c00,0x3400,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x4400,0x4400,0x2800,0x2800,0x2800,0x2800,0x1000,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x4900,0x4900,0x5500,0x5500,0x5500,0x5500,0x2200,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x4400,0x2800,0x2800,0x1000,0x2800,0x2800,0x4400,0x0000,0x0000,\r
+    0x0000,0x0000,0x0000,0x4400,0x4400,0x2800,0x2800,0x2800,0x1000,0x1000,0x1000,0x1000,\r
+    0x0000,0x0000,0x0000,0x7800,0x0800,0x1000,0x2000,0x2000,0x4000,0x7800,0x0000,0x0000,\r
+    0x0000,0x1000,0x2000,0x2000,0x2000,0x2000,0x4000,0x2000,0x2000,0x2000,0x2000,0x2000,\r
+    0x0000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,0x2000,\r
+    0x0000,0x4000,0x2000,0x2000,0x2000,0x2000,0x1000,0x2000,0x2000,0x2000,0x2000,0x2000,\r
+    0x0000,0x0000,0x0000,0x0000,0x7400,0x5800,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,\r
+    0x0000,0x0000,0x7000,0x5000,0x5000,0x5000,0x5000,0x5000,0x5000,0x7000,0x0000,0x0000};\r
+\r
+const uint16_t ASCII8x12_Table [] = {\r
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+    0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x10,0x00,\r
+    0x00,0x00,0x00,0x28,0x28,0x28,0x00,0x00,0x00,0x00,0x00,0x00,\r
+    0x00,0x00,0x00,0x14,0x14,0x3e,0x14,0x28,0x7c,0x28,0x28,0x00,\r
+    0x00,0x00,0x10,0x38,0x54,0x50,0x38,0x14,0x14,0x54,0x38,0x10,\r
+    0x00,0x00,0x00,0x44,0xa8,0xa8,0x50,0x14,0x1a,0x2a,0x24,0x00,\r
+    0x00,0x00,0x00,0x20,0x50,0x50,0x20,0xe8,0x98,0x98,0x60,0x00,\r
+    0x00,0x00,0x00,0x80,0x80,0x80,0x00,0x00,0x00,0x00,0x00,0x00,\r
+    0x00,0x00,0x00,0x40,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,\r
+    0x00,0x00,0x00,0x80,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,\r
+    0x00,0x00,0x00,0x40,0xe0,0x40,0xa0,0x00,0x00,0x00,0x00,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x20,0x20,0xf8,0x20,0x20,0x00,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,\r
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,\r
+    0x00,0x00,0x00,0x20,0x20,0x20,0x40,0x40,0x80,0x80,0x80,0x00,\r
+    0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x90,0x90,0x60,0x00,\r
+    0x00,0x00,0x00,0x20,0x60,0xa0,0x20,0x20,0x20,0x20,0x20,0x00,\r
+    0x00,0x00,0x00,0x60,0x90,0x10,0x10,0x20,0x40,0x80,0xf0,0x00,\r
+    0x00,0x00,0x00,0x60,0x90,0x10,0x60,0x10,0x10,0x90,0x60,0x00,\r
+    0x00,0x00,0x00,0x10,0x30,0x50,0x50,0x90,0xf8,0x10,0x10,0x00,\r
+    0x00,0x00,0x00,0x70,0x40,0x80,0xe0,0x10,0x10,0x90,0x60,0x00,\r
+    0x00,0x00,0x00,0x60,0x90,0x80,0xa0,0xd0,0x90,0x90,0x60,0x00,\r
+    0x00,0x00,0x00,0xf0,0x10,0x20,0x20,0x20,0x40,0x40,0x40,0x00,\r
+    0x00,0x00,0x00,0x60,0x90,0x90,0x60,0x90,0x90,0x90,0x60,0x00,\r
+    0x00,0x00,0x00,0x60,0x90,0x90,0xb0,0x50,0x10,0x90,0x60,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x40,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x40,0x40,\r
+    0x00,0x00,0x00,0x00,0x00,0x10,0x60,0x80,0x60,0x10,0x00,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xf0,0x00,0x00,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x10,0x60,0x80,0x00,0x00,\r
+    0x00,0x00,0x00,0x60,0x90,0x10,0x20,0x40,0x40,0x00,0x40,0x00,\r
+    0x00,0x00,0x00,0x1c,0x22,0x5b,0xa5,0xa5,0xa5,0xa5,0x9e,0x41,\r
+    0x00,0x00,0x00,0x20,0x50,0x50,0x50,0x50,0x70,0x88,0x88,0x00,\r
+    0x00,0x00,0x00,0xf0,0x88,0x88,0xf0,0x88,0x88,0x88,0xf0,0x00,\r
+    0x00,0x00,0x00,0x38,0x44,0x84,0x80,0x80,0x84,0x44,0x38,0x00,\r
+    0x00,0x00,0x00,0xe0,0x90,0x88,0x88,0x88,0x88,0x90,0xe0,0x00,\r
+    0x00,0x00,0x00,0xf8,0x80,0x80,0xf8,0x80,0x80,0x80,0xf8,0x00,\r
+    0x00,0x00,0x00,0x78,0x40,0x40,0x70,0x40,0x40,0x40,0x40,0x00,\r
+    0x00,0x00,0x00,0x38,0x44,0x84,0x80,0x9c,0x84,0x44,0x38,0x00,\r
+    0x00,0x00,0x00,0x88,0x88,0x88,0xf8,0x88,0x88,0x88,0x88,0x00,\r
+    0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,\r
+    0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x90,0x90,0x60,0x00,\r
+    0x00,0x00,0x00,0x88,0x90,0xa0,0xe0,0xa0,0x90,0x90,0x88,0x00,\r
+    0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xf0,0x00,\r
+    0x00,0x00,0x00,0x82,0xc6,0xc6,0xaa,0xaa,0xaa,0xaa,0x92,0x00,\r
+    0x00,0x00,0x00,0x84,0xc4,0xa4,0xa4,0x94,0x94,0x8c,0x84,0x00,\r
+    0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x84,0x48,0x30,0x00,\r
+    0x00,0x00,0x00,0xf0,0x88,0x88,0x88,0xf0,0x80,0x80,0x80,0x00,\r
+    0x00,0x00,0x00,0x30,0x48,0x84,0x84,0x84,0x84,0x58,0x34,0x04,\r
+    0x00,0x00,0x00,0x78,0x44,0x44,0x78,0x50,0x48,0x44,0x42,0x00,\r
+    0x00,0x00,0x00,0x70,0x88,0x80,0x70,0x08,0x88,0x88,0x70,0x00,\r
+    0x00,0x00,0x00,0xf8,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,\r
+    0x00,0x00,0x00,0x84,0x84,0x84,0x84,0x84,0x84,0x48,0x30,0x00,\r
+    0x00,0x00,0x00,0x88,0x88,0x50,0x50,0x50,0x50,0x50,0x20,0x00,\r
+    0x00,0x00,0x00,0x92,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x44,0x00,\r
+    0x00,0x00,0x00,0x84,0x48,0x48,0x30,0x30,0x48,0x48,0x84,0x00,\r
+    0x00,0x00,0x00,0x88,0x50,0x50,0x20,0x20,0x20,0x20,0x20,0x00,\r
+    0x00,0x00,0x00,0xf8,0x08,0x10,0x20,0x20,0x40,0x80,0xf8,0x00,\r
+    0x00,0x00,0x00,0xc0,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,\r
+    0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x40,0x40,0x20,0x20,0x00,\r
+    0x00,0x00,0x00,0xc0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,\r
+    0x00,0x00,0x00,0x40,0xa0,0xa0,0xa0,0x00,0x00,0x00,0x00,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,\r
+    0x00,0x00,0x00,0x80,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0xe0,0x10,0x70,0x90,0x90,0x70,0x00,\r
+    0x00,0x00,0x00,0x80,0x80,0xa0,0xd0,0x90,0x90,0xd0,0xa0,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x60,0x90,0x80,0x80,0x90,0x60,0x00,\r
+    0x00,0x00,0x00,0x10,0x10,0x50,0xb0,0x90,0x90,0xb0,0x50,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x60,0x90,0xf0,0x80,0x90,0x60,0x00,\r
+    0x00,0x00,0x00,0xc0,0x80,0xc0,0x80,0x80,0x80,0x80,0x80,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x50,0xb0,0x90,0x90,0xb0,0x50,0x10,\r
+    0x00,0x00,0x00,0x80,0x80,0xa0,0xd0,0x90,0x90,0x90,0x90,0x00,\r
+    0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x00,\r
+    0x00,0x00,0x00,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,\r
+    0x00,0x00,0x00,0x80,0x80,0x90,0xa0,0xc0,0xa0,0x90,0x90,0x00,\r
+    0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0xa6,0xda,0x92,0x92,0x92,0x92,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0xa0,0xd0,0x90,0x90,0x90,0x90,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x60,0x90,0x90,0x90,0x90,0x60,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0xa0,0xd0,0x90,0x90,0xd0,0xa0,0x80,\r
+    0x00,0x00,0x00,0x00,0x00,0x50,0xb0,0x90,0x90,0xb0,0x50,0x10,\r
+    0x00,0x00,0x00,0x00,0x00,0xa0,0xc0,0x80,0x80,0x80,0x80,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0xe0,0x90,0x40,0x20,0x90,0x60,0x00,\r
+    0x00,0x00,0x00,0x80,0x80,0xc0,0x80,0x80,0x80,0x80,0xc0,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x90,0x90,0x90,0x90,0xb0,0x50,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x88,0x88,0x50,0x50,0x50,0x20,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x92,0xaa,0xaa,0xaa,0xaa,0x44,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x20,0x20,0x50,0x88,0x00,\r
+    0x00,0x00,0x00,0x00,0x00,0x88,0x50,0x50,0x50,0x20,0x20,0x20,\r
+    0x00,0x00,0x00,0x00,0x00,0xf0,0x10,0x20,0x40,0x80,0xf0,0x00,\r
+    0x00,0x00,0x00,0xc0,0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x80,\r
+    0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,\r
+    0x00,0x00,0x00,0xc0,0x40,0x40,0x40,0x20,0x40,0x40,0x40,0x40,\r
+    0x00,0x00,0x00,0x00,0x00,0x00,0xe8,0xb0,0x00,0x00,0x00,0x00,\r
+    0x00,0x00,0x00,0x00,0xe0,0xa0,0xa0,0xa0,0xa0,0xa0,0xe0,0x00};\r
+\r
+const uint16_t ASCII8x8_Table [] = {\r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+    0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x40,\r
+    0xa0, 0xa0, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+    0x00, 0x24, 0x24, 0xfe, 0x48, 0xfc, 0x48, 0x48,\r
+    0x38, 0x54, 0x50, 0x38, 0x14, 0x14, 0x54, 0x38,\r
+    0x44, 0xa8, 0xa8, 0x50, 0x14, 0x1a, 0x2a, 0x24,\r
+    0x10, 0x28, 0x28, 0x10, 0x74, 0x4c, 0x4c, 0x30,\r
+    0x10, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+    0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08,\r
+    0x10, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10,\r
+    0x00, 0x00, 0x24, 0x18, 0x3c, 0x18, 0x24, 0x00,\r
+    0x00, 0x00, 0x10, 0x10, 0x7c, 0x10, 0x10, 0x00,\r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x10,\r
+    0x00, 0x00, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00,\r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18,\r
+    0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x20, 0x20,\r
+    0x18, 0x24, 0x24, 0x24, 0x24, 0x24, 0x24, 0x18,\r
+    0x08, 0x18, 0x28, 0x08, 0x08, 0x08, 0x08, 0x08,\r
+    0x38, 0x44, 0x00, 0x04, 0x08, 0x10, 0x20, 0x7c,\r
+    0x18, 0x24, 0x04, 0x18, 0x04, 0x04, 0x24, 0x18,\r
+    0x04, 0x0c, 0x14, 0x24, 0x44, 0x7e, 0x04, 0x04,\r
+    0x3c, 0x20, 0x20, 0x38, 0x04, 0x04, 0x24, 0x18,\r
+    0x18, 0x24, 0x20, 0x38, 0x24, 0x24, 0x24, 0x18,\r
+    0x3c, 0x04, 0x08, 0x08, 0x08, 0x10, 0x10, 0x10,\r
+    0x18, 0x24, 0x24, 0x18, 0x24, 0x24, 0x24, 0x18,\r
+    0x18, 0x24, 0x24, 0x24, 0x1c, 0x04, 0x24, 0x18,\r
+    0x00, 0x00, 0x10, 0x00, 0x00, 0x10, 0x00, 0x00,\r
+    0x00, 0x00, 0x08, 0x00, 0x00, 0x08, 0x10, 0x00,\r
+    0x00, 0x00, 0x04, 0x18, 0x20, 0x18, 0x04, 0x00,\r
+    0x00, 0x00, 0x00, 0x3c, 0x00, 0x3c, 0x00, 0x00,\r
+    0x00, 0x00, 0x20, 0x18, 0x04, 0x18, 0x20, 0x00,\r
+    0x18, 0x24, 0x04, 0x08, 0x10, 0x10, 0x00, 0x10,\r
+    0x3c, 0x42, 0x99, 0xa5, 0xa5, 0x9d, 0x42, 0x38,\r
+    0x38, 0x44, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x44,\r
+    0x78, 0x44, 0x44, 0x78, 0x44, 0x44, 0x44, 0x78,\r
+    0x1c, 0x22, 0x42, 0x40, 0x40, 0x42, 0x22, 0x1c,\r
+    0x70, 0x48, 0x44, 0x44, 0x44, 0x44, 0x48, 0x70,\r
+    0x7c, 0x40, 0x40, 0x7c, 0x40, 0x40, 0x40, 0x7c,\r
+    0x3c, 0x20, 0x20, 0x38, 0x20, 0x20, 0x20, 0x20,\r
+    0x1c, 0x22, 0x42, 0x40, 0x4e, 0x42, 0x22, 0x1c,\r
+    0x44, 0x44, 0x44, 0x7c, 0x44, 0x44, 0x44, 0x44,\r
+    0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\r
+    0x04, 0x04, 0x04, 0x04, 0x04, 0x24, 0x24, 0x18,\r
+    0x44, 0x48, 0x50, 0x70, 0x50, 0x48, 0x48, 0x44,\r
+    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3c,\r
+    0x82, 0xc6, 0xc6, 0xaa, 0xaa, 0xaa, 0xaa, 0x92,\r
+    0x42, 0x62, 0x52, 0x52, 0x4a, 0x4a, 0x46, 0x42,\r
+    0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18,\r
+    0x78, 0x44, 0x44, 0x44, 0x78, 0x40, 0x40, 0x40,\r
+    0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x2c, 0x1a,\r
+    0x78, 0x44, 0x44, 0x78, 0x50, 0x48, 0x44, 0x42,\r
+    0x38, 0x44, 0x40, 0x38, 0x04, 0x44, 0x44, 0x38,\r
+    0x7c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\r
+    0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18,\r
+    0x44, 0x44, 0x28, 0x28, 0x28, 0x28, 0x28, 0x10,\r
+    0x92, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0x44,\r
+    0x42, 0x24, 0x24, 0x18, 0x18, 0x24, 0x24, 0x42,\r
+    0x44, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10,\r
+    0x7c, 0x04, 0x08, 0x10, 0x10, 0x20, 0x40, 0x7c,\r
+    0x1c, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1c,\r
+    0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x04, 0x04,\r
+    0x1c, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x1c,\r
+    0x10, 0x28, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+    0x20, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+    0x00, 0x00, 0x18, 0x04, 0x1c, 0x24, 0x24, 0x1c,\r
+    0x20, 0x20, 0x28, 0x34, 0x24, 0x24, 0x34, 0x28,\r
+    0x00, 0x00, 0x18, 0x24, 0x20, 0x20, 0x24, 0x18,\r
+    0x04, 0x04, 0x14, 0x2c, 0x24, 0x24, 0x2c, 0x14,\r
+    0x00, 0x00, 0x18, 0x24, 0x3c, 0x20, 0x24, 0x18,\r
+    0x00, 0x18, 0x10, 0x10, 0x18, 0x10, 0x10, 0x10,\r
+    0x00, 0x18, 0x24, 0x24, 0x18, 0x04, 0x24, 0x18,\r
+    0x20, 0x20, 0x28, 0x34, 0x24, 0x24, 0x24, 0x24,\r
+    0x10, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\r
+    0x08, 0x00, 0x08, 0x08, 0x08, 0x08, 0x28, 0x10,\r
+    0x20, 0x20, 0x24, 0x28, 0x30, 0x28, 0x24, 0x24,\r
+    0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\r
+    0x00, 0x00, 0xa6, 0xda, 0x92, 0x92, 0x92, 0x92,\r
+    0x00, 0x00, 0x28, 0x34, 0x24, 0x24, 0x24, 0x24,\r
+    0x00, 0x00, 0x18, 0x24, 0x24, 0x24, 0x24, 0x18,\r
+    0x00, 0x28, 0x34, 0x24, 0x38, 0x20, 0x20, 0x20,\r
+    0x00, 0x14, 0x2c, 0x24, 0x1c, 0x04, 0x04, 0x04,\r
+    0x00, 0x00, 0x2c, 0x30, 0x20, 0x20, 0x20, 0x20,\r
+    0x00, 0x00, 0x18, 0x24, 0x10, 0x08, 0x24, 0x18,\r
+    0x00, 0x10, 0x38, 0x10, 0x10, 0x10, 0x10, 0x18,\r
+    0x00, 0x00, 0x24, 0x24, 0x24, 0x24, 0x2c, 0x14,\r
+    0x00, 0x00, 0x44, 0x44, 0x28, 0x28, 0x28, 0x10,\r
+    0x00, 0x00, 0x92, 0xaa, 0xaa, 0xaa, 0xaa, 0x44,\r
+    0x00, 0x00, 0x44, 0x28, 0x10, 0x10, 0x28, 0x44,\r
+    0x00, 0x28, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10,\r
+    0x00, 0x00, 0x3c, 0x04, 0x08, 0x10, 0x20, 0x3c,\r
+    0x00, 0x08, 0x10, 0x10, 0x20, 0x10, 0x10, 0x08,\r
+    0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,\r
+    0x00, 0x10, 0x08, 0x08, 0x04, 0x08, 0x08, 0x10,\r
+    0x00, 0x00, 0x00, 0x60, 0x92, 0x0c, 0x00, 0x00,\r
+    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\r
+\r
+\r
+sFONT Font16x24 = {\r
+  ASCII16x24_Table,\r
+  16, /* Width */\r
+  24, /* Height */\r
+};\r
+\r
+sFONT Font12x12 = {\r
+  ASCII12x12_Table,\r
+  12, /* Width */\r
+  12, /* Height */\r
+};\r
+\r
+sFONT Font8x12 = {\r
+  ASCII8x12_Table,\r
+  8, /* Width */\r
+  12, /* Height */\r
+};\r
+\r
+\r
+sFONT Font8x8 = {\r
+  ASCII8x8_Table,\r
+  8, /* Width */\r
+  8, /* Height */\r
+};\r
+   \r
+/**\r
+  * @}\r
+  */ \r
+\r
+\r
+/** @defgroup FONTS_Private_Function_Prototypes\r
+  * @{\r
+  */ \r
+/**\r
+  * @}\r
+  */ \r
+\r
+\r
+/** @defgroup FONTS_Private_Functions\r
+  * @{\r
+  */\r
+    \r
+/**\r
+  * @}\r
+  */\r
+  \r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */  \r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r
diff --git a/lib/fonts.h b/lib/fonts.h
new file mode 100755 (executable)
index 0000000..6d9f7d2
--- /dev/null
@@ -0,0 +1,124 @@
+/**\r
+  ******************************************************************************\r
+  * @file    fonts.h\r
+  * @author  MCD Application Team\r
+  * @version V5.0.2\r
+  * @date    05-March-2012\r
+  * @brief   Header for fonts.c file\r
+  ******************************************************************************\r
+  * @attention\r
+  *\r
+  * <h2><center>&copy; COPYRIGHT 2012 STMicroelectronics</center></h2>\r
+  *\r
+  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+  * You may not use this file except in compliance with the License.\r
+  * You may obtain a copy of the License at:\r
+  *\r
+  *        http://www.st.com/software_license_agreement_liberty_v2\r
+  *\r
+  * Unless required by applicable law or agreed to in writing, software \r
+  * distributed under the License is distributed on an "AS IS" BASIS, \r
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+  * See the License for the specific language governing permissions and\r
+  * limitations under the License.\r
+  *\r
+  ******************************************************************************\r
+  */\r
+\r
+/* Define to prevent recursive inclusion -------------------------------------*/\r
+#ifndef __FONTS_H\r
+#define __FONTS_H\r
+\r
+#ifdef __cplusplus\r
+ extern "C" {\r
+#endif\r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include <stdint.h>\r
+\r
+/** @addtogroup Utilities\r
+  * @{\r
+  */\r
+  \r
+/** @addtogroup STM32_EVAL\r
+  * @{\r
+  */ \r
+\r
+/** @addtogroup Common\r
+  * @{\r
+  */\r
+\r
+/** @addtogroup FONTS\r
+  * @{\r
+  */ \r
+\r
+/** @defgroup FONTS_Exported_Types\r
+  * @{\r
+  */ \r
+typedef struct _tFont\r
+{    \r
+  const uint16_t *table;\r
+  uint16_t Width;\r
+  uint16_t Height;\r
+  \r
+} sFONT;\r
+\r
+extern sFONT Font16x24;\r
+extern sFONT Font12x12;\r
+extern sFONT Font8x12;\r
+extern sFONT Font8x8;\r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/** @defgroup FONTS_Exported_Constants\r
+  * @{\r
+  */ \r
+#define LINE(x) ((x) * (((sFONT *)LCD_GetFont())->Height))\r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/** @defgroup FONTS_Exported_Macros\r
+  * @{\r
+  */ \r
+/**\r
+  * @}\r
+  */ \r
+\r
+/** @defgroup FONTS_Exported_Functions\r
+  * @{\r
+  */ \r
+/**\r
+  * @}\r
+  */\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+  \r
+#endif /* __FONTS_H */\r
\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */      \r
+\r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r
diff --git a/lib/stm32f429i_discovery.c b/lib/stm32f429i_discovery.c
new file mode 100755 (executable)
index 0000000..5429bbd
--- /dev/null
@@ -0,0 +1,428 @@
+/**\r
+  ******************************************************************************\r
+  * @file    stm32f429i_discovery.c\r
+  * @author  MCD Application Team\r
+  * @version V1.0.1\r
+  * @date    28-October-2013\r
+  * @brief   This file provides set of firmware functions to manage Leds and\r
+  *          push-button available on STM32F429I-DISCO Kit from STMicroelectronics.\r
+  ******************************************************************************\r
+  * @attention\r
+  *\r
+  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>\r
+  *\r
+  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+  * You may not use this file except in compliance with the License.\r
+  * You may obtain a copy of the License at:\r
+  *\r
+  *        http://www.st.com/software_license_agreement_liberty_v2\r
+  *\r
+  * Unless required by applicable law or agreed to in writing, software \r
+  * distributed under the License is distributed on an "AS IS" BASIS, \r
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+  * See the License for the specific language governing permissions and\r
+  * limitations under the License.\r
+  *\r
+  ******************************************************************************\r
+  */  \r
+  \r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32f429i_discovery.h"\r
+\r
+/** @addtogroup Utilities\r
+  * @{\r
+  */ \r
+\r
+/** @addtogroup STM32F4_DISCOVERY\r
+  * @{\r
+  */   \r
+\r
+/** @addtogroup STM32F429I_DISCOVERY\r
+  * @{\r
+  */\r
+      \r
+/** @defgroup STM32F429I-DISCOVERY_LOW_LEVEL \r
+  * @brief This file provides set of firmware functions to manage Leds and push-button\r
+  *        available on STM32F429I-Discovery Kit from STMicroelectronics.\r
+  * @{\r
+  */ \r
+\r
+/** @defgroup STM32F429I-DISCOVERY_LOW_LEVEL_Private_TypesDefinitions\r
+  * @{\r
+  */ \r
+/**\r
+  * @}\r
+  */ \r
+\r
+\r
+/** @defgroup STM32F429I-DISCOVERY_LOW_LEVEL_Private_Defines\r
+  * @{\r
+  */ \r
+/**\r
+  * @}\r
+  */ \r
+\r
+\r
+/** @defgroup STM32F429I-DISCOVERY_LOW_LEVEL_Private_Macros\r
+  * @{\r
+  */ \r
+/**\r
+  * @}\r
+  */ \r
+\r
+\r
+/** @defgroup STM32F429I-DISCOVERY_LOW_LEVEL_Private_Variables\r
+  * @{\r
+  */ \r
+GPIO_TypeDef* GPIO_PORT[LEDn] = {LED3_GPIO_PORT, LED4_GPIO_PORT};\r
+const uint16_t GPIO_PIN[LEDn] = {LED3_PIN, LED4_PIN};\r
+const uint32_t GPIO_CLK[LEDn] = {LED3_GPIO_CLK, LED4_GPIO_CLK};\r
+\r
+GPIO_TypeDef* BUTTON_PORT[BUTTONn] = {USER_BUTTON_GPIO_PORT}; \r
+\r
+const uint16_t BUTTON_PIN[BUTTONn] = {USER_BUTTON_PIN}; \r
+\r
+const uint32_t BUTTON_CLK[BUTTONn] = {USER_BUTTON_GPIO_CLK};\r
+\r
+const uint16_t BUTTON_EXTI_LINE[BUTTONn] = {USER_BUTTON_EXTI_LINE};\r
+\r
+const uint8_t BUTTON_PORT_SOURCE[BUTTONn] = {USER_BUTTON_EXTI_PORT_SOURCE};\r
+                                                                \r
+const uint8_t BUTTON_PIN_SOURCE[BUTTONn] = {USER_BUTTON_EXTI_PIN_SOURCE}; \r
+const uint8_t BUTTON_IRQn[BUTTONn] = {USER_BUTTON_EXTI_IRQn};\r
+\r
+DMA_InitTypeDef    sEEDMA_InitStructure; \r
+NVIC_InitTypeDef   NVIC_InitStructure;\r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+\r
+/** @defgroup STM32F429I-DISCOVERY_LOW_LEVEL_Private_FunctionPrototypes\r
+  * @{\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/** @defgroup STM32F429I-DISCOVERY_LOW_LEVEL_Private_Functions\r
+  * @{\r
+  */ \r
+\r
+/**\r
+  * @brief  Configures LED GPIO.\r
+  * @param  Led: Specifies the Led to be configured. \r
+  *   This parameter can be one of following parameters:\r
+  *     @arg LED3\r
+  *     @arg LED4\r
+  * @retval None\r
+  */\r
+void STM_EVAL_LEDInit(Led_TypeDef Led)\r
+{\r
+  GPIO_InitTypeDef  GPIO_InitStructure;\r
+  \r
+  /* Enable the GPIO_LED Clock */\r
+  RCC_AHB1PeriphClockCmd(GPIO_CLK[Led], ENABLE);\r
+\r
+  /* Configure the GPIO_LED pin */\r
+  GPIO_InitStructure.GPIO_Pin = GPIO_PIN[Led];\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+  GPIO_Init(GPIO_PORT[Led], &GPIO_InitStructure);\r
+}\r
+\r
+/**\r
+  * @brief  Turns selected LED On.\r
+  * @param  Led: Specifies the Led to be set on. \r
+  *   This parameter can be one of following parameters:\r
+  *     @arg LED3\r
+  *     @arg LED4 \r
+  * @retval None\r
+  */\r
+void STM_EVAL_LEDOn(Led_TypeDef Led)\r
+{\r
+  GPIO_PORT[Led]->BSRRL = GPIO_PIN[Led];\r
+}\r
+\r
+/**\r
+  * @brief  Turns selected LED Off.\r
+  * @param  Led: Specifies the Led to be set off. \r
+  *   This parameter can be one of following parameters:\r
+  *     @arg LED3\r
+  *     @arg LED4\r
+  * @retval None\r
+  */\r
+void STM_EVAL_LEDOff(Led_TypeDef Led)\r
+{\r
+  GPIO_PORT[Led]->BSRRH = GPIO_PIN[Led];  \r
+}\r
+\r
+/**\r
+  * @brief  Toggles the selected LED.\r
+  * @param  Led: Specifies the Led to be toggled. \r
+  *   This parameter can be one of following parameters:\r
+  *     @arg LED3\r
+  *     @arg LED4  \r
+  * @retval None\r
+  */\r
+void STM_EVAL_LEDToggle(Led_TypeDef Led)\r
+{\r
+  GPIO_PORT[Led]->ODR ^= GPIO_PIN[Led];\r
+}\r
+\r
+/**\r
+  * @brief  Configures Button GPIO and EXTI Line.\r
+  * @param  Button: Specifies the Button to be configured.\r
+  *   This parameter should be: BUTTON_USER\r
+  * @param  Button_Mode: Specifies Button mode.\r
+  *   This parameter can be one of following parameters:   \r
+  *     @arg BUTTON_MODE_GPIO: Button will be used as simple IO \r
+  *     @arg BUTTON_MODE_EXTI: Button will be connected to EXTI line with interrupt\r
+  *                            generation capability  \r
+  * @retval None\r
+  */\r
+void STM_EVAL_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode)\r
+{\r
+  GPIO_InitTypeDef GPIO_InitStructure;\r
+  EXTI_InitTypeDef EXTI_InitStructure;\r
+  NVIC_InitTypeDef NVIC_InitStructure;\r
+\r
+  /* Enable the BUTTON Clock */\r
+  RCC_AHB1PeriphClockCmd(BUTTON_CLK[Button], ENABLE);\r
+  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);\r
+\r
+  /* Configure Button pin as input */\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;\r
+  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;\r
+  GPIO_InitStructure.GPIO_Pin = BUTTON_PIN[Button];\r
+  GPIO_Init(BUTTON_PORT[Button], &GPIO_InitStructure);\r
+\r
+  if (Button_Mode == BUTTON_MODE_EXTI)\r
+  {\r
+    /* Connect Button EXTI Line to Button GPIO Pin */\r
+    SYSCFG_EXTILineConfig(BUTTON_PORT_SOURCE[Button], BUTTON_PIN_SOURCE[Button]);\r
+\r
+    /* Configure Button EXTI line */\r
+    EXTI_InitStructure.EXTI_Line = BUTTON_EXTI_LINE[Button];\r
+    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;\r
+    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  \r
+    EXTI_InitStructure.EXTI_LineCmd = ENABLE;\r
+    EXTI_Init(&EXTI_InitStructure);\r
+\r
+    /* Enable and set Button EXTI Interrupt to the lowest priority */\r
+    NVIC_InitStructure.NVIC_IRQChannel = BUTTON_IRQn[Button];\r
+    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x0F;\r
+    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x0F;\r
+    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;\r
+\r
+    NVIC_Init(&NVIC_InitStructure); \r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Returns the selected Button state.\r
+  * @param  Button: Specifies the Button to be checked.\r
+  *   This parameter should be: BUTTON_USER  \r
+  * @retval The Button GPIO pin value.\r
+  */\r
+uint32_t STM_EVAL_PBGetState(Button_TypeDef Button)\r
+{\r
+  return GPIO_ReadInputDataBit(BUTTON_PORT[Button], BUTTON_PIN[Button]);\r
+}\r
+\r
+/**\r
+  * @brief  DeInitializes peripherals used by the I2C EEPROM driver.\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+void sEE_LowLevel_DeInit(void)\r
+{\r
+  GPIO_InitTypeDef  GPIO_InitStructure; \r
+   \r
+  /* sEE_I2C Peripheral Disable */\r
+  I2C_Cmd(sEE_I2C, DISABLE);\r
\r
+  /* sEE_I2C DeInit */\r
+  I2C_DeInit(sEE_I2C);\r
+\r
+  /*!< sEE_I2C Periph clock disable */\r
+  RCC_APB1PeriphClockCmd(sEE_I2C_CLK, DISABLE);\r
+    \r
+  /*!< GPIO configuration */  \r
+  /*!< Configure sEE_I2C pins: SCL */\r
+  GPIO_InitStructure.GPIO_Pin = sEE_I2C_SCL_PIN;\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;\r
+  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+  GPIO_Init(sEE_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /*!< Configure sEE_I2C pins: SDA */\r
+  GPIO_InitStructure.GPIO_Pin = sEE_I2C_SDA_PIN;\r
+  GPIO_Init(sEE_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* Configure and enable I2C DMA TX Stream interrupt */\r
+  NVIC_InitStructure.NVIC_IRQChannel = sEE_I2C_DMA_TX_IRQn;\r
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = sEE_I2C_DMA_PREPRIO;\r
+  NVIC_InitStructure.NVIC_IRQChannelSubPriority = sEE_I2C_DMA_SUBPRIO;\r
+  NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;\r
+  NVIC_Init(&NVIC_InitStructure);\r
+\r
+  /* Configure and enable I2C DMA RX Stream interrupt */\r
+  NVIC_InitStructure.NVIC_IRQChannel = sEE_I2C_DMA_RX_IRQn;\r
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = sEE_I2C_DMA_PREPRIO;\r
+  NVIC_InitStructure.NVIC_IRQChannelSubPriority = sEE_I2C_DMA_SUBPRIO;\r
+  NVIC_Init(&NVIC_InitStructure);   \r
+  \r
+  /* Disable and Deinitialize the DMA Streams */\r
+  DMA_Cmd(sEE_I2C_DMA_STREAM_TX, DISABLE);\r
+  DMA_Cmd(sEE_I2C_DMA_STREAM_RX, DISABLE);\r
+  DMA_DeInit(sEE_I2C_DMA_STREAM_TX);\r
+  DMA_DeInit(sEE_I2C_DMA_STREAM_RX);\r
+}\r
+\r
+/**\r
+  * @brief  Initializes peripherals used by the I2C EEPROM driver.\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+void sEE_LowLevel_Init(void)\r
+{\r
+  GPIO_InitTypeDef  GPIO_InitStructure; \r
+   \r
+  /*!< sEE_I2C Periph clock enable */\r
+  RCC_APB1PeriphClockCmd(sEE_I2C_CLK, ENABLE);\r
+  \r
+  /*!< sEE_I2C_SCL_GPIO_CLK and sEE_I2C_SDA_GPIO_CLK Periph clock enable */\r
+  RCC_AHB1PeriphClockCmd(sEE_I2C_SCL_GPIO_CLK | sEE_I2C_SDA_GPIO_CLK, ENABLE);\r
+  \r
+  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);\r
+  \r
+  /* Reset sEE_I2C IP */\r
+  RCC_APB1PeriphResetCmd(sEE_I2C_CLK, ENABLE);  \r
+  /* Release reset signal of sEE_I2C IP */\r
+  RCC_APB1PeriphResetCmd(sEE_I2C_CLK, DISABLE);\r
+    \r
+  /*!< GPIO configuration */  \r
+  /*!< Configure sEE_I2C pins: SCL */   \r
+  GPIO_InitStructure.GPIO_Pin = sEE_I2C_SCL_PIN;\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;\r
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;\r
+  GPIO_Init(sEE_I2C_SCL_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /*!< Configure sEE_I2C pins: SDA */\r
+  GPIO_InitStructure.GPIO_Pin = sEE_I2C_SDA_PIN;\r
+  GPIO_Init(sEE_I2C_SDA_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* Connect PXx to I2C_SCL*/\r
+  GPIO_PinAFConfig(sEE_I2C_SCL_GPIO_PORT, sEE_I2C_SCL_SOURCE, sEE_I2C_SCL_AF);\r
+\r
+  /* Connect PXx to I2C_SDA*/\r
+  GPIO_PinAFConfig(sEE_I2C_SDA_GPIO_PORT, sEE_I2C_SDA_SOURCE, sEE_I2C_SDA_AF);  \r
+  \r
+  /* Configure and enable I2C DMA TX Channel interrupt */\r
+  NVIC_InitStructure.NVIC_IRQChannel = sEE_I2C_DMA_TX_IRQn;\r
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = sEE_I2C_DMA_PREPRIO;\r
+  NVIC_InitStructure.NVIC_IRQChannelSubPriority = sEE_I2C_DMA_SUBPRIO;\r
+  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;\r
+  NVIC_Init(&NVIC_InitStructure);\r
+\r
+  /* Configure and enable I2C DMA RX Channel interrupt */\r
+  NVIC_InitStructure.NVIC_IRQChannel = sEE_I2C_DMA_RX_IRQn;\r
+  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = sEE_I2C_DMA_PREPRIO;\r
+  NVIC_InitStructure.NVIC_IRQChannelSubPriority = sEE_I2C_DMA_SUBPRIO;\r
+  NVIC_Init(&NVIC_InitStructure);  \r
+  \r
+  /*!< I2C DMA TX and RX channels configuration */\r
+  /* Enable the DMA clock */\r
+  RCC_AHB1PeriphClockCmd(sEE_I2C_DMA_CLK, ENABLE);\r
+  \r
+  /* Clear any pending flag on Rx Stream  */\r
+  DMA_ClearFlag(sEE_I2C_DMA_STREAM_TX, sEE_TX_DMA_FLAG_FEIF | sEE_TX_DMA_FLAG_DMEIF | sEE_TX_DMA_FLAG_TEIF | \\r
+                                       sEE_TX_DMA_FLAG_HTIF | sEE_TX_DMA_FLAG_TCIF);\r
+  /* Disable the EE I2C Tx DMA stream */\r
+  DMA_Cmd(sEE_I2C_DMA_STREAM_TX, DISABLE);\r
+  /* Configure the DMA stream for the EE I2C peripheral TX direction */\r
+  DMA_DeInit(sEE_I2C_DMA_STREAM_TX);\r
+  sEEDMA_InitStructure.DMA_Channel = sEE_I2C_DMA_CHANNEL;\r
+  sEEDMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)sEE_I2C_DR_Address;\r
+  sEEDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)0;    /* This parameter will be configured durig communication */;\r
+  sEEDMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral; /* This parameter will be configured durig communication */\r
+  sEEDMA_InitStructure.DMA_BufferSize = 0xFFFF;              /* This parameter will be configured durig communication */\r
+  sEEDMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;\r
+  sEEDMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;\r
+  sEEDMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;\r
+  sEEDMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;\r
+  sEEDMA_InitStructure.DMA_Mode = DMA_Mode_Normal;\r
+  sEEDMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;\r
+  sEEDMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Enable;\r
+  sEEDMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;\r
+  sEEDMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;\r
+  sEEDMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;\r
+  DMA_Init(sEE_I2C_DMA_STREAM_TX, &sEEDMA_InitStructure);\r
+\r
+  /* Clear any pending flag on Rx Stream */\r
+  DMA_ClearFlag(sEE_I2C_DMA_STREAM_RX, sEE_RX_DMA_FLAG_FEIF | sEE_RX_DMA_FLAG_DMEIF | sEE_RX_DMA_FLAG_TEIF | \\r
+                                       sEE_RX_DMA_FLAG_HTIF | sEE_RX_DMA_FLAG_TCIF);\r
+  /* Disable the EE I2C DMA Rx stream */\r
+  DMA_Cmd(sEE_I2C_DMA_STREAM_RX, DISABLE);\r
+  /* Configure the DMA stream for the EE I2C peripheral RX direction */\r
+  DMA_DeInit(sEE_I2C_DMA_STREAM_RX);\r
+  DMA_Init(sEE_I2C_DMA_STREAM_RX, &sEEDMA_InitStructure);\r
+  \r
+  /* Enable the DMA Channels Interrupts */\r
+  DMA_ITConfig(sEE_I2C_DMA_STREAM_TX, DMA_IT_TC, ENABLE);\r
+  DMA_ITConfig(sEE_I2C_DMA_STREAM_RX, DMA_IT_TC, ENABLE);      \r
+}\r
+\r
+/**\r
+  * @brief  Initializes DMA channel used by the I2C EEPROM driver.\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+void sEE_LowLevel_DMAConfig(uint32_t pBuffer, uint32_t BufferSize, uint32_t Direction)\r
+{ \r
+  /* Initialize the DMA with the new parameters */\r
+  if (Direction == sEE_DIRECTION_TX)\r
+  {\r
+    /* Configure the DMA Tx Stream with the buffer address and the buffer size */\r
+    sEEDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)pBuffer;\r
+    sEEDMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;    \r
+    sEEDMA_InitStructure.DMA_BufferSize = (uint32_t)BufferSize;  \r
+    DMA_Init(sEE_I2C_DMA_STREAM_TX, &sEEDMA_InitStructure);  \r
+  }\r
+  else\r
+  { \r
+    /* Configure the DMA Rx Stream with the buffer address and the buffer size */\r
+    sEEDMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)pBuffer;\r
+    sEEDMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;\r
+    sEEDMA_InitStructure.DMA_BufferSize = (uint32_t)BufferSize;      \r
+    DMA_Init(sEE_I2C_DMA_STREAM_RX, &sEEDMA_InitStructure);    \r
+  }\r
+}\r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */   \r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+      \r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r
diff --git a/lib/stm32f429i_discovery.h b/lib/stm32f429i_discovery.h
new file mode 100755 (executable)
index 0000000..07de671
--- /dev/null
@@ -0,0 +1,233 @@
+/**\r
+  ******************************************************************************\r
+  * @file    stm32f429i_discovery.h\r
+  * @author  MCD Application Team\r
+  * @version V1.0.1\r
+  * @date    28-October-2013\r
+  * @brief   This file contains definitions for STM32F429I-DISCO Kit Leds, push-\r
+  *          buttons hardware resources.\r
+  ******************************************************************************\r
+  * @attention\r
+  *\r
+  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>\r
+  *\r
+  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+  * You may not use this file except in compliance with the License.\r
+  * You may obtain a copy of the License at:\r
+  *\r
+  *        http://www.st.com/software_license_agreement_liberty_v2\r
+  *\r
+  * Unless required by applicable law or agreed to in writing, software \r
+  * distributed under the License is distributed on an "AS IS" BASIS, \r
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+  * See the License for the specific language governing permissions and\r
+  * limitations under the License.\r
+  *\r
+  ******************************************************************************\r
+  */\r
+\r
+/* Define to prevent recursive inclusion -------------------------------------*/\r
+#ifndef __STM32F429I_DISCOVERY_H\r
+#define __STM32F429I_DISCOVERY_H\r
+\r
+#ifdef __cplusplus\r
+ extern "C" {\r
+#endif\r
+                                              \r
+/* Includes ------------------------------------------------------------------*/\r
+ #include "stm32f4xx.h"\r
+   \r
+/** @addtogroup Utilities\r
+  * @{\r
+  */\r
+  \r
+/** @addtogroup STM32F4_DISCOVERY\r
+  * @{\r
+  */\r
+   \r
+/** @addtogroup STM32F429I_DISCOVERY\r
+  * @{\r
+  */\r
+   \r
+/** @addtogroup STM32F429I_DISCOVERY_LOW_LEVEL\r
+  * @{\r
+  */ \r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LOW_LEVEL_Exported_Types\r
+  * @{\r
+  */\r
+typedef enum \r
+{\r
+  LED3 = 0,\r
+  LED4 = 1\r
+} Led_TypeDef;\r
+\r
+typedef enum \r
+{  \r
+  BUTTON_USER = 0,\r
+} Button_TypeDef;\r
+\r
+typedef enum \r
+{  \r
+  BUTTON_MODE_GPIO = 0,\r
+  BUTTON_MODE_EXTI = 1\r
+} ButtonMode_TypeDef;     \r
+/**\r
+  * @}\r
+  */ \r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LOW_LEVEL_Exported_Constants\r
+  * @{\r
+  */ \r
+\r
+/** \r
+  * @brief  Define for STM32F429I_DISCO board  \r
+  */ \r
+#if !defined (USE_STM32F429I_DISCO)\r
+ #define USE_STM32F429I_DISCO\r
+#endif\r
+\r
+\r
+/** @addtogroup STM32F429I_DISCOVERY_LOW_LEVEL_LED\r
+  * @{\r
+  */\r
+#define LEDn                             2\r
+  \r
+#define LED3_PIN                         GPIO_Pin_13\r
+#define LED3_GPIO_PORT                   GPIOG\r
+#define LED3_GPIO_CLK                    RCC_AHB1Periph_GPIOG  \r
+\r
+#define LED4_PIN                         GPIO_Pin_14\r
+#define LED4_GPIO_PORT                   GPIOG\r
+#define LED4_GPIO_CLK                    RCC_AHB1Periph_GPIOG  \r
+/**\r
+  * @}\r
+  */ \r
+  \r
+/** @addtogroup STM32F429I_DISCOVERY_LOW_LEVEL_BUTTON\r
+  * @{\r
+  */  \r
+#define BUTTONn                          1  \r
+\r
+/**\r
+ * @brief Wakeup push-button\r
+ */\r
+#define USER_BUTTON_PIN                GPIO_Pin_0\r
+#define USER_BUTTON_GPIO_PORT          GPIOA\r
+#define USER_BUTTON_GPIO_CLK           RCC_AHB1Periph_GPIOA\r
+#define USER_BUTTON_EXTI_LINE          EXTI_Line0\r
+#define USER_BUTTON_EXTI_PORT_SOURCE   EXTI_PortSourceGPIOA\r
+#define USER_BUTTON_EXTI_PIN_SOURCE    EXTI_PinSource0\r
+#define USER_BUTTON_EXTI_IRQn          EXTI0_IRQn \r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @addtogroup STM32F429I_DISCOVERY_LOW_LEVEL_I2C_EE\r
+  * @{\r
+  */\r
+/**\r
+  * @brief  I2C EEPROM Interface pins\r
+  */  \r
+#define sEE_I2C                          I2C3\r
+#define sEE_I2C_CLK                      RCC_APB1Periph_I2C3\r
+#define sEE_I2C_SCL_PIN                  GPIO_Pin_8                  /* PA.08 */\r
+#define sEE_I2C_SCL_GPIO_PORT            GPIOA                       /* GPIOA */\r
+#define sEE_I2C_SCL_GPIO_CLK             RCC_AHB1Periph_GPIOA\r
+#define sEE_I2C_SCL_SOURCE               GPIO_PinSource8\r
+#define sEE_I2C_SCL_AF                   GPIO_AF_I2C3\r
+#define sEE_I2C_SDA_PIN                  GPIO_Pin_9                  /* PC.09 */\r
+#define sEE_I2C_SDA_GPIO_PORT            GPIOC                       /* GPIOC */\r
+#define sEE_I2C_SDA_GPIO_CLK             RCC_AHB1Periph_GPIOC\r
+#define sEE_I2C_SDA_SOURCE               GPIO_PinSource9\r
+#define sEE_I2C_SDA_AF                   GPIO_AF_I2C3\r
+#define sEE_M24C64_32\r
+\r
+#define sEE_I2C_DMA                      DMA1   \r
+#define sEE_I2C_DMA_CHANNEL              DMA_Channel_3\r
+#define sEE_I2C_DMA_STREAM_TX            DMA1_Stream4\r
+#define sEE_I2C_DMA_STREAM_RX            DMA1_Stream2   \r
+#define sEE_I2C_DMA_CLK                  RCC_AHB1Periph_DMA1\r
+#define sEE_I2C_DR_Address               ((uint32_t)0x40005C10)\r
+#define sEE_USE_DMA\r
+   \r
+#define sEE_I2C_DMA_TX_IRQn              DMA1_Stream4_IRQn\r
+#define sEE_I2C_DMA_RX_IRQn              DMA1_Stream2_IRQn\r
+#define sEE_I2C_DMA_TX_IRQHandler        DMA1_Stream4_IRQHandler\r
+#define sEE_I2C_DMA_RX_IRQHandler        DMA1_Stream2_IRQHandler   \r
+#define sEE_I2C_DMA_PREPRIO              0\r
+#define sEE_I2C_DMA_SUBPRIO              0   \r
+   \r
+#define sEE_TX_DMA_FLAG_FEIF             DMA_FLAG_FEIF4\r
+#define sEE_TX_DMA_FLAG_DMEIF            DMA_FLAG_DMEIF4\r
+#define sEE_TX_DMA_FLAG_TEIF             DMA_FLAG_TEIF4\r
+#define sEE_TX_DMA_FLAG_HTIF             DMA_FLAG_HTIF4\r
+#define sEE_TX_DMA_FLAG_TCIF             DMA_FLAG_TCIF4\r
+#define sEE_RX_DMA_FLAG_FEIF             DMA_FLAG_FEIF2\r
+#define sEE_RX_DMA_FLAG_DMEIF            DMA_FLAG_DMEIF2\r
+#define sEE_RX_DMA_FLAG_TEIF             DMA_FLAG_TEIF2\r
+#define sEE_RX_DMA_FLAG_HTIF             DMA_FLAG_HTIF2\r
+#define sEE_RX_DMA_FLAG_TCIF             DMA_FLAG_TCIF2\r
+   \r
+#define sEE_DIRECTION_TX                 0\r
+#define sEE_DIRECTION_RX                 1  \r
+\r
+/* I2C clock speed configuration (in Hz), used by I2C EEPROM memory and IO Expander drivers */\r
+#ifndef I2C_SPEED\r
+ #define I2C_SPEED                        100000\r
+#endif /* I2C_SPEED */\r
+\r
+/**\r
+  * @}\r
+  */  \r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LOW_LEVEL_Exported_Macros\r
+  * @{\r
+  */  \r
+/**\r
+  * @}\r
+  */ \r
+\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LOW_LEVEL_Exported_Functions\r
+  * @{\r
+  */\r
+void STM_EVAL_LEDInit(Led_TypeDef Led);\r
+void STM_EVAL_LEDOn(Led_TypeDef Led);\r
+void STM_EVAL_LEDOff(Led_TypeDef Led);\r
+void STM_EVAL_LEDToggle(Led_TypeDef Led);\r
+void STM_EVAL_PBInit(Button_TypeDef Button, ButtonMode_TypeDef Button_Mode);\r
+uint32_t STM_EVAL_PBGetState(Button_TypeDef Button);\r
+void sEE_LowLevel_DeInit(void);\r
+void sEE_LowLevel_Init(void);\r
+void sEE_LowLevel_DMAConfig(uint32_t pBuffer, uint32_t BufferSize, uint32_t Direction);\r
+/**\r
+  * @}\r
+  */\r
+  \r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __STM32F429I_DISCOVERY_H */\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r
diff --git a/lib/stm32f429i_discovery_l3gd20.c b/lib/stm32f429i_discovery_l3gd20.c
new file mode 100755 (executable)
index 0000000..ac6cd9e
--- /dev/null
@@ -0,0 +1,499 @@
+/**\r
+  ******************************************************************************\r
+  * @file    stm32f429i_discovery_l3gd20.c\r
+  * @author  MCD Application Team\r
+  * @version V1.0.1\r
+  * @date    28-October-2013\r
+  * @brief   This file provides a set of functions needed to manage the l3gd20\r
+  *          MEMS three-axis digital output gyroscope available on STM32F429I-DISCO Kit.\r
+  ******************************************************************************\r
+  * @attention\r
+  *\r
+  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>\r
+  *\r
+  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+  * You may not use this file except in compliance with the License.\r
+  * You may obtain a copy of the License at:\r
+  *\r
+  *        http://www.st.com/software_license_agreement_liberty_v2\r
+  *\r
+  * Unless required by applicable law or agreed to in writing, software \r
+  * distributed under the License is distributed on an "AS IS" BASIS, \r
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+  * See the License for the specific language governing permissions and\r
+  * limitations under the License.\r
+  *\r
+  ******************************************************************************\r
+  */\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32f429i_discovery_l3gd20.h"\r
+/** @addtogroup Utilities\r
+  * @{\r
+  */ \r
+\r
+/** @addtogroup STM32F4_DISCOVERY\r
+  * @{\r
+  */ \r
+  \r
+/** @addtogroup STM32429I_DISCO\r
+  * @{\r
+  */  \r
+\r
+/** @addtogroup STM32F429I_DISCOVERY_L3GD20\r
+  * @{\r
+  */\r
+\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_L3GD20_Private_TypesDefinitions\r
+  * @{\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_L3GD20_Private_Defines\r
+  * @{\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_L3GD20_Private_Macros\r
+  * @{\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */ \r
+  \r
+/** @defgroup STM32F429I_DISCOVERY_L3GD20_Private_Variables\r
+  * @{\r
+  */ \r
+__IO uint32_t  L3GD20Timeout = L3GD20_FLAG_TIMEOUT;  \r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_L3GD20_Private_FunctionPrototypes\r
+  * @{\r
+  */\r
+static uint8_t L3GD20_SendByte(uint8_t byte);\r
+static void L3GD20_LowLevel_Init(void);\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_L3GD20_Private_Functions\r
+  * @{\r
+  */\r
+\r
+/**\r
+  * @brief  Set L3GD20 Initialization.\r
+  * @param  L3GD20_InitStruct: pointer to a L3GD20_InitTypeDef structure \r
+  *         that contains the configuration setting for the L3GD20.\r
+  * @retval None\r
+  */\r
+void L3GD20_Init(L3GD20_InitTypeDef *L3GD20_InitStruct)\r
+{  \r
+  uint8_t ctrl1 = 0x00, ctrl4 = 0x00;\r
+  \r
+  /* Configure the low level interface ---------------------------------------*/\r
+  L3GD20_LowLevel_Init();\r
+  \r
+  /* Configure MEMS: data rate, power mode, full scale and axes */\r
+  ctrl1 |= (uint8_t) (L3GD20_InitStruct->Power_Mode | L3GD20_InitStruct->Output_DataRate | \\r
+                    L3GD20_InitStruct->Axes_Enable | L3GD20_InitStruct->Band_Width);\r
+  \r
+  ctrl4 |= (uint8_t) (L3GD20_InitStruct->BlockData_Update | L3GD20_InitStruct->Endianness | \\r
+                    L3GD20_InitStruct->Full_Scale);\r
+                    \r
+  /* Write value to MEMS CTRL_REG1 regsister */\r
+  L3GD20_Write(&ctrl1, L3GD20_CTRL_REG1_ADDR, 1);\r
+  \r
+  /* Write value to MEMS CTRL_REG4 regsister */\r
+  L3GD20_Write(&ctrl4, L3GD20_CTRL_REG4_ADDR, 1);\r
+}\r
+\r
+/**\r
+  * @brief  Reboot memory content of L3GD20\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+void L3GD20_RebootCmd(void)\r
+{\r
+  uint8_t tmpreg;\r
+  \r
+  /* Read CTRL_REG5 register */\r
+  L3GD20_Read(&tmpreg, L3GD20_CTRL_REG5_ADDR, 1);\r
+  \r
+  /* Enable the reboot memory */\r
+  tmpreg |= L3GD20_BOOT_REBOOTMEMORY;\r
+  \r
+  /* Write value to MEMS CTRL_REG5 regsister */\r
+  L3GD20_Write(&tmpreg, L3GD20_CTRL_REG5_ADDR, 1);\r
+}\r
+\r
+/**\r
+  * @brief Set L3GD20 Interrupt configuration\r
+  * @param  L3GD20_InterruptConfig_TypeDef: pointer to a L3GD20_InterruptConfig_TypeDef \r
+  *         structure that contains the configuration setting for the L3GD20 Interrupt.\r
+  * @retval None\r
+  */\r
+void L3GD20_INT1InterruptConfig(L3GD20_InterruptConfigTypeDef *L3GD20_IntConfigStruct)\r
+{\r
+  uint8_t ctrl_cfr = 0x00, ctrl3 = 0x00;\r
+  \r
+  /* Read INT1_CFG register */\r
+  L3GD20_Read(&ctrl_cfr, L3GD20_INT1_CFG_ADDR, 1);\r
+  \r
+  /* Read CTRL_REG3 register */\r
+  L3GD20_Read(&ctrl3, L3GD20_CTRL_REG3_ADDR, 1);\r
+  \r
+  ctrl_cfr &= 0x80;\r
+  \r
+  ctrl3 &= 0xDF;\r
+  \r
+  /* Configure latch Interrupt request and axe interrupts */                   \r
+  ctrl_cfr |= (uint8_t)(L3GD20_IntConfigStruct->Latch_Request| \\r
+                   L3GD20_IntConfigStruct->Interrupt_Axes);\r
+                   \r
+  ctrl3 |= (uint8_t)(L3GD20_IntConfigStruct->Interrupt_ActiveEdge);\r
+  \r
+  /* Write value to MEMS INT1_CFG register */\r
+  L3GD20_Write(&ctrl_cfr, L3GD20_INT1_CFG_ADDR, 1);\r
+  \r
+  /* Write value to MEMS CTRL_REG3 register */\r
+  L3GD20_Write(&ctrl3, L3GD20_CTRL_REG3_ADDR, 1);\r
+}\r
+\r
+/**\r
+  * @brief  Enable or disable INT1 interrupt\r
+  * @param  InterruptState: State of INT1 Interrupt \r
+  *      This parameter can be: \r
+  *        @arg L3GD20_INT1INTERRUPT_DISABLE\r
+  *        @arg L3GD20_INT1INTERRUPT_ENABLE    \r
+  * @retval None\r
+  */\r
+void L3GD20_INT1InterruptCmd(uint8_t InterruptState)\r
+{  \r
+  uint8_t tmpreg;\r
+  \r
+  /* Read CTRL_REG3 register */\r
+  L3GD20_Read(&tmpreg, L3GD20_CTRL_REG3_ADDR, 1);\r
+                  \r
+  tmpreg &= 0x7F;      \r
+  tmpreg |= InterruptState;\r
+  \r
+  /* Write value to MEMS CTRL_REG3 regsister */\r
+  L3GD20_Write(&tmpreg, L3GD20_CTRL_REG3_ADDR, 1);\r
+}\r
+\r
+/**\r
+  * @brief  Enable or disable INT2 interrupt\r
+  * @param  InterruptState: State of INT1 Interrupt \r
+  *      This parameter can be: \r
+  *        @arg L3GD20_INT2INTERRUPT_DISABLE\r
+  *        @arg L3GD20_INT2INTERRUPT_ENABLE    \r
+  * @retval None\r
+  */\r
+void L3GD20_INT2InterruptCmd(uint8_t InterruptState)\r
+{  \r
+  uint8_t tmpreg;\r
+  \r
+  /* Read CTRL_REG3 register */\r
+  L3GD20_Read(&tmpreg, L3GD20_CTRL_REG3_ADDR, 1);\r
+                  \r
+  tmpreg &= 0xF7;      \r
+  tmpreg |= InterruptState;\r
+  \r
+  /* Write value to MEMS CTRL_REG3 regsister */\r
+  L3GD20_Write(&tmpreg, L3GD20_CTRL_REG3_ADDR, 1);\r
+}\r
+\r
+/**\r
+  * @brief  Set High Pass Filter Modality\r
+  * @param  L3GD20_FilterStruct: pointer to a L3GD20_FilterConfigTypeDef structure \r
+  *         that contains the configuration setting for the L3GD20.        \r
+  * @retval None\r
+  */\r
+void L3GD20_FilterConfig(L3GD20_FilterConfigTypeDef *L3GD20_FilterStruct) \r
+{\r
+  uint8_t tmpreg;\r
+  \r
+  /* Read CTRL_REG2 register */\r
+  L3GD20_Read(&tmpreg, L3GD20_CTRL_REG2_ADDR, 1);\r
+  \r
+  tmpreg &= 0xC0;\r
+  \r
+  /* Configure MEMS: mode and cutoff frquency */\r
+  tmpreg |= (uint8_t) (L3GD20_FilterStruct->HighPassFilter_Mode_Selection |\\r
+                      L3GD20_FilterStruct->HighPassFilter_CutOff_Frequency);                             \r
+\r
+  /* Write value to MEMS CTRL_REG2 regsister */\r
+  L3GD20_Write(&tmpreg, L3GD20_CTRL_REG2_ADDR, 1);\r
+}\r
+\r
+/**\r
+  * @brief  Enable or Disable High Pass Filter\r
+  * @param  HighPassFilterState: new state of the High Pass Filter feature.\r
+  *      This parameter can be: \r
+  *         @arg: L3GD20_HIGHPASSFILTER_DISABLE \r
+  *         @arg: L3GD20_HIGHPASSFILTER_ENABLE          \r
+  * @retval None\r
+  */\r
+void L3GD20_FilterCmd(uint8_t HighPassFilterState)\r
+ {\r
+  uint8_t tmpreg;\r
+  \r
+  /* Read CTRL_REG5 register */\r
+  L3GD20_Read(&tmpreg, L3GD20_CTRL_REG5_ADDR, 1);\r
+                  \r
+  tmpreg &= 0xEF;\r
+\r
+  tmpreg |= HighPassFilterState;\r
+\r
+  /* Write value to MEMS CTRL_REG5 regsister */\r
+  L3GD20_Write(&tmpreg, L3GD20_CTRL_REG5_ADDR, 1);\r
+}\r
+\r
+/**\r
+  * @brief  Get status for L3GD20 data\r
+  * @param  None         \r
+  * @retval L3GD20 status\r
+  */\r
+uint8_t L3GD20_GetDataStatus(void)\r
+{\r
+  uint8_t tmpreg;\r
+  \r
+  /* Read STATUS_REG register */\r
+  L3GD20_Read(&tmpreg, L3GD20_STATUS_REG_ADDR, 1);\r
+                  \r
+  return tmpreg;\r
+}\r
+\r
+/**\r
+  * @brief  Writes a block of data to the L3GD20.\r
+  * @param  pBuffer : pointer to the buffer containing the data to be written to the L3GD20.\r
+  * @param  WriteAddr : L3GD20's internal address to write to.\r
+  * @param  NumByteToWrite: Number of bytes to write.\r
+  * @retval None\r
+  */\r
+void L3GD20_Write(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite)\r
+{\r
+  /* Configure the MS bit: \r
+       - When 0, the address will remain unchanged in multiple read/write commands.\r
+       - When 1, the address will be auto incremented in multiple read/write commands.\r
+  */\r
+  if(NumByteToWrite > 0x01)\r
+  {\r
+    WriteAddr |= (uint8_t)MULTIPLEBYTE_CMD;\r
+  }\r
+  /* Set chip select Low at the start of the transmission */\r
+  L3GD20_CS_LOW();\r
+  \r
+  /* Send the Address of the indexed register */\r
+  L3GD20_SendByte(WriteAddr);\r
+\r
+  /* Send the data that will be written into the device (MSB First) */\r
+  while(NumByteToWrite >= 0x01)\r
+  {\r
+    L3GD20_SendByte(*pBuffer);\r
+    NumByteToWrite--;\r
+    pBuffer++;\r
+  }\r
+  \r
+  /* Set chip select High at the end of the transmission */ \r
+  L3GD20_CS_HIGH();\r
+}\r
+\r
+/**\r
+  * @brief  Reads a block of data from the L3GD20.\r
+  * @param  pBuffer : pointer to the buffer that receives the data read from the L3GD20.\r
+  * @param  ReadAddr : L3GD20's internal address to read from.\r
+  * @param  NumByteToRead : number of bytes to read from the L3GD20.\r
+  * @retval None\r
+  */\r
+void L3GD20_Read(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead)\r
+{  \r
+  if(NumByteToRead > 0x01)\r
+  {\r
+    ReadAddr |= (uint8_t)(READWRITE_CMD | MULTIPLEBYTE_CMD);\r
+  }\r
+  else\r
+  {\r
+    ReadAddr |= (uint8_t)READWRITE_CMD;\r
+  }\r
+  /* Set chip select Low at the start of the transmission */\r
+  L3GD20_CS_LOW();\r
+  \r
+  /* Send the Address of the indexed register */\r
+  L3GD20_SendByte(ReadAddr);\r
+  \r
+  /* Receive the data that will be read from the device (MSB First) */\r
+  while(NumByteToRead > 0x00)\r
+  {\r
+    /* Send dummy byte (0x00) to generate the SPI clock to L3GD20 (Slave device) */\r
+    *pBuffer = L3GD20_SendByte(DUMMY_BYTE);\r
+    NumByteToRead--;\r
+    pBuffer++;\r
+  }\r
+  \r
+  /* Set chip select High at the end of the transmission */ \r
+  L3GD20_CS_HIGH();\r
+}  \r
+\r
+/**\r
+  * @brief  Initializes the low level interface used to drive the L3GD20\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+static void L3GD20_LowLevel_Init(void)\r
+{\r
+  GPIO_InitTypeDef GPIO_InitStructure;\r
+  SPI_InitTypeDef  SPI_InitStructure;\r
+\r
+  /* Enable the SPI periph */\r
+  RCC_APB2PeriphClockCmd(L3GD20_SPI_CLK, ENABLE);\r
+\r
+  /* Enable SCK, MOSI and MISO GPIO clocks */\r
+  RCC_AHB1PeriphClockCmd(L3GD20_SPI_SCK_GPIO_CLK | L3GD20_SPI_MISO_GPIO_CLK | L3GD20_SPI_MOSI_GPIO_CLK, ENABLE);\r
+\r
+  /* Enable CS GPIO clock */\r
+  RCC_AHB1PeriphClockCmd(L3GD20_SPI_CS_GPIO_CLK, ENABLE);\r
+  \r
+  /* Enable INT1 GPIO clock */\r
+  RCC_AHB1PeriphClockCmd(L3GD20_SPI_INT1_GPIO_CLK, ENABLE);\r
+  \r
+  /* Enable INT2 GPIO clock */\r
+  RCC_AHB1PeriphClockCmd(L3GD20_SPI_INT2_GPIO_CLK, ENABLE);\r
+\r
+  GPIO_PinAFConfig(L3GD20_SPI_SCK_GPIO_PORT, L3GD20_SPI_SCK_SOURCE, L3GD20_SPI_SCK_AF);\r
+  GPIO_PinAFConfig(L3GD20_SPI_MISO_GPIO_PORT, L3GD20_SPI_MISO_SOURCE, L3GD20_SPI_MISO_AF);\r
+  GPIO_PinAFConfig(L3GD20_SPI_MOSI_GPIO_PORT, L3GD20_SPI_MOSI_SOURCE, L3GD20_SPI_MOSI_AF);\r
+\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_DOWN;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;\r
+\r
+  /* SPI SCK pin configuration */\r
+  GPIO_InitStructure.GPIO_Pin = L3GD20_SPI_SCK_PIN;\r
+  GPIO_Init(L3GD20_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* SPI  MOSI pin configuration */\r
+  GPIO_InitStructure.GPIO_Pin =  L3GD20_SPI_MOSI_PIN;\r
+  GPIO_Init(L3GD20_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* SPI MISO pin configuration */\r
+  GPIO_InitStructure.GPIO_Pin = L3GD20_SPI_MISO_PIN;\r
+  GPIO_Init(L3GD20_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* SPI configuration -------------------------------------------------------*/\r
+  SPI_I2S_DeInit(L3GD20_SPI);\r
+  SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;\r
+  SPI_InitStructure.SPI_Mode = SPI_Mode_Master;\r
+  SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;\r
+  SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;\r
+  SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;\r
+  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;\r
+  /* SPI baudrate is set to 5.6 MHz (PCLK2/SPI_BaudRatePrescaler = 90/16 = 5.625 MHz) \r
+     to verify these constraints:\r
+        - ILI9341 LCD SPI interface max baudrate is 10MHz for write and 6.66MHz for read\r
+        - l3gd20 SPI interface max baudrate is 10MHz for write/read\r
+        - PCLK2 frequency is set to 90 MHz \r
+    */\r
+  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;\r
+  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;\r
+  SPI_InitStructure.SPI_CRCPolynomial = 7;\r
+  SPI_Init(L3GD20_SPI, &SPI_InitStructure);\r
+\r
+  /* Enable L3GD20_SPI  */\r
+  SPI_Cmd(L3GD20_SPI, ENABLE);\r
+  \r
+  /* Configure GPIO PIN for Lis Chip select */\r
+  GPIO_InitStructure.GPIO_Pin = L3GD20_SPI_CS_PIN;\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;\r
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;\r
+  GPIO_Init(L3GD20_SPI_CS_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* Deselect : Chip Select high */\r
+  GPIO_SetBits(L3GD20_SPI_CS_GPIO_PORT, L3GD20_SPI_CS_PIN);\r
+  \r
+  /* Configure GPIO PINs to detect Interrupts */\r
+  GPIO_InitStructure.GPIO_Pin = L3GD20_SPI_INT1_PIN;\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;\r
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;\r
+  GPIO_Init(L3GD20_SPI_INT1_GPIO_PORT, &GPIO_InitStructure);\r
+  \r
+  GPIO_InitStructure.GPIO_Pin = L3GD20_SPI_INT2_PIN;\r
+  GPIO_Init(L3GD20_SPI_INT2_GPIO_PORT, &GPIO_InitStructure);\r
+}  \r
+\r
+/**\r
+  * @brief  Sends a Byte through the SPI interface and return the Byte received \r
+  *         from the SPI bus.\r
+  * @param  Byte : Byte send.\r
+  * @retval The received byte value\r
+  */\r
+static uint8_t L3GD20_SendByte(uint8_t byte)\r
+{\r
+  /* Loop while DR register in not empty */\r
+  L3GD20Timeout = L3GD20_FLAG_TIMEOUT;\r
+  while (SPI_I2S_GetFlagStatus(L3GD20_SPI, SPI_I2S_FLAG_TXE) == RESET)\r
+  {\r
+    if((L3GD20Timeout--) == 0) return L3GD20_TIMEOUT_UserCallback();\r
+  }\r
+  \r
+  /* Send a Byte through the SPI peripheral */\r
+  SPI_I2S_SendData(L3GD20_SPI, (uint16_t)byte);\r
+  /* Wait to receive a Byte */\r
+  L3GD20Timeout = L3GD20_FLAG_TIMEOUT;\r
+  while (SPI_I2S_GetFlagStatus(L3GD20_SPI, SPI_I2S_FLAG_RXNE) == RESET)\r
+  {\r
+    if((L3GD20Timeout--) == 0) return L3GD20_TIMEOUT_UserCallback();\r
+  }\r
+  \r
+  /* Return the Byte read from the SPI bus */\r
+  return (uint8_t)SPI_I2S_ReceiveData(L3GD20_SPI);\r
+}\r
+\r
+#ifdef USE_DEFAULT_TIMEOUT_CALLBACK\r
+/**\r
+  * @brief  Basic management of the timeout situation.\r
+  * @param  None.\r
+  * @retval None.\r
+  */\r
+uint32_t L3GD20_TIMEOUT_UserCallback(void)\r
+{\r
+  /* Block communication and all processes */\r
+  while (1)\r
+  {   \r
+  }\r
+}\r
+#endif /* USE_DEFAULT_TIMEOUT_CALLBACK */\r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+  \r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+  \r
+ /**\r
+  * @}\r
+  */  \r
+  \r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/     \r
diff --git a/lib/stm32f429i_discovery_l3gd20.h b/lib/stm32f429i_discovery_l3gd20.h
new file mode 100755 (executable)
index 0000000..bbcaccb
--- /dev/null
@@ -0,0 +1,414 @@
+/**\r
+  ******************************************************************************\r
+  * @file    stm32f429i_discovery_l3gd20.h\r
+  * @author  MCD Application Team\r
+  * @version V1.0.1\r
+  * @date    28-October-2013\r
+  * @brief   This file contains definitions for stm32f429i_discovery_l3gd20.c \r
+  *          firmware driver.\r
+  ******************************************************************************\r
+  * @attention\r
+  *\r
+  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>\r
+  *\r
+  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+  * You may not use this file except in compliance with the License.\r
+  * You may obtain a copy of the License at:\r
+  *\r
+  *        http://www.st.com/software_license_agreement_liberty_v2\r
+  *\r
+  * Unless required by applicable law or agreed to in writing, software \r
+  * distributed under the License is distributed on an "AS IS" BASIS, \r
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+  * See the License for the specific language governing permissions and\r
+  * limitations under the License.\r
+  *\r
+  ******************************************************************************\r
+  */\r
+  \r
+\r
+/* Define to prevent recursive inclusion -------------------------------------*/\r
+#ifndef __STM32F429I_DISCOVERY_L3GD20_H\r
+#define __STM32F429I_DISCOVERY_L3GD20_H\r
+\r
+#ifdef __cplusplus\r
+ extern "C" {\r
+#endif\r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32f4xx.h"\r
+#include "stm32f4xx_spi.h"\r
+#include "stm32f4xx_rcc.h"\r
+\r
+/** @addtogroup Utilities\r
+   * @{\r
+   */\r
+   \r
+/** @addtogroup STM32F4_DISCOVERY\r
+  * @{\r
+  */ \r
+\r
+/** @addtogroup STM32F429I_DISCOVERY\r
+  * @{\r
+  */\r
+  \r
+/** @addtogroup STM32F429I_DISCOVERY_L3GD20\r
+  * @{\r
+  */\r
+  \r
+/** @defgroup STM32F429I_DISCOVERY_L3GD20_Exported_Types\r
+  * @{\r
+  */\r
+\r
+/* L3GD20 struct */\r
+typedef struct\r
+{\r
+  uint8_t Power_Mode;                         /* Power-down/Sleep/Normal Mode */\r
+  uint8_t Output_DataRate;                    /* OUT data rate */\r
+  uint8_t Axes_Enable;                        /* Axes enable */\r
+  uint8_t Band_Width;                         /* Bandwidth selection */\r
+  uint8_t BlockData_Update;                   /* Block Data Update */\r
+  uint8_t Endianness;                         /* Endian Data selection */\r
+  uint8_t Full_Scale;                         /* Full Scale selection */\r
+}L3GD20_InitTypeDef;\r
+\r
+/* L3GD20 High Pass Filter struct */\r
+typedef struct\r
+{\r
+  uint8_t HighPassFilter_Mode_Selection;      /* Internal filter mode */\r
+  uint8_t HighPassFilter_CutOff_Frequency;    /* High pass filter cut-off frequency */\r
+}L3GD20_FilterConfigTypeDef;\r
+\r
+/* L3GD20 Interrupt struct */\r
+typedef struct\r
+{\r
+  uint8_t Latch_Request;                      /* Latch interrupt request into CLICK_SRC register */\r
+  uint8_t Interrupt_Axes;                     /* X, Y, Z Axes Interrupts */ \r
+  uint8_t Interrupt_ActiveEdge;               /*  Interrupt Active edge */\r
+}L3GD20_InterruptConfigTypeDef;  \r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+\r
+/**\r
+  * @}\r
+  */\r
+  \r
+/** @defgroup STM32F429I-DISCO_L3GD20_Exported_Constants\r
+  * @{\r
+  */\r
+\r
+/* Read/Write command */\r
+#define READWRITE_CMD              ((uint8_t)0x80) \r
+/* Multiple byte read/write command */ \r
+#define MULTIPLEBYTE_CMD           ((uint8_t)0x40)\r
+/* Dummy Byte Send by the SPI Master device in order to generate the Clock to the Slave device */\r
+#define DUMMY_BYTE                 ((uint8_t)0x00)\r
+\r
+/* Uncomment the following line to use the default L3GD20_TIMEOUT_UserCallback() \r
+   function implemented in stm32f429i_discovery_lgd20.c file.\r
+   L3GD20_TIMEOUT_UserCallback() function is called whenever a timeout condition \r
+   occure during communication (waiting transmit data register empty flag(TXE)\r
+   or waiting receive data register is not empty flag (RXNE)). */   \r
+/* #define USE_DEFAULT_TIMEOUT_CALLBACK */\r
+\r
+/* Maximum Timeout values for flags waiting loops. These timeouts are not based\r
+   on accurate values, they just guarantee that the application will not remain\r
+   stuck if the SPI communication is corrupted.\r
+   You may modify these timeout values depending on CPU frequency and application\r
+   conditions (interrupts routines ...). */   \r
+#define L3GD20_FLAG_TIMEOUT             ((uint32_t)0x1000)\r
+\r
+/**\r
+  * @brief  L3GD20 SPI Interface pins\r
+  */\r
+#define L3GD20_SPI                       SPI5\r
+#define L3GD20_SPI_CLK                   RCC_APB2Periph_SPI5\r
+\r
+#define L3GD20_SPI_SCK_PIN               GPIO_Pin_7                  /* PF.07 */\r
+#define L3GD20_SPI_SCK_GPIO_PORT         GPIOF                       /* GPIOF */\r
+#define L3GD20_SPI_SCK_GPIO_CLK          RCC_AHB1Periph_GPIOF\r
+#define L3GD20_SPI_SCK_SOURCE            GPIO_PinSource7\r
+#define L3GD20_SPI_SCK_AF                GPIO_AF_SPI5\r
+\r
+#define L3GD20_SPI_MISO_PIN              GPIO_Pin_8                  /* PF.08 */\r
+#define L3GD20_SPI_MISO_GPIO_PORT        GPIOF                       /* GPIOF */\r
+#define L3GD20_SPI_MISO_GPIO_CLK         RCC_AHB1Periph_GPIOF\r
+#define L3GD20_SPI_MISO_SOURCE           GPIO_PinSource8\r
+#define L3GD20_SPI_MISO_AF               GPIO_AF_SPI5\r
+\r
+#define L3GD20_SPI_MOSI_PIN              GPIO_Pin_9                  /* PF.09 */\r
+#define L3GD20_SPI_MOSI_GPIO_PORT        GPIOF                       /* GPIOF */\r
+#define L3GD20_SPI_MOSI_GPIO_CLK         RCC_AHB1Periph_GPIOF\r
+#define L3GD20_SPI_MOSI_SOURCE           GPIO_PinSource9\r
+#define L3GD20_SPI_MOSI_AF               GPIO_AF_SPI5\r
+\r
+#define L3GD20_SPI_CS_PIN                GPIO_Pin_1                  /* PC.01 */\r
+#define L3GD20_SPI_CS_GPIO_PORT          GPIOC                       /* GPIOC */\r
+#define L3GD20_SPI_CS_GPIO_CLK           RCC_AHB1Periph_GPIOC\r
+\r
+#define L3GD20_SPI_INT1_PIN              GPIO_Pin_1                  /* PA.01 */\r
+#define L3GD20_SPI_INT1_GPIO_PORT        GPIOA                       /* GPIOA */\r
+#define L3GD20_SPI_INT1_GPIO_CLK         RCC_AHB1Periph_GPIOA\r
+#define L3GD20_SPI_INT1_EXTI_LINE        EXTI_Line1\r
+#define L3GD20_SPI_INT1_EXTI_PORT_SOURCE EXTI_PortSourceGPIOA\r
+#define L3GD20_SPI_INT1_EXTI_PIN_SOURCE  EXTI_PinSource1\r
+#define L3GD20_SPI_INT1_EXTI_IRQn        EXTI1_IRQn \r
+\r
+#define L3GD20_SPI_INT2_PIN              GPIO_Pin_2                  /* PA.02 */\r
+#define L3GD20_SPI_INT2_GPIO_PORT        GPIOA                       /* GPIOA */\r
+#define L3GD20_SPI_INT2_GPIO_CLK         RCC_AHB1Periph_GPIOA\r
+#define L3GD20_SPI_INT2_EXTI_LINE        EXTI_Line2\r
+#define L3GD20_SPI_INT2_EXTI_PORT_SOURCE EXTI_PortSourceGPIOA\r
+#define L3GD20_SPI_INT2_EXTI_PIN_SOURCE  EXTI_PinSource2\r
+#define L3GD20_SPI_INT2_EXTI_IRQn        EXTI2_IRQn \r
+\r
+/******************************************************************************/\r
+/*************************** START REGISTER MAPPING  **************************/\r
+/******************************************************************************/\r
+#define L3GD20_WHO_AM_I_ADDR          0x0F  /* device identification register */\r
+#define L3GD20_CTRL_REG1_ADDR         0x20  /* Control register 1 */\r
+#define L3GD20_CTRL_REG2_ADDR         0x21  /* Control register 2 */\r
+#define L3GD20_CTRL_REG3_ADDR         0x22  /* Control register 3 */\r
+#define L3GD20_CTRL_REG4_ADDR         0x23  /* Control register 4 */\r
+#define L3GD20_CTRL_REG5_ADDR         0x24  /* Control register 5 */\r
+#define L3GD20_REFERENCE_REG_ADDR     0x25  /* Reference register */\r
+#define L3GD20_OUT_TEMP_ADDR          0x26  /* Out temp register */\r
+#define L3GD20_STATUS_REG_ADDR        0x27  /* Status register */\r
+#define L3GD20_OUT_X_L_ADDR           0x28  /* Output Register X */\r
+#define L3GD20_OUT_X_H_ADDR           0x29  /* Output Register X */\r
+#define L3GD20_OUT_Y_L_ADDR           0x2A  /* Output Register Y */\r
+#define L3GD20_OUT_Y_H_ADDR           0x2B  /* Output Register Y */\r
+#define L3GD20_OUT_Z_L_ADDR           0x2C  /* Output Register Z */\r
+#define L3GD20_OUT_Z_H_ADDR           0x2D  /* Output Register Z */ \r
+#define L3GD20_FIFO_CTRL_REG_ADDR     0x2E  /* Fifo control Register */\r
+#define L3GD20_FIFO_SRC_REG_ADDR      0x2F  /* Fifo src Register */\r
+\r
+#define L3GD20_INT1_CFG_ADDR          0x30  /* Interrupt 1 configuration Register */\r
+#define L3GD20_INT1_SRC_ADDR          0x31  /* Interrupt 1 source Register */\r
+#define L3GD20_INT1_TSH_XH_ADDR       0x32  /* Interrupt 1 Threshold X register */\r
+#define L3GD20_INT1_TSH_XL_ADDR       0x33  /* Interrupt 1 Threshold X register */\r
+#define L3GD20_INT1_TSH_YH_ADDR       0x34  /* Interrupt 1 Threshold Y register */\r
+#define L3GD20_INT1_TSH_YL_ADDR       0x35  /* Interrupt 1 Threshold Y register */\r
+#define L3GD20_INT1_TSH_ZH_ADDR       0x36  /* Interrupt 1 Threshold Z register */\r
+#define L3GD20_INT1_TSH_ZL_ADDR       0x37  /* Interrupt 1 Threshold Z register */\r
+#define L3GD20_INT1_DURATION_ADDR     0x38  /* Interrupt 1 DURATION register */\r
+\r
+/******************************************************************************/\r
+/**************************** END REGISTER MAPPING  ***************************/\r
+/******************************************************************************/\r
+\r
+#define I_AM_L3GD20                ((uint8_t)0xD4)\r
+\r
+/** @defgroup Power_Mode_selection \r
+  * @{\r
+  */\r
+#define L3GD20_MODE_POWERDOWN       ((uint8_t)0x00)\r
+#define L3GD20_MODE_ACTIVE          ((uint8_t)0x08)\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup OutPut_DataRate_Selection \r
+  * @{\r
+  */\r
+#define L3GD20_OUTPUT_DATARATE_1    ((uint8_t)0x00)\r
+#define L3GD20_OUTPUT_DATARATE_2    ((uint8_t)0x40)\r
+#define L3GD20_OUTPUT_DATARATE_3    ((uint8_t)0x80)\r
+#define L3GD20_OUTPUT_DATARATE_4    ((uint8_t)0xC0)\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup Axes_Selection \r
+  * @{\r
+  */\r
+#define L3GD20_X_ENABLE            ((uint8_t)0x02)\r
+#define L3GD20_Y_ENABLE            ((uint8_t)0x01)\r
+#define L3GD20_Z_ENABLE            ((uint8_t)0x04)\r
+#define L3GD20_AXES_ENABLE         ((uint8_t)0x07)\r
+#define L3GD20_AXES_DISABLE        ((uint8_t)0x00)\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup BandWidth_Selection \r
+  * @{\r
+  */\r
+#define L3GD20_BANDWIDTH_1         ((uint8_t)0x00)\r
+#define L3GD20_BANDWIDTH_2         ((uint8_t)0x10)\r
+#define L3GD20_BANDWIDTH_3         ((uint8_t)0x20)\r
+#define L3GD20_BANDWIDTH_4         ((uint8_t)0x30)\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup Full_Scale_Selection \r
+  * @{\r
+  */\r
+#define L3GD20_FULLSCALE_250               ((uint8_t)0x00)\r
+#define L3GD20_FULLSCALE_500               ((uint8_t)0x10)\r
+#define L3GD20_FULLSCALE_2000              ((uint8_t)0x20) \r
+/**\r
+  * @}\r
+  */\r
+  \r
+/** @defgroup Block_Data_Update \r
+  * @{\r
+  */  \r
+#define L3GD20_BlockDataUpdate_Continous   ((uint8_t)0x00)\r
+#define L3GD20_BlockDataUpdate_Single      ((uint8_t)0x80)\r
+/**\r
+  * @}\r
+  */\r
+  \r
+/** @defgroup Endian_Data_selection\r
+  * @{\r
+  */  \r
+#define L3GD20_BLE_LSB                     ((uint8_t)0x00)\r
+#define L3GD20_BLE_MSB                    ((uint8_t)0x40)\r
+/**\r
+  * @}\r
+  */\r
+  \r
+/** @defgroup High_Pass_Filter_status \r
+  * @{\r
+  */   \r
+#define L3GD20_HIGHPASSFILTER_DISABLE      ((uint8_t)0x00)\r
+#define L3GD20_HIGHPASSFILTER_ENABLE        ((uint8_t)0x10)\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup INT1_Interrupt_status \r
+  * @{\r
+  */   \r
+#define L3GD20_INT1INTERRUPT_DISABLE       ((uint8_t)0x00)\r
+#define L3GD20_INT1INTERRUPT_ENABLE        ((uint8_t)0x80)\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup INT2_Interrupt_status \r
+  * @{\r
+  */   \r
+#define L3GD20_INT2INTERRUPT_DISABLE       ((uint8_t)0x00)\r
+#define L3GD20_INT2INTERRUPT_ENABLE        ((uint8_t)0x08)\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup INT1_Interrupt_ActiveEdge \r
+  * @{\r
+  */   \r
+#define L3GD20_INT1INTERRUPT_LOW_EDGE      ((uint8_t)0x20)\r
+#define L3GD20_INT1INTERRUPT_HIGH_EDGE     ((uint8_t)0x00)\r
+/**\r
+  * @}\r
+  */\r
+  \r
+/** @defgroup Boot_Mode_selection \r
+  * @{\r
+  */\r
+#define L3GD20_BOOT_NORMALMODE             ((uint8_t)0x00)\r
+#define L3GD20_BOOT_REBOOTMEMORY           ((uint8_t)0x80)\r
+/**\r
+  * @}\r
+  */  \r
\r
+/** @defgroup High_Pass_Filter_Mode \r
+  * @{\r
+  */   \r
+#define L3GD20_HPM_NORMAL_MODE_RES         ((uint8_t)0x00)\r
+#define L3GD20_HPM_REF_SIGNAL              ((uint8_t)0x10)\r
+#define L3GD20_HPM_NORMAL_MODE             ((uint8_t)0x20)\r
+#define L3GD20_HPM_AUTORESET_INT           ((uint8_t)0x30)\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup High_Pass_CUT OFF_Frequency \r
+  * @{\r
+  */   \r
+#define L3GD20_HPFCF_0              0x00\r
+#define L3GD20_HPFCF_1              0x01\r
+#define L3GD20_HPFCF_2              0x02\r
+#define L3GD20_HPFCF_3              0x03\r
+#define L3GD20_HPFCF_4              0x04\r
+#define L3GD20_HPFCF_5              0x05\r
+#define L3GD20_HPFCF_6              0x06\r
+#define L3GD20_HPFCF_7              0x07\r
+#define L3GD20_HPFCF_8              0x08\r
+#define L3GD20_HPFCF_9              0x09\r
+/**\r
+  * @}\r
+  */\r
+\r
+\r
+/** @defgroup STM32F429I-DISCO_L3GD20_Exported_Macros\r
+  * @{\r
+  */\r
+#define L3GD20_CS_LOW()       GPIO_ResetBits(L3GD20_SPI_CS_GPIO_PORT, L3GD20_SPI_CS_PIN)\r
+#define L3GD20_CS_HIGH()      GPIO_SetBits(L3GD20_SPI_CS_GPIO_PORT, L3GD20_SPI_CS_PIN)\r
+/**\r
+  * @}\r
+  */\r
\r
+/** @defgroup STM32F429I-DISCO_L3GD20_Exported_Functions\r
+  * @{\r
+  */\r
+/* Sensor Configuration Functions */ \r
+void L3GD20_Init(L3GD20_InitTypeDef *L3GD20_InitStruct);\r
+void L3GD20_RebootCmd(void);\r
+\r
+/*INT1 Interrupt Configuration Functions */\r
+void L3GD20_INT1InterruptCmd(uint8_t InterruptState);\r
+void L3GD20_INT2InterruptCmd(uint8_t InterruptState);\r
+void L3GD20_INT1InterruptConfig(L3GD20_InterruptConfigTypeDef *L3GD20_IntConfigStruct);\r
+uint8_t L3GD20_GetDataStatus(void);\r
+\r
+/* High Pass Filter Configuration Functions */\r
+void L3GD20_FilterConfig(L3GD20_FilterConfigTypeDef *L3GD20_FilterStruct);\r
+void L3GD20_FilterCmd(uint8_t HighPassFilterState);\r
+void L3GD20_Write(uint8_t* pBuffer, uint8_t WriteAddr, uint16_t NumByteToWrite);\r
+void L3GD20_Read(uint8_t* pBuffer, uint8_t ReadAddr, uint16_t NumByteToRead);\r
+\r
+/* USER Callbacks: This is function for which prototype only is declared in\r
+   MEMS accelerometre driver and that should be implemented into user applicaiton. */  \r
+/* L3GD20_TIMEOUT_UserCallback() function is called whenever a timeout condition \r
+   occure during communication (waiting transmit data register empty flag(TXE)\r
+   or waiting receive data register is not empty flag (RXNE)).\r
+   You can use the default timeout callback implementation by uncommenting the \r
+   define USE_DEFAULT_TIMEOUT_CALLBACK in stm32f429i_discovery_l3gd20.h file.\r
+   Typically the user implementation of this callback should reset MEMS peripheral\r
+   and re-initialize communication or in worst case reset all the application. */\r
+uint32_t L3GD20_TIMEOUT_UserCallback(void);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __STM32F429I_DISCOVERY_L3GD20_H */\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ \r
diff --git a/lib/stm32f429i_discovery_lcd.c b/lib/stm32f429i_discovery_lcd.c
new file mode 100755 (executable)
index 0000000..e96a12e
--- /dev/null
@@ -0,0 +1,1968 @@
+/**\r
+  ******************************************************************************\r
+  * @file    stm32f429i_discovery_lcd.c\r
+  * @author  MCD Application Team\r
+  * @version V1.0.1\r
+  * @date    28-October-2013\r
+  * @brief   This file includes the LCD driver for ILI9341 Liquid Crystal\r
+  *          Display Modules of STM32F429I-DISCO kit (MB1075).\r
+  ******************************************************************************\r
+  * @attention\r
+  *\r
+  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>\r
+  *\r
+  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+  * You may not use this file except in compliance with the License.\r
+  * You may obtain a copy of the License at:\r
+  *\r
+  *        http://www.st.com/software_license_agreement_liberty_v2\r
+  *\r
+  * Unless required by applicable law or agreed to in writing, software\r
+  * distributed under the License is distributed on an "AS IS" BASIS,\r
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+  * See the License for the specific language governing permissions and\r
+  * limitations under the License.\r
+  *\r
+  ******************************************************************************\r
+  */\r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32f429i_discovery_lcd.h"\r
+#include "stm32f4xx_ltdc.h"\r
+#include "stm32f4xx_dma2d.h"\r
+//#include "fonts.c"\r
+\r
+\r
+/** @addtogroup Utilities\r
+  * @{\r
+  */\r
+\r
+/** @addtogroup STM32F4_DISCOVERY\r
+  * @{\r
+  */\r
+\r
+/** @addtogroup STM32F429I_DISCOVERY\r
+  * @{\r
+  */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD\r
+  * @brief This file includes the LCD driver for (ILI9341)\r
+  * @{\r
+  */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Private_TypesDefinitions\r
+  * @{\r
+  */\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Private_Defines\r
+  * @{\r
+  */\r
+\r
+#define POLY_Y(Z)          ((int32_t)((Points + Z)->X))\r
+#define POLY_X(Z)          ((int32_t)((Points + Z)->Y))\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Private_Macros\r
+  * @{\r
+  */\r
+#define ABS(X)  ((X) > 0 ? (X) : -(X))\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Private_Variables\r
+  * @{\r
+  */\r
+static sFONT *LCD_Currentfonts;\r
+/* Global variables to set the written text color */\r
+static uint16_t CurrentTextColor   = 0x0000;\r
+static uint16_t CurrentBackColor   = 0xFFFF;\r
+/* Default LCD configuration with LCD Layer 1 */\r
+static uint32_t CurrentFrameBuffer = LCD_FRAME_BUFFER;\r
+static uint32_t CurrentLayer = LCD_BACKGROUND_LAYER;\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Private_FunctionPrototypes\r
+  * @{\r
+  */\r
+#ifndef USE_Delay\r
+static void delay(__IO uint32_t nCount);\r
+#endif /* USE_Delay*/\r
+\r
+static void PutPixel(int16_t x, int16_t y);\r
+static void LCD_PolyLineRelativeClosed(pPoint Points, uint16_t PointCount, uint16_t Closed);\r
+static void LCD_AF_GPIOConfig(void);\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Private_Functions\r
+  * @{\r
+  */\r
+\r
+/**\r
+  * @brief  DeInitializes the LCD.\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+void LCD_DeInit(void)\r
+{\r
+  GPIO_InitTypeDef GPIO_InitStructure;\r
+\r
+  /* LCD Display Off */\r
+  LCD_DisplayOff();\r
+\r
+  /* LCD_SPI disable */\r
+  SPI_Cmd(LCD_SPI, DISABLE);\r
+\r
+  /* LCD_SPI DeInit */\r
+  SPI_I2S_DeInit(LCD_SPI);\r
+\r
+  /* Disable SPI clock  */\r
+  RCC_APB2PeriphClockCmd(LCD_SPI_CLK, DISABLE);\r
+\r
+  /* Configure NCS in Output Push-Pull mode */\r
+  GPIO_InitStructure.GPIO_Pin = LCD_NCS_PIN;\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;\r
+  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+  GPIO_Init(LCD_NCS_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* Configure SPI pins: SCK, MISO and MOSI */\r
+  GPIO_InitStructure.GPIO_Pin = LCD_SPI_SCK_PIN;\r
+  GPIO_Init(LCD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  GPIO_InitStructure.GPIO_Pin = LCD_SPI_MISO_PIN;\r
+  GPIO_Init(LCD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  GPIO_InitStructure.GPIO_Pin = LCD_SPI_MOSI_PIN;\r
+  GPIO_Init(LCD_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* GPIOA configuration */\r
+  GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_MCO);\r
+  GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_MCO);\r
+  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_MCO);\r
+  GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_MCO);\r
+  GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_MCO);\r
+\r
+  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_6 |\r
+                                GPIO_Pin_11 | GPIO_Pin_12;\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;\r
+  GPIO_Init(GPIOA, &GPIO_InitStructure);\r
+\r
+  /* GPIOB configuration */\r
+  GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, GPIO_AF_MCO);\r
+  GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, GPIO_AF_MCO);\r
+  GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_MCO);\r
+  GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_MCO);\r
+  GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_MCO);\r
+  GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_MCO);\r
+\r
+  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_8    |\r
+                                GPIO_Pin_9  |  GPIO_Pin_10 | GPIO_Pin_11;\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;\r
+  GPIO_Init(GPIOB, &GPIO_InitStructure);\r
+\r
+  /* GPIOC configuration */\r
+  GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_MCO);\r
+  GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_MCO);\r
+  GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_MCO);\r
+\r
+  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6  | GPIO_Pin_7  | GPIO_Pin_10;\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;\r
+  GPIO_Init(GPIOC, &GPIO_InitStructure);\r
+\r
+  /* GPIOD configuration */\r
+  GPIO_PinAFConfig(GPIOD, GPIO_PinSource3, GPIO_AF_MCO);\r
+  GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_MCO);\r
+\r
+  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3  | GPIO_Pin_6;\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;\r
+  GPIO_Init(GPIOD, &GPIO_InitStructure);\r
+\r
+  /* GPIOF configuration */\r
+  GPIO_PinAFConfig(GPIOF, GPIO_PinSource10, GPIO_AF_MCO);\r
+\r
+  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;\r
+  GPIO_Init(GPIOF, &GPIO_InitStructure);\r
+\r
+  /* GPIOG configuration */\r
+  GPIO_PinAFConfig(GPIOG, GPIO_PinSource6, GPIO_AF_MCO);\r
+  GPIO_PinAFConfig(GPIOG, GPIO_PinSource7, GPIO_AF_MCO);\r
+  GPIO_PinAFConfig(GPIOG, GPIO_PinSource10, GPIO_AF_MCO);\r
+  GPIO_PinAFConfig(GPIOG, GPIO_PinSource11, GPIO_AF_MCO);\r
+  GPIO_PinAFConfig(GPIOG, GPIO_PinSource12, GPIO_AF_MCO);\r
+\r
+  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6  | GPIO_Pin_7  | GPIO_Pin_10    |\r
+                                GPIO_Pin_11 | GPIO_Pin_12;\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;\r
+  GPIO_Init(GPIOG, &GPIO_InitStructure);\r
+}\r
+\r
+/**\r
+  * @brief  Initializes the LCD.\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+void LCD_Init(void)\r
+{\r
+  LTDC_InitTypeDef       LTDC_InitStruct;\r
+\r
+  /* Configure the LCD Control pins ------------------------------------------*/\r
+  LCD_CtrlLinesConfig();\r
+  LCD_ChipSelect(DISABLE);\r
+  LCD_ChipSelect(ENABLE);\r
+\r
+  /* Configure the LCD_SPI interface -----------------------------------------*/\r
+  LCD_SPIConfig();\r
+\r
+  /* Power on the LCD --------------------------------------------------------*/\r
+  LCD_PowerOn();\r
+\r
+  /* Enable the LTDC Clock */\r
+  RCC_APB2PeriphClockCmd(RCC_APB2Periph_LTDC, ENABLE);\r
+\r
+  /* Enable the DMA2D Clock */\r
+  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2D, ENABLE);\r
+\r
+  /* Configure the LCD Control pins */\r
+  LCD_AF_GPIOConfig();\r
+\r
+  /* Configure the FMC Parallel interface : SDRAM is used as Frame Buffer for LCD */\r
+  SDRAM_Init();\r
+\r
+  /* LTDC Configuration *********************************************************/\r
+  /* Polarity configuration */\r
+  /* Initialize the horizontal synchronization polarity as active low */\r
+  LTDC_InitStruct.LTDC_HSPolarity = LTDC_HSPolarity_AL;\r
+  /* Initialize the vertical synchronization polarity as active low */\r
+  LTDC_InitStruct.LTDC_VSPolarity = LTDC_VSPolarity_AL;\r
+  /* Initialize the data enable polarity as active low */\r
+  LTDC_InitStruct.LTDC_DEPolarity = LTDC_DEPolarity_AL;\r
+  /* Initialize the pixel clock polarity as input pixel clock */\r
+  LTDC_InitStruct.LTDC_PCPolarity = LTDC_PCPolarity_IPC;\r
+\r
+  /* Configure R,G,B component values for LCD background color */\r
+  LTDC_InitStruct.LTDC_BackgroundRedValue = 0;\r
+  LTDC_InitStruct.LTDC_BackgroundGreenValue = 0;\r
+  LTDC_InitStruct.LTDC_BackgroundBlueValue = 0;\r
+\r
+  /* Configure PLLSAI prescalers for LCD */\r
+  /* Enable Pixel Clock */\r
+  /* PLLSAI_VCO Input = HSE_VALUE/PLL_M = 1 Mhz */\r
+  /* PLLSAI_VCO Output = PLLSAI_VCO Input * PLLSAI_N = 192 Mhz */\r
+  /* PLLLCDCLK = PLLSAI_VCO Output/PLLSAI_R = 192/4 = 48 Mhz */\r
+  /* LTDC clock frequency = PLLLCDCLK / RCC_PLLSAIDivR = 48/8 = 6 Mhz */\r
+  RCC_PLLSAIConfig(192, 7, 4);\r
+  RCC_LTDCCLKDivConfig(RCC_PLLSAIDivR_Div8);\r
+\r
+  /* Enable PLLSAI Clock */\r
+  RCC_PLLSAICmd(ENABLE);\r
+  /* Wait for PLLSAI activation */\r
+  while(RCC_GetFlagStatus(RCC_FLAG_PLLSAIRDY) == RESET)\r
+  {\r
+  }\r
+\r
+  /* Timing configuration */\r
+  /* Configure horizontal synchronization width */\r
+  LTDC_InitStruct.LTDC_HorizontalSync = 9;\r
+  /* Configure vertical synchronization height */\r
+  LTDC_InitStruct.LTDC_VerticalSync = 1;\r
+  /* Configure accumulated horizontal back porch */\r
+  LTDC_InitStruct.LTDC_AccumulatedHBP = 29;\r
+  /* Configure accumulated vertical back porch */\r
+  LTDC_InitStruct.LTDC_AccumulatedVBP = 3;\r
+  /* Configure accumulated active width */\r
+  LTDC_InitStruct.LTDC_AccumulatedActiveW = 269;\r
+  /* Configure accumulated active height */\r
+  LTDC_InitStruct.LTDC_AccumulatedActiveH = 323;\r
+  /* Configure total width */\r
+  LTDC_InitStruct.LTDC_TotalWidth = 279;\r
+  /* Configure total height */\r
+  LTDC_InitStruct.LTDC_TotalHeigh = 327;\r
+\r
+  LTDC_Init(&LTDC_InitStruct);\r
+}\r
+\r
+/**\r
+  * @brief  Initializes the LCD Layers.\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+void LCD_LayerInit(void)\r
+{\r
+  LTDC_Layer_InitTypeDef LTDC_Layer_InitStruct;\r
+\r
+  /* Windowing configuration */\r
+  /* In this case all the active display area is used to display a picture then :\r
+  Horizontal start = horizontal synchronization + Horizontal back porch = 30\r
+  Horizontal stop = Horizontal start + window width -1 = 30 + 240 -1\r
+  Vertical start   = vertical synchronization + vertical back porch     = 4\r
+  Vertical stop   = Vertical start + window height -1  = 4 + 320 -1      */\r
+  LTDC_Layer_InitStruct.LTDC_HorizontalStart = 30;\r
+  LTDC_Layer_InitStruct.LTDC_HorizontalStop = (LCD_PIXEL_WIDTH + 30 - 1);\r
+  LTDC_Layer_InitStruct.LTDC_VerticalStart = 4;\r
+  LTDC_Layer_InitStruct.LTDC_VerticalStop = (LCD_PIXEL_HEIGHT + 4 - 1);\r
+\r
+  /* Pixel Format configuration*/\r
+  LTDC_Layer_InitStruct.LTDC_PixelFormat = LTDC_Pixelformat_RGB565;\r
+  /* Alpha constant (255 totally opaque) */\r
+  LTDC_Layer_InitStruct.LTDC_ConstantAlpha = 255;\r
+  /* Default Color configuration (configure A,R,G,B component values) */\r
+  LTDC_Layer_InitStruct.LTDC_DefaultColorBlue = 0;\r
+  LTDC_Layer_InitStruct.LTDC_DefaultColorGreen = 0;\r
+  LTDC_Layer_InitStruct.LTDC_DefaultColorRed = 0;\r
+  LTDC_Layer_InitStruct.LTDC_DefaultColorAlpha = 0;\r
+  /* Configure blending factors */\r
+  LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_CA;\r
+  LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_CA;\r
+\r
+  /* the length of one line of pixels in bytes + 3 then :\r
+  Line Lenth = Active high width x number of bytes per pixel + 3\r
+  Active high width         = LCD_PIXEL_WIDTH\r
+  number of bytes per pixel = 2    (pixel_format : RGB565)\r
+  */\r
+  LTDC_Layer_InitStruct.LTDC_CFBLineLength = ((LCD_PIXEL_WIDTH * 2) + 3);\r
+  /* the pitch is the increment from the start of one line of pixels to the\r
+  start of the next line in bytes, then :\r
+  Pitch = Active high width x number of bytes per pixel */\r
+  LTDC_Layer_InitStruct.LTDC_CFBPitch = (LCD_PIXEL_WIDTH * 2);\r
+\r
+  /* Configure the number of lines */\r
+  LTDC_Layer_InitStruct.LTDC_CFBLineNumber = LCD_PIXEL_HEIGHT;\r
+\r
+  /* Start Address configuration : the LCD Frame buffer is defined on SDRAM */\r
+  LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FRAME_BUFFER;\r
+\r
+  /* Initialize LTDC layer 1 */\r
+  LTDC_LayerInit(LTDC_Layer1, &LTDC_Layer_InitStruct);\r
+\r
+  /* Configure Layer2 */\r
+  /* Start Address configuration : the LCD Frame buffer is defined on SDRAM w/ Offset */\r
+  LTDC_Layer_InitStruct.LTDC_CFBStartAdress = LCD_FRAME_BUFFER + BUFFER_OFFSET;\r
+\r
+  /* Configure blending factors */\r
+  LTDC_Layer_InitStruct.LTDC_BlendingFactor_1 = LTDC_BlendingFactor1_PAxCA;\r
+  LTDC_Layer_InitStruct.LTDC_BlendingFactor_2 = LTDC_BlendingFactor2_PAxCA;\r
+\r
+  /* Initialize LTDC layer 2 */\r
+  LTDC_LayerInit(LTDC_Layer2, &LTDC_Layer_InitStruct);\r
+\r
+  /* LTDC configuration reload */\r
+  LTDC_ReloadConfig(LTDC_IMReload);\r
+\r
+  /* Enable foreground & background Layers */\r
+  LTDC_LayerCmd(LTDC_Layer1, ENABLE);\r
+  LTDC_LayerCmd(LTDC_Layer2, ENABLE);\r
+\r
+  /* LTDC configuration reload */\r
+  LTDC_ReloadConfig(LTDC_IMReload);\r
+\r
+  /* Set default font */\r
+  LCD_SetFont(&LCD_DEFAULT_FONT);\r
+\r
+  /* dithering activation */\r
+  LTDC_DitherCmd(ENABLE);\r
+}\r
+\r
+/**\r
+  * @brief  Controls LCD Chip Select (CS) pin\r
+  * @param  NewState CS pin state\r
+  * @retval None\r
+  */\r
+void LCD_ChipSelect(FunctionalState NewState)\r
+{\r
+  if (NewState == DISABLE)\r
+  {\r
+    GPIO_ResetBits(LCD_NCS_GPIO_PORT, LCD_NCS_PIN); /* CS pin low: LCD disabled */\r
+  }\r
+  else\r
+  {\r
+    GPIO_SetBits(LCD_NCS_GPIO_PORT, LCD_NCS_PIN); /* CS pin high: LCD enabled */\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Sets the LCD Layer.\r
+  * @param  Layerx: specifies the Layer foreground or background.\r
+  * @retval None\r
+  */\r
+void LCD_SetLayer(uint32_t Layerx)\r
+{\r
+  if (Layerx == LCD_BACKGROUND_LAYER)\r
+  {\r
+    CurrentFrameBuffer = LCD_FRAME_BUFFER;\r
+    CurrentLayer = LCD_BACKGROUND_LAYER;\r
+  }\r
+  else\r
+  {\r
+    CurrentFrameBuffer = LCD_FRAME_BUFFER + BUFFER_OFFSET;\r
+    CurrentLayer = LCD_FOREGROUND_LAYER;\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Sets the LCD Text and Background colors.\r
+  * @param  TextColor: specifies the Text Color.\r
+  * @param  BackColor: specifies the Background Color.\r
+  * @retval None\r
+  */\r
+void LCD_SetColors(uint16_t TextColor, uint16_t BackColor)\r
+{\r
+  CurrentTextColor = TextColor;\r
+  CurrentBackColor = BackColor;\r
+}\r
+\r
+/**\r
+  * @brief  Gets the LCD Text and Background colors.\r
+  * @param  TextColor: pointer to the variable that will contain the Text\r
+            Color.\r
+  * @param  BackColor: pointer to the variable that will contain the Background\r
+            Color.\r
+  * @retval None\r
+  */\r
+void LCD_GetColors(uint16_t *TextColor, uint16_t *BackColor)\r
+{\r
+  *TextColor = CurrentTextColor;\r
+  *BackColor = CurrentBackColor;\r
+}\r
+\r
+/**\r
+  * @brief  Sets the Text color.\r
+  * @param  Color: specifies the Text color code RGB(5-6-5).\r
+  * @retval None\r
+  */\r
+void LCD_SetTextColor(uint16_t Color)\r
+{\r
+  CurrentTextColor = Color;\r
+}\r
+\r
+/**\r
+  * @brief  Sets the Background color.\r
+  * @param  Color: specifies the Background color code RGB(5-6-5).\r
+  * @retval None\r
+  */\r
+void LCD_SetBackColor(uint16_t Color)\r
+{\r
+  CurrentBackColor = Color;\r
+}\r
+\r
+/**\r
+  * @brief  Sets the Text Font.\r
+  * @param  fonts: specifies the font to be used.\r
+  * @retval None\r
+  */\r
+void LCD_SetFont(sFONT *fonts)\r
+{\r
+  LCD_Currentfonts = fonts;\r
+}\r
+\r
+/**\r
+  * @brief  Configure the transparency.\r
+  * @param  transparency: specifies the transparency,\r
+  *         This parameter must range from 0x00 to 0xFF.\r
+  * @retval None\r
+  */\r
+void LCD_SetTransparency(uint8_t transparency)\r
+{\r
+  if (CurrentLayer == LCD_BACKGROUND_LAYER)\r
+  {\r
+    LTDC_LayerAlpha(LTDC_Layer1, transparency);\r
+  }\r
+  else\r
+  {\r
+    LTDC_LayerAlpha(LTDC_Layer2, transparency);\r
+  }\r
+  LTDC_ReloadConfig(LTDC_IMReload);\r
+}\r
+\r
+/**\r
+  * @brief  Gets the Text Font.\r
+  * @param  None.\r
+  * @retval the used font.\r
+  */\r
+sFONT *LCD_GetFont(void)\r
+{\r
+  return LCD_Currentfonts;\r
+}\r
+\r
+/**\r
+  * @brief  Clears the selected line.\r
+  * @param  Line: the Line to be cleared.\r
+  *   This parameter can be one of the following values:\r
+  *     @arg LCD_LINE_x: where x can be: 0..13 if LCD_Currentfonts is Font16x24\r
+  *                                      0..26 if LCD_Currentfonts is Font12x12 or Font8x12\r
+  *                                      0..39 if LCD_Currentfonts is Font8x8\r
+  * @retval None\r
+  */\r
+void LCD_ClearLine(uint16_t Line)\r
+{\r
+  uint16_t refcolumn = 0;\r
+  /* Send the string character by character on lCD */\r
+  while ((refcolumn < LCD_PIXEL_WIDTH) && (((refcolumn + LCD_Currentfonts->Width)& 0xFFFF) >= LCD_Currentfonts->Width))\r
+  {\r
+    /* Display one character on LCD */\r
+    LCD_DisplayChar(Line, refcolumn, ' ');\r
+    /* Decrement the column position by 16 */\r
+    refcolumn += LCD_Currentfonts->Width;\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Clears the hole LCD.\r
+  * @param  Color: the color of the background.\r
+  * @retval None\r
+  */\r
+void LCD_Clear(uint16_t Color)\r
+{\r
+  uint32_t index = 0;\r
+\r
+  /* erase memory */\r
+  for (index = 0x00; index < BUFFER_OFFSET; index++)\r
+  {\r
+    *(__IO uint16_t*)(CurrentFrameBuffer + (2*index)) = Color;\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Sets the cursor position.\r
+  * @param  Xpos: specifies the X position.\r
+  * @param  Ypos: specifies the Y position.\r
+  * @retval Display Address\r
+  */\r
+uint32_t LCD_SetCursor(uint16_t Xpos, uint16_t Ypos)\r
+{\r
+  return CurrentFrameBuffer + 2*(Xpos + (LCD_PIXEL_WIDTH*Ypos));\r
+}\r
+\r
+/**\r
+  * @brief  Config and Sets the color Keying.\r
+  * @param  RGBValue: Specifies the Color reference.\r
+  * @retval None\r
+  */\r
+void LCD_SetColorKeying(uint32_t RGBValue)\r
+{\r
+  LTDC_ColorKeying_InitTypeDef   LTDC_colorkeying_InitStruct;\r
+\r
+  /* configure the color Keying */\r
+  LTDC_colorkeying_InitStruct.LTDC_ColorKeyBlue = 0x0000FF & RGBValue;\r
+  LTDC_colorkeying_InitStruct.LTDC_ColorKeyGreen = (0x00FF00 & RGBValue) >> 8;\r
+  LTDC_colorkeying_InitStruct.LTDC_ColorKeyRed = (0xFF0000 & RGBValue) >> 16;\r
+\r
+  if (CurrentLayer == LCD_BACKGROUND_LAYER)\r
+  {\r
+    /* Enable the color Keying for Layer1 */\r
+    LTDC_ColorKeyingConfig(LTDC_Layer1, &LTDC_colorkeying_InitStruct, ENABLE);\r
+    LTDC_ReloadConfig(LTDC_IMReload);\r
+  }\r
+  else\r
+  {\r
+    /* Enable the color Keying for Layer2 */\r
+    LTDC_ColorKeyingConfig(LTDC_Layer2, &LTDC_colorkeying_InitStruct, ENABLE);\r
+    LTDC_ReloadConfig(LTDC_IMReload);\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Disable the color Keying.\r
+  * @param  RGBValue: Specifies the Color reference.\r
+  * @retval None\r
+  */\r
+void LCD_ReSetColorKeying(void)\r
+{\r
+  LTDC_ColorKeying_InitTypeDef   LTDC_colorkeying_InitStruct;\r
+\r
+  if (CurrentLayer == LCD_BACKGROUND_LAYER)\r
+  {\r
+    /* Disable the color Keying for Layer1 */\r
+    LTDC_ColorKeyingConfig(LTDC_Layer1, &LTDC_colorkeying_InitStruct, DISABLE);\r
+    LTDC_ReloadConfig(LTDC_IMReload);\r
+  }\r
+  else\r
+  {\r
+    /* Disable the color Keying for Layer2 */\r
+    LTDC_ColorKeyingConfig(LTDC_Layer2, &LTDC_colorkeying_InitStruct, DISABLE);\r
+    LTDC_ReloadConfig(LTDC_IMReload);\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Draws a character on LCD.\r
+  * @param  Xpos: the Line where to display the character shape.\r
+  * @param  Ypos: start column address.\r
+  * @param  c: pointer to the character data.\r
+  * @retval None\r
+  */\r
+void LCD_DrawChar(uint16_t Xpos, uint16_t Ypos, const uint16_t *c)\r
+{\r
+  uint32_t index = 0, counter = 0, xpos =0;\r
+  uint32_t  Xaddress = 0;\r
+\r
+  xpos = Xpos*LCD_PIXEL_WIDTH*2;\r
+  Xaddress += Ypos;\r
+\r
+  for(index = 0; index < LCD_Currentfonts->Height; index++)\r
+  {\r
+\r
+    for(counter = 0; counter < LCD_Currentfonts->Width; counter++)\r
+    {\r
+\r
+      if((((c[index] & ((0x80 << ((LCD_Currentfonts->Width / 12 ) * 8 ) ) >> counter)) == 0x00) &&(LCD_Currentfonts->Width <= 12))||\r
+        (((c[index] & (0x1 << counter)) == 0x00)&&(LCD_Currentfonts->Width > 12 )))\r
+      {\r
+          /* Write data value to all SDRAM memory */\r
+         *(__IO uint16_t*) (CurrentFrameBuffer + (2*Xaddress) + xpos) = CurrentBackColor;\r
+      }\r
+      else\r
+      {\r
+          /* Write data value to all SDRAM memory */\r
+         *(__IO uint16_t*) (CurrentFrameBuffer + (2*Xaddress) + xpos) = CurrentTextColor;\r
+      }\r
+      Xaddress++;\r
+    }\r
+      Xaddress += (LCD_PIXEL_WIDTH - LCD_Currentfonts->Width);\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Displays one character (16dots width, 24dots height).\r
+  * @param  Line: the Line where to display the character shape .\r
+  *   This parameter can be one of the following values:\r
+  *     @arg Linex: where x can be 0..29\r
+  * @param  Column: start column address.\r
+  * @param  Ascii: character ascii code, must be between 0x20 and 0x7E.\r
+  * @retval None\r
+  */\r
+void LCD_DisplayChar(uint16_t Line, uint16_t Column, uint8_t Ascii)\r
+{\r
+  Ascii -= 32;\r
+\r
+  LCD_DrawChar(Line, Column, &LCD_Currentfonts->table[Ascii * LCD_Currentfonts->Height]);\r
+}\r
+\r
+/**\r
+  * @brief  Displays a maximum of 20 char on the LCD.\r
+  * @param  Line: the Line where to display the character shape .\r
+  *   This parameter can be one of the following values:\r
+  *     @arg Linex: where x can be 0..9\r
+  * @param  *ptr: pointer to string to display on LCD.\r
+  * @retval None\r
+  */\r
+void LCD_DisplayStringLine(uint16_t Line, uint8_t *ptr)\r
+{\r
+  uint16_t refcolumn = 0;\r
+  /* Send the string character by character on lCD */\r
+  while ((refcolumn < LCD_PIXEL_WIDTH) && ((*ptr != 0) & (((refcolumn + LCD_Currentfonts->Width) & 0xFFFF) >= LCD_Currentfonts->Width)))\r
+  {\r
+    /* Display one character on LCD */\r
+    LCD_DisplayChar(Line, refcolumn, *ptr);\r
+    /* Decrement the column position by width */\r
+    refcolumn += LCD_Currentfonts->Width;\r
+    /* Point on the next character */\r
+    ptr++;\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Sets a display window\r
+  * @param  Xpos: specifies the X bottom left position from 0 to 240.\r
+  * @param  Ypos: specifies the Y bottom left position from 0 to 320.\r
+  * @param  Height: display window height, can be a value from 0 to 320.\r
+  * @param  Width: display window width, can be a value from 0 to 240.\r
+  * @retval None\r
+  */\r
+void LCD_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Height, uint16_t Width)\r
+{\r
+\r
+  if (CurrentLayer == LCD_BACKGROUND_LAYER)\r
+  {\r
+    /* reconfigure the layer1 position */\r
+    LTDC_LayerPosition(LTDC_Layer1, Xpos, Ypos);\r
+    LTDC_ReloadConfig(LTDC_IMReload);\r
+\r
+    /* reconfigure the layer1 size */\r
+    LTDC_LayerSize(LTDC_Layer1, Width, Height);\r
+    LTDC_ReloadConfig(LTDC_IMReload);\r
+ }\r
+ else\r
+ {\r
+    /* reconfigure the layer2 position */\r
+    LTDC_LayerPosition(LTDC_Layer2, Xpos, Ypos);\r
+    LTDC_ReloadConfig(LTDC_IMReload);\r
+\r
+   /* reconfigure the layer2 size */\r
+    LTDC_LayerSize(LTDC_Layer2, Width, Height);\r
+    LTDC_ReloadConfig(LTDC_IMReload);\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Disables LCD Window mode.\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+void LCD_WindowModeDisable(void)\r
+{\r
+  LCD_SetDisplayWindow(0, 0, LCD_PIXEL_HEIGHT, LCD_PIXEL_WIDTH);\r
+}\r
+\r
+/**\r
+  * @brief  Displays a line.\r
+  * @param Xpos: specifies the X position, can be a value from 0 to 240.\r
+  * @param Ypos: specifies the Y position, can be a value from 0 to 320.\r
+  * @param Length: line length.\r
+  * @param Direction: line direction.\r
+  *   This parameter can be one of the following values: LCD_DIR_HORIZONTAL or LCD_DIR_VERTICAL.\r
+  * @retval None\r
+  */\r
+void LCD_DrawLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length, uint8_t Direction)\r
+{\r
+  DMA2D_InitTypeDef      DMA2D_InitStruct;\r
+\r
+  uint32_t  Xaddress = 0;\r
+  uint16_t Red_Value = 0, Green_Value = 0, Blue_Value = 0;\r
+\r
+  Xaddress = CurrentFrameBuffer + 2*(LCD_PIXEL_WIDTH*Ypos + Xpos);\r
+\r
+  Red_Value = (0xF800 & CurrentTextColor) >> 11;\r
+  Blue_Value = 0x001F & CurrentTextColor;\r
+  Green_Value = (0x07E0 & CurrentTextColor) >> 5;\r
+\r
+  /* Configure DMA2D */\r
+  DMA2D_DeInit();\r
+  DMA2D_InitStruct.DMA2D_Mode = DMA2D_R2M;\r
+  DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB565;\r
+  DMA2D_InitStruct.DMA2D_OutputGreen = Green_Value;\r
+  DMA2D_InitStruct.DMA2D_OutputBlue = Blue_Value;\r
+  DMA2D_InitStruct.DMA2D_OutputRed = Red_Value;\r
+  DMA2D_InitStruct.DMA2D_OutputAlpha = 0x0F;\r
+  DMA2D_InitStruct.DMA2D_OutputMemoryAdd = Xaddress;\r
+\r
+  if(Direction == LCD_DIR_HORIZONTAL)\r
+  {\r
+    DMA2D_InitStruct.DMA2D_OutputOffset = 0;\r
+    DMA2D_InitStruct.DMA2D_NumberOfLine = 1;\r
+    DMA2D_InitStruct.DMA2D_PixelPerLine = Length;\r
+  }\r
+  else\r
+  {\r
+    DMA2D_InitStruct.DMA2D_OutputOffset = LCD_PIXEL_WIDTH - 1;\r
+    DMA2D_InitStruct.DMA2D_NumberOfLine = Length;\r
+    DMA2D_InitStruct.DMA2D_PixelPerLine = 1;\r
+  }\r
+\r
+  DMA2D_Init(&DMA2D_InitStruct);\r
+  /* Start Transfer */\r
+  DMA2D_StartTransfer();\r
+  /* Wait for CTC Flag activation */\r
+  while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET)\r
+  {\r
+  }\r
+\r
+}\r
+\r
+/**\r
+  * @brief  Displays a rectangle.\r
+  * @param  Xpos: specifies the X position, can be a value from 0 to 240.\r
+  * @param  Ypos: specifies the Y position, can be a value from 0 to 320.\r
+  * @param  Height: display rectangle height, can be a value from 0 to 320.\r
+  * @param  Width: display rectangle width, can be a value from 0 to 240.\r
+  * @retval None\r
+  */\r
+void LCD_DrawRect(uint16_t Xpos, uint16_t Ypos, uint16_t Height, uint16_t Width)\r
+{\r
+  /* draw horizontal lines */\r
+  LCD_DrawLine(Xpos, Ypos, Width, LCD_DIR_HORIZONTAL);\r
+  LCD_DrawLine(Xpos, (Ypos+ Height), Width, LCD_DIR_HORIZONTAL);\r
+\r
+  /* draw vertical lines */\r
+  LCD_DrawLine(Xpos, Ypos, Height, LCD_DIR_VERTICAL);\r
+  LCD_DrawLine((Xpos + Width), Ypos, Height, LCD_DIR_VERTICAL);\r
+}\r
+\r
+/**\r
+  * @brief  Draw a circle.\r
+  * @param  Xpos: specifies the X position, can be a value from 0 to 240.\r
+  * @param  Ypos: specifies the Y position, can be a value from 0 to 320.\r
+  * @param  Radius: radius of the circle.\r
+  * @retval None\r
+  */\r
+void LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius)\r
+{\r
+    int x = -Radius, y = 0, err = 2-2*Radius, e2;\r
+    do {\r
+        *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos-x) + LCD_PIXEL_WIDTH*(Ypos+y)))) = CurrentTextColor;\r
+        *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos+x) + LCD_PIXEL_WIDTH*(Ypos+y)))) = CurrentTextColor;\r
+        *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos+x) + LCD_PIXEL_WIDTH*(Ypos-y)))) = CurrentTextColor;\r
+        *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos-x) + LCD_PIXEL_WIDTH*(Ypos-y)))) = CurrentTextColor;\r
+\r
+        e2 = err;\r
+        if (e2 <= y) {\r
+            err += ++y*2+1;\r
+            if (-x == y && e2 <= x) e2 = 0;\r
+        }\r
+        if (e2 > x) err += ++x*2+1;\r
+    }\r
+    while (x <= 0);\r
+}\r
+\r
+/**\r
+  * @brief  Draw a full ellipse.\r
+  * @param  Xpos: specifies the X position, can be a value from 0 to 240.\r
+  * @param  Ypos: specifies the Y position, can be a value from 0 to 320.\r
+  * @param  Radius: minor radius of ellipse.\r
+  * @param  Radius2: major radius of ellipse.\r
+  * @retval None\r
+  */\r
+void LCD_DrawFullEllipse(int Xpos, int Ypos, int Radius, int Radius2)\r
+{\r
+  int x = -Radius, y = 0, err = 2-2*Radius, e2;\r
+  float K = 0, rad1 = 0, rad2 = 0;\r
+\r
+  rad1 = Radius;\r
+  rad2 = Radius2;\r
+\r
+  if (Radius > Radius2)\r
+  {\r
+    do\r
+    {\r
+      K = (float)(rad1/rad2);\r
+      LCD_DrawLine((Xpos+x), (Ypos-(uint16_t)(y/K)), (2*(uint16_t)(y/K) + 1), LCD_DIR_VERTICAL);\r
+      LCD_DrawLine((Xpos-x), (Ypos-(uint16_t)(y/K)), (2*(uint16_t)(y/K) + 1), LCD_DIR_VERTICAL);\r
+\r
+      e2 = err;\r
+      if (e2 <= y)\r
+      {\r
+        err += ++y*2+1;\r
+        if (-x == y && e2 <= x) e2 = 0;\r
+      }\r
+      if (e2 > x) err += ++x*2+1;\r
+\r
+    }\r
+    while (x <= 0);\r
+  }\r
+  else\r
+  {\r
+    y = -Radius2;\r
+    x = 0;\r
+    do\r
+    {\r
+      K = (float)(rad2/rad1);\r
+      LCD_DrawLine((Xpos-(uint16_t)(x/K)), (Ypos+y), (2*(uint16_t)(x/K) + 1), LCD_DIR_HORIZONTAL);\r
+      LCD_DrawLine((Xpos-(uint16_t)(x/K)), (Ypos-y), (2*(uint16_t)(x/K) + 1), LCD_DIR_HORIZONTAL);\r
+\r
+      e2 = err;\r
+      if (e2 <= x)\r
+      {\r
+        err += ++x*2+1;\r
+        if (-y == x && e2 <= y) e2 = 0;\r
+      }\r
+      if (e2 > y) err += ++y*2+1;\r
+    }\r
+    while (y <= 0);\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Displays an Ellipse.\r
+  * @param  Xpos: specifies the X position, can be a value from 0 to 240.\r
+  * @param  Ypos: specifies the Y position, can be a value from 0 to 320.\r
+  * @param  Radius: specifies Radius.\r
+  * @param  Radius2: specifies Radius2.\r
+  * @retval None\r
+  */\r
+void LCD_DrawEllipse(int Xpos, int Ypos, int Radius, int Radius2)\r
+{\r
+  int x = -Radius, y = 0, err = 2-2*Radius, e2;\r
+  float K = 0, rad1 = 0, rad2 = 0;\r
+\r
+  rad1 = Radius;\r
+  rad2 = Radius2;\r
+\r
+  if (Radius > Radius2)\r
+  {\r
+    do {\r
+      K = (float)(rad1/rad2);\r
+      *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos-x) + LCD_PIXEL_WIDTH*(Ypos+(uint16_t)(y/K))))) = CurrentTextColor;\r
+      *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos+x) + LCD_PIXEL_WIDTH*(Ypos+(uint16_t)(y/K))))) = CurrentTextColor;\r
+      *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos+x) + LCD_PIXEL_WIDTH*(Ypos-(uint16_t)(y/K))))) = CurrentTextColor;\r
+      *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos-x) + LCD_PIXEL_WIDTH*(Ypos-(uint16_t)(y/K))))) = CurrentTextColor;\r
+\r
+      e2 = err;\r
+      if (e2 <= y) {\r
+        err += ++y*2+1;\r
+        if (-x == y && e2 <= x) e2 = 0;\r
+      }\r
+      if (e2 > x) err += ++x*2+1;\r
+    }\r
+    while (x <= 0);\r
+  }\r
+  else\r
+  {\r
+    y = -Radius2;\r
+    x = 0;\r
+    do {\r
+      K = (float)(rad2/rad1);\r
+      *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos-(uint16_t)(x/K)) + LCD_PIXEL_WIDTH*(Ypos+y)))) = CurrentTextColor;\r
+      *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos+(uint16_t)(x/K)) + LCD_PIXEL_WIDTH*(Ypos+y)))) = CurrentTextColor;\r
+      *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos+(uint16_t)(x/K)) + LCD_PIXEL_WIDTH*(Ypos-y)))) = CurrentTextColor;\r
+      *(__IO uint16_t*) (CurrentFrameBuffer + (2*((Xpos-(uint16_t)(x/K)) + LCD_PIXEL_WIDTH*(Ypos-y)))) = CurrentTextColor;\r
+\r
+      e2 = err;\r
+      if (e2 <= x) {\r
+        err += ++x*2+1;\r
+        if (-y == x && e2 <= y) e2 = 0;\r
+      }\r
+      if (e2 > y) err += ++y*2+1;\r
+    }\r
+    while (y <= 0);\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Displays a mono-color picture.\r
+  * @param  Pict: pointer to the picture array.\r
+  * @retval None\r
+  */\r
+void LCD_DrawMonoPict(const uint32_t *Pict)\r
+{\r
+  uint32_t index = 0, counter = 0;\r
+\r
+\r
+  for(index = 0; index < 2400; index++)\r
+  {\r
+    for(counter = 0; counter < 32; counter++)\r
+    {\r
+      if((Pict[index] & (1 << counter)) == 0x00)\r
+      {\r
+        *(__IO uint16_t*)(CurrentFrameBuffer) = CurrentBackColor;\r
+      }\r
+      else\r
+      {\r
+        *(__IO uint16_t*)(CurrentFrameBuffer) = CurrentTextColor;\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Displays a bitmap picture loaded in the internal Flash.\r
+  * @param  BmpAddress: Bmp picture address in the internal Flash.\r
+  * @retval None\r
+  */\r
+void LCD_WriteBMP(uint32_t BmpAddress)\r
+{\r
+  uint32_t index = 0, size = 0, width = 0, height = 0, bit_pixel = 0;\r
+  uint32_t Address;\r
+  uint32_t currentline = 0, linenumber = 0;\r
+\r
+  Address = CurrentFrameBuffer;\r
+\r
+  /* Read bitmap size */\r
+  size = *(__IO uint16_t *) (BmpAddress + 2);\r
+  size |= (*(__IO uint16_t *) (BmpAddress + 4)) << 16;\r
+\r
+  /* Get bitmap data address offset */\r
+  index = *(__IO uint16_t *) (BmpAddress + 10);\r
+  index |= (*(__IO uint16_t *) (BmpAddress + 12)) << 16;\r
+\r
+  /* Read bitmap width */\r
+  width = *(uint16_t *) (BmpAddress + 18);\r
+  width |= (*(uint16_t *) (BmpAddress + 20)) << 16;\r
+\r
+  /* Read bitmap height */\r
+  height = *(uint16_t *) (BmpAddress + 22);\r
+  height |= (*(uint16_t *) (BmpAddress + 24)) << 16;\r
+\r
+  /* Read bit/pixel */\r
+  bit_pixel = *(uint16_t *) (BmpAddress + 28);\r
+\r
+  if (CurrentLayer == LCD_BACKGROUND_LAYER)\r
+  {\r
+    /* reconfigure layer size in accordance with the picture */\r
+    LTDC_LayerSize(LTDC_Layer1, width, height);\r
+    LTDC_ReloadConfig(LTDC_VBReload);\r
+\r
+    /* Reconfigure the Layer pixel format in accordance with the picture */\r
+    if ((bit_pixel/8) == 4)\r
+    {\r
+      LTDC_LayerPixelFormat(LTDC_Layer1, LTDC_Pixelformat_ARGB8888);\r
+      LTDC_ReloadConfig(LTDC_VBReload);\r
+    }\r
+    else if ((bit_pixel/8) == 2)\r
+    {\r
+      LTDC_LayerPixelFormat(LTDC_Layer1, LTDC_Pixelformat_RGB565);\r
+      LTDC_ReloadConfig(LTDC_VBReload);\r
+    }\r
+    else\r
+    {\r
+      LTDC_LayerPixelFormat(LTDC_Layer1, LTDC_Pixelformat_RGB888);\r
+      LTDC_ReloadConfig(LTDC_VBReload);\r
+    }\r
+  }\r
+  else\r
+  {\r
+    /* reconfigure layer size in accordance with the picture */\r
+    LTDC_LayerSize(LTDC_Layer2, width, height);\r
+    LTDC_ReloadConfig(LTDC_VBReload);\r
+\r
+    /* Reconfigure the Layer pixel format in accordance with the picture */\r
+    if ((bit_pixel/8) == 4)\r
+    {\r
+      LTDC_LayerPixelFormat(LTDC_Layer2, LTDC_Pixelformat_ARGB8888);\r
+      LTDC_ReloadConfig(LTDC_VBReload);\r
+    }\r
+    else if ((bit_pixel/8) == 2)\r
+    {\r
+      LTDC_LayerPixelFormat(LTDC_Layer2, LTDC_Pixelformat_RGB565);\r
+      LTDC_ReloadConfig(LTDC_VBReload);\r
+    }\r
+    else\r
+    {\r
+      LTDC_LayerPixelFormat(LTDC_Layer2, LTDC_Pixelformat_RGB888);\r
+      LTDC_ReloadConfig(LTDC_VBReload);\r
+    }\r
+  }\r
+\r
+  /* compute the real size of the picture (without the header)) */\r
+  size = (size - index);\r
+\r
+  /* bypass the bitmap header */\r
+  BmpAddress += index;\r
+\r
+  /* start copie image from the bottom */\r
+  Address += width*(height-1)*(bit_pixel/8);\r
+\r
+  for(index = 0; index < size; index++)\r
+  {\r
+    *(__IO uint8_t*) (Address) = *(__IO uint8_t *)BmpAddress;\r
+\r
+    /*jump on next byte */\r
+    BmpAddress++;\r
+    Address++;\r
+    currentline++;\r
+\r
+    if((currentline/(bit_pixel/8)) == width)\r
+    {\r
+      if(linenumber < height)\r
+      {\r
+        linenumber++;\r
+        Address -=(2*width*(bit_pixel/8));\r
+        currentline = 0;\r
+      }\r
+    }\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Displays a full rectangle.\r
+  * @param  Xpos: specifies the X position, can be a value from 0 to 240.\r
+  * @param  Ypos: specifies the Y position, can be a value from 0 to 320.\r
+  * @param  Height: rectangle height.\r
+  * @param  Width: rectangle width.\r
+  * @retval None\r
+  */\r
+void LCD_DrawFullRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height)\r
+{\r
+  DMA2D_InitTypeDef      DMA2D_InitStruct;\r
+\r
+  uint32_t  Xaddress = 0;\r
+  uint16_t Red_Value = 0, Green_Value = 0, Blue_Value = 0;\r
+\r
+  Red_Value = (0xF800 & CurrentTextColor) >> 11;\r
+  Blue_Value = 0x001F & CurrentTextColor;\r
+  Green_Value = (0x07E0 & CurrentTextColor) >> 5;\r
+\r
+  Xaddress = CurrentFrameBuffer + 2*(LCD_PIXEL_WIDTH*Ypos + Xpos);\r
+\r
+  /* configure DMA2D */\r
+  DMA2D_DeInit();\r
+  DMA2D_InitStruct.DMA2D_Mode = DMA2D_R2M;\r
+  DMA2D_InitStruct.DMA2D_CMode = DMA2D_RGB565;\r
+  DMA2D_InitStruct.DMA2D_OutputGreen = Green_Value;\r
+  DMA2D_InitStruct.DMA2D_OutputBlue = Blue_Value;\r
+  DMA2D_InitStruct.DMA2D_OutputRed = Red_Value;\r
+  DMA2D_InitStruct.DMA2D_OutputAlpha = 0x0F;\r
+  DMA2D_InitStruct.DMA2D_OutputMemoryAdd = Xaddress;\r
+  DMA2D_InitStruct.DMA2D_OutputOffset = (LCD_PIXEL_WIDTH - Width);\r
+  DMA2D_InitStruct.DMA2D_NumberOfLine = Height;\r
+  DMA2D_InitStruct.DMA2D_PixelPerLine = Width;\r
+  DMA2D_Init(&DMA2D_InitStruct);\r
+\r
+  /* Start Transfer */\r
+  DMA2D_StartTransfer();\r
+\r
+  /* Wait for CTC Flag activation */\r
+  while(DMA2D_GetFlagStatus(DMA2D_FLAG_TC) == RESET)\r
+  {\r
+  }\r
+\r
+  LCD_SetTextColor(CurrentTextColor);\r
+}\r
+\r
+/**\r
+  * @brief  Displays a full circle.\r
+  * @param  Xpos: specifies the X position, can be a value from 0 to 240.\r
+  * @param  Ypos: specifies the Y position, can be a value from 0 to 320.\r
+  * @param  Radius\r
+  * @retval None\r
+  */\r
+void LCD_DrawFullCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius)\r
+{\r
+  int32_t  D;    /* Decision Variable */\r
+  uint32_t  CurX;/* Current X Value */\r
+  uint32_t  CurY;/* Current Y Value */\r
+\r
+  D = 3 - (Radius << 1);\r
+\r
+  CurX = 0;\r
+  CurY = Radius;\r
+\r
+  while (CurX <= CurY)\r
+  {\r
+    if(CurY > 0)\r
+    {\r
+      LCD_DrawLine(Xpos - CurX, Ypos - CurY, 2*CurY, LCD_DIR_VERTICAL);\r
+      LCD_DrawLine(Xpos + CurX, Ypos - CurY, 2*CurY, LCD_DIR_VERTICAL);\r
+    }\r
+\r
+    if(CurX > 0)\r
+    {\r
+      LCD_DrawLine(Xpos - CurY, Ypos - CurX, 2*CurX, LCD_DIR_VERTICAL);\r
+      LCD_DrawLine(Xpos + CurY, Ypos - CurX, 2*CurX, LCD_DIR_VERTICAL);\r
+    }\r
+    if (D < 0)\r
+    {\r
+      D += (CurX << 2) + 6;\r
+    }\r
+    else\r
+    {\r
+      D += ((CurX - CurY) << 2) + 10;\r
+      CurY--;\r
+    }\r
+    CurX++;\r
+  }\r
+\r
+  LCD_DrawCircle(Xpos, Ypos, Radius);\r
+}\r
+\r
+/**\r
+  * @brief  Displays an uni-line (between two points).\r
+  * @param  x1: specifies the point 1 x position.\r
+  * @param  y1: specifies the point 1 y position.\r
+  * @param  x2: specifies the point 2 x position.\r
+  * @param  y2: specifies the point 2 y position.\r
+  * @retval None\r
+  */\r
+void LCD_DrawUniLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2)\r
+{\r
+  int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0,\r
+  yinc1 = 0, yinc2 = 0, den = 0, num = 0, numadd = 0, numpixels = 0,\r
+  curpixel = 0;\r
+\r
+  deltax = ABS(x2 - x1);        /* The difference between the x's */\r
+  deltay = ABS(y2 - y1);        /* The difference between the y's */\r
+  x = x1;                       /* Start x off at the first pixel */\r
+  y = y1;                       /* Start y off at the first pixel */\r
+\r
+  if (x2 >= x1)                 /* The x-values are increasing */\r
+  {\r
+    xinc1 = 1;\r
+    xinc2 = 1;\r
+  }\r
+  else                          /* The x-values are decreasing */\r
+  {\r
+    xinc1 = -1;\r
+    xinc2 = -1;\r
+  }\r
+\r
+  if (y2 >= y1)                 /* The y-values are increasing */\r
+  {\r
+    yinc1 = 1;\r
+    yinc2 = 1;\r
+  }\r
+  else                          /* The y-values are decreasing */\r
+  {\r
+    yinc1 = -1;\r
+    yinc2 = -1;\r
+  }\r
+\r
+  if (deltax >= deltay)         /* There is at least one x-value for every y-value */\r
+  {\r
+    xinc1 = 0;                  /* Don't change the x when numerator >= denominator */\r
+    yinc2 = 0;                  /* Don't change the y for every iteration */\r
+    den = deltax;\r
+    num = deltax / 2;\r
+    numadd = deltay;\r
+    numpixels = deltax;         /* There are more x-values than y-values */\r
+  }\r
+  else                          /* There is at least one y-value for every x-value */\r
+  {\r
+    xinc2 = 0;                  /* Don't change the x for every iteration */\r
+    yinc1 = 0;                  /* Don't change the y when numerator >= denominator */\r
+    den = deltay;\r
+    num = deltay / 2;\r
+    numadd = deltax;\r
+    numpixels = deltay;         /* There are more y-values than x-values */\r
+  }\r
+\r
+  for (curpixel = 0; curpixel <= numpixels; curpixel++)\r
+  {\r
+    PutPixel(x, y);             /* Draw the current pixel */\r
+    num += numadd;              /* Increase the numerator by the top of the fraction */\r
+    if (num >= den)             /* Check if numerator >= denominator */\r
+    {\r
+      num -= den;               /* Calculate the new numerator value */\r
+      x += xinc1;               /* Change the x as appropriate */\r
+      y += yinc1;               /* Change the y as appropriate */\r
+    }\r
+    x += xinc2;                 /* Change the x as appropriate */\r
+    y += yinc2;                 /* Change the y as appropriate */\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Displays an triangle.\r
+  * @param  Points: pointer to the points array.\r
+  * @retval None\r
+  */\r
+void LCD_Triangle(pPoint Points, uint16_t PointCount)\r
+{\r
+  int16_t X = 0, Y = 0;\r
+  pPoint First = Points;\r
+\r
+  if(PointCount != 3)\r
+  {\r
+    return;\r
+  }\r
+\r
+  while(--PointCount)\r
+  {\r
+    X = Points->X;\r
+    Y = Points->Y;\r
+    Points++;\r
+    LCD_DrawUniLine(X, Y, Points->X, Points->Y);\r
+  }\r
+  LCD_DrawUniLine(First->X, First->Y, Points->X, Points->Y);\r
+}\r
+\r
+/**\r
+  * @brief  Fill an triangle (between 3 points).\r
+  * @param  x1..3: x position of triangle point 1..3.\r
+  * @param  y1..3: y position of triangle point 1..3.\r
+  * @retval None\r
+  */\r
+void LCD_FillTriangle(uint16_t x1, uint16_t x2, uint16_t x3, uint16_t y1, uint16_t y2, uint16_t y3)\r
+{\r
+\r
+  int16_t deltax = 0, deltay = 0, x = 0, y = 0, xinc1 = 0, xinc2 = 0,\r
+  yinc1 = 0, yinc2 = 0, den = 0, num = 0, numadd = 0, numpixels = 0,\r
+  curpixel = 0;\r
+\r
+  deltax = ABS(x2 - x1);        /* The difference between the x's */\r
+  deltay = ABS(y2 - y1);        /* The difference between the y's */\r
+  x = x1;                       /* Start x off at the first pixel */\r
+  y = y1;                       /* Start y off at the first pixel */\r
+\r
+  if (x2 >= x1)                 /* The x-values are increasing */\r
+  {\r
+    xinc1 = 1;\r
+    xinc2 = 1;\r
+  }\r
+  else                          /* The x-values are decreasing */\r
+  {\r
+    xinc1 = -1;\r
+    xinc2 = -1;\r
+  }\r
+\r
+  if (y2 >= y1)                 /* The y-values are increasing */\r
+  {\r
+    yinc1 = 1;\r
+    yinc2 = 1;\r
+  }\r
+  else                          /* The y-values are decreasing */\r
+  {\r
+    yinc1 = -1;\r
+    yinc2 = -1;\r
+  }\r
+\r
+  if (deltax >= deltay)         /* There is at least one x-value for every y-value */\r
+  {\r
+    xinc1 = 0;                  /* Don't change the x when numerator >= denominator */\r
+    yinc2 = 0;                  /* Don't change the y for every iteration */\r
+    den = deltax;\r
+    num = deltax / 2;\r
+    numadd = deltay;\r
+    numpixels = deltax;         /* There are more x-values than y-values */\r
+  }\r
+  else                          /* There is at least one y-value for every x-value */\r
+  {\r
+    xinc2 = 0;                  /* Don't change the x for every iteration */\r
+    yinc1 = 0;                  /* Don't change the y when numerator >= denominator */\r
+    den = deltay;\r
+    num = deltay / 2;\r
+    numadd = deltax;\r
+    numpixels = deltay;         /* There are more y-values than x-values */\r
+  }\r
+\r
+  for (curpixel = 0; curpixel <= numpixels; curpixel++)\r
+  {\r
+    LCD_DrawUniLine(x, y, x3, y3);\r
+\r
+    num += numadd;              /* Increase the numerator by the top of the fraction */\r
+    if (num >= den)             /* Check if numerator >= denominator */\r
+    {\r
+      num -= den;               /* Calculate the new numerator value */\r
+      x += xinc1;               /* Change the x as appropriate */\r
+      y += yinc1;               /* Change the y as appropriate */\r
+    }\r
+    x += xinc2;                 /* Change the x as appropriate */\r
+    y += yinc2;                 /* Change the y as appropriate */\r
+  }\r
+\r
+\r
+}\r
+/**\r
+  * @brief  Displays an poly-line (between many points).\r
+  * @param  Points: pointer to the points array.\r
+  * @param  PointCount: Number of points.\r
+  * @retval None\r
+  */\r
+void LCD_PolyLine(pPoint Points, uint16_t PointCount)\r
+{\r
+  int16_t X = 0, Y = 0;\r
+\r
+  if(PointCount < 2)\r
+  {\r
+    return;\r
+  }\r
+\r
+  while(--PointCount)\r
+  {\r
+    X = Points->X;\r
+    Y = Points->Y;\r
+    Points++;\r
+    LCD_DrawUniLine(X, Y, Points->X, Points->Y);\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Displays an relative poly-line (between many points).\r
+  * @param  Points: pointer to the points array.\r
+  * @param  PointCount: Number of points.\r
+  * @param  Closed: specifies if the draw is closed or not.\r
+  *           1: closed, 0 : not closed.\r
+  * @retval None\r
+  */\r
+static void LCD_PolyLineRelativeClosed(pPoint Points, uint16_t PointCount, uint16_t Closed)\r
+{\r
+  int16_t X = 0, Y = 0;\r
+  pPoint First = Points;\r
+\r
+  if(PointCount < 2)\r
+  {\r
+    return;\r
+  }\r
+  X = Points->X;\r
+  Y = Points->Y;\r
+  while(--PointCount)\r
+  {\r
+    Points++;\r
+    LCD_DrawUniLine(X, Y, X + Points->X, Y + Points->Y);\r
+    X = X + Points->X;\r
+    Y = Y + Points->Y;\r
+  }\r
+  if(Closed)\r
+  {\r
+    LCD_DrawUniLine(First->X, First->Y, X, Y);\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  Displays a closed poly-line (between many points).\r
+  * @param  Points: pointer to the points array.\r
+  * @param  PointCount: Number of points.\r
+  * @retval None\r
+  */\r
+void LCD_ClosedPolyLine(pPoint Points, uint16_t PointCount)\r
+{\r
+  LCD_PolyLine(Points, PointCount);\r
+  LCD_DrawUniLine(Points->X, Points->Y, (Points+PointCount-1)->X, (Points+PointCount-1)->Y);\r
+}\r
+\r
+/**\r
+  * @brief  Displays a relative poly-line (between many points).\r
+  * @param  Points: pointer to the points array.\r
+  * @param  PointCount: Number of points.\r
+  * @retval None\r
+  */\r
+void LCD_PolyLineRelative(pPoint Points, uint16_t PointCount)\r
+{\r
+  LCD_PolyLineRelativeClosed(Points, PointCount, 0);\r
+}\r
+\r
+/**\r
+  * @brief  Displays a closed relative poly-line (between many points).\r
+  * @param  Points: pointer to the points array.\r
+  * @param  PointCount: Number of points.\r
+  * @retval None\r
+  */\r
+void LCD_ClosedPolyLineRelative(pPoint Points, uint16_t PointCount)\r
+{\r
+  LCD_PolyLineRelativeClosed(Points, PointCount, 1);\r
+}\r
+\r
+/**\r
+  * @brief  Displays a  full poly-line (between many points).\r
+  * @param  Points: pointer to the points array.\r
+  * @param  PointCount: Number of points.\r
+  * @retval None\r
+  */\r
+void LCD_FillPolyLine(pPoint Points, uint16_t PointCount)\r
+{\r
+\r
+  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;\r
+  uint16_t  IMAGE_LEFT = 0, IMAGE_RIGHT = 0, IMAGE_TOP = 0, IMAGE_BOTTOM = 0;\r
+\r
+  IMAGE_LEFT = IMAGE_RIGHT = Points->X;\r
+  IMAGE_TOP= IMAGE_BOTTOM = Points->Y;\r
+\r
+  for(counter = 1; counter < PointCount; counter++)\r
+  {\r
+    pixelX = POLY_X(counter);\r
+    if(pixelX < IMAGE_LEFT)\r
+    {\r
+      IMAGE_LEFT = pixelX;\r
+    }\r
+    if(pixelX > IMAGE_RIGHT)\r
+    {\r
+      IMAGE_RIGHT = pixelX;\r
+    }\r
+\r
+    pixelY = POLY_Y(counter);\r
+    if(pixelY < IMAGE_TOP)\r
+    {\r
+      IMAGE_TOP = pixelY;\r
+    }\r
+    if(pixelY > IMAGE_BOTTOM)\r
+    {\r
+      IMAGE_BOTTOM = pixelY;\r
+    }\r
+  }\r
+\r
+  if(PointCount < 2)\r
+  {\r
+    return;\r
+  }\r
+\r
+  X_center = (IMAGE_LEFT + IMAGE_RIGHT)/2;\r
+  Y_center = (IMAGE_BOTTOM + IMAGE_TOP)/2;\r
+\r
+  X_first = Points->X;\r
+  Y_first = Points->Y;\r
+\r
+  while(--PointCount)\r
+  {\r
+    X = Points->X;\r
+    Y = Points->Y;\r
+    Points++;\r
+    X2 = Points->X;\r
+    Y2 = Points->Y;\r
+\r
+    LCD_FillTriangle(X, X2, X_center, Y, Y2, Y_center);\r
+    LCD_FillTriangle(X, X_center, X2, Y, Y_center, Y2);\r
+    LCD_FillTriangle(X_center, X2, X, Y_center, Y2, Y);\r
+  }\r
+\r
+  LCD_FillTriangle(X_first, X2, X_center, Y_first, Y2, Y_center);\r
+  LCD_FillTriangle(X_first, X_center, X2, Y_first, Y_center, Y2);\r
+  LCD_FillTriangle(X_center, X2, X_first, Y_center, Y2, Y_first);\r
+}\r
+\r
+/**\r
+  * @brief  Writes command to select the LCD register.\r
+  * @param  LCD_Reg: address of the selected register.\r
+  * @retval None\r
+  */\r
+void LCD_WriteCommand(uint8_t LCD_Reg)\r
+{\r
+    /* Reset WRX to send command */\r
+  LCD_CtrlLinesWrite(LCD_WRX_GPIO_PORT, LCD_WRX_PIN, Bit_RESET);\r
+\r
+  /* Reset LCD control line(/CS) and Send command */\r
+  LCD_ChipSelect(DISABLE);\r
+  SPI_I2S_SendData(LCD_SPI, LCD_Reg);\r
+\r
+  /* Wait until a data is sent(not busy), before config /CS HIGH */\r
+\r
+  while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_TXE) == RESET) ;\r
+\r
+  while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET);\r
+\r
+  LCD_ChipSelect(ENABLE);\r
+}\r
+\r
+/**\r
+  * @brief  Writes data to select the LCD register.\r
+  *         This function must be used after LCD_WriteCommand() function\r
+  * @param  value: data to write to the selected register.\r
+  * @retval None\r
+  */\r
+void LCD_WriteData(uint8_t value)\r
+{\r
+    /* Set WRX to send data */\r
+  LCD_CtrlLinesWrite(LCD_WRX_GPIO_PORT, LCD_WRX_PIN, Bit_SET);\r
+\r
+  /* Reset LCD control line(/CS) and Send data */\r
+  LCD_ChipSelect(DISABLE);\r
+  SPI_I2S_SendData(LCD_SPI, value);\r
+\r
+  /* Wait until a data is sent(not busy), before config /CS HIGH */\r
+\r
+  while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_TXE) == RESET) ;\r
+\r
+  while(SPI_I2S_GetFlagStatus(LCD_SPI, SPI_I2S_FLAG_BSY) != RESET);\r
+\r
+  LCD_ChipSelect(ENABLE);\r
+}\r
+\r
+/**\r
+  * @brief  Configure the LCD controller (Power On sequence as described in ILI9341 Datasheet)\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+void LCD_PowerOn(void)\r
+{\r
+  LCD_WriteCommand(0xCA);\r
+  LCD_WriteData(0xC3);\r
+  LCD_WriteData(0x08);\r
+  LCD_WriteData(0x50);\r
+  LCD_WriteCommand(LCD_POWERB);\r
+  LCD_WriteData(0x00);\r
+  LCD_WriteData(0xC1);\r
+  LCD_WriteData(0x30);\r
+  LCD_WriteCommand(LCD_POWER_SEQ);\r
+  LCD_WriteData(0x64);\r
+  LCD_WriteData(0x03);\r
+  LCD_WriteData(0x12);\r
+  LCD_WriteData(0x81);\r
+  LCD_WriteCommand(LCD_DTCA);\r
+  LCD_WriteData(0x85);\r
+  LCD_WriteData(0x00);\r
+  LCD_WriteData(0x78);\r
+  LCD_WriteCommand(LCD_POWERA);\r
+  LCD_WriteData(0x39);\r
+  LCD_WriteData(0x2C);\r
+  LCD_WriteData(0x00);\r
+  LCD_WriteData(0x34);\r
+  LCD_WriteData(0x02);\r
+  LCD_WriteCommand(LCD_PRC);\r
+  LCD_WriteData(0x20);\r
+  LCD_WriteCommand(LCD_DTCB);\r
+  LCD_WriteData(0x00);\r
+  LCD_WriteData(0x00);\r
+  LCD_WriteCommand(LCD_FRC);\r
+  LCD_WriteData(0x00);\r
+  LCD_WriteData(0x1B);\r
+  LCD_WriteCommand(LCD_DFC);\r
+  LCD_WriteData(0x0A);\r
+  LCD_WriteData(0xA2);\r
+  LCD_WriteCommand(LCD_POWER1);\r
+  LCD_WriteData(0x10);\r
+  LCD_WriteCommand(LCD_POWER2);\r
+  LCD_WriteData(0x10);\r
+  LCD_WriteCommand(LCD_VCOM1);\r
+  LCD_WriteData(0x45);\r
+  LCD_WriteData(0x15);\r
+  LCD_WriteCommand(LCD_VCOM2);\r
+  LCD_WriteData(0x90);\r
+  LCD_WriteCommand(LCD_MAC);\r
+  LCD_WriteData(0xC8);\r
+  LCD_WriteCommand(LCD_3GAMMA_EN);\r
+  LCD_WriteData(0x00);\r
+  LCD_WriteCommand(LCD_RGB_INTERFACE);\r
+  LCD_WriteData(0xC2);\r
+  LCD_WriteCommand(LCD_DFC);\r
+  LCD_WriteData(0x0A);\r
+  LCD_WriteData(0xA7);\r
+  LCD_WriteData(0x27);\r
+  LCD_WriteData(0x04);\r
+\r
+  /* colomn address set */\r
+  LCD_WriteCommand(LCD_COLUMN_ADDR);\r
+  LCD_WriteData(0x00);\r
+  LCD_WriteData(0x00);\r
+  LCD_WriteData(0x00);\r
+  LCD_WriteData(0xEF);\r
+  /* Page Address Set */\r
+  LCD_WriteCommand(LCD_PAGE_ADDR);\r
+  LCD_WriteData(0x00);\r
+  LCD_WriteData(0x00);\r
+  LCD_WriteData(0x01);\r
+  LCD_WriteData(0x3F);\r
+  LCD_WriteCommand(LCD_INTERFACE);\r
+  LCD_WriteData(0x01);\r
+  LCD_WriteData(0x00);\r
+  LCD_WriteData(0x06);\r
+\r
+  LCD_WriteCommand(LCD_GRAM);\r
+  delay(200);\r
+\r
+  LCD_WriteCommand(LCD_GAMMA);\r
+  LCD_WriteData(0x01);\r
+\r
+  LCD_WriteCommand(LCD_PGAMMA);\r
+  LCD_WriteData(0x0F);\r
+  LCD_WriteData(0x29);\r
+  LCD_WriteData(0x24);\r
+  LCD_WriteData(0x0C);\r
+  LCD_WriteData(0x0E);\r
+  LCD_WriteData(0x09);\r
+  LCD_WriteData(0x4E);\r
+  LCD_WriteData(0x78);\r
+  LCD_WriteData(0x3C);\r
+  LCD_WriteData(0x09);\r
+  LCD_WriteData(0x13);\r
+  LCD_WriteData(0x05);\r
+  LCD_WriteData(0x17);\r
+  LCD_WriteData(0x11);\r
+  LCD_WriteData(0x00);\r
+  LCD_WriteCommand(LCD_NGAMMA);\r
+  LCD_WriteData(0x00);\r
+  LCD_WriteData(0x16);\r
+  LCD_WriteData(0x1B);\r
+  LCD_WriteData(0x04);\r
+  LCD_WriteData(0x11);\r
+  LCD_WriteData(0x07);\r
+  LCD_WriteData(0x31);\r
+  LCD_WriteData(0x33);\r
+  LCD_WriteData(0x42);\r
+  LCD_WriteData(0x05);\r
+  LCD_WriteData(0x0C);\r
+  LCD_WriteData(0x0A);\r
+  LCD_WriteData(0x28);\r
+  LCD_WriteData(0x2F);\r
+  LCD_WriteData(0x0F);\r
+\r
+  LCD_WriteCommand(LCD_SLEEP_OUT);\r
+  delay(200);\r
+  LCD_WriteCommand(LCD_DISPLAY_ON);\r
+  /* GRAM start writing */\r
+  LCD_WriteCommand(LCD_GRAM);\r
+ }\r
+\r
+/**\r
+  * @brief  Enables the Display.\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+void LCD_DisplayOn(void)\r
+{\r
+  LCD_WriteCommand(LCD_DISPLAY_ON);\r
+}\r
+\r
+/**\r
+  * @brief  Disables the Display.\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+void LCD_DisplayOff(void)\r
+{\r
+    /* Display Off */\r
+    LCD_WriteCommand(LCD_DISPLAY_OFF);\r
+}\r
+\r
+/**\r
+  * @brief  Configures LCD control lines in Output Push-Pull mode.\r
+  * @note   The LCD_NCS line can be configured in Open Drain mode\r
+  *         when VDDIO is lower than required LCD supply.\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+void LCD_CtrlLinesConfig(void)\r
+{\r
+  GPIO_InitTypeDef GPIO_InitStructure;\r
+\r
+  /* Enable GPIOs clock*/\r
+  RCC_AHB1PeriphClockCmd(LCD_NCS_GPIO_CLK | LCD_WRX_GPIO_CLK, ENABLE);\r
+\r
+  /* Configure NCS in Output Push-Pull mode */\r
+  GPIO_InitStructure.GPIO_Pin = LCD_NCS_PIN;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+  GPIO_Init(LCD_NCS_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* Configure WRX in Output Push-Pull mode */\r
+  GPIO_InitStructure.GPIO_Pin = LCD_WRX_PIN;\r
+  GPIO_Init(LCD_WRX_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* Set chip select pin high */\r
+  LCD_CtrlLinesWrite(LCD_NCS_GPIO_PORT, LCD_NCS_PIN, Bit_SET);\r
+}\r
+\r
+/**\r
+  * @brief  Sets or reset LCD control lines.\r
+  * @param  GPIOx: where x can be B or D to select the GPIO peripheral.\r
+  * @param  CtrlPins: the Control line.\r
+  *   This parameter can be:\r
+  *     @arg LCD_NCS_PIN: Chip Select pin\r
+  *     @arg LCD_NWR_PIN: Read/Write Selection pin\r
+  *     @arg LCD_RS_PIN: Register/RAM Selection pin\r
+  * @param  BitVal: specifies the value to be written to the selected bit.\r
+  *   This parameter can be:\r
+  *     @arg Bit_RESET: to clear the port pin\r
+  *     @arg Bit_SET: to set the port pin\r
+  * @retval None\r
+  */\r
+void LCD_CtrlLinesWrite(GPIO_TypeDef* GPIOx, uint16_t CtrlPins, BitAction BitVal)\r
+{\r
+  /* Set or Reset the control line */\r
+  GPIO_WriteBit(GPIOx, (uint16_t)CtrlPins, (BitAction)BitVal);\r
+}\r
+\r
+/**\r
+  * @brief  Configures the LCD_SPI interface.\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+void LCD_SPIConfig(void)\r
+{\r
+  SPI_InitTypeDef    SPI_InitStructure;\r
+  GPIO_InitTypeDef   GPIO_InitStructure;\r
+\r
+  /* Enable LCD_SPI_SCK_GPIO_CLK, LCD_SPI_MISO_GPIO_CLK and LCD_SPI_MOSI_GPIO_CLK clock */\r
+  RCC_AHB1PeriphClockCmd(LCD_SPI_SCK_GPIO_CLK | LCD_SPI_MISO_GPIO_CLK | LCD_SPI_MOSI_GPIO_CLK, ENABLE);\r
+\r
+  /* Enable LCD_SPI and SYSCFG clock  */\r
+  RCC_APB2PeriphClockCmd(LCD_SPI_CLK, ENABLE);\r
+\r
+  /* Configure LCD_SPI SCK pin */\r
+  GPIO_InitStructure.GPIO_Pin = LCD_SPI_SCK_PIN;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz;\r
+  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;\r
+  GPIO_Init(LCD_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* Configure LCD_SPI MISO pin */\r
+  GPIO_InitStructure.GPIO_Pin = LCD_SPI_MISO_PIN;\r
+  GPIO_Init(LCD_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* Configure LCD_SPI MOSI pin */\r
+  GPIO_InitStructure.GPIO_Pin = LCD_SPI_MOSI_PIN;\r
+  GPIO_Init(LCD_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);\r
+\r
+  /* Connect SPI SCK */\r
+  GPIO_PinAFConfig(LCD_SPI_SCK_GPIO_PORT, LCD_SPI_SCK_SOURCE, LCD_SPI_SCK_AF);\r
+\r
+  /* Connect SPI MISO */\r
+  GPIO_PinAFConfig(LCD_SPI_MISO_GPIO_PORT, LCD_SPI_MISO_SOURCE, LCD_SPI_MISO_AF);\r
+\r
+  /* Connect SPI MOSI */\r
+  GPIO_PinAFConfig(LCD_SPI_MOSI_GPIO_PORT, LCD_SPI_MOSI_SOURCE, LCD_SPI_MOSI_AF);\r
+\r
+  SPI_I2S_DeInit(LCD_SPI);\r
+\r
+  /* SPI configuration -------------------------------------------------------*/\r
+  /* If the SPI peripheral is already enabled, don't reconfigure it */\r
+  if ((LCD_SPI->CR1 & SPI_CR1_SPE) == 0)\r
+  {\r
+    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;\r
+    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;\r
+    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;\r
+    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;\r
+    SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge;\r
+    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;\r
+    /* SPI baudrate is set to 5.6 MHz (PCLK2/SPI_BaudRatePrescaler = 90/16 = 5.625 MHz)\r
+       to verify these constraints:\r
+          - ILI9341 LCD SPI interface max baudrate is 10MHz for write and 6.66MHz for read\r
+          - l3gd20 SPI interface max baudrate is 10MHz for write/read\r
+          - PCLK2 frequency is set to 90 MHz\r
+       */\r
+    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16;\r
+    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;\r
+    SPI_InitStructure.SPI_CRCPolynomial = 7;\r
+    SPI_Init(LCD_SPI, &SPI_InitStructure);\r
+\r
+    /* Enable L3GD20_SPI  */\r
+    SPI_Cmd(LCD_SPI, ENABLE);\r
+  }\r
+}\r
+\r
+/**\r
+  * @brief  GPIO config for LTDC.\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+static void LCD_AF_GPIOConfig(void)\r
+{\r
+  GPIO_InitTypeDef GPIO_InitStruct;\r
+\r
+  /* Enable GPIOA, GPIOB, GPIOC, GPIOD, GPIOF, GPIOG AHB Clocks */\r
+  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB | \\r
+                         RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | \\r
+                         RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE);\r
+\r
+/* GPIOs Configuration */\r
+/*\r
+ +------------------------+-----------------------+----------------------------+\r
+ +                       LCD pins assignment                                   +\r
+ +------------------------+-----------------------+----------------------------+\r
+ |  LCD_TFT R2 <-> PC.10  |  LCD_TFT G2 <-> PA.06 |  LCD_TFT B2 <-> PD.06      |\r
+ |  LCD_TFT R3 <-> PB.00  |  LCD_TFT G3 <-> PG.10 |  LCD_TFT B3 <-> PG.11      |\r
+ |  LCD_TFT R4 <-> PA.11  |  LCD_TFT G4 <-> PB.10 |  LCD_TFT B4 <-> PG.12      |\r
+ |  LCD_TFT R5 <-> PA.12  |  LCD_TFT G5 <-> PB.11 |  LCD_TFT B5 <-> PA.03      |\r
+ |  LCD_TFT R6 <-> PB.01  |  LCD_TFT G6 <-> PC.07 |  LCD_TFT B6 <-> PB.08      |\r
+ |  LCD_TFT R7 <-> PG.06  |  LCD_TFT G7 <-> PD.03 |  LCD_TFT B7 <-> PB.09      |\r
+ -------------------------------------------------------------------------------\r
+          |  LCD_TFT HSYNC <-> PC.06  | LCDTFT VSYNC <->  PA.04 |\r
+          |  LCD_TFT CLK   <-> PG.07  | LCD_TFT DE   <->  PF.10 |\r
+           -----------------------------------------------------\r
+\r
+*/\r
+\r
+ /* GPIOA configuration */\r
+  GPIO_PinAFConfig(GPIOA, GPIO_PinSource3, GPIO_AF_LTDC);\r
+  GPIO_PinAFConfig(GPIOA, GPIO_PinSource4, GPIO_AF_LTDC);\r
+  GPIO_PinAFConfig(GPIOA, GPIO_PinSource6, GPIO_AF_LTDC);\r
+  GPIO_PinAFConfig(GPIOA, GPIO_PinSource11, GPIO_AF_LTDC);\r
+  GPIO_PinAFConfig(GPIOA, GPIO_PinSource12, GPIO_AF_LTDC);\r
+\r
+  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_6 | \\r
+                             GPIO_Pin_11 | GPIO_Pin_12;\r
+\r
+  GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;\r
+  GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF;\r
+  GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;\r
+  GPIO_Init(GPIOA, &GPIO_InitStruct);\r
+\r
+ /* GPIOB configuration */\r
+  GPIO_PinAFConfig(GPIOB, GPIO_PinSource0, 0x09);\r
+  GPIO_PinAFConfig(GPIOB, GPIO_PinSource1, 0x09);\r
+  GPIO_PinAFConfig(GPIOB, GPIO_PinSource8, GPIO_AF_LTDC);\r
+  GPIO_PinAFConfig(GPIOB, GPIO_PinSource9, GPIO_AF_LTDC);\r
+  GPIO_PinAFConfig(GPIOB, GPIO_PinSource10, GPIO_AF_LTDC);\r
+  GPIO_PinAFConfig(GPIOB, GPIO_PinSource11, GPIO_AF_LTDC);\r
+\r
+  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | \\r
+                             GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;\r
+\r
+  GPIO_Init(GPIOB, &GPIO_InitStruct);\r
+\r
+ /* GPIOC configuration */\r
+  GPIO_PinAFConfig(GPIOC, GPIO_PinSource6, GPIO_AF_LTDC);\r
+  GPIO_PinAFConfig(GPIOC, GPIO_PinSource7, GPIO_AF_LTDC);\r
+  GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_LTDC);\r
+\r
+  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10;\r
+\r
+  GPIO_Init(GPIOC, &GPIO_InitStruct);\r
+\r
+ /* GPIOD configuration */\r
+  GPIO_PinAFConfig(GPIOD, GPIO_PinSource3, GPIO_AF_LTDC);\r
+  GPIO_PinAFConfig(GPIOD, GPIO_PinSource6, GPIO_AF_LTDC);\r
+\r
+  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_6;\r
+\r
+  GPIO_Init(GPIOD, &GPIO_InitStruct);\r
+\r
+ /* GPIOF configuration */\r
+  GPIO_PinAFConfig(GPIOF, GPIO_PinSource10, GPIO_AF_LTDC);\r
+\r
+  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10;\r
+\r
+  GPIO_Init(GPIOF, &GPIO_InitStruct);\r
+\r
+ /* GPIOG configuration */\r
+  GPIO_PinAFConfig(GPIOG, GPIO_PinSource6, GPIO_AF_LTDC);\r
+  GPIO_PinAFConfig(GPIOG, GPIO_PinSource7, GPIO_AF_LTDC);\r
+  GPIO_PinAFConfig(GPIOG, GPIO_PinSource10, 0x09);\r
+  GPIO_PinAFConfig(GPIOG, GPIO_PinSource11, GPIO_AF_LTDC);\r
+  GPIO_PinAFConfig(GPIOG, GPIO_PinSource12, 0x09);\r
+\r
+  GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7 | GPIO_Pin_10 | \\r
+                             GPIO_Pin_11 | GPIO_Pin_12;\r
+\r
+  GPIO_Init(GPIOG, &GPIO_InitStruct);\r
+\r
+}\r
+\r
+/**\r
+  * @brief  Displays a pixel.\r
+  * @param  x: pixel x.\r
+  * @param  y: pixel y.\r
+  * @retval None\r
+  */\r
+static void PutPixel(int16_t x, int16_t y)\r
+{\r
+  if(x < 0 || x > 239 || y < 0 || y > 319)\r
+  {\r
+    return;\r
+  }\r
+  LCD_DrawLine(x, y, 1, LCD_DIR_HORIZONTAL);\r
+}\r
+\r
+#ifndef USE_Delay\r
+/**\r
+  * @brief  Inserts a delay time.\r
+  * @param  nCount: specifies the delay time length.\r
+  * @retval None\r
+  */\r
+static void delay(__IO uint32_t nCount)\r
+{\r
+  __IO uint32_t index = 0;\r
+  for(index = nCount; index != 0; index--)\r
+  {\r
+  }\r
+}\r
+#endif /* USE_Delay*/\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r
diff --git a/lib/stm32f429i_discovery_lcd.h b/lib/stm32f429i_discovery_lcd.h
new file mode 100755 (executable)
index 0000000..2a2965b
--- /dev/null
@@ -0,0 +1,334 @@
+/**\r
+  ******************************************************************************\r
+  * @file    stm32f429i_discovery_lcd.h\r
+  * @author  MCD Application Team\r
+  * @version V1.0.1\r
+  * @date    28-October-2013\r
+  * @brief   This file contains all the functions prototypes for the \r
+  *          stm32f429i_discovery_lcd.c driver.\r
+  ******************************************************************************\r
+  * @attention\r
+  *\r
+  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>\r
+  *\r
+  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+  * You may not use this file except in compliance with the License.\r
+  * You may obtain a copy of the License at:\r
+  *\r
+  *        http://www.st.com/software_license_agreement_liberty_v2\r
+  *\r
+  * Unless required by applicable law or agreed to in writing, software \r
+  * distributed under the License is distributed on an "AS IS" BASIS, \r
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+  * See the License for the specific language governing permissions and\r
+  * limitations under the License.\r
+  *\r
+  ******************************************************************************\r
+  */\r
+\r
+/* Define to prevent recursive inclusion -------------------------------------*/\r
+#ifndef __STM32F429I_DISCOVERY_LCD_H\r
+#define __STM32F429I_DISCOVERY_LCD_H\r
+\r
+#ifdef __cplusplus\r
+ extern "C" {\r
+#endif \r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32f4xx.h"\r
+#include "stm32f429i_discovery.h"\r
+#include "stm32f429i_discovery_sdram.h"\r
+#include "fonts.h"\r
+\r
+/** @addtogroup Utilities\r
+  * @{\r
+  */\r
+\r
+/** @addtogroup STM32F4_DISCOVERY\r
+  * @{\r
+  */ \r
+\r
+/** @addtogroup STM32F429I_DISCOVERY\r
+  * @{\r
+  */\r
+    \r
+/** @addtogroup STM32F429I_DISCOVERY_LCD\r
+  * @{\r
+  */ \r
+\r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Exported_Types\r
+  * @{\r
+  */\r
+typedef struct \r
+{\r
+  int16_t X;\r
+  int16_t Y;\r
+} Point, * pPoint;   \r
+/**\r
+  * @}\r
+  */ \r
+\r
+/** @defgroup stm32f429i_discovery_LCD_Exported_Constants\r
+  * @{\r
+  */ \r
+\r
+/* LCD Size (Width and Height) */\r
+#define  LCD_PIXEL_WIDTH    ((uint16_t)240)\r
+#define  LCD_PIXEL_HEIGHT   ((uint16_t)320)\r
+\r
+#define LCD_FRAME_BUFFER       ((uint32_t)0xD0000000)\r
+#define BUFFER_OFFSET          ((uint32_t)0x50000) \r
+/**\r
+ * @brief Uncomment the line below if you want to use user defined Delay function\r
+ *        (for precise timing), otherwise default _delay_ function defined within\r
+ *         this driver is used (less precise timing).  \r
+ */\r
+/* #define USE_Delay */\r
+\r
+#ifdef USE_Delay\r
+#include "main.h" \r
+  #define _delay_     Delay  /* !< User can provide more timing precise _delay_ function\r
+                                   (with 10ms time base), using SysTick for example */\r
+#else\r
+  #define _delay_     delay      /* !< Default _delay_ function with less precise timing */\r
+#endif\r
+\r
+\r
+/** \r
+  * @brief  LCD Control pin  \r
+  */ \r
+#define LCD_NCS_PIN             GPIO_Pin_2                  \r
+#define LCD_NCS_GPIO_PORT       GPIOC                      \r
+#define LCD_NCS_GPIO_CLK        RCC_AHB1Periph_GPIOC \r
+\r
+/** \r
+  * @brief  LCD Command/data pin  \r
+  */\r
+#define LCD_WRX_PIN             GPIO_Pin_13                  \r
+#define LCD_WRX_GPIO_PORT       GPIOD\r
+#define LCD_WRX_GPIO_CLK        RCC_AHB1Periph_GPIOD \r
+\r
+/** \r
+  * @brief  LCD SPI Interface pins \r
+  */ \r
+#define LCD_SPI_SCK_PIN               GPIO_Pin_7                     /* PF.07 */\r
+#define LCD_SPI_SCK_GPIO_PORT         GPIOF                          /* GPIOF */\r
+#define LCD_SPI_SCK_GPIO_CLK          RCC_AHB1Periph_GPIOF  \r
+#define LCD_SPI_SCK_SOURCE            GPIO_PinSource7\r
+#define LCD_SPI_SCK_AF                GPIO_AF_SPI5\r
+#define LCD_SPI_MISO_PIN              GPIO_Pin_8                     /* PF.08 */\r
+#define LCD_SPI_MISO_GPIO_PORT        GPIOF                          /* GPIOF */\r
+#define LCD_SPI_MISO_GPIO_CLK         RCC_AHB1Periph_GPIOF  \r
+#define LCD_SPI_MISO_SOURCE           GPIO_PinSource8\r
+#define LCD_SPI_MISO_AF               GPIO_AF_SPI5\r
+#define LCD_SPI_MOSI_PIN              GPIO_Pin_9                     /* PF.09 */\r
+#define LCD_SPI_MOSI_GPIO_PORT        GPIOF                          /* GPIOF */\r
+#define LCD_SPI_MOSI_GPIO_CLK         RCC_AHB1Periph_GPIOF  \r
+#define LCD_SPI_MOSI_SOURCE           GPIO_PinSource9\r
+#define LCD_SPI_MOSI_AF               GPIO_AF_SPI5\r
+#define LCD_SPI                       SPI5\r
+#define LCD_SPI_CLK                   RCC_APB2Periph_SPI5 \r
+\r
+/** \r
+  * @brief  LCD Registers  \r
+  */ \r
+#define LCD_SLEEP_OUT            0x11   /* Sleep out register */\r
+#define LCD_GAMMA                0x26   /* Gamma register */\r
+#define LCD_DISPLAY_OFF          0x28   /* Display off register */\r
+#define LCD_DISPLAY_ON           0x29   /* Display on register */\r
+#define LCD_COLUMN_ADDR          0x2A   /* Colomn address register */ \r
+#define LCD_PAGE_ADDR            0x2B   /* Page address register */ \r
+#define LCD_GRAM                 0x2C   /* GRAM register */   \r
+#define LCD_MAC                  0x36   /* Memory Access Control register*/\r
+#define LCD_PIXEL_FORMAT         0x3A   /* Pixel Format register */\r
+#define LCD_WDB                  0x51   /* Write Brightness Display register */\r
+#define LCD_WCD                  0x53   /* Write Control Display register*/\r
+#define LCD_RGB_INTERFACE        0xB0   /* RGB Interface Signal Control */\r
+#define LCD_FRC                  0xB1   /* Frame Rate Control register */\r
+#define LCD_BPC                  0xB5   /* Blanking Porch Control register*/\r
+#define LCD_DFC                  0xB6   /* Display Function Control register*/\r
+#define LCD_POWER1               0xC0   /* Power Control 1 register */\r
+#define LCD_POWER2               0xC1   /* Power Control 2 register */\r
+#define LCD_VCOM1                0xC5   /* VCOM Control 1 register */\r
+#define LCD_VCOM2                0xC7   /* VCOM Control 2 register */\r
+#define LCD_POWERA               0xCB   /* Power control A register */\r
+#define LCD_POWERB               0xCF   /* Power control B register */\r
+#define LCD_PGAMMA               0xE0   /* Positive Gamma Correction register*/\r
+#define LCD_NGAMMA               0xE1   /* Negative Gamma Correction register*/\r
+#define LCD_DTCA                 0xE8   /* Driver timing control A */\r
+#define LCD_DTCB                 0xEA   /* Driver timing control B */\r
+#define LCD_POWER_SEQ            0xED   /* Power on sequence register */\r
+#define LCD_3GAMMA_EN            0xF2   /* 3 Gamma enable register */\r
+#define LCD_INTERFACE            0xF6   /* Interface control register */\r
+#define LCD_PRC                  0xF7   /* Pump ratio control register */\r
+\r
+/** \r
+  * @brief  LCD color  \r
+  */ \r
+#define LCD_COLOR_WHITE          0xFFFF\r
+#define LCD_COLOR_BLACK          0x0000\r
+#define LCD_COLOR_GREY           0xF7DE\r
+#define LCD_COLOR_BLUE           0x001F\r
+#define LCD_COLOR_BLUE2          0x051F\r
+#define LCD_COLOR_RED            0xF800\r
+#define LCD_COLOR_MAGENTA        0xF81F\r
+#define LCD_COLOR_GREEN          0x07E0\r
+#define LCD_COLOR_CYAN           0x7FFF\r
+#define LCD_COLOR_YELLOW         0xFFE0\r
+\r
+/** \r
+  * @brief  LCD Lines depending on the chosen fonts.  \r
+  */\r
+#define LCD_LINE_0               LINE(0)\r
+#define LCD_LINE_1               LINE(1)\r
+#define LCD_LINE_2               LINE(2)\r
+#define LCD_LINE_3               LINE(3)\r
+#define LCD_LINE_4               LINE(4)\r
+#define LCD_LINE_5               LINE(5)\r
+#define LCD_LINE_6               LINE(6)\r
+#define LCD_LINE_7               LINE(7)\r
+#define LCD_LINE_8               LINE(8)\r
+#define LCD_LINE_9               LINE(9)\r
+#define LCD_LINE_10              LINE(10)\r
+#define LCD_LINE_11              LINE(11)\r
+#define LCD_LINE_12              LINE(12)\r
+#define LCD_LINE_13              LINE(13)\r
+#define LCD_LINE_14              LINE(14)\r
+#define LCD_LINE_15              LINE(15)\r
+#define LCD_LINE_16              LINE(16)\r
+#define LCD_LINE_17              LINE(17)\r
+#define LCD_LINE_18              LINE(18)\r
+#define LCD_LINE_19              LINE(19)\r
+#define LCD_LINE_20              LINE(20)\r
+#define LCD_LINE_21              LINE(21)\r
+#define LCD_LINE_22              LINE(22)\r
+#define LCD_LINE_23              LINE(23)\r
+#define LCD_LINE_24              LINE(24)\r
+#define LCD_LINE_25              LINE(25)\r
+#define LCD_LINE_26              LINE(26)\r
+#define LCD_LINE_27              LINE(27)\r
+#define LCD_LINE_28              LINE(28)\r
+#define LCD_LINE_29              LINE(29)\r
+#define LCD_LINE_30              LINE(30)\r
+#define LCD_LINE_31              LINE(31)\r
+#define LCD_LINE_32              LINE(32)\r
+#define LCD_LINE_33              LINE(33)\r
+#define LCD_LINE_34              LINE(34)\r
+#define LCD_LINE_35              LINE(35)\r
+#define LCD_LINE_36              LINE(36)\r
+#define LCD_LINE_37              LINE(37)\r
+#define LCD_LINE_38              LINE(38)\r
+#define LCD_LINE_39              LINE(39)\r
+\r
+/** \r
+  * @brief LCD default font \r
+  */ \r
+#define LCD_DEFAULT_FONT         Font16x24\r
+\r
+/** \r
+  * @brief  LCD Direction  \r
+  */ \r
+#define LCD_DIR_HORIZONTAL       0x0000\r
+#define LCD_DIR_VERTICAL         0x0001\r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/** \r
+  * @brief  LCD Layer  \r
+  */ \r
+#define LCD_BACKGROUND_LAYER     0x0000\r
+#define LCD_FOREGROUND_LAYER     0x0001\r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Exported_Macros\r
+  * @{\r
+  */ \r
+#define ASSEMBLE_RGB(R, G, B)    ((((R)& 0xF8) << 8) | (((G) & 0xFC) << 3) | (((B) & 0xF8) >> 3))  \r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/** @defgroup STM32F429I_DISCOVERY_LCD_Exported_Functions\r
+  * @{\r
+  */ \r
+void     LCD_DeInit(void);   \r
+void     LCD_Init(void);\r
+void     LCD_LayerInit(void);\r
+void     LCD_ChipSelect(FunctionalState NewState);\r
+void     LCD_SetLayer(uint32_t Layerx);\r
+void     LCD_SetColors(uint16_t _TextColor, uint16_t _BackColor); \r
+void     LCD_GetColors(uint16_t *_TextColor, uint16_t *_BackColor);\r
+void     LCD_SetTextColor(uint16_t Color);\r
+void     LCD_SetBackColor(uint16_t Color);\r
+void     LCD_SetTransparency(uint8_t transparency);\r
+void     LCD_ClearLine(uint16_t Line);\r
+void     LCD_Clear(uint16_t Color);\r
+uint32_t LCD_SetCursor(uint16_t Xpos, uint16_t Ypos);\r
+void     LCD_SetColorKeying(uint32_t RGBValue);\r
+void     LCD_ReSetColorKeying(void);\r
+void     LCD_DrawChar(uint16_t Xpos, uint16_t Ypos, const uint16_t *c);\r
+void     LCD_DisplayChar(uint16_t Line, uint16_t Column, uint8_t Ascii);\r
+void     LCD_SetFont(sFONT *fonts);\r
+sFONT *  LCD_GetFont(void);\r
+void     LCD_DisplayStringLine(uint16_t Line, uint8_t *ptr);\r
+void     LCD_SetDisplayWindow(uint16_t Xpos, uint16_t Ypos, uint16_t Height, uint16_t Width);\r
+void     LCD_WindowModeDisable(void);\r
+void     LCD_DrawLine(uint16_t Xpos, uint16_t Ypos, uint16_t Length, uint8_t Direction);\r
+void     LCD_DrawRect(uint16_t Xpos, uint16_t Ypos, uint16_t Height, uint16_t Width);\r
+void     LCD_DrawCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius);\r
+void     LCD_DrawEllipse(int Xpos, int Ypos, int Radius, int Radius2);\r
+void     LCD_DrawFullEllipse(int Xpos, int Ypos, int Radius, int Radius2);\r
+void     LCD_DrawMonoPict(const uint32_t *Pict);\r
+void     LCD_WriteBMP(uint32_t BmpAddress);\r
+void     LCD_DrawUniLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2);\r
+void     LCD_DrawFullRect(uint16_t Xpos, uint16_t Ypos, uint16_t Width, uint16_t Height);\r
+void     LCD_DrawFullCircle(uint16_t Xpos, uint16_t Ypos, uint16_t Radius);\r
+void     LCD_PolyLine(pPoint Points, uint16_t PointCount);\r
+void     LCD_PolyLineRelative(pPoint Points, uint16_t PointCount);\r
+void     LCD_ClosedPolyLine(pPoint Points, uint16_t PointCount);\r
+void     LCD_ClosedPolyLineRelative(pPoint Points, uint16_t PointCount);\r
+void     LCD_FillPolyLine(pPoint Points, uint16_t PointCount);\r
+void     LCD_Triangle(pPoint Points, uint16_t PointCount);\r
+void     LCD_FillTriangle(uint16_t x1, uint16_t x2, uint16_t x3, uint16_t y1, uint16_t y2, uint16_t y3);\r
+void     LCD_WriteCommand(uint8_t LCD_Reg);\r
+void     LCD_WriteData(uint8_t value);\r
+void     LCD_PowerOn(void);\r
+void     LCD_DisplayOn(void);\r
+void     LCD_DisplayOff(void);\r
+void     LCD_CtrlLinesConfig(void);\r
+void     LCD_CtrlLinesWrite(GPIO_TypeDef* GPIOx, uint16_t CtrlPins, BitAction BitVal);\r
+void     LCD_SPIConfig(void);\r
+/**\r
+  * @}\r
+  */    \r
+  \r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __STM32F429I_DISCOVERY_LCD_H */\r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */ \r
+\r
+/**\r
+  * @}\r
+  */\r
+  \r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r
diff --git a/lib/stm32f429i_discovery_sdram.c b/lib/stm32f429i_discovery_sdram.c
new file mode 100755 (executable)
index 0000000..443644f
--- /dev/null
@@ -0,0 +1,430 @@
+/**\r
+  ******************************************************************************\r
+  * @file    stm32f429i_discovery_sdram.c\r
+  * @author  MCD Application Team\r
+  * @version V1.0.1\r
+  * @date    28-October-2013\r
+  * @brief   This file provides a set of functions needed to drive the\r
+  *          IS42S16400J SDRAM memory mounted on STM32F429I-DISCO Kit.    \r
+  ******************************************************************************\r
+  * @attention\r
+  *\r
+  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>\r
+  *\r
+  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+  * You may not use this file except in compliance with the License.\r
+  * You may obtain a copy of the License at:\r
+  *\r
+  *        http://www.st.com/software_license_agreement_liberty_v2\r
+  *\r
+  * Unless required by applicable law or agreed to in writing, software \r
+  * distributed under the License is distributed on an "AS IS" BASIS, \r
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+  * See the License for the specific language governing permissions and\r
+  * limitations under the License.\r
+  *\r
+  ******************************************************************************\r
+  */\r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32f429i_discovery_sdram.h"\r
+#include "stm32f4xx_fmc.h"\r
+/** @addtogroup Utilities\r
+  * @{\r
+  */ \r
+\r
+/** @addtogroup STM32F4_DISCOVERY\r
+  * @{\r
+  */ \r
+\r
+/** @addtogroup STM32429I_DISCO\r
+  * @{\r
+  */\r
+  \r
+/** @addtogroup STM32429I_DISCO_SDRAM\r
+  * @brief     This file provides a set of functions needed to drive the \r
+  *            IS42S16400J SDRAM memory mounted on STM32429I-DISCO board.\r
+  * @{\r
+  */ \r
+\r
+/** @defgroup STM32429I_DISCO_SDRAM_Private_Functions\r
+  * @{\r
+  */\r
+\r
+#ifndef USE_Delay\r
+static void delay(__IO uint32_t nCount);\r
+#endif /* USE_Delay*/\r
+\r
+/**\r
+  * @brief  Configures the FMC and GPIOs to interface with the SDRAM memory.\r
+  *         This function must be called before any read/write operation\r
+  *         on the SDRAM.\r
+  * @param  None\r
+  * @retval None\r
+  */\r
+void SDRAM_Init(void)\r
+{\r
+  FMC_SDRAMInitTypeDef  FMC_SDRAMInitStructure;\r
+  FMC_SDRAMTimingInitTypeDef  FMC_SDRAMTimingInitStructure; \r
+  \r
+  /* GPIO configuration for FMC SDRAM bank */\r
+  SDRAM_GPIOConfig();\r
+  \r
+  /* Enable FMC clock */\r
+  RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FMC, ENABLE);\r
\r
+/* FMC Configuration ---------------------------------------------------------*/\r
+/* FMC SDRAM Bank configuration */   \r
+  /* Timing configuration for 90 Mhz of SD clock frequency (180Mhz/2) */\r
+  /* TMRD: 2 Clock cycles */\r
+  FMC_SDRAMTimingInitStructure.FMC_LoadToActiveDelay    = 2;      \r
+  /* TXSR: min=70ns (7x11.11ns) */\r
+  FMC_SDRAMTimingInitStructure.FMC_ExitSelfRefreshDelay = 7;\r
+  /* TRAS: min=42ns (4x11.11ns) max=120k (ns) */\r
+  FMC_SDRAMTimingInitStructure.FMC_SelfRefreshTime      = 4;\r
+  /* TRC:  min=70 (7x11.11ns) */        \r
+  FMC_SDRAMTimingInitStructure.FMC_RowCycleDelay        = 7;         \r
+  /* TWR:  min=1+ 7ns (1+1x11.11ns) */\r
+  FMC_SDRAMTimingInitStructure.FMC_WriteRecoveryTime    = 2;      \r
+  /* TRP:  20ns => 2x11.11ns */\r
+  FMC_SDRAMTimingInitStructure.FMC_RPDelay              = 2;                \r
+  /* TRCD: 20ns => 2x11.11ns */\r
+  FMC_SDRAMTimingInitStructure.FMC_RCDDelay             = 2;\r
+\r
+/* FMC SDRAM control configuration */\r
+  FMC_SDRAMInitStructure.FMC_Bank = FMC_Bank2_SDRAM;\r
+  /* Row addressing: [7:0] */\r
+  FMC_SDRAMInitStructure.FMC_ColumnBitsNumber = FMC_ColumnBits_Number_8b;\r
+  /* Column addressing: [11:0] */\r
+  FMC_SDRAMInitStructure.FMC_RowBitsNumber = FMC_RowBits_Number_12b;\r
+  FMC_SDRAMInitStructure.FMC_SDMemoryDataWidth = SDRAM_MEMORY_WIDTH;\r
+  FMC_SDRAMInitStructure.FMC_InternalBankNumber = FMC_InternalBank_Number_4;\r
+  FMC_SDRAMInitStructure.FMC_CASLatency = SDRAM_CAS_LATENCY; \r
+  FMC_SDRAMInitStructure.FMC_WriteProtection = FMC_Write_Protection_Disable;\r
+  FMC_SDRAMInitStructure.FMC_SDClockPeriod = SDCLOCK_PERIOD;  \r
+  FMC_SDRAMInitStructure.FMC_ReadBurst = SDRAM_READBURST;\r
+  FMC_SDRAMInitStructure.FMC_ReadPipeDelay = FMC_ReadPipe_Delay_1;\r
+  FMC_SDRAMInitStructure.FMC_SDRAMTimingStruct = &FMC_SDRAMTimingInitStructure;\r
+  \r
+  /* FMC SDRAM bank initialization */\r
+  FMC_SDRAMInit(&FMC_SDRAMInitStructure); \r
+  \r
+  /* FMC SDRAM device initialization sequence */\r
+  SDRAM_InitSequence(); \r
+  \r
+}\r
+\r
+/**\r
+  * @brief  Configures all SDRAM memory I/Os pins. \r
+  * @param  None. \r
+  * @retval None.\r
+  */\r
+void SDRAM_GPIOConfig(void)\r
+{\r
+  GPIO_InitTypeDef GPIO_InitStructure;\r
+  \r
+  /* Enable GPIOs clock */\r
+  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD |\r
+                         RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE);\r
+                            \r
+/*-- GPIOs Configuration -----------------------------------------------------*/\r
+/*\r
+ +-------------------+--------------------+--------------------+--------------------+\r
+ +                       SDRAM pins assignment                                      +\r
+ +-------------------+--------------------+--------------------+--------------------+\r
+ | PD0  <-> FMC_D2   | PE0  <-> FMC_NBL0  | PF0  <-> FMC_A0    | PG0  <-> FMC_A10   |\r
+ | PD1  <-> FMC_D3   | PE1  <-> FMC_NBL1  | PF1  <-> FMC_A1    | PG1  <-> FMC_A11   |\r
+ | PD8  <-> FMC_D13  | PE7  <-> FMC_D4    | PF2  <-> FMC_A2    | PG8  <-> FMC_SDCLK |\r
+ | PD9  <-> FMC_D14  | PE8  <-> FMC_D5    | PF3  <-> FMC_A3    | PG15 <-> FMC_NCAS  |\r
+ | PD10 <-> FMC_D15  | PE9  <-> FMC_D6    | PF4  <-> FMC_A4    |--------------------+ \r
+ | PD14 <-> FMC_D0   | PE10 <-> FMC_D7    | PF5  <-> FMC_A5    |   \r
+ | PD15 <-> FMC_D1   | PE11 <-> FMC_D8    | PF11 <-> FMC_NRAS  | \r
+ +-------------------| PE12 <-> FMC_D9    | PF12 <-> FMC_A6    | \r
+                     | PE13 <-> FMC_D10   | PF13 <-> FMC_A7    |    \r
+                     | PE14 <-> FMC_D11   | PF14 <-> FMC_A8    |\r
+                     | PE15 <-> FMC_D12   | PF15 <-> FMC_A9    |\r
+ +-------------------+--------------------+--------------------+\r
+ | PB5 <-> FMC_SDCKE1| \r
+ | PB6 <-> FMC_SDNE1 | \r
+ | PC0 <-> FMC_SDNWE |\r
+ +-------------------+  \r
+  \r
+*/\r
+  \r
+  /* Common GPIO configuration */\r
+  GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF;\r
+  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;\r
+  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;\r
+  GPIO_InitStructure.GPIO_PuPd  = GPIO_PuPd_NOPULL;\r
+\r
+  /* GPIOB configuration */\r
+  GPIO_PinAFConfig(GPIOB, GPIO_PinSource5 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOB, GPIO_PinSource6 , GPIO_AF_FMC);\r
+  \r
+  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5  | GPIO_Pin_6;      \r
+\r
+  GPIO_Init(GPIOB, &GPIO_InitStructure);  \r
+\r
+  /* GPIOC configuration */\r
+  GPIO_PinAFConfig(GPIOC, GPIO_PinSource0 , GPIO_AF_FMC);\r
+  \r
+  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;      \r
+\r
+  GPIO_Init(GPIOC, &GPIO_InitStructure);  \r
+  \r
+  /* GPIOD configuration */\r
+  GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FMC);\r
+\r
+  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1  | GPIO_Pin_8 |\r
+                                GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 |\r
+                                GPIO_Pin_15;\r
+\r
+  GPIO_Init(GPIOD, &GPIO_InitStructure);\r
+\r
+  /* GPIOE configuration */\r
+  GPIO_PinAFConfig(GPIOE, GPIO_PinSource0 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOE, GPIO_PinSource1 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOE, GPIO_PinSource10 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOE, GPIO_PinSource11 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOE, GPIO_PinSource12 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOE, GPIO_PinSource13 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOE, GPIO_PinSource14 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOE, GPIO_PinSource15 , GPIO_AF_FMC);\r
+\r
+  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1  | GPIO_Pin_7 |\r
+                                GPIO_Pin_8  | GPIO_Pin_9  | GPIO_Pin_10 |\r
+                                GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 |\r
+                                GPIO_Pin_14 | GPIO_Pin_15;\r
+\r
+  GPIO_Init(GPIOE, &GPIO_InitStructure);\r
+\r
+  /* GPIOF configuration */\r
+  GPIO_PinAFConfig(GPIOF, GPIO_PinSource0 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOF, GPIO_PinSource1 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOF, GPIO_PinSource2 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOF, GPIO_PinSource3 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOF, GPIO_PinSource4 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOF, GPIO_PinSource5 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOF, GPIO_PinSource11 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOF, GPIO_PinSource12 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOF, GPIO_PinSource13 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOF, GPIO_PinSource14 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOF, GPIO_PinSource15 , GPIO_AF_FMC);\r
+\r
+  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0  | GPIO_Pin_1 | GPIO_Pin_2 | \r
+                                GPIO_Pin_3  | GPIO_Pin_4 | GPIO_Pin_5 |\r
+                                GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 |\r
+                                GPIO_Pin_14 | GPIO_Pin_15;      \r
+\r
+  GPIO_Init(GPIOF, &GPIO_InitStructure);\r
+\r
+  /* GPIOG configuration */\r
+  GPIO_PinAFConfig(GPIOG, GPIO_PinSource0 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOG, GPIO_PinSource1 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOG, GPIO_PinSource4 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOG, GPIO_PinSource5 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOG, GPIO_PinSource8 , GPIO_AF_FMC);\r
+  GPIO_PinAFConfig(GPIOG, GPIO_PinSource15 , GPIO_AF_FMC);\r
+  \r
+\r
+  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 |\r
+                                GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_15;\r
+\r
+  GPIO_Init(GPIOG, &GPIO_InitStructure);    \r
+}\r
+\r
+/**\r
+  * @brief  Executes the SDRAM memory initialization sequence. \r
+  * @param  None. \r
+  * @retval None.\r
+  */\r
+void SDRAM_InitSequence(void)\r
+{\r
+  FMC_SDRAMCommandTypeDef FMC_SDRAMCommandStructure;\r
+  uint32_t tmpr = 0;\r
+  \r
+/* Step 3 --------------------------------------------------------------------*/\r
+  /* Configure a clock configuration enable command */\r
+  FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_CLK_Enabled;\r
+  FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_Command_Target_bank2;\r
+  FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;\r
+  FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;\r
+  /* Wait until the SDRAM controller is ready */ \r
+  while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)\r
+  {\r
+  }\r
+  /* Send the command */\r
+  FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);  \r
+  \r
+/* Step 4 --------------------------------------------------------------------*/\r
+  /* Insert 100 ms delay */\r
+  __Delay(10);\r
+    \r
+/* Step 5 --------------------------------------------------------------------*/\r
+  /* Configure a PALL (precharge all) command */ \r
+  FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_PALL;\r
+  FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_Command_Target_bank2;\r
+  FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;\r
+  FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;\r
+  /* Wait until the SDRAM controller is ready */ \r
+  while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)\r
+  {\r
+  }\r
+  /* Send the command */\r
+  FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);\r
+  \r
+/* Step 6 --------------------------------------------------------------------*/\r
+  /* Configure a Auto-Refresh command */ \r
+  FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_AutoRefresh;\r
+  FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_Command_Target_bank2;\r
+  FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 4;\r
+  FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = 0;\r
+  /* Wait until the SDRAM controller is ready */ \r
+  while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)\r
+  {\r
+  }\r
+  /* Send the  first command */\r
+  FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);\r
+  \r
+  /* Wait until the SDRAM controller is ready */ \r
+  while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)\r
+  {\r
+  }\r
+  /* Send the second command */\r
+  FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);\r
+  \r
+/* Step 7 --------------------------------------------------------------------*/\r
+  /* Program the external memory mode register */\r
+  tmpr = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_2          |\r
+                   SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |\r
+                   SDRAM_MODEREG_CAS_LATENCY_3           |\r
+                   SDRAM_MODEREG_OPERATING_MODE_STANDARD |\r
+                   SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;\r
+  \r
+  /* Configure a load Mode register command*/ \r
+  FMC_SDRAMCommandStructure.FMC_CommandMode = FMC_Command_Mode_LoadMode;\r
+  FMC_SDRAMCommandStructure.FMC_CommandTarget = FMC_Command_Target_bank2;\r
+  FMC_SDRAMCommandStructure.FMC_AutoRefreshNumber = 1;\r
+  FMC_SDRAMCommandStructure.FMC_ModeRegisterDefinition = tmpr;\r
+  /* Wait until the SDRAM controller is ready */ \r
+  while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)\r
+  {\r
+  }\r
+  /* Send the command */\r
+  FMC_SDRAMCmdConfig(&FMC_SDRAMCommandStructure);\r
+  \r
+/* Step 8 --------------------------------------------------------------------*/\r
+\r
+  /* Set the refresh rate counter */\r
+  /* (15.62 us x Freq) - 20 */\r
+  /* Set the device refresh counter */\r
+  FMC_SetRefreshCount(1386);\r
+  /* Wait until the SDRAM controller is ready */ \r
+  while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)\r
+  {\r
+  }\r
+}\r
+\r
+\r
+/**\r
+  * @brief  Writes a Entire-word buffer to the SDRAM memory. \r
+  * @param  pBuffer: pointer to buffer. \r
+  * @param  uwWriteAddress: SDRAM memory internal address from which the data will be \r
+  *         written.\r
+  * @param  uwBufferSize: number of words to write. \r
+  * @retval None.\r
+  */\r
+void SDRAM_WriteBuffer(uint32_t* pBuffer, uint32_t uwWriteAddress, uint32_t uwBufferSize)\r
+{\r
+  __IO uint32_t write_pointer = (uint32_t)uwWriteAddress;\r
+\r
+  /* Disable write protection */\r
+  FMC_SDRAMWriteProtectionConfig(FMC_Bank2_SDRAM, DISABLE);\r
+  \r
+  /* Wait until the SDRAM controller is ready */ \r
+  while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)\r
+  {\r
+  }\r
+\r
+  /* While there is data to write */\r
+  for (; uwBufferSize != 0; uwBufferSize--) \r
+  {\r
+    /* Transfer data to the memory */\r
+    *(uint32_t *) (SDRAM_BANK_ADDR + write_pointer) = *pBuffer++;\r
+\r
+    /* Increment the address*/\r
+    write_pointer += 4;\r
+  }\r
+    \r
+}\r
+\r
+/**\r
+  * @brief  Reads data buffer from the SDRAM memory. \r
+  * @param  pBuffer: pointer to buffer. \r
+  * @param  ReadAddress: SDRAM memory internal address from which the data will be \r
+  *         read.\r
+  * @param  uwBufferSize: number of words to write. \r
+  * @retval None.\r
+  */\r
+void SDRAM_ReadBuffer(uint32_t* pBuffer, uint32_t uwReadAddress, uint32_t uwBufferSize)\r
+{\r
+  __IO uint32_t write_pointer = (uint32_t)uwReadAddress;\r
+  \r
+   \r
+  /* Wait until the SDRAM controller is ready */ \r
+  while(FMC_GetFlagStatus(FMC_Bank2_SDRAM, FMC_FLAG_Busy) != RESET)\r
+  {\r
+  }\r
+  \r
+  /* Read data */\r
+  for(; uwBufferSize != 0x00; uwBufferSize--)\r
+  {\r
+   *pBuffer++ = *(__IO uint32_t *)(SDRAM_BANK_ADDR + write_pointer );\r
+    \r
+   /* Increment the address*/\r
+    write_pointer += 4;\r
+  } \r
+}\r
+\r
+#ifndef USE_Delay\r
+/**\r
+  * @brief  Inserts a delay time.\r
+  * @param  nCount: specifies the delay time length.\r
+  * @retval None\r
+  */\r
+static void delay(__IO uint32_t nCount)\r
+{\r
+  __IO uint32_t index = 0; \r
+  for(index = (100000 * nCount); index != 0; index--)\r
+  {\r
+  }\r
+}\r
+#endif /* USE_Delay */\r
+\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */  \r
+\r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r
diff --git a/lib/stm32f429i_discovery_sdram.h b/lib/stm32f429i_discovery_sdram.h
new file mode 100755 (executable)
index 0000000..0bf52f5
--- /dev/null
@@ -0,0 +1,165 @@
+/**\r
+  ******************************************************************************\r
+  * @file    stm32f429i_discovery_sdram.h\r
+  * @author  MCD Application Team\r
+  * @version V1.0.1\r
+  * @date    28-October-2013\r
+  * @brief   This file contains all the functions prototypes for the \r
+  *          stm324x9i_disco_sdram.c driver.\r
+  ******************************************************************************\r
+  * @attention\r
+  *\r
+  * <h2><center>&copy; COPYRIGHT 2013 STMicroelectronics</center></h2>\r
+  *\r
+  * Licensed under MCD-ST Liberty SW License Agreement V2, (the "License");\r
+  * You may not use this file except in compliance with the License.\r
+  * You may obtain a copy of the License at:\r
+  *\r
+  *        http://www.st.com/software_license_agreement_liberty_v2\r
+  *\r
+  * Unless required by applicable law or agreed to in writing, software \r
+  * distributed under the License is distributed on an "AS IS" BASIS, \r
+  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
+  * See the License for the specific language governing permissions and\r
+  * limitations under the License.\r
+  *\r
+  ******************************************************************************\r
+  */   \r
+\r
+/* Define to prevent recursive inclusion -------------------------------------*/\r
+#ifndef __STM32429I_DISCO_SDRAM_H\r
+#define __STM32429I_DISCO_SDRAM_H\r
+\r
+#ifdef __cplusplus\r
+ extern "C" {\r
+#endif\r
+\r
+/* Includes ------------------------------------------------------------------*/\r
+#include "stm32f4xx.h"\r
+\r
+/** @addtogroup Utilities\r
+  * @{\r
+  */\r
+  \r
+/** @addtogroup STM32F4_EVAL\r
+  * @{\r
+  */ \r
+\r
+/** @addtogroup STM32F429I_DISCOVERY\r
+  * @{\r
+  */\r
+  \r
+/** @addtogroup STM32F429I_DISCOVERY_SDRAM\r
+  * @{\r
+  */  \r
+  \r
+/** @defgroup STM32429I_DISCO_SDRAM_Private_Defines\r
+  * @{\r
+  */\r
+\r
+/**\r
+  * @brief  FMC SDRAM Bank address\r
+  */   \r
+#define SDRAM_BANK_ADDR     ((uint32_t)0xD0000000)\r
+  \r
+/**\r
+  * @brief  FMC SDRAM Memory Width\r
+  */  \r
+/* #define SDRAM_MEMORY_WIDTH   FMC_SDMemory_Width_8b  */\r
+#define SDRAM_MEMORY_WIDTH    FMC_SDMemory_Width_16b \r
+\r
+/**\r
+  * @brief  FMC SDRAM CAS Latency\r
+  */  \r
+/* #define SDRAM_CAS_LATENCY   FMC_CAS_Latency_2  */\r
+#define SDRAM_CAS_LATENCY    FMC_CAS_Latency_3\r
+\r
+/**\r
+  * @brief  FMC SDRAM Memory clock period\r
+  */  \r
+#define SDCLOCK_PERIOD    FMC_SDClock_Period_2        /* Default configuration used with LCD */\r
+/* #define SDCLOCK_PERIOD    FMC_SDClock_Period_3 */\r
+\r
+/**\r
+  * @brief  FMC SDRAM Memory Read Burst feature\r
+  */  \r
+#define SDRAM_READBURST    FMC_Read_Burst_Disable    /* Default configuration used with LCD */\r
+/* #define SDRAM_READBURST    FMC_Read_Burst_Enable  */\r
+\r
+/**\r
+  * @brief  FMC SDRAM Bank Remap\r
+  */    \r
+/* #define SDRAM_BANK_REMAP */   \r
+\r
+\r
+\r
+/**\r
+ * @brief Uncomment the line below if you want to use user defined Delay function\r
+ *        (for precise timing), otherwise default _delay_ function defined within\r
+ *         this driver is used (less precise timing).  \r
+ */\r
\r
+/* #define USE_Delay */\r
+\r
+#ifdef USE_Delay\r
+  #define __Delay     Delay      /*  User can provide more timing precise __Delay function\r
+                                    (with 10ms time base), using SysTick for example */\r
+#else\r
+  #define __Delay     delay      /*  Default __Delay function with less precise timing */\r
+#endif\r
+\r
+/**\r
+  * @brief  FMC SDRAM Mode definition register defines\r
+  */\r
+#define SDRAM_MODEREG_BURST_LENGTH_1             ((uint16_t)0x0000)\r
+#define SDRAM_MODEREG_BURST_LENGTH_2             ((uint16_t)0x0001)\r
+#define SDRAM_MODEREG_BURST_LENGTH_4             ((uint16_t)0x0002)\r
+#define SDRAM_MODEREG_BURST_LENGTH_8             ((uint16_t)0x0004)\r
+#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL      ((uint16_t)0x0000)\r
+#define SDRAM_MODEREG_BURST_TYPE_INTERLEAVED     ((uint16_t)0x0008)\r
+#define SDRAM_MODEREG_CAS_LATENCY_2              ((uint16_t)0x0020)\r
+#define SDRAM_MODEREG_CAS_LATENCY_3              ((uint16_t)0x0030)\r
+#define SDRAM_MODEREG_OPERATING_MODE_STANDARD    ((uint16_t)0x0000)\r
+#define SDRAM_MODEREG_WRITEBURST_MODE_PROGRAMMED ((uint16_t)0x0000) \r
+#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE     ((uint16_t)0x0200)      \r
+\r
+/**\r
+  * @}\r
+  */  \r
+\r
+/** @defgroup STM32429I_DISCO_SDRAM_Exported_Functions\r
+  * @{\r
+  */ \r
+void  SDRAM_Init(void);\r
+void  SDRAM_GPIOConfig(void);\r
+void  SDRAM_InitSequence(void);\r
+void  SDRAM_WriteBuffer(uint32_t* pBuffer, uint32_t uwWriteAddress, uint32_t uwBufferSize);\r
+void  SDRAM_ReadBuffer(uint32_t* pBuffer, uint32_t uwReadAddress, uint32_t uwBufferSize);\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* __STM32429I_DISCO_SDRAM_H */\r
+\r
+/**\r
+  * @}\r
+  */ \r
+  \r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */\r
+\r
+/**\r
+  * @}\r
+  */   \r
+\r
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/\r