66
77from micropython import const
88import pointer_framework
9- import i2c
109import machine
1110import time
1211
1312
13+ _CMD_REG = const (0x8040 )
14+ _CMD_CHECK_REG = const (0x8046 )
15+ _CMD_RECEIVE = const (0x22 )
16+
17+ _ESD_CHECK_REG = const (0x8041 )
18+
1419_CONFIG_START_REG = const (0x8047 )
1520
1621_X_OUTPUT_MAX_LOW_POS = const (0x01 )
3035
3136_CONFIG_FRESH_REG = const (0x8100 )
3237
33- _READ_XY_REG = const (0x814E )
38+ _STATUS_REG = const (0x814E )
3439
35- _POINT_1_REG = const (0x814F )
36- _POINT_2_REG = const (0x8157 )
37- _POINT_3_REG = const (0x815F )
38- _POINT_4_REG = const (0x8167 )
39- _POINT_5_REG = const (0x816F )
40+ _POINT_1_REG = const (0x8150 )
4041
4142_PRODUCT_ID_REG = const (0x8140 )
4243_FIRMWARE_VERSION_REG = const (0x8144 )
4546_X_CORD_RES_REG = const (0x8146 )
4647_Y_CORD_RES_REG = const (0x8148 )
4748
49+
4850_ADDR1 = const (0x5D )
4951_ADDR2 = const (0x14 )
5052
5153
54+ # 0-15 * 32
55+ _VER_SPACE_REG = const (0x805B )# low 4 bits are bottom and hight is top
56+ _HOR_SPACE_REG = const (0x805C )# low 4 biits is right and high is left
57+
58+
5259class GT911 (pointer_framework .PointerDriver ):
5360
5461def __init__ (self ,i2c_bus ,reset_pin = None ,interrupt_pin = None ,touch_cal = None ):
55- buf = self ._buf = bytearray (7 )
56- mv = self ._mv = memoryview (self ._buf )
57-
58- self ._i2c = i2c . I2CDevice ( i2c_bus , _ADDR1 )
62+ self ._buf = bytearray (6 )
63+ self ._mv = memoryview (self ._buf )
64+ self . _i2c_bus = i2c_bus
65+ self ._i2c = i2c_bus . add_device ( _ADDR1 , 16 )
5966
6067if isinstance (reset_pin ,int ):
6168reset_pin = machine .Pin (reset_pin ,machine .Pin .OUT )
@@ -68,20 +75,27 @@ def __init__(self, i2c_bus, reset_pin=None, interrupt_pin=None, touch_cal=None):
6875
6976# self.touch_reset()
7077
71- self ._i2c .read_mem (_PRODUCT_ID_REG ,buf = mv [:4 ])
72- print ('Product id:' ,buf [:4 ])
78+ self ._i2c .read_mem (_PRODUCT_ID_REG ,buf = self ._mv [:4 ])
79+ print ('Product id:' ,self ._buf [:4 ])
80+
81+ self ._i2c .read_mem (_FIRMWARE_VERSION_REG ,buf = self ._mv [:2 ])
82+ print ('Firmware version:' ,hex (self ._buf [0 ]+ (self ._buf [1 ]<< 8 )))
83+
84+ self ._i2c .read_mem (_VENDOR_ID_REG ,buf = self ._mv [:1 ])
85+ print ('Vendor id:' ,hex (self ._buf [0 ]))
7386
74- self ._i2c .read_mem (_FIRMWARE_VERSION_REG ,buf = mv [:2 ])
75- print ('Firmware version :' ,hex ( buf [0 ]+ (buf [1 ]<< 8 ) ))
87+ self ._i2c .read_mem (_X_CORD_RES_REG ,buf = self . _mv [:2 ])
88+ print ('Configured width :' ,self . _buf [0 ]+ (self . _buf [1 ]<< 8 ))
7689
77- self ._i2c .read_mem (_VENDOR_ID_REG ,buf = mv [: 1 ])
78- print ('Vendor id :' ,hex ( buf [0 ]))
90+ self ._i2c .read_mem (_Y_CORD_RES_REG ,buf = self . _mv [: 2 ])
91+ print ('Configured height :' ,self . _buf [0 ]+ ( self . _buf [ 1 ] << 8 ))
7992
80- self ._i2c . read_mem ( _X_CORD_RES_REG , buf = mv [: 2 ])
81- print ( 'Configured width:' ,buf [ 0 ] + ( buf [ 1 ] << 8 ) )
93+ self ._buf [ 0 ] = 0x00
94+ self . _i2c . write_mem ( _ESD_CHECK_REG ,buf = self . _mv [: 1 ] )
8295
83- self ._i2c .read_mem (_Y_CORD_RES_REG ,buf = mv [:2 ])
84- print ('Configured height:' ,buf [0 ]+ (buf [1 ]<< 8 ))
96+ self ._buf [0 ]= _CMD_RECEIVE
97+ self ._i2c .write_mem (_CMD_CHECK_REG ,buf = self ._mv [:1 ])
98+ self ._i2c .write_mem (_CMD_REG ,buf = self ._mv [:1 ])
8599
86100super ().__init__ (touch_cal = touch_cal )
87101
@@ -132,28 +146,22 @@ def _reflash_config(self, width, height):
132146self ._i2c .write_mem (_CONFIG_FRESH_REG ,buf = mv [:1 ])
133147
134148def _get_coords (self ):
135- buf = self ._buf
136- mv = self ._mv
149+ self . _i2c . read_mem ( _STATUS_REG , buf = self ._mv [: 1 ])
150+ touch_cnt = self ._buf [ 0 ] & 0x0F
137151
138- self ._i2c .read_mem (_READ_XY_REG ,buf = mv [:1 ])
152+ if self ._buf [0 ]& 0x80 or touch_cnt < 6 :
153+ self ._buf [0 ]= 0x00
154+ self ._i2c .write_mem (_STATUS_REG ,buf = self ._mv [:1 ])
139155
140- if (buf [0 ]& 0x80 )== 0x00 :
141- buf [0 ]= 0x00
142- self ._i2c .write_mem (_READ_XY_REG ,buf = mv [:1 ])
143- return None
144- else :
145- touch_cnt = buf [0 ]& 0x0F
146- if touch_cnt > 5 or touch_cnt == 0 :
147- buf [0 ]= 0x00
148- self ._i2c .write_mem (_READ_XY_REG ,buf = mv [:1 ])
149- return None
156+ if touch_cnt == 1 :
157+ self ._i2c .read_mem (_POINT_1_REG ,buf = self ._mv )
150158
151- self ._i2c .read_mem (_READ_XY_REG ,buf = mv )
159+ x = self ._buf [0 ]+ (self ._buf [1 ]<< 8 )
160+ y = self ._buf [2 ]+ (self ._buf [3 ]<< 8 )
152161
153- x = buf [1 ]+ (buf [2 ]<< 8 )
154- y = buf [3 ]+ (buf [4 ]<< 8 )
162+ print (x ,y )
155163
156- buf [0 ]= 0x00
157- self ._i2c .write_mem (_READ_XY_REG ,buf = mv [:1 ])
164+ self . _buf [0 ]= 0x00
165+ self ._i2c .write_mem (_STATUS_REG ,buf = self . _mv [:1 ])
158166
159167return self .PRESSED ,x ,y