195 lines
6.2 KiB
C++
195 lines
6.2 KiB
C++
/*
|
|
* ili9325.h
|
|
*
|
|
* Created on: 23 îêò. 2016 ã.
|
|
* Author: l-pro
|
|
*/
|
|
|
|
#ifndef ILI9325_DRIVER_H_
|
|
#define ILI9325_DRIVER_H_
|
|
|
|
#include "ili9325_registers.h"
|
|
|
|
namespace Ili9325 {
|
|
|
|
template<typename HardwareInterface>
|
|
class Driver {
|
|
public:
|
|
typedef HardwareInterface HW;
|
|
|
|
enum class FrameRate : uint8_t{
|
|
fr40 = 0,
|
|
fr43,
|
|
fr45,
|
|
fr48,
|
|
fr51,
|
|
fr55,
|
|
fr59,
|
|
fr64,
|
|
fr70,
|
|
fr77,
|
|
fr85,
|
|
fr96, //(default)
|
|
fr110,
|
|
fr128
|
|
};
|
|
|
|
struct GammaCurve {
|
|
uint16_t v[10];
|
|
};
|
|
|
|
static void write(uint16_t address, uint16_t data){
|
|
HW::setAddress(address);
|
|
HW::write(data);
|
|
}
|
|
|
|
static uint16_t read(uint16_t address, uint16_t data){
|
|
HW::setAddress(address);
|
|
return HW::read();
|
|
}
|
|
|
|
static void init(){
|
|
HW::reset();
|
|
|
|
write(Reg::DriverOutputControl::Address, Reg::DriverOutputControl::SS);
|
|
write(Reg::LcdDrivingControl::Address, Reg::LcdDrivingControl::BC0 | Reg::LcdDrivingControl::EOR); /* set 1 line inversion */
|
|
setOrientation(0);
|
|
|
|
write(Reg::ResizeControl::Address, 0); //Disable resizing
|
|
setBackAndFrontPorch(2, 2);
|
|
write(Reg::DisplayControl3::Address, 0); //Set non-display area refresh cycle ISC[3:0]
|
|
write(Reg::DisplayControl4::Address, 0); //FMARK function
|
|
write(Reg::RgbDisplayInterfaceControl1::Address, 0); // RGB interface setting
|
|
write(Reg::FrameMarkerPosition::Address, 0); //Frame marker Position
|
|
write(Reg::RgbDisplayInterfaceControl2::Address, 0); // RGB interface polarity
|
|
|
|
//Power On
|
|
write(Reg::PowerControl1::Address, 0); // SAP, BT[3:0], AP, DSTB, SLP, STB
|
|
write(Reg::PowerControl2::Address, REG_SET(Reg::PowerControl2, VC, 7));
|
|
write(Reg::PowerControl3::Address, 0); // VREG1OUT voltage
|
|
write(Reg::PowerControl4::Address, 0); // VDV[4:0] for VCOM amplitude
|
|
write(Reg::DisplayControl1::Address, Reg::DisplayControl1::D0);
|
|
HAL_Delay(200);
|
|
|
|
// Dis-charge capacitor power voltage
|
|
write(Reg::PowerControl1::Address, REG_SET(Reg::PowerControl1, AP, 1) | Reg::PowerControl1::APE | Reg::PowerControl1::SAP);
|
|
|
|
write(Reg::PowerControl2::Address,
|
|
REG_SET(Reg::PowerControl2, VC, 7) |
|
|
REG_SET(Reg::PowerControl2, DC0, 2) |
|
|
REG_SET(Reg::PowerControl2, DC1, 2));
|
|
HAL_Delay(50);
|
|
|
|
write(Reg::PowerControl3::Address, REG_SET(Reg::PowerControl3, VRH, 0xf) | Reg::PowerControl3::PON);
|
|
HAL_Delay(50);
|
|
|
|
write(Reg::PowerControl4::Address, REG_SET(Reg::PowerControl4, VDV, 0x15)); // VDV for VCOM amplitude
|
|
|
|
write(Reg::PowerControl7::Address, REG_SET(Reg::PowerControl7, VCM, 0x27)); // VCM for VCOMH
|
|
setFrameRate(FrameRate::fr128);
|
|
HAL_Delay(50);
|
|
|
|
//write(0x20, 0x0000); // GRAM horizontal Address
|
|
//write(0x21, 0x0000); // GRAM Vertical Address
|
|
|
|
//Set Gamma Curve
|
|
GammaCurve curve = {
|
|
0x0000,0x0707,0x0307,0x0200,0x0008,
|
|
0x0004,0x0000,0x0707,0x0002,0x1D04
|
|
};
|
|
setGammaCurve(curve);
|
|
|
|
//Set GRAM area
|
|
write(Reg::HorizontalAddressStartPosition::Address, 0); // Horizontal GRAM Start Address
|
|
write(Reg::HorizontalAddressEndPosition::Address, 239); // Horizontal GRAM End Address
|
|
write(Reg::VerticalAddressStartPosition::Address, 0); // Vertical GRAM Start Address
|
|
write(Reg::VerticalAddressEndPosition::Address, 319); // Vertical GRAM Start Address
|
|
write(Reg::DriverOutputControl2::Address, REG_SET(Reg::DriverOutputControl2, NL, 0x27) | Reg::DriverOutputControl2::GS); // Gate Scan Line
|
|
write(Reg::BaseImageDisplayControl::Address, Reg::BaseImageDisplayControl::REV);
|
|
write(Reg::VerticalScrollControl::Address, 0); // set scrolling line
|
|
|
|
//Partial Display Control
|
|
write(Reg::PartialImage1DisplayPosition::Address, 0);
|
|
write(Reg::PartialImage1StartLine::Address, 0);
|
|
write(Reg::PartialImage1EndLine::Address, 0);
|
|
write(Reg::PartialImage2DisplayPosition::Address, 0);
|
|
write(Reg::PartialImage2StartLine::Address, 0);
|
|
write(Reg::PartialImage2EndLine::Address, 0);
|
|
|
|
//Panel Control
|
|
write(Reg::PanelInterfaceControl1::Address, REG_SET(Reg::PanelInterfaceControl1, RTNI, 0x10));
|
|
write(Reg::PanelInterfaceControl2::Address, REG_SET(Reg::PanelInterfaceControl2, NOWI, 0x06));
|
|
write(Reg::DisplayControl1::Address,
|
|
Reg::DisplayControl1::D0 | Reg::DisplayControl1::D1 |
|
|
Reg::DisplayControl1::DTE | Reg::DisplayControl1::GON | Reg::DisplayControl1::BASEE); //display ON
|
|
|
|
HAL_Delay(50);
|
|
}
|
|
|
|
static void setGammaCurve(GammaCurve curve){
|
|
write(Reg::GammaControl1::Address, curve.v[0]);
|
|
write(Reg::GammaControl2::Address, curve.v[1]);
|
|
write(Reg::GammaControl3::Address, curve.v[2]);
|
|
write(Reg::GammaControl4::Address, curve.v[3]);
|
|
write(Reg::GammaControl5::Address, curve.v[4]);
|
|
write(Reg::GammaControl6::Address, curve.v[5]);
|
|
write(Reg::GammaControl7::Address, curve.v[6]);
|
|
write(Reg::GammaControl8::Address, curve.v[7]);
|
|
write(Reg::GammaControl9::Address, curve.v[8]);
|
|
write(Reg::GammaControl10::Address, curve.v[9]);
|
|
}
|
|
|
|
static void setFrameRate(FrameRate frameRate){
|
|
write(Reg::FrameRateAndColorControl::Address, REG_SET(Reg::FrameRateAndColorControl, FRS, (uint8_t)frameRate));
|
|
}
|
|
|
|
static bool setBackAndFrontPorch(uint8_t backPorch, uint8_t frontPorch){
|
|
if((backPorch < 2) || (frontPorch < 2) || ((backPorch + frontPorch) > 16)){
|
|
return false;
|
|
}
|
|
write(Reg::DisplayControl2::Address,
|
|
REG_SET(Reg::DisplayControl2, BP, backPorch) |
|
|
REG_SET(Reg::DisplayControl2, FP, frontPorch));
|
|
return true;
|
|
}
|
|
|
|
static void setOrientation(uint8_t orientation){
|
|
//TODO: remove BGR from here
|
|
if (orientation == 0){
|
|
write(Reg::EntryMode::Address, Reg::EntryMode::ID0 | Reg::EntryMode::ID1 | Reg::EntryMode::BGR);
|
|
}else if (orientation == 90){
|
|
write(Reg::EntryMode::Address, Reg::EntryMode::ID0 | Reg::EntryMode::AM | Reg::EntryMode::BGR);
|
|
}else if (orientation == 180){
|
|
write(Reg::EntryMode::Address, Reg::EntryMode::BGR);
|
|
}else if (orientation == 270){
|
|
write(Reg::EntryMode::Address, Reg::EntryMode::ID1 | Reg::EntryMode::BGR | Reg::EntryMode::AM);
|
|
}
|
|
}
|
|
|
|
static void setCursor(uint16_t x, uint16_t y){
|
|
write(Reg::HorizontalGRAMAddressSet::Address, x);
|
|
write(Reg::VerticalGRAMAddressSet::Address, y);
|
|
}
|
|
|
|
static void beginWriteGram(){
|
|
HW::setAddress(Reg::WriteDataToGRAM::Address);
|
|
}
|
|
|
|
static void write(uint16_t value){
|
|
HW::write(value);
|
|
}
|
|
|
|
static void clear(uint16_t color){
|
|
setCursor(0, 0);
|
|
beginWriteGram();
|
|
|
|
for(uint32_t index = 0; index < 320*240; index++ ){ //TODO: remove hardcode
|
|
HW::write(color);
|
|
}
|
|
}
|
|
};
|
|
|
|
}
|
|
|
|
#endif /* ILI9325_H_ */
|