1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718
|
// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// The messages in this file comprise the DBus/Protobuf interface for
// Runtime Probe.
syntax = "proto3";
package runtime_probe;
option go_package = "go.chromium.org/chromiumos/system_api/runtime_probe_proto";
// Defined error code.
enum ErrorCode {
// 0 is the default value of ProbeResult::error. It should never be used.
RUNTIME_PROBE_ERROR_NOT_SET = 0;
// Not able to read the ProbeRequest as DBus signature indicated.
RUNTIME_PROBE_ERROR_PROBE_REQUEST_INVALID = 1;
reserved 2, 3;
// Assigned probe config contains functions not able to be constructed.
RUNTIME_PROBE_ERROR_PROBE_CONFIG_INCOMPLETE_PROBE_FUNCTION = 4;
// Not able to parse the ProbeResult JSON string as protobuf message.
RUNTIME_PROBE_ERROR_PROBE_RESULT_INVALID = 5;
// Assigned probe config doesn't exist or is not holding a correct JSON
// format.
RUNTIME_PROBE_ERROR_PROBE_CONFIG_INVALID = 6;
}
// Request from client that indicates what categories to probe. Category must
// be existed on the per-board probe statement in rootfs.
message ProbeRequest {
// The name style here is on purposely align with factory probe output.
enum SupportCategory {
UNKNOWN = 0;
reserved 1;
battery = 2;
storage = 3;
vpd_cached = 4;
// Obsolete in M91.
network = 5;
camera = 6;
stylus = 7;
touchpad = 8;
touchscreen = 9;
dram = 10;
display_panel = 11;
cellular = 12;
ethernet = 13;
wireless = 14;
cpu = 15;
tpm = 16;
}
reserved 1;
repeated SupportCategory categories = 4;
// This option allows clients to retrieve data with privacy implication from
// D-Bus call to runtime_probe. Default to false and please use with caution.
bool include_privacy_fields = 2;
// If probe_default_category is True, the supplied categories above will be
// ignored.
bool probe_default_category = 3;
}
// Extra information for each probe result.
message Information {
// comp_group, used for grouping different probed components.
string comp_group = 1;
}
// TODO(b/158765173): Collect the possible HW interface types into an enum.
// Things about audio_codec.
message AudioCodec {
message Fields {
// The name of the codec presents in sysfs.
string name = 1;
}
// Component alias.
string name = 1;
// Component's details.
Fields values = 2;
// Component probe info.
Information information = 3;
}
// Things about battery.
message Battery {
// TODO(itspeter): Add more fileds for battery.
message Fields {
// (1) Most fields are following the naming of exposed ACPI interface.
// (2) Most units is in µ because of this unexplained kernel patch:
// https://chromium.git.corp.google.com/chromiumos/third_party/kernel/+/d7380965752505951668e85de59c128d1d6fd21f%5E%21/#F1
// Index number of this battery, starts from 1.
int32 index = 1 [deprecated = true];
// Manufacturer for length not exceeding EC_COMM_TEXT_MAX.
string manufacturer = 2;
// Model name for length not exceeding EC_COMM_TEXT_MAX.
string model_name = 3;
// Serial number for length not exceeding EC_COMM_TEXT_MAX.
string serial_number = 4;
// Design Capacity (µAh).
int32 charge_full_design = 5;
// Full Capacity (µAh, might change occasionally).
int32 charge_full = 6;
// Remaining capacity (µAh)
int32 charge_now = 7;
// Current Battery voltage (µV)
int32 voltage_now = 8;
// Designed minimum output voltage (µV)
int32 voltage_min_design = 9;
// Smart Battery Cycle Count in http://sbs-forum.org/specs/sbdat110.pdf
int32 cycle_count_smart = 10;
// Smart Battery Status defined in http://sbs-forum.org/specs/sbdat110.pdf
int32 status_smart = 11;
// Temperature in 0.1°K as Smart Battery Temperature defined in
// http://sbs-forum.org/specs/sbdat110.pdf
int32 temperature_smart = 12;
// The path of this battery in system. It is useful if caller needs to
// correlate with other information
string path = 13;
// Smart Manufacture Date is defined in
// http://sbs-forum.org/specs/sbdat110.pdf.
// The value is calculated by ((year-1980) * 512 + month * 32 + day).
int32 manufacture_date_smart = 14;
// Technology is defined in
// /sys/class/power_supply/<supply_name>/technology section in
// https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-class-power.
string technology = 15;
// DeviceChemistry (0x22) in Smart Battery Data Specification.
string chemistry = 16;
}
// Component alias.
string name = 1;
// Component's details.
Fields values = 2;
// Component probe info.
Information information = 3;
// Component position.
string position = 4;
}
// Things about storage.
message Storage {
message Fields {
// The path of this storage in system. It is useful if caller needs to
// correlate with other information.
string path = 1;
// Number of sectors of this storage, traditionally 1 sector = 512 Bytes.
int64 sectors = 2;
// Exact size of this storage, reported in bytes
int64 size = 3;
// Storage type, could be MMC / NVMe / ATA
string type = 4;
// Below are based on JEDEC Standard No. 84-B51, and kernel MMC driver
// exposed in sysfs:
// https://chromium.googlesource.com/chromiumos/third_party/kernel/+/v3.18/drivers/mmc/core/mmc.c#71
// https://chromium.googlesource.com/chromiumos/third_party/kernel/+/v3.18/include/linux/mmc/card.h#17
// https://chromium.googlesource.com/chromiumos/third_party/kernel/+/v3.18/Documentation/mmc/mmc-dev-attrs.txt
// MID: Manufacturer ID, 8 bits.
uint32 mmc_manfid = 5;
// PNM: Product name, ASCII characters for 6 bytes.
string mmc_name = 6;
// Hardware/Product Revision, 4 bits. (SD and MMCv1 only)
uint32 mmc_hwrev = 15;
// PRV: Product revision, 8 bits. (SD and MMCv4 only)
uint32 mmc_prv = 7;
// PSN: Product serial number, 32 bits.
uint32 mmc_serial = 8;
// OID: OEM/Application ID, 8 bits.
uint32 mmc_oemid = 9;
// The following are fields for NVMe. Every field name comes with
// prefix "pci_" as NVMe is a PCI device.
// These fields are based on what kernel pci driver exposes in sysfs:
// https://chromium.googlesource.com/chromiumos/third_party/kernel/+/v4.4/include/linux/pci.h#267
// Vendor ID, 16 bits
uint32 pci_vendor = 10;
// Device ID, 16 bits
uint32 pci_device = 11;
// Device class indicator, 32 bits
uint32 pci_class = 12;
// The following are fields for SATA. Every field name comes with
// prefix "ata_".
// These fields based on what kernel pci driver exposes in sysfs:
// https://chromium.googlesource.com/chromiumos/third_party/kernel/+/v4.4/drivers/scsi/scsi_devinfo.c#22
// Vendor name, 8 bytes
string ata_vendor = 13;
// Model name, 16 bytes
string ata_model = 14;
// The following are fields for UFS. Every field name comes with prefix
// "ufs_".
// Vendor name.
string ufs_vendor = 16;
// Model name.
string ufs_model = 17;
// The following are fields for mmc_host. Every field name comes with prefix
// "mmc_host_".
// The bus type, could be pci / usb / sdio / uninterested.
string mmc_host_bus_type = 18;
// Vendor ID, 16 bits hex string
string mmc_host_pci_vendor_id = 19;
// Device ID, 16 bits hex string
string mmc_host_pci_device_id = 20;
// Device revision, 8 bits hex string
string mmc_host_pci_revision = 21;
// Subsystem ID, 16 bits hex string
string mmc_host_pci_subsystem = 22;
// Device class indicator, 32 bits
string mmc_host_pci_class = 23;
}
// Component alias.
string name = 1;
// Component's details.
Fields values = 2;
// Component probe info.
Information information = 3;
// Component position.
string position = 4;
}
// Things about VPD (Vital Product Data) , cached version.
message VpdCached {
// TODO(itspeter): Add more fileds for Vpd.
message Fields {
// Allowed VPD fileds are reviewed on https://b/131849646
// Up to date documentation on VPD fields for each Chromebook is on
// https://www.google.com/chromeos/partner/fe/docs/factory/vpd.html
// SKU number of the unit
string vpd_sku_number = 1;
}
// Component alias.
string name = 1;
// Component's details.
Fields values = 2;
// Component probe info.
Information information = 3;
}
// Things about network.
message Network {
message Fields {
// The path of this network in system. It is useful if caller needs to
// correlate with other information.
string path = 1;
// Network type, could be wireless / ethernet / cellular
string type = 2;
// Network bus, could be pci / usb / sdio
string bus_type = 3;
// The following are fields for PCI. Every field name comes with
// prefix "pci_".
// These fields are based on what kernel pci driver exposes in sysfs:
// https://chromium.googlesource.com/chromiumos/third_party/kernel/+/v4.4/include/linux/pci.h#267
// Vendor ID, 16 bits
uint32 pci_vendor_id = 4;
// Device ID, 16 bits
uint32 pci_device_id = 5;
// Device revision, 8 bits
uint32 pci_revision = 6;
// Subsystem ID, 16 bits
uint32 pci_subsystem = 12;
// The following are fields for USB. Every field name comes with
// prefix "usb_".
// Vendor ID, 16 bits
uint32 usb_vendor_id = 7;
// Product ID, 16 bits
uint32 usb_product_id = 8;
// Device Release Number, 16 bits.
uint32 usb_bcd_device = 9;
// The following are fields for SDIO. Every field name comes with
// prefix "sdio_".
// Vendor ID, 16 bits
uint32 sdio_vendor_id = 10;
// Product ID, 16 bits
uint32 sdio_device_id = 11;
}
// Component alias.
string name = 1;
// Component's details.
Fields values = 2;
// Component probe info.
Information information = 3;
// Component position.
string position = 4;
}
enum UsbRemovable {
UNKNOWN = 0;
REMOVABLE = 1;
FIXED = 2;
}
// Things about cameras.
message Camera {
message Fields {
// The device path of this camera (e.g. "/dev/video0"). It is useful
// if the caller needs to correlate with other information.
string path = 1;
// HW interface type, currently must be "usb" or "mipi".
string bus_type = 2;
// The following are fields for USB. Every field name must start with
// prefix "usb_".
// Vendor ID, 16 bits.
uint32 usb_vendor_id = 3;
// Product ID, 16 bits.
uint32 usb_product_id = 4;
// Device Release Number, 16 bits.
uint32 usb_bcd_device = 5;
// Whether this USB device is removable or not.
UsbRemovable usb_removable = 6;
// The following are fields for MIPI. Every field name must start with
// prefix "mipi_".
// Entity name from V4L2.
string mipi_name = 7;
// Camera module vendor ID and product ID read from camera EEPROM.
string mipi_module_id = 8;
// Image sensor vendor ID and product ID read from camera EEPROM.
string mipi_sensor_id = 9;
// Image sensor vendor ID queried via V4L2.
string mipi_vendor = 10;
}
// Component alias.
string name = 1;
// Component's details.
Fields values = 2;
// Component probe info.
Information information = 3;
// Component position.
string position = 4;
}
// Things about input_device.
message InputDevice {
enum Type {
TYPE_UNSPECIFIED = 0;
TYPE_UNKNOWN = 1;
TYPE_STYLUS = 2;
TYPE_TOUCHPAD = 3;
TYPE_TOUCHSCREEN = 4;
}
message Fields {
// The name of the device.
string name = 1;
// The pathname of the sysfs entry of that device.
string path = 2;
// The event of the device.
string event = 3;
// The bus number, 16 bits.
uint32 bus = 4;
// The vendor code, 16 bits.
uint32 vendor = 5;
// The product code, 16 bits.
uint32 product = 6;
// The version number, 16 bits.
uint32 version = 7;
// The firmware version.
string fw_version = 8;
// The type of the device.
Type device_type = 9;
}
// Component alias.
string name = 1;
// Component's details.
Fields values = 2;
// Component probe info.
Information information = 3;
// Component position.
string position = 4;
}
// Things about memory.
message Memory {
message Fields {
// Part number.
string part = 1;
// Memory size in MiB.
uint32 size = 2;
// Memory slot index, 0-based
uint32 slot = 3;
}
// Component alias.
string name = 1;
// Component's details.
Fields values = 2;
// Component probe info.
Information information = 3;
// Component position.
string position = 4;
}
message Edid {
enum Vendor {
VENDOR_UNKNOWN = 0;
VENDOR_AAA = 1;
VENDOR_ACI = 61;
VENDOR_ACR = 70;
VENDOR_ACT = 72;
VENDOR_ADA = 79;
VENDOR_AGO = 171;
VENDOR_AOP = 380;
VENDOR_API = 399;
VENDOR_APP = 406;
VENDOR_ARD = 446;
VENDOR_ART = 462;
VENDOR_ASK = 479;
VENDOR_ATO = 509;
VENDOR_AUO = 535;
VENDOR_AUS = 539;
VENDOR_AVT = 566;
VENDOR_BEL = 792;
VENDOR_BMD = 992;
VENDOR_BNO = 1029;
VENDOR_BOE = 1045;
VENDOR_BPS = 1085;
VENDOR_CAT = 1372;
VENDOR_CHR = 1552;
VENDOR_CIN = 1574;
VENDOR_CMN = 1678;
VENDOR_CMO = 1679;
VENDOR_CNC = 1693;
VENDOR_CPL = 1754;
VENDOR_CPT = 1762;
VENDOR_CRO = 1809;
VENDOR_CSO = 1835;
VENDOR_CTO = 1861;
VENDOR_CTX = 1870;
VENDOR_CUK = 1883;
VENDOR_DEL = 2144;
VENDOR_DGC = 2187;
VENDOR_DMO = 2355;
VENDOR_DON = 2406;
VENDOR_DPL = 2430;
VENDOR_EGA = 2861;
VENDOR_ENC = 3045;
VENDOR_EPH = 3102;
VENDOR_EXN = 3316;
VENDOR_EXP = 3318;
VENDOR_FNI = 3727;
VENDOR_FUS = 3919;
VENDOR_GBT = 4102;
VENDOR_GFN = 4200;
VENDOR_GGL = 4224;
VENDOR_GSM = 4537;
VENDOR_HIQ = 4957;
VENDOR_HKC = 4995;
VENDOR_HOL = 5108;
VENDOR_HPN = 5136;
VENDOR_HSD = 5204;
VENDOR_HTC = 5229;
VENDOR_HWP = 5320;
VENDOR_HYT = 5376;
VENDOR_INO = 5761;
VENDOR_INT = 5766;
VENDOR_INX = 5770;
VENDOR_ITE = 5907;
VENDOR_IVM = 5967;
VENDOR_IVO = 5969;
VENDOR_JVC = 6633;
VENDOR_KDB = 6840;
VENDOR_KDC = 6841;
VENDOR_KTC = 7257;
VENDOR_LEN = 7554;
VENDOR_LGD = 7596;
VENDOR_LNX = 7798;
VENDOR_LPL = 7838;
VENDOR_LWR = 8026;
VENDOR_MAX = 8136;
VENDOR_MEG = 8223;
VENDOR_MEI = 8225;
VENDOR_MEL = 8228;
VENDOR_MJI = 8355;
VENDOR_MOM = 8489;
VENDOR_MST = 8600;
VENDOR_MSX = 8604;
VENDOR_MTC = 8609;
VENDOR_MTX = 8630;
VENDOR_NCP = 8856;
VENDOR_NCR = 8858;
VENDOR_NEC = 8895;
VENDOR_NEX = 8916;
VENDOR_NVD = 9338;
VENDOR_ONK = 9813;
VENDOR_ORN = 9920;
VENDOR_OTM = 9971;
VENDOR_OVR = 10028;
VENDOR_PAR = 10158;
VENDOR_PCC = 10195;
VENDOR_PHL = 10334;
VENDOR_PIO = 10363;
VENDOR_PLY = 10451;
VENDOR_PNR = 10496;
VENDOR_QDS = 10913;
VENDOR_QNT = 11174;
VENDOR_RAT = 11512;
VENDOR_REN = 11610;
VENDOR_RTK = 11997;
VENDOR_SAM = 12181;
VENDOR_SAN = 12182;
VENDOR_SDC = 12249;
VENDOR_SEC = 12275;
VENDOR_SGT = 12344;
VENDOR_SHP = 12366;
VENDOR_SII = 12385;
VENDOR_SIS = 12395;
VENDOR_SLA = 12455;
VENDOR_SMC = 12483;
VENDOR_SNY = 12531;
VENDOR_STA = 12663;
VENDOR_STD = 12666;
VENDOR_STN = 12676;
VENDOR_SVS = 12733;
VENDOR_SYN = 12806;
VENDOR_TAI = 12853;
VENDOR_TCL = 12908;
VENDOR_TDC = 12925;
VENDOR_TOP = 13224;
VENDOR_TOS = 13227;
VENDOR_TSB = 13314;
VENDOR_TST = 13332;
VENDOR_UNK = 13869;
VENDOR_VES = 14319;
VENDOR_VID = 14408;
VENDOR_VIT = 14424;
VENDOR_VIZ = 14430;
VENDOR_VSC = 14667;
VENDOR_VTK = 14701;
VENDOR_WDE = 14955;
VENDOR_WST = 15360;
VENDOR_WYS = 15515;
VENDOR_XLX = 15858;
VENDOR_YMH = 16544;
}
message Fields {
// The absolute path to the Edid file of the device.
string path = 1;
// The vendor code, 3 capital letters.
string vendor = 2;
// The product ID, 16 bits.
uint32 product_id = 3;
// The height of the device.
uint32 height = 4;
// The width of the device.
uint32 width = 5;
}
// Component alias.
string name = 1;
// Component's details.
Fields values = 2;
// Component probe info.
Information information = 3;
// Component position.
string position = 4;
}
message ApI2c {
message Fields {
uint32 data = 1;
}
string name = 1;
Fields values = 2;
}
message EcI2c {
message Fields {
uint32 data = 1;
}
string name = 1;
Fields values = 2;
}
message Tcpc {
message Fields {
// Port ID, 8 bits.
uint32 port = 1;
// Vendor ID, 16 bits.
uint32 vendor_id = 2;
// Product ID, 16 bits.
uint32 product_id = 3;
// Device ID, 16 bits.
uint32 device_id = 4;
}
string name = 1;
Fields values = 2;
}
message Cpu {
message Fields {
// CPU model name
string model = 1;
// Number of cores.
uint32 cores = 2;
}
string name = 1;
Fields values = 2;
}
message Tpm {
message Fields {
// TPM spec level.
uint32 spec_level = 1;
// Vendor specific information.
string vendor_specific = 2;
// Manufacturer code.
string manufacturer = 3;
}
string name = 1;
Fields values = 2;
}
// A ProbeResult contains all potential probe results. For category not
// existed or not requested for probing, field is expected to be empty.
message ProbeResult {
// If a call was successful, error will not be defined.
// If a call failed, it must set an error code.
ErrorCode error = 1;
// The checksum of probe config content calculated using SHA1 hash.
string probe_config_checksum = 6;
// The following are the fields for different component categories.
repeated AudioCodec audio_codec = 2;
repeated Battery battery = 3;
repeated Storage storage = 4;
repeated VpdCached vpd_cached = 5;
// Obsolete in M91.
repeated Network network = 7;
repeated Camera camera = 8;
repeated InputDevice stylus = 9;
repeated InputDevice touchpad = 10;
repeated InputDevice touchscreen = 11;
repeated Memory dram = 12;
repeated Edid display_panel = 13;
repeated Network cellular = 14;
repeated Network ethernet = 15;
repeated Network wireless = 16;
repeated Cpu cpu = 17;
repeated Tpm tpm = 18;
}
// Holds componenet fields for any component categories.
message ComponentFields {
oneof component_fields {
AudioCodec.Fields audio_codec = 1;
Battery.Fields battery = 2;
Storage.Fields storage = 3;
VpdCached.Fields vpd_cached = 4;
Camera.Fields camera = 5;
InputDevice.Fields stylus = 6;
InputDevice.Fields touchpad = 7;
InputDevice.Fields touchscreen = 8;
Memory.Fields dram = 9;
Edid.Fields display_panel = 10;
Network.Fields cellular = 11;
Network.Fields ethernet = 12;
Network.Fields wireless = 13;
Cpu.Fields cpu = 14;
Tpm.Fields tpm = 15;
}
}
message GetKnownComponentsRequest {
ProbeRequest.SupportCategory category = 1;
}
message GetKnownComponentsResult {
ErrorCode error = 1;
repeated string component_names = 2;
}
message ProbeSsfcComponentsRequest {}
message ProbeSsfcComponentsResponse {
ErrorCode error = 1;
string probe_config_checksum = 2;
// Components
repeated ApI2c ap_i2c = 11;
repeated EcI2c ec_i2c = 12;
repeated Tcpc tcpc = 13;
repeated InputDevice touchscreen = 14;
repeated Camera camera = 15;
repeated Edid display_panel = 16;
}
// Defines the order of Runtime HWID components.
message RuntimeHwidComponent {
uint32 feature_level = 1;
uint32 scope_level = 2;
repeated Battery battery = 3;
repeated Camera camera = 4;
repeated Edid display_panel = 5;
repeated InputDevice stylus = 6;
repeated InputDevice touchpad = 7;
repeated InputDevice touchscreen = 8;
repeated Memory dram = 9;
repeated Network cellular = 10;
repeated Network ethernet = 11;
repeated Network wireless = 12;
repeated Storage storage = 13;
}
|