--- qemu/roms/seabios/tools/readserial.py 2018/04/24 17:36:48 1.1.1.1 +++ qemu/roms/seabios/tools/readserial.py 2018/04/24 19:24:17 1.1.1.4 @@ -11,22 +11,52 @@ import sys import time import select -import serial +import optparse # Reset time counter after this much idle time. RESTARTINTERVAL = 60 -# Alter timing reports based on how much time would be spent writing -# to serial. -ADJUSTBAUD = 1 # Number of bits in a transmitted byte - 8N1 is 1 start bit + 8 data # bits + 1 stop bit. BITSPERBYTE = 10 -def readserial(infile, logfile, baudrate): +def calibrateserialwrite(outfile, byteadjust): + # Build 4000 bytes of dummy data. + data = "0123456789" * 4 + "012345678" + "\n" + data = data * 80 + while 1: + st = time.time() + outfile.write(data) + outfile.flush() + et = time.time() + sys.stdout.write( + "Wrote %d - %.1fus per char (theory states %.1fus)\n" % ( + len(data), (et-st) / len(data) * 1000000, byteadjust * 1000000)) + sys.stdout.flush() + time.sleep(3) + +def calibrateserialread(infile, byteadjust): + starttime = lasttime = 0 + totalchars = 0 + while 1: + select.select([infile], [], []) + d = infile.read(4096) + curtime = time.time() + if curtime - lasttime > 1.0: + if starttime and totalchars: + sys.stdout.write( + "Calibrating on %d bytes - %.1fus per char" + " (theory states %.1fus)\n" % ( + totalchars, + float(lasttime - starttime) * 1000000 / totalchars, + byteadjust * 1000000)) + totalchars = 0 + starttime = curtime + else: + totalchars += len(d) + lasttime = curtime + +def readserial(infile, logfile, byteadjust): lasttime = 0 - byteadjust = 0.0 - if ADJUSTBAUD: - byteadjust = float(BITSPERBYTE) / baudrate while 1: # Read data try: @@ -41,6 +71,8 @@ def readserial(infile, logfile, baudrate if len(res[0]) == 1: continue d = infile.read(4096) + if not d: + break datatime = time.time() datatime -= len(d) * byteadjust @@ -50,8 +82,8 @@ def readserial(infile, logfile, baudrate starttime = datatime charcount = 0 isnewline = 1 - msg = "\n\n======= %s (adjust=%d)\n" % ( - time.asctime(time.localtime(datatime)), ADJUSTBAUD) + msg = "\n\n======= %s (adjust=%.1fus)\n" % ( + time.asctime(time.localtime(datatime)), byteadjust * 1000000) sys.stdout.write(msg) logfile.write(msg) lasttime = datatime @@ -86,25 +118,69 @@ def readserial(infile, logfile, baudrate logfile.write(out) logfile.flush() -def printUsage(): - print "Usage:\n %s [ []]" % (sys.argv[0],) - sys.exit(1) - def main(): + usage = "%prog [options] [ []]" + opts = optparse.OptionParser(usage) + opts.add_option("-f", "--file", + action="store_false", dest="serial", default=True, + help="read from file instead of serialdevice") + opts.add_option("-n", "--no-adjust", + action="store_false", dest="adjustbaud", default=True, + help="don't adjust times by serial rate") + opts.add_option("-c", "--calibrate-read", + action="store_true", dest="calibrate_read", default=False, + help="read from serial port to calibrate it") + opts.add_option("-C", "--calibrate-write", + action="store_true", dest="calibrate_write", default=False, + help="write to serial port to calibrate it") + opts.add_option("-t", "--time", + type="float", dest="time", default=None, + help="time to write one byte on serial port (in us)") + options, args = opts.parse_args() serialport = 0 baud = 115200 - if len(sys.argv) > 3: - printUsage() - if len(sys.argv) > 1: - serialport = sys.argv[1] - if len(sys.argv) > 2: - baud = int(sys.argv[2]) + if len(args) > 2: + opts.error("Too many arguments") + if len(args) > 0: + serialport = args[0] + if len(args) > 1: + baud = int(args[1]) + byteadjust = float(BITSPERBYTE) / baud + if options.time is not None: + byteadjust = options.time / 1000000.0 + if not options.adjustbaud: + byteadjust = 0.0 - ser = serial.Serial(serialport, baud, timeout=0) + if options.serial: + # Read from serial port + try: + import serial + except ImportError: + print """ +Unable to find pyserial package ( http://pyserial.sourceforge.net/ ). +On Linux machines try: yum install pyserial +Or: apt-get install python-serial +""" + sys.exit(1) + ser = serial.Serial(serialport, baud, timeout=0) + else: + # Read from a file + ser = open(serialport, 'rb') + import fcntl + import os + fcntl.fcntl(ser, fcntl.F_SETFL + , fcntl.fcntl(ser, fcntl.F_GETFL) | os.O_NONBLOCK) + + if options.calibrate_read: + calibrateserialread(ser, byteadjust) + return + if options.calibrate_write: + calibrateserialwrite(ser, byteadjust) + return logname = time.strftime("seriallog-%Y%m%d_%H%M%S.log") f = open(logname, 'wb') - readserial(ser, f, baud) + readserial(ser, f, byteadjust) if __name__ == '__main__': main()