USB WiFi for Debian Jessie on 410c

Has anyone successfully gotten a USB Wifi dongle working on the DB410c running Jessie?

It seems that arm64 drivers for many chipsets are few and far between. Any help is appreciated.

Regards,
John V. Busch

hi,

the driver for USB wifi dongle shouldn’t be dependent on the underlying architecture (e.g. arm64). I would say that if you find a USB wifi dongle that works with “linux” on your PC, it will work on the DB410c as well. Assuming the relevant USB driver is enabled in the kernel config, but that’s a minor detail, and that is trivial to fix.

I have two; one is an Edimax (Realtek) that I have successfully used on Debian on a BBB, the other is the “official” (whatever that means) Raspberry PI dongle that is a Broadcom chipset.

I have a successful build working of the kernel-16.06 from the QC/96/Linaro/DB latest repository.

Could you direct a poor, potentially incompetent noob such as my self as to exactly what change in what KConfig file would build the appropriate kernel modules for either of these dongles?

I’m from a FreeBSD/Solaris background and building Linux kernels is a new thing for me for the most part, so your help would be very much appreciated.

Can you share the output of lsusb command? We need to know in more detail which you have.

Regarding finding a config option, USB WiFi drivers are found in multiple places within the config tree. In particular many of the realtek ones are not at full kernel quality so they at found in drivers/staging (and at not enabled by default).

Let me follow up that with a possible self help approach (John: I’m replying to you but folks might also arrive at this thread via Google so I’m being a little more detailed and formal than I would normally).

Firstly use lsusb to grab the VID/PID of the adapter:

birch$ lsusb > a; watch -g lsusb; lsusb > b; diff a b; rm a b
7a8
> Bus 002 Device 030: ID 0bda:8179 Realtek Semiconductor Corp. RTL8188EUS 802.11n Wireless Network Adapter

In this case its easy because lsusb shows us the part number of the underlying realtek device. If you just get a VID/PID (0bda:8179 in this case) then you might have to run a couple of google searches to chase down the part number.

Anyhow once you have a part number and know how to build the kernel its time to fire up menuconfig:

birch$ make menuconfig

The Linux config menu system is a very big tree structure and occasionally surprising to beginners. However with a part number we can search. Press / and then type in the numeric portion of the part number (why? numeric value are often the best option since people don’t always quite the part number the same way: RTL-8188-EUS, RTL8188EU, RTL).

With luck this leads you to the right config option and instructions on why to find it and what dependancies must be met for it to be shown to you:

┌────────────────── Search Results ────────────────────┐
│ Symbol: R8188EU [=n]                                 │
│ Type  : tristate                                     │
│ Prompt: Realtek RTL8188EU Wireless LAN NIC driver    │
│   Location:                                          │
│     -> Device Drivers                                │
│ (1)   -> Staging drivers (STAGING [=y])              │
│   Defined at drivers/staging/rtl8188eu/Kconfig:1     │
│   Depends on: STAGING [=y] && WLAN [=y] && USB [=y]  │
│               && CFG80211 [=m]                       │   
│   Selects: WIRELESS_EXT [=n] && WEXT_PRIV [=n]       │
│                                                      │
│                                                      │
│ Symbol: RTL8188EE [=n]                               │
│ Type  : tristate                                     │
│ Prompt: Realtek RTL8188EE Wireless Network Adapter   │
│   Location:                                          │
├──────────────────────────────────────────────( 49%)──┤
│                      < Exit >                        │
└──────────────────────────────────────────────────────┘

If the search doesn’t yield results then try fiddling about with the search terms until you get something that looks right: 811x, 81xx, RTL8

From here it should be a simple matter of following the Location: trial and enabling the feature (although it any of the Depends on: are ‘n’ then you will have to fix that first).

Daniel,

Thank you for these detailed instructions. I was able to get a Realtek driver/module built that I believe is the correct one. My lsusb output is this:

