The following page will show how to build your Wi-Fi drivers and configure Realtek mini PCIe card on Ubuntu for ESPRESSObin to get your Wi-Fi up and running. Depending on your order, your ESPRESSObin package should include this PCIe card, but you can order it on Amazon or from Globalscale.
Building Wi-Fi driver
To build Wi-Fi drivers we need to select necessary options and modules in kernel configuration. Similarly to how we did in Ubuntu - initial network configuration, the quicker method is to replace the .config file with a pre-configured .config file which already has these options selected, but we can of course select them manually through menuconfig.
.config file
.config file is located in the top of your kernel source tree and it contains kernel configuration. This file can be configured manually or via menuconfig, make xconfig, make XXX defconfig, make oldconfig and similar make XXXconfig targets in the Linux kernel.
The quickest method of achieving a .config file with afore-mentioned options enabled is to replace the file with an .config that has all these options already enabled.
Download the .config with necessary Wi-Fi modules and options enabled here. Make sure to backup your existing .config file with:
espressobin@buildserver:~/kernel/4.4.8$ cp .config .config_old
before replacing it with the .config you have downloaded on the link above:
espressobin@buildserver:~/kernel/4.4.8$ cp /path_to_downloaded_config/config.nat.realtekwifi .config
Now we can issue kernel and ko modules build with:
espressobin@buildserver:~/kernel/4.4.8$ make -j4
If the build was successful, skip to Transferring to microSD card section.
menuconfig
To build the Wi-Fi driver by manually selecting necessary options go to where you have downloaded your kernel v4.4.8 source tree and issue make menuconfig (make sure you have NETFILTER/IPTABLES/NAT features enabled as shown in Ubuntu - initial network configuration):
espressobin@buildserver:~/kernel/4.4.8$ make menuconfig
and in there we will need to enable the following build options (note that some of the options need to be selected as modules ):
- 1) WLAN
Symbol: WLAN [=y] Type : boolean Prompt: Wireless LAN Location: -> Device Drivers (1) -> Network device support (NETDEVICES [=y]) Defined at drivers/net/wireless/Kconfig:5 Depends on: NETDEVICES [=y] && !S390 && NET [=y] Selects: WIRELESS [=y]
- 2) CFG80211
Symbol: CFG80211 [=y] Type : tristate Prompt: cfg80211 - wireless configuration API Location: -> Networking support (NET [=y]) (1) -> Wireless (WIRELESS [=y]) Defined at net/wireless/Kconfig:19 Depends on: NET [=y] && WIRELESS [=y] && (RFKILL [=n] || !RFKILL [=n]) Selected by: R8723AU [=n] && STAGING [=y] && USB [=y] && WLAN [=y] && RFKILL [=n]
- 3) CFG80211_WEXT
Symbol: CFG80211_WEXT [=y] Type : boolean Prompt: cfg80211 wireless extensions compatibility Location: -> Networking support (NET [=y]) -> Wireless (WIRELESS [=y]) (1) -> cfg80211 - wireless configuration API (CFG80211 [=y]) Defined at net/wireless/Kconfig:187 Depends on: NET [=y] && WIRELESS [=y] && CFG80211 [=y] Selects: WEXT_CORE [=n]
- 4) MAC80211
Symbol: MAC80211 [=y] Type : tristate Prompt: Generic IEEE 802.11 Networking Stack (mac80211) Location: -> Networking support (NET [=y]) (1) -> Wireless (WIRELESS [=y]) Defined at net/mac80211/Kconfig:1 Depends on: NET [=y] && WIRELESS [=y] && CFG80211 [=y] Selects: CRYPTO [=y] && CRYPTO_ARC4 [=n] && CRYPTO_AES [=y] && CRYPTO_CCM [=n] && CRYPTO_GCM [=n] && CRC32 [=y]
- 5) MAC80211_LEDS
Symbol: MAC80211_LEDS [=y] Type : boolean Prompt: Enable LED triggers Location: -> Networking support (NET [=y]) (1) -> Wireless (WIRELESS [=y]) Defined at net/mac80211/Kconfig:83 Depends on: NET [=y] && WIRELESS [=y] && MAC80211 [=y] && LEDS_CLASS [=y] Selects: LEDS_TRIGGERS [=y] Selected by: IWLEGACY [=n] && NETDEVICES [=y] && WLAN [=y] || ATH5K [=n] && NETDEVICES [=y] && WLAN [=y] && ATH_CARDS [=n] && (PCI [=y] || ATH25) && MAC80211 [=y] || ATH9K [=n] && NETDEVICES [=y] && WLAN [=y] && ATH_CARDS [=n] && MAC80211 [=y] && HAS_DMA [=y] || ATH9K_HTC [=n] && NETDEVICES [=y] && WLAN [=y] && ...
- 6) RFKILL
Symbol: RFKILL [=y] Type : tristate Prompt: RF switch subsystem support Location: (1) -> Networking support (NET [=y]) Defined at net/rfkill/Kconfig:4 Depends on: NET [=y]
- 7) RTL8XXXU
Symbol: RTL8XXXU [=m] Type : tristate Prompt: RTL8723AU/RTL8188[CR]U/RTL819[12]CU (mac80211) support Location: -> Device Drivers -> Network device support (NETDEVICES [=y]) (1) -> Wireless LAN (WLAN [=y]) Defined at drivers/net/wireless/realtek/rtl8xxxu/Kconfig:4 Depends on: NETDEVICES [=y] && WLAN [=y] && MAC80211 [=y] && USB [=y]
- 8) RTL8XXXU_UNTESTED
Symbol: RTL8XXXU_UNTESTED [=y] Type : boolean Prompt: Include support for untested Realtek 8xxx USB devices (EXPERIMENTAL) Location: -> Device Drivers -> Network device support (NETDEVICES [=y]) -> Wireless LAN (WLAN [=y]) (1) -> RTL8723AU/RTL8188[CR]U/RTL819[12]CU (mac80211) support (RTL8XXXU [=m]) Defined at drivers/net/wireless/realtek/rtl8xxxu/Kconfig:26 Depends on: NETDEVICES [=y] && WLAN [=y] && RTL8XXXU [=m]
- 9) RTL8192SE
Symbol: RTL8192SE [=m] Type : tristate Prompt: Realtek RTL8192SE/RTL8191SE PCIe Wireless Network Adapter Location: -> Device Drivers -> Network device support (NETDEVICES [=y]) -> Wireless LAN (WLAN [=y]) (1) -> Realtek rtlwifi family of devices (RTL_CARDS [=y]) Defined at drivers/net/wireless/realtek/rtlwifi/Kconfig:25 Depends on: NETDEVICES [=y] && WLAN [=y] && RTL_CARDS [=y] && PCI [=y] Selects: RTLWIFI [=m] && RTLWIFI_PCI [=n]
Now that all needed modules have been selected, save your configuration, exit menuconfig and issue kernel and ko modules build with:
espressobin@buildserver:~/kernel/4.4.8$ make -j4
Transferring to microSD card
Now we need to transfer the new kernel and ko modules to a microSD card containing Ubuntu. The new modules are located in /path_to_kernelv4.4.8/drivers/net/wireless/realtek directory and from there we will copy them to the Ubuntu file system on microSD card (our SD card here is mounted on /mnt/sdcard/ and we will copy the modules to /home directory on the file system):
espressobin@buildserver:~$ sudo mount /dev/sdb1 /mnt/sdcard/ espressobin@buildserver:~$ cd kernel/4.4.8/drivers/net/wireless/realtek/ espressobin@buildserver:~/kernel/4.4.8/drivers/net/wireless/realtek$ sudo cp rtlwifi/rtl8192se/rtl8192se.ko /mnt/sdcard/home/ espressobin@buildserver:~/kernel/4.4.8/drivers/net/wireless/realtek$ sudo cp rtlwifi/rtl_pci.ko /mnt/sdcard/home/ espressobin@buildserver:~/kernel/4.4.8/drivers/net/wireless/realtek$ sudo cp rtl8xxxu/rtl8xxxu.ko /mnt/sdcard/home/ espressobin@buildserver:~/kernel/4.4.8/drivers/net/wireless/realtek$ sudo cp rtlwifi/rtlwifi.ko /mnt/sdcard/home # Copy the new kernel images to boot directory: espressobin@buildserver:~/kernel/4.4.8/drivers/net/wireless/realtek$ cd /mnt/sdcard espressobin@buildserver:~/mnt/sdcard$ sudo cp /home/espressobin/kernel/4.4.8/arch/arm64/boot/Image boot/ espressobin@buildserver:~/mnt/sdcard$ sudo cp /home/espressobin/kernel/4.4.8/arch/arm64/boot/dts/marvell/armada-3720-community.dtb boot/
Now that the new kernel images and ko modules are transferred to the microSD card, unmount it and boot it on ESPRESSObin (see how to boot Ubuntu on Boot from removable storage - Ubuntu).
Configuring AP
Once in Ubuntu console, open /etc/apt/sources.list file and there append:
deb http://httpredir.debian.org/debian jessie main contrib non-free
after which update and install necessary packages:
root@localhost:~# apt-get update root@localhost:~# apt-get install firmware-realtek root@localhost:~# apt-get install iw root@localhost:~# apt-get install hostapd
Now that we have the necessary packages from it installed, we can remove the above source line in /etc/apt/sources.list in order to avoid package issues later on when following other Ubuntu tutorials:
root@localhost:~# vi /etc/apt/sources.list # remove line 'deb http://httpredir.debian.org/debian jessie main contrib non-free' # save and exit editor root@localhost:~# apt-get update
In the same directory (in our case this was /home) where we have copied ko modules, we will create a hostapd.conf file containing our access point configuration:
root@localhost:~# cd /home root@localhost:/home# vi hostapd.conf
which will contain our access point configuration:
interface=wlan0 driver=nl80211 ssid=espressobinwifi_ap hw_mode=g channel=1
Finally, we make a script file, e.g. ubuntu_ap:
root@localhost:/home# vi ubuntu_ap
where we will add access point capability to our ESPRESSObin router:
#!/bin/bash set -x insmod rtlwifi.ko sleep 1 insmod rtl8xxxu.ko sleep 1 insmod rtl_pci.ko sleep 1 insmod rtl8192se.ko sleep 1 iw reg set US hostapd -B ./hostapd.conf brctl addbr br0 ifconfig eth0 0.0.0.0 up ifconfig wan 0.0.0.0 up ifconfig lan0 0.0.0.0 up ifconfig lan1 0.0.0.0 up brctl addif br0 lan0 brctl addif br0 lan1 brctl addif br0 wlan0 ifconfig br0 192.168.22.1 sleep 2 /etc/init.d/smbd stop sleep 1 /etc/init.d/smbd start sleep 1 dnsmasq --interface=br0 --dhcp-range=br0,192.168.22.2,192.168.22.199,12h echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -o wan -j MASQUERADE dhclient wan
of course, make the script executable and run it with:
root@localhost:~# chmod +x ubuntu_ap root@localhost:~# ./ubuntu_ap