This shows you the differences between two versions of the page.
Next revision | Previous revision Next revision Both sides next revision | ||
en:users:drivers:ath9k:spectral_scan [2015/01/26 09:49] 127.0.0.1 external edit |
en:users:drivers:ath9k:spectral_scan [2016/12/23 13:35] Robert Felten [ath9k spectral scan] minor format fix |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | + | ===== ath9k spectral scan ===== | |
- | ===== ath9k spectral scan: ===== | + | |
Atheros 802.11n chipsets include a built-in spectral analysis feature. AR92xx and AR93xx have the ability to report FFT data from the baseband under software controlled conditions, including: | Atheros 802.11n chipsets include a built-in spectral analysis feature. AR92xx and AR93xx have the ability to report FFT data from the baseband under software controlled conditions, including: | ||
Line 15: | Line 14: | ||
cat /sys/kernel/debug/ieee80211/phy0/ath9k/spectral_scan0 > samples | cat /sys/kernel/debug/ieee80211/phy0/ath9k/spectral_scan0 > samples | ||
echo disable > /sys/kernel/debug/ieee80211/phy0/ath9k/spectral_scan_ctl</code> | echo disable > /sys/kernel/debug/ieee80211/phy0/ath9k/spectral_scan_ctl</code> | ||
- | Spectral scan configuration parameters can be read and changed /sys/kernel/debug/ieee80211/phy0/ath9k/: | + | Spectral scan configuration parameters can be read and changed ''/sys/kernel/debug/ieee80211/phy0/ath9k/'': |
- | * spectral_count: number of scan results requested. Note that the "never disable" mode is implemented through the "background" mode in specral_scan_ctl, see below. | + | |
- | * spectral_short_repeat: controls the short_repeat parameter, see "Spectral scan parameters" below | + | * **spectral_count**: number of scan results requested. Note that the "never disable" mode is implemented through the "background" mode in specral_scan_ctl, see below. |
- | * spectral_fft_period: controls the fft_period parameter, see "Spectral scan parameters" below | + | * **spectral_short_repeat**: controls the short_repeat parameter, see "Spectral scan parameters" below |
- | * spectral_period: controls the period parameter, see "Spectral scan parameters" below | + | * **spectral_fft_period**: controls the //fft_period// parameter, see "Spectral scan parameters" below |
- | * spectral_scan_ctl: Contains the current mode. There are the following modes available: | + | * **spectral_period**: controls the //period// parameter, see "Spectral scan parameters" below |
- | * * disable: spectral scan is disabled | + | * **spectral_scan_ctl**: Contains the current mode. There are the following modes available: |
- | * * background: spectral scans samples are returned endlessly from the currently configured channel. It is running while the hardware is not busy with sending/receiving. Must be turned on by writing "trigger" into spectral_scan_ctl. | + | * ''disable'': spectral scan is disabled |
- | * * manual: as many spectral scan samples as configured in spectral_count are returned from the current channel after writing "trigger" into spectral_scan_ctl. | + | * ''background'': spectral scans samples are returned endlessly from the currently configured channel. It is running while the hardware is not busy with sending/receiving. Must be turned on by writing "trigger" into spectral_scan_ctl. |
- | * * chanscan: as many spectral scan samples as configured in spectral_count are returned for each channel when performing a scan. | + | * ''manual'': as many spectral scan samples as configured in spectral_count are returned from the current channel after writing "trigger" into spectral_scan_ctl. |
- | * spectral_scan0: the relayfs file which returns the spectral scan samples. The samples are returned as TLV binary data, see drivers/net/wireless/ath/ath9k/spectral.h and/or drivers/net/wireless/ath/spectral_common.h for the format | + | * ''chanscan'': as many spectral scan samples as configured in spectral_count are returned for each channel when performing a scan. |
- | ===== Spectral scan parameters: ===== | + | * **spectral_scan0**: the relayfs file which returns the spectral scan samples. The samples are returned as TLV binary data, see ''drivers/net/wireless/ath/ath9k/spectral.h'' and/or ''drivers/net/wireless/ath/spectral_common.h'' for the format |
- | * * fft_period: when active and triggered, PHY passes FFT frames to MAC every (fft_period+1)*4uS | + | |
- | * * period: when active, time period between successive spectral scan entry points (period*256*Tclk). Tclk = 44MHz for HT20 operation, 88MHz for HT40 operation | + | ===== Spectral scan parameters ===== |
- | * * count: number of scan results requested. There are special meanings in some chip revisions: | + | * //fft_period//: when active and triggered, PHY passes FFT frames to MAC every (fft_period+1)*4uS |
- | * * * AR92xx: highest bit set (>=128) is interpreted as "never disable" | + | * //period//: when active, time period between successive spectral scan entry points (period*256*Tclk). Tclk = 44MHz for HT20 operation, 88MHz for HT40 operation |
- | * * * AR9300 and newer: 0 is interpreted as "never disable" | + | * //count//: number of scan results requested. There are special meanings in some chip revisions: |
- | * * short_repeat: controls whether the chip is in spectral scan mode for 4 usec (enabled) or 204 usec (disabled) | + | * AR92xx: highest bit set (>=128) is interpreted as "never disable" |
- | ===== Frame format: ===== | + | * AR9300 and newer: 0 is interpreted as "never disable" |
- | * * * HT20 | + | * //short_repeat//: controls whether the chip is in spectral scan mode for 4 usec (enabled) or 204 usec (disabled) |
+ | |||
+ | ===== Frame format ===== | ||
+ | HT20: | ||
<code> 0 1 2 3 4 5 6 7 8 | <code> 0 1 2 3 4 5 6 7 8 | ||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | ||
Line 53: | Line 55: | ||
59 | [3:0] max_exp | | 59 | [3:0] max_exp | | ||
+---------------------------------------------------------------+</code> | +---------------------------------------------------------------+</code> | ||
- | * * * HT40 | + | |
+ | HT40: | ||
<code> 0 1 2 3 4 5 6 7 8 | <code> 0 1 2 3 4 5 6 7 8 | ||
+---------------------------------------------------------------+ | +---------------------------------------------------------------+ | ||
Line 79: | Line 82: | ||
+---------------------------------------------------------------+</code> | +---------------------------------------------------------------+</code> | ||
- | ===== Riceved power computation: ===== | + | ===== Received power computation ===== |
Assuming the noise floor is equal to -96dbm(*) and the magnitude of each sample in a 20MHz bin equals the RSSI, the received signal strength of each FFT bin on HT20 channel can be computed as follow: | Assuming the noise floor is equal to -96dbm(*) and the magnitude of each sample in a 20MHz bin equals the RSSI, the received signal strength of each FFT bin on HT20 channel can be computed as follow: | ||
- | * * * power(i) = nf + RSSI + 10*log(b(i)^2) - bin_sum where: | + | <code> |
- | * * * RSSI is computed on control chain 0 | + | power(i) = nf + RSSI + 10*log(b(i)^2) - bin_sum |
- | * * * b(i) is the magnitude in each bin, unscaled by max_exp | + | </code> |
- | * * * bin_sum = 10*log(sum[i=1..56](b(i)^2)) For 40MHz channel, previous formula should be used for 64 bins of control and extension channels, keeping in mind for HT40+ mode the extension channel is above the primary one (lower=ctl, upper=ext) and for HT40- the extension channel is below the primary one (lower=ext, upper=ctl) | + | where: |
+ | * //RSSI// is computed on control chain 0 | ||
+ | * //b(i)// is the magnitude in each bin, unscaled by //max_exp// | ||
+ | * //bin_sum// = 10*log(sum[i=1..56](b(i)^2)) | ||
+ | |||
+ | For 40MHz channel, previous formula should be used for 64 bins of control and extension channels, keeping in mind for HT40+ mode the extension channel is above the primary one (lower=ctl, upper=ext) and for HT40- the extension channel is below the primary one (lower=ext, upper=ctl). | ||
- | (*) nf can differ from -96dbm due to noise and spikes leading to a reduced reported RSSI | + | (*) nf can differ from -96dbm due to noise and spikes leading to a reduced reported RSSI. |
- | ===== Userspace programs: ===== | + | ===== Userspace programs ===== |
FFT samples gathered from Atheros NICs could be drawn using userspace programs: | FFT samples gathered from Atheros NICs could be drawn using userspace programs: | ||
- | * * * [[https://github.com/simonwunderlich/FFT_eval|https://github.com/simonwunderlich/FFT_eval]] (HT20 only) | + | * [[https://github.com/simonwunderlich/FFT_eval|https://github.com/simonwunderlich/FFT_eval]] (HT20 only) |
- | * * * [[https://github.com/LorenzoBianconi/ath_spectral|https://github.com/LorenzoBianconi/ath_spectral]] | + | * [[https://github.com/LorenzoBianconi/ath_spectral|https://github.com/LorenzoBianconi/ath_spectral]] |
(based on Adrian Chadd's documentation [[https://wiki.freebsd.org/dev/ath_hal(4)/SpectralScan|https://wiki.freebsd.org/dev/ath_hal%284%29/SpectralScan]]) | (based on Adrian Chadd's documentation [[https://wiki.freebsd.org/dev/ath_hal(4)/SpectralScan|https://wiki.freebsd.org/dev/ath_hal%284%29/SpectralScan]]) | ||