source: ReferenceDesigns/w3_802.11/c/wlan_w3_low/w3_phy_util.c

Last change on this file was 6319, checked in by chunter, 5 years ago

1.8.0 release wlan-mac-se

File size: 12.3 KB
Line 
1/** @file wlan_phy_util.c
2 *  @brief Physical Layer Utility
3 *
4 *  This contains code for configuring low-level parameters in the PHY and hardware.
5 *
6 *  @copyright Copyright 2013-2019, Mango Communications. All rights reserved.
7 *          Distributed under the Mango Communications Reference Design License
8 *              See LICENSE.txt included in the design archive or
9 *              at http://mangocomm.com/802.11/license
10 *
11 *  This file is part of the Mango 802.11 Reference Design (https://mangocomm.com/802.11)
12 */
13/***************************** Include Files *********************************/
14
15// Xilinx SDK includes
16#include "xio.h"
17#include "xparameters.h"
18
19// WLAN includes
20#include "wlan_platform_low.h"
21#include "wlan_platform_common.h"
22#include "wlan_mac_mailbox_util.h"
23#include "wlan_phy_util.h"
24#include "wlan_mac_low.h"
25#include "wlan_mac_common.h"
26#include "w3_low.h"
27#include "w3_mac_phy_regs.h"
28#include "wlan_common_types.h"
29#include "w3_phy_util.h"
30#include "wlan_mac_pkt_buf_util.h"
31
32
33/*****************************************************************************/
34/**
35 * Initialize the PHY
36 *
37 * @param   None
38 *
39 * @return  None
40 *
41 *****************************************************************************/
42void wlan_phy_init() {
43
44    // Assert Tx and Rx resets
45    REG_SET_BITS(WLAN_RX_REG_CTRL, WLAN_RX_REG_CTRL_RESET);
46    REG_SET_BITS(WLAN_TX_REG_CFG, WLAN_TX_REG_CFG_RESET);
47
48    /************ PHY Rx ************/
49
50    // Set the max Tx/Rx packet sizes to 2KB (sane default for standard 802.11a/g links)
51    wlan_phy_rx_set_max_pkt_len_kB( MAX_PKT_SIZE_KB );
52    wlan_phy_rx_set_max_pktbuf_addr( PKT_BUF_SIZE - sizeof(rx_frame_info_t) - PHY_RX_PKT_BUF_PHY_HDR_SIZE );
53
54    // WLAN_RX_DSSS_CFG reg
55    // Configure the DSSS Rx pipeline
56    //  wlan_phy_DSSS_rx_config(sync_score_thresh, sync_timeout, sfd_timeout, search_time)
57    wlan_phy_DSSS_rx_config(48, 45, 52, 39);
58
59    // WLAN_RX_PKT_DET_DSSS_CFG reg
60    // Configure the DSSS auto-correlation packet detector
61    //  wlan_phy_pktDet_autoCorr_dsss_cfg(corr_thresh, energy_thresh)
62    //
63    // Note: the below parameters will configure the packet detector such that
64    // around 50% of short DSSS frames are successfully decoded at -82dBm. The
65    // DSSS receiver can be made more sensitive by lowering the energy requirement
66    // argument or clearing the WLAN_RX_REG_CFG_DSSS_RX_REQ_PKT_DET bit.
67    wlan_phy_rx_pktDet_autoCorr_dsss_cfg(110, 60);
68
69    // WLAN_RX_PKT_DET_OFDM_CFG reg
70    // args: (corr_thresh, energy_thresh, min_dur, post_wait)
71    // Using defaults from set_phy_samp_rate(20)
72    wlan_phy_rx_pktDet_autoCorr_ofdm_cfg(100, 15, 4, 0x3F);
73
74    // WLAN_RX_REG_CFG reg
75    // Configure DSSS Rx to not wait for DSSS pkt det
76    REG_CLEAR_BITS(WLAN_RX_REG_CFG, (WLAN_RX_REG_CFG_DSSS_RX_REQ_PKT_DET));
77
78    // Configure OFDM Rx to wait for pkt det before starting Rx
79    REG_CLEAR_BITS(WLAN_RX_REG_CFG, WLAN_RX_REG_CFG_OFDM_RX_REQ_PKT_DET);
80
81    // Enable the OFDM Rx pipeline
82    REG_CLEAR_BITS(WLAN_RX_REG_CFG, WLAN_RX_REG_CFG_DISABLE_OFDM_RX);
83
84    // Enable LTS-based CFO correction
85    REG_CLEAR_BITS(WLAN_RX_REG_CFG, WLAN_RX_REG_CFG_CFO_EST_BYPASS);
86
87    // Enable byte order swap for payloads and chan ests
88    REG_SET_BITS(WLAN_RX_REG_CFG, WLAN_RX_REG_CFG_PKT_BUF_WEN_SWAP);
89    REG_CLEAR_BITS(WLAN_RX_REG_CFG, WLAN_RX_REG_CFG_CHAN_EST_WEN_SWAP);
90
91    // Enable writing OFDM chan ests to Rx pkt buffer
92    REG_SET_BITS(WLAN_RX_REG_CFG, WLAN_RX_REG_CFG_RECORD_CHAN_EST);
93
94    // The rate/length BUSY logic should hold the pkt det signal high to avoid
95    //  spurious AGC and detection events during an unsupported waveform
96    REG_SET_BITS(WLAN_RX_REG_CFG, WLAN_RX_REG_CFG_BUSY_HOLD_PKT_DET);
97
98    // Block Rx inputs during Tx
99    REG_SET_BITS(WLAN_RX_REG_CFG, WLAN_RX_REG_CFG_USE_TX_SIG_BLOCK);
100
101    // Enable HTMF waveform (11n waveform) detection in the PHY Rx
102    //  Disabling HTMF detection reverts the PHY to <v1.3 behavior where
103    //  every reception is handled as NONHT (11a)
104    REG_SET_BITS(WLAN_RX_REG_CFG, WLAN_RX_REG_CFG_ENABLE_HTMF_DET);
105
106    // Enable VHT waveform detection - the PHY can't decode VHT waveforms
107    //  but enabling detection allows early termination with a header error
108    //  instead of attempting to decode the VHT waveform as NONHT
109    REG_SET_BITS(WLAN_RX_REG_CFG, WLAN_RX_REG_CFG_ENABLE_VHT_DET);
110
111    // Keep CCA.BUSY asserted when DSSS Rx is active
112    REG_SET_BITS(WLAN_RX_REG_CFG, WLAN_RX_REG_CFG_DSSS_ASSERTS_CCA);
113
114    // WLAN_RX_FFT_CFG reg
115    // FFT config
116    wlan_phy_rx_config_fft(64, 16);
117    wlan_phy_rx_set_fft_window_offset(7);
118    wlan_phy_rx_set_fft_scaling(5);
119
120    // WLAN_RX_LTS_CFG reg
121    // Set LTS correlation threshold, timeout and allowed peak separation times
122    //     1023 disables LTS threshold switch (one threshold worked across SNRs in our testing)
123    //     Timeout value is doubled in hardware (350/2 becomes a timeout of 350 sample periods)
124    //     Peak separation is 3-bit mask, allowing 63/64/65 sample periods between peaks
125    wlan_phy_rx_lts_corr_config(1023 * PHY_RX_RSSI_SUM_LEN, 350/2, 0x7);
126
127    // WLAN_RX_LTS_THRESH reg
128    // LTS correlation thresholds (low NSR, high SNR)
129    wlan_phy_rx_lts_corr_thresholds(9000, 9000);
130
131    // WLAN_RX_LTS_PEAKTYPE_THRESH reg
132    // LTS correlation peak-type (big vs small) thresholds (low NSR, high SNR)
133    // TODO: We can explore the peaktype dimension further in a future release
134    wlan_phy_rx_lts_corr_peaktype_thresholds(5000, 5000); //0xFFFF arguments to disable
135
136    // WLAN_RX_PKT_DET_OFDM_CFG reg
137    // Configure RSSI pkt det
138    //     RSSI pkt det disabled by default (auto-corr detection worked across SNRs in our testing)
139    //     The summing logic realizes a sum of the length specified + 1
140    wlan_phy_rx_pktDet_RSSI_cfg( (PHY_RX_RSSI_SUM_LEN-1), ( PHY_RX_RSSI_SUM_LEN * 1023), 1);
141
142    // WLAN_RX_PHY_CCA_CFG reg
143    // Set physical carrier sensing threshold
144    // CS thresh set by wlan_platform_set_phy_cs_thresh() - register field set to 0xFFFF here to disable
145    //  PHY CS assert until MAC code configures the desired threshold
146    wlan_phy_rx_set_cca_thresh(0xFFFF);
147    wlan_phy_rx_set_extension((6*20) - 64); // Overridden later by set_phy_samp_rate()
148
149    // WLAN_RX_FEC_CFG reg
150    // Set pre-quantizer scaling for decoder inputs
151    //  These values were found empirically by vs PER by sweeping scaling and attenuation
152    wlan_phy_rx_set_fec_scaling(15, 15, 18, 22);
153
154    // WLAN_RX_PKT_BUF_SEL reg
155    // Configure channel estimate capture (64 subcarriers, 4 bytes each)
156    //     Chan ests start at sizeof(rx_frame_info) - sizeof(chan_est)
157    wlan_phy_rx_pkt_buf_h_est_offset((PHY_RX_PKT_BUF_PHY_HDR_OFFSET - (64*4)));
158
159    // WLAN_RX_CHAN_EST_SMOOTHING reg
160    //Disable channel estimate smoothing
161    wlan_phy_rx_chan_est_smoothing(0xFFF, 0x0);
162    wlan_phy_rx_phy_mode_det_thresh(12);
163
164    // WLAN_RX_PKT_BUF_MAXADDR reg
165    wlan_phy_rx_set_max_pktbuf_addr(3800);
166
167    // Configure the default antenna selections as SISO Tx/Rx on RF A
168    wlan_rx_config_ant_mode(RX_ANTMODE_SISO_ANTA);
169
170    /************ PHY Tx ************/
171
172    // De-assert all starts
173    REG_CLEAR_BITS(WLAN_TX_REG_START, 0xFFFFFFFF);
174
175    // TX_OUTPUT_SCALING register
176    // Set digital scaling of preamble/payload signals before DACs (UFix12_0)
177    wlan_phy_tx_set_scaling(0x2000, 0x2000); // Scaling of 2.0
178
179    // TX_CONFIG register
180    // Enable the Tx PHY 4-bit TxEn port that captures the MAC's selection of active antennas per Tx
181    REG_SET_BITS(WLAN_TX_REG_CFG, WLAN_TX_REG_CFG_USE_MAC_ANT_MASKS);
182
183    // TX_FFT_CONFIG register
184    // Configure the IFFT scaling and control logic
185    //  Current PHY design requires 64 subcarriers, 16-sample cyclic prefix
186    wlan_phy_tx_config_fft(0x2A, 64, 16);
187
188    // TX_TIMING register
189    //  Timing values overridden later in set_phy_samp_rate()
190    wlan_phy_tx_set_extension(112);
191    wlan_phy_tx_set_txen_extension(50);
192    wlan_phy_tx_set_rx_invalid_extension(150);
193
194    // TX_PKT_BUF_SEL register
195    wlan_phy_tx_pkt_buf_phy_hdr_offset(PHY_TX_PKT_BUF_PHY_HDR_OFFSET);
196    wlan_phy_tx_pkt_buf(0);
197
198
199    /************ Wrap Up ************/
200
201
202    // De-assert resets
203    REG_CLEAR_BITS(WLAN_RX_REG_CTRL, WLAN_RX_REG_CTRL_RESET);
204    REG_CLEAR_BITS(WLAN_TX_REG_CFG, WLAN_TX_REG_CFG_RESET);
205
206    // Let PHY Tx take control of radio TXEN/RXEN
207    REG_CLEAR_BITS(WLAN_TX_REG_CFG, WLAN_TX_REG_CFG_SET_RC_RXEN);
208    REG_SET_BITS(WLAN_TX_REG_CFG, WLAN_TX_REG_CFG_SET_RC_RXEN);
209
210    return;
211}
212
213/*****************************************************************************/
214/**
215 * Configure the Rx Antenna Mode
216 *
217 * @param   ant_mode         - Antenna mode to set
218 *
219 * @return  None
220 *
221 * @note    There is no corresponding wlan_tx_config_ant_mode() because the transmit
222 *     antenna is set by the MAC software (ie mac_sw -> mac_hw -> phy_tx) for every packet
223 *
224 *****************************************************************************/
225void wlan_rx_config_ant_mode(u32 ant_mode) {
226
227    // Hold the Rx PHY in reset before changing any pkt det or radio enables
228    REG_SET_BITS(WLAN_RX_REG_CTRL, WLAN_RX_REG_CTRL_RESET);
229
230    wlan_platform_low_set_rx_ant_mode(ant_mode);
231
232    // Disable all Rx modes first; selectively re-enabled in switch below
233    REG_CLEAR_BITS(WLAN_RX_REG_CFG, (WLAN_RX_REG_CFG_PKT_DET_EN_ANT_A |
234                                     WLAN_RX_REG_CFG_PKT_DET_EN_ANT_B |
235                                     WLAN_RX_REG_CFG_PKT_DET_EN_ANT_C |
236                                     WLAN_RX_REG_CFG_PKT_DET_EN_ANT_D |
237                                     WLAN_RX_REG_CFG_SWITCHING_DIV_EN |
238                                     WLAN_RX_REG_CFG_PKT_DET_EN_EXT |
239                                     WLAN_RX_REG_CFG_ANT_SEL_MASK));
240
241    // Set the antenna mode
242    //
243    // For each antenna mode:
244    //   - Enable packet detection
245    //   - Select I/Q stream for Rx PHY
246    //   - Give PHY control of Tx/Rx status
247    //   - Configure AGC
248    //
249    switch (ant_mode) {
250        case RX_ANTMODE_SISO_ANTA:
251            REG_SET_BITS(WLAN_RX_REG_CFG, WLAN_RX_REG_CFG_PKT_DET_EN_ANT_A);
252            wlan_phy_select_rx_antenna(RX_ANTMODE_SISO_ANTA);
253        break;
254
255        case RX_ANTMODE_SISO_ANTB:
256            REG_SET_BITS(WLAN_RX_REG_CFG, WLAN_RX_REG_CFG_PKT_DET_EN_ANT_B);
257            wlan_phy_select_rx_antenna(RX_ANTMODE_SISO_ANTB);
258        break;
259
260        case RX_ANTMODE_SISO_ANTC:
261            REG_SET_BITS(WLAN_RX_REG_CFG, WLAN_RX_REG_CFG_PKT_DET_EN_ANT_C);
262            wlan_phy_select_rx_antenna(RX_ANTMODE_SISO_ANTC);
263        break;
264
265        case RX_ANTMODE_SISO_ANTD:
266            REG_SET_BITS(WLAN_RX_REG_CFG, WLAN_RX_REG_CFG_PKT_DET_EN_ANT_D);
267            wlan_phy_select_rx_antenna(RX_ANTMODE_SISO_ANTD);
268        break;
269
270        case RX_ANTMODE_SISO_SELDIV_2ANT:
271            REG_SET_BITS(WLAN_RX_REG_CFG, (WLAN_RX_REG_CFG_PKT_DET_EN_ANT_A | WLAN_RX_REG_CFG_PKT_DET_EN_ANT_B | WLAN_RX_REG_CFG_SWITCHING_DIV_EN));
272        break;
273
274        case RX_ANTMODE_SISO_SELDIV_4ANT:
275            REG_SET_BITS(WLAN_RX_REG_CFG, (WLAN_RX_REG_CFG_PKT_DET_EN_ANT_A | WLAN_RX_REG_CFG_PKT_DET_EN_ANT_B | WLAN_RX_REG_CFG_PKT_DET_EN_ANT_C | WLAN_RX_REG_CFG_PKT_DET_EN_ANT_D | WLAN_RX_REG_CFG_SWITCHING_DIV_EN));
276        break;
277
278        default:
279            // Default to SISO on A if user provides invalid mode
280            xil_printf("wlan_rx_config_ant_mode ERROR: Invalid Mode - Defaulting to SISO on A\n");
281
282            REG_SET_BITS(WLAN_RX_REG_CFG, WLAN_RX_REG_CFG_PKT_DET_EN_ANT_A);
283            wlan_phy_select_rx_antenna(RX_ANTMODE_SISO_ANTA);
284        break;
285    }
286
287    // Release the PHY Rx reset
288    REG_CLEAR_BITS(WLAN_RX_REG_CTRL, WLAN_RX_REG_CTRL_RESET);
289
290    return;
291}
292
293/*****************************************************************************/
294/**
295 * Transmission debug methods
296 *
297 * @param   Variable
298 *
299 * @return  Variable
300 *
301 * @note    These function is for debug use only.
302 *
303 *****************************************************************************/
304inline void wlan_tx_start() {
305    // Start the PHY Tx immediately; this bypasses the mac_hw MPDU Tx state machine
306    //     This should only be used for debug - normal transmissions should use mac_hw
307    //
308    REG_SET_BITS(WLAN_TX_REG_START, WLAN_TX_REG_START_VIA_RC);
309    REG_CLEAR_BITS(WLAN_TX_REG_START, WLAN_TX_REG_START_VIA_RC);
310
311    return;
312}
Note: See TracBrowser for help on using the repository browser.