wiki:expansion/gw16146

GW16146 802.11ah HaLow Mini-PCIe Radio Module

The GW16146 is a miniPCIe form factor 802.11ah radio consisting of:

The GW16146 differs from the Newracom NRC7292 EVK in the following ways:

  • Sits behind a FT232H USB to SPI bridge
  • Uses software polling instead of an interrupt
  • Uses the Silex SX-NEWAH radio containing the NRC7292 but RF tuned for US operation

View the GW16146 Product Page for pricing and specifications

802.11ah Showcase

View the Gateworks 802.11ah Showcase to learn more about 802.11ah

Features

The Silex SX-NEWAH module featuring the Newracom 7292 features:

  • IEEE 802.11ah operating in Sub 1GHz license-exempt band
    • Offers a much greater range over 2.5GHz and 5GHz technologies
    • Offers a much higher data rate than proprietary Low-Power Wide-Area (LPWA) technologies such as LoRa and Sigfox
    • Full IP stack lowers barrier to entry over proprietary Low-Power Wide-Area (LPWA) technologies such as LoRa and Sigfox
  • Latest generation Wi-Fi security - WPA3
  • Channel widths: 1/2/4MHz channel widths with optional short guard interval (SGI) (yield 150Kbps to 15Mbps PHY throughput at the PHY layer but due to USB-to-SPI and driver polling maxes out at about 3-4.5mbps)
  • Streams: 1 spatial stream
  • Data rates: MCS0-MCS7, MCS10 (1MHz only)
  • Client / Node count: 8,191 theoretical (no security). With security, it will be less due to memory limitations, but over 1000 clients have been confirmed working with security enabled.
  • Country: US support only (see here for more info
  • Modes: Infrastructure, Monitor. 802.11s mesh.
  • Auth / Encryption: Open, WPA2-PSK(AES), WPA3-OWE, WPA3-SAE
  • OFDM modulation
  • AES-CCMP encryption
  • 750 to 950MHz frequency band
  • TX gain range: 23dB
  • RX noise figure: <4dB
  • Max input level: -10dBm
  • Dual embedded ARM Cortex-M0 and Cortex-M3 processor
  • SPI host interface
  • Only 1 GW16146 is supported on a give system; as there is no concrete way to associate SPI bus number with particular device. The bus number assignment relies on USB bus scan and device probe sequence

RF transmitter specifications:

BW Freq (MHz) Data Rates (MCS) TX Power (min/typ/max dBm)
1MHz 903.5 ~ 915.5 0,1,2,3,4,10 20.5 / 23.0 / 25.5
5 19.5 / 22.0 / 24.5
6 15.5 / 18.0 / 20.5
7 11.5 / 14.0 / 16.5
916.5 ~ 926.5 0,1,2,3,4,10 19.5 / 22.0 / 24.5
5 18.5 / 21.0 / 23.5
6 15.5 / 18.0 / 20.5
7 11.5 / 14.0 / 16.5
2MHz 905 ~ 917 0,1,2,3,4 20.5 / 22.0 / 24.5
5 19.5 / 21.0 / 23.5
6 12.5 / 18.0 / 20.5
7 11.5 / 14.0 / 16.5
9195 ~ 925 0,1,2,3,4 19.5 / 22.0 / 24.5
6 12.5 / 15.0 / 17.5
7 11.5 / 14.0 / 16.5
4MHz 910 ~ 922 0,1,2,3,4,5 18.5 / 21.0 / 23.5
6 12.5 / 15.0 / 17.5
7 11.5 / 14.0 / 16.5

MCS

Modulation and coding schemes (for 1 spatial stream 1/2/4MHz channels):

MCS index Modulation and coding rate 1MHz BW (mbps) 2MHz BW (mbps) 4MHz BW (mbps)
long GI short GI long GI short GI long GI short GI
0 BPSK 1/2 0.3 0.33 0.65 0.72 1.35 1.5
1 QPSK 1/2 0.6 0.67 1.3 1.44 2.7 3.0
2 QPSK 3/4 0.9 1.0 1.95 2.17 4.05 4.5
3 16-QAM 1/2 1.2 1.33 2.6 2.89 5.4 6.0
4 16-QAM 3/4 1.8 2.0 3.9 4.33 8.1 9.0
5 64-QAM 2/3 2.4 2.67 5.2 5.78 10.8 12.0
6 64-QAM 3/4 2.7 3.0 5.85 6.5 12.2 13.5
7 64-QAM 5/6 3.0 3.34 6.5 7.22 13.5 15.0
10 BPSK 1/2 x 2 0.15 0.17 - - - -
  • See rate table at: https://en.wikipedia.org/wiki/IEEE_802.11ah
  • These are maximum PHY data rates - actual throughput depends also on packet loss and most importantly SPI and USB bus overhead and latency which effectively reduces throughput of the GW16146 to a max of around 3-4.5mbps.
  • Range is affected by BW used. 1MHz should be used for long range applications. See some example range by BW here: https://youtu.be/Y_qmCR1so2c?t=188
  • Note, when rate control is turned 'on' the MCS will hop around and adjust accordingly.

To see the MCS rates being achieved (typically based on signal quality...) use the cli_app software on a running SBC with the GW16146 connected to another GW16146 over wireless. The command example shown below shows tx stats, but the rx stats can also be shown.

NRC> show mac tx stats                                                                              
-----------------------------------------------------------------------------------------
 MAC TX Statistics (OK count:264, RTX count:0, last MCS:2)
-----------------------------------------------------------------------------------------
- AC[BK]	: OK(         0/         0)  RTX(         0/         0)
- AC[BE]	: OK(         9/      1094)  RTX(         0/         0)
- AC[VI]	: OK(         0/         0)  RTX(         0/         0)
- AC[VO]	: OK(         2/       132)  RTX(         0/         0)
- AC[BC]	: OK(       253/      9818)  RTX(         0/         0)
- AC[GP]	: OK(         0/         0)  RTX(         0/         0)
-----------------------------------------------------------------------------------------
- TYPE[MGMT]	: OK(         2/       132)  RTX(         0/         0)
- TYPE[CTRL]	: OK(         0/         0)  RTX(         0/         0)
- TYPE[DATA]	: OK(         9/      1094)  RTX(         0/         0)
- TYPE[BEAC]	: OK(       254/      9849)  RTX(         0/         0)
-----------------------------------------------------------------------------------------
- MCS[ 0]	: OK(         0/         0)  RTX(         0/         0) FM(         0)
- MCS[ 1]	: OK(         0/         0)  RTX(         0/         0) FM(         0)
- MCS[ 2]	: OK(         6/       804)  RTX(         0/         0) FM(         0)
- MCS[ 3]	: OK(         0/         0)  RTX(         0/         0) FM(         0)
- MCS[ 4]	: OK(         1/       134)  RTX(         0/         0) FM(         0)
- MCS[ 5]	: OK(         0/         0)  RTX(         0/         0) FM(         0)
- MCS[ 6]	: OK(         0/         0)  RTX(         0/         0) FM(         0)
- MCS[ 7]	: OK(         0/         0)  RTX(         0/         0) FM(         0)
- MCS[10]	: OK(       259/     10168)  RTX(         0/         0) FM(         0)
-----------------------------------------------------------------------------------------
OK

Additionally, the cli_app show config command can be used (example below shows MCS at 3). Note, when rate control is turned 'on' the MCS will hop around and adjust accordingly.

root@mesh-10-2:~# cli_app show config
---------------------------------------------------
[MAC Configuration]
Device Mode			 : MESH
MAC Address			 : 1c:bc:ec:1b:2a:87
Country				 : US
Bandwidth			 : 2M
Frequency			 : 9210 (38)
MAC80211_freq			 : 5795 (159)
Rate Control			 : ON
 -MCS				 : 3
 -bw				 : 2
Guard Interval			 : AUTO
Security			 : OFF
RTS				 : OFF
RTS threshold			 : 0
Format				 : S1G
Preamble type			 : S1G_SHORT
Promiscuous Mode		 : OFF
color				 : 0x0
Auto CFO Cal			 : OFF

[PHY Configuration]
TX_Gain				 : AUTO
Base RX_Gain			 : 85
Compensated RX_Gain		 : 85
Tx Power Type			 : ~24 [AUTO]

Receiver

RF receiver specifications:

BW Modulation Data Rates Rx Minimum Sensitivity (typ/max dBm)
1MHz BPSK MCS10 -104 / -98
BPSK MCS0 -102 / -95
QPSK MCS1 -100 / -92
QPSK MCS2 -95 / -90
16 QAM MCS3 -92 / -87
16 QAM MCS4 -88 / -83
64 QAM MCS5 -89 / -79
64 QAM MCS6 -86 / -78
64 QAM MCS7 -85 / -77
2MHz BPSK MCS0 -96 / -92
QPSK MCS1 -96 / -89
QPSK MCS2 -94 / -87
16 QAM MCS3 -92 / -84
16 QAM MCS4 -88 / -80
64 QAM MCS5 -84 / -76
64 QAM MCS6 -83 / -75
64 QAM MCS7 -81 / -74
4MHz BPSK MCS0 -92 / -89
QPSK MCS1 -92 / -86
QPSK MCS2 -92 / -84
16 QAM MCS3 -88 / -81
16 QAM MCS4 -85 / -77
64 QAM MCS5 -81 / -73
64 QAM MCS6 -80 / -72
64 QAM MCS7 -78 / -71

Channel Mapping

Channel Mapping (US):

  • The SX-NEWAH Channel Mapping application note from Silex states the frequency range is 903.5 MHz to 926.5 MHz supporting channel widths of 1MHz, 2MHz, or 4MHz.

Please note, that in Linux, the WiFi Channel and Frequency may still appear as 2.4 and 5.8GHz numbers, but this radio still outputs in the 900MHz.

For Channel mapping details see: UG-7292-003-S1G_Channel.pdf UG-7292-003-S1G_Channel.pdf

The channel map (differs a bit from Newracom's info due to US) is:

  • 1 MHz Wide channel mappings:
Wi-Fi channel setting Sub 1 GHz frequency [MHz] Linux Mapped WiFi Freq
3 903.5 2422
5 904.5 2432
7 905.5 2442
9 906.5 2452
11 907.5 2462
36 908.5 5180
37 909.5 5185
38 910.5 5190
39 911.5 5195
40 912.5 5200
41 913.5 5205
42 914.5 5210
43 915.5 5215
44 916.5 5220
45 917.5 5225
46 918.5 5230
47 919.5 5235
48 920.5 5240
149 921.5 5745
150 922.5 5750
151 923.5 5755
152 924.5 5760
100 1 925.5 5500
104 1 926.5 5520
  1. use of these channels is not recommended as these are Clear Access Channels (CAC) which when used will takea full 60 seconds before they are operational
  • 2 MHz Wide channel mappings:
Wi-Fi channel setting Sub 1 GHz frequency [MHz] Linux Mapped WiFi Freq
6 905 2437
10 907 2457
153 909 5765
154 911 5770
155 913 5775
156 915 5780
157 917 5785
158 919 5790
159 921 5795
160 923 5800
161 925 5805
  • 4 MHz Wide channel mappings:
Wi-Fi channel setting Sub 1 GHz frequency [MHz] Linux Mapped WiFi Freq
162 910 5810
163 914 5815
164 918 5820
165 922 5825

Countries Supported

This card is primarily design and sold for use in the USA where the 900MHz band is unlicensed. The current card is not targeted for the 868MHz range.

The Newracom NRC7292 driver has support for the following countries:

  • AU
  • CN
  • EU
  • JP
  • K1
  • K2
  • NZ
  • TW
  • US

It is imperative and important to check the local and country radio spectrum regulatory regulations to see if this radio would be legal in that country. (Usually specific to the 900MHz frequency band).

Silex SX-SDMAH Module Support Map: (Gateworks GW1616146 uses the Silex SX-SDMAH module)

  • Green: SX-SDMAH is available.
  • Orange: SX-SDMAH US SKU can be used by limiting the channel. Product cert is required.
  • Red: Regulation unknown or product in planning stage.

Please contact Gateworks support for further information.

Antenna

This radio requires an antenna properly tuned for the target frequency.

Silex Recommended Antennas on Digi-Key:

Silex Recommended Antennas:

Gateworks sells a 900 MHz antenna, the GW10124. This antenna is *NOT* pre-certified by Silex, thus should only be used for development and will require re-certification.

Documentation

There are a number of documents in the Newracom nrc7292 driver repository which may prove useful:

Other references:

Software

Software support consists of the following items: (This a summary. Details are below)

The above software support is present in the following:

  • Venice Ubuntu Jammy (22.04) pre-built images
  • Newport Ubuntu Focal (20.04) pre-built images.
  • Ventana Ubuntu Focal (20.04) pre-built images

FT232H USB to SPI bridge

The FT232H features an multi-protocol engine that can be used for UART, JTAG, SPI, I2C among perhaps other things. The FT232H's MPSSE is great for generating signals to communicate using the SPI protocol. The MPSSE can take care of generating a clock signal from about 450hz to 30Mhz, and read & write bytes of data at that frequency.

Gateworks has programmed the USB VID:PID on the GW16146 to 0x2beb:0x0146 which binds to the out-of-tree Linux kernel spi-ft232h driver.

When a GW16146 is found on the USB bus a SPI master host controller will be registered with the Linux kernel (which you can see in /sys/class/spi_master) as well as registers a nrc80211 SPI device which binds to the nrc7292 driver. Note that earlier versions of this driver required you to manually determine the SPI bus and manually probe the nrc driver with arguments pointing to the bus. Please make sure you are using the latest version of these drivers (available on the Gateworks pre-built Ubuntu based OS images) to avoid this (or refer to earlier documentation).

Building:

  • The driver compiles a single module 'spi-ft232h.ko' and can be built out-of-tree by assigning KDIR to the directory of your kernel:
    KDIR=/usr/src/venice/bsp/linux make
    

NRC7292 kernel driver

The Silex SX-NEWAH module on the GW16146 has a Newracom NRC7292 which is supported by Newracom's open-source driver.

The Gateworks nrc7292 driver has some modifications to the Newracom NRC7292 driver:

  • add support for v6.2+
  • nrc-init: default to spi polling
  • nrc-hif-cspi: remove spam from spi_check_ready
  • nrc-mac80211: display wlan device registered
  • nrc: add display of driver version and chip identified
  • nrc: remove prints for non-errors

nrc7292 driver history:

  • v1.5 (Oct 2023) - Gateworks now supports this
  • v1.4 (June 2023) - Gateworks did not use this version of the driver
  • v1.3 (April 2021) - Gateworks original driver

There is a large set of kernel params (which you can see via 'modinfo nrc.ko') but for our purposes the following are needed:

  • fw_name - firmware file from /lib/firmware
  • bd_name - Board data file from /lib/firmware
  • spi_polling_interval - SPI polling interval in ms (recommend 5ms)

Example module loading:

modprobe nrc fw_name=nrc7292_cspi.bin bd_name=nrc7292_bd.dat spi_polling_interval=5

When using an OS like Ubuntu you create a file in /etc/modprobe.d/ to use these automatically when the module is loaded:

cat << EOF > /etc/modprobe.d/nrc.conf 
options nrc fw_name=nrc7292_cspi.bin bd_name=nrc7292_bd.dat spi_polling_interval=5
EOF

To find the correct wlan interface that is bound to the NRC7292 driver you can look at the devices in /sys/class/net to see which ones have a SPI based device-driver:

WLAN="$(for i in $(ls -d /sys/class/net/wlan* 2>/dev/null); do if [ -d $i/device/driver/spi* ]; then basename $i; fi; done)"
echo $WLAN
# wlan0

After bringing up the interface you can perform more configuration on it via the 'cli_app' (see below)

ifconfig $WLAN up

Building:

  • The driver compiles a single module 'nrc.ko' and can be built out-of-tree by assigning KDIR to the directory of your kernel:
    KDIR=/usr/src/venice/bsp/linux make
    
  • Kernel Requirements: CONFIG_CRYPTO_CCM, CONFIG_CRYPTO_GCM, CONFIG_CRYPTO_SEQIV, CONFIG_CRYPTO_CBC, CONFIG_CRYPTO_CTR, CONFIG_CRYPTO_ECB, CONFIG_CRYPTO_AES
OpenWrt Information

For customers interested in OpenWRT, view repository link for NRC7292:

cli_app

There is a 'cli_app' that is part of the driver code which communicates with the driver via the Netlink generic socket family API. Netlink is a Linux kernel interface used for inter-process communication between kernel and userspace similar to unix domain sockets designed for transferring miscellaneous networking information between kernel space and userspace processes. See https://en.wikipedia.org/wiki/Netlink for details.

The cli_app facilitates setting misc details that are not handled via iw. The app can be used in interactive mode by running without args or by sending commands.

Example usage showing useful features:

  • interactive mode
    # ./cli_app
    ===================================================
        Newracom Command Line Application (2.21.5)     
    ===================================================
    NRC> help
    ===================================================================================================
     help                                                                           :show CLI tree
     write {address} {data}                                                         :write a 32-bit value to memory
     exit                                                                           :exit program
     show version                                                                   :show version
     show config [vif_id]                                                           :show configuration
     show edca                                                                      :show EDCA parameters
     show uinfo [vif_id]                                                            :show UMAC information
     show ampdu | show ampdu clear                                                  :show/clear AMPDU count
     show signal {start|stop} [interval] [number]                                   :show rssi/snr, {options} are only valid in cli_app prompt
     show maxagg                                                                    :show max aggregation
     show duty                                                                      :show duty cycle
     show autotxgain                                                                :show autotxgain
     show cal_use                                                                   :show cal_use
     show recovery stats                                                            :show recovery
     show detection stats                                                           :show detection
     show temp                                                                      :show temp
     show wakeup_pin                                                                :show wakeup pin configuration
     show wakeup_source                                                             :show wakeup source configuration
     show sta [vif_id] {all|aid [aid_index]}                                        :show station information
     show ap [vif_id]                                                               :show ap information
     show tx_time                                                                   :show tx_time about {CS time} {Blank time}
     show cca_thresh                                                                :show cca_thresh(unit: dBm)
     show self_config {Country(KR,US...)} {BW} {dwell time}                         :show self_config
     show optimal_channel {Country(US,NZ...)} {BW} {dwell time}                     :show optimal_channel
     show app_version                                                               :show app version
     show sysconfig                                                                 :show sysconfig
     show rc_pf                                                                     :show rate control profile number
     show rc_param                                                                  :show configured rate control parameter
     show stats simple_rx                                                           :show received packet information
     show mac clear                                                                 :clear TX/RX Statistics
     show mac tx stats                                                              :show TX Statistics
     show mac tx clear                                                              :clear TX Statistics
     show mac rx stats                                                              :show RX Statistics
     show mac rx clear                                                              :clear RX Statistics
     set gi {auto|short|long} {vif_id(0|1)}                                         :set guard interval
     set maxagg {AC(0-3)} {Max(0-8(1Mhz),0-16(2,4Mhz),0:off)} {size:default=0}      :set aggregation
     set ack_mode {no|ndp|normal|show}                                              :set ack mode
     set rc {on|off} [vif_id] [mode]                                                :set rate control
     set duty {on|off} {duty window} {tx duration}                                  :set duty cycle
     set duty_debug {on|off}                                                        :set debug mode for duty cycle
     set txpwr {auto|limit|fixed} {value}                                           :set tx power and type
     set wakeup_pin {Debounce(on|off)} {PIN Number(0~31)}                           :set wakeup pin for deepsleep
     set wakeup_soruce rtc gpio hspi                                                :set wakeup source for deepsleep
     set addba [tid] {mac address}                                                  :set addba tid / send addba with mac address
     set delba [tid] {mac address}                                                  :set delba tid / send delba with mac address
     set rts {on|off|default} <threshold> <vif_id> {ndp rts ri:1, normal rts ri:2}  :set rts on/off
     set cts {adaptive cts:on, legacy cts:off}                                      :set cts on/off
     set tx_time {CS time} {Blank time}                                             :set tx_time about {CS time} {Blank time}
     set drop [vif id] [mac address] {on|off}                                       :set drop frames from configured mac address
     set self_config {Country(KR,US...)} {BW} {dwell time}                          :set self_config
     set tsensor [GPIO for SCL] [GPIO for SDA]                                      :set temperature sensor scl, sda
     set cca_thresh {CCA threshold(unit:dBm, -100~-35)}                             :set cca threshold
     set color {value}                                                              :set color
     set deepsleep_gpio {dir} {out} {pullup}                                        :set GPIO direction/out data/pull during deepsleep operation
     set report {on/off}                                                            :set lmac periodic report
     set support_ch_width [0|1]                                                     :set supported ch width in s1g capa ie (0:1/2M, 1:1/2/4M)
     set ampdu_mode [disable|manual|auto]                                           :set ampdu_mode 
     set bcn_mcs [vif_id] [10|0|1|2|3|4|5|6|7]
                                            :set bcn_mcs 
     set rc_pf [1|2]                                                                :set rate control profile number
     set rc_param {1|2|3|4|5} {1|2|3|4|5|6|7}                                       :set rate control parameter
     set bgscan_trx [1:enable|0:disable] [wait time operation ch for rx: (0~100)msec]:set bgscan_trx 
     set scan_period [dwell time (min 20ms)]                                        :set scan_period
     set mesh_rssi_threshold {-120~-10dBm}                                          :set mesh_rssi_threshold 
     test mcs [mcs index]                                                           :test mcs
     test country [country code]                                                    :test country
     test cont_tx {stop} | {freq(in MHz)} {bw(1m|2m|4m)} {mcs} {txpwr}              :test continuous tx
     gpio read [pin number]                                                         :gpio read
     gpio write [pin number] [0|1]                                                  :gpio write
     gpio direction [pin index] {[0(input)|1(output)]}                              :read/write gpio direction
     gpio pullup [pin index] {[0(off)|1(on)]}                                       :read/write gpio pullup enable|disable
    
    ===================================================================================================
    OK
    NRC> exit
    ===================================================
          Exit Newracom Command Line Application      
    ===================================================
    
  • Show software/hardware version info:
    # ./cli_app show version
    Newracom Firmware Version        : 01.03.03
    gerrit/master                    : c977f
    Board Revision                   : 7292A
    OK
    
  • Set use of board data for tx power levels and calibration:
    # ./cli_app set bdf_use on
    Board Data use                   : on
    OK
    
  • Show Config
    root@mesh-10-2:~# cli_app show config
    ---------------------------------------------------
    [MAC Configuration]
    Device Mode			 : MESH
    MAC Address			 : 1c:bc:ec:1b:2a:87
    Country				 : US
    Bandwidth			 : 2M
    Frequency			 : 9210 (38)
    MAC80211_freq			 : 5795 (159)
    Rate Control			 : ON
     -MCS				 : 2
     -bw				 : ؟
    Guard Interval			 : AUTO
    Security			 : OFF
    RTS				 : OFF
    RTS threshold			 : 0
    Format				 : S1G
    Preamble type			 : S1G_SHORT
    Promiscuous Mode		 : OFF
    color				 : 0x0
    Auto CFO Cal			 : OFF
    
    [PHY Configuration]
    TX_Gain				 : AUTO
    Base RX_Gain			 : 85
    Compensated RX_Gain		 : 85
    Tx Power Type			 : ~24 [AUTO]
    ---------------------------------------------------
    OK
    root@mesh-10-2:~# 
    
  • Show Optimal Channel
    root@mesh-10-2:~# cli_app show optimal_channel US 2m 100
    [Optimal freq.]	927.0 MHz (CCA:0.0%, BW:2M, Legacy channel number:112)
    OK
    
    
  • Self config showing more details of optimal channel (clear channel assessment (CCA) )
    root@mesh-10-2:~# cli_app show self_config US 2m 100
    	Frequency	CCA	bandwidth
    --	903.0 MHz	6.5%	2M
    --	905.0 MHz	1.4%	2M
    --	907.0 MHz	1.2%	2M
    --	909.0 MHz	1.5%	2M
    --	911.0 MHz	1.2%	2M
    --	913.0 MHz	1.5%	2M
    --	915.0 MHz	0.1%	2M
    --	917.0 MHz	5.0%	2M
    --	919.0 MHz	0.0%	2M
    --	921.0 MHz	14.8%	2M
    --	923.0 MHz	6.7%	2M
    --	925.0 MHz	3.3%	2M
    --	927.0 MHz	8.7%	2M
    [Optimal freq.]	919.0 MHz (CCA:0.0%, BW:2M)
    [*]ch_num:158
    OK
    root@mesh-10-2:~# 
    
    
  • Enable A-MPDU (frame aggregation):
    # ./cli_app set maxagg 1 8
    -------------------------------- updated aggregation ----------------------------------
    AC       : BK           State    : OFF          Value    : 8            Size    : 0
    AC       : BE           State    : ON           Value    : 8            Size    : 0
    AC       : VI           State    : OFF          Value    : 8            Size    : 0
    AC       : VO           State    : OFF          Value    : 8            Size    : 0
    ---------------------------------------------------------------------------------------
    OK
    root@focal-venice-sta:~# ./cli_app set maxagg 1 on
    -------------------------------- updated aggregation ----------------------------------
    AC       : BK           State    : OFF          Value    : 8            Size    : 0
    AC       : BE           State    : ON           Value    : 8            Size    : 0
    AC       : VI           State    : OFF          Value    : 8            Size    : 0
    AC       : VO           State    : OFF          Value    : 8            Size    : 0
    ---------------------------------------------------------------------------------------
    OK
    
  • Set guard band interval to long (or short if you wish)
    # ./cli_app set gi long
    guard interval : long
    OK
    
  • Enable RF calibration:
    # ./cli_app set cal_use on
    Calibration_use : on                    Country  : US
    OK
    

For more info see UG-7292-007-Command line application.pdf

Note that the interface needs to be up.

Configuration and Usage examples

Standard Configuration

Steps 1 through 4 below are required for operation:

  1. Set the country code (required for newer versions of the driver) (MANDATORY every boot)
    iw reg set US
    
    • note that this can be done automatically in a number of ways:
      • kernel cmdline: add 'cfg80211.ieee80211_regdom=US' to bootargs
      • Ubuntu modprobe.d: 'echo "options cfg80211 ieee80211_regdom=US" > /etc/modprobe.d/cfg80211_regdomain.conf'
      • OpenWrt modules.d: 'echo "cfg80211 ieee80211_regdom=US" > /etc/modules.d/cfg80211_regdomain.conf'
  2. Confirm the device exists on the USB bus:

lsusb shows GW16046 on bus with VID:0x2beb and PID=0x0146

lsusb -d 0x2beb:0x0146
# Bus 001 Device 003: ID 2beb:0146  
  1. Find the correct wlan interface that is bound to the NRC7292 driver by looking for a devices in /sys/class/net with a SPI based device-driver:
    WLAN="$(for i in $(ls -d /sys/class/net/wlan* 2>/dev/null); do if [ -d $i/device/driver/spi* ]; then basename $i; fi; done)"
    echo $WLAN
    # wlan0
    
  2. Bring up the interface (required for configuration below)
    ifconfig $WLAN up
    
  3. Now configure wlan0 as an access point or client (station) given different examples below.

Manual Configuration

Optional More Manual Config When Not Using Gateworks Ubuntu BSP:

  1. Confirm the device exists on the USB bus:

lsusb shows GW16046 on bus with VID:0x2beb and PID=0x0146

lsusb -d 0x2beb:0x0146
# Bus 001 Device 003: ID 2beb:0146  
  1. Device Drivers: (this is done automatically when using the latest Gateworks Ubuntu BSP)
  2. Load the NRC7292 driver providing the fw_name bd_name and spi_polling_interval parameters:
    modprobe nrc fw_name=nrc7292_cspi.bin bd_name=nrc7292_bd.dat spi_polling_interval=5
    
    • After several seconds you should see a new wlan device under /sys/class/net
  3. Find the correct wlan interface that is bound to the NRC7292 driver by looking for a devices in /sys/class/net with a SPI based device-driver:
    WLAN="$(for i in $(ls -d /sys/class/net/wlan* 2>/dev/null); do if [ -d $i/device/driver/spi* ]; then basename $i; fi; done)"
    echo $WLAN
    # wlan0
    
  4. Set the country code (required for newer versions of the driver) (MANDATORY every boot)
    iw reg set US
    
  5. bring up the interface (required for configuration below)
    ifconfig $WLAN up
    

Popular CLI_APP Configuration

(Optional) Configure miscellaneous parameters via cli_app Netlink tool

  • Enable transmission power controL (TPC)
    # cli_app set bdf_use on # enable transmission power control (TPC)
    Board Data use                   : on
    OK
    
  • Configure frame aggregation
    # cli_app set maxagg 1 8 # configure frame aggregation
    -------------------------------- updated aggregation ----------------------------------
    AC       : BK           State    : OFF          Value    : 8            Size    : 0
    AC       : BE           State    : OFF          Value    : 8            Size    : 0
    AC       : VI           State    : OFF          Value    : 8            Size    : 0
    AC       : VO           State    : OFF          Value    : 8            Size    : 0
    ---------------------------------------------------------------------------------------
    OK
    # cli_app set maxagg 1 on # enable frame aggregation
    -------------------------------- updated aggregation ----------------------------------
    AC       : BK           State    : OFF          Value    : 8            Size    : 0
    AC       : BE           State    : ON           Value    : 8            Size    : 0
    AC       : VI           State    : OFF          Value    : 8            Size    : 0
    AC       : VO           State    : OFF          Value    : 8            Size    : 0
    ---------------------------------------------------------------------------------------
    OK
    
    • The Access Category (BK/BE/VI/VO) are based on ToS field in an IP header:
      • BK: 0x20, 0x28, 0x38, 0x48, 0x58
      • BE: 0x00, 0x60, 0x70
      • VI: 0x88, 0x90, 0x98, 0xa0, 0xb8
      • VO: 0xc0, 0xe0
  • configure guard band interval
    # cli_app set gi long # set long guard interval
    guard interval : long
    OK
    
  • Configure power calibration
    # cli_app set cal_use on # enable power calibration
    Calibration_use : on                    Country  : US
    OK
    
  • For the Command Line App usage details see UG-7292-007-Command Line Application.pdf

Access Point / Client Station Examples

Set the country code (required for newer versions of the driver) (MANDATORY every boot)

iw reg set US
  1. Configure AP (access point) or STA (station / client) mode:
    • Define your channel and SSID via env variables (used in scripts below)
      SSID=halow_demo
      CH=161
      PSK=12345678
      
    • Open security model:
      • AP (access point) (using WLAN/SSID/CH env variables)
        # apt install hostapd # make sure hostapd is installed
        # /etc/init.d/hostapd stop # make sure its not running
        # cat << EOF > /tmp/hostapd.conf
        ctrl_interface=/var/run/hostapd
        country_code=US
        interface=$WLAN
        ssid=$SSID
        hw_mode=a
        channel=$CH
        ieee80211h=1
        ieee80211d=1
        ieee80211n=1
        macaddr_acl=0
        driver=nl80211
        beacon_int=100
        ap_max_inactivity=16780
        EOF
        # hostapd /tmp/hostapd.conf &
        [1] 1006
        Configuration file: /tmp/hostapd.conf
        rfkill: Cannot open RFKILL control device
        wlan0: interface state UNINITIALIZED->COUNTRY_UPDATE
        Using interface wlan0 with hwaddr 84:25:3f:87:fc:b6 and ssid "halow_demo"
        wlan0: interface state COUNTRY_UPDATE->ENABLED
        wlan0: AP-ENABLED
        
      • STA (station / client) (using WLAN/SSID env variables)
        # cat << EOF > /tmp/wpa_supplicant.conf
        ctrl_interface=/var/run/wpa_supplicant
        
        country=US
        network={
            ssid="$SSID"
            scan_ssid=1
            key_mgmt=NONE
            freq_list=2412 2422 2432 2442 2452 2462 5180 5185 5190 5195 5200 5205 5210 5215 5220 5225 5230 5235 5240 5745 5750 5755 5760 5500 5520 5540 2417 2437 2457 5765 5770 5775 5780 5785 5790 5795 5800 5805 5560 2447 5810 5815 5820 5825 5580
            scan_freq=2412 2422 2432 2442 2452 2462 5180 5185 5190 5195 5200 5205 5210 5215 5220 5225 5230 5235 5240 5745 5750 5755 5760 5500 5520 5540 2417 2437 2457 5765 5770 5775 5780 5785 5790 5795 5800 5805 5560 2447 5810 5815 5820 5825 5580
        }
        
        p2p_disabled=1
        EOF
        # wpa_supplicant -i $WLAN -c /tmp/wpa_supplicant.conf &
        
    • WPA2-PSK security
      • AP (using WLAN/SSID/CH/PSK env variables)
        # cat << EOF > /tmp/hostapd.conf
        ctrl_interface=/var/run/hostapd
        country_code=US
        interface=$WLAN
        ssid=$SSID
        hw_mode=a
        channel=$CH
        ieee80211h=1
        ieee80211d=1
        ieee80211n=1
        macaddr_acl=0
        driver=nl80211
        beacon_int=100
        ap_max_inactivity=16780
        wpa=2
        wpa_key_mgmt=WPA-PSK
        wpa_pairwise=CCMP
        rsn_pairwise=CCMP
        wpa_passphrase=$PSK
        EOF
        # hostapd /tmp/hostapd.conf &
        
      • STA (station / client) (using WLAN/SSID/PSK env variables)
        # cat << EOF > /tmp/wpa_supplicant.conf
        ctrl_interface=/var/run/wpa_supplicant
         
        country=US
        update_config=1
        network={
            ssid="$SSID"
            scan_ssid=1
            proto=RSN
            key_mgmt=WPA-PSK
            pairwise=CCMP
            group=CCMP
            psk="$PSK"
            freq_list=2412 2422 2432 2442 2452 2462 5180 5185 5190 5195 5200 5205 5210 5215 5220 5225 5230 5235 5240 5745 5750 5755 5760 5500 5520 5540 2417 2437 2457 5765 5770 5775 5780 5785 5790 5795 5800 5805 5560 2447 5810 5815 5820 5825 5580
            scan_freq=2412 2422 2432 2442 2452 2462 5180 5185 5190 5195 5200 5205 5210 5215 5220 5225 5230 5235 5240 5745 5750 5755 5760 5500 5520 5540 2417 2437 2457 5765 5770 5775 5780 5785 5790 5795 5800 5805 5560 2447 5810 5815 5820 5825 5580
        }
        p2p_disabled=1
        ignore_old_scan_res=1
        EOF
        # wpa_supplicant -i $WLAN -c /tmp/wpa_supplicant.conf &
        
    • WPA3-SEA (see https://en.wikipedia.org/wiki/Simultaneous_Authentication_of_Equals)
      • AP (using WLAN/SSID/PSK env variables)
        # cat << EOF > /tmp/hostapd.conf
        ctrl_interface=/var/run/hostapd
        country_code=US
        interface=$WLAN
        ssid=$SSID
        hw_mode=a
        channel=$CH
        ieee80211h=1
        ieee80211d=1
        ieee80211n=1
        ieee80211w=2
        macaddr_acl=0
        driver=nl80211
        beacon_int=100
        ap_max_inactivity=16780
        wpa=2
        wpa_key_mgmt=SAE
        wpa_pairwise=CCMP
        rsn_pairwise=CCMP
        wpa_passphrase=$PSK
        EOF
        # hostapd /tmp/hostapd.conf &
        
      • STA (station / client) (using WLAN/SSID/PSK env variables)
        # cat << EOF > /tmp/wpa_supplicant.conf
        ctrl_interface=/var/run/wpa_supplicant
        
        country=US
        update_config=1
        network={
            ssid="$SSID"
            scan_ssid=1
            proto=RSN
            key_mgmt=SAE
            pairwise=CCMP
            group=CCMP
            psk="$PSK"
            ieee80211w=2
            freq_list=2412 2422 2432 2442 2452 2462 5180 5185 5190 5195 5200 5205 5210 5215 5220 5225 5230 5235 5240 5745 5750 5755 5760 5500 5520 5540 2417 2437 2457 5765 5770 5775 5780 5785 5790 5795 5800 5805 5560 2447 5810 5815 5820 5825 5580
            scan_freq=2412 2422 2432 2442 2452 2462 5180 5185 5190 5195 5200 5205 5210 5215 5220 5225 5230 5235 5240 5745 5750 5755 5760 5500 5520 5540 2417 2437 2457 5765 5770 5775 5780 5785 5790 5795 5800 5805 5560 2447 5810 5815 5820 5825 5580
        }
        p2p_disabled=1
        ignore_old_scan_res=1
        EOF
        # wpa_supplicant -i $WLAN -c /tmp/wpa_supplicant.conf &
        
    • WPA3-OWE (see https://en.wikipedia.org/wiki/Opportunistic_Wireless_Encryption)
      • AP (using WLAN/SSID/PSK env variables)
        # cat << EOF > /tmp/hostapd.conf
        ctrl_interface=/var/run/hostapd
        country_code=US
        interface=$WLAN
        ssid=$SSID
        hw_mode=a
        channel=$CH
        ieee80211h=1
        ieee80211d=1
        ieee80211n=1
        ieee80211w=2
        macaddr_acl=0
        driver=nl80211
        beacon_int=100
        ap_max_inactivity=16780
        wpa=2
        wpa_key_mgmt=OWE
        wpa_pairwise=CCMP
        rsn_pairwise=CCMP
        EOF
        # hostapd /tmp/hostapd.conf &
        
      • STA (using WLAN/SSID/PSK env variables)
        # cat << EOF > /tmp/wpa_supplicant.conf
        ctrl_interface=/var/run/wpa_supplicant
        
        country=US
        update_config=1
        pmf=2
        network={
            ssid="$SSID"
            scan_ssid=1
            proto=RSN
            key_mgmt=OWE
            pairwise=CCMP
            group=CCMP
            psk="$PSK"
            ieee80211w=2
            freq_list=2412 2422 2432 2442 2452 2462 5180 5185 5190 5195 5200 5205 5210 5215 5220 5225 5230 5235 5240 5745 5750 5755 5760 5500 5520 5540 2417 2437 2457 5765 5770 5775 5780 5785 5790 5795 5800 5805 5560 2447 5810 5815 5820 5825 5580
            scan_freq=2412 2422 2432 2442 2452 2462 5180 5185 5190 5195 5200 5205 5210 5215 5220 5225 5230 5235 5240 5745 5750 5755 5760 5500 5520 5540 2417 2437 2457 5765 5770 5775 5780 5785 5790 5795 5800 5805 5560 2447 5810 5815 5820 5825 5580
        }
        p2p_disabled=1
        ignore_old_scan_res=1
        EOF
        # wpa_supplicant -i $WLAN -c /tmp/wpa_supplicant.conf &
        

802.11s Mesh

Mesh has a lot of options and is complex in it's nature.

Newracom uses and evaluation kit (EVK) on a Raspberry Pi and a lot of mesh functionality and examples about that are shown in this document here . Gateworks does not use a lot of the scripts and software packages from Newracom despite using the Newracom driver.

A basic example to setup a 'mesh point' would be the following:

  1. Set the country code (required for newer versions of the driver) (MANDATORY every boot)
    iw reg set US
    
  2. Verify proper operation of the GW16146 in standard AP/STA mode first
  3. Create a wpa_supplicant.conf file that defines the radio as a 'mesh point', example below of a wpa_supplicant.conf file
    ctrl_interface=/var/run/wpa_supplicant
    
    country=US
    network={
        ssid="nrc_mesh"
        mode=5
        scan_ssid=1
        key_mgmt=NONE
        beacon_int=100
    #BW.11ah(Freq)
        frequency=5795
        freq_list=5795
        scan_freq=5795
        dot11MeshRetryTimeout=1000
        dot11MeshHoldingTimeout=400
        dot11MeshMaxRetries=4
        mesh_rssi_threshold=-90
        mesh_basic_rates= 60 120 240
        #no_auto_peer=1
    }
    p2p_disabled=1
    ignore_old_scan_res=1
    mesh_max_inactivity=-1
    
    
  4. Be sure the wlan0 interface exists and is up
    ifconfig wlan0 up
    
  5. Bring up the radio using wpa_supplicant:
    wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf -dddd &
    

Verify that the interface is in 'mesh' mode by seeing where it says 'type mesh point' in the example below:

root@mesh-10-3:~# iw wlan0 info
Interface wlan0
        ifindex 4
        wdev 0x1
        addr 1c:bc:ec:1b:2a:87
        type mesh point
        wiphy 0
        channel 159 (5795 MHz), width: 20 MHz, center1: 5795 MHz
        txpower 30.00 dBm
        multicast TXQ:
                qsz-byt qsz-pkt flows   drops   marks   overlmt hashcol tx-bytes        tx-packets
                0       0       28      0       0       0       0       2816            28

Show and 'dump' a list of all connected mesh nodes:

root@mesh-10-3:~# iw wlan0 station dump
Station 84:25:3f:87:fc:b6 (on wlan0)
	inactive time:	17700 ms
	rx bytes:	287288
	rx packets:	3921
	tx bytes:	869
	tx packets:	13
	tx retries:	0
	tx failed:	0
	rx drop misc:	11
	signal:  	-90 dBm
	signal avg:	-90 dBm
	Toffset:	1596110650506024084 us
	tx bitrate:	6.0 MBit/s
	tx duration:	0 us
	rx bitrate:	6.0 MBit/s
	rx duration:	0 us
	expected throughput:	2.929Mbps
	mesh llid:	0
	mesh plid:	0
	mesh plink:	ESTAB
	mesh airtime link metric: 2731
	mesh connected to gate:	no
	mesh connected to auth server:	no
	mesh local PS mode:	ACTIVE
	mesh peer PS mode:	ACTIVE
	mesh non-peer PS mode:	ACTIVE
	authorized:	yes
	authenticated:	yes
	associated:	yes
	preamble:	long
	WMM/WME:	yes
	MFP:		no
	TDLS peer:	no
	DTIM period:	2
	beacon interval:100
	connected time:	203 seconds
	associated at [boottime]:	23.826s
	associated at:	1700600258324 ms
	current time:	1700600460874 ms
Station 1c:bc:ec:1b:2a:87 (on wlan0)
	inactive time:	360 ms
	rx bytes:	287878
	rx packets:	3927
	tx bytes:	1541
	tx packets:	17
	tx retries:	0
	tx failed:	0
	rx drop misc:	13
	signal:  	-84 dBm
	signal avg:	-84 dBm
	tx bitrate:	6.0 MBit/s
	tx duration:	0 us
	rx bitrate:	6.0 MBit/s
	rx duration:	0 us
	expected throughput:	8.789Mbps
	mesh llid:	0
	mesh plid:	0
	mesh plink:	ESTAB
	mesh airtime link metric: 911
	mesh connected to gate:	no
	mesh connected to auth server:	no
	mesh local PS mode:	ACTIVE
	mesh peer PS mode:	ACTIVE
	mesh non-peer PS mode:	ACTIVE
	authorized:	yes
	authenticated:	yes
	associated:	yes
	preamble:	long
	WMM/WME:	yes
	MFP:		no
	TDLS peer:	no
	DTIM period:	2
	beacon interval:100
	connected time:	203 seconds
	associated at [boottime]:	23.836s
	associated at:	1700600258334 ms
	current time:	1700600460875 ms
root@mesh-10-3:~# 

Show and 'dump' a path of all connected mesh nodes: (example shows to get to node 84:25:3f:87:fc:b6, you will need to 'hop' through 1c:bc:ec:1b:2a:87, thus proving the mesh is working)

root@mesh-10-3:~# iw wlan0 mpath dump
DEST ADDR         NEXT HOP          IFACE	SN	METRIC	QLEN	EXPTIME		DTIM	DRET	FLAGS	HOP_COUNT	PATH_CHANGE
1c:bc:ec:1b:2a:87 1c:bc:ec:1b:2a:87 wlan0	0	911	0	0	0	0	0x10	1	1
84:25:3f:87:fc:b6 1c:bc:ec:1b:2a:87 wlan0	4	1017	0	0	0	0	0x14	2	4

To start mesh on every boot, a system service (read more on google) can be setup or a simple /etc/rc.local script like so:

sleep 2s
iw reg set US && ifconfig wlan0 up &&  ifconfig eth0 down && ifconfig wlan0 192.168.10.3
sleep 2s
wpa_supplicant -i wlan0 -c /etc/wpa_supplicant.conf -dddd &
exit 0

Adhoc / IBSS Mode

Adhoc / IBSS Mode may only be supported with specific driver versions

Troubleshooting

  1. Ensure the device can be seen on the USB bus:
    # lsusb -d 0x2beb:0x0146
    Bus 001 Device 003: ID 2beb:0146  
    
  2. Ensure the spi_ft232h driver is loaded
    # lsmod | grep ft232
    spi_ft232h             24576  0
    # dmesg | grep ft232
    [    7.555554] usbcore: registered new interface driver spi_ft232h
    
  3. Ensure the spi_ft232h driver has registers a SPI bus:
    # ls -l /sys/class/spi_master/ | grep ft232h
    lrwxrwxrwx 1 root root 0 Aug 31 20:13 spi3 -> ../../devices/platform/soc@0/soc@0:bus@32c00000/32e50000.usb/ci_hdrc.1/usb1/1-1/1-1.3/1-1.3:1.0/spi-ft232h.0/spi_master/spi3
    
  4. Ensure the there is a wireless interface in /sys/class/net:
    # ls /sys/class/net
    eth0  eth1  lo  wlan0
    
  5. Possible regulatory domain issue:
    Because there is not country set in the target, the target asserts. As was shown below and given here again:
    [177933905] ASSERT(0) at CheckNUpdateCHTableByVif() in umac/umac_s1g_channel.c, 1033
    or
    [Error] CC is 00 or 99. Skip loading BD and setting CC
    

It is mandatory to set the regulatory domain every boot: (example shows for USA)

iw reg set US 
  1. Verify the cli_app can talk to the GW16146 module:
    # cli_app show version
    Newracom Firmware Version        : 01.05.00
    gerrit/master                    : 69f978e
    OK
    
    
  2. Device sleeping
    [Error] the target device cannot respond while deep sleep.
    
    Be sure the regulatory domain is set as describe above and the interface is brought up afterwards with the following command:
    ifconfig wlan0 up #assuming wlan0 is your GW16146
    

Hardware

The Mini-PCIe connector on the GW16146 uses the USB channel only for communicating to the 802.11ah module. See below schematic for the connector.

Mini-PCIe Schematic

J1 Test Debug Header

J1 is a header that is not loaded by default but can be loaded on 100 piece or more orders.

This header can allow for a direct UART connection to the SX-NEWAH chip.

Pin Function
1 3.3VDC
2 MODE
3 UART_TX
4 UART_RX
5 Ground

Last modified 4 months ago Last modified on 08/08/2024 10:33:10 PM

Attachments (7)

Download all attachments as: .zip

Note: See TracWiki for help on using the wiki.