Files
PLFM_RADAR/14_RADAR_Old_version/Firmware/Microcontroller/iiod.h
T
2026-03-19 01:21:46 +00:00

193 lines
6.8 KiB
C

/***************************************************************************//**
* @file iiod.h
* @brief Header file of iiod
* @author Mihail Chindris (mihail.chindris@analog.com)
********************************************************************************
* Copyright 2022(c) Analog Devices, Inc.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of Analog Devices, Inc. nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY ANALOG DEVICES, INC. “AS IS” AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
* EVENT SHALL ANALOG DEVICES, INC. BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*******************************************************************************/
#ifndef IIOD_H
#define IIOD_H
#include <stdint.h>
#include <stdbool.h>
#include "iio.h"
/* Maximum nomber of iiod connections to allocate simultaneously */
#define IIOD_MAX_CONNECTIONS 10
#define IIOD_VERSION "1.1.0000000"
#define IIOD_VERSION_LEN (sizeof(IIOD_VERSION) - 1)
#define MAX_DEV_ID 64
#define MAX_TRIG_ID 64
#define MAX_CHN_ID 64
#define MAX_ATTR_NAME 256
enum iio_attr_type {
IIO_ATTR_TYPE_DEBUG,
IIO_ATTR_TYPE_BUFFER,
IIO_ATTR_TYPE_CH_OUT,
IIO_ATTR_TYPE_CH_IN,
IIO_ATTR_TYPE_DEVICE,
};
struct iiod_attr {
enum iio_attr_type type;
/*
* Attribute name.
* If empty (""), all attributes of the specified iio_attr_type must
* be read/wrote
*/
const char *name;
const char *channel;
};
struct iiod_ctx {
/* Value specified in iiod_init_param.instance in iiod_init */
void *instance;
/* Value specified in iiod_conn_data.conn in iiod_conn_add */
void *conn;
};
struct iiod_conn_data {
/* Value to be used in iiod_ctx */
void *conn;
/* Buffer to store attributes or buffer data for a connection. */
char *buf;
/* Size of the provided buffer. It must fit the max attribute size */
uint32_t len;
};
/* Functions should return a negative error code on failure */
struct iiod_ops {
/*
* I/O operations
* Send and recv are used to send or receive data to/from a connection.
* They should send/receive the at maximum len bytes.
* They must return the number of bytes sent/received.
* They can return 0 or -EAGAIN when no data was processed.
* They can do not block. They will be called again if there is still
* data to be sent/recevied
*/
int (*send)(struct iiod_ctx *ctx, uint8_t *buf, uint32_t len);
int (*recv)(struct iiod_ctx *ctx, uint8_t *buf, uint32_t len);
/*
* This is the equivalent of libiio iio_device_create_buffer.
* Called in order to create a buffer to read or write data.
* read_buffer or write_buffer will follow with a maximum of samples
* (depending on the internal buffer).
* All calls with the same ctx will refer to this buffer until close is
* called.
*/
int (*open)(struct iiod_ctx *ctx, const char *device, uint32_t samples,
uint32_t mask, bool cyclic);
/* Equivalent of iio_buffer_destroy */
int (*close)(struct iiod_ctx *ctx, const char *device);
/* Read data from opened buffer */
int (*read_buffer)(struct iiod_ctx *ctx, const char *device, char *buf,
uint32_t bytes);
/* Called to notify that buffer must be refiiled */
int (*refill_buffer)(struct iiod_ctx *ctx, const char *device);
/* Write data to opened buffer */
int (*write_buffer)(struct iiod_ctx *ctx, const char *device,
const char *buf, uint32_t bytes);
/* Called to notify that buffer must be pushed to hardware */
int (*push_buffer)(struct iiod_ctx *ctx, const char *device);
/*
* Attribute has to be read in buf and return the number of bytes
* written.
*/
int (*read_attr)(struct iiod_ctx *ctx, const char *device,
struct iiod_attr *attr, char *buf, uint32_t len);
/* Attribute buf is filled with the attribute value. */
int (*write_attr)(struct iiod_ctx *ctx, const char *device,
struct iiod_attr *attr, char *buf, uint32_t len);
/* Simular with read_attr but trigger must be filled */
int (*get_trigger)(struct iiod_ctx *ctx, const char *device,
char *trigger, uint32_t len);
/*
* Simular with write_attr but trigger name is in trigger.
* If trigger is equals to "". Trigger must be removed.
*/
int (*set_trigger)(struct iiod_ctx *ctx, const char *device,
const char *trigger, uint32_t len);
/* I don't know what this should be used for :) */
int (*set_timeout)(struct iiod_ctx *ctx, uint32_t timeout);
/* I don't know what this should be used for :) */
int (*set_buffers_count)(struct iiod_ctx *ctx, const char *device,
uint32_t buffers_count);
};
/*
* Internal structure.
* It is created in iiod_init and must be passed to all fucntions
*/
struct iiod_desc;
/* Parameter to initialize iiod_desc */
struct iiod_init_param {
struct iiod_ops *ops;
/* Value to be send in each iiod_ctx from iiod_ops functions */
void *instance;
/*
* Xml description of the context and devices. It should exist until
* iiod_remove is called
*/
char *xml;
/* Size of xml in bytes */
uint32_t xml_len;
/* Backend used by IIOD */
enum physical_link_type phy_type;
};
/* Initialize desc. */
int32_t iiod_init(struct iiod_desc **desc, struct iiod_init_param *param);
/* Remove desc resources */
void iiod_remove(struct iiod_desc *desc);
/*
* Notify iiod about a new connection in order to store context for it.
* new_conn_id is set in order to reference the connection in iiod_conn_step
*/
int32_t iiod_conn_add(struct iiod_desc *desc, struct iiod_conn_data *data,
uint32_t *new_conn_id);
/* Remove conn_id from iiod. Provided data is returned in data */
int32_t iiod_conn_remove(struct iiod_desc *desc, uint32_t conn_id,
struct iiod_conn_data *data);
/* Advance in the state machine of a connection. Will not block */
int32_t iiod_conn_step(struct iiod_desc *desc, uint32_t conn_id);
#endif //IIOD_H