cubieplayer / Cubian

Debian for Cubieboard
http://cubian.org
271 stars 49 forks source link

[Tutorial] Compile a wireless driver on cubian, take 8812au as an example #470

Open michalliu opened 8 years ago

michalliu commented 8 years ago

This is an tutorial to show you how to compile a wireless driver on cubian. Let's take 8812au for example, first install kernel-headers.

apt-get install linux-headers

You will see a list of available headers

Package linux-headers is a virtual package provided by:
  linux-headers-3.4.79-sun7i 3.4.79-4cubian
  linux-headers-3.4.79-sun4i 3.4.79-4cubian
  linux-headers-vexpress 3.2+46
  linux-headers-omap 3.2+46
  linux-headers-mx5 3.2+46
  linux-headers-3.2.0-4-vexpress 3.2.68-1+deb7u3
  linux-headers-3.2.0-4-omap 3.2.68-1+deb7u3
  linux-headers-3.2.0-4-mx5 3.2.68-1+deb7u3
You should explicitly select one to install.

Since my device is A10, i choose linux-headers-3.4.79-sun4i

apt-get install linux-headers-3.4.79-sun4i

System responds

root@Cubian:/home/cubie# apt-get install linux-headers-3.4.79-sun4i
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following extra packages will be installed:
  binutils cpp cpp-4.6 gcc gcc-4.6 gcc-4.6-base libc-bin libc-dev-bin libc6
  libc6-dev libgomp1 libmpc2 libmpfr4 linux-libc-dev make manpages-dev
Suggested packages:
  binutils-doc cpp-doc gcc-4.6-locales gcc-multilib autoconf automake1.9
  libtool flex bison gdb gcc-doc libmudflap0-4.6-dev gcc-4.6-doc libgcc1-dbg
  libgomp1-dbg libquadmath-dbg libmudflap0-dbg binutils-gold glibc-doc
  make-doc
The following NEW packages will be installed:
  binutils cpp cpp-4.6 gcc gcc-4.6 gcc-4.6-base libc-dev-bin libc6-dev
  libgomp1 libmpc2 libmpfr4 linux-headers-3.4.79-sun4i linux-libc-dev make
  manpages-dev
The following packages will be upgraded:
  libc-bin libc6
