IIO DEMO project is independent of a physical device and should be used as reference, when creating a new iio application for a new iio device.
IIO DEMO project emulates two devices: 1 16-bit ADC and 1 16-bit DAC by using two emulated drivers: adc_demo and dac_demo.
The source code for ADC Demo driver can be found here:
Source code documentation for the driver is automatically generated using the Doxygen tool and it is available below:
The source code for DAC Demo driver can be found here:
Source code documentation for the driver is automatically generated using the Doxygen tool and it is available below:
The source code for ADC IIO Demo driver can be found here:
Source code documentation for the driver is automatically generated using the Doxygen tool and it is available below:
The source code for DAC IIO Demo driver can be found here:
Source code documentation for the driver is automatically generated using the Doxygen tool and it is available below:
The following platforms are supported:
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
Please follow the steps below for No-OS Setup based on the environment you are using. Make sure you use the information for the specific platform you are using (e.g. STM32, ADUCM3029, etc.).
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:
The path of the project is no-OS/projects/iio_demo/
Go in the project directory that should be built.
The build process creates a build directory in the project folder:
build ├── app ├── bsp ├── obj ├── project_name.elf └── tmp
Once the .elf
, .hex
or .bin
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.
Because this project does not require any hardware, it can be run also locally on your Linux OS.
In order to build the IIO example project for a specific platform make sure you have the following configuration in the Makefile:
# Select the example you want to enable by choosing y for enabling and n for disabling IIO_EXAMPLE = y IIO_TRIGGER_EXAMPLE = n
When running make command, specify the platform you want to build it for, as shown below:
// ADUCM platform make PLATFORM=aducm3029 // Linux platform make PLATFORM=linux // STM32 platform make PLATFORM=stm32 // XILINX platform make PLATFORM=xilinx // PICO platform make PLATFORM=pico
In this case, we are going to build the project for Linux platform, using the command:
no-OS/projects/iio_demo$ make PLATFORM=linux
After the build is successful we can run the application, using the command:
no-OS/projects/iio_demo$ ./build/iio_demo.out
Now, by running iio_info in the Linux terminal, we can see the emulated IIO devices, as shown below:
no-OS/projects/iio_demo$ iio_info -u ip:127.0.0.1 Library version: 0.24 (git tag: 735ac65) Compiled with backends: local xml ip usb serial IIO context created with network backend. Backend version: 1.1 (git tag: 0000000) Backend description string: 127.0.0.1 no-OS analog 1.1.0-g0000000 #1 Tue Nov 26 09:52:32 IST 2019 armv7l IIO context has 3 attributes: no-OS: 1.1.0-g0000000 ip,ip-addr: 127.0.0.1 uri: ip:127.0.0.1 IIO context has 2 devices: iio:device0: adc_demo (buffer capable) 2 channels found: voltage0: adc_in_ch0 (input, index: 0, format: le:S16/16>>0) 1 channel-specific attributes found: attr 0: adc_channel_attr value: 1111 voltage1: adc_in_ch1 (input, index: 1, format: le:S16/16>>0) 1 channel-specific attributes found: attr 0: adc_channel_attr value: 1112 1 device-specific attributes found: attr 0: adc_global_attr value: 3333 1 debug attributes found: debug attr 0: direct_reg_access value: 0 ERROR: checking for trigger : Invalid argument (22) iio:device1: dac_demo (buffer capable) 2 channels found: voltage0: dac_out_ch0 (output, index: 0, format: le:S16/16>>0) 1 channel-specific attributes found: attr 0: dac_channel_attr value: 1111 voltage1: dac_out_ch1 (output, index: 1, format: le:S16/16>>0) 1 channel-specific attributes found: attr 0: dac_channel_attr value: 1112 1 device-specific attributes found: attr 0: dac_global_attr value: 4444 1 debug attributes found: debug attr 0: direct_reg_access value: 0 ERROR: checking for trigger : Invalid argument (22)
It can be observed that two iio_devices are found: adc_demo and dac_demo. Each device has a device specific attribute (adc_demo: adc_global_attr and dac_demo: dac_global_attr) and a debug attribute for direct register access.
It can also be observed that each device has two voltage-type channels and each channel has a channel specific attribute:
If ENABLE_LOOPBACK is not defined in src/app_config.h, then a sine loop will be returned when reading a buffer from adc_demo device. This can be achieved using iio_readdev command or using IIO Osc.
iio_readdev -u ip:127.0.0.1 -b 400 -s 400 adc_demo > samples.dat
For IIO Osc, connect to the device and use the plot functionality to view the data, as shown below:
If ENABLE_LOOPBACK is defined in src/app_config.h, then the dac_demo device can also be used to upload data to the buffer used by adc_demo (the data given to the dac will be looped back to the adc device). If no data is loaded, the default data will be shown, which is 0. In order to write data to dac_demo, you can use either iio_writedev command or DAC Data Manager plugin from IIO Osc. When using iio_writedev, we can use iio_readdev to read back the data we wrote, as shown below:
// write 400 samples to dac cat sample_sine.dat | iio_writedev -u ip:127.0.0.1 -b 400 -s 400 dac_demo // read 400 samples from adc -> should be the same as the one we wrote previously iio_readdev -u ip:127.0.0.1 -b 400 -s 400 adc_demo > dac_samples.dat
For IIO Osc, connect to the device and use the DAC Data Manager to load data. Then use the plot functionality to view the loaded data. It can be seen how plotted data is changing when new data is loaded:
In order to build the IIO trigger example project for a specific platform make sure you have the following configuration in the Makefile:
# Select the example you want to enable by choosing y for enabling and n for disabling IIO_EXAMPLE = n IIO_TRIGGER_EXAMPLE = y
The following steps are perform on Linux platform.
By running iio_info, we can see the emulated IIO devices, as shown below:
no-OS/projects/iio_demo$ iio_info -u ip:127.0.0.1 Library version: 0.24 (git tag: 735ac65) Compiled with backends: local xml ip usb serial IIO context created with network backend. Backend version: 1.1 (git tag: 0000000) Backend description string: 127.0.0.1 no-OS analog 1.1.0-g0000000 #1 Tue Nov 26 09:52:32 IST 2019 armv7l IIO context has 3 attributes: no-OS: 1.1.0-g0000000 ip,ip-addr: 127.0.0.1 uri: ip:127.0.0.1 IIO context has 3 devices: iio:device0: adc_demo (buffer capable) 2 channels found: voltage0: adc_in_ch0 (input, index: 0, format: le:S16/16>>0) 1 channel-specific attributes found: attr 0: adc_channel_attr value: 1111 voltage1: adc_in_ch1 (input, index: 1, format: le:S16/16>>0) 1 channel-specific attributes found: attr 0: adc_channel_attr value: 1112 1 device-specific attributes found: attr 0: adc_global_attr value: 3333 1 debug attributes found: debug attr 0: direct_reg_access value: 0 No trigger assigned to device iio:device1: dac_demo (buffer capable) 2 channels found: voltage0: dac_out_ch0 (output, index: 0, format: le:S16/16>>0) 1 channel-specific attributes found: attr 0: dac_channel_attr value: 1111 voltage1: dac_out_ch1 (output, index: 1, format: le:S16/16>>0) 1 channel-specific attributes found: attr 0: dac_channel_attr value: 1112 1 device-specific attributes found: attr 0: dac_global_attr value: 4444 1 debug attributes found: debug attr 0: direct_reg_access value: 0 No trigger assigned to device trigger0: adc-demo-sw-trig 0 channels found: 1 device-specific attributes found: attr 0: trigger_now ERROR: No such file or directory (2) ERROR: checking for trigger : No such device (19)
It can be observed, that in this case a new device is available, adc-demo-sw-trig. This device can be used as a trigger to sample data from adc_demo device. This is a software trigger, meaning that the trigger is activated by software, when performing writes to its attribute. In this case the name of the attribute is trigger_now.
The writing to the trigger_now attribute can be performed using the iio_attr command as follows:
iio_attr -u ip:127.0.0.1 -d trigger0 trigger_now 1
This command will write the value 1 to the trigger_now attribute of trigger0 device and it will activate the trigger one time. If we want to obtain 10 samples, we need to run the command 10 times.
The following python script can be used to send automatically the iio_attr command:
import sys import os my_uri = sys.argv[1] if len(sys.argv) >= 3 else "ip:127.0.0.1" my_samples = sys.argv[2] if len(sys.argv) >= 3 else 200 print("Executing trigger_now attribute for trigger0"); print("for uri: " + str(my_uri)) print("for " + str(my_samples) + " samples\n"); i = 0 while i < int(my_samples): i+=1 os.system("iio_attr -u "+my_uri+" -d trigger0 trigger_now 1 \n") print("triggered "+str(i)+" times\n" )
Below, you can see an example with software trigger usage: