WiFi for an Nvidia Jetson TK1
I recently had the privilege of attending Nvidia’s GPU Technology Conference, where due to the generosity of a friend and colleague, I came into possession of a Jetson TK1 board; while he’s been working on more useful things with his Jetsons, I’ve just been tinkering with mine, adding a mini PCI-E wifi adapter, for example. Here’s what I did to get that working.
Our home isn’t wired for ethernet, so adding a wireless card to the Jetson made sense for ease of access. We have an 802.11AC-capable base station, so I chose the Intel 7260 which supports A/B/G/N/AC. Intel also has a decent track record when it comes to Linux support. Initially, I did not purchase any antennas; that was a mistake. Without them, I was unable to connect to our network, so if you’re thinking of using this card I’d strongly suggest going ahead and getting a pair of antennas too. As suggested here, you’ll need two pigtail adapters to connect the tiny antenna ports on the card itself to a standard threaded antenna mount, then a pair of antennas like these.
When you go to mount the card, you might notice it doesn’t come with any screws, and without them the card won’t lie flush with the board. I thought I’d bite the bullet and get the “official” screws from Intel to be sure I had the correct size, but don’t bother, those seem to have the wrong threads for the Jetson. I still haven’t found the correct size, but the Intel screws thread just far enough to keep it from popping up.
Once the hardware was installed, everything was pretty straightforward using the latest L4T (21.3) and (almost) worked out of the box. If you boot up with the card installed and check dmesg
, looking for any lines containing iwlwifi
, you’ll probably see a warning about lack of firmware. The easiest way to get the necessary firmware is to
ubuntu@tegra-ubuntu:~$ sudo apt-get install linux-firmware
but you can also get it from kernel.org. After installing the linux-firmware
package, you should find some new files in /lib/firmware
:
ubuntu@tegra-ubuntu:~$ ls /lib/firmware/iwlwifi-*
/lib/firmware/iwlwifi-1000-5.ucode /lib/firmware/iwlwifi-5150-2.ucode
/lib/firmware/iwlwifi-100-5.ucode /lib/firmware/iwlwifi-6000-4.ucode
/lib/firmware/iwlwifi-105-6.ucode /lib/firmware/iwlwifi-6000g2a-5.ucode
/lib/firmware/iwlwifi-135-6.ucode /lib/firmware/iwlwifi-6000g2a-6.ucode
/lib/firmware/iwlwifi-2000-6.ucode /lib/firmware/iwlwifi-6000g2b-6.ucode
/lib/firmware/iwlwifi-2030-6.ucode /lib/firmware/iwlwifi-6050-5.ucode
/lib/firmware/iwlwifi-3160-7.ucode /lib/firmware/iwlwifi-7260-7.ucode
/lib/firmware/iwlwifi-3160-8.ucode /lib/firmware/iwlwifi-7260-8.ucode
/lib/firmware/iwlwifi-3160-9.ucode /lib/firmware/iwlwifi-7260-9.ucode
/lib/firmware/iwlwifi-3945-2.ucode /lib/firmware/iwlwifi-7265-8.ucode
/lib/firmware/iwlwifi-4965-2.ucode /lib/firmware/iwlwifi-7265-9.ucode
/lib/firmware/iwlwifi-5000-5.ucode
And one short reboot later, the iwlwifi
module should now be satisfied:
ubuntu@tegra-ubuntu:~# dmesg | grep iwlwifi
[ 9.441308] iwlwifi 0000:01:00.0: loaded firmware version 22.1.7.0 op_mode iwlmvm
[ 9.664570] iwlwifi 0000:01:00.0: Detected Intel(R) Dual Band Wireless AC 7260, REV=0x144
[ 9.664658] iwlwifi 0000:01:00.0: L1 Enabled; Disabling L0S
[ 9.664898] iwlwifi 0000:01:00.0: L1 Enabled; Disabling L0S
[ 9.788834] iwlwifi 0000:01:00.0: NVM section 0 read completed
[ 9.788957] iwlwifi 0000:01:00.0: NVM section 1 read completed
[ 9.789072] iwlwifi 0000:01:00.0: NVM section 4 read completed
[ 9.789193] iwlwifi 0000:01:00.0: NVM section 5 read completed
[ 12.331778] iwlwifi 0000:01:00.0: L1 Enabled; Disabling L0S
[ 12.332022] iwlwifi 0000:01:00.0: L1 Enabled; Disabling L0S
If all goes well, you should (automagically) have a new network device, iwlan0
. This can be seen in ifconfig
or NetworkManager, via the command-line interface nmcli
:
ubuntu@tegra-ubuntu:~$ nmcli dev
DEVICE TYPE STATE
eth0 802-3-ethernet connected
wlan0 802-11-wireless disconnected
At this point, we can use nmcli
to connect to a wireless network, which is handy if you (like me) are interacting with the Jetson from a terminal interface instead of the desktop GUI. All it should take is something like this:
nmcli dev wifi connect <YOUR_SSID_HERE> password <YOUR_KEY_HERE>
If this works, nmcli dev
should now report connected
for wlan0
; alternatively you can see some other details using iwconfig
:
ubuntu@tegra-ubuntu:~$ iwconfig wlan0
wlan0 IEEE 802.11abgn ESSID:"Euclid"
Mode:Managed Frequency:2.452 GHz Access Point: 88:1F:A1:32:8B:7A
Bit Rate=1 Mb/s Tx-Power=27 dBm
Retry long limit:7 RTS thr:off Fragment thr:off
Encryption key:off
Power Management:on
Link Quality=57/70 Signal level=-53 dBm
Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0
Tx excessive retries:0 Invalid misc:0 Missed beacon:0
And that’s really all there was to it. I took several missteps trying to manually configure the network, wpa_supplicant
and the like before finding the easier way using NetworkManager. Also, an antenna of some kind seems to be required — without the antennas mentioned above I was never able to make a successful connection. Hopefully this information will save you some time by avoiding the same mistakes.