2 upgraded, 15 newly installed, 0 to remove and 69 not upgraded.
Need to get 31.9 MB of archives.
After this operation, 82.4 MB of additional disk space will be used.
Do you want to continue [Y/n]? y
Get:1 http://packages.cubian.org/ wheezy/main linux-headers-3.4.79-sun4i armhf 3.4.79-4cubian [7,620 kB]
Get:2 http://http.debian.net/debian/ wheezy/main libc-bin armhf 2.13-38+deb7u8 [1,170 kB]
Get:3 http://http.debian.net/debian/ wheezy/main libc6 armhf 2.13-38+deb7u8 [4,021 kB]
Get:4 http://http.debian.net/debian/ wheezy/main manpages-dev all 3.44-1 [1,737 kB]
Get:5 http://http.debian.net/debian/ wheezy/main libgomp1 armhf 4.7.2-5 [25.7 kB]
Get:6 http://http.debian.net/debian/ wheezy/main libmpfr4 armhf 3.1.0-5 [516 kB]
Get:7 http://http.debian.net/debian/ wheezy/main libmpc2 armhf 0.9-4+b1 [31.9 kB]
Get:8 http://http.debian.net/debian/ wheezy/main binutils armhf 2.22-8+deb7u2 [4,481 kB]
Get:9 http://http.debian.net/debian/ wheezy/main gcc-4.6-base armhf 4.6.3-14 [141 kB]
Get:10 http://http.debian.net/debian/ wheezy/main cpp-4.6 armhf 4.6.3-14 [4,065 kB]
Get:11 http://http.debian.net/debian/ wheezy/main cpp armhf 4:4.6.3-8 [16.7 kB]
Get:12 http://http.debian.net/debian/ wheezy/main gcc-4.6 armhf 4.6.3-14 [4,290 kB]
Get:13 http://http.debian.net/debian/ wheezy/main gcc armhf 4:4.6.3-8 [5,012 B]
Get:14 http://http.debian.net/debian/ wheezy/main libc-dev-bin armhf 2.13-38+deb7u8 [219 kB]
Get:15 http://http.debian.net/debian/ wheezy/main linux-libc-dev armhf 3.2.68-1+deb7u3 [814 kB]
Get:16 http://http.debian.net/debian/ wheezy/main libc6-dev armhf 2.13-38+deb7u8 [2,355 kB]
Get:17 http://http.debian.net/debian/ wheezy/main make armhf 3.81-8.2 [382 kB] 
Fetched 31.9 MB in 4min 14s (125 kB/s)                                         
Preconfiguring packages ...
(Reading database ... 26652 files and directories currently installed.)
Preparing to replace libc-bin 2.13-38+deb7u4 (using .../libc-bin_2.13-38+deb7u8_armhf.deb) ...
Unpacking replacement libc-bin ...
Processing triggers for man-db ...
Setting up libc-bin (2.13-38+deb7u8) ...
(Reading database ... 26653 files and directories currently installed.)
Preparing to replace libc6:armhf 2.13-38+deb7u4 (using .../libc6_2.13-38+deb7u8_armhf.deb) ...
Unpacking replacement libc6:armhf ...
Setting up libc6:armhf (2.13-38+deb7u8) ...
INIT: version 2.88 reloading
Selecting previously unselected package libgomp1:armhf.
(Reading database ... 26653 files and directories currently installed.)
Unpacking libgomp1:armhf (from .../libgomp1_4.7.2-5_armhf.deb) ...
Selecting previously unselected package libmpfr4:armhf.
Unpacking libmpfr4:armhf (from .../libmpfr4_3.1.0-5_armhf.deb) ...
Selecting previously unselected package libmpc2:armhf.
Unpacking libmpc2:armhf (from .../libmpc2_0.9-4+b1_armhf.deb) ...
Selecting previously unselected package binutils.
Unpacking binutils (from .../binutils_2.22-8+deb7u2_armhf.deb) ...
Selecting previously unselected package gcc-4.6-base:armhf.
Unpacking gcc-4.6-base:armhf (from .../gcc-4.6-base_4.6.3-14_armhf.deb) ...
Selecting previously unselected package cpp-4.6.
Unpacking cpp-4.6 (from .../cpp-4.6_4.6.3-14_armhf.deb) ...
Selecting previously unselected package cpp.
Unpacking cpp (from .../cpp_4%3a4.6.3-8_armhf.deb) ...
Selecting previously unselected package gcc-4.6.
Unpacking gcc-4.6 (from .../gcc-4.6_4.6.3-14_armhf.deb) ...
Selecting previously unselected package gcc.
Unpacking gcc (from .../gcc_4%3a4.6.3-8_armhf.deb) ...
Selecting previously unselected package libc-dev-bin.
Unpacking libc-dev-bin (from .../libc-dev-bin_2.13-38+deb7u8_armhf.deb) ...
Selecting previously unselected package linux-libc-dev:armhf.
Unpacking linux-libc-dev:armhf (from .../linux-libc-dev_3.2.68-1+deb7u3_armhf.deb) ...
Unpacking libc6-dev:armhf (from .../libc6-dev_2.13-38+deb7u8_armhf.deb) ...
Selecting previously unselected package linux-headers-3.4.79-sun4i.
Unpacking linux-headers-3.4.79-sun4i (from .../linux-headers-3.4.79-sun4i_3.4.79-4cubian_armhf.deb) ...
Selecting previously unselected package make.
Unpacking make (from .../make_3.81-8.2_armhf.deb) ...
Selecting previously unselected package manpages-dev.
Unpacking manpages-dev (from .../manpages-dev_3.44-1_all.deb) ...
Processing triggers for man-db ...
Setting up libgomp1:armhf (4.7.2-5) ...
Setting up libmpfr4:armhf (3.1.0-5) ...
Setting up libmpc2:armhf (0.9-4+b1) ...
Setting up binutils (2.22-8+deb7u2) ...
Setting up gcc-4.6-base:armhf (4.6.3-14) ...
Setting up cpp-4.6 (4.6.3-14) ...
Setting up cpp (4:4.6.3-8) ...
Setting up gcc-4.6 (4.6.3-14) ...
Setting up gcc (4:4.6.3-8) ...
Setting up libc-dev-bin (2.13-38+deb7u8) ...
Setting up linux-libc-dev:armhf (3.2.68-1+deb7u3) ...
Setting up libc6-dev:armhf (2.13-38+deb7u8) ...
Setting up linux-headers-3.4.79-sun4i (3.4.79-4cubian) ...
Examining /etc/kernel/header_postinst.d.
run-parts: executing /etc/kernel/header_postinst.d/000_header_prepare 3.4.79-sun4i /boot/uImage-3.4.79-sun4i
############################
#    preparing headers     #
#      please wait         #
############################
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/conf
scripts/kconfig/conf --oldconfig Kconfig
drivers/net/wireless/bcmdhd/Kconfig:42:warning: defaults for choice values not supported
#
# configuration written to .config
#
scripts/kconfig/conf --silentoldconfig Kconfig
drivers/net/wireless/bcmdhd/Kconfig:42:warning: defaults for choice values not supported
  CHK     include/linux/version.h
  CHK     include/generated/utsrelease.h
  Generating include/generated/mach-types.h
  HOSTCC  scripts/genksyms/genksyms.o
  HOSTCC  scripts/genksyms/lex.lex.o
  HOSTCC  scripts/genksyms/parse.tab.o
  HOSTLD  scripts/genksyms/genksyms
  CC      scripts/mod/empty.o
  HOSTCC  scripts/mod/mk_elfconfig
  MKELF   scripts/mod/elfconfig.h
  HOSTCC  scripts/mod/file2alias.o
  HOSTCC  scripts/mod/modpost.o
  HOSTCC  scripts/mod/sumversion.o
  HOSTLD  scripts/mod/modpost
  HOSTCC  scripts/kallsyms
  HOSTCC  scripts/pnmtologo
  HOSTCC  scripts/conmakehash
  HOSTCC  scripts/bin2c
