scarlet: support rearrangement of warm_reset

Newer servo headers may have warm_reset on pin 39,
add a config based on board selection to configure
yoshi header in the new way or old way.

BUG=b:64724237
TEST=Works on scarlet, works on reef config.

Change-Id: I399ecdda8f77578c415aa021d9d8af23876c4b37
Signed-off-by: Nick Sanders <nsanders@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/631190
Reviewed-by: Alexandru M Stan <amstan@chromium.org>
diff --git a/servo/data/servo_micro.xml b/servo/data/servo_micro.xml
index 3cf98a9..d69635b 100644
--- a/servo/data/servo_micro.xml
+++ b/servo/data/servo_micro.xml
@@ -193,12 +193,6 @@
     <params interface="2" drv="tca6416" slv="0x20" od="PU" port="0"
     offset="6" map="press" init="release"></params>
   </control>
-  <control>
-    <name>warm_reset</name>
-    <doc>warm_reset</doc>
-    <params interface="2" drv="tca6416" slv="0x20" od="PU" port="0"
-    offset="7" map="onoff_i" init="off"></params>
-  </control>
 
   <control>
     <name>rec_mode</name>
@@ -207,12 +201,6 @@
     offset="0" map="onoff_i" init="off"></params>
   </control>
   <control>
-    <name>hpd</name>
-    <doc>hpd</doc>
-    <params interface="2" drv="tca6416" slv="0x20" port="1"
-    offset="2" map="onoff"></params>
-  </control>
-  <control>
     <name>fw_up</name>
     <alias>t20_rec,proc_hot</alias>
     <doc>Firmware update mode via USB</doc>
diff --git a/servo/data/servo_micro_orig.xml b/servo/data/servo_micro_orig.xml
new file mode 100644
index 0000000..03fda40
--- /dev/null
+++ b/servo/data/servo_micro_orig.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<root>
+  <include>
+    <name>servo_micro.xml</name>
+  </include>
+
+  <control>
+    <name>warm_reset</name>
+    <doc>warm_reset</doc>
+    <params interface="2" drv="tca6416" slv="0x20" od="PU" port="0"
+    offset="7" map="onoff_i" init="off"></params>
+  </control>
+  <control>
+    <name>hpd</name>
+    <doc>hpd</doc>
+    <params interface="2" drv="tca6416" slv="0x20" port="1"
+    offset="2" map="onoff"></params>
+  </control>
+</root>
diff --git a/servo/data/servo_micro_reconf.xml b/servo/data/servo_micro_reconf.xml
new file mode 100644
index 0000000..281f376
--- /dev/null
+++ b/servo/data/servo_micro_reconf.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<root>
+  <include>
+    <name>servo_micro.xml</name>
+  </include>
+
+  <control>
+    <name>warm_reset</name>
+    <doc>warm reset</doc>
+    <params interface="2" drv="tca6416" slv="0x20" od="PU" port="1"
+    offset="2" map="onoff_i" init="off"></params>
+  </control>
+</root>
diff --git a/servo/data/servo_v2_r0.xml b/servo/data/servo_v2_r0.xml
index d0e174c..51db5a2 100644
--- a/servo/data/servo_v2_r0.xml
+++ b/servo/data/servo_v2_r0.xml
@@ -168,12 +168,6 @@
     offset="3" map="onoff_i" init="off"></params>
   </control>
   <control>
-    <name>warm_reset</name>
-    <doc>warm_reset</doc>
-    <params interface="2" drv="tca6416" slv="0x20" od="PU" port="0"
-    offset="4" map="onoff_i" init="off"></params>
-  </control>
-  <control>
     <name>dev_mode</name>
     <doc>dev_mode GPIO. Note, is aliased to spi1_buf_on_flex_en
     GPIO</doc>
@@ -216,12 +210,6 @@
     offset="1" map="onoff"></params>
   </control>
   <control>
-    <name>hpd</name>
-    <doc>hpd</doc>
-    <params interface="2" drv="tca6416" slv="0x20" port="1"
-    offset="2" map="onoff"></params>
-  </control>
-  <control>
     <name>fw_wp</name>
     <doc>Firmware write-protect GPIO</doc>
     <params cmd="get" interface="2" drv="tca6416" slv="0x20"
