diff --git a/doc/docker.md b/doc/docker.md new file mode 100644 index 0000000..c277336 --- /dev/null +++ b/doc/docker.md @@ -0,0 +1,130 @@ +Upsilon docker development environment setup. + +# Dockerfile style guide + +Dockerfiles should be simple. The Dockerfiles should be readable to a +beginner. + +# Setup steps + +Do all of the following in the `build` folder. + +## Installing OpenFPGALoader + +Install [openFPGALoader][1]. If this program is not in your repositories, +run `make openFPGALoader` to fetch and build the program. This will install +openFPGALoader locally. + +Even if you install openFPGALoader locally, there are some files (udev rules) +that must be installed with administrative privleges. Check the documentation +for openFPGALoader. + +[1]: https://trabucayre.github.io/openFPGALoader/index.html + +## Setup Rootless Docker + +Docker allows you to run programs in containers, which are isolated +environments. Build environments can be set up automatically, and re-setup +whenever needed. + +If you have issues with docker, try adding to `~/.config/docker/daemon.json` + + { + "storage-driver": "fuse-overlayfs" + } + + +## Download and Install Python3 + +Install `python3` and `python3-pip`. + +## Clone External Repositories + +Run `make clone`. You may need to download the upsilon repositories +and put them in the same folder as the Makefile. + +## Setup Network + +Plug in your router/switch to an ethernet port on your computer. If your +computer is usually wired to the network, you will need another ethernet +port (a PCI card is ideal, but a USB-Ethernet port works). + +Set the ethernet port to static ip `192.168.1.100/24`, netmask `255.255.255.0`, +gateway `192.168.1.1`. Make sure this is not the default route. Make sure +to adjust your firewall to allow traffic on the 192.168.1.0/24 range. + +If your local network already uses the 192.168.1.0/24 range, then you must +modify `upsilon/firmware/soc.py` to use different IPs. You must rebuild the +SoC after doing this. + +## Setup Images + +Run `make images` to create all docker images. + +## Setup and Run Containers + +For `NAME` in `hardware`, `opensbi`, `buildroot`: + +1. Run `make $NAME-container` to build the container. You usually only need + to do this once. +2. If the container already exists, do `docker container start upsilon-$NAME`. +3. Run `make $NAME-copy` to copy Upsilon's code into the container. +4. Run `make $NAME-execute` to build the data. +5. Run `make $NAME-get` to retrieve the build artefacts. + +If you do not delete the container you can run + + make $NAME-copy $NAME-execute $NAME-get + +when you need to rebuild. If you need shell access, run `make $NAME-shell`. + +## Launch TFTP Server + +Install py3tftp (`pip3 install --user py3tftp`). Then run `make tftp` to +launch the TFTP server. Keep this terminal open. + +## Flash FPGA + +Plug in your FPGA into the USB slot. If you have installed openFPGALoader +by your package manager, run `make OPENFPGALOADER=openfpgaloader flash`. +If you installed it using `make openFPGALoader`, then just run `make flash`. + +In a second you should see messages in the TFTP terminal. This means your +controller is sucessfully connected to your computer. + +## SSH Access + +Add the following to your SSH config: + + Host upsilon + HostName 192.168.1.50 + StrictHostKeyChecking no + UserKnownHostsFile /dev/null + IdentityFile upsilon_key + User root + LogLevel QUIET + +Then copy the file `build/upsilon_key` to `$HOME/.ssh`. + +When the FPGA is connected you can access it with `ssh upsilon` (password +`upsilon`). + +Wait about a minute for Linux to boot. + +## Launch FPGA Shell (Optional) + +If you cannot access the FPGA through SSH, you can launch a shell through +UART. + +You will need to install [LiteX](https://github.com/enjoy-digital/litex). +Download and run `litex_setup.py`. + +Run `litex_term /dev/ttyUSB1`. You should get messages in the window with +the TFTP server that the FPGA has connected to the server. Eventually you +will get a login prompt (username `root` password `upsilon`). + +## Copy Library + +Run `make copy` to copy the Micropython Upsilon library to the FPGA. After +this the modules `comm` and `mmio` are available when running scripts in +`/root`.