meta/DEV_SETUP.md

4.2 KiB

PeachCloud

Development Environment

Background

In order to be flexible in supporting single-board computers beyond the Raspberry Pi alone, and to take full advantage of 64-bit support on ARMv8 devices, development for PeachCloud is being targeted at Debian ARM64.

No official image has yet been released by Debian for the Raspberry Pi 3, though a preview image of Debian 10 (Buster) is available from their wiki. The major known issue with that preview image is broken wireless (the built-in wireless interface does not work). Fortunately, Michael Stapelberg has posted an updated version of the preview image with WiFi that works out of the box.

Operating System

Debian 10 (Buster). Kernel version: 4.14.0-3-arm64.

Hardware

Raspberry Pi 3B+.

Packages

List of all packages manually-installed during development environment setup.

man-db, locales, sudo, vim, git, build-essential, wget, network-manager, net-tools, curl, hostapd, dnsmasq, openssh-server, iptables-persistent, ufw, bridge-utils, ntp, ssl-cert, wpasupplicant, avahi-daemon, libssl-dev, pkg-config, i2c-tools, nmtui

Note: This list may be incomplete and will be checked during the next phase of development.

Software Setup

Install Rust using rustup:

curl https://sh.rustup.rs -sSf | sh

Note: This method of installation will fail with SSL cert errors if the datetime is not correctly set on the Pi and / or the ssl-cert package is not installed.

Set Rust to nightly (necessary for compiling Rocket):

rustup default nightly

Hardware Setup

RTC over I²C

Tested with DS1338 RTC module.

Ensure i2c-tools Debian package has been installed. Then run the following to ensure the RTC is correctly wired and connected to the Pi:

sudo modprobe i2c-dev
sudo i2cdetect -y 1

The final command in the sequence prints an array to the console, with 68 denoting the presence of the RTC module. This is a sign that the device is properly wired and connected.

Append the following two lines to /boot/firmware/config.txt:

dtoverlay=i2c-rtc,ds1307
dtparam=i2c_arm=on

Add required kernel modules:

sudo modprobe i2c-bcm2835
sudo modprobe rtc-ds1307

Append the following three lines to /etc/modules:

i2c-dev
i2c-bcm2835
rtc-ds1307

Apply the dtb patch detailed in the Bug Fixes section of this document (below).

Initialize the device by running the following commands:

sudo bash
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
exit

Run the i2cdetect tool to ensure the RTC kernel driver is working:

sudo i2cdetect -y 1

A UU entry in the output arrays denotes success. If you still see 68 or similar, the module is not being controlled by the kernel driver.

Note: This Scuttlebutt dev-diary post by @glyph documents the process step-by-step (%aEVy1gyTSl4qrbazrwrgnrLs4pRVobELwQjH/TUtsAc=.sha256).

GPIO

GPIO appears to be working out-of-the-box, but be aware that all pin numbers are offset by 458 for Debian on the Raspberry Pi 3 (as mentioned in the Debian RaspberryPi3 wiki).

Bug Fixes

The clock frequency property is not set for I²C in the device tree of the Debian image we are working with. The dtb (device tree blob) must be decompiled, patched, and recompiled.

Copy the existing dtb to a temporary working directory (exact location is up to you):

cp /boot/firmware/bcm2837-rpi-3-b.dtb /tmp/
cd /tmp

Install the compiler / decompiler:

sudo apt-get install device-tree-compiler

Generate a human-readable decompiled device tree (dts):

dtc -I dtb -O dts > bcm2837-rpi-3-b.dts

Open the dts and add the clock-frequency property (line 570):

clock-frequency = <0x186a0>;

Save and exit the document. Recompile the patched dts to binary blob format:

dtc -O dtb -o bcm2837-rpi-3-b.dtb bcm2837-rpi-3-b.dts

Replace the existing dtb with the newly-patched version (you may wish to backup the old dtb first):

cp bcm2837-rpi-3-b.dtb /boot/firmware/bcm2837-rpi-3-b.dtb

Reboot and ensure no i2c could not read clock-frequency property errors persist in the kernel logs (/var/log/kern.log).