Skip to content

Commit 05f0fd4

Browse files
committed
Adds GC9107 Driver
1 parent 2a6c2e0 commit 05f0fd4

File tree

2 files changed

+231
-0
lines changed

2 files changed

+231
-0
lines changed
Lines changed: 181 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,181 @@
1+
# Copyright (c) 2024 - 2025 Kevin G. Schlosser
2+
3+
import time
4+
from micropython import const # NOQA
5+
import lvgl as lv
6+
7+
_SLPOUT = const(0x11)
8+
_INVON = const(0x21)
9+
_DISPON = const(0x29)
10+
_TEON = const(0x35)
11+
_MADCTL = const(0x36)
12+
_COLMOD = const(0x3A)
13+
_DFC = const(0xB6)
14+
_VREG1ACTL = 0xC3
15+
_VREG1BCTL = 0xC4
16+
_VREG2ACTL = 0xC9
17+
_DOCA = const(0xE8)
18+
_REG_ENA2 = const(0xEF)
19+
_SET_GAMMA1 = const(0xF0)
20+
_SET_GAMMA2 = const(0xF1)
21+
_SET_GAMMA3 = const(0xF2)
22+
_SET_GAMMA4 = const(0xF3)
23+
_REG_ENA1 = const(0xFE)
24+
25+
26+
def init(self):
27+
param_buf = bytearray(12)
28+
param_mv = memoryview(param_buf)
29+
30+
self.set_params(_REG_ENA2)
31+
32+
param_buf[0] = 0x14
33+
self.set_params(0xEB, param_mv[:1])
34+
35+
self.set_params(_REG_ENA1)
36+
self.set_params(_REG_ENA2)
37+
38+
param_buf[0] = 0x14
39+
self.set_params(0xEB, param_mv[:1])
40+
41+
param_buf[0] = 0x40
42+
self.set_params(0x84, param_mv[:1])
43+
44+
param_buf[0] = 0xFF
45+
self.set_params(0x85, param_mv[:1])
46+
self.set_params(0x86, param_mv[:1])
47+
self.set_params(0x87, param_mv[:1])
48+
49+
param_buf[0] = 0x0A
50+
self.set_params(0x88, param_mv[:1])
51+
52+
param_buf[0] = 0x21
53+
self.set_params(0x89, param_mv[:1])
54+
55+
param_buf[0] = 0x00
56+
self.set_params(0x8A, param_mv[:1])
57+
58+
param_buf[0] = 0x80
59+
self.set_params(0x8B, param_mv[:1])
60+
61+
param_buf[0] = 0x01
62+
self.set_params(0x8C, param_mv[:1])
63+
self.set_params(0x8D, param_mv[:1])
64+
65+
param_buf[0] = 0xFF
66+
self.set_params(0x8E, param_mv[:1])
67+
self.set_params(0x8F, param_mv[:1])
68+
69+
param_buf[:2] = bytearray([0x00, 0x20])
70+
self.set_params(_DFC, param_mv[:2])
71+
72+
color_size = lv.color_format_get_size(self._color_space)
73+
if color_size == 2: # NOQA
74+
pixel_format = 0x55
75+
elif color_size == 3:
76+
pixel_format = 0x77
77+
else:
78+
raise RuntimeError(
79+
f'{self.__class__.__name__} IC only supports '
80+
'lv.COLOR_FORMAT.RGB565 or lv.COLOR_FORMAT.RGB888'
81+
)
82+
83+
param_buf[0] = pixel_format
84+
self.set_params(_COLMOD, param_mv[:1])
85+
86+
param_buf[0] = (
87+
self._madctl(
88+
self._color_byte_order,
89+
self._ORIENTATION_TABLE # NOQA
90+
)
91+
)
92+
self.set_params(_MADCTL, param_mv[:1])
93+
94+
param_buf[:5] = bytearray([0x08, 0x08, 0x08, 0x08, 0x08])
95+
self.set_params(0x90, param_mv[:5])
96+
97+
param_buf[0] = 0x06
98+
self.set_params(0xBD, param_mv[:1])
99+
100+
param_buf[0] = 0x00
101+
self.set_params(0xBC, param_mv[:1])
102+
103+
param_buf[:3] = bytearray([0x60, 0x01, 0x04])
104+
self.set_params(0xFF, param_mv[:3])
105+
106+
param_buf[0] = 0x13
107+
self.set_params(_VREG1ACTL, param_mv[:1])
108+
self.set_params(_VREG1BCTL, param_mv[:1])
109+
110+
param_buf[0] = 0x22
111+
self.set_params(_VREG2ACTL, param_mv[:1])
112+
113+
param_buf[0] = 0x11
114+
self.set_params(0xBE, param_mv[:1])
115+
116+
param_buf[:2] = bytearray([0x10, 0x0E])
117+
self.set_params(0xE1, param_mv[:2])
118+
119+
param_buf[:3] = bytearray([0x21, 0x0c, 0x02])
120+
self.set_params(0xDF, param_mv[:3])
121+
122+
param_buf[:6] = bytearray([0x45, 0x09, 0x08, 0x08, 0x26, 0x2A])
123+
self.set_params(_SET_GAMMA1, param_mv[:6])
124+
125+
param_buf[:6] = bytearray([0x43, 0x70, 0x72, 0x36, 0x37, 0x6F])
126+
self.set_params(_SET_GAMMA2, param_mv[:6])
127+
128+
param_buf[:6] = bytearray([0x45, 0x09, 0x08, 0x08, 0x26, 0x2A])
129+
self.set_params(_SET_GAMMA3, param_mv[:6])
130+
131+
param_buf[:6] = bytearray([0x43, 0x70, 0x72, 0x36, 0x37, 0x6F])
132+
self.set_params(_SET_GAMMA4, param_mv[:6])
133+
134+
param_buf[:2] = bytearray([0x1B, 0x0B])
135+
self.set_params(0xED, param_mv[:2])
136+
137+
param_buf[0] = 0x77
138+
self.set_params(0xAE, param_mv[:1])
139+
140+
param_buf[0] = 0x63
141+
self.set_params(0xCD, param_mv[:1])
142+
143+
param_buf[:9] = bytearray([
144+
0x07, 0x07, 0x04, 0x0E, 0x0F, 0x09, 0x07, 0x08, 0x03])
145+
self.set_params(0x70, param_mv[:9])
146+
147+
param_buf[0] = 0x34
148+
self.set_params(_DOCA, param_mv[:1])
149+
150+
param_buf[:12] = bytearray([
151+
0x18, 0x0D, 0x71, 0xED, 0x70, 0x70, 0x18, 0x0F, 0x71, 0xEF, 0x70, 0x70])
152+
self.set_params(0x62, param_mv[:12])
153+
154+
param_buf[:12] = bytearray([
155+
0x18, 0x11, 0x71, 0xF1, 0x70, 0x70, 0x18, 0x13, 0x71, 0xF3, 0x70, 0x70])
156+
self.set_params(0x63, param_mv[:12])
157+
158+
param_buf[:7] = bytearray([0x28, 0x29, 0xF1, 0x01, 0xF1, 0x00, 0x07])
159+
self.set_params(0x64, param_mv[:7])
160+
161+
param_buf[:10] = bytearray([
162+
0x3C, 0x00, 0xCD, 0x67, 0x45, 0x45, 0x10, 0x00, 0x00, 0x00])
163+
self.set_params(0x66, param_mv[:10])
164+
165+
param_buf[:10] = bytearray([
166+
0x00, 0x3C, 0x00, 0x00, 0x00, 0x01, 0x54, 0x10, 0x32, 0x98])
167+
self.set_params(0x67, param_mv[:10])
168+
169+
param_buf[:7] = bytearray([0x10, 0x85, 0x80, 0x00, 0x00, 0x4E, 0x00])
170+
self.set_params(0x74, param_mv[:7])
171+
172+
param_buf[:2] = bytearray([0x3e, 0x07])
173+
self.set_params(0x98, param_mv[:2])
174+
175+
self.set_params(_TEON)
176+
self.set_params(_INVON)
177+
178+
self.set_params(_SLPOUT)
179+
time.sleep_ms(120) # NOQA
180+
self.set_params(_DISPON)
181+
time.sleep_ms(20) # NOQA
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
# Copyright (c) 2024 - 2025 Kevin G. Schlosser
2+
3+
from micropython import const # NOQA
4+
5+
import lvgl as lv # NOQA
6+
import lcd_bus # NOQA
7+
import display_driver_framework
8+
9+
10+
STATE_HIGH = display_driver_framework.STATE_HIGH
11+
STATE_LOW = display_driver_framework.STATE_LOW
12+
STATE_PWM = display_driver_framework.STATE_PWM
13+
14+
BYTE_ORDER_RGB = display_driver_framework.BYTE_ORDER_RGB
15+
BYTE_ORDER_BGR = display_driver_framework.BYTE_ORDER_BGR
16+
17+
18+
_MADCTL_MH = const(0x04) # Refresh 0=Left to Right, 1=Right to Left
19+
_MADCTL_BGR = const(0x08) # BGR color order
20+
_MADCTL_ML = const(0x10) # Refresh 0=Top to Bottom, 1=Bottom to Top
21+
_MADCTL_MV = const(0x20) # 0=Normal, 1=Row/column exchange
22+
_MADCTL_MX = const(0x40) # 0=Left to Right, 1=Right to Left
23+
_MADCTL_MY = const(0x80) # 0=Top to Bottom, 1=Bottom to Top
24+
25+
26+
class GC9107(display_driver_framework.DisplayDriver):
27+
28+
_ORIENTATION_TABLE = (
29+
0,
30+
_MADCTL_MX | _MADCTL_MV,
31+
_MADCTL_MY | _MADCTL_MX,
32+
_MADCTL_MY | _MADCTL_MV
33+
)
34+
35+
def _set_memory_location(self, x1, y1, x2, y2):
36+
# Column addresses
37+
param_buf = self._param_buf # NOQA
38+
39+
if self._rotation in (0, 2):
40+
x1 += 2
41+
x2 += 2
42+
y1 += 1
43+
y2 += 1
44+
else:
45+
x1 += 1
46+
x2 += 1
47+
y1 += 2
48+
y2 += 2
49+
50+
return display_driver_framework.DisplayDriver(self, x1, y1, x2, y2)

0 commit comments

Comments
 (0)