diff --git a/servo/data/servo_v2_r1_orig.xml b/servo/data/servo_v2_r1_orig.xml
new file mode 100644
index 0000000..437a720
--- /dev/null
+++ b/servo/data/servo_v2_r1_orig.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<root>
+  <include>
+    <name>servo_v2_r1.xml</name>
+  </include>
+
+  <control>
+    <name>warm_reset</name>
+    <doc>warm_reset</doc>
+    <params interface="2" drv="tca6416" slv="0x20" od="PU" port="0"
+     offset="4" map="onoff_i" init="off"></params>
+  </control>
+  <control>
+    <name>hpd</name>
+    <doc>hpd</doc>
+    <params interface="2" drv="tca6416" slv="0x20" port="1"
+    offset="2" map="onoff"></params>
+  </control>
+</root>
diff --git a/servo/data/servo_v2_r1_reconf.xml b/servo/data/servo_v2_r1_reconf.xml
new file mode 100644
index 0000000..9bf89fc
--- /dev/null
+++ b/servo/data/servo_v2_r1_reconf.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<root>
+  <include>
+    <name>servo_v2_r1.xml</name>
+  </include>
+
+  <control>
+    <name>warm_reset</name>
+    <doc>warm_reset</doc>
+    <params interface="2" drv="tca6416" slv="0x20" od="PU" port="1"
+     offset="2" map="onoff_i" init="off"></params>
+  </control>
+</root>
diff --git a/servo/data/servo_v3_r0.xml b/servo/data/servo_v3_r0.xml
index 26a7a3a..a47c294 100644
--- a/servo/data/servo_v3_r0.xml
+++ b/servo/data/servo_v3_r0.xml
@@ -70,12 +70,7 @@
     <params interface="2" drv="tca6416" slv="0x20" od="PU" port="0"
     offset="3" map="onoff_i" init="off"></params>
   </control>
-  <control>
-    <name>warm_reset</name>
-    <doc>warm_reset</doc>
-    <params interface="2" drv="tca6416" slv="0x20" od="PU" port="0"
-    offset="4" map="onoff_i" init="off"></params>
-  </control>
+
   <control>
     <name>dev_mode</name>
     <doc>dev_mode GPIO. Note, is aliased to spi1_buf_on_flex_en
@@ -119,12 +114,6 @@
     offset="1" map="onoff"></params>
   </control>
   <control>
-    <name>hpd</name>
-    <doc>hpd</doc>
-    <params interface="2" drv="tca6416" slv="0x20" port="1"
-    offset="2" map="onoff"></params>
-  </control>
-  <control>
     <name>fw_wp</name>
     <doc>Firmware write-protect GPIO</doc>
     <params cmd="get" interface="2" drv="tca6416" slv="0x20"
diff --git a/servo/data/servo_v3_r0_orig.xml b/servo/data/servo_v3_r0_orig.xml
new file mode 100644
index 0000000..ea198f8
--- /dev/null
+++ b/servo/data/servo_v3_r0_orig.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<root>
+  <include>
+    <name>servo_v3_r0.xml</name>
+  </include>
+
+  <control>
+    <name>warm_reset</name>
+    <doc>warm_reset</doc>
+    <params interface="2" drv="tca6416" slv="0x20" od="PU" port="0"
+     offset="4" map="onoff_i" init="off"></params>
+  </control>
+  <control>
+    <name>hpd</name>
+    <doc>hpd</doc>
+    <params interface="2" drv="tca6416" slv="0x20" port="1"
+    offset="2" map="onoff"></params>
+  </control>
+</root>
diff --git a/servo/data/servo_v3_r0_reconf.xml b/servo/data/servo_v3_r0_reconf.xml
new file mode 100644
index 0000000..06ea320
--- /dev/null
+++ b/servo/data/servo_v3_r0_reconf.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<root>
+  <include>
+    <name>servo_v3_r0.xml</name>
+  </include>
+
+  <control>
+    <name>warm_reset</name>
+    <doc>warm_reset</doc>
+    <params interface="2" drv="tca6416" slv="0x20" od="PU" port="1"
+     offset="2" map="onoff_i" init="off"></params>
+  </control>
+</root>
diff --git a/servo/ftdi_common.py b/servo/ftdi_common.py
index e3862d1..fd02729 100644
--- a/servo/ftdi_common.py
+++ b/servo/ftdi_common.py
@@ -43,10 +43,10 @@
     {'miniservo_v1': ['miniservo.xml'],
      'servo_v1': ['servo.xml'],
      'servo_v2_r0': ['servo_v2_r0.xml'],
-     'servo_v2': ['servo_v2_r1.xml'],
-     'servo_v3': ['servo_v3_r0.xml'],
+     'servo_v2': ['servo_v2_r1_orig.xml'],
+     'servo_v3': ['servo_v3_r0_orig.xml'],
      'servo_v4': ['servo_v4.xml'],
-     'servo_micro': ['servo_micro.xml'],
+     'servo_micro': ['servo_micro_orig.xml'],
      'ccd_cr50': ['ccd_cr50.xml'],
      'toad_v1': ['toad.xml'],
      'reston': ['reston.xml'],
@@ -54,6 +54,26 @@
      'plankton': ['plankton.xml'],
      }
 
