firmware_programmer: handle servo v4 with micro and ccd

BUG=b:35579416
BRANCH=none
TEST=run provision_FirmwareUpdate

Change-Id: I25c755ca2859baca603992c1ae84d422172e411e
Signed-off-by: Mary Ruthven <mruthven@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1758926
Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
Legacy-Commit-Queue: Commit Bot <commit-bot@chromium.org>
Reviewed-by: Namyoon Woo <namyoon@chromium.org>
diff --git a/server/cros/servo/firmware_programmer.py b/server/cros/servo/firmware_programmer.py
index e4e4a0c..15a6349 100644
--- a/server/cros/servo/firmware_programmer.py
+++ b/server/cros/servo/firmware_programmer.py
@@ -137,7 +137,7 @@
         self._ro_vpd = os.path.join(self._tmp_path, 'ro_vpd')
         self._rw_vpd = os.path.join(self._tmp_path, 'rw_vpd')
         self._gbb = os.path.join(self._tmp_path, 'gbb')
-        self._servo_version = self._servo.get_servo_version()
+        self._servo_version = self._servo.get_servo_version(active=True)
         self._servo_serials = self._servo._server.get_servo_serials()
 
 
@@ -160,6 +160,7 @@
             servo_v3_programmer = 'linux_spi'
             servo_v4_with_micro_programmer = 'raiden_debug_spi'
             servo_v4_with_ccd_programmer = 'raiden_debug_spi:target=AP'
+
             if self._servo_version == 'servo_v2':
                 programmer = servo_v2_programmer
                 servo_serial = self._servo_serials.get('main')
@@ -227,6 +228,11 @@
         @param path: a string, name of the file containing the firmware image.
         """
         self._fw_path = path
+
+        # If servo is running with servo v4, there may be two programming
+        # devices. Determine the programmer based on the active one.
+        self._servo_version = self._servo.get_servo_version(active=True)
+
         # CCD takes care holding AP/EC. Don't need the following steps.
         if self._servo_version != 'servo_v4_with_ccd_cr50':
             faft_config = FAFTConfig(self._servo.get_board())
@@ -270,6 +276,10 @@
         if self._ec_chip is None:
             self._ec_chip = self._servo.get('ec_chip')
 
+        # If servo is running with servo v4, there may be two programming
+        # devices. Determine the programmer based on the active one.
+        self._servo_version = self._servo.get_servo_version(active=True)
+
         # Get the port of servod. flash_ec may use it to talk to servod.
         port = self._servo._servo_host.servo_port
         self._program_cmd = ('flash_ec --chip=%s --image=%s --port=%d' %
diff --git a/server/cros/servo/servo.py b/server/cros/servo/servo.py
index 23dd258..65e4d41 100644
--- a/server/cros/servo/servo.py
+++ b/server/cros/servo/servo.py
@@ -907,13 +907,27 @@
                                     args=args).stdout.strip()
 
 
-    def get_servo_version(self):
+    def get_servo_version(self, active=False):
         """Get the version of the servo, e.g., servo_v2 or servo_v3.
 
+        @param active: Only return the servo type with the active device.
         @return: The version of the servo.
 
         """
-        return self._server.get_version()
+        servo_type = self._server.get_version()
+        if '_and_' not in servo_type or not active:
+            return servo_type
+
+        # If servo v4 is using ccd and servo micro, modify the servo type to
+        # reflect the active device.
+        active_device = self.get('active_v4_device')
+        if active_device in servo_type:
+            logging.info('%s is active', active_device)
+            return 'servo_v4_with_' + active_device
+
+        logging.warn("%s is active even though it's not in servo type",
+                     active_device)
+        return servo_type
 
 
     def running_through_ccd(self):