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

228 lines
6.2 KiB
C

/***************************************************************************//**
* @file iio_trigger.c
* @brief Implementation of generic iio trigger.
* @author RBolboac (ramona.bolboaca@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.
*/
#include <stdlib.h>
#include <string.h>
#include "no_os_error.h"
#include "no_os_alloc.h"
#include "iio.h"
#include "iio_trigger.h"
#ifndef LINUX_PLATFORM
/**
* @brief Initialize hardware trigger.
*
* @param iio_trig - The iio trigger structure.
* @param init_param - The structure that contains the trigger initial params.
*
* @return ret - Result of the initialization procedure.
*/
int iio_hw_trig_init(struct iio_hw_trig **iio_trig,
struct iio_hw_trig_init_param *init_param)
{
struct iio_hw_trig *trig_desc;
int ret;
if (!init_param->name)
return -EINVAL;
trig_desc = (struct iio_hw_trig*)no_os_calloc(1, sizeof(*trig_desc));
if (!trig_desc)
return -ENOMEM;
trig_desc->iio_desc = init_param->iio_desc;
strncpy(trig_desc->name, init_param->name, TRIG_MAX_NAME_SIZE);
trig_desc->irq_ctrl = init_param->irq_ctrl;
trig_desc->irq_id = init_param->irq_id;
trig_desc->irq_trig_lvl = init_param->irq_trig_lvl;
struct no_os_callback_desc irq_cb = {
.callback = iio_hw_trig_handler,
.ctx = trig_desc,
.event = init_param->cb_info.event,
.handle = init_param->cb_info.handle,
.peripheral = init_param->cb_info.peripheral
};
ret = no_os_irq_register_callback(trig_desc->irq_ctrl,
trig_desc->irq_id, &irq_cb);
if (ret)
goto error;
if (init_param->cb_info.event == NO_OS_EVT_GPIO) {
ret = no_os_irq_trigger_level_set(trig_desc->irq_ctrl,
trig_desc->irq_id, trig_desc->irq_trig_lvl);
if (ret)
goto error;
}
*iio_trig = trig_desc;
return 0;
error:
no_os_free(trig_desc);
return ret;
}
/**
* @brief Enable system interrupt which is linked to the given trigger.
*
* @param trig - Trigger structure.
*
* @return ret - Result of the enable procedure.
*/
int iio_trig_enable(void *trig)
{
if (!trig)
return -EINVAL;
struct iio_hw_trig *desc = trig;
return no_os_irq_enable(desc->irq_ctrl, desc->irq_id);
}
/**
* @brief Disable system interrupt which is linked to the given trigger.
*
* @param trig - Trigger structure.
*
* @return ret - Result of the disable procedure.
*/
int iio_trig_disable(void *trig)
{
if (!trig)
return -EINVAL;
struct iio_hw_trig *desc = trig;
return no_os_irq_disable(desc->irq_ctrl, desc->irq_id);
}
/**
* @brief Trigger interrupt handler. This function will be called when a system
* interrupt is asserted for the configured trigger.
*
* @param trig - Trigger structure which is linked to this handler.
*/
void iio_hw_trig_handler(void *trig)
{
if (!trig)
return;
struct iio_hw_trig *desc = trig;
iio_process_trigger_type(desc->iio_desc, desc->name);
}
/**
* @brief Free the resources allocated by iio_hw_trig_init().
*
* @param trig - The trigger structure.
*
* @return ret - Result of the remove procedure.
*/
int iio_hw_trig_remove(struct iio_hw_trig *trig)
{
if (trig)
no_os_free(trig);
return 0;
}
#endif
/**
* @brief Initialize software trigger.
*
* @param iio_trig - The iio trigger structure.
* @param init_param - The structure that contains the sw trigger initial params.
*
* @return ret - Result of the initialization procedure.
*/
int iio_sw_trig_init(struct iio_sw_trig **iio_trig,
struct iio_sw_trig_init_param *init_param)
{
struct iio_sw_trig *trig_desc;
if (!init_param->iio_desc || !init_param->name)
return -EINVAL;
trig_desc = (struct iio_sw_trig*)no_os_calloc(1, sizeof(*trig_desc));
if (!trig_desc)
return -ENOMEM;
trig_desc->iio_desc = init_param->iio_desc;
strncpy(trig_desc->name, init_param->name, TRIG_MAX_NAME_SIZE);
*iio_trig = trig_desc;
return 0;
}
/**
* @brief Handles the write request for trigger_now attribute.
*
* @param trig - The iio trigger structure.
* @param buf - Command buffer to be filled with the data to be written.
* @param len - Length of the received command buffer in bytes.
* @param channel - Command channel info (is NULL).
* @param priv - Command attribute id.
*
* @return ret - Result of the sw trigger handler procedure.
*/
int iio_sw_trig_handler(void *trig, char *buf, uint32_t len,
const struct iio_ch_info *channel,
intptr_t priv)
{
if (!trig)
return -EINVAL;
struct iio_sw_trig *desc = trig;
return iio_process_trigger_type(desc->iio_desc, desc->name);
}
/**
* @brief Free the resources allocated by iio_sw_trig_init().
*
* @param trig - The trigger structure.
*
* @return ret - Result of the remove procedure.
*/
int iio_sw_trig_remove(struct iio_sw_trig *trig)
{
if (trig)
no_os_free(trig);
return 0;
}