Cross compilation of a Kernel module on Ubuntu for Raspbian

The D-Link DWA-131 WiFi dongle is not supported out of the box on Raspbian, a compilation is required.
You have two options : Compile on the Pi or cross-compile on a other machine. I prefer to cross-compile as it’s faster and easier : you avoid to install the compilation tools and download huge sources on a small SD card…
compilation-preparation

1. Step1 : On the Raspberry Pi

1.1. Dongle information

>lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 2001:3319 D-Link Corp.

1.2. Information needed

Get the firmware hash:

FIRMWARE_HASH=$(zgrep "* firmware as of" /usr/share/doc/raspberrypi-bootloader/changelog.Debian.gz | head -1 | awk '{ print $5 }')

Print it :

echo $FIRMWARE_HASH

Result :

3442862c10fab68c2e88d660d2e69c143bb1f00c

Get the kernel hash:

KERNEL_HASH=$(wget https://raw.github.com/raspberrypi/firmware/$FIRMWARE_HASH/extra/git_hash -O -)

Print it :

echo $KERNEL_HASH

Result :

ca312f557513e057c456598528e663fe9d009498

We need to load the configs module to be able to retrieve the configuration later on:

sudo modprobe configs

And finally your Kernel version :

uname -r

Result :

4.1.17+

Copy paste these information somewhere in a text file, we’ll use it later on.

2. Step 2 : On the compilation server

2.1. Preparation

Prepare a folder to work in :

mkdir ~/raspberrypi
export BASEDIR=~/raspberrypi
cd $BASEDIR

Create variables based on what we found earlier :

FIRMWARE_HASH=3442862c10fab68c2e88d660d2e69c143bb1f00c
KERNEL_HASH=ca312f557513e057c456598528e663fe9d009498

2.2. Kernel source

Download and extract the kernel source :

wget https://github.com/raspberrypi/linux/archive/$KERNEL_HASH.tar.gz
tar -xzf $KERNEL_HASH.tar.gz
export KERNEL_SRC=$BASEDIR/linux-$KERNEL_HASH

2.3. Kernel configuration

Download the configuration from the raspberry pi. The IP should be the IP of the raspberry pi :

scp pi@192.168.137.250:/proc/config.gz .

2.4. Compilation tools

Download the compilation tools :

cd $BASEDIR
git clone git://github.com/raspberrypi/tools.git
export CCDIR=$BASEDIR/tools/arm-bcm2708/arm-bcm2708-linux-gnueabi/bin
export CCPREFIX=$CCDIR/arm-bcm2708-linux-gnueabi-

2.5. Kernel preparation

Prepare the Kernel source :

cd $KERNEL_SRC
zcat $BASEDIR/config.gz > .config
wget https://raw.githubusercontent.com/raspberrypi/firmware/$FIRMWARE_HASH/extra/Module.symvers
ARCH=arm CROSS_COMPILE=${CCPREFIX} make oldconfig
ARCH=arm CROSS_COMPILE=${CCPREFIX} make prepare

2.6. Driver source

Download the driver source :

cd $BASEDIR
git clone https://github.com/romcyncynatus/rtl8192eu.git
cd rtl8192eu/

2.7. Driver compilation

Compilation :

make ARCH=arm CROSS_COMPILE=$CCPREFIX KVER=4.1.17+ KSRC=$KERNEL_SRC 

First error :

make[1]: Entering directory '/home/ron/raspberrypi/linux-ca312f557513e057c456598528e663fe9d009498'
  CC [M]  /home/ron/raspberrypi/rtl8192eu/core/rtw_cmd.o
cc1: error: -Werror=date-time: no option -Wdate-time
scripts/Makefile.build:258: recipe for target '/home/ron/raspberrypi/rtl8192eu/core/rtw_cmd.o' failed
make[2]: *** [/home/ron/raspberrypi/rtl8192eu/core/rtw_cmd.o] Error 1
Makefile:1384: recipe for target '_module_/home/ron/raspberrypi/rtl8192eu' failed
make[1]: *** [_module_/home/ron/raspberrypi/rtl8192eu] Error 2
make[1]: Leaving directory '/home/ron/raspberrypi/linux-ca312f557513e057c456598528e663fe9d009498'
Makefile:1455: recipe for target 'modules' failed
make: *** [modules] Error 2

Edit the Makefile :

vi $BASEDIR/rtl8192eu/Makefile

Change the following line :

EXTRA_CFLAGS += -Wno-error=date-time

By :

#EXTRA_CFLAGS += -Wno-error=date-time

Second error :

  CC [M]  /home/ron/raspberrypi/rtl8192eu/os_dep/linux/rtw_android.o
/home/ron/raspberrypi/rtl8192eu/os_dep/linux/rtw_android.c: In function 'rtw_android_cmdstr_to_num':
/home/ron/raspberrypi/rtl8192eu/os_dep/linux/rtw_android.c:345:3: error: implicit declaration of function 'strnicmp' [-Werror=implicit-function-declaration]
cc1: some warnings being treated as errors
scripts/Makefile.build:258: recipe for target '/home/ron/raspberrypi/rtl8192eu/os_dep/linux/rtw_android.o' failed
make[2]: *** [/home/ron/raspberrypi/rtl8192eu/os_dep/linux/rtw_android.o] Error 1
Makefile:1384: recipe for target '_module_/home/ron/raspberrypi/rtl8192eu' failed
make[1]: *** [_module_/home/ron/raspberrypi/rtl8192eu] Error 2
make[1]: Leaving directory '/home/ron/raspberrypi/linux-ca312f557513e057c456598528e663fe9d009498'
Makefile:1455: recipe for target 'modules' failed
make: *** [modules] Error 2

Edit the rtw_android.c:

vi $BASEDIR/rtl8192eu/os_dep/linux/rtw_android.c

Change the following line :

if(0 == strnicmp(cmdstr , android_wifi_cmd_str[cmd_num], strlen(android_wifi_cmd_str[cmd_num])) )

By :

if(0 == strncasecmp(cmdstr , android_wifi_cmd_str[cmd_num], strlen(android_wifi_cmd_str[cmd_num])) )

The compilation should be fine now !

2.8. Driver transfer

We’ll use SCP to copy the module (8192eu.ko) on our Raspberry. The IP used here is the Raspberry Pi’s.

scp 8192eu.ko pi@192.168.137.250:~

2. Step 3 : On the Raspberry Pi

After the transfer, the compiled driver should be in your home folder.

Activation :

sudo bash -c 'echo "options 8192eu rtw_power_mgnt=0 rtw_enusbss=0">/etc/modprobe.d/8192eu.conf'
sudo install -p -m 644 8192eu.ko /lib/modules/4.1.17+/kernel/drivers/net/wireless
sudo depmod 4.1.17+

Reboot:

sudo reboot

After a reboot, the module is loaded

>modinfo 8192eu
filename:       /lib/modules/4.1.17+/kernel/drivers/net/wireless/8192eu.ko
version:        v4.3.8_12406.20140929
author:         Realtek Semiconductor Corp.
description:    Realtek Wireless Lan Driver
license:        GPL
srcversion:     AFD4F17337FAE61BE3C568D
alias:          usb:v2001p3319d*dc*dsc*dp*ic*isc*ip*in*
alias:          usb:v0BDAp818Cd*dc*dsc*dp*icFFiscFFipFFin*
alias:          usb:v0BDAp818Bd*dc*dsc*dp*icFFiscFFipFFin*

And WiFi available :

wlan0     Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX
          inet addr:192.168.1.25  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::5326:231f:6f24:cb1c/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:11598 errors:0 dropped:9 overruns:0 frame:0
          TX packets:209 errors:0 dropped:1 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1841333 (1.7 MiB)  TX bytes:26125 (25.5 KiB)

Leave a Reply

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