Firmware Provisioning: add servo/lib
This module allows users to get correct servo-related variables for
flashing, specifically, dut-controls to be run before and after flashing
and the programmer argument.
BUG=None
TEST=unit
Change-Id: I105d22f03a324c3a64105464228b412f978df255
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/dev-util/+/3321296
Tested-by: Sergey Frolov <sfrolov@google.com>
Auto-Submit: Sergey Frolov <sfrolov@google.com>
Reviewed-by: Otabek Kasimov <otabek@google.com>
Reviewed-by: Jaques Clapauch <jaquesc@google.com>
Commit-Queue: Sergey Frolov <sfrolov@google.com>
diff --git a/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_config.go b/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_config.go
new file mode 100644
index 0000000..45003c5
--- /dev/null
+++ b/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_config.go
@@ -0,0 +1,42 @@
+// Copyright 2021 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// package servo_lib provides servo-related variables, such as dut-controls
+// to be run before and after flashing, and a programmer argument.
+package servo_lib
+
+import "fmt"
+
+type ServoConfig struct {
+ dut_on [][]string
+ dut_off [][]string
+ programmer string
+}
+
+type UnsupportedServoError struct {
+ servoType ServoType
+ board string
+}
+
+func (m *UnsupportedServoError) Error() string {
+ return fmt.Sprintf("board %v does not support servo %v", m.board, m.servoType.string)
+}
+
+func GetServoConfig(board, servoSerial string, servoType ServoType) (*ServoConfig, error) {
+ dut_on := [][]string{{"cpu_fw_spi:on"}}
+ dut_off := [][]string{{"cpu_fw_spi:off"}}
+ programmer := ""
+ if servoType.IsV2() {
+ programmer = fmt.Sprintf("ft2232_spi:type=google-servo-v2,serial=%v", servoSerial)
+ } else if servoType.IsMicro() || servoType.IsC2D2() {
+ programmer = fmt.Sprintf("raiden_debug_spi:serial=%v", servoSerial)
+ } else if servoType.IsCCD() {
+ dut_on = nil
+ dut_off = nil
+ programmer = fmt.Sprintf("raiden_debug_spi:target=AP,serial=%v", servoSerial)
+ } else {
+ return nil, &UnsupportedServoError{servoType, board}
+ }
+ return &ServoConfig{dut_on, dut_off, programmer}, nil
+}
diff --git a/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_type.go b/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_type.go
new file mode 100644
index 0000000..70f1871
--- /dev/null
+++ b/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_type.go
@@ -0,0 +1,40 @@
+// Copyright 2021 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+package servo_lib
+
+import "strings"
+
+type ServoType struct {
+ string
+}
+
+func NewServoType(servo_type string) ServoType {
+ return ServoType{servo_type}
+}
+
+func (s *ServoType) IsV2() bool {
+ return strings.Contains(s.string, "servo_v2")
+}
+func (s *ServoType) IsV4() bool {
+ return strings.Contains(s.string, "servo_v4")
+}
+func (s *ServoType) IsC2D2() bool {
+ return strings.Contains(s.string, "c2d2")
+}
+func (s *ServoType) IsCCD() bool {
+ return strings.Contains(s.string, "ccd")
+}
+func (s *ServoType) IsMicro() bool {
+ return strings.Contains(s.string, "servo_micro")
+}
+
+func (s *ServoType) GetSerialNumberOption() string {
+ if s.IsV4() && s.IsCCD() {
+ return "ccd_serialname"
+ }
+ if s.IsV4() && s.IsMicro() {
+ return "servo_micro_serialname"
+ }
+ return "serialname"
+}
diff --git a/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_type_test.go b/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_type_test.go
new file mode 100644
index 0000000..c53e29d
--- /dev/null
+++ b/src/chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib/servo_type_test.go
@@ -0,0 +1,100 @@
+// Copyright 2021 The Chromium OS Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+package servo_lib_test
+
+import (
+ servo_lib "chromiumos/test/provision/cmd/provisionserver/bootstrap/services/firmwareservice/servo/lib"
+ "testing"
+)
+
+func TestServoType(t *testing.T) {
+ SERVO_C2D2 := "c2d2"
+ SERVO_CCD_CR50 := "ccd_cr50"
+ SERVO_CCD_TI50 := "ccd_ti50"
+ SERVO_CCD_GSC := "ccd_gsc"
+ SERVO_MICRO := "servo_micro"
+ SERVO_V2 := "servo_v2"
+ SERVO_V4_C2D2 := "servo_v4_with_c2d2"
+ SERVO_V4_CCD := "servo_v4_with_ccd"
+ SERVO_V4_CCD_CR50 := "servo_v4_with_ccd_cr50"
+ SERVO_V4_CCD_TI50 := "servo_v4_with_ccd_ti50"
+ SERVO_V4_CCD_GSC := "servo_v4_with_ccd_gsc"
+ SERVO_V4_MICRO := "servo_v4_with_servo_micro"
+ SERVO_V4P1_C2D2 := "servo_v4p1_with_c2d2"
+ SERVO_V4P1_CCD := "servo_v4p1_with_ccd"
+ SERVO_V4P1_CCD_CR50 := "servo_v4p1_with_ccd_cr50"
+ SERVO_V4P1_CCD_TI50 := "servo_v4p1_with_ccd_ti50"
+ SERVO_V4P1_CCD_GSC := "servo_v4p1_with_ccd_gsc"
+ SERVO_V4P1_MICRO := "servo_v4p1_with_servo_micro"
+
+ VALID_SERVOS := []string{
+ SERVO_C2D2,
+ SERVO_CCD_CR50,
+ SERVO_CCD_TI50,
+ SERVO_CCD_GSC,
+ SERVO_MICRO,
+ SERVO_V2,
+ SERVO_V4_C2D2,
+ SERVO_V4_CCD,
+ SERVO_V4_CCD_CR50,
+ SERVO_V4_CCD_TI50,
+ SERVO_V4_CCD_GSC,
+ SERVO_V4_MICRO,
+ SERVO_V4P1_C2D2,
+ SERVO_V4P1_CCD,
+ SERVO_V4P1_CCD_CR50,
+ SERVO_V4P1_CCD_TI50,
+ SERVO_V4P1_CCD_GSC,
+ SERVO_V4P1_MICRO,
+ }
+ CCD_SERVOS := []string{
+ SERVO_CCD_CR50,
+ SERVO_CCD_TI50,
+ SERVO_CCD_GSC,
+ SERVO_V4_CCD,
+ SERVO_V4_CCD_CR50,
+ SERVO_V4_CCD_TI50,
+ SERVO_V4_CCD_GSC,
+ SERVO_V4P1_CCD,
+ SERVO_V4P1_CCD_CR50,
+ SERVO_V4P1_CCD_TI50,
+ SERVO_V4P1_CCD_GSC,
+ }
+ MICRO_SERVOS := []string{SERVO_MICRO, SERVO_V4_MICRO, SERVO_V4P1_MICRO}
+ V2_SERVOS := []string{SERVO_V2}
+ V4_SERVOS := []string{SERVO_V4_C2D2, SERVO_V4_CCD, SERVO_V4_CCD_CR50,
+ SERVO_V4_CCD_TI50, SERVO_V4_CCD_GSC, SERVO_V4_MICRO,
+ SERVO_V4P1_C2D2, SERVO_V4P1_CCD, SERVO_V4P1_CCD_CR50, SERVO_V4P1_CCD_TI50,
+ SERVO_V4P1_CCD_GSC, SERVO_V4P1_MICRO}
+ C2D2_SERVOS := []string{SERVO_C2D2, SERVO_V4_C2D2, SERVO_V4P1_C2D2}
+
+ listContains := func(list []string, str string) bool {
+ for i := 0; i < len(list); i++ {
+ if list[i] == str {
+ return true
+ }
+ }
+ return false
+ }
+
+ for i := 0; i < len(VALID_SERVOS); i++ {
+ servoStr := VALID_SERVOS[i]
+ servo := servo_lib.NewServoType(servoStr)
+ if servo.IsV2() != listContains(V2_SERVOS, servoStr) {
+ t.Errorf("servo %v: expected IsV2() to return %v", servoStr, !servo.IsV2())
+ }
+ if servo.IsV4() != listContains(V4_SERVOS, servoStr) {
+ t.Errorf("servo %v: expected IsV4() to return %v", servoStr, !servo.IsV4())
+ }
+ if servo.IsCCD() != listContains(CCD_SERVOS, servoStr) {
+ t.Errorf("servo %v: expected IsCCD() to return %v", servoStr, !servo.IsCCD())
+ }
+ if servo.IsC2D2() != listContains(C2D2_SERVOS, servoStr) {
+ t.Errorf("servo %v: expected IsC2D2() to return %v", servoStr, !servo.IsC2D2())
+ }
+ if servo.IsMicro() != listContains(MICRO_SERVOS, servoStr) {
+ t.Errorf("servo %v: expected IsMicro() to return %v", servoStr, !servo.IsMicro())
+ }
+ }
+}