Connect to Your Raspberry Pi Over USB Using Gadget Mode

Raspberry Pi Gadget Mode
Program your Pi without a keyboard, monitor, or network connection
Tyler Tyler (285)
Total time: 20 minutes 

We've written previously about how to configure WiFi and SSH on your Raspberry Pi without having to connect any peripheral devices (headless). As long as you're comfortable on the command line, this makes it much easier to work with your Pi.

Now, I've been doing projects with Raspberry Pi's since the first version, and I only recently found out about a Linux feature that allows you to connect to the Pi directly over USB: it's called USB gadget mode. With "gadget mode" enabled, we don't need to configure the WiFi network or connect any peripheral devices, we simply connect the Pi to our computer with a USB cable, and now we've got SSH access.

In this guide, I'll show you how enable gadget mode and connect to your Pi via USB.

Note: I believe this feature was initially enabled for the Pi Zero, and it does not work on earlier versions of the Pi. I have, however, tested with the Raspberry Pi 4, and it works as long as you connect via the USB-C connector.

Here's everything you'll need to complete this guide:

Raspberry Pi Zero WRaspberry Pi Zero W×1
Micro-USB to USB-C cable, 6"Micro-USB to USB-C cable, 6"×1

First we need to flash Raspberry Pi OS onto an SD card. If you need help with this process, please follow our guide on how to install Raspberry Pi OS on your Raspberry Pi.

With Raspbian installed on the SD card (and the SD card still mounted on your computer), you can use Finder or a shell to navigate to the boot directory. Now edit the file called config.txt, and append the following:

dtoverlay=dwc2

Save and exit.

We can SSH by simply adding an empty file called ssh directly in the boot directory.

On the command line, you can navigate to the boot directory and run:

touch ssh

Note: The file must be called "ssh" not "SSH" or "ssh.txt" or anything other than "ssh".

Now, edit the file called cmdline.txt. Look for rootwait, and add modules-load=dwc2,g_ether immediately after.

Note the formatting of cmdline.txt is very strict. Commands are separated by spaces, and newlines are not allowed.

Here's an example of what my cmdline.txt file looks like, but you should not copy this. Simply add the required command mentioned above.

console=serial0,115200 console=tty1 root=PARTUUID=6c586e13-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait modules-load=dwc2,g_ether quiet init=/usr/lib/raspi-config/init_resize.sh

Save and exit.

That's it for configuration! Now you can eject the SD card, and insert it into the the Pi. Using a USB cable, connect to the Raspberry Pi from your computer.

After the Pi boots up (this will take a while initially), the Pi should appear as a USB Ethernet device, and you can SSH into it using:

ssh pi@raspberrypi.local

Enjoy!