You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

475 lines
12 KiB

/*
* Copyright (c) Hisilicon Technologies Co., Ltd. 2020-2021. All rights reserved.
* Description : Frontend mpi interface
* Author : Hisilicon
* Create : 2020/09/15
*/
#include "mpi_frontend_ext.h"
#include <sys/ioctl.h>
#include <pthread.h>
#include <fcntl.h>
#include <unistd.h>
#include "soc_log.h"
#include "td_type.h"
#include "soc_errno.h"
#include "iapi_frontend.h"
#include "mpi_frontend.h"
td_s32 g_tuner_fd = 0;
pthread_mutex_t g_tuner_mutex = PTHREAD_MUTEX_INITIALIZER;
#define ext_tuner_lock() (void)pthread_mutex_lock(&g_tuner_mutex);
#define ext_tuner_unlock() (void)pthread_mutex_unlock(&g_tuner_mutex);
td_s32 frontend_get_fd(td_void)
{
return g_tuner_fd;
}
td_s32 ext_mpi_frontend_init(td_void)
{
td_s32 tuner_fd = 0;
ext_tuner_lock();
tuner_fd = open("/dev/soc_frontend", O_RDWR, 0);
if (tuner_fd < 0) {
soc_log_err("open %s failed\n", "/dev/soc_frontend");
ext_tuner_unlock();
return SOC_ERR_FRONTEND_NOT_OPEN;
}
g_tuner_fd = tuner_fd;
ext_tuner_unlock();
return TD_SUCCESS;
}
td_s32 ext_mpi_frontend_deinit(td_void)
{
ext_tuner_lock();
close(g_tuner_fd);
ext_tuner_unlock();
g_tuner_fd = 0;
return TD_SUCCESS;
}
td_s32 ext_mpi_frontend_open(td_u32 port_id)
{
if (port_id >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(port_id) invalid.\n");
soc_err_print_u32(port_id);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
return TD_SUCCESS;
}
td_s32 ext_mpi_frontend_close(td_u32 port_id)
{
td_s32 ret;
fe_ioctrl_data tuner_data = {0};
if (port_id >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(port_id) invalid.\n");
soc_err_print_u32(port_id);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
tuner_data.port = port_id;
ret = ioctl(frontend_get_fd(), FRONTEND_CLOSE_CMD, &tuner_data);
if (ret != TD_SUCCESS) {
soc_log_err("Tuner FRONTEND_CLOSE_CMD error\n");
return ret;
}
return TD_SUCCESS;
}
td_s32 ext_mpi_frontend_set_attr(fe_ioctrl_attr fe_attr)
{
td_s32 ret;
if (fe_attr.port >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(fe_attr.port) invalid.\n");
soc_err_print_u32(fe_attr.port);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
ret = ioctl(g_tuner_fd, FRONTEND_SET_ATTR_CMD, &fe_attr);
if (ret != TD_SUCCESS) {
soc_log_err("TUNER_SET_ATTR_CMD error.\n");
return ret;
}
return TD_SUCCESS;
}
td_s32 ext_mpi_frontend_get_attr(fe_ioctrl_attr *fe_attr)
{
td_s32 ret;
if (fe_attr == TD_NULL) {
soc_log_err("Input parameter(fe_attr) is TD_NULL.\n");
return SOC_ERR_FRONTEND_INVALID_POINT;
}
if (fe_attr->port >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(fe_attr->port)invalid.\n");
soc_err_print_u32(fe_attr->port);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
ret = ioctl(g_tuner_fd, FRONTEND_GET_ATTR_CMD, fe_attr);
if (ret != TD_SUCCESS) {
soc_log_err("TUNER_GET_ATTR_CMD error.\n");
return ret;
}
return ret;
}
td_s32 ext_mpi_frontend_get_capability(fe_ioctrl_capability *capability)
{
td_s32 ret;
if (capability == TD_NULL) {
soc_log_err("Input parameter(capability) is TD_NULL.\n");
return SOC_ERR_FRONTEND_INVALID_POINT;
}
ret = ioctl(g_tuner_fd, FRONTEND_GET_CAPABILITY_CMD, capability);
if (ret != TD_SUCCESS) {
soc_log_err("FRONTEND_GET_CAPABILITY_CMD error,ret:%#x.\n", ret);
return ret;
}
return TD_SUCCESS;
}
td_s32 ext_mpi_frontend_connect(fe_ioctrl_signal *fe_connect_para)
{
td_s32 ret;
if (fe_connect_para == TD_NULL) {
soc_log_err("Input parameter(fe_connect_para) is TD_NULL.\n");
return SOC_ERR_FRONTEND_INVALID_POINT;
}
if (fe_connect_para->port >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(fe_connect_para->port) invalid.\n");
soc_err_print_u32(fe_connect_para->port);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
ret = ioctl(frontend_get_fd(), FRONTEND_CONNECT_CMD, fe_connect_para);
if (ret != TD_SUCCESS) {
soc_log_err("FRONTEND_CONNECT_CMD error.\n");
return ret;
}
return TD_SUCCESS;
}
td_s32 ext_mpi_frontend_disconnect(td_u32 port_id)
{
td_s32 ret;
if (port_id >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(port_id) invalid.\n");
soc_err_print_u32(port_id);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
ret = ioctl(frontend_get_fd(), FRONTEND_DISCONNECT_CMD, &port_id);
if (ret != TD_SUCCESS) {
soc_log_err("FRONTEND_DISCONNECT_CMD error.\n");
return ret;
}
return TD_SUCCESS;
}
td_s32 ext_mpi_frontend_get_status(fe_ioctrl_status *fe_status)
{
td_s32 ret;
if (fe_status == TD_NULL) {
soc_log_err("Input parameter(lock_status) is TD_NULL.\n");
return SOC_ERR_FRONTEND_INVALID_POINT;
}
if (fe_status->port >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(fe_status->port) invalid.\n");
soc_err_print_u32(fe_status->port);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
ret = ioctl(g_tuner_fd, FRONTEND_GET_STATUS_CMD, fe_status);
if (ret != TD_SUCCESS) {
soc_log_err("FRONTEND_GET_STATUS_CMD error.\n");
return ret;
}
return TD_SUCCESS;
}
td_s32 ext_mpi_frontend_get_ber(fe_ioctrl_ber_per *fe_ber)
{
td_s32 ret;
if (fe_ber == TD_NULL) {
soc_log_err("Input parameter(tmp_tuner_ber) is TD_NULL.\n");
return SOC_ERR_FRONTEND_INVALID_POINT;
}
if (fe_ber->port >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(tmp_tuner_ber->port) invalid.\n");
soc_err_print_u32(fe_ber->port);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
ret = ioctl(g_tuner_fd, FRONTEND_GET_BER_CMD, fe_ber);
if (ret == SOC_ERR_FRONTEND_CONNECT_FAIL) {
soc_log_warn("Signal not connect.\n");
return SOC_ERR_FRONTEND_CONNECT_FAIL;
} else if (ret != TD_SUCCESS) {
soc_log_err("FRONTEND_GET_BER_CMD error.\n");
return ret;
}
return TD_SUCCESS;
}
td_s32 ext_mpi_frontend_get_per(fe_ioctrl_ber_per *fe_per)
{
td_s32 ret;
if (fe_per == TD_NULL) {
soc_log_err("Input parameter(tmp_tuner_per) is TD_NULL.\n");
return SOC_ERR_FRONTEND_INVALID_POINT;
}
if (fe_per->port >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(fe_per->port) invalid.\n");
soc_err_print_u32(fe_per->port);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
ret = ioctl(g_tuner_fd, FRONTEND_GET_PER_CMD, fe_per);
if (ret == SOC_ERR_FRONTEND_CONNECT_FAIL) {
soc_log_warn("Signal not connect.\n");
return SOC_ERR_FRONTEND_CONNECT_FAIL;
} else if (ret != TD_SUCCESS) {
soc_log_err("FRONTEND_GET_PER_CMD error.\n");
return ret;
}
return TD_SUCCESS;
}
td_s32 ext_mpi_frontend_get_snr(fe_ioctrl_snr *fe_snr)
{
td_s32 ret;
if (fe_snr == TD_NULL) {
soc_log_err("Input parameter(fe_snr) is TD_NULL.\n");
return SOC_ERR_FRONTEND_INVALID_POINT;
}
if (fe_snr->port >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(fe_snr->port) invalid.\n");
soc_err_print_u32(fe_snr->port);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
ret = ioctl(g_tuner_fd, FRONTEND_GET_SNR_CMD, fe_snr);
if (ret == SOC_ERR_FRONTEND_CONNECT_FAIL) {
soc_log_warn("Signal not connect.\n");
return SOC_ERR_FRONTEND_CONNECT_FAIL;
} else if (ret != TD_SUCCESS) {
soc_log_err("FRONTEND_GET_SNR_CMD error.\n");
return ret;
}
return TD_SUCCESS;
}
td_s32 ext_mpi_frontend_get_signal_strength(fe_ioctrl_data_buf *fe_strength)
{
td_s32 ret;
if (fe_strength == TD_NULL) {
soc_log_err("Input parameter(signal_strength) is TD_NULL.\n");
return SOC_ERR_FRONTEND_INVALID_POINT;
}
if (fe_strength->port >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(fe_strength->port) invalid.\n");
soc_err_print_u32(fe_strength->port);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
ret = ioctl(g_tuner_fd, FRONTEND_GET_SIGNALSTRENGTH_CMD, fe_strength);
if (ret == SOC_ERR_FRONTEND_CONNECT_FAIL) {
soc_log_warn("Signal not connect.\n");
return SOC_ERR_FRONTEND_CONNECT_FAIL;
} else if (ret != TD_SUCCESS) {
soc_log_err("FRONTEND_GET_SIGNALSTRENGTH_CMD error.\n");
return ret;
}
return TD_SUCCESS;
}
td_s32 ext_mpi_frontend_get_signal_quality(fe_ioctrl_data *fe_quality)
{
td_s32 ret;
if (fe_quality == TD_NULL) {
soc_log_err("Input parameter(fe_quality) is TD_NULL.\n");
return SOC_ERR_FRONTEND_INVALID_POINT;
}
if (fe_quality->port >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(fe_quality->port) invalid.\n");
soc_err_print_u32(fe_quality->port);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
ret = ioctl(g_tuner_fd, FRONTEND_GET_SIGANLQUALITY_CMD, fe_quality);
if (ret == SOC_ERR_FRONTEND_CONNECT_FAIL) {
soc_log_warn("Signal not connect.\n");
return SOC_ERR_FRONTEND_CONNECT_FAIL;
} else if (ret == SOC_ERR_FRONTEND_INVALID_FUNCTION) {
soc_log_notice("not support.\n");
return SOC_ERR_FRONTEND_INVALID_FUNCTION;
} else if (ret != TD_SUCCESS) {
soc_log_err("FRONTEND_GET_SIGANLQUALITY_CMD error.\n");
return ret;
}
return TD_SUCCESS;
}
td_s32 ext_mpi_frontend_get_real_freq_symb(fe_ioctrl_data_buf *fe_freq_symb)
{
td_s32 ret;
if (fe_freq_symb == TD_NULL) {
soc_log_err("Input parameter(fe_freq_symb) is TD_NULL.\n");
return SOC_ERR_FRONTEND_INVALID_POINT;
}
if (fe_freq_symb->port >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(fe_freq_symb->port) invalid.\n");
soc_err_print_u32(fe_freq_symb->port);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
ret = ioctl(g_tuner_fd, FRONTEND_GET_FREQ_SYMB_OFFSET, fe_freq_symb);
if (ret != TD_SUCCESS) {
soc_log_err("FRONTEND_GET_FREQ_SYMB_OFFSET error.\n");
return ret;
}
return TD_SUCCESS;
}
/* Obtains current signal information of the TUNER, used in satellite and terrestrial, not necessary for cable */
td_s32 ext_mpi_frontend_get_signal_info(fe_ioctrl_signal_info *fe_signal_info)
{
td_s32 ret;
if (fe_signal_info == TD_NULL) {
soc_log_err("Input parameter(fe_signal_info) is TD_NULL.\n");
return SOC_ERR_FRONTEND_INVALID_POINT;
}
if (fe_signal_info->port >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(fe_signal_info->port) invalid.\n");
soc_err_print_u32(fe_signal_info->port);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
ret = ioctl(g_tuner_fd, FRONTEND_GET_SIGANLINFO_CMD, fe_signal_info);
if (ret != TD_SUCCESS) {
soc_log_err("FRONTEND_GET_SIGANLINFO_CMD error.\n");
return ret;
}
return TD_SUCCESS;
}
td_s32 ext_mpi_frontend_standby(td_u32 port_id)
{
td_s32 ret;
fe_ioctrl_standby fe_standby = {0};
if (port_id >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(port_id) invalid.\n");
soc_err_print_u32(port_id);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
fe_standby.port = port_id;
fe_standby.standby = 1;
ret = ioctl(g_tuner_fd, FRONTEND_STANDBY_CMD, &fe_standby);
if (ret != TD_SUCCESS) {
soc_log_err("Tuner standby fail.\n");
return ret;
}
return TD_SUCCESS;
}
td_s32 ext_mpi_frontend_wake_up(td_u32 port_id)
{
td_s32 ret;
fe_ioctrl_standby fe_standby = {0};
if (port_id >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(port_id) invalid.\n");
soc_err_print_u32(port_id);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
fe_standby.port = port_id;
fe_standby.standby = 0;
ret = ioctl(g_tuner_fd, FRONTEND_STANDBY_CMD, &fe_standby);
if (ret != TD_SUCCESS) {
soc_log_err("Tuner wake up fail.\n");
return ret;
}
return TD_SUCCESS;
}
td_s32 mpi_frontend_get_cfg(fe_ioctrl_config *fe_cfg)
{
td_s32 ret;
if (fe_cfg == TD_NULL) {
soc_log_err("Input parameter(fe_cfg) is TD_NULL.\n");
return SOC_ERR_FRONTEND_INVALID_POINT;
}
if (fe_cfg->port >= MPI_FRONTEND_NUM) {
soc_log_err("Input parameter(fe_cfg->port) invalid.\n");
soc_err_print_u32(fe_cfg->port);
return SOC_ERR_FRONTEND_INVALID_PARA;
}
ret = ioctl(g_tuner_fd, FRONTEND_GET_CONFIG_CMD, &fe_cfg);
if (ret != TD_SUCCESS) {
soc_log_err("frontend get config fail.\n");
return ret;
}
return TD_SUCCESS;
}