Servo v4 is a debug device in the Servo family.
Servo v4 functions as a configurable USB hub to support developer and lab recovery features. However, it doesn‘t have any hardware debug features on its own. It must be paired with CCD (Cr50’s on-board servo implementation) or Servo Micro.
Googlers: gLinux has a kernel bug that will cause all USB devices (including keyboard and mouse) to randomly stop working when using servo v4.
To enable tracing and help debug the issue, which also seems to help reduce the frequency of occurrence, you can add the following to
logger "Enabling USB Tracing: See http://b/123886969 and http://b/136676682" echo 1 > /sys/kernel/debug/tracing/events/xhci-hcd/enable
See this email for more details.
Servo v4 combines the functionality of the following devices into one:
Your contact at Google should be able to provide you with Servo v4.
Stop by your local Chromestop.
Servo v4 can be plugged into a host machine using a uB USB cable. This will power Servo v4 while allowing the user to control Servo v4 using
The DUT connector (which is a captive cable) can be plugged into a DUT, providing the DUT access to the ethernet and blue USB port.
The Type-C captive cable enables debugging of devices that have a Cr50 (recent Chromebooks) through CCD.
The “uServo” USB port can be used to plug a servo micro to debug devices over the Yoshi debug header.
From here other functionality is available. The following ports can be used to download data to a device:
Additionally Servo v4 can be used to power the DUT which becomes useful for devices that use USB as their only charge port (tablets, phones etc.). The Type-C port can be used to plug in any Type-C charger to provide full charging capabilities as a charge through hub. If no charger is plugged, Servo v4 will act as a passive hub.
Servo v4 has an embedded keyboard so keystrokes can be emulated on the DUT.
There are two variants of Servo V4: Type-A and Type-C.
Both versions use the same board and case, but have a different captive cable stuffed.
The Type-C version acts as both a USB hub and PD charger. Servo v4 can also control both CC terminations which allows it to act as a debug accessory. It should be used on systems with CCD.
The Type-A version is used with a uServo and serves as the DUT USB hub, with the uServo providing SPI and UART support.
Servo v4 had several revisions, indicated by board color. The mass production (MP) version is available from Chromestop.
Final version, has full functionality.
The DVT version is completely functional except for the one bug affecting only Type-C variant. There are about one thousand of these, so you may encounter them.
The EVT version is a mostly functioning version with a few bugs. There are around three hundred of these total.
Servo v4 runs more or less equivalently to Servo v2 and v3, through
servod. It's intended to be mostly transparent, but there are some differences.
Most functionality is exported through
(chroot) $ sudo servod -b <board> -s <serial>
To use with a specific board, you can connect a servo_micro to the “uServo” labeled port (or use the Type-C cable to connect to CCD) and run
servod, which will load the board config and control both Servo v4 and Servo Micro (or Cr50).
(chroot) $ sudo servod -b [board] -s [serialno printed on servo v4 sticker]
Connect to Servo v4 Console:
(chroot) $ usb_console -d 18d1:501b
Connect to Servo Micro Console:
(chroot) $ usb_console -d 18d1:501a -i 3
Connect to Cr50 Console:
(chroot) $ usb_console -d 18d1:5014
(chroot) $ dut-control sd_en:on sd_pwr_en:on sd_mux_sel:servo_sees_usbkey host_sd_usb_mux_en:on host_sd_usb_mux_sel:sd
(chroot) $ dut-control sd_en:on sd_pwr_en:on sd_mux_sel:dut_sees_usbkey
(chroot) $ dut-control sd_en:off sd_pwr_en:off
(chroot) $ dut-control usb3_mux_en:on usb3_mux_sel:servo_sees_usbkey usb3_pwr_en:on host_sd_usb_mux_en:on host_sd_usb_mux_sel:usb
(chroot) $ dut-control usb3_mux_en:on usb3_mux_sel:dut_sees_usbkey usb3_pwr_en:on
(chroot) $ dut-control servo_v4_dts_mode:off [on]
(chroot) $ dut-control servo_v4_role:snk [src]
flashromcommands for CCD, Servo Micro, and Servo v2, as they are each different.
FlashAPcapability is enabled in Cr50.
Flash BIOS with CCD:
(chroot) $ sudo flashrom -p raiden_debug_spi:target=AP -r bios.bin
The latest firmware is available in the chroot at
If the green LED on the servo does not light up when DUT POWER is connected to a USB charger, you probably don’t have the latest firmware and should update.
servodmust not be running.
Sync the latest source:
(chroot) repo sync
sys-firmware/servo-firmware to the latest version:
Update to latest stable firmware:
(chroot) $ sudo servo_updater -b servo_v4
Update to specific version:
(chroot) $ sudo servo_updater -b servo_v4 -f <filename>
See CCD for complete details.
Connect to Cr50 console:
(chroot) $ usb_console -d 18d1:5014
Check the Cr50 version in the Cr50 console:
> version Build: 0.4.10/cr50_v1.9308_B.269-754117a
CCD requires Cr50 version 0.3.9+ / 0.4.9+
Open CCD in the Cr50 console:
> ccd open
Press power button when prompted. It should take around 5 minutes.
ccd open, you likely do not have developer mode enabled.
Enable testlab mode in the Cr50 console:
> ccd testlab enable
Press power button some more. CTRL+C to exit.
Your network switch port will get hosed (some TX buffer fills up and starts dropping things) if you have Servo v4 connected to most switches and unplug the servo‘s USB connection, or power off the DUT fully, after the servo’s NIC has an IP. This behavior is not reproducible with a GS108Tv2, so the workaround is to use a GS108Tv2.
File bug or feature requests here.
(chroot) $ cd ~/trunk/src/platform/ec (chroot) $ make BOARD=servo_v4 -j8
To raw flash a Servo v4,
BOOT0 select pin is indicated by the OTG cable:
(chroot) $ ./util/flash_ec --board=servo_v4
To set the Servo v4 serial number on the Servo console:
> serialno set 012345