/*****************************************************************************
* file include/pd_dau.h
* author YuLiang
* version 1.0.0
* date 03-Feb-2023
* brief This file provides all the headers of the dau functions.
******************************************************************************
* Attention
*
*
© COPYRIGHT(c) 2021 LandPower
*
* 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 LandPower 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS "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 THE COPYRIGHT HOLDER OR CONTRIBUTORS 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 __PD_DAU_H__
#define __PD_DAU_H__
#ifdef CFG_DEV_TYPE_LAND_PD
/* Includes ------------------------------------------------------------------*/
#include "pd_main.h"
/* Define --------------------------------------------------------------------*/
#define DAU_ADJ_POINT_SUM 10
#define DAU_PKT_LEN 1536 // DAU 发包最大数据长度.
#define DAU_PKT_PRPS_LEN 640
#define DAU_PKT_PRPS_DATA_LEN 1280
#define DAU_REG_ADDR_GSCR 0x0000 // 全局寄存器 - 软件特征寄存器.
#define DAU_REG_ADDR_GSVR 0x0001 // 全局寄存器 - 软件版本寄存器.
#define DAU_REG_ADDR_GCR 0x0002 // 全局寄存器 - 控制寄存器.
#define DAU_REG_ADDR_GSR 0x0003 // 全局寄存器 - 状态寄存器.
#define DAU_REG_ADDR_GPFPCCR 0x0004 // 全局寄存器 - 工频周期时钟计数寄存器.
#define DAU_REG_ADDR_GPFPCR 0x0006 // 全局寄存器 - 工频周期计数寄存器.
#define DAU_REG_ADDR_GNSCR 0x0008 // 全局寄存器 - 纳秒级时钟计数寄存器.
#define DAU_REG_PORT_ADDR_MSRR 0x9000 // 端口状态寄存器 - 通道周波的原始采样值的均方根.
#define DAU_REG_PORT_ADDR_AVR 0x9008 // 端口状态寄存器 - 通道周波校准后的数值.
#define DAU_GSVR_SECONDARY_Pos (0)
#define DAU_GSVR_SECONDARY_Msk (0xFF << DAU_GSVR_SECONDARY_Pos) /*!< 0x00FF */
#define DAU_GSVR_PRIMARY_Pos (8)
#define DAU_GSVR_PRIMARY_Msk (0xFF << DAU_GSVR_PRIMARY_Pos) /*!< 0xFF00 */
#define DAU_GSR_SYNC_Pos (0)
#define DAU_GSR_SYNC_Msk (0x1 << DAU_GSR_SYNC_Pos) /*!< 0x0001 */
#define DAU_GSR_MODE_Pos (1)
#define DAU_GSR_MODE_Msk (0x1 << DAU_GSR_MODE_Pos) /*!< 0x0002 */
#define DAU_GCR_MODE_Pos (0)
#define DAU_GCR_MODE_Msk (0x3 << DAU_GCR_MODE_Pos) /*!< 0x0003 */
#define DAU_REG_PORT_BASE 0x1000 // 端口寄存器基地址.
#define DAU_REG_PORT_OFFSET 0x1000 // 每个端口寄存器偏移地址.
#define DAU_CR_SR_Pos (0)
#define DAU_CR_SR_Msk (0xFF << DAU_CR_SR_Pos) /*!< 0x00FF */
#define DAU_CR_PT_Pos (12)
#define DAU_CR_PT_Msk (0xF << DAU_CR_PT_Pos) /*!< 0xF000 */
#define DAU_FTR_FT_Pos (0)
#define DAU_FTR_FT_Msk (0xF << DAU_FTR_FT_Pos) /*!< 0x000F */
/* Exported types ------------------------------------------------------------*/
typedef void dau_prps_default_f(int16_t*);
typedef void dau_prps_process_f(uint8_t, uint8_t);
typedef void dau_trend_process_f(uint8_t, uint8_t, uint16_t);
/* 消息队列类型. */
typedef enum
{
DAU_SEND_TYPE_REG_RD = 1, // 读取寄存器.
DAU_SEND_TYPE_REG_WR, // 写入寄存器.
DAU_SEND_TYPE_UPDATE, // FPGA 升级.
DAU_SEND_TYPE_COUNT
} DAU_SEND_TYPE_E;
/* 共有命令字. */
typedef enum
{
DAU_PKT_CMD_RD = 0x01,
DAU_PKT_CMD_WR = 0x02,
DAU_PKT_CMD_SAV = 0x03,
DAU_PKT_CMD_UPD = 0x04,
DAU_PKT_CMD_PRPS = 0x81,
} DAU_PKT_CMD_E;
/* 共有命令字. */
typedef enum
{
DAU_UPD_PROCESS = 0,
DAU_UPD_OK = 1,
} DAU_UPD_ERR_E;
/* 和 DAU 通讯使用的报文结构体. */
typedef struct
{
uint8_t slave_id;
uint8_t func;
uint16_t addr;
uint16_t len;
uint16_t data[DAU_PKT_LEN];
} dau_pkt_t;
/* 和 DAU 通讯使用的报文结构体. */
typedef struct
{
uint32_t power_fre_cnt;
int16_t data[DAU_PKT_PRPS_LEN];
} dau_pkt_prps_t;
/* DAU 全局寄存器. */
typedef struct
{
uint16_t GSCR; // 全局软件特征寄存器 (Global Softwave Characteristic Register).
uint16_t GSVR; // 全局软件版本寄存器 (Global Softwave Version Register).
uint16_t GCR; // 全局控制寄存器 (Global Control Register).
uint16_t GSR; // 全局状态寄存器 (Global Status Register).
uint32_t GPFPCCR; // 全局工频周期时钟计数寄存器 (Global Power Frequency Period Clock Count Register).
uint32_t GPFPCR; // 全局工频周期计数寄存器 (Global Power Frequency Period Count Register).
uint32_t GNSCR; // 全局纳秒级时钟计数寄存器 (Global ns Count Register).
} dau_reg_t;
/* DAU 通道寄存器. */
typedef struct
{
uint16_t CR; // 控制寄存器 (Control Register).
uint16_t NR; // 底噪寄存器 (Noise Register).
uint16_t ASPR[DAU_ADJ_POINT_SUM]; // 校准分段点寄存器 (Adjust Segmentation Register).
uint16_t AFAR[DAU_ADJ_POINT_SUM]; // 校准系数 a 寄存器 (Adjust Factor A Register).
uint16_t AFBR[DAU_ADJ_POINT_SUM]; // 校准系数 b 寄存器 (Adjust Factor B Register).
uint16_t FTR; // 滤波类型寄存器 (Filtering type Register).
uint16_t WTDR; // 波形触发延时间隔寄存器 (Waveform Trigger Delay Register).
uint16_t WTTR; // 波形触发阈值寄存器 (Waveform Trigger Threshold Register).
uint16_t WTPSR; // 波形触发记录采样点寄存器 (Waveform Trigger Ponit Sum Register).
uint16_t WTBPR; // 波形触发前记录采样点寄存器 (Waveform Trigger Befor Ponit Register).
} dau_port_reg_t;
/* DAU 通道状态寄存器. */
typedef struct
{
uint16_t MSRR[PD_DAU_PORT_SUM]; // 通道周波的原始采样值的均方根 (Mean Square Root Register).
uint16_t AVR[PD_DAU_PORT_SUM]; // 通道周波校准后的数值 (Adjust Value Register).
} dau_port_state_reg_t;
/* DAU 通道寄存器. */
typedef struct
{
uint32_t prps_cnt; // prps 工频周期计数.
uint32_t prps_index; // prps 计数.
int16_t prps[PD_PRPS_NUM]; // 1s prps 原始数据.
int16_t noise_level[PD_POWER_FRE]; // prps 计算使用的每个工频周期的噪声等级.
uint8_t is_complete; // prps 数据是否完整.
} dau_port_state_t;
/* DAU 通道数据处理函数. */
typedef struct
{
dau_prps_default_f *data_default; // PRPS buffer 还原默认值.
dau_prps_process_f *denoise; // PRPS 自动 / 手动降噪.
dau_prps_process_f *denoise_r; // PRPS 关联降噪.
dau_prps_process_f *denoise_state; // PRPS 降噪数据统计.
dau_prps_process_f *denoise_real; // 实时数据自动 / 手动降噪.
dau_prps_process_f *denoise_real_r; // 实时数据关联降噪.
dau_prps_process_f *denoise_real_state; // PRPS 降噪数据统计.
dau_prps_process_f *event; // 事件计算.
dau_trend_process_f *trend; // 趋势数据.
} dau_port_func_t;
/* DAU 板卡全局结构 */
typedef struct{
uint8_t unit; // FPGA 板卡号.
uint8_t port_num; // FPGA 板卡端口数量.
uint16_t ip_port; // 端口号.
int32_t ip_addr; // IP 地址.
uint16_t msg_send_type; // 发包线程需要处理的消息队列类型.
uint16_t send_type; // 当前发送的数据类型 DAU_SEND_TYPE_XXX.
uint8_t is_valid; // 用于配置保存.
uint8_t is_connect; // 记录 DAU 是否通讯正常.
dau_port_state_t port_state[PD_DAU_PORT_SUM]; // 端口状态.
dau_port_func_t *port_func[PD_DAU_PORT_SUM]; // 端口数据处理函数.
pthread_mutex_t mutex; // 收发线程同步使用.
dau_reg_t reg; // DAU 全局寄存器软标.
dau_reg_t reg_dau; // DAU 全局寄存器硬表.
dau_port_reg_t port_reg[PD_DAU_PORT_SUM]; // 通道寄存器软表.
dau_port_reg_t port_reg_dau[PD_DAU_PORT_SUM]; // 通道寄存器硬表.
dau_port_state_reg_t port_state_reg; // 通道状态寄存器.
} dau_t;
/* DAU 全局结构 */
typedef struct{
int fd; // DAU 通讯使用的 socket.
int32_t recv_fifo_id; // 数据从接收线程发送到数据处理线程的 fifo.
uint32_t real_idx;
uint32_t trend_idx;
uint32_t event_index[PD_DAU_SUM][PD_DAU_PORT_SUM]; // 每个端口的事件索引.
uint32_t trend_event_index[PD_DAU_SUM][PD_DAU_PORT_SUM]; // 每个端口的趋势事件索引.
char recv_buf[DAU_PKT_LEN]; // DAU 收包 buffer.
int8_t is_update; // 是否开始升级.
int8_t update_ret; // 升级结果, 0 - 进行中, 1 - 成功, <0 - 失败.
uint16_t update_idx; // 升级报文索引.
uint32_t recv_cnt;
uint32_t recv_cnt_old;
uint32_t recv_err_cnt;
uint32_t recv_err_cnt_old;
uint32_t data_err_cnt;
uint32_t data_err_cnt_old;
uint32_t send_err_cnt;
uint32_t send_err_cnt_old;
} dau_ctrl_t;
/* DAU 发送报文数据. */
typedef struct _dau_send_msg_data_t
{
uint16_t send_type; // 发送的数据类型.
uint16_t send_len; // 发送的数据长度.
void *data; // 数据的内存地址.
} dau_send_msg_data_t;
/* DAU 消息队列要求的结构体样式. */
typedef struct _dau_send_msg_t
{
long type; // 消息类型, 用于收报文过滤.
dau_send_msg_data_t data; // 消息数据.
} dau_send_msg_t;
/* DAU 接收报文数据. */
typedef struct _dau_recv_msg_data_t
{
uint32_t ip_addr; // 收包数据的源 IP 地址.
uint32_t recv_len; // 收包数据长度.
void *data; // 数据的内存地址.
} dau_recv_msg_data_t;
/* DAU 消息队列要求的结构体样式. */
typedef struct _dau_recv_msg_t
{
long type; // 消息类型, 用于收报文过滤.
dau_recv_msg_data_t data; // 消息数据.
} dau_recv_msg_t;
/* Exported macro ------------------------------------------------------------*/
#define SET_BIT(REG, BIT) ((REG) |= (BIT))
#define CLEAR_BIT(REG, BIT) ((REG) &= ~(BIT))
#define READ_BIT(REG, BIT) ((REG) & (BIT))
#define WRITE_REG(REG, VAL) ((REG) = (VAL))
#define MODIFY_REG(REG, CLEARMASK, SETMASK) WRITE_REG((REG), (((REG) & (~(CLEARMASK))) | (SETMASK)))
#define DAU_REG_PORT_ADDR_GET(port) ((port + 1) << 12)
/* Extern global variables ---------------------------------------------------*/
extern dau_t *dau[PD_DAU_SUM];
extern dau_ctrl_t dau_ctrl;
/* Extern functions ----------------------------------------------------------*/
extern int32_t dau_port_to_vport(uint8_t unit, uint8_t port);
extern int32_t dau_vport_to_port(uint8_t vport, uint8_t *unit, uint8_t *port);
extern int32_t dau_port_config_set(uint8_t unit, uint8_t port);
extern int32_t dau_port_type_set(uint8_t unit, uint8_t port, uint8_t type);
extern int32_t dau_handle_init(void);
extern uint8_t dau_power_frequency_state_get(void);
extern float dau_power_frequency_get(void);
extern uint8_t dau_connect_get(void);
extern void* dau_port_state_get(void *arg);
extern int32_t dau_reg_global_write(uint8_t unit);
extern int32_t dau_reg_port_write(uint8_t unit, uint8_t port);
extern int32_t dau_param_save(uint8_t unit);
extern void dau_shutdown(void);
extern int32_t dau_start(void);
extern int32_t dau_update(void);
extern void dau_show(uint8_t unit);
extern void dau_show_adj(uint8_t unit);
extern void dau_show_reg(uint8_t unit);
extern void dau_show_reg_port(uint8_t unit, uint8_t port);
#endif
#endif
/************************ (C) COPYRIGHT LandPower ***** END OF FILE ****/