ccd: Get the power button state from Cr50 console

In the lab, it checks the power button state to verify the health
between DUT and servo. Though, setting power button in Cr50 console
doesn't work on all platforms, getting its value is fine. So add
back its get method.

BUG=chrome-os-partner:62904
TEST=Started servod and run "dut-control pwr_button"
TEST=Started servod and calls the servod RPC calls:
>>> import xmlrpclib
>>> c = xmlrpclib.ServerProxy('http://localhost:9999')
>>> c.power_normal_press()

Change-Id: Iec59390ff750996846afb01bd452520efb19335c
Reviewed-on: https://chromium-review.googlesource.com/445961
Commit-Ready: Wai-Hong Tam <waihong@google.com>
Tested-by: Wai-Hong Tam <waihong@google.com>
Reviewed-by: Aseda Aboagye <aaboagye@chromium.org>
Reviewed-by: danny chan <dchan@chromium.org>
Reviewed-by: Todd Broch <tbroch@chromium.org>
diff --git a/servo/data/ccd_cr50.xml b/servo/data/ccd_cr50.xml
index 84afb42..6c49ec2 100644
--- a/servo/data/ccd_cr50.xml
+++ b/servo/data/ccd_cr50.xml
@@ -86,6 +86,12 @@
     clobber_ok=""></params>
   </control>
   <control>
+    <name>pwr_button</name>
+    <doc>Power button GPIO</doc>
+    <params cmd="get" subtype="pwr_button" interface="8" drv="cr50" map="press"
+    clobber_ok=""></params>
+  </control>
+  <control>
     <name>ccd_lock</name>
     <doc>State of CCD restricted console lock</doc>
     <params cmd="get" subtype="ccd_lock" interface="8" drv="cr50" map="onoff"
diff --git a/servo/drv/cr50.py b/servo/drv/cr50.py
index a8648d0..35d4e39 100644
--- a/servo/drv/cr50.py
+++ b/servo/drv/cr50.py
@@ -105,6 +105,20 @@
     else:
       self._issue_cmd("sysrst on")
 
+  @restricted_command
+  def _Get_pwr_button(self):
+    """Getter of pwr_button.
+
+    Returns:
+      0: power button press.
+      1: power button release.
+    """
+    result = self._issue_cmd_get_results(
+        "powerbtn", ["powerbtn: (forced press|pressed|released)"])[0]
+    if result is None:
+      raise cr50Error("Cannot retrieve power button result on cr50 console.")
+    return 1 if result[1] == "released" else 0
+
   def _Get_ccd_lock(self):
     """Getter of ccd_lock.
 
diff --git a/servo/keyboard_handlers.py b/servo/keyboard_handlers.py
index de87de3..4cc4eb4 100644
--- a/servo/keyboard_handlers.py
+++ b/servo/keyboard_handlers.py
@@ -10,6 +10,8 @@
 import serial
 import time
 
+from drv.hw_driver import HwDriverError
+
 
 class _BaseHandler(object):
     """Base class for keyboard handlers.
@@ -83,13 +85,15 @@
         if secs is '':
             secs = self.NORMAL_TRANSITION_DELAY
 
-        # Check if pwr_button control available. Use it by default.
+        # Check if pwr_button control available, by setting it to
+        # its current value. Use pwr_button control by default.
         # Otherwise, use pwr_button_hold which calls a single EC
         # console command to toggle power button, for the CCD case.
         try:
-            self._servo.get('pwr_button')
+            value = self._servo.get('pwr_button')
+            self._servo.set('pwr_button', value)
             use_hold_command = False
-        except NameError:
+        except HwDriverError:
             use_hold_command = True
 
         if use_hold_command: