Wiki

This version (22 Dec 2021 15:00) was approved by Darius B.The Previously approved version (18 Mar 2021 09:57) is available.Diff

ADRV9002 No-OS System Level Design Setup

Supported devices

Supported carriers

Naming conventions

The ADRV9001 is family designator assigned to the System Development User Guide (UG-1828 for new ADRV9002, ADRV9003, ADRV9004, and upcoming additional family members). Thus, throughout this document, ADRV9001 designator may be used to refer to either ADRV9002, ADRV9003 or ADRV9004.

Project layout and HDL generation

This is how the adrv9001 no-OS project looks like as a file tree.

no-OS/projects/adrv9001
├── Makefile
├── src
│   ├── app
│   │   ├── app_iio.c
│   │   ├── app_iio.h
│   │   ├── headless.c
│   │   ├── ORxGainTable.h
│   │   ├── RxGainTable.h
│   │   └── TxAttenTable.h
│   ├── firmware
│   │   ├── Navassa_EvaluationFw.h
│   │   └── Navassa_Stream.h
│   └── hal
│       ├── adi_platform.h
│       ├── adi_platform_types.h
│       ├── no_os_platform.c
│       ├── no_os_platform.h
│       └── parameters.h
├── src.mk
└── system_top.xsa / system_top.hdf

Note the presence of the system_top.xsa or system_top.hdf file. In order to build this no-OS project, you need such an .xsa or .hdf file present in the project directory, as shown above. In case you don't have one, either obtain a pre-built file or build it yourself by following the Building HDL guide.

See more about Navassa's HDL and options for building an HDL for CMOS or LVDS interface here.

And this is how the corresponding drivers section looks like as a file tree (the Navassa API can be found under common, devices and third_party directories):

no-OS/drivers/rf-transceiver/navassa/
├── adrv9002.c
├── adrv9002_conv.c
├── adrv9002.h
├── adrv9002_init_data.c
├── common
├── devices
└── third_party

Building

NO-OS Project Build Guide

NOTE: This build guide is valid for the projects found in the no-OS/projects folder. If your project resides elsewhere under the no-OS repository tree, it is a legacy project. A build guide for legacy projects can be found Build no-OS with GNU make.

Clone NO-OS with the --recursive flag:

git clone --recursive https://github.com/analogdevicesinc/no-OS

If however you've already cloned NO-OS without the --recursive flag, you may initialize all the submodules in an existing NO-OS clone with:

git submodule update --recursive --init

Build Prerequisites

Prior to building a no-OS project, it is required to set up some environment variables so that the build process may find the necessary tools (compiler, linker, SDK etc.).

Use the following commands to prepare your environment for building no-OS projects:

Linux (Click to expand)

Linux (Click to expand)

Intel (Click to expand)

Intel (Click to expand)

Assuming the SDK is installed at this path:

/path/to/intel
└── intelFPGA
    └── 18.1

Run:

$ source no-OS/tools/scripts/platform/intel/environment.sh /path/to/intel/intelFPGA 18.1

Xilinx (Click to expand)

Xilinx (Click to expand)

Assuming the Vitis is installed at this path:

/path/to/xilinx
├── DocNav
├── Downloads
├── SDK
│   └── 2019.1
└── Vitis
    └── 2021.1

When using no-OS master branch, run:

$ source /path/to/xilinx/Vitis/2021.1/settings64.sh

When using no-OS 2019_R2 branch, run:

$ source /path/to/xilinx/SDK/2019.1/settings64.sh

For more information, consult the support/answers/47821.html.

STM32 (Click to expand)

STM32 (Click to expand)

  • Install stm32cubeide to default location /opt/stm32cubeide. If you'd rather install it at a different location, run export STM32CUBEIDE=/path/to/your/stm32cubeide in the terminal used for building.
  • Install stm32cubemx to default location /opt/stm32cubemx. If you'd rather install it at a different location, run export STM32CUBEMX=/path/to/your/stm32cubemx in the terminal used for building.
  • Install java (openjdk-11), sed and head (if not already present, they normally are).

Maxim (Click to expand)

Maxim (Click to expand)

  • Install the Maxim Micros SDK.
  • Set the MAXIM_LIBRARIES environment variable to the MaximSDK/Libraries path (the default should be ~/MaximSDK/Libraries).
  • For visual debugging and building, install Visual Studio Code, and the Cortex-Debug extension.

Pico (Click to expand)

Pico (Click to expand)

  • Set the PICO_SDK_PATH environment variable to the pico-sdk cloned repository path.
  • Install the J-Link software
  • Set the JLINK_SERVER_PATH environment variable to the JLinkGDBServerCLExe path (the default path should be /opt/SEGGER/JLink/JLinkGDBServerCLExe).
  • For visual debugging and building, install Visual Studio Code, and the Cortex-Debug extension.