+# dnschneid has moved warm reset to pin 39, replacing hpd.
+SERVO_CONFIG_DEFAULTS_RECONF = \
+    {'miniservo_v1': ['miniservo.xml'],
+     'servo_v1': ['servo.xml'],
+     'servo_v2_r0': ['servo_v2_r0.xml'],
+     'servo_v2': ['servo_v2_r1_reconf.xml'],
+     'servo_v3': ['servo_v3_r0_reconf.xml'],
+     'servo_v4': ['servo_v4.xml'],
+     'servo_micro': ['servo_micro_reconf.xml'],
+     'ccd_cr50': ['ccd_cr50.xml'],
+     'toad_v1': ['toad.xml'],
+     'reston': ['reston.xml'],
+     'fruitpie': ['fruitpie.xml'],
+     'plankton': ['plankton.xml'],
+     }
+
+# These are the boards with reconfigured servo headers.
+SERVO_CONFIG_RECONF_BOARDS = \
+    ('scarlet', 'zoombini', 'nefario')
+
 class FtdiContext(ctypes.Structure):
   """Defines primary context structure for libftdi.
 
diff --git a/servo/servod.py b/servo/servod.py
index 7da5a86..f7426ed 100755
--- a/servo/servod.py
+++ b/servo/servod.py
@@ -405,20 +405,24 @@
       logger.warn("Servo device's iserial was unrecognized.")
   return lot_id
 
-def get_auto_configs(logger, board_version):
+def get_auto_configs(logger, board_version, reconf):
   """Get xml configs that should be loaded.
 
   Args:
     board_version: string, board & version
+    reconf: boolean, use SERVO_CONFIG_DEFAULTS_RECONF instead
 
   Returns:
     configs: list of XML config files that should be loaded
   """
-  if board_version not in ftdi_common.SERVO_CONFIG_DEFAULTS:
+  config_defaults = ftdi_common.SERVO_CONFIG_DEFAULTS_RECONF \
+      if reconf else ftdi_common.SERVO_CONFIG_DEFAULTS
+
+  if board_version not in config_defaults:
     logger.warning('Unable to determine configs to load for board version = %s',
                  board_version)
     return []
-  return ftdi_common.SERVO_CONFIG_DEFAULTS[board_version]
+  return config_defaults[board_version]
 
 def main_function():
   (options, args) = _parse_args()
@@ -451,8 +455,13 @@
   board_version = get_board_version(lot_id, servo_device.idProduct)
   logger.debug('board_version = %s', board_version)
   all_configs = []
+
+  # Is this in the list of boards with reconfigured servo headers?
+  # b/64724237
+  reconf = options.board in ftdi_common.SERVO_CONFIG_RECONF_BOARDS
+
   if not options.noautoconfig:
-    all_configs += get_auto_configs(logger, board_version)
+    all_configs += get_auto_configs(logger, board_version, reconf)
 
   if options.config:
     for config in options.config: