You too can have a sub-$200 .11ax client

I need to start this guide off with a few disclaimers: I do work for NVIDIA. And while I’m a decent enough wireless engineer, I’m certainly not an expert on exactly how our embedded products work (but I do know where those experts sit). This is also not a sponsored post – I paid for all of the hardware involved except for the NIC (we don’t get a discount – no free 2080Tis for anyone). But I honestly think the Nano is a great little maker board and this has been a really fun project.

Also, this was certainly a team effort with my friend Robert Boardman. Disclaimers for him: He works for Mist. No, Mist didn’t sponsor this. No, Robert will not buy you a 3D printer. (I already asked, he’s got quite a few of them.) For my Cisco friends who are likely reading this: Relax, we’re just friends.

I know that some of us right now have 802.11ax-capable APs (we’ll leave ‘Wi-Fi 6’ for another day). But having APs with no clients isn’t fun, and for testing (and fun) having a real AX client or two is awesome. If you get two of them you have a chance of seeing OFDMA over the air.

At the moment you can get the Galaxy S10, which is pretty expensive, or you can get an AX200 from Intel and stick it in a laptop. That’s also a thing. But when I saw how the Jetson Nano has an M.2 slot it got me thinking. The 8265 works well with it but we wondered about getting the AX200 to work. Turns out it was pretty easy.

Here’s the bare minimum of what you need.

NVIDIA Jetson Nano
Intel AX200 NIC
MicroSD Card – bigger than you need, but it was on sale
Power supply
Antennas
Bag of jumpers (You really only need one, but no one sells 1).

Now we think that list is just the bare minimum. Since our goal was to create a portable AX200 client/sniffer we wanted to have input/output solutions so we also recommend:

Folding keyboard with trackpad
5″ capacitive touchscreen

Without the keyboard and monitor the BOM is at $185.45. With the keyboard and monitor it’s $265.43. All prices are without tax and shipping.

Getting Started

The Jetson Nano can be powered by a 5V 2A USB power supply, but we used the 5V 4A barrel jack option. The reason that the jumper bag is on the list is that you do need to connect jumper J48 for the DC power input to work. So first thing, bridge the J48 jumper. It’s on the left side of this diagram towards the middle, below the camera connector:

Image credit: NVIDIA

If you go through the official NVIDIA getting started guide, you’ll note that the Nano can be powered by USB. However, in the testing that Robert and I did, the Nano is much happier when being used as a desktop if it has full power. You can find a discussion about the usage of DC power here. Also, with the DC power option we were able to plug the USB of the monitor into the Nano to get power – powering the Nano via USB the monitor was unhappy. As a side bonus, powering the monitor from the Nano makes it a touchscreen. And it eliminates the need for two plugs.

Next, you’re going to want to prepare the SD Card. Download the image and use Etcher to write it to the SD card. If you’ve never done it before NVIDIA has pretty good instructions on how to do it for folks on Linux, Mac, and Windows.

Now it’s time to install the AX200. This is best explained via video and I think this one does a pretty good job. As Wi-Fi engineers we all know that the antenna connectors are a challenge. The antennas are from NVIDIA’s open source robot Kaya, but the 35cm cables are a bit long. I’m on the lookout for an antenna package with a shorter cable option.

Now you’re ready to boot everything up! Connect the USB from your keyboard/mouse to the USB ports, connect the HDMI and USB to the monitor, wired ethernet, and power. Next thing you know you’ll should be at this screen:

Image credit: NVIDIA

Wi-Fi Drivers

Now that you’ve logged in you will probably note that there’s no sign that the Nano sees the AX200. What you’ll want to do is to build the core45 release of the iwlwifi driver that you can find here. Here are the commands:

git clone --single-branch --branch release/core45 https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/backport-iwlwifi.git
cd backport-iwlwifi/
make defconfig-iwlwifi-public
sed -i 's/CPTCFG_IWLMVM_VENDOR_CMDS=y/# CPTCFG_IWLMVM_VENDOR_CMDS is not set/' .config
make -j4
sudo make install

Now that the iwlwifi driver is up to date and installed, it’s a good idea to install the latest firmware for the ax200.

git clone https://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/linux-firmware.git --branch iwlwifi-fw-2019-07-20 --single-branch
cd linux-firmware/
sudo cp iwlwifi-cc-a0-48.ucode /lib/firmware 


Once both the driver and the firmware are installed then reboot the Nano and you should be up and running.

Just in case…

This is all great, but you have to admit that it’s a bit unwieldy. If you happen to be able to do 3d printing (or, in my case, know a master 3d printer such as Robert) there are some nice case options for both the Nano and that monitor. We are currently using this case for the Jetson Nano (note: Don’t try to use the antenna holes on the panel with all the connectors – it will block the DC jack). Robert also printed this case for the monitor and it’s pretty nice. He has some interesting ideas on how to perhaps modify these designs to make things a bit more functional.

Do you even ax bro?

Why yes. Yes we do.

So what now?

At this point we have an 802.11ax client for around $200 (give or take). Up next:

  • Taking packet captures from the CLI and Wireshark
  • Performance testing using iperf3 and IxChariot
  • General ax hacking

What would you like to see? Feel free to leave a comment below.