############################
# headers is ready to use  #
############################
Setting up make (3.81-8.2) ...
Setting up manpages-dev (3.44-1) ...
michalliu commented 8 years ago

This is the second step, Let's clone the driver

git clone --depth=1 https://github.com/gnab/rtl8812au

As the author state, we need modify the makefile

...
CONFIG_PLATFORM_I386_PC = n
...
CONFIG_PLATFORM_ARM_RPI = y
michalliu commented 8 years ago

Next, Let make the driver binary

cd rtl8812au
make

Here is the log

make ARCH=arm CROSS_COMPILE= -C /lib/modules/3.4.79-sun4i/build M=/home/cubie/rtl8812au  modules
make[1]: Entering directory `/usr/src/linux-headers-3.4.79-sun4i'
  CC [M]  /home/cubie/rtl8812au/core/rtw_cmd.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_security.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_debug.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_io.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_ioctl_query.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_ioctl_set.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_ieee80211.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_mlme.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_mlme_ext.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_wlan_util.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_vht.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_pwrctrl.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_rf.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_recv.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_sta_mgt.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_ap.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_xmit.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_p2p.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_tdls.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_br_ext.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_iol.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_sreset.o
  CC [M]  /home/cubie/rtl8812au/core/efuse/rtw_efuse.o
  CC [M]  /home/cubie/rtl8812au/os_dep/osdep_service.o
  CC [M]  /home/cubie/rtl8812au/os_dep/linux/os_intfs.o
  CC [M]  /home/cubie/rtl8812au/os_dep/linux/usb_intf.o
  CC [M]  /home/cubie/rtl8812au/os_dep/linux/usb_ops_linux.o
  CC [M]  /home/cubie/rtl8812au/os_dep/linux/ioctl_linux.o
  CC [M]  /home/cubie/rtl8812au/os_dep/linux/xmit_linux.o
  CC [M]  /home/cubie/rtl8812au/os_dep/linux/mlme_linux.o
  CC [M]  /home/cubie/rtl8812au/os_dep/linux/recv_linux.o
  CC [M]  /home/cubie/rtl8812au/os_dep/linux/ioctl_cfg80211.o
  CC [M]  /home/cubie/rtl8812au/os_dep/linux/rtw_android.o
  CC [M]  /home/cubie/rtl8812au/hal/hal_intf.o
  CC [M]  /home/cubie/rtl8812au/hal/hal_com.o
  CC [M]  /home/cubie/rtl8812au/hal/hal_com_phycfg.o
  CC [M]  /home/cubie/rtl8812au/hal/hal_phy.o
  CC [M]  /home/cubie/rtl8812au/hal/led/hal_usb_led.o
  CC [M]  /home/cubie/rtl8812au/hal/HalPwrSeqCmd.o
  CC [M]  /home/cubie/rtl8812au/hal/rtl8812a/Hal8812PwrSeq.o
  CC [M]  /home/cubie/rtl8812au/hal/rtl8812a/Hal8821APwrSeq.o
  CC [M]  /home/cubie/rtl8812au/hal/rtl8812a/rtl8812a_xmit.o
  CC [M]  /home/cubie/rtl8812au/hal/rtl8812a/rtl8812a_sreset.o
  CC [M]  /home/cubie/rtl8812au/hal/rtl8812a/rtl8812a_hal_init.o
  CC [M]  /home/cubie/rtl8812au/hal/rtl8812a/rtl8812a_phycfg.o
  CC [M]  /home/cubie/rtl8812au/hal/rtl8812a/rtl8812a_rf6052.o
  CC [M]  /home/cubie/rtl8812au/hal/rtl8812a/rtl8812a_dm.o
  CC [M]  /home/cubie/rtl8812au/hal/rtl8812a/rtl8812a_rxdesc.o
  CC [M]  /home/cubie/rtl8812au/hal/rtl8812a/rtl8812a_cmd.o
  CC [M]  /home/cubie/rtl8812au/hal/rtl8812a/usb/usb_halinit.o
  CC [M]  /home/cubie/rtl8812au/hal/rtl8812a/usb/rtl8812au_led.o
  CC [M]  /home/cubie/rtl8812au/hal/rtl8812a/usb/rtl8812au_xmit.o
  CC [M]  /home/cubie/rtl8812au/hal/rtl8812a/usb/rtl8812au_recv.o
  CC [M]  /home/cubie/rtl8812au/hal/rtl8812a/usb/usb_ops_linux.o
  CC [M]  /home/cubie/rtl8812au/hal/rtl8812a/rtl8812a_mp.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/odm_debug.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/odm_interface.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/odm_HWConfig.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/odm.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/HalPhyRf.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8812a/HalHWImg8812A_FW.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8812a/HalHWImg8812A_MAC.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8812a/HalHWImg8812A_BB.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8812a/HalHWImg8812A_RF.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8812a/HalHWImg8812A_TestChip_FW.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8812a/HalHWImg8812A_TestChip_MAC.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8812a/HalHWImg8812A_TestChip_BB.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8812a/HalHWImg8812A_TestChip_RF.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8812a/HalPhyRf_8812A.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8812a/odm_RegConfig8812A.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8821a/HalHWImg8821A_FW.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8821a/HalHWImg8821A_MAC.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8821a/HalHWImg8821A_BB.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8821a/HalHWImg8821A_RF.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_MAC.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_BB.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8821a/HalHWImg8821A_TestChip_RF.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8821a/HalPhyRf_8821A.o
  CC [M]  /home/cubie/rtl8812au/hal/OUTSRC/rtl8821a/odm_RegConfig8821A.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_mp.o
  CC [M]  /home/cubie/rtl8812au/core/rtw_mp_ioctl.o
  LD [M]  /home/cubie/rtl8812au/8812au.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/cubie/rtl8812au/8812au.mod.o
  LD [M]  /home/cubie/rtl8812au/8812au.ko
michalliu commented 8 years ago

Now we have the driver, let's make it working

insmod 8812au.ko

System responds

<6>usbcore: registered new interface driver rtl8812au

No error, XD, lsmod gives the following output

Module                  Size  Used by
8812au                921495  0 
8021q                  17936  0 
garp                    6120  1 8021q
stp                     1992  1 garp
llc                     5276  2 stp,garp
ipt_MASQUERADE          2242  1 
iptable_nat             4838  1 
nf_nat                 18746  2 ipt_MASQUERADE,iptable_nat
nf_conntrack_ipv4      14320  3 nf_nat,iptable_nat
nf_defrag_ipv4          1358  1 nf_conntrack_ipv4
nf_conntrack           84756  4 ipt_MASQUERADE,nf_nat,iptable_nat,nf_conntrack_ipv4
iptable_filter          1533  1 
ip_tables              12581  2 iptable_filter,iptable_nat
x_tables               16829  4 ip_tables,ipt_MASQUERADE,iptable_filter,iptable_nat
sunxi_cedar_mod        10544  0 
mali                  113556  0 
ump                    56983  1 mali
gpio_sunxi              9412  0 
rt73usb                22257  0 
rt2x00usb              11279  1 rt73usb
rt2x00lib              42406  2 rt73usb,rt2x00usb
8188eu                525404  0 
mac80211              247465  2 rt2x00lib,rt2x00usb

Your card should working fine

Shtucer commented 8 years ago

In my case it was rtl8192cu. git clone https://github.com/lwfinger/rtl8192cu.git (link from cubieboard wiki) make ARCH=arm -C /lib/modules/3.4.79-sun7i/build -M=/path/to/drivre/src modules insmod rtl8192cu.ko error:

rtl8192cu: disagrees about version of symbol usb_alloc_urb

Mikebert4 commented 8 years ago

Lovely walkthrough - thanks!

I stall when running make: system fails on #include mach/barriers.h - no such file or directory.

Halp!