Skip to content

Commit 082090e

Browse files
committed
SNR support
Signal/Noise ratio is one of the important metrics of the transmission. It can be used to estimate the received signal quality along with RSSI.
1 parent d8af8c5 commit 082090e

2 files changed

Lines changed: 62 additions & 2 deletions

File tree

src/FrameParser.cpp

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,61 @@
88
#include "rtl8812a_recv.h"
99
#include <vector>
1010

11+
struct _phy_status_rpt_8812 {
12+
/* DWORD 0*/
13+
u8 gain_trsw[2]; /*path-A and path-B {TRSW, gain[6:0] }*/
14+
u8 chl_num_LSB; /*channel number[7:0]*/
15+
u8 chl_num_MSB : 2; /*channel number[9:8]*/
16+
u8 sub_chnl : 4; /*sub-channel location[3:0]*/
17+
u8 r_RFMOD : 2; /*RF mode[1:0]*/
18+
19+
/* DWORD 1*/
20+
u8 pwdb_all; /*CCK signal quality / OFDM pwdb all*/
21+
s8 cfosho[2]; /*DW1 byte 1 DW1 byte2 CCK AGC report and CCK_BB_Power /
22+
OFDM path-A and path-B short CFO*/
23+
/*this should be checked again because the definition of 8812 and 8814
24+
* is different*/
25+
/* u8 r_cck_rx_enable_pathc:2; cck rx enable pathc[1:0]*/
26+
/* u8 cck_rx_path:4; cck rx path[3:0]*/
27+
u8 resvd_0 : 6;
28+
u8 bt_RF_ch_MSB : 2; /*8812A:2'b0 8814A: bt rf channel keep[7:6]*/
29+
u8 ant_div_sw_a : 1; /*8812A: ant_div_sw_a 8814A: 1'b0*/
30+
u8 ant_div_sw_b : 1; /*8812A: ant_div_sw_b 8814A: 1'b0*/
31+
u8 bt_RF_ch_LSB : 6; /*8812A: 6'b0 8814A: bt rf
32+
channel keep[5:0]*/
33+
s8 cfotail[2]; /*DW2 byte 1 DW2 byte 2 path-A and path-B CFO tail*/
34+
u8 PCTS_MSK_RPT_0; /*PCTS mask report[7:0]*/
35+
u8 PCTS_MSK_RPT_1; /*PCTS mask report[15:8]*/
36+
37+
/* DWORD 3*/
38+
s8 rxevm[2]; /*DW3 byte 1 DW3 byte 2 stream 1 and stream 2 RX EVM*/
39+
s8 rxsnr[2]; /*DW3 byte 3 DW4 byte 0 path-A and path-B RX SNR*/
40+
41+
/* DWORD 4*/
42+
u8 PCTS_MSK_RPT_2; /*PCTS mask report[23:16]*/
43+
u8 PCTS_MSK_RPT_3 : 6; /*PCTS mask report[29:24]*/
44+
u8 pcts_rpt_valid : 1; /*pcts_rpt_valid*/
45+
u8 resvd_1 : 1; /*1'b0*/
46+
s8 rxevm_cd[2]; /*DW 4 byte 3 DW5 byte 0 8812A: 16'b0 8814A: stream 3
47+
and stream 4 RX EVM*/
48+
49+
/* DWORD 5*/
50+
u8 csi_current[2]; /*DW5 byte 1 DW5 byte 2 8812A: stream 1 and 2 CSI
51+
8814A: path-C and path-D RX SNR*/
52+
u8 gain_trsw_cd[2]; /*DW5 byte 3 DW6 byte 0 path-C and path-D {TRSW,
53+
gain[6:0] }*/
54+
55+
/* DWORD 6*/
56+
s8 sigevm; /*signal field EVM*/
57+
u8 antidx_antc : 3; /*8812A: 3'b0 8814A: antidx_antc[2:0]*/
58+
u8 antidx_antd : 3; /*8812A: 3'b0 8814A: antidx_antd[2:0]*/
59+
u8 dpdt_ctrl_keep : 1; /*8812A: 1'b0 8814A: dpdt_ctrl_keep*/
60+
u8 GNT_BT_keep : 1; /*8812A: 1'b0 8814A: GNT_BT_keep*/
61+
u8 antidx_anta : 3; /*antidx_anta[2:0]*/
62+
u8 antidx_antb : 3; /*antidx_antb[2:0]*/
63+
u8 hw_antsw_occur : 2; /*1'b0*/
64+
};
65+
1166
FrameParser::FrameParser(Logger_t logger) : _logger{logger} {}
1267

1368
static rx_pkt_attrib rtl8812_query_rx_desc_status(uint8_t *pdesc) {
@@ -119,8 +174,12 @@ std::vector<Packet> FrameParser::recvbuf2recvframe(std::span<uint8_t> ptr) {
119174
pattrib.drvinfo_sz + RXDESC_SIZE,
120175
pattrib.pkt_len)});
121176

122-
ret.back().RxAtrib.rssi[0] = pbuf[RXDESC_SIZE];
123-
ret.back().RxAtrib.rssi[1] = pbuf[RXDESC_SIZE + 1];
177+
struct _phy_status_rpt_8812 driver_data;
178+
memcpy(&driver_data, pbuf.data() + RXDESC_SIZE, sizeof(driver_data));
179+
ret.back().RxAtrib.rssi[0] = driver_data.gain_trsw[0];
180+
ret.back().RxAtrib.rssi[1] = driver_data.gain_trsw[1];
181+
ret.back().RxAtrib.snr[0] = driver_data.rxsnr[0];
182+
ret.back().RxAtrib.snr[1] = driver_data.rxsnr[1];
124183
} else {
125184
/* pkt_rpt_type == TX_REPORT1-CCX, TX_REPORT2-TX RTP,HIS_REPORT-USB HISR
126185
* RTP */

src/FrameParser.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ struct rx_pkt_attrib
291291
uint8_t ldpc;
292292
uint8_t sgi;
293293
uint8_t rssi[2];
294+
int8_t snr[2];
294295
RX_PACKET_TYPE pkt_rpt_type;
295296
};
296297

0 commit comments

Comments
 (0)