gooftool: add bcdDevice and storage size into component list

The bcdDevice for USB is very helpful to diagnose hardware (firmware) revision.
We also need the more accurate storage info (size of block numbers).

BUG=chrome-os-partner:4804,chrome-os-partner:1075
TEST=./gft_hwcomp.py # on ZGB
     # seeing: part_id_storage changed from 'ATA SanDisk SSD P4 1' to
     #         'ATA SanDiskSSD P4 1 #31277232'.
     # seeing: part_id_webcam has new version info (ex, 5575) at end.

Change-Id: I0f5444ccbdd8e6371444d5007acfaacbb4959862
Reviewed-on: http://gerrit.chromium.org/gerrit/4085
Reviewed-by: Tom Wai-Hong Tam <waihong@chromium.org>
Tested-by: Hung-Te Lin <hungte@chromium.org>
diff --git a/gft_hwcomp.py b/gft_hwcomp.py
index 318ed4f..4b0b284 100755
--- a/gft_hwcomp.py
+++ b/gft_hwcomp.py
@@ -299,7 +299,7 @@
       if os.path.exists(os.path.join(path, 'idProduct')):
         break
       path = os.path.split(path)[0]
-    optional_fields = ['manufacturer', 'product']
+    optional_fields = ['manufacturer', 'product', 'bcdDevice']
     (info, optional) = self._get_sysfs_device_info(
         path, ['idVendor', 'idProduct'], optional_fields)
     if not info:
@@ -659,11 +659,14 @@
 
   def get_part_id_storage(self):
     part_id = ''
-    path = gft_common.SystemOutput('find /sys/devices -name "%s"' %
-                                   self.get_ssd_name())
-    path = os.path.join(path.strip(), 'device')
+    node = '/sys/class/block/%s' % self.get_ssd_name()
+    path = os.path.join(node, 'device')
     if not os.path.exists(path):
       return part_id
+    size = ''
+    size_path = os.path.join(node, 'size')
+    if os.path.exists(size_path):
+      size = '#' + gft_common.ReadOneLine(size_path)
     info_list = (
         ['vendor', 'model'],  # ATA
         ['type', 'name', 'fwrev', 'hwrev', 'oemid', 'manfid'],  # EMMC
@@ -673,7 +676,7 @@
               for data_file in info
               if os.path.exists(os.path.join(path, data_file))]
       if data:
-        return self.compact_id(data)
+        return self.compact_id(data + [size])
     return part_id
 
   def get_part_id_keyboard(self):