ADuCM3029 (Click to expand)

ADuCM3029 (Click to expand)

Please install all the necessary packs locally and then manually import them in CrossCore

Common Issues with environment setup:

  • Makefiles searches for the CCES_HOME in its default installation directory. It may happen that multiple version are installed and may not work. To select a CCES_HOME run export CCES_HOME=/opt/analog/cces/2.10.0

Windows (Click to expand)

Windows (Click to expand)

Use cmd or PowerShell. Cygwin is not supported.

Intel (Click to expand)

Intel (Click to expand)

Assuming the SDK is installed at this path:

C:\
└── intelFPGA
    └── 18.1

Run:

> .\no-OS\tools\scripts\platform\altera\environment.bat C:\intelFpga 18.1

Xilinx (Click to expand)

Xilinx (Click to expand)

Assuming the Vitis is installed at this path:

C:\Xilinx
├── DocNav
├── Downloads
├── SDK
│   └── 2019.1
└── Vitis
    └── 2021.1

When using no-OS master branch, run:

> C:\Xilinx\Vitis\2021.1\settings64.bat

When using no-OS 2019_R2 branch, run:

> C:\Xilinx\SDK\2019.1\settings64.bat

For more information, consult the Xilinx support support/answers/47821.html.

Note that Xilinx SDK versions 2018.3 or earlier don't properly set up the Windows PATH so that you may use make command provided with the SDK from the shell.

If this is the case, please manually add the following to your Windows PATH or install make for Windows of your choice:

C:\Xilinx\SDK\2018.3\gnuwin\bin

Maxim (Click to expand)

Maxim (Click to expand)

  • Install the Maxim Micros SDK.
  • Set the MAXIM_LIBRARIES environment variable to the MaximSDK\Libraries path (the default should be C:\MaximSDK\Libraries).
  • For visual debugging and building, install Visual Studio Code, and the Cortex-Debug extension.

ADuCM3029 (Click to expand)

ADuCM3029 (Click to expand)

Please install all the necessary packs locally and then manually import them in CrossCore

Common Issues with environment setup:

  • Makefiles searches for the CCES_HOME in its default installation directory. It may happen that multiple version are installed and may not work. To select a CCES_HOME run set CCES_HOME=c:\Analog Devices\CrossCore Embedded Studio 2.10.0
If using PowerShell instead of cmd, open another shell instance after running the above scripts.

Building a project

Go in the project directory that should be built.

Linux (Click to expand)

Linux (Click to expand)

$ cd no-OS/projects/project_name/
$ tree
.
├── builds.json
├── Makefile
├── src
└── src.mk

Intel (Click to expand)

Intel (Click to expand)

Copy the .sof and .sopcinfo to the project folder.

$ ls
Makefile  profiles  src  src.mk  system_bd.sopcinfo  adrv9009_a10gx.sof	
$ make

# Alternatively you may select a .sopcinfo file explicitly by:
$ make HARDWARE=path/to/system_bd.sopcinfo

Xilinx (Click to expand)

Xilinx (Click to expand)

Copy the .hdf in the project folder.

$ ls
Makefile  profiles  src  src.mk system_top.hdf
$ make

# Alternatively you may select an .hdf file explicitly by:
$ make HARDWARE=path/to/file.hdf

Maxim (Click to expand)

Maxim (Click to expand)

To build a project, type:

make PLATFORM=maxim TARGET=...

The TARGET specifies the chip for which the project is built. If it is missing, max32660 will be used. At the moment, the available targets are: max32650, max32655 and max32660.

STM32 (Click to expand)

STM32 (Click to expand)

Make sure you have the .ioc file in the project directory, then type:

$ make

ADuCM3029 (Click to expand)

ADuCM3029 (Click to expand)

The ADuCM3029 projects also contain a pinmux_config.c file which contains pin configuration instructions.

# build an ADuCM3029-only project
$ make

# if the platform autodetection picks the wrong platform, explicitly specify the PLATFORM
$ make PLATFORM=aducm3029

Windows (Click to expand)

Windows (Click to expand)

CMD needs to be run with administrative privileges to create a project.

If this is not possible, check the standalone section.

> cd .\no-OS\projects\project_name\

It should contain make-related files and source files:

.\no-OS\projects\project_name\
├── builds.json
├── Makefile
├── src
└── src.mk

Intel (Click to expand)

Intel (Click to expand)

Copy the .sof and .sopcinfo to the project folder and run:

.\no-OS\projects\adrv9009\
├── Makefile
├── profiles
├── src
├── src.mk
├── system_bd.sopcinfo
└── adrv9009_a10gx.sof

> make

