blob: 3f0a4e5ddab896674abeae6c57d9bd1a9cd335ed [file] [log] [blame]
# Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Helper script to generate system control files for INA219 adcs."""
import imp
import os
import sys
import time
def dump_adcs(adcs, drvname='ina219', interface=2):
"""Dump xml formatted INA219 adcs for servod.
Args:
adcs: array of adc elements. Each array element is a tuple consisting of:
slv: int representing the i2c slave address
name: string name of the power rail
sense: float of sense resitor size in ohms
nom: float of nominal voltage of power rail.
mux: string name of i2c mux leg these ADC's live on
is_calib: boolean to determine if calibration is possible for this rail
drvname: string name of adc driver to enumerate for controlling the adc.
interface: interface index to handle low-level communication.
Returns:
string (large) of xml for the system config of these ADCs to eventually be
parsed by servod daemon ( servo/system_config.py )
"""
regs = ['cfg', 'shv', 'busv', 'pwr', 'cur', 'cal']
if drvname == 'ina231':
regs.extend(['msken', 'alrt'])
rsp = ""
for (slv, name, nom, sense, mux, is_calib) in adcs:
rsp += (
'<control><name>%(name)s_mv</name>\n'
'<doc>Voltage of %(name)s rail in millivolts on i2c_mux:%(mux)s</doc>\n'
'<params interface="%(interface)d" drv="%(drvname)s" slv="%(slv)s"'
' mux="%(mux)s" rsense="%(sense)s" type="get" subtype="millivolts"'
' nom="%(nom)s">\n</params></control>\n'
) % {'name':name, 'drvname':drvname, 'interface':interface, 'slv':slv,
'mux':mux, 'sense':sense, 'nom':nom}
# in some instances we may not know sense resistor size ( re-work ) or other
# custom factors may not allow for calibration and those reliable readings
# on the current and power registers. This boolean determines which
# controls should be enumerated based on rails input specification
if is_calib:
rsp += (
'<control><name>%(name)s_ma</name>\n'
'<doc>Current of %(name)s rail in milliamps on i2c_mux:%(mux)s</doc>\n'
'<params interface="%(interface)d" drv="%(drvname)s" slv="%(slv)s"'
'rsense="%(sense)s" type="get" subtype="milliamps">\n'
'</params></control>\n'
'<control><name>%(name)s_mw</name>\n'
'<doc>Power of %(name)s rail in milliwatts on i2c_mux:%(mux)s</doc>\n'
'<params interface="%(interface)d" drv="%(drvname)s" slv="%(slv)s"'
' mux="%(mux)s" rsense="%(sense)s" type="get" subtype="milliwatts">\n'
'</params></control>\n') % {'name':name, 'drvname':drvname,
'interface':interface, 'slv':slv,
'mux':mux, 'sense':sense, 'nom':nom}
for i, reg in enumerate(regs):
rsp += (
'<control><name>%(name)s_%(reg)s_reg</name>\n'
'<doc>Raw register value of %(reg)s on i2c_mux:%(mux)s</doc>'
'<params cmd="get" interface="%(interface)d"'
' drv="%(drvname)s" slv="%(slv)s"'
' subtype="readreg" reg="%(i)s" mux="%(mux)s"'
' fmt="hex">\n</params>') % {'name':name, 'drvname':drvname,
'interface':interface, 'slv':slv,
'mux':mux, 'sense':sense,
'reg':reg, 'i':i}
if reg == "cfg":
rsp += (
'<params cmd="set" interface="%(interface)d"'
' drv="%(drvname)s" slv="%(slv)s"'
' subtype="writereg" reg="%(i)s" mux="%(mux)s"'
' fmt="hex">\n</params></control>') % {'drvname':drvname,
'interface':interface,
'slv':slv, 'mux':mux,
'sense':sense,
'reg':reg, 'i':i}
else:
rsp += ('</control>')
return rsp
def main():
if len(sys.argv) != 3:
raise Exception("Missing args. %s <filename.py> <drvname>" % sys.argv[0])
module_name = sys.argv[1]
ina_pkg = imp.load_module(module_name, *imp.find_module(module_name))
drvname = sys.argv[2]
drvpath = os.path.join(os.environ['HDCTOOLS_SOURCE_DIR'], '..', 'drv',
drvname + '.py')
if not os.path.isfile(drvpath):
raise Exception("Unable to locate driver for %s at %s" % (drvname, drvpath))
if hasattr(ina_pkg, 'interface'):
interface = ina_pkg.interface
if type(interface) != int:
raise Exception("Invalid interface %r, should be int" % interface)
else:
interface = 2 # default I2C interface
f = open('%s.xml' % module_name, 'w')
f.write("<?xml version=\"1.0\"?>\n<root>\n")
f.write("<!-- Autogenerated on "+time.asctime()+"-->\n")
try:
f.write(ina_pkg.inline)
except AttributeError:
pass
except Exception:
raise
f.write(dump_adcs(ina_pkg.inas, drvname, interface))
f.write("</root>")
f.close()
rv = os.system("tidy -quiet -mi -xml %s.xml" % module_name)
if rv:
print "Error tidying xml output"
sys.exit(rv)
# be sure to run 'tidy -mi -xml <file>
if __name__ == "__main__":
main()