So I was testing some code on my loyal Raspberry Pi 4, ver. 1.2. The Pi is directly connected to my router in another room. Cuz, like, Pi’s ethernet is so much more stable than its wireless. The downside is that every time the Pi had an issue, I had to run over to the other room to recover it.
Let’s just say it’s not a pleasant experience. Plugging in and out the microSD card, just to find out the Pi still didn’t work. And the ethernet cable is great for tripping somebody. Even worse, all those cables made my room messy.
Oh, only if you can connect your Pi to your laptop directly, and it would magically provide electricity and data transfer functionalities, the whole thing would be much easier…
Apparently you can. Raspberry Pi 4’s USB-C port is not just a dumb charging port like many other single board computers' (Orange Pi’s charging port sucks). Thanks to Pi’s data signal lines actually being wired, it is possible to transfer both data and electricity.
Obviously, setting up Pi’s USB-C as an ethernet gadget is the best option. I can connect to it directly via SSH, transfer files with SFTP, and so much more, all over the same USB cable.
Bonus: no unstable wireless network.
Config Raspberry Pi’s Bootloader
Add dtoverlay=dwc2
as a new line to the bottom of your Pi’s config.txt
.
Where’s config.txt
? I’m sure you know at this point.
Setting up your Raspberry Pi’s OS
I am using Debian’s Raspberry Pi 4 image on a Raspberry Pi, but technically any single board computers that supports OTG is supported.
Make sure you have a monitor(not headless) in case something went wrong.
Install Necessary Software
Install vim
, or any other editor except emacs
.
avahi
avoids the hassle of trying to find out Pi’s IP address, and is recommended.
apt install vim avahi-daemon
systemctl enable --now avahi-daemon
Enable SSH
Debian’s image comes with SSH disabled, enabling.
Enable Modules for OTG Ethernet
Create /etc/modules-load.d/g_ether.conf
on your Pi:
vim /etc/modules-load.d/g_ether.conf
…and enter those lines:
dwc2
g_ether
Configure Network Interfaces
The interface name of the ethernet gadget will be usb0
.
Create /etc/network/interfaces.d/usb0
on your Pi:
vim /etc/network/interfaces.d/usb0
…and enter those lines:
allow-hotplug usb0
iface usb0 inet dhcp
allow-hotplug
is quite important here, without it the Pi boots up much slower.
Actually, you might want to change auto eth0
in /etc/network/interfaces.d/eth0
to allow-hotplug eth0
as well. Why does Debian default to auto
anyway? smh
Obtain a unique MAC
Now, plug the Pi in your computer, and wait for a USB ethernet adapter to appear.
You should be able to connect to the Pi via raspberrypi.local
, or your-pi-hostname.local
.
Unfortunately, OTG ethernet gadget does not come with a unique MAC address. You need to specify one manually, otherwise it will generate a random MAC every time it boots.
To specify MAC address, execute as root:
echo 'options g_ether host_addr='$(dmesg | awk '/: HOST MAC/{print $NF}')' dev_addr='$(dmesg | awk '/: MAC/{print $NF}') | tee /etc/modprobe.d/g_ether.conf
Reboot the Pi.
You did it! Your Pi has evolved into a standare ethernet adapter via USB-C. Annoying ethernet cables no more, and you can share your computer’s Internet connection to the Pi.
The interesting thing is, since iOS supports Zeroconf and ethernet adapters, you can actually connect your Raspberry Pi 4 to an iPad for unlimited productivity. So yeah, you can do offline coding on an iPad with a Raspberry Pi.