Pi4 USB-C Gadget
<i1.wp.com/www.hardill.me.uk/wordpress/wp-content/uploads/2019/11/img_20191102_1804133159653557558420184.jpg?ssl=1> I’ve previously  <i1.wp.com/www.hardill.me.uk/wordpress/wp-content/uploads/2019/11/img_20191102_1804133159653557558420184.jpg?ssl=1>blogged <www.hardill.me.uk/wordpress/2017/01/23/raspberry-pi-zero-gadgets/> about using Pi Zero <www.hardill.me.uk/wordpress/2017/02/12/updated-pi-zero-gadgets/>(and Zero W) devices as USB Gadgets. This allows them to be powered and accessed via one of the micro USB sockets and it shows up as both a CD-Drive and a ethernet device.
A recent update to the Raspberry Pi 4 bootloader not only enables the low power mode for the USB hardware, allows the enabling of Network boot and enables data over the USB-C port. The lower power means it should run (without any hats) with the power supplied from a laptop.
Details of how to check/update the bootloader can be found here <www.raspberrypi.org/documentation/hardware/raspberrypi/booteeprom.md>.
Given that the Pi4 has a Gigabit Ethernet adapter, WiFi and 4 USB sockets (need to keep the power draw low to be safe) and up to 4Gb RAM to go with it’s 4 x 1.5Ghz core processor it makes for a very attractive plugin compute device.
With this enabled all the same script from the Pi Zero’s should just work but here is the updated version for Raspbian Buster.
Add dtoverlay=dwc2 to the /boot/config.txt Add modules-load=dwc2 to the end of /boot/cmdline.txt If you have not already enabled ssh then create a empty file called ssh in /boot Add libcomposite to /etc/modules Add denyinterfaces usb0 to /etc/dhcpcd.conf Install dnsmasq with sudo apt-get install dnsmasq Create /etc/dnsmasq.d/usb with following content interface=usb0 dhcp-range=,,,1h dhcp-option=3 leasefile-ro Create /etc/network/interfaces.d/usb0 with the following content auto usb0 allow-hotplug usb0 iface usb0 inet static address netmask Create /root/usb.sh #!/bin/bash cd /sys/kernel/config/usb_gadget/ mkdir -p pi4 cd pi4 echo 0x1d6b > idVendor # Linux Foundation echo 0x0104 > idProduct # Multifunction Composite Gadget echo 0x0100 > bcdDevice # v1.0.0 echo 0x0200 > bcdUSB # USB2 echo 0xEF > bDeviceClass echo 0x02 > bDeviceSubClass echo 0x01 > bDeviceProtocol mkdir -p strings/0x409 echo “fedcba9876543211” > strings/0x409/serialnumber echo “Ben Hardill” > strings/0x409/manufacturer echo “PI4 USB Device” > strings/0x409/product mkdir -p configs/c.1/strings/0x409 echo “Config 1: ECM network” > configs/c.1/strings/0x409/configuration echo 250 > configs/c.1/MaxPower # Add functions here # see gadget configurations below # End functions mkdir -p functions/ecm.usb0 HOST=”00:dc:c8:f7:75:14″ # “HostPC” SELF=”00:dd:dc:eb:6d:a1″ # “BadUSB” echo $HOST > functions/ecm.usb0/host_addr echo $SELF > functions/ecm.usb0/dev_addr ln -s functions/ecm.usb0 configs/c.1/ udevadm settle -t 5 || : ls /sys/class/udc > UDC ifup usb0 service dnsmasq restart Make /root/usb.sh executable with chmod +x /root/usb.sh Add /root/usb.sh to /etc/rc.local before exit 0 (I really should add a systemd startup script here at some point) With this setup the Pi4 will show up as a ethernet device with an IP address of and will assign the device you plug it into an IP address via DHCP. This means you can just ssh to pi@ to start using it.
Quick note, not all USB-C cables are equal it seems. I’ve been using this one from Amazon and it works fine.
The latest revision (as of late Feb 2020) of the Pi 4 boards should work with any cable.
There is also now a script to create pre-modified Raspbian images here <github.com/hardillb/rpi-gadget-image-creator/>with a description here <www.hardill.me.uk/wordpress/2020/02/21/building-custom-raspberry-pi-sd-card-images/> and a copy of the modified image here <drive.google.com/open?id=1On54JS_MjR5yFHtqiOo7_56U6ZCXiSZf>.