QEMU - timvideos/litex-buildenv GitHub Wiki
You are able to run the firmware using QEMU for emulation.
You need atftpd net boot images inside QEMU
$ sudo apt-get install atftpd
You also need some build dependencies;
$ sudo apt-get install libpixman-1-dev pkg-config libglib2.0-dev python-minimal libftdi-dev uml-utilities openvpn net-tools
$ sudo apt install bison flex
$ sudo apt build-dep qemu # maybe?
You may also need to add an app exclusion for ufw, to allow inbound tftp connections:
$ sudo ufw allow tftp
$ sudo ufw allow 6069
You need tftpd to net boot images inside QEMU
$ sudo dnf install tftp-server
You also need some build dependencies;
$ sudo dnf install glib2-devel pixman-devel libftdi-devel uml_utilities openvpn bison flex
On Fedora you may need to configure your firewall with;
$ sudo firewall-cmd --zone=FedoraWorkstation --add-service tftp
$ sudo firewall-cmd --zone=FedoraWorkstation --add-port 6069/udp
If you already have a tftpd installed and configured, you're going to have problems here. This can include things started by inetd. You'll know this is the case if you get a "cannot bind to 192.168.100.100 port 69 udp
" error from the below steps.
If you get this error, check out the contents of your /etc/inetd.conf
and comment out the line (by prepending it with '#
') which might look similar to this:
tftp dgram udp4 wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.239.239.0-255 --mcast-ttl 1 --maxthread 100 --verbose=5 /srv/tftp
If you needed to edit /etc/inetd.conf
(or similar) then you will also need to reload the inetd configuration, eg, "service inetutils-inetd reload" to cause it to re-read the changed configuration.
NOTE: A Litex BIOS change around 2018-01-18 allowed it to support both TFTP boot from a high-numbered port (UDP/6069 was chosen in timvideos/litex-buildenv) and also to fall back to the well known UDP/69. If you installed/updated your litex-buildenv on/after 2018-01-18 try checking for tftpd running on UDP/6069 instead (which will hopefully reduce the conflicts with tftpd running as a system daemon).
FIXME: We need better detection and set up of tftpd. See this github issue.
Enter the LiteX Build Environment and then type
(LX P=arty C=mor1kx) $ ./scripts/build-qemu.sh
This will build QEmu, and create the tap interface (shared between the host and QEmu) the first time, and then start the tftp server on that interface.
If you need to manually stop or start the tftp server (e.g. after a reboot), then you can use
(LX P=arty C=mor1kx) $ make tftpd_stop # Stop any previously run tftp server
(LX P=arty C=mor1kx) $ make tftpd_start # Start the tftp server again
After running ./scripts/build-qemu.sh
, If you see something like this:
Reading value 00000000 fr MDIO PHY 00000000 REG 0000001f
reg 31: 0000
Datasync
Reading value 0000bc00 fr MDIO PHY 00000000 REG 00000011
MDIO mode: 1000Mbps / link: up
uIP init done with ip 192.168.100.50
Etherbone listening on port 1234
Telnet listening on port 23
H2U 00:00:00>
Then you're good to go. Now you should check that you can telnet to the firmware:
$ telnet 192.168.100.50 23
Trying 192.168.100.50...
Connected to 192.168.100.50.
Escape character is '^]'.
<hit enter a couple of times>
H2U 00:00:42>
Exit telnet by typing "ctrl-] q" in the telnet session to exit telnet, and "ctrl-c" in the build-qemu session to exit qemu.