1/** 2@mainpage 3 4@tableofcontents 5 6@section license License 7Libiio has been developed and is released under the terms of the GNU Lesser General Public 8License, version 2. This open-source license allows anyone to use the library for proprietary or 9open-source, commercial or non-commercial applications. This choice was motivated by the fact 10that Analog Devices is a company that principally sells hardware, and this library provides the 11clients with a better and easier way of using this hardware. 12 13The full terms of the license can be found here: http://opensource.org/licenses/LGPL-2.1 14 15@section code_model Code Model 16The basic bricks of the libiio API are the iio_context, iio_device, iio_channel and iio_buffer classes. 17 18 19 20- A iio_context object may contain zero or more iio_device objects. 21 A iio_device object is associated with only one iio_context. 22 This object represents an instance of the library. 23- A iio_device object may contain zero or more iio_channel objects. A iio_channel object is associated with only one iio_device. 24- A iio_device object may be associated with one iio_buffer object, and a iio_buffer object is associated with only one iio_device. 25 26@section creating_context Creating a context 27Different functions are available to create the iio_context object. Depending on what backends were enabled when compiling the library, some of them may not be available. 28Each function will result in a different backend being used. 29 30Those functions are: 31- iio_create_local_context(): Create a "local" context, to use the IIO devices connected to the system (typically for cross-compiled applications). 32- iio_create_network_context(): Create a "network" context that will work with a remotely connected target. 33 34Note that every function that compose the API of libiio will work independently of the function that was used to create the iio_context object. 35 36The iio_context object can later be destroyed with iio_context_destroy(). 37 38@subsection navigation Navigation 39@subsubsection device_obj Device objects 40- From the iio_context object, you can obtain the number of available devices with iio_context_get_devices_count(). 41- Then, each iio_device object can be accessed with iio_context_get_device(). 42- Alternatively, it is possible to lookup for a device name or ID with iio_context_find_device(). 43 44Each iio_device object has an ID that can be used as identifier. This ID can be retrieved with iio_device_get_id(). 45It optionally also has a name, that can be retrieved with iio_device_get_name(). 46 47@subsubsection channel_obj Channel objects 48- From the iio_device object, you can obtain the number of available channels with iio_device_get_channels_count(). 49- Then, each iio_channel object can be accessed with iio_device_get_channel(). 50- Alternatively, it is possible to lookup for a channel name or ID with iio_device_find_channel(). 51 52Each iio_channel can be either input, or output. This information can be retrieved with iio_channel_is_output(). 53As for the Device objects, the iio_channel object features an ID and optionally a name. 54The ID can be obtained with iio_channel_get_id(), and the name can be obtained with iio_channel_get_name(). 55Important note: two iio_channel can have the same ID, as long as one is input and the other is output. 56 57@subsection list_params Parameters 58Different kinds of parameters are available: parameters that apply to a iio_device, and parameters that apply to one or more iio_channel. 59- The number of device-specific parameters can be obtained with iio_device_get_attrs_count(). Each attribute name can be obtained with iio_device_get_attr(). 60- The number of channel-specific attributes can be obtained with iio_channel_get_attrs_count(). Each attribute name can be obtained with iio_channel_get_attr(). 61 62Alternatively, it is possible to lookup for the name of an attribute with iio_device_find_attr() and iio_channel_find_attr(). 63 64@section reading_modify_params Reading and modifying parameters 65 66@subsection read_param Reading a parameter 67Read device-specific attributes with those functions: 68- iio_device_attr_read() 69- iio_device_attr_read_all() 70- iio_device_attr_read_bool() 71- iio_device_attr_read_longlong() 72- iio_device_attr_read_double() 73 74Read channel-specific attributes with those functions: 75- iio_channel_attr_read() 76- iio_channel_attr_read_all() 77- iio_channel_attr_read_bool() 78- iio_channel_attr_read_longlong() 79- iio_channel_attr_read_double() 80 81Read debug attributes with those functions: 82- iio_device_debug_attr_read() 83- iio_device_debug_attr_read_all() 84- iio_device_debug_attr_read_bool() 85- iio_device_debug_attr_read_longlong() 86- iio_device_debug_attr_read_double() 87 88@subsection write_param Modifying a parameter 89Write device-specific attributes with those functions: 90- iio_device_attr_write() 91- iio_device_attr_write_all() 92- iio_device_attr_write_bool() 93- iio_device_attr_write_longlong() 94- iio_device_attr_write_double() 95 96Write channel-specific attributes with those functions: 97- iio_channel_attr_write() 98- iio_channel_attr_write_all() 99- iio_channel_attr_write_bool() 100- iio_channel_attr_write_longlong() 101- iio_channel_attr_write_double() 102 103Write debug attributes with those functions: 104- iio_device_debug_attr_write() 105- iio_device_debug_attr_write_all() 106- iio_device_debug_attr_write_bool() 107- iio_device_debug_attr_write_longlong() 108- iio_device_debug_attr_write_double() 109 110@section trigger Triggers 111Some devices, mostly low-speed ADCs and DACs, require a trigger to be set for the capture or upload process to work. 112 113In libiio, triggers are just regular iio_device objects. To check if an iio_device can be used as a trigger, you can use iio_device_is_trigger(). 114 115To see if one device is associated with a trigger, use iio_device_get_trigger(). 116 117To assign one trigger to a iio_device, you can use iio_device_set_trigger(). If you want to disassociate a iio_device from its trigger, pass NULL to the "trigger" parameter of this function. 118 119@section capture_upload Capturing or uploading samples 120The process of capturing samples from the hardware and uploading samples to the hardware is done using the functions that apply to the iio_buffer object. 121 122@subsection create_buffer Enabling channels and creating the Buffer object 123The very first step is to enable the capture channels that we want to use, and disable those that we don't need. 124This is done with the functions iio_channel_enable() and iio_channel_disable(). 125Note that the channels will really be enabled or disabled when the iio_buffer object is created. 126 127Also, not all channels can be enabled. To know whether or not one channel can be enabled, use iio_channel_is_scan_element(). 128 129Once the channels have been enabled, and triggers assigned (for triggered buffers) the iio_buffer object can be created from the iio_device object that will be used, with the function iio_device_create_buffer(). 130This call will fail if no channels have been enabled, or for triggered buffers, if the trigger has not been assigned. 131 132When the object is no more needed, it can be destroyed with iio_buffer_destroy(). 133 134@subsection refill Refilling the Buffer (input devices only) 135If the Buffer object has been created from a device with input channels, then it must be updated first. This is done with the iio_buffer_refill() function. 136 137@subsection read_write Reading or writing samples to the Buffer 138Libiio offers various ways to interact with the iio_buffer object. 139 140@subsubsection memcpy Direct copy 141If you already have a buffer of samples, correctly interleaved and in the format that the hardware expects, 142it is possible to copy the samples directly into the iio_buffer object using `memcpy`: 143 144~~~{.c} 145size_t iio_buf_size = iio_buffer_end(buffer) - iio_buffer_start(buffer); 146size_t count = MAX(sizeof(samples_buffer), iio_buf_size); 147memcpy(iio_buffer_start(buffer), samples_buffer, count); 148~~~ 149 150Using `memcpy` to copy samples from the iio_buffer is <b>not recommended</b>. 151When capturing samples from an input device, you cannot assume that the iio_buffer object contains only the samples you're interested in. 152 153@subsubsection iterating_cb Iterating over the buffer with a callback 154Libiio provides a way to iterate over the buffer by registering a callback function, with the iio_buffer_foreach_sample() function. 155 156The callback function will be called for each "sample slot" of the buffer, 157which will contain a valid sample if the buffer has been refilled, 158or correspond to an area where a sample should be stored if using an output device. 159 160~~~{.c} 161ssize_t sample_cb(const struct iio_channel *chn, void *src, size_t bytes, void *d) 162{ 163 /* Use "src" to read or write a sample for this channel */ 164} 165 166int main(void) 167{ 168 ... 169 iio_buffer_foreach_sample(buffer, sample_cb, NULL); 170 ... 171} 172~~~ 173 174Note that the callback will be called in the order that the samples appear in the buffer, 175and only for samples that correspond to channels that were enabled. 176 177@subsubsection iterating_for Iterating on the samples with a for loop 178This method allows you to iterate over the samples slots that correspond to one channel. 179As such, it is interesting if you want to process the data channel by channel. 180 181It basically consists in a for loop that uses the functions iio_buffer_first(), iio_buffer_step() and iio_buffer_end(): 182 183~~~{.c} 184for (void *ptr = iio_buffer_first(buffer, channel); 185 ptr < iio_buffer_end(buffer); 186 ptr += iio_buffer_step(buffer)) { 187 /* Use "ptr" to read or write a sample for this channel */ 188} 189~~~ 190 191@subsubsection deinterleave Extracting from/to a second buffer 192 193Finally, it is possible to use the iio_channel_read() and iio_channel_read_raw() 194functions to read samples from the iio_buffer to a second byte array. 195The samples will be deinterleaved if needed. 196The "raw" variant will only deinterleave the samples, while the other variant will deinterleave and convert the samples. 197 198For output devices, the iio_channel_write() and iio_channel_write_raw() functions are also available. 199The "raw" variant will only interleave the samples (if needed), while the other variant will interleave and convert the samples 200back to their hardware format. 201 202@subsection convert Convert the samples from/to hardware format 203The raw stream of samples generally isn't in a format that can be directly used in algorithms. 204Some operations, like endianness conversion and bit-shifting of the samples, have to be performed first. 205 206Libiio offers two functions that can be used to convert samples: 207- iio_channel_convert(), to convert from the hardware format 208- iio_channel_convert_inverse(), to convert to the hardware format. 209 210Those two functions should always be used when manipulating the samples of the iio_buffer. 211The exception is when iio_channel_read() or iio_channel_write() are used, as the conversion is then done internally. 212 213@subsection push Submitting the Buffer (output devices only) 214When all the samples have been written to the iio_buffer object, you can submit the buffer to the hardware with a call to iio_buffer_push(). 215As soon as the buffer has been submitted, it can be re-used to store new samples. 216 217If the iio_buffer object has been created with the "cyclic" parameter set, and the kernel driver supports cyclic buffers, 218the submitted buffer will be repeated until the iio_buffer is destroyed, and no subsequent call to iio_buffer_push() will be allowed. 219 220@section advanced Advanced options 221 222@subsection userdata Register and retrieve a pointer 223The iio_device and iio_channel allow you to register a pointer, that can then be retrieved at a later moment. 224- A pointer can be registered with a iio_device object using iio_device_set_data(), and can be retrieved with iio_device_get_data(). 225- A pointer can be registered with a iio_channel object using iio_channel_set_data(), and can be retrieved with iio_channel_get_data(). 226 227@subsection debug_attr Debug attributes 228Some IIO devices provide debug parameters, but their presence is optional. In a similar way than with regular device parameters, 229the number of debug parameters can be obtained with iio_device_get_debug_attrs_count(). Each individual parameter can be retrieved with iio_device_get_debug_attr(). 230Alternatively, it is possible to lookup for the name of a debug attribute with iio_device_find_debug_attr(). 231 232Those debug parameters can be read using the following functions: 233- iio_device_debug_attr_read(), 234- iio_device_debug_attr_read_all(), 235- iio_device_debug_attr_read_bool(), 236- iio_device_debug_attr_read_longlong(), 237- iio_device_debug_attr_read_double(). 238 239Those debug parameters can be written using the following functions: 240- iio_device_debug_attr_write(), 241- iio_device_debug_attr_write_all(), 242- iio_device_debug_attr_write_bool(), 243- iio_device_debug_attr_write_longlong(), 244- iio_device_debug_attr_write_double(). 245 246@subsection registers Reading and writing registers 247As for debug attributes, some IIO devices also offer the possibility to read and write hardware registers directly. 248In libiio, this can be done with two functions, iio_device_reg_read() and iio_device_reg_write(). 249 250@section abi Application Binary Interface 251 252The libiio ABI tries to be both backwards and forwards compatible. 253This means applications compiled against an older version will work fine with a newer dynamically linked library. Applications compiled against a newer version will work fine with an older dynamically linked library so long as they don't access any new features. Applications using new features should ensure the libiio version is compatible by using iio_library_get_version() to avoid undefined behavior. 254 255 256*/ 257