Bus 001 Device 008: ID 7392:7811 Edimax Technology Co., Ltd EW-7811Un 802.11n Wireless Adapter [Realtek RTL8188CUS]

However not only does 8188 only yield the result that you have posted above which seems to be not supported, it also seems that according to this link (http://elinux.org/RPi_edimax_EW-7811Un) that this dongle is actually using the rtl8192cu.ko module.

Therefore I selected that module and performed a full kernel build.

After doing so I followed the Linaro instructions to create a boot image; and went to use fastboot to boot/install that image on my DB410C. Well, I have not been able to get the DB bootloader into Fastboot mode in order to try that. I have made sure the DIP switches are all set to 0 (not SD boot), that there is no SD card, and that I have a micro USB cable plugged into my workstation. No matter all of that, holding C4 down only causes the board to repeatedly reboot during the boot process, and letting go of C4 causes it to just boot normally. I have no idea why.

Therefore, I downloaded the latest Linaro Debian SD card image, which is the same kernel version that I have the source checked out from on the machine I am using to cross compile the kernel. I used that image to install a new boot image (full system image) with the newest kernel. I then did a “make modules” after setting my ARCH and CROSS_COMPILE env variables to be arm64 and the Linaro CC tools respectively. I was able to produce a rtl8192cu.ko file this way. I proceeded to copy this file to /lib/modules/4.4.9-linaro-lt-qcom/kernel/drivers/net/wireless/rtlwifi/rtl8192cu on the DB410C, performed a “depmod -a” and attempted a “modprobe rtl8192cu”. When performing the modprobe I got errors stating that there were un-exported symbols. I have found these symbols suing dmesg and may attempt now to add those to Module.symvers per this SO post (http://stackoverflow.com/questions/7513184/unknown-symbol-in-while-loading-a-kernel-module).

I’m wondering if I’m going down the right path? I also have a dongle with a Broadcom BCM43143 chipset (https://www.amazon.com/gp/product/B014HTNO52/ref=od_aui_detailpages00?ie=UTF8&psc=1). That chipset seems to also be unsupported.

This is all part of a commercial project for which I am a bit against the wall on now, so I may just use a USB Ethernet adapter and a Ethernet to Wifi adapter to get the job done but I was really hoping to avoid that. If you would be so kind as to offer any additional advice, it would be greatly, greatly, appreciated.

I am very happy to report that I have this working!

I was able to get the board into FastBoot mode. The key seems to be in a light touch. I was holding S4 (correction from calling it C4 above) far too long.

I was able to flash my boot image, load the realtek firmware via apt-get, and Voila!

For anyone else in this situation one thing to note is that the “boot” option of fastboot does not seem to copy your kernel modules over, however the “flash” option does. Which makes sense as I assume “boot” just loads the kernel to RAM.

My only other complaint is the awkward WiFi device name (wlx74da382b3229 vs. wlan1), but I’m sure I can change that if I want.

Thank you again Daniel as well as ndec, this was very important to me personally to accomplish so I am ever grateful for your valuable insight. Hopefully the thread also proves useful to others in the future.

Hi John

Really great to hear that you got this working. Two minor comments on the above in case you ever revisit this, or a similar, topic.

Firstly, if you ever get a choice about which kernel modules to enable and aren’t sure which to pick, it is generally safe to enable both! If they are compiled as modules they will have very little overhead (except at compile time).

Secondly, I think BCM43143 is supported by the brcmfmac driver.

Hey Guys,

thank you very much for your posts. Thanks to the thread I got my Edimax Wifi working, too.
One important question for me is: Why this is working only when I mark the rtlwifi drivers
in kernel as [*] ? When I use building those drivers as modules [M] the DB410c cannot find
the Wifi Dongle. I thought when the boot-db410c.img is flashed via “sudo fastboot flash
boot boot-db410c.img” command, it should get the modules,too ?! (sorry for that kind of noob question)

@ John

You can force the name wlan1 to a specific MAC address of your Edimax Wifi Dongle by adding following line to
/etc/udev/rules.d/70-persistent-net.rules

# Force Name of rtl8192cu Device to Wlan1
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="74:da:38:2b:32:29", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan1"

hi,

the boot image does not include the kernel modules, it only includes the kernel binary and the init ramdisk. So flashing the boot image does not update your kernel modules, which are located in /lib/modules, e.g. in the root file system (and the modules are not added into the init ramdisk neither).

If you built your kernel such that you need to update the modules as well, you need to deploy them on the board and there is no straight forward way to do that. There are a couple of options:

  1. you can do it manually, and copy the .ko files from PC to the board and run depmod -a. That’s ok if you have a couple of ko files, and haven’t done too many changes to the kernel.

  2. you can use the ‘modules_install’ kernel target to create a local /lib/modules/ folder on your PC, and then copy the entire folder on the board.

  3. finally (and this is what I recommend), you can build the linux-image .deb file from your kernel build, then copy the .deb file on the board and install it with dpkg -i linux-image-xxx.deb. This takes a bit more time than #2 and #3 but there are much less chances to get something wrong… to do that:

  • in your kernel tree, patch it the way you want, configure it using ‘defconfig distro.config’ and any additional changes that you need/want
  • build the Image with “make Image”
  • build the .deb file with “make bindeb-pkg”. After some time you will get a couple of .deb files from the kernel (debug, kernel headers, linux-image, …) the one we want is linux-image-<kernel version><pkg version>.deb. This deb file contains all your modules, you need to copy this file on the board, and then on the board:
    dpkg -i linux-image-<kernel version>
    <pkg version>.deb

then you can reboot with the boot image that corresponds to the same kernel you compiled.

I don’t think this is documented anywhere… i guess i should add that into the release notes…

Note that you need to install the package ‘fakeroot’ on your PC before building the .deb file.

Also, if you need some devices to be supported and it’s missing from our default build, please open a bug for that (check the bugzilla link in the release notes), if the driver exists and the fix is just to enable a couple of Kconfig modules, we can get that done for the next release…

Hi Nicolas,

thank you very much for your time to look into that issue.

[1 - Copy Modules / Install Modules]
I also tried to copy the module rtl8192cu.ko to the DB410c
/lib/modules/4.4.9-linaro-lt-qcom/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8192cu/
but i got an error while loading the module after performing “depmod -a”

modprobe: ERROR: could not insert 'rtl8192cu': Unknown symbol in module,or unknown parameter (see dmesg)

Maybe it is not only that “one” rtl8192.ko file what I have to copy, right?

[2 - Use the original realtek driver for rtl8192cu to get AP mode working]
The way which John used to go is a working way, but not my favourite one. I usually
prefer the original rtl8192cu driver from the realtek.com download page, because AP
mode and some more stuff is working then. But there are two problems:

First, when I try to compile the driver on the DB410c itself, I run into that
“missing headers” Problem. You already pointed to that issue here:

Incomplete Headers

But I have no idea how to use your builddeb patch to fix this.

Second, when I try to compile the original driver into the
kernel directly it works and I get an “enx<MAC-Address>” device after
performing “sudo iwconfig” but with no wireless
extensions. Something I am also missing in that case. How I got the
kernel compiled with the original driver I can explain in detail (maybe
in a new thread ?) Whats your opinion?

Best Regards from Germany

hi,

#1 , yes, you probably need more than 1 .ko. I would recommend not going this path for now.

#2 when you say ‘original’ driver, you mean an out of tree driver source code, right? If you are missing headers, you can get the linux-header package from http://builds.96boards.org/snapshots/dragonboard410c/linaro/debian/113/. As I said in the other post, the ‘builddeb’ patch was pushed in our tree now, so this problem is now fixed in our most recent build. So download the .deb file and install it with dpkg -i, you should be able to go past the missing header issue.

Also, it might be a good test to try to use this dongle on a Linux PC too, so compare if you get similar results.

Hi Again,

[1] bring Modules to DB410c using “make bindeb-pkg”
This is perfectly working. Big thanks to you for that hint. Important is to specify the Kernel release. So in my case I needed to execute
make bindeb-pkg KERNELRELEASE=4.4.9-linaro-lt-qcom
After flashing the new boot image, downloading the resulting *.deb files to DB410c and installing them I got the Wifi dongle working with the “in-tree” drivers.
It would be very good if you can add this part for beginners like me to the “Release Notes”. Think this is a big help for those who start with their own kernel builds.

[2] You are right, I am talking about an out of tree driver for RTL8192CU / RTL8188CU. Those Dongles based on that chip are in nano size, easy to get everywhere and very cheap. So I prefere them for development on embedded devices. I tested that out of tree driver from realtek.com on several hardware (Toradex Apalis-T30, many Linux Desktop´s / Notebooks, Raspberry Pi) and there were no problem. Specially when you want to use software like “hostapd” for access point mode. With the in-tree driver this is not working.
Sidenote The Raspberry Pi uses that out of tree driver in their default kernel build.
If somebody want to have a look at this out of tree driver download it at the RTL8192CU tag from:
out of tree driver from realtek.com

Next step for me is trying to compile the out of tree driver into the DB410c kernel. If I got this working, I will post a little tutorial here (if that is ok).

Best Regards :wink:

Hi:

I also would like to use a USB WLAN device with my 410c. When I plug in the USB device, and execute lsusb command I can see the device. It’s an Ralink RT3572. I use these 5gHz USB dongles all the time on RPi devices and they work very well. It uses the rt2800 driver. On my 410c, I have Debian installed (installed via flashing the eMMC from an SD card I got from 96 Boards). When I execute sudo ifconfig, I don’t see the WLAN card. This makes sense, since when I browse to /lib/modules/4.4.9-linaro-lt-qcom/kernel/drivers/net/wireless directory I only see the ath driver and no rt2x00 directory that I’m used to seeing under Raspbian and Ubuntu.

So… what is the simplest/quickest way to get the rt2800 driver installed? :slight_smile: Do I really need to rebuild the kernel? I did try apt-get install ralink-firmware which brought something down but no luck in getting WLAN device working.

FYI: This is day #1 for me w/ the 410c. I have some background w/ compiling ubuntu, debian, and raspbian kernels but mostly from sources I just pull via

sudo apt-get build-dep linux-image-$(uname -r)
apt-get source linux-image-$(uname)

and then just making my tweaks and compiling right on the device using fakeroot. It’s not 100% clear to me yet if that’s really needed just to get the wlan driver here or not? Please advise best next steps for me if you can!

Regards.

Did you spot the release notes on the build page (if not then scroll down :wink: )?

That should provide all the information you need to rebuild the kernel and, combined with the replies above, to enable any of the drivers that are included with the kernel (including rt2x00).

If you run into problems then you know where we are!

Hello Daniel,

Thank you for the pointer to the build page. I have been able to recompile the kernel, but I am having issues. Perhaps someone can look at my steps and help point out what I could be doing wrong?

I get the kernel sources ready to compile like this.

git clone -n http://git.linaro.org/landing-teams/working/qualcomm/kernel.git
cd kernel
git checkout -b kernel-16.06 debian-qcom-dragonboard410c-16.06
export ARCH=arm64
export CROSS_COMPILE=/home/chris/Downloads/gcc-linaro-4.9-2014.11-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
make defconfig distro.config

Then I use the make menuconfig utility to add the references to the Ralink driver.

Then I build via

make -j4 Image dtbs KERNELRELEASE=4.4.9-linaro-lt-qcom
make -j4 modules KERNELRELEASE=4.4.9-linaro-lt-qcom

Then I package up the kernel in a .deb file via:
make bindeb-pkg

I then transfer the linux-image-4.4.9_4.4.9-X_arm64.deb file over to my 410c. On the 410c, I then execute:

sudo dpkg -i linux-image-4.4.9_4.4.9-8_arm64.deb
sudo reboot

I’ve tried this a few times to make sure I didn’t miss any steps, but the USB WLAN card never is detected as network card, even though I see it as a device when I execute lsusb.

Am I missing something obvious here (I hope)?

Hey Piper,

specify your kernel release as I posted above when you make your bindeb-pkg.
make bindeb-pkg KERNELRELEASE=4.4.9-linaro-lt-qcom

Hope that helps :wink:

Hi Piper,

I hope David’s comment helps.

If not then we’ll need a broad range of diagnostic clues to figure out where things are going wrong for you. Something like letting us know how you “add[ed] the references to the Ralink driver”, whether you can modprobe rt2800usb, what changes you can see in /lib/modules/$(uname -r)/kernel/net/wireless after installing the new packages and the output of uname a.

Hi David and Daniel,

Thanks for the pointer on including the kernel release name when building the .deb files. However, this didn’t solve my issue. Here is some more data, hopefully you guys can help me figure out what I’m doing wrong. I’m sure it’s simple.

Daniel ask how I added the reference to the rt2800usb driver: I used the make menuconfig command, which brings up a TUI utility. I then browse Device Drivers -> Network device support -> wireless LAN -> Ralink driver support -> and finally select the Ralink rt27xx/rt28xx/rt30xx (USB) support option. I make sure to save the changes back to the .config file and then exit the utility.

I appear to be successfully building the kernel image using


make -j4 Image dtbs KERNELRELEASE=4.4.9-linaro-lt-qcom
make -j4 modules KERNELRELEASE=4.4.9-linaro-lt-qcom

And then make my .deb files via:
make bindeb-pkg KERNELRELEASE=4.4.9-linaro-lt-qcom

I then transfer all the deb file (except the debug linux-image file as I don’t believe it’s required) to my 410c. Then on the 410c, in a terminal window I switch to a directory that contains only my newly transferred deb files and run:
sudo dpkg -i linux*.deb
This appears to be successful. Then I reboot and don’t seem to have any rt2800usb support still. When I look in /lib/modules/4.4.9-linaro-lt-qcom/kernel/drivers/net/wireless I only see the ath directory, I’d assume I should see Ralink or something similar. Also, when I run uname -a on the 410c, I get:
Linux linaro-alip 4.4.9-linaro-lt-qcom #1 SMP PREEMPT Thu Jun 30 21:34:48 UTC 2016 aarch64 GNU/Linux

And I think I should see today’s date. Under /boot/ I do see vmlinuz-4.4.9-linaro-lt-qcom with today’s date.

So: Feels like I am missing some step? As I mentioned before, when I’ve had to build kernels for ubuntu x86-64 and for Raspbian, I’ve used a procedure I found using fakeroot and dpkg which has worked for me. I am realizing now that I probably really don’t know what that built process is really doing. I just make my changes to some .c files, build, deploy, and move on with life with my changes working. So any help here with getting Ralink support working on this 410c running Debian would be really helpful! Also, learning a bit more about kernel building and deploying isn’t going to hurt me either. :slight_smile:

Thank you!

hi,

the fact that you don’t see the right build date makes me believe that you are not booting the newly built kernel… are you sure that you reboot the board with the newly built kernel? E.g. have you rebuilt the boot image as well? Even though the “Image” file in deployed in /boot it is not used during the boot, and the kernel “Image” file which is used for the boot is the one in the boot.img which is either flashed in the ‘boot’ partition or launched with “fastboot boot” command. As said earlier the problem with the boot image is that it doesn’t contain the modules… hence we have to make this special/cumbersome deployment in 2 steps…

On your PC you can inspect the content of the .deb file with:

dpkg -c linux-image-xxx.deb

And you can check if you module .ko file is there or not. If it’s not there, then something is wrong in your build at least.