#!/usr/bin/python3.2 import sys from glob import glob from time import sleep import logging logging.basicConfig(level=logging.DEBUG) def find_serio_device(): for f in glob('/sys/bus/serio/devices/serio*'): a = open('%s/description'%f).read() if 'i8042 AUX' in a: return f #dev = find_serio_device() #logging.info("Found device %s" % dev) #open('%s/drvctl'%dev, 'w').write('serio_raw') #sleep(1) serio_dev = sys.argv[1] #serio_dev = glob('/dev/serio*')[0] f = open(serio_dev, 'wb+') def playback(cmds): for dir,data in cmds: if dir == 'S': logging.debug('Sent %02x' % data) f.write(bytes([data])) elif dir == 'R': a = f.read(1) logging.debug('Recieved %02x' % a[0]) if data != a[0]: logging.warn('reply mismatch: expected %02x, saw %02x' % (data, a[0])) else: raise RuntimeError("uh oh") def recv_ack(): a = b'' logging.debug('Waiting for ACK') while len(a) == 0: a = f.read(1) print(len(a)) if a != b'\xfa': raise RuntimeError("oops: %s" % str(a)) def reset(): f.write(b'\xff') recv_ack() a = f.read(2) return a def get_device_id(): f.write(b'\xf2') recv_ack() a = f.read(1) return a def set_resolution(arg): f.write(b'\xe8') recv_ack() f.write(arg) recv_ack() def set_sample_rate(arg): f.write(b'\xf3') recv_ack() f.write(arg) recv_ack() def set_1_1_scaling(): f.write(b'\xe6') recv_ack() def status_rq(): f.write(b'\xe9') recv_ack() a = f.read(3) return a def enable_data_reporting(): f.write(b'\xf4') recv_ack() def disable_data_reporting(): f.write(b'\xf5') recv_ack() def enter_absolute_mode(): reset() reset() get_device_id() set_resolution(b'\x00') set_1_1_scaling() set_1_1_scaling() set_1_1_scaling() status_rq() set_resolution(b'\x03') set_sample_rate(b'\xc8') set_sample_rate(b'\x64') set_sample_rate(b'\x50') get_device_id() set_sample_rate(b'\xc8') set_sample_rate(b'\xc8') set_sample_rate(b'\x50') set_resolution(b'\x03') enable_data_reporting() def format_bytes(bytes): return map(lambda b: '%02x' % b, bytes) cmds = [] for l in open('serio-init.log'): (dir,data) = (l[0], int(l[1:4], 16)) cmds.append((dir,data)) disable_data_reporting() reset() reset() playback(cmds) #enter_absolute_mode() try: while True: a = f.read(6) print(' '.join(format_bytes(a))) except KeyboardInterrupt: pass #open('%s/drvctl'%dev, 'w').write('psmouse')