commit | e77dd4e13efcb896d080863776fdf18bf4b09e35 | [log] [tgz] |
---|---|---|
author | Jan Kundrát <jan.kundrat@cesnet.cz> | Wed Oct 23 17:14:40 2024 +0200 |
committer | Jan Kundrát <jan.kundrat@cesnet.cz> | Thu Oct 24 15:00:29 2024 +0200 |
tree | be2c4d4d9d779dd25ac3edf55963e6ed956c6e2c | |
parent | d1dcf7d75d4e761c1e51e50ff40f5fe9c6bd486e [diff] |
clearfog: faster bit-banged I2C bus access There was a typo in the DT property name, and therefore this option has always been a no-op, since the very beginning. That means that the kernel's default of 5µs has always been in effect. I made some measurements on kernel 6.6.56-10-g683b4dee50cd, with CONFIG_PREEMPT. The scope (Agilent U1604B) was connected to SCL and SDA signals at the connector at the PCB's edge, the frequency was measured by the scope's built-in math functions with the measurement performed at the resolution of 5µs/div. The machine was otherwise idle. Here's the actual measured SCL frequency based on different delay values: - 1: ~150-175kHz - 2: ~112-128kHz - 3: ~96-102kHz - 4: ~78-85kHz - 5: ~70-75kHz Value "5" was in effect because it's the default. "0" gets interpreted as "no value", so it's the same as "5" (or no value, or a typo as we had before). Using just "3" is, however, not enough because the t_LOW requirement of a minimal duration of the SCL being at logical 0 was not always met (I've seen traces with just 4µs while the standard requires 4.7µs for a 100kHz bus). Using a custom delay of 4µs does the trick. I'm not happy with two more things, though: - The SCL is consistently "too low", measuring around 3.1V. That's because the MPP24 (which we use as SCL) has a built-in pull-down resistor (the CPU's datasheet says that these are anywhere between 20 and 70kΩ). As far as I can tell the result is still OK from the SMBus' perspective (2.1V is the threshold there), but it isn't pretty -- especially when the SDA is at the usual level of 3.3V. - There's "some" rise time. Without an active component for managing the slew rate, this might be hard to fix on a rather (physically) long I2C bus (which is partially implemented over a wire bundle). However, SMBus defines the low threshold to be at 0.8V, and the high threshold at 2.1V, and as far as I can see, the signal always raises "a bit quicker" than the required 1'000ns. (This is *very* painful to measure on a scope which can only place triggers at a div boundary.) TL;DR: with these settings we're always in spec AFAICT. Fixes: 7f2ff837 clearfog: Add a SW bit-bang I2C bus for PMBus Change-Id: I8bff086330aa8d8a15b4ba8bd2f5c8e261e4fe59
This repository contains CzechLight-specific bits for Buildroot. Buildroot is a tool which produces system images for flashing to embedded devices. They have a nice documentation which explains everything that one might need.
The system architecture is described in another document. This is a quick build HOWTO.
Everything is in Gerrit. One should not need to clone anything from anywhere else. The build will download source tarballs of various open source components, though.
By default, each change of this repo uploaded to Gerrit causes the CI system to produce a firmware update. On Gerrit, the change will get a comment from Zuul with a link to the CI log server. Next to the logs, a file named artifacts/update.raucb
can be used for updating devices.
Behind the scenes, the system uses Zuul with a configuration tracked in git.
Here's how to reproduce the build on a developer's workstation:
git clone ssh://$YOUR_LOGIN@cesnet.cz@gerrit.cesnet.cz:29418/CzechLight/br2-external czechlight pushd czechlight git submodule update --init --recursive popd mkdir build-clearfog cd build-clearfog ../czechlight/dev-setup-git.sh make czechlight_clearfog_defconfig make -j8
A full rebuild takes about half an hour on a modern laptop.
WARNING: Buildroot is fragile. It is not safe to perform incremental builds after changing an "important" setting. Please check their manual for details.
Apart from the traditional way of re-flashing the SD card or the eMMC from scratch, it's also possible to use RAUC to update. This method preserves the U-Boot version and the U-Boot's environment. Apart from that, everything starting with the kernel and the DTB file and including the root FS is updated. Configuration stored in /cfg
is brought along and preserved as well.
To install an update:
# build node make rsync -avP images/update.raucb somewhere.example.org:path/to/web/root # target, perhaps via an USB console or over SSH rauc install http://somewhere.example.org/update.raucb reboot
Once the updated FW slot boots, the configuration in /cfg
will be automatically upgraded ("migrated") to the newest layout. A downgrade to an incompatible OS version might therefore fail during the next reboot. Completely removing all data in the newly updated slot's cfg
partition will restore functionality, but it is effectively a factory reset.
On a regular Clearfog Base with an eMMC, one has to bootstrap the device first. If recovering a totally bricked board (or one that is fresh from factory), use the kwboot
command to upload the initial, new enough U-Boot via the console. Power the system down, and ensure that the jumpers are set to 0 1 0 0 1
(default for eMMC boot is 0 0 1 1 1
):
Prepare a USB flash disk with a raw bootable image, images/usb-flash.img
. Use a tool such as dd
to overwrite the raw block device, do not copy the image file. Plug the USB flash disk in. Then, use U-Boot's kwboot
tool:
./host/bin/kwboot -b ./u-boot-spl.kwb -t -p /dev/ttyUSB0
...and turn the power on. Once in U-Boot, execute:
usb start; fatload usb 0:1 00800000 boot.scr; source 00800000
The system will boot and flash the eMMC from the USB drive. Once the status LED starts blinking in yellow, data are being transferred to the eMMC. The light changes to solid yellow in later phases of the flashing process. Once everything is done, the status LED shows a solid white light and the system reboots automatically.
Turn off power, remove the USB flash, re-jumper the board (0 0 1 1 1
), power-cycle, and configure MAC addresses at the U-Boot prompt. The MAC addresses are found on the label at the front panel.
=> setenv eth1addr 00:11:17:01:XX:XX => setenv eth2addr 00:11:17:01:XX:YY => setenv eth3addr 00:11:17:01:XX:ZZ
Also set up the system type:
Model | czechlight variable value |
---|---|
ROADM Line Degree | sdn-roadm-line-g2 |
ROADM Flex Add/Drop | sdn-roadm-add-drop-g2 |
ROADM Hi-Res Add/Drop | sdn-roadm-hires-add-drop-g2 |
ROADM Coherent Add/Drop | sdn-roadm-coherent-a-d-g2 |
Inline Amplifier | sdn-inline-g2 |
BiDi Amplifier C-Band + 1572nm | sdn-bidi-cplus1572-g2 |
BiDi Amplifier C-Band + 1572nm with OCM | sdn-bidi-cplus1572-ocm-g2 |
=> setenv czechlight sdn-roadm-line-g2 => saveenv Saving Environment to MMC... Writing to redundant MMC(0)... OK => boot
Once the system boots (which currently requires a reboot for some unknown reason -- fsck, perhaps?), configure hostname, plug in the network cable, and update SW:
# hostnamectl set-hostname line-XYZSERIALNO # cp /etc/hostname /cfg/etc/ # rauc install http://somewhere.example.org/update.raucb # reboot
Obtain a reasonable Linux distro image for BBB and flash it to a µSD card. Unlock eMMC boot partitions (echo 0 > /sys/class/block/mmcblk1boot0/force_ro; echo 0 > /sys/class/block/mmcblk1boot1/force_ro
). Clean the eMMC data (blkdiscard /dev/mmcblk1
). Flash the content of images/emmc.img
to device's /dev/mmcblk1
. Flash what fits into /dev/mmcblk1boot0
and /dev/mmcblk1boot1
. Fetching the image over web (python3 -m http.server
and wget http://...:8000/emmc.img -O - | dd of=/dev/mmcblk1 conv=sparse
) works well.