wm: doc

ref: 453b9bd07592f8d40329b43971ab0ea3d419c6c4
dir: /pi.ms/

View raw version
.TL
plan 9 on pi

.AU
mkf

.AB
Tips for running plan 9 on raspberry pi

.AE

.LP
Raspberry pi is a single board computer made by raspberry pi foundation
somewhere in UK. In 2012(?) Richard miller have made the plan 9,
this is known as miller's pi. at some point 9front have imported miller's code.
9front have since got a 64-bit version of bcm kernel.
this guide covers 9front, more info on miller's is appercited.
.NH
installtion
.LP
As time of writing by default 9front ships with hjfs on installation image and that image is sized 2Gb.
You can dd (or cp, or whatever your prefered method may be) that into your sdcard.
That's all.
.SH
Resizing the paritions
.LP
Hjfs however does not support growing a parition (gefs seems to be the only file system capable of doing so),
Thus to do so. you may need to do a classic installation, there are many ways for it;
but the easiest way is to install using a usb thumb drive.
.IP \(bu
copy 9front image into your sdcard, we need to do this since we need to have the kernel and boot blobs
.IP \(bu
then copy same thing into your sdcard, for file system contents
.IP \(bu
boot the pi, select the usb in bootargs
.IP \(bu
run inst/start, make the partitions as you would on the sdcard, and install.
.NH
ISSUES
.SH
audio
.LP
Raspberry Pi is odd, audio hardware in pi is perhaps the most odd part of it.
Use usb audio cards if you can, but if you can't:
.IP 1.
3.5MM jack uses a PWM connected to arm core, and offers poor quality.
However it is much simpler to write a driver for.
Load on cpu sometimes casues noticable effects on PWM,
and thus results in audiable and annoying noises.
.IP 2.
HDMI audio is much more sophisticated (or horribly complex, depending on your point of view),
and uses a RPC protocol to communicate with broadcom core.
which makes writing drivers much harder offers better audio.
.LP
There are two drivers for PWM, one is located under
.CW /n/extra/src/audiobcm.tgz
and said to be working for first pi (bcm2385).
I haven't tested it, but PWM audio interface have been realtively same since
bcm2385 (with some minor improvments) from arm core's view point.
.NH
Wireless
.LP
9front has recently added support for raspberry pi's wifi.
this supports 3+ and zero 2. zero too should work but requires changes to kernel.
On pi 3 and zero, wireless card is
.CW ether0 .
source code for wireless driver is available in
.CW /sys/src/9/bcm/ether4330.c
.NH
USB
.LP
It's widely believe before raspberry pi 4 (that includes zero 2), they had nasty USB controllers,
while they may (is there a case otherwise?) work well for keyboard, mouses and thumb drives,
they may not work as well as expected for devices that need more power.
.LP
Also note that, USB controller can crash (is it a hardware limit?) if it gets too hot,
using a heat sink and fan is recommended if you are you are going to use that raspberry pi's USB (which sadly, also includes ethernet, since it uses USB).
.NH
UART
.NH
Compiling a kernel
.LP
Kernels for pi port are located under
.CW /sys/src/9/bcm
for 32-bit port (all raspberry pis)
and
.CW /sys/src/9/bcm64
for 64-bit kernel (late revisions of pi 2, pi zero 2 and pi 3 and newer)
.P1
# 32 bit kernels (work on 64 bit pis as well)
cd /sys/src/9/bcm
mk 'CONF=pi'
mk 'CONF=pi2'

# 64 bit kernels:
cd /sys/src/9/bcm64
mk 'CONF=pi3' # for pi 3
mk 'CONF=pi4' # for pi 4
.P2
.NH
HDMI
.LP
Raspberry pi uses HDMI for video output. thankfully (or not),
Firmware capable of handling framebuffer, and we use that.
the only drawback there is we can't change resolution during run-time.
to change it, first mount
.CW pidos
partition (on 64-bit kernels you may need to mount
.CW dos
instead):
.P1
; 9fs pidos
.P2
And then add the following into your 
.CW config.txt
file:
.P1
[all]
hdmi_blanking=1
hdmi_group=2
hdmi_mode=51
framebuffer_depth=32
.P2
.LP
First line means this configuration will be applied to all
raspberry pi models. This is handy for when you share same sd card
between several boards.
.CW hdmi_blanking
will blank your monitor when not in use, see
.CW mouse (3)
man page to see how to use it.
The lines
.CW hdmi_group
and
.CW hdmi_mode
are used to set type of display (TV or monitor) and resolution of such.
see
.LN https://www.raspberrypi.com/documentation/computers/legacy_config_txt.html#hdmi-mode
raspberry pi documention
.LN
for more info on those.
Lastly
.CW framebuffer_depth
is for amount of colors you have, 
.CW 32
means 32-bit color, default value is
.CW 16 .