18 Replies to “You too can have a sub-$200 .11ax client”

  1. I would loved this device as a capturing device for 11ax.
    I have tested capturing with Cisco 9115 in Sniffer mode, but when those frames comes to the remote packet analyzer client (Wireshark) a lot of the PHY-header information is missing, especially the RadioTap header

  2. Thank you the installation instruction on how to get the AX200 working.

    Do you have instructions to get Bluetooth working as well?

  3. Great blog, thanks!

    I immediately googled for Jatson Nano drivers for the AX200 as soon as I just read it was available.

    What I’d like to see next is whether you can stream 4K 60 content, and what’s the maximum uncompressed video rate you can get into the Nano from a PC or other source.

    A big issue for me is how to get HDMI 2.0 or DP 1.4 inputs to the Nano but if streaming is an option then why not.

    Wireless is more convenient, surely, but video quality is always at odds with compression. So what I’m wondering is just how much actual bandwidth can you send over the AX200, and whether it’s enough to send raw 1080p or higher to the nano w/o any compression.

    1. I don’t see why it couldn’t, but I haven’t really tested that. I just needed something that would do OFDMA (since that works best with multiple clients.)

  4. Hi,John!!Greate Ariticle!!!
    Thank you for the AX200 installation!
    But a big issue is that: The ax200 work well both on Mangaged mode or Monitor mode. But,on the other hand, before install the AX200,my USB Dongle WIFI Adapter worked well, after I install the ax200, my USB Dongle is disapeared! And When I use the Dmesg to show the messages from the OS, It shows a lot errors Like [Unkown symbol ieee80211_XXXXXXX] ,maybe the [mac80211] model is replace by ax2000’s driver,does anyone have the same problem?thanks! and by the way, how can i use the mac80211 model shiped with nano sdk? Thanks a lot! hope can receive your reply! Big Thanks!

  5. Thank you for writing this article. Found this after a couple days of trying to get the AX200 to work on the Nano. Now it is up and connecting! I look forward to seeing more (especially if you get the bluetooth up and running).

  6. Once backport installed it breaks realtek and ralink drivers.
    Any solution?

    [ 5.672113] mt7601u: disagrees about version of symbol ieee80211_start_tx_ba_cb_irqsafe
    [ 5.680331] mt7601u: Unknown symbol ieee80211_start_tx_ba_cb_irqsafe (err -22)
    [ 5.687699] mt7601u: Unknown symbol ieee80211_tx_status_noskb (err 0)
    [ 5.694395] mt7601u: disagrees about version of symbol ieee80211_free_hw
    [ 5.701166] mt7601u: Unknown symbol ieee80211_free_hw (err -22)
    [ 5.707195] mt7601u: disagrees about version of symbol ieee80211_register_hw
    [ 5.714410] mt7601u: Unknown symbol ieee80211_register_hw (err -22)
    [ 5.720753] mt7601u: disagrees about version of symbol ieee80211_get_hdrlen_from_skb
    [ 5.728666] mt7601u: Unknown symbol ieee80211_get_hdrlen_from_skb (err -22)
    [ 5.735710] mt7601u: disagrees about version of symbol ieee80211_wake_queue
    [ 5.742857] mt7601u: Unknown symbol ieee80211_wake_queue (err -22)
    [ 5.749219] mt7601u: disagrees about version of symbol ieee80211_get_tx_rates
    [ 5.756435] mt7601u: Unknown symbol ieee80211_get_tx_rates (err -22)
    [ 5.762983] mt7601u: disagrees about version of symbol ieee80211_send_bar
    [ 5.769852] mt7601u: Unknown symbol ieee80211_send_bar (err -22)
    [ 5.776056] mt7601u: disagrees about version of symbol ieee80211_stop_tx_ba_cb_irqsafe
    [ 5.784112] mt7601u: Unknown symbol ieee80211_stop_tx_ba_cb_irqsafe (err -22)
    [ 5.791330] mt7601u: disagrees about version of symbol ieee80211_queue_delayed_work
    [ 5.799154] mt7601u: Unknown symbol ieee80211_queue_delayed_work (err -22)
    [ 5.806178] mt7601u: disagrees about version of symbol ieee80211_wake_queues
    [ 5.813405] mt7601u: Unknown symbol ieee80211_wake_queues (err -22)
    [ 5.819730] mt7601u: disagrees about version of symbol ieee80211_free_txskb
    [ 5.826740] mt7601u: Unknown symbol ieee80211_free_txskb (err -22)
    [ 5.832970] mt7601u: disagrees about version of symbol ieee80211_alloc_hw_nm
    [ 5.840063] mt7601u: Unknown symbol ieee80211_alloc_hw_nm (err -22)
    [ 5.846398] mt7601u: disagrees about version of symbol ieee80211_tx_status
    [ 5.853317] mt7601u: Unknown symbol ieee80211_tx_status (err -22)
    [ 5.859451] mt7601u: disagrees about version of symbol ieee80211_stop_queue
    [ 5.866458] mt7601u: Unknown symbol ieee80211_stop_queue (err -22)
    [ 5.872686] mt7601u: disagrees about version of symbol ieee80211_stop_queues
    [ 5.879821] mt7601u: Unknown symbol ieee80211_stop_queues (err -22)
    [ 5.886176] mt7601u: disagrees about version of symbol ieee80211_unregister_hw
    [ 5.893461] mt7601u: Unknown symbol ieee80211_unregister_hw (err -22)
    [ 5.901429] mt7601u: disagrees about version of symbol ieee80211_rx_napi
    [ 5.909751] mt7601u: Unknown symbol ieee80211_rx_napi (err -22)

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.