diff --git a/06_drivers_gpio_uart/README.md b/06_drivers_gpio_uart/README.md
index 62eec339..b1676571 100644
--- a/06_drivers_gpio_uart/README.md
+++ b/06_drivers_gpio_uart/README.md
@@ -6,6 +6,13 @@ Now that we enabled safe globals in the previous tutorial, the infrastructure is
laid for adding the first real device drivers. We throw out the magic QEMU
console and use a real UART now. Like serious embedded hackers do!
+- For the first time, we will be able to run the code on the real hardware.
+ - Therefore, building is now differentiated between the **RPi 3** and the **RPi4**.
+ - By default, all `Makefile` targets will build for the **RPi 3**.
+ - In order to build for the the **RPi4**, prepend `BSP=rpi4` to each target. For example:
+ - `BSP=rpi4 make`
+ - `BSP=rpi4 make doc`
+ - Unfortunately, QEMU does not yet support the **RPi4**, so `BSP=rpi4 make qemu` won't work.
- A `DeviceDriver` trait is added for abstracting `BSP` driver implementations
from kernel code.
- Drivers are stored in `bsp/driver`, and can be reused between `BSP`s.
@@ -18,19 +25,54 @@ console and use a real UART now. Like serious embedded hackers do!
## Boot it from SD card
+Some steps for preparing the SD card differ between RPi3 and RPi4, so be careful.
+
+### Common for both
+
1. Make a single `FAT32` partition named `boot`.
-2. Copy [bootcode.bin](https://github.com/raspberrypi/firmware/raw/master/boot/bootcode.bin), [fixup.dat](https://github.com/raspberrypi/firmware/raw/master/boot/fixup.dat) and [start.elf](https://github.com/raspberrypi/firmware/raw/master/boot/start.elf) from the [Raspberry Pi firmware repo](https://github.com/raspberrypi/firmware/tree/master/boot) onto the SD card.
-3. Copy our [kernel8.img](kernel8.img) onto the SD card.
-4. Insert the SD card into the RPi and connect the USB serial to your host PC.
+2. On the card, generate a file named `config.txt` with the following contents:
+
+```txt
+init_uart_clock=48000000
+```
+### Pi 3
+
+3. Copy the following files from the [Raspberry Pi firmware repo](https://github.com/raspberrypi/firmware/tree/master/boot) onto the SD card:
+ - [bootcode.bin](https://github.com/raspberrypi/firmware/raw/master/boot/bootcode.bin)
+ - [fixup.dat](https://github.com/raspberrypi/firmware/raw/master/boot/fixup.dat)
+ - [start.elf](https://github.com/raspberrypi/firmware/raw/master/boot/start.elf)
+4. Run `make` and copy the [kernel8.img](kernel8.img) onto the SD card.
+
+### Pi 4
+
+3. Copy the following files from the [Raspberry Pi firmware repo](https://github.com/raspberrypi/firmware/tree/master/boot) onto the SD card:
+ - [fixup4.dat](https://github.com/raspberrypi/firmware/raw/master/boot/fixup4.dat)
+ - [start4.elf](https://github.com/raspberrypi/firmware/raw/master/boot/start.elf)
+ - [bcm2711-rpi-4-b.dtb](https://github.com/raspberrypi/firmware/raw/master/boot/bcm2711-rpi-4-b.dtb)
+4. Run `BSP=rpi4 make` and copy the [kernel8.img](kernel8.img) onto the SD card.
+
+### Common again
+
+5. Insert the SD card into the RPi and connect the USB serial to your host PC.
- Wiring diagram at [top-level README](../README.md#usb-serial).
-5. Run `screen` (you might need to install it first):
+6. Run `screen` (you might need to install it first):
```console
sudo screen /dev/ttyUSB0 115200
```
-6. Hit Enter to kick off the kernel boot process.
-7. Exit screen by pressing ctrl-a ctrl-d or disconnecting the USB serial.
+7. Hit Enter to kick off the kernel boot process. Observe the output:
+
+```console
+[0] Booting on: Raspberry Pi 3
+[1] Drivers loaded:
+ 1. GPIO
+ 2. PL011Uart
+[2] Chars written: 84
+[3] Echoing input now
+```
+
+8. Exit screen by pressing ctrl-a ctrl-d or disconnecting the USB serial.
## Diff to previous
```diff
@@ -483,7 +525,8 @@ diff -uNr 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 06_drivers_gp
+ // Convert newline to carrige return + newline.
+ if c == '
' {
-+ self.write_char('
')
++ self.write_char('
+')
+ }
+
+ self.write_char(c);
@@ -583,7 +626,8 @@ diff -uNr 05_safe_globals/src/bsp/driver/bcm/bcm2xxx_pl011_uart.rs 06_drivers_gp
+ let mut ret = inner.DR.get() as u8 as char;
+
+ // Convert carrige return to newline.
-+ if ret == '
' {
++ if ret == '
+' {
+ ret = '
'
+ }
@@ -707,7 +751,8 @@ diff -uNr 05_safe_globals/src/bsp/rpi.rs 06_drivers_gpio_uart/src/bsp/rpi.rs
- // Convert newline to carrige return + newline.
- if c == '
' {
-- self.write_char('
')
+- self.write_char('
+')
- }
-
- self.write_char(c);