/*****************************************************************************
LCD.c
Copyright(C) 2014, DevTeam
All rights reserved.
History
2014.06.06 First Release
******************************************************************************/
#include "GLCD.h"
#include "globals.h"
#include "AsciiLib.h"
#include <string.h>
uint8_t lcd_buffer[128];
/* Private define ------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
static uint8_t LcdAlpha[2];
static uint8_t LcdBrightness[2];
static void PWM_TimeInit(LCD_TYPE lcdType);
__inline void LCD_Write_Cmd( LCD_TYPE lcdType, uint8_t DL);
__inline void LCD_Write_Cmd_Data( LCD_TYPE lcdType, uint8_t x);
__inline void LCD_Write_Cmd( LCD_TYPE lcdType, uint8_t DL)
{
if(lcdType == INNER_LCD)
INNER_LCD_REG = DL;
else
OUTTER_LCD_REG = DL;
}
__inline void LCD_Write_Cmd_Data( LCD_TYPE lcdType, uint8_t x)
{
if(lcdType == INNER_LCD)
INNER_LCD_RAM = x;
else
OUTTER_LCD_RAM = x;
}
#if 0 // for no Warning
uint8_t LCD_Read_Cmd_Data(LCD_TYPE lcdType)
{
if(lcdType == INNER_LCD)
return INNER_LCD_RAM;
else
return OUTTER_LCD_RAM;
}
#endif
static __inline void LCD_Write_Cmd_Data16(LCD_TYPE lcdType, unsigned short y)
{
unsigned char m,n;
m = y >> 8;
n = y;
if(lcdType == INNER_LCD)
{
INNER_LCD_RAM = m;
INNER_LCD_RAM = n;
}
else
{
OUTTER_LCD_RAM = m;
OUTTER_LCD_RAM = n;
}
}
static void LCD_GPIOInit(LCD_TYPE lcdType)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable the GPIO Clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOH|RCC_AHB1Periph_GPIOI, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
if( lcdType == INNER_LCD )
{
/*
PON : PI10
BL : PF9
RST : PE6
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOI, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
GPIO_Init(GPIOE, &GPIO_InitStructure);
// Power ON
GPIOI->BSRRL = GPIO_Pin_10;
GPIOE->BSRRL = GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_Init(GPIOF, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOF, GPIO_PinSource9, GPIO_AF_TIM14);
}
else
{
/*
PON : PH2
BL : PI5
RST : PE5
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_Init(GPIOH, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOE, &GPIO_InitStructure);
// Power ON
GPIOH->BSRRL = GPIO_Pin_2;
GPIOE->BSRRL = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOI, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOI, GPIO_PinSource5, GPIO_AF_TIM8);
}
LCD_SetBacklight( lcdType, OFF );
}
/*******************************************************************************
* Function Name : LCD_CtrlLinesConfig
* Description : Configures LCD Control lines (FSMC Pins) in alternate function
Push-Pull mode.
* Input : None
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
static void LCD_CtrlLinesConfig(LCD_TYPE lcdType)
{
GPIO_InitTypeDef GPIO_InitStructure;
/* Enable GPIOD, GPIOE, GPIOF, GPIOG and AFIO clocks */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_GPIOG |
RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF, ENABLE);
/*-- GPIOs Configuration ------------------------------------------------------*/
/*
+-------------------+--------------------+------------------+------------------+
| PD0 <-> FSMC_D2 | | PG5 <-> FSMC_A15 |
| PD1 <-> FSMC_D3 | | PG10<-> FSMC_NE3 |
| PD4 <-> FSMC_NOE | PE7 <-> FSMC_D4 | PG12<-> FSMC_NE4 |
| PD5 <-> FSMC_NWE | PE8 <-> FSMC_D5 | |
| PD8 <-> FSMC_D13 | PE9 <-> FSMC_D6 |------------------+
| PD9 <-> FSMC_D14 | PE10 <-> FSMC_D7 |
| PD10 <-> FSMC_D15 | PE11 <-> FSMC_D8 |
| | PE12 <-> FSMC_D9 |
| | PE13 <-> FSMC_D10 |
| PD14 <-> FSMC_D0 | PE14 <-> FSMC_D11 |
| PD15 <-> FSMC_D1 | PE15 <-> FSMC_D12 |
+-------------------+--------------------+
*/
/*-- GPIO Configuration ------------------------------------------------------*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
/* SRAM Data & Address lines, NOE and NWE configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |
GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15 |
GPIO_Pin_4 | GPIO_Pin_5;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
GPIO_Pin_15;
GPIO_Init(GPIOE, &GPIO_InitStructure);
/* REG configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource0 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource4 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource8 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource9 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource7 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource8 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource9 , GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource10, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource11, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource12, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOE, GPIO_PinSource15, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOG, GPIO_PinSource5 , GPIO_AF_FSMC);
/* CS configuration */
if( lcdType == INNER_LCD )
{
// NE3
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOG, GPIO_PinSource10, GPIO_AF_FSMC);
}
else
{
// NE4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_Init(GPIOG, &GPIO_InitStructure);
GPIO_PinAFConfig(GPIOG, GPIO_PinSource12, GPIO_AF_FSMC);
}
}
/*******************************************************************************
* Function Name : LCD_FSMCConfig
* Description : Configures the Parallel interface (FSMC) for LCD(Parallel mode)
* Input : None
* Output : None
* Return : None
* Attention : None
*******************************************************************************/
static void LCD_FSMCConfig(LCD_TYPE lcdType)
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef FSMC_NORSRAMTimingInitStructure;
/* Enable FSMC clock */
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
/*-- FSMC Configuration ------------------------------------------------------*/
/*----------------------- SRAM Bank ----------------------------------------*/
/* FSMC_Bank1_NORSRAM4 configuration */
FSMC_NORSRA