Porting UHD to Xilinx ZCU111

493 Views Asked by At

I have a Xilinx ZCU111 board and I want to deploy an open source eNB (LTE base station) stack from srsRAN on it.

Is it possible to port UHD to ZCU111? If possible, how can I do it. If not, is there any other way to implement it?

Thanks!

2

There are 2 best solutions below

1
On

It is possible -- the USRP X410 uses the same FPGA (XCZU28DR). However, it's a lot of work. You'd have to start by cloning the OE environment of the X410 (from here) and merging it with the embedded environment Xilinx provides (or maybe the other way around).

You also need to modify the FPGA and MPM (a mostly-written-in-Python daemon that runs on the hardware) to match the hardware. This includes stuff like controlling the reference clock sources. In MPM there's a file called x4xx.py which is the basis of the X410 MPM support, I'd start by cloning and modifying that.

On the FPGA, you should stick to the USRP repository for an FPGA design, but you'll have to rewrite the constraint files and DTS files from scratch, unless the pinouts of the ZCU111 and X410 overlap significantly. You might want to start with a design that doesn't contain any radios to start with.

UHD may not require all that many modifications (relative to all the rest). However, you probably want to make up a a faux productd ID that UHD recognizes, although you could also re-use the X410 product ID, given that most of the controls live on the device anyway (in MPM, which you will have already modified).

0
On

It is possible. It was a lot of work, but not something that a single motivated person couldn't do in the spare time. I know that because I did it : github.com/ptrkrysik/uhd.

Some of the advices here were good ones. Some not so much. Pinouts are completely different but constraints don't have to be rewritten from scratch - just edited to remove connections to things that don't exist on ZCU111 (like CPLD on main-board and CPLD on ZBX daughter-board) and change pin assignment. Regarding DTS I started using my own DTS overlay for FPGA part and I would say it was one of the biggest dead ends in this project and sources of problems. Now I'm using DTS overlay that is minimally modified version of what X410 has.

The work on UHD part took more time than what I expected. It required creation of a fake daughter-board that uses RFSoC for setting carrier frequency (I called that ThinBX). To do that I had to realize that something called expert graph exists in UHD, what it is for and how to use it.

For identifying X411 (this is how I called the port of X410 to ZCU111) I reused EEPROM that is present on ZCU111. This required change to ZCU111's device tree to expose the EEPROM to the system. User has to backup the EEPROM (with eeprom-dump) and write data in USRP's format (with eeprom-init utility).

There were a lot of moments where a minimal change required a lot of debugging - like finding out why stock kernel from meta-ettus doesn't boot on ZCU111, where Xilinx's fork didn't have an issue to start. Or why kernel was crashing when SFP+ ports were enabled in device tree. Here automatic git bisect saved me a lot of time in tracking the crucial commits that made the difference.

If you need more info how to use the project - contact me. I don't have time to create a webpage with this info at the moment.

Here are installation instructions:

https://github.com/ptrkrysik/uhd/wiki/X411-installation

Here are instructions how to build SD card and FPGA images:

https://github.com/ptrkrysik/meta-ettus/wiki/Building-X411-SD-Card-image

If you want to port X410 to some other/cheaper hardware (like PYNQ) - you can contact me. I can give you few advises.