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.
术语
参考这里。