@@ -731,15 +731,39 @@ def config_get(key, key_default):
731731def send_value_to_touchpad_via_i2c (value ):
732732 global device_id , device_addr
733733
734+ data = [0x05 , 0x00 , 0x3d , 0x03 , 0x06 , 0x00 , 0x07 , 0x00 ,
735+ 0x0d , 0x14 , 0x03 , int (value , 16 ), 0xad ]
736+
734737 try :
735738 path = f"/dev/i2c-{ device_id } "
739+
736740 with I2C (path ) as i2c :
737- data = [0x05 , 0x00 , 0x3d , 0x03 , 0x06 , 0x00 , 0x07 , 0x00 ,
738- 0x0d , 0x14 , 0x03 , int (value , 16 ), 0xad ]
739741 msg = I2C .Message (data )
740742 i2c .transfer (device_addr , [msg ])
743+
744+ log .debug ("Used python-periphery on %s..." , path )
745+
746+ return True
747+
741748 except Exception as e :
742- log .error ('Error during sending via i2c: "%s"' , e )
749+ log .debug ("periphery.I2C failed: %s; falling back to i2ctransfer" , e )
750+
751+ try :
752+ hex_data = [f"0x{ b :02x} " for b in data ]
753+ cmd = ["i2ctransfer" , "-f" , "-y" , str (device_id ), f"w{ len (data )} @0x{ device_addr :x} " ] + hex_data
754+
755+ log .debug ("Trying I2C via i2ctransfer: %s" , " " .join (cmd ))
756+ subprocess .run (cmd , check = True , capture_output = True )
757+ log .debug ("I2C transfer successful via i2ctransfer" )
758+ return True
759+
760+ except subprocess .CalledProcessError as e :
761+ stderr = e .stderr .decode ().strip () if e .stderr else str (e )
762+ log .error ("i2ctransfer failed: %s" , stderr )
763+ except Exception as e :
764+ log .error ("Error during fallback I2C transfer: %s" , e )
765+
766+ return False
743767
744768
745769def parse_value_from_config (value ):
@@ -1070,8 +1094,14 @@ def get_compose_key_start_events_for_unicode_string(reset_udev = True):
10701094 i2c = I2C (path )
10711095 i2c .close ()
10721096except Exception as e :
1073- log .error ("Can't open the I2C bus connection (id: %s): %s" , device_id , e )
1074- sys .exit (1 )
1097+ log .debug ("periphery.I2C failed: %s, trying raw command: open..." , e )
1098+ try :
1099+ with open (path , "rb+" , buffering = 0 ) as f :
1100+ pass
1101+ log .debug (f"Successfully opened { path } " )
1102+ except Exception as e2 :
1103+ log .error ("Can not open the I2C bus connection (id: %s): %s" , device_id , e2 )
1104+ sys .exit (1 )
10751105
10761106# Start monitoring the touchpad
10771107fd_t = open ('/dev/input/event' + str (touchpad ), 'rb' )
0 commit comments