2 minute read

Background

When the Google Home first came out, people quickly noticed there was a micro USB port underneath the speaker cover:

micro-usb-port

This USB port isn’t documented anywhere, but if you search around you’ll find plenty of forum posts where people have guessed what it was for, but none so far have figured out how to actually use it.

Enumeration

The tricky thing about accessing the USB port on these devices is that they don’t typically actually do anything (ie enumerate) during regular use. Each Google device (Chromecast, Google Home, Google Home Mini) has a special sequence of how to get into this mode where the USB connection will be established.

Device Button sequence
Chromecast Hold reset button while connecting USB cable
Google Home Mini Hold reset button while connecting USB
Google Home Hold mute button while connecting power

For each device, you’ll see a message like this in your dmesg log:

[Thu Jul 13 12:19:23 2023] usb 1-4.4.4: new high-speed USB device number 12 using xhci_hcd
[Thu Jul 13 12:19:24 2023] usb 1-4.4.4: New USB device found, idVendor=1286, idProduct=8174, bcdDevice= 0.02
[Thu Jul 13 12:19:24 2023] usb 1-4.4.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[Thu Jul 13 12:19:24 2023] usb 1-4.4.4: Product: BG2CD S/N:12345678A
[Thu Jul 13 12:19:24 2023] usb 1-4.4.4: Manufacturer: Marvell
[Thu Jul 13 12:19:24 2023] usb 1-4.4.4: SerialNumber: S/N:12345678A

The “BG2CD” string is the model name for the Marvel Armada 1500 processor unit (source), the same one used in the original Chromecast, and the Home Mini.

The problem is that documentation on this unit is relatively hard to find. All I could find was the product brief; no datasheet was available.

By attaching lsusb to watch, I could print the full device output before it disconnected:

Bus 001 Device 016: ID 1286:8174 Marvell Semiconductor, Inc. BG2CD S/N:12345678A
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          255 Vendor Specific Class
  bDeviceSubClass       255 Vendor Specific Subclass
  bDeviceProtocol       255 Vendor Specific Protocol
  bMaxPacketSize0        64
  idVendor           0x1286 Marvell Semiconductor, Inc.
  idProduct          0x8174
  bcdDevice            0.02
  iManufacturer           1 Marvell
  iProduct                2 BG2CD S/N:12345678A
  iSerial                 3 S/N:12345678A
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0020
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              500mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    255 Vendor Specific Subclass
      bInterfaceProtocol    255 Vendor Specific Protocol
      iInterface              4
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0

This still leaves us with more questions than answers though.

Guessing

My first guess was that maybe the device momentarily was connecting to DFU mode. I tried running dfu-util --list while it was connected, but that didn’t show any devices.

I then tried to see if the device was sending any special USB packets when it was connecting.

google-home-wireshark-capture

Sadly, only the standard device enumeration sequence was there.

Leave a comment