Networking - timvideos/litex-buildenv GitHub Wiki
TFTP Firmware Loading
If your board has networking, you can TFTP boot your firmware.
You need atftpd server to net boot firmware;
$ sudo apt-get install atftpd
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 server to net boot firmware;
$ sudo dnf install tftp-server
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.
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
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.
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.
Due to the Ethernet link being reset multiple times during the FPGA programming and booting sequence, your network needs to be manually configured to remain up rather than using automated management with network manager or systemd.
You have been provided a USB Hub with an inbuilt Ethernet controller for connecting to the Arty. This should mean you don't need to break or affect your normal networking set up.
Debian uses /etc/network/interfaces to control static configurations.
Add the following to your /etc/network/interfaces
file.
Note: Your interface name is unique to each USB hub. Make sure you are using your own value.
iface enx00e04c680b24 inet static
address 192.168.100.100
netmask 255.255.255.0
After changing this file, restart Network Manager with;
$ sudo service network-manager restart
You should then check that network manager is not managing the enx00e04c680b24
interface using the following and look for a status of "unmanaged"; if you see a status of "connected" or "unavailable" that means that Network Manager is trying to manage that interface (and it either has ethernet carrier or does not have carrier respectively).
$ nmcli dev status
DEVICE TYPE STATE CONNECTION
docker0 bridge connected docker0
wlp4s0 wifi disconnected --
enp0s31f6 ethernet unavailable --
enx00e04c680b24 ethernet unmanaged --
lo loopback unmanaged --
tap0 tun unmanaged --
Delete the tap interface (or reboot)
$ sudo ip link delete dev tap0
Bring up the Ethernet device with ifup;
$ sudo ifup enx00e04c680b24
Redhat / Fedora uses /etc/sysconfig/network-scripts/ifcfg-INTERFACE
script files to control static network interface configurations.
Create an /etc/sysconfig/network-scripts/ifcfg-enx00e04c680b24
file.
Note: Your interface name is unique to each USB hub. Make sure you are using your own value in the name of the file, and below.
`DEVICE=enx00e04c680b24`
```
NM_CONTROLLED=no
ONBOOT=no
BOOTPROTO=static
IPADDR=192.168.100.100
NETMASK=255.255.255.0
```
After creating (or changing) this file, restart Network Manager with:
$ sudo systemctl restart NetworkManager
You should then check that network manager is not managing the enx00e04c680b24
interface using the following and look for a status of "unmanaged"; if you see a status of "connected" or "unavailable" that means that Network Manager is trying to manage that interface (and it either has ethernet carrier or does not have carrier respectively).
$ nmcli dev status
DEVICE TYPE STATE CONNECTION
docker0 bridge connected docker0
wlp4s0 wifi disconnected --
enp0s31f6 ethernet unavailable --
enx00e04c680b24 ethernet unmanaged --
lo loopback unmanaged --
tap0 tun unmanaged --
Delete the tap interface (or reboot)
$ sudo ip link delete dev tap0
Bring up the Ethernet device with ifup;
$ sudo ifup enx00e04c680b24
If you don't have network manager installed, you can just manually configure the network interface using ifconfig or ip. Note: Your interface name (shown in red
) is unique to each USB hub. Make sure you are using your own value.
$ sudo ifconfig enx00e04c680b24 inet 192.168.100.100 up
$ sudo ip addr add 192.168.100.100/24 dev enx00e04c680b24
$ sudo ip link set enx00e04c680b24 up
If can be useful to have the 192.168.100.100 on both your ethernet interface and inside QEmu so you can quickly switch back and forth between them. You can do this by using the Linux bridge interface.
Create a bridge
$ sudo brctl addbr br0
Add interfaces to the bridge
$ sudo brctl addif br0 tap0
$ sudo brctl addif br0 enx00e04c680b24
Configure the bridge to be 192.168.100.100
$ sudo ifconfig br0 192.168.100.100 netmask 255.255.255.0