# Toolchain setup Here are instructions for setting up the tools required to build the project. Tested on Ubuntu 22.10. ## General development environment The following is intended to be a complete list of the packages that are required for doing all of the following: - building and developing [TKey host programs and apps](https://github.com/tillitis/tillitis-key1-apps) - building our [QEMU machine](https://github.com/tillitis/qemu/tree/tk1) (useful for apps dev) - building and developing firmware and FPGA gateware (which also requires building the toolchain below) ``` sudo apt install build-essential clang lld llvm bison flex libreadline-dev \ gawk tcl-dev libffi-dev git mercurial graphviz \ xdot pkg-config python3 libftdi-dev \ python3-dev libeigen3-dev \ libboost-dev libboost-filesystem-dev \ libboost-thread-dev libboost-program-options-dev \ libboost-iostreams-dev cmake libusb-1.0-0-dev \ ninja-build libglib2.0-dev libpixman-1-dev \ golang clang-format ``` ## Device permissions To allow sudo-less programming, you can install a udev rule that will assign the tkey programmer, and also an unprogrammed CH552, to the dialout group. You will also need to add your user to this group: ``` sudo cp contrib/99-tillitis.rules /etc/udev/rules.d sudo usermod -aG dialout ${USER} ``` To apply the new group, log out and then log back in. You can check the device permissions to determine if the group was successfully applied. First, use lsusb to find the location of the programmer: ``` lsusb -d cafe:4010 Bus 001 Device 023: ID cafe:4010 Blinkinlabs ICE40 programmer ``` Then, you can check the permissions by using the bus and device number reported above. Note that this pair is ephimeral and may change after every device insertion: ``` ls -l /dev/bus/usb/001/023 crw-rw---- 1 root dialout 189, 22 Feb 16 14:58 /dev/bus/usb/001/023 ``` ## Gateware: Yosys/Icestorm toolchain If the LED of your TKey is steady white when you plug it, then the firmware is running and it's already usable! If you want to develop TKey apps, then only the above general development environment is needed. Compiling and installing Yosys and friends is only needed if your TKey is not already running the required firmware and FPGA gateware, or if you want to do development on these components. These steps are used to build and install the [icestorm](http://bygone.clairexen.net/icestorm/) toolchain. The binaries are installed in `/usr/local`. Note that if you have or install other versions of these tools locally, they could conflict (case in point: `yosys` installed on MacOS using brew). git clone https://github.com/YosysHQ/icestorm cd icestorm git checkout 45f5e5f3889afb07907bab439cf071478ee5a2a5 make -j$(nproc) sudo make install cd .. # Custom iceprog for the RPi 2040-based programmer (will be upstreamed). git clone -b interfaces https://github.com/tillitis/icestorm tillitis--icestorm cd tillitis--icestorm/iceprog make sudo make PROGRAM_PREFIX=tillitis- install cd ../.. git clone https://github.com/YosysHQ/yosys cd yosys # Avoiding current issue with yosys & icebram, filed in: # https://github.com/YosysHQ/yosys/issues/3478 git checkout 06ef3f264afaa3eaeab45cc0404d8006c15f02b1 make -j$(nproc) sudo make install cd .. git clone https://github.com/YosysHQ/nextpnr cd nextpnr # Use nextpnr-0.4. Aa few commits later we got issues, like on f4e6bbd383f6c43. git checkout nextpnr-0.4 cmake -DARCH=ice40 -DCMAKE_INSTALL_PREFIX=/usr/local . make -j$(nproc) sudo make install cd .. References: * http://bygone.clairexen.net/icestorm/ ## Firmware: riscv toolchain The TKey implements a [picorv32](https://github.com/YosysHQ/picorv32) soft core CPU, which is a RISC-V microcontroller with the C instructions and Zmmul extension, multiply without divide (RV32ICZmmul). You can read [more](https://www.sifive.com/blog/all-aboard-part-1-compiler-args) about it. The project uses the LLVM/Clang suite and version 15 or later is required. As of writing Ubuntu 22.10 has version 15 packaged. You may be able to get it installed on older Ubuntu and Debian using the instructions on https://apt.llvm.org/ . There are also binary releases here: https://github.com/llvm/llvm-project/releases References: * https://github.com/YosysHQ/picorv32 If your available `objcopy` and `size` commands is anything other than the default `llvm-objcopy` and `llvm-size` define `OBJCOPY` and `SIZE` to whatever they're called on your system before calling `make`. ## Circuit board designs: KiCad 6.0 The circuit board designs were all created in [KiCad 6.0](https://www.kicad.org/). ## MTA1-USB-V1 and TP-1 programming board firmware The programmer boards are running a custom firmware developed by Blinkinlabs. The source code for this firnware is available on Github: https://github.com/Blinkinlabs/ice40_flasher There is also a pre built firmware binary available for the programmer board: https://github.com/Blinkinlabs/ice40_flasher/tree/main/bin To update the firmware on the programmer board, either build the file "main.uf2", or download the pre built file to your host computer. Then do the following: 1. Disconnect the programming board from the host computer 2. Press and hold the "BOOTSEL" button on the RPi2040 sub board on the programming board 3. Reconnect the programming board to the host computer 4. Release the "BOOTSEL" button after connecting the programming board to the host. The board should now appear to the host as a USB connected storage device 5. Open the storage device and drop the firmware file ("main.uf2") into the storage device The programmer will update its firmware with the file and restart itself. After reboot the storage device will automatically be disconnected. ## CH552 USB to Serial firmware The USB to Serial firmware runs on the CH552 microcontroller, and provides a USB CDC profile which should work with the default drivers on all major operating systems. MTA1-USB-V1 and TK-1 devices come with the CH552 microcontroller pre-programmed. Toolchain setup and build instructions for this firmware are detailed in the [ch552_fw directory](../hw/boards/mta1-usb-v1/ch552_fw/README.md)