Xilinx (Click to expand)

Xilinx (Click to expand)

Copy the .hdf to the project folder and run:

.\no-OS\projects\adrv9009\
├── Makefile
├── profiles
├── src
├── src.mk
└── system_top.hdf

> make

Maxim (Click to expand)

Maxim (Click to expand)

To build a project, type:

make PLATFORM=maxim TARGET=...

The TARGET specifies the chip for which the project is built. If it is missing, max32660 will be used. At the moment, the available targets are: max32650, max32655 and max32660.

ADuCM3029 (Click to expand)

ADuCM3029 (Click to expand)

The ADuCM3029 projects also contain a pinmux_config.c file which contains pin configuration instructions.

# build an ADuCM3029-only project
> make

# if the platform autodetection picks the wrong platform, explicitly specify the PLATFORM
> make PLATFORM=aducm3029

The build process creates a build directory in the project folder:

build
├── app
├── bsp
├── obj
├── release.elf
└── tmp

Running/Debugging

Once the .elf or .hex file has been generated, make sure the board is powered on, JTAG cable connected and use the following commands to upload the program to the board or debug.

Uploading the binary to target is generically achieved with:

$ make run

Use the following command to launch the SDK associated to the used platform in order to be able to debug graphically by clicking the debug button:

$ make sdkopen

Fore more details about the available make rules, check out this page.

17 Mar 2021 10:27 · Darius B

Demo Applications

Make sure to connect your adrv9002 evaluation board to the correct FMC connector or the carrier you use:

DAC_DMA_EXAMPLE demo

DAC_DMA_EXAMPLE is a standard example that sends a sinewave on Tx channels using DMA from a lookup table. If you physically loopback a Tx channel to an Rx channel via an electrical wire, you may run the DAC_DMA_EXAMPLE and read the received data at Rx from particular memory address.

To build the DAC_DMA_EXAMPLE demo, edit the Makefile and add -DDAC_DMA_EXAMPLE to CFLAGS and rebuild. Alternatively, you may simply add a #define DAC_DMA_EXAMPLE in a suitable place in code and rebuild.

To run the DAC_DMA_EXAMPLE, you simply need to run the application as usual by:

  • making sure it was built with the DAC_DMA_EXAMPLE flag, as already mentioned
  • monitoring the serial terminal for messages printed by the application

The application will eventually print something like this:

DAC_DMA_EXAMPLE: address=0x7f170 samples=65536 channels=4 bits=16

This means that the memory address where the data at Rx is stored is 0x7f170, there are in total 65536 samples, 16-bit wide across 4 channels, which is equivalent to 16384, 16-bit samples per channel.

At this point you may use a Tcl script to retrieve data from memory and store it into .csv files for processing:

for Zynq-7000:
xsct legacy/scripts/xilinx_capture.tcl ZYNQ_PS7 0x7f170 65536 4 16

for ZynqMP:
xsct legacy/scripts/xilinx_capture.tcl ZYNQ_PSU 0x7f170 65536 4 16
18 Mar 2021 08:51 · Darius B

TINYIIOD demo

TINYIIOD demo is a standard example, provided in most no-OS projects, that launches a TINYIIOD server on the board so that the user may connect to it via an IIO client. Using iio-oscilloscope, the user can configure the DAC and view the ADC data on a plot.

To build the TINYIIOD demo, add the following flag when invoking make which will build the tinyiiod server and the IIO section of the driver.

make TINYIIOD=y

To run the TINYIIOD demo, first connect to the board via UART to see the runtime output messages with the following settings:

Baud Rate: 115200bps
Data: 8 bit
Parity: None
Stop bits: 1 bit
Flow Control: none

Please note that for proper message display, you may need to convert all LF characters to CRLF, if your serial terminal supports it.

With a serial terminal correctly configured and listening to incoming messages, launch the application (make run or click the debug button in your SDK). Runtime messages specific to the application will apear on your serial terminal screen, and eventually the following message is printed:

Running TinyIIOD server...
If successful, you may connect an IIO client application by:
1. Disconnecting the serial terminal you use to view this message.
2. Connecting the IIO client application using the serial backend configured as shown:
	Baudrate: 921600
	Data size: 8 bits
	Parity: none
	Stop bits: 1
	Flow control: none

This message implies a TINYIIOD server is being run and you may connect to it using a serial-backend enabled iio-oscilloscope and with the settings indicated at the serial terminal.

18 Mar 2021 09:00 · Darius B

Here's an example of iio-oscilloscope connected to a NO-OS Navassa TINYIIOD demo with electrical loopbacks between TX1-RX1 and TX2-RX2.

resources/eval/user-guides/adrv9002/no-os-setup.txt · Last modified: 22 Dec 2021 15:00 by Darius B