30
30
import struct
31
31
import time
32
32
33
- from digitalio import Direction
34
33
from adafruit_bus_device import spi_device
35
34
import adafruit_ra8875 .registers as reg
36
35
45
44
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_RA8875.git"
46
45
47
46
48
- # pylint: disable-msg=invalid-name
47
+ # pylint: disable-msg=invalid-name, too-many-statements
49
48
def color565 (r : int , g : int = 0 , b : int = 0 ) -> int :
50
49
"""Convert red, green and blue values (0-255) into a 16-bit 565 encoding."""
51
50
try :
@@ -102,7 +101,7 @@ def __init__(
102
101
self .reset ()
103
102
if self ._read_reg (0 ) == 0x75 :
104
103
return
105
- self ._adc_clk = reg .TPCR0_ADCCLK_DIV16
104
+ self ._adc_clk = reg .TPCR0_ADCCLK_DIV4
106
105
107
106
# pylint: enable-msg=invalid-name,too-many-arguments
108
107
@@ -112,6 +111,7 @@ def init(self, start_on: bool = True) -> None:
112
111
113
112
:param bool start_on: (optional) If the display should start in an On State (default=True)
114
113
"""
114
+ hsync_finetune = 0
115
115
if self .width == 480 and self .height == 82 :
116
116
self .vert_offset = 190
117
117
@@ -123,6 +123,7 @@ def init(self, start_on: bool = True) -> None:
123
123
vsync_nondisp = 32
124
124
vsync_start = 23
125
125
vsync_pw = 2
126
+ self ._adc_clk = reg .TPCR0_ADCCLK_DIV16
126
127
elif self .width == 480 and self .height in (272 , 128 , 82 ):
127
128
pixclk = reg .PCSR_PDATL | reg .PCSR_4CLK
128
129
hsync_nondisp = 10
@@ -131,36 +132,41 @@ def init(self, start_on: bool = True) -> None:
131
132
vsync_nondisp = 3
132
133
vsync_start = 8
133
134
vsync_pw = 10
134
- self ._adc_clk = reg .TPCR0_ADCCLK_DIV4
135
135
else :
136
136
raise ValueError ("An invalid display size was specified." )
137
137
138
138
self .pllinit ()
139
-
140
139
self ._write_reg (reg .SYSR , reg .SYSR_16BPP | reg .SYSR_MCU8 )
141
140
self ._write_reg (reg .PCSR , pixclk )
142
141
time .sleep (0.001 )
143
142
144
143
# Horizontal settings registers
145
144
self ._write_reg (reg .HDWR , self .width // 8 - 1 )
146
- self ._write_reg (reg .HNDFTR , reg .HNDFTR_DE_HIGH )
147
- self ._write_reg (reg .HNDR , (hsync_nondisp - 2 ) // 8 )
145
+ self ._write_reg (reg .HNDFTR , reg .HNDFTR_DE_HIGH + hsync_finetune )
146
+ self ._write_reg (reg .HNDR , (hsync_nondisp - hsync_finetune - 2 ) // 8 )
148
147
self ._write_reg (reg .HSTR , hsync_start // 8 - 1 )
149
- self ._write_reg (reg .HPWR , reg .HPWR_LOW + hsync_pw // 8 - 1 )
148
+ self ._write_reg (reg .HPWR , reg .HPWR_LOW + ( hsync_pw // 8 - 1 ) )
150
149
151
150
# Vertical settings registers
152
- self ._write_reg16 (reg .VDHR0 , self .height - 1 + self .vert_offset )
151
+ self ._write_reg16 (reg .VDHR0 , (self .height - 1 + self .vert_offset ) & 0xFF )
152
+ self ._write_reg16 (reg .VDHR1 , (self .height - 1 + self .vert_offset ) >> 8 )
153
153
self ._write_reg16 (reg .VNDR0 , vsync_nondisp - 1 )
154
+ self ._write_reg16 (reg .VNDR1 , vsync_nondisp >> 8 )
154
155
self ._write_reg16 (reg .VSTR0 , vsync_start - 1 )
156
+ self ._write_reg16 (reg .VSTR1 , vsync_start >> 8 )
155
157
self ._write_reg (reg .VPWR , reg .VPWR_LOW + vsync_pw - 1 )
156
158
157
159
# Set active window X
158
160
self ._write_reg16 (reg .HSAW0 , 0 )
159
- self ._write_reg16 (reg .HEAW0 , self .width - 1 )
161
+ self ._write_reg16 (reg .HSAW1 , 0 )
162
+ self ._write_reg16 (reg .HEAW0 , (self .width - 1 ) & 0xFF )
163
+ self ._write_reg16 (reg .HEAW1 , (self .width - 1 ) >> 8 )
160
164
161
165
# Set active window Y
162
166
self ._write_reg16 (reg .VSAW0 , self .vert_offset )
163
- self ._write_reg16 (reg .VEAW0 , self .height - 1 + self .vert_offset )
167
+ self ._write_reg16 (reg .VSAW1 , self .vert_offset )
168
+ self ._write_reg16 (reg .VEAW0 , (self .height - 1 + self .vert_offset ) & 0xFF )
169
+ self ._write_reg16 (reg .VEAW1 , (self .height - 1 + self .vert_offset ) >> 8 )
164
170
165
171
# Clear the entire window
166
172
self ._write_reg (reg .MCLR , reg .MCLR_START | reg .MCLR_FULL )
@@ -216,7 +222,7 @@ def _write_cmd(self, cmd: int) -> None:
216
222
217
223
def _write_data (self , data : int , raw : bool = False ) -> None :
218
224
"""
219
- Write a byte or push raw data out
225
+ Write a byte or push raw data out using the previously selected register
220
226
221
227
:param data: The byte to write to the register
222
228
:type data: byte or bytearray
@@ -341,9 +347,8 @@ def touch_init(
341
347
:param bool enable: Enable the Touch Functionality as well
342
348
"""
343
349
if tpin is not None :
344
- tpin .direction = Direction . INPUT
350
+ tpin .switch_to_input ()
345
351
self ._tpin = tpin
346
- self ._write_reg (reg .INTC2 , reg .INTC2_TP )
347
352
self .touch_enable (enable )
348
353
349
354
def touch_enable (self , touch_on : bool ) -> None :
@@ -356,12 +361,13 @@ def touch_enable(self, touch_on: bool) -> None:
356
361
self ._write_reg (
357
362
reg .TPCR0 ,
358
363
reg .TPCR0_ENABLE
359
- | reg .TPCR0_WAIT_4096CLK
364
+ | reg .WAITTIME_LUT [ self . _adc_clk ]
360
365
| reg .TPCR0_WAKEENABLE
361
366
| self ._adc_clk ,
362
367
)
363
368
self ._write_reg (reg .TPCR1 , reg .TPCR1_AUTO | reg .TPCR1_DEBOUNCE )
364
369
self ._write_data (self ._read_reg (reg .INTC1 ) | reg .INTC1_TP )
370
+ self ._gfx_mode ()
365
371
else :
366
372
self ._write_data (self ._read_reg (reg .INTC1 ) & ~ reg .INTC1_TP )
367
373
self ._write_reg (reg .TPCR0 , reg .TPCR0_DISABLE )
@@ -375,9 +381,12 @@ def touched(self) -> bool:
375
381
:rtype: bool
376
382
"""
377
383
if self ._tpin is not None :
378
- self ._gfx_mode () # Hack that seems to work
384
+ # Hardware interrupt only works in graphics mode
385
+ self ._gfx_mode ()
379
386
if self ._tpin .value :
380
387
return False
388
+
389
+ # Read the Interrupt Flag
381
390
istouched = self ._read_reg (reg .INTC2 ) & reg .INTC2_TP
382
391
return istouched
383
392
@@ -388,13 +397,13 @@ def touch_read(self) -> Tuple[int, int]:
388
397
:return: The coordinate of the detected touch
389
398
:rtype: tuple[int, int]
390
399
"""
391
- touch_x = self . _read_reg ( reg . TPXH )
392
- touch_y = self ._read_reg (reg .TPYH )
393
- temp = self ._read_reg (reg .TPXYL )
394
- touch_x = touch_x << 2
395
- touch_y = touch_y << 2
396
- touch_x |= temp & 0x03
397
- touch_y |= ( temp >> 2 ) & 0x03
400
+ # Read the Touch Coordinates
401
+ touch_x_high_bits = self ._read_reg (reg .TPXH )
402
+ touch_y_high_bits = self ._read_reg (reg .TPYH )
403
+ touch_xy_low_bits = self . _read_reg ( reg . TPXYL )
404
+ touch_x = touch_x_high_bits << 2 | touch_xy_low_bits & 0x03
405
+ touch_y = touch_y_high_bits << 2 | ( touch_xy_low_bits >> 2 ) & 0x03
406
+ # Clear the Interrupt Flag
398
407
self ._write_reg (reg .INTC2 , reg .INTC2_TP )
399
408
return [touch_x , touch_y ]
400
409
0 commit comments