-
Notifications
You must be signed in to change notification settings - Fork 0
/
lcd-driver.cpp
151 lines (130 loc) · 2.99 KB
/
lcd-driver.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include <string.h>
#include <stdio.h>
#include <linux/spi/spidev.h>
#include "lcd-driver.h"
#include "spi-driver.h"
#include "gpio-driver.h"
bool CLCDDriver::Reset()
{
m_Reset->SetValue(false);
usleep(100000);
m_Reset->SetValue(true);
usleep(100000);
return true;
}
bool CLCDDriver::DataMode()
{
m_DC->SetValue(true);
usleep(100);
return true;
}
bool CLCDDriver::CommandMode()
{
m_DC->SetValue(false);
usleep(100);
return true;
}
bool CLCDDriver::Init()
{
/* enable extended instruction set, configure Vop, TC, Bias,
* disable extended instruction set and use normal mode */
uint8_t initseq[] = { 0x21, 0xBC, 0x06, 0x14, 0x20, 0x0C };
this->Reset();
this->CommandMode();
m_Spi->Write(initseq, sizeof(initseq));
return true;
}
unsigned int CLCDDriver::GetWidth()
{
return m_Width;
}
unsigned int CLCDDriver::GetHeight()
{
return m_Height;
}
bool CLCDDriver::SetPixel(unsigned int _x, unsigned int _y)
{
if (_x < m_Width && _y < m_Height)
{
int bank = _y / 8;
int yinbank = _y % 8;
m_Buffer[bank * 84 + _x] |= 1U << yinbank;
return true;
}
else
{
return false;
}
}
bool CLCDDriver::ClearPixel(unsigned int _x, unsigned int _y)
{
/* we'll have to do some computation here to
find out where each pixel is in the buffer */
if (_x < m_Width && _y < m_Height)
{
int bank = _y / 8;
int yinbank = _y % 8;
m_Buffer[bank * 84 + _x] &= ~(1U << yinbank);
return true;
}
else
{
return false;
}
}
bool CLCDDriver::Draw()
{
uint8_t gotozero[] = { 0x80, 0x40 };
this->CommandMode();
m_Spi->Write(gotozero, sizeof(gotozero));
this->DataMode();
m_Spi->Write(m_Buffer, BUFFER_SIZE);
return true;
}
bool CLCDDriver::ClearBuffer()
{
memset(this->m_Buffer, 0x0, BUFFER_SIZE);
return true;
}
CLCDDriver::CLCDDriver(const char * _spidev, const char * _dc, const char * _reset)
{
int res;
m_DC = new CGPIODriver();
m_Reset = new CGPIODriver();
m_Spi = new CSPIDriver();
if ((res = m_DC->Open(_dc)) != 0)
{
printf("error: dc open failed\n");
throw res;
}
if ((res = m_Reset->Open(_reset)) != 0)
{
printf("error: reset open failed\n");
throw res;
}
if ((res = m_Spi->Open(_spidev, 8 , SPI_CPHA , 1000000)) != 0)
{
printf("error: spi open failed\n");
throw res;
}
if ((res = m_DC->SetDirection(true)) != 0)
{
printf("error: dc direction failed\n");
throw res;
}
if ((res = m_Reset->SetDirection(true)) != 0)
{
printf("error: reset direction failed\n");
throw res;
}
this->ClearBuffer();
}
CLCDDriver::~CLCDDriver()
{
if (m_DC)
delete m_DC;
if (m_Reset)
delete m_Reset;
if (m_Spi)
delete m_Spi;
}