3030import struct
3131import time
3232
33- from digitalio import Direction
3433from adafruit_bus_device import spi_device
3534import adafruit_ra8875 .registers as reg
3635
4544__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_RA8875.git"
4645
4746
48- # pylint: disable-msg=invalid-name
47+ # pylint: disable-msg=invalid-name, too-many-statements
4948def color565 (r : int , g : int = 0 , b : int = 0 ) -> int :
5049 """Convert red, green and blue values (0-255) into a 16-bit 565 encoding."""
5150 try :
@@ -102,7 +101,7 @@ def __init__(
102101 self .reset ()
103102 if self ._read_reg (0 ) == 0x75 :
104103 return
105- self ._adc_clk = reg .TPCR0_ADCCLK_DIV16
104+ self ._adc_clk = reg .TPCR0_ADCCLK_DIV4
106105
107106 # pylint: enable-msg=invalid-name,too-many-arguments
108107
@@ -112,6 +111,7 @@ def init(self, start_on: bool = True) -> None:
112111
113112 :param bool start_on: (optional) If the display should start in an On State (default=True)
114113 """
114+ hsync_finetune = 0
115115 if self .width == 480 and self .height == 82 :
116116 self .vert_offset = 190
117117
@@ -123,6 +123,7 @@ def init(self, start_on: bool = True) -> None:
123123 vsync_nondisp = 32
124124 vsync_start = 23
125125 vsync_pw = 2
126+ self ._adc_clk = reg .TPCR0_ADCCLK_DIV16
126127 elif self .width == 480 and self .height in (272 , 128 , 82 ):
127128 pixclk = reg .PCSR_PDATL | reg .PCSR_4CLK
128129 hsync_nondisp = 10
@@ -131,36 +132,41 @@ def init(self, start_on: bool = True) -> None:
131132 vsync_nondisp = 3
132133 vsync_start = 8
133134 vsync_pw = 10
134- self ._adc_clk = reg .TPCR0_ADCCLK_DIV4
135135 else :
136136 raise ValueError ("An invalid display size was specified." )
137137
138138 self .pllinit ()
139-
140139 self ._write_reg (reg .SYSR , reg .SYSR_16BPP | reg .SYSR_MCU8 )
141140 self ._write_reg (reg .PCSR , pixclk )
142141 time .sleep (0.001 )
143142
144143 # Horizontal settings registers
145144 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 )
148147 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 ) )
150149
151150 # 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 )
153153 self ._write_reg16 (reg .VNDR0 , vsync_nondisp - 1 )
154+ self ._write_reg16 (reg .VNDR1 , vsync_nondisp >> 8 )
154155 self ._write_reg16 (reg .VSTR0 , vsync_start - 1 )
156+ self ._write_reg16 (reg .VSTR1 , vsync_start >> 8 )
155157 self ._write_reg (reg .VPWR , reg .VPWR_LOW + vsync_pw - 1 )
156158
157159 # Set active window X
158160 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 )
160164
161165 # Set active window Y
162166 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 )
164170
165171 # Clear the entire window
166172 self ._write_reg (reg .MCLR , reg .MCLR_START | reg .MCLR_FULL )
@@ -216,7 +222,7 @@ def _write_cmd(self, cmd: int) -> None:
216222
217223 def _write_data (self , data : int , raw : bool = False ) -> None :
218224 """
219- Write a byte or push raw data out
225+ Write a byte or push raw data out using the previously selected register
220226
221227 :param data: The byte to write to the register
222228 :type data: byte or bytearray
@@ -341,9 +347,8 @@ def touch_init(
341347 :param bool enable: Enable the Touch Functionality as well
342348 """
343349 if tpin is not None :
344- tpin .direction = Direction . INPUT
350+ tpin .switch_to_input ()
345351 self ._tpin = tpin
346- self ._write_reg (reg .INTC2 , reg .INTC2_TP )
347352 self .touch_enable (enable )
348353
349354 def touch_enable (self , touch_on : bool ) -> None :
@@ -356,12 +361,13 @@ def touch_enable(self, touch_on: bool) -> None:
356361 self ._write_reg (
357362 reg .TPCR0 ,
358363 reg .TPCR0_ENABLE
359- | reg .TPCR0_WAIT_4096CLK
364+ | reg .WAITTIME_LUT [ self . _adc_clk ]
360365 | reg .TPCR0_WAKEENABLE
361366 | self ._adc_clk ,
362367 )
363368 self ._write_reg (reg .TPCR1 , reg .TPCR1_AUTO | reg .TPCR1_DEBOUNCE )
364369 self ._write_data (self ._read_reg (reg .INTC1 ) | reg .INTC1_TP )
370+ self ._gfx_mode ()
365371 else :
366372 self ._write_data (self ._read_reg (reg .INTC1 ) & ~ reg .INTC1_TP )
367373 self ._write_reg (reg .TPCR0 , reg .TPCR0_DISABLE )
@@ -375,9 +381,12 @@ def touched(self) -> bool:
375381 :rtype: bool
376382 """
377383 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 ()
379386 if self ._tpin .value :
380387 return False
388+
389+ # Read the Interrupt Flag
381390 istouched = self ._read_reg (reg .INTC2 ) & reg .INTC2_TP
382391 return istouched
383392
@@ -388,13 +397,13 @@ def touch_read(self) -> Tuple[int, int]:
388397 :return: The coordinate of the detected touch
389398 :rtype: tuple[int, int]
390399 """
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
398407 self ._write_reg (reg .INTC2 , reg .INTC2_TP )
399408 return [touch_x , touch_y ]
400409
0 commit comments