ARM External interface / 外部接口概述

oogami@panda, 2023-01

概述

主控(ARM)与FPGA之间通过JESD207接口通信。ARM 程序的所有外部通信(接收、发送)均通过 FPGA。ARM 与 FPGA 之间存在预先定义好的接口(.h)和所提供的 .a 静态库。
// FPGA -> ARM typedef void (*FNCT_U8P_U32 )(unsigned char *u8p_src,int len); // chnID = 4, ch_name = "/dev/dpb_x1643_phych0", tag = 3 int init_chnl( int chnID,char *ch_name,FNCT_U8P_U32 callbackfunc, int tag ); // ARM -> FPGA int write_data_to_chnl(int chnID,char* buf,int len); typedef struct ST_JESD_H { INT32U msgID:8; // 消息ID,带优先级, ID越小,优先级越高 INT32U dstUsrID:4; // dst/src 0:aisc 7:rf board 8:io bc 9:dsp 10:HSSI E0 11:ARM 207_2 12:NET 13:SIM 15:io board 2021/8/4 9:15:10 INT32U ctlFractStop:1; // 分片模式的尾帧标志。非分片模式 为 0。 INT32U ctlFractStrt:1; // 分片模式的首帧标志。非分片模式 为 0。 INT32U ctlFractMode:1; // 帧模式 1:分片模式, 0:流模式 INT32U reserved:1; // 保留 0 INT32U sigLen:16; // 帧 payload 部分长度,不含帧头,单位为字节 }ST_JESD_H; typedef struct { ST_JESD_H h; union { // ... struct { uint8 channel ; uint8 asio_dat[RBDP_MAX_DATA_LEN-1] ; }DN_UP_ASIO; // ... };//end of union }AUD3_ST_JESD;
  • ARM 收到(receive)的所有外部信息均通过 FPGA 的 init_chnl 接口获取。init_chnl 会启动单独线程(pthread)并在获取到新的消息时调用用户提供的 callbackfunc 回调。
  • ARM 向外部发送所有消息同样通过 FPGA 的 write_data_to_chnl 接口。
  • ARM ↔ FPGA 之间传输数据格式(”207 消息”)使用 AUD3_ST_JESD 结构体(struct)的内存字节流。消息类型通过 HEADER (ST_JESD_H) 里的 msgID 区分。不同消息类型映射(cast)对应消息体(payload)的不同 union 数据类型。消息体(payload)里的有效数据长度通过 HEADER 里的 sigLen 传递。某些类型消息 payload 里的数据缓冲区字节流还存在单独的结构体类型。例如:
    • msgID 0xF0 (AUD3_MSG_UP_ASIO, AUD3_MSG_DN_ASIO)。FPGA ⇒ ARM / ARM ⇒ FPGA。与外部设备的异步串口IO之间接收 / 发送消息。对应 207 消息主体的 DN_UP_ASIO 类型 payload。数据内容存放在 asio_dat 缓冲区里。 外设接口IPC。0-31 对应实际存在的物理串口。≥32 的串口号为后续扩展的虚拟串口(429/203/422//1553/…)。
      • 消息来源 / 目标的外部设备类型通过 channel 传递:
        • 26 (COM27) : rtc 时钟芯片
        • 4 (COM3)、29 (COM30)、30 (COM31): 保密机(bmj)串口
        • 7 (COM8): FPP
        • 31 (COM32): 天调(天线调节:发起旁路、调谐,查询结果)
        • 功放
        • 33 : 外部接口(429总线)。
        • 34: 外部接口(1553总线)(预留)。
    • msgID 0x40 (AUD3_MSG_DN_RCV_FIXF)。ARM ⇒ FPGA。设置电台定频模式下的工作参数(接收频率、调制模式等)。对应 207 消息主体的 DN_RCV_FIXF payload 类型:
      • typedef struct { // 8 bytes uint32 channel :14 ; uint32 channel_mode :2 ; // 通道模式,为0时,支持通道号0~39,为1时,支持通道号0~319,2/3保留 uint32 reserved :8 ; uint32 ssb_mode :4 ; // 1/2/4/7分别对应边带调制模式USB/LSB/CW/AM uint32 ssb_bw :4 ; // 0/1/2/3/4/5/6分别对应边带调制带宽BW_0K1/BW_1K2/BW_2K7/BW_3K0/BW_6K0/BW_12K/BW_24K uint32 freqInHz ; // 十进制,以Hz为单位的收频率 }SET_RCV_FIXF; struct{ SET_RCV_FIXF set_rcv[40]; }DN_RCV_FIXF; // 虽然payload里定义了40个。但代码中实际调用该接口时,每次只传入1个频段的定频信息。目前不清楚接口实际上是否支持一次性传入多个定频信息: typedef struct { ST_JESD_H h; SET_RCV_FIXF set_rcv; } ST_CHXX_RCV_CTRL; ST_CHXX_RCV_CTRL stChxxRcvCtrl; //xx通道接收控制 AppNetAud3_SubSendPack( AUD3_MSG_DN_RCV_FIXF, sizeof(SET_RCV_FIXF), (AUD3_ST_JESD *) &stChxxRcvCtrl);

FPGA(207) 通信接口

msgID 越小,对应消息的传输优先级越高(FPGA处理)。
UP: ASIC 芯片 ⇒ ARM。DOWN 则相反。中间的传输通过 FPGA 处理和中转。
发送音频(ASIC ⇒ ARM ⇒ ASIC):0x22 ⇒ 0x31 (音频经过 ARM 中转处理:降噪压缩等)
接受音频(ASIC ⇒ ARM ⇒ ASIC):0x21 ⇒ 0x38 (ARM 将音频发送到指定位置,如扬声器)
msgID
通信方向
payload
说明
备注
0xF0 (AUD3_MSG_UP_ASIO, AUD3_MSG_DN_ASIO)
DOWN (ARM ⇒ FPGA) UP (FPGA⇒ARM)
DN_UP_ASIO
外部设备串行数据通信
根据 channel 区分: - 26 (COM27) : rtc 时钟芯片 - 4 (COM3)、29 (COM30)、30 (COM31): 保密机(bmj)串口 - 7 (COM8): FPP // 外部用户界面/协议接口 - 31 (COM32): 天调 - 33 : 外部接口(429总线)。
0x30 (AUD3_MSG_DN_XMT_CTL)
DOWN
DN_XMT_CTL
发射机(功放硬件)控制/配置
其它同样功能msg: AUD3_MSG_DN_XMT_AUD AUD3_MSG_DN_XMT_SYM AUD3_MSG_DN_XMT_ALC_CTL
0x40 (AUD3_MSG_DN_RCV_FIXF)
DOWN
DN_RCV_FIXF
电台定频模式工作参数设置
0xA0 (AUD3_MSG_DN_ARG, AUD3_MSG_UP_ARG)
DOWN UP
DN_UP_ARG
DOWN: 设置电台本机地址(host)等参数。
尚不确定
0x38 (AUD3_MSG_DN_AIC_32K)
DOWN
DN_AIC_32K
(向FPGA)发送语音数据
尚不确定
0x22 (AUD3_MSG_UP_AIC_32K)
UP
UP_AIC_32K
接收(FPGA上报)语音数据
尚不确定。结构体里还定义了 UP_RCV_4K8, UP_RCV_32K 等几种音频 payload 方式。 4K/8K/32K: 采样率。一般使用 32K。
0x69 (AUD3_MSG_UP_TURN)
UP
DN_TURN
电台状态、模式切换等消息主动上报
struct { uint8 msgID; uint8 dstHostID;// 目的HostID uint16 sigLen; uint8 data[RBDP_MAX_DATA_LEN-4]; }DN_TURN;

外部接口

外部接口可能包括:
  • 429 总线。
  • 网络(udp)。对端 IP 地址、端口、本机端口等信息由ARM程序配置文件控制。
  • 1553 总线。
网络(udp)类型外部接口由ARM程序之间通过系统网络协议栈(socket)通信。其它总线类型的外部接口由 ARM 程序通过 FPGA 接口 0xF0 (AUD3_MSG_DN_ASIO) msgID / 33 channel 获取。ARM从外部接口接收到信息后,调用内部外部消息解析接口,从收到的数据字节流中解析出完整的 外部消息 (external msg),然后根据不同类型的消息,调用相应类型的内部消息处理函数(handle)并执行以下一种或多种操作:
  • 通过相应的 207 通信接口和 msgID 将处理后的消息转发给 FPGA。
  • 将收到的外部消息里内容持久化保存到本地 flash存储文件系统。
  • 更新 ARM 程序内部的内存状态。
  • 将回复(reply)的消息通过内部的外部消息序列化接口生成字节流数据,然后通过 FPGA 0xF0 (AUD3_MSG_UP_ASIO) / 33 channel 接口或网络发送给外部接口。
// 429 -> ARM ssize_t b429_readmsg(char* buf, size_t len, struct b429_msg** msg); // ARM -> 429 ssize_t b429_serialize(char** buf, struct b429_msg* msg);
特定电台上只会使用1种类型的外部接口。系统初始化开机自检时,可以通过所有可用的外部接口主动上报初始化和自检信息。当从某个外部接口收到过消息之后,只通过该类型外部接口通信。

外部接口接收信息处理

外部接口消息类型
说明
ARM 操作
调用 207 接口发送消息
回复外部接口消息
ARM处理函数
0xF1
握手
0xD1
handle_f1
0xF2
触发自检
执行自检-结果上报
自检结果通过 0xD2 分阶段上报
handle_f2
0xF3
本地地址加载
保存当前本地地址
0xA0 设置设置电台本机地址(host)等参数
0xD3 本地地址上报
handle_f3
0xE3
本地地址查询
读取之前保存的本地地址
尚不明确
0xD3 本地地址上报
handle_e3
0xF4
信道频率加载
保存所有收到的信息为临时文件
-
对所有收到的0xF4,依次返回对应的 0xD4 信道频率上报消息
handle_f4
0xF5
波道参数加载(获得256个频率的频率集)
保存所有收到的信息为临时文件
-
对所有收到的0xF5,依次返回对应的 0xD5 波道频率上报消息
handle_f5
0xE5
波道参数查询
根据指令参数信息,读取保存的当前、指定或所有波道信息。
-
0xD5
handle_e5
0xF0
波道频率集加载
保存所有收到的信息为临时文件
-
对所有0xF0, 依次回复0xD0 波道频率集上报
handle_f0
0xF6
加载控制
持久化保存之前收到的 0xF4, 0xF5, 0xF0 指令的信息
0xD6 分阶段加载上报数据持久化保存状态和结果
handle_f6
0xF7
时间日期设置
设置系统时间和日期;与选频模块交互传输信息
0xD7 时间日期上报
handle_f7
0xF8
经纬度设置
保存收到的数据到内存;与选频模块交互传输信息
无回复
handle_f8
0xF9
降噪设置
通过相应207接口设置
0xD9 降噪上报
handle_f9
0xFA
软件版本查询
读取ARM软件版本
0xDA软件版本上报
handle_fa
0xFB
静默设置
更新内存状态
0xDB静默上报
handle_fb
0xFC
工作参数设置
更新内存状态。根据其中部分参数从之前获取的频率集中获取。
调用 0x40 等 FPGA 接口设置电台工作模式和参数。
0xDC工作状态上报
handle_fc
自定义 0xAA
惯导信息(年月日、经度纬度)
更新内存状态
handle_aa

FPGA 接收消息处理

msgID
消息类型
说明
ARM操作
调用207接口发送
发送至外部接口
0x69
电台状态
语音短信提示状态
0xDD 语音短信提示状态上报
0x69
电台状态
收发状态
0xDE收发状态上报
工作状态上报
被动拆链等各种电台工作状态自身发生改变时,主动上报最新的工作状态
0xDC工作状态上报

ARM 程序主动上报信息

事件
触发时机
说明
ARM操作
调用207接口发送
发送至外部接口
自检信息上报
开机 定期(5s)
0xD2 自检结果上报

主控-业务接口

  • 主控 ⇒ 业务:命令函数
  • 业务 ⇒ 主控:System V message queue (msgctl/msgget/msgsnd/msgrcv) 上报信息。

ARM 内部逻辑

event loop + state managements.
  • message queue: System V do not support SELECT/POLL/EPOLL。Only has blocking read. So we must use pthread and eventfd.

术语

参考这里