1 CCA
CCA(空间信道评估)在CSMA/CA中比较非常重要,事关整机吞吐量,所以对其实现进行简单分析。CCA好像应该有2种:CCA-CS,是属于PLCP层的,捕获到能量且能量值高于-82dB后,确定空间忙;CCA-ED,属于协议层,捕获到-62dB信号后,需要判定空间忙,并等待。
修改CCA等级,可以让它对“弱信号”失聪,从而可以在干扰环境中提高吞吐量。
2 具体实现
ar9300_update_cca_threshold(struct ath_hal *ah, int16_t nfarray[NUM_NF_READINGS], u_int8_t rxchainmask)
nf=ah->nf_2GHz.max OR ah->nf_5GHz.max 频段噪底
nf_max_primary = nf_max_extension = nf; 主信道噪底=辅信道噪低=频段噪底
chainmask = rxchainmask & ahpriv->ah_caps.hal_rx_chain_mask; 天线数
for (chan = 0; chan < 2 /*ctl,ext*/; chan++) 基于nfarry[]获得最高nf,利用nf更新 nf_max_primary 和nf_max_extension
nf_nominal = -101(HT20) OR -98(HT40) 标称噪低(极限)
if (nf_max_primary < nf_nominal)
cca_detection_margin_pri = ahpriv->ah_config.ath_hal_cca_detection_margin + (nf_nominal - nf_max_primary);
主信道cca检测余量值=配置检测余量+极限噪底-当前主信道噪底
else
cca_detection_margin_pri = ahpriv->ah_config.ath_hal_cca_detection_margin;
主信道cca检测余量值=配置检测余量 (一般都是这里)
if (nf_max_extension < nf_nominal)
cca_detection_margin_ext = ahpriv->ah_config.ath_hal_cca_detection_margin + (nf_nominal - nf_max_extension);
辅信道cca检测余量值=配置检测余量+极限噪底-当前辅信道噪底
else
cca_detection_margin_ext = ahpriv->ah_config.ath_hal_cca_detection_margin;
辅信道cca检测余量值=配置检测余量 (一般都是这里)
derived_max_cca = (ahpriv->ah_config.ath_hal_cca_detection_level - ahpriv->ah_config.ath_hal_cca_detection_margin - (-130);
计算出的最大cca=配置的检测等级值 – 配置的检测余量 - (-130)
max_cca_cap = derived_max_cca < 90 ? derived_max_cca : 90;
最大cca门限=(计算出的最大cca值 与90之间的小者)
cca_threshold_primary = (ahpriv->ah_config.ath_hal_cca_detection_level - cca_detection_margin_pri - nf_max_primary);
主信道CCA门限=配置的CCA检测余量值-计算出的主信道检测余量值-当前主信道噪低
cca_threshold_primary = cca_threshold_primary < max_cca_cap ? (cca_threshold_primary > 0 ? cca_threshold_primary : 0) : max_cca_cap;
主信道CCA门限 =(主信道CCA门限 与最大cca门限间的小者)
主信道CCA门限 =(主信道CCA门限 与0 间的大者)
cca_threshold_extension = (ahpriv->ah_config.ath_hal_cca_detection_level - cca_detection_margin_ext - nf_max_extension);
辅信道CCA门限=配置的CCA检测余量值-计算出的辅信道检测余量值-当前辅信道噪低
cca_threshold_extension = cca_threshold_extension < max_cca_cap ? (cca_threshold_extension > 0 ? cca_threshold_extension : 0) : max_cca_cap;
辅信道CCA门限 =(辅信道CCA门限 与最大cca门限间的小者)
辅信道CCA门限 =(辅信道CCA门限 与0 间的大者)
更新寄存器
AR_PHY_CCA_0.AR_PHY_CCA_THRESH62= cca_threshold_primary
主信道CCA值写入BB_cca_b0的0x0007F000位。这个寄存器应该是同时支持CCA_CS和CCA_ED的,这里所写入的也许就是CCA_ED,因为它命名为THRESH62;如果是CS,则为THRESH80才吻合;同样,该寄存器的0x1FF00000位好像不可改写,也不会随THRESH62值跳变,也许就是PLCP中的CCA_CS值,即真实的载波能量值。
AR_PHY_EXTCHN_PWRTHR1.AR_PHY_EXT_CCA0_THRESH62=cca_threshold_extension
辅信道CCA值写入BB_ext_chan_pwr_thr_1的0x000000FF位
AR_PHY_EXT_CCA0.AR_PHY_EXT_CCA0_THRESH62_MODE=0x0
BB_cca_ctrl_2_b0的0x00040000位置0。模式0/1的具体意思不明白,也许是自动和固定。
3 引申
仅涉及到BB_cca_b0,BB_ext_chan_pwr_thr_1和BB_cca_ctrl_2_b0。因此,在需要强制提高CCA的场景下,仅需求关闭CCA自动调整功能(缺省模式),然后手工修改这3个寄存器即可。
当然,开启CCA自动调整(CCAThEna ),也可以获得吞吐量提升,但要预设好适合当前场景的CCADetLevel值即可。