Android and self-compiled drivers (ASUS MeMo FHD 10 + HUAWEI K3715 UMTS Stick)

Recently I bought my first android tablet – an ASUS MeMo FHD 10 (ME302C)! This one:

Asus MeMo Pad FHD 10

It is pretty cool and much fun working with this device – as long as you have got an internet connection. 😉 But because I thought there would be free open WLAN spots all over the world and – in case of emergency – I could use my UMTS stick, I only bought the cheap wifi-only version of the tablet (~200 EUR).

So today I wanted to prepare the device to be used with my UMTS stick. It’s branded by “Vodafone” and uses a HUAWEI K3715 chipset. This one:

vodafone_umts_stick_huawei_k3715     vodafone_umts_stick_huawei_k3715_details

Remembering my experiences using this stick with linux I though it would be an easy job. So I got my USB On-The-Go (OTG) cable to connected the stick with the pad…

usb_otg_cable_with_stick_on_tablet

After plugging in the UMTS stick android does ….. nothing….. Well, it does recognize the stick – as a mass storage class (MSC) device…

android usb mass store class (MSC) device dectected

…. but this does not not help us establishing our internet connection :-(. The mass storage device is the internal “CDROM” drive that contains the windows drivers and software for the stick that can be used for auto-configuration. Sadly there is no android software included.

I though android might not know which software to use with UMTS sticks so I had a look in the Google Play Store for a nice applet. And I found PPP Widget (Play Store), an app that uses raw Point-to-Point (PPP) Protocol to establish GSM / UMTS connections. I plugged off the stick and installed the app. It says “No modem found”. So I replugged the device and waited for success 😉

(By the way: PPP Widget (and other UMTS apps) need root access. So you have to root your tablet first. This is not part of this tutorial. If you have problems rooting your Asus MeMo Pad FHD 10, let me know.)

PPP Widget - No driver for umts stick found

The display switches from “No modem found” to “No driver found” (german above). Meaning PPP Widget does recognize that a modem (UMTS stick) device has been plugged in. But it does not know how to handle it.

Examining the configuration of PPP Widget and knowing about using this stick with linux, it needs a USB serial converter to be addressed properly. That means there should be a /dev/ttyUSB device available on the android tablet after plugging in the UMTS stick. Let’s have a look…

Android TTY devices overview

Sadly there is no /dev/ttyUSB device present. Let’s look into the kernel protocol using “dmesg” command wether the device has been identified correctly.

Android Kernel Protocol with UMTS stick

There it is. The stick has been found but that’s all! No kernel driver has been attached to the device. It seems that ASUS did not include any USB serial or USB modem drivers within its firmware. So we need to compile a driver on our own and add it to the android kernel.

At first we need to download the kernel sources from the ASUS Homepage. Drivers for the ASUS MeMo Pad FullHD 10 can be found HERE. In my case – using Version 5.0.16 WW – I need to download “ASUS MEMo Pad FHD 10 Kernel Source Code for Android 4.3 JB OS (V5.0.16)“.

Before configuring the kernel, we need to prepare our system. I am using debian 64bit. The ASUS MeMo Pad has got an intel atom processor that is 32bit. So I need to add x86 support to my system:

root@zentaur:~# dpkg --add-architecture i386

(I you have got an ARM tablet – you need to fetch the tools that are suitable for your processor architecture.)

After that the GNU compiler – GCC (multilib) – can be installed. Because I want to use the same GCC version my android kernel has been compiled with, I check the /proc/version output on the tablet first.

Android kernel and GCC version

The ASUS MeMo FHD 10 (v5.0.16) WW has got a kernel version 3.4.43 that has been compiled using GCC version 4.7. So I am going to install the GCC version 4.7 as well.

root@zentaur:~# apt-get install gcc-4.7-multilib

Debian fetches all dependencies on its own, so the system will be prepared after this operation. The next step is reconfiguring the kernel using the setting ASUS used to build the firmware. The ASUS MeMo Pad’s kernel configuration is called “i386_ctp_defconfig”. Thats why we run this config command while setting the architecture to x86 and the compiler to GCC version 4.7.

root@zentaur:~/kernel-2632b25# make ARCH=x86 CC=gcc-4.7 i386_ctp_defconfig
#
# configuration written to .config
#

After that we can run the menuconfig command to set up the kernel modules.

root@zentaur:~/kernel-2632b25# make ARCH=x86 CC=gcc-4.7 menuconfig
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/kconfig/conf.o
  HOSTCC  scripts/kconfig/lxdialog/checklist.o
  HOSTCC  scripts/kconfig/lxdialog/inputbox.o
  HOSTCC  scripts/kconfig/lxdialog/menubox.o
  HOSTCC  scripts/kconfig/lxdialog/textbox.o
  HOSTCC  scripts/kconfig/lxdialog/util.o
  HOSTCC  scripts/kconfig/lxdialog/yesno.o
  HOSTCC  scripts/kconfig/mconf.o
  SHIPPED scripts/kconfig/zconf.tab.c
  SHIPPED scripts/kconfig/zconf.lex.c
  SHIPPED scripts/kconfig/zconf.hash.c
  HOSTCC  scripts/kconfig/zconf.tab.o
  HOSTLD  scripts/kconfig/mconf
scripts/kconfig/mconf Kconfig
drivers/media/video/Kconfig:351: can't open file "../modules/camera/Kconfig"
make[1]: *** [menuconfig] Error 1
make: *** [menuconfig] Error 2

But…whoops. Something went wrong. A file is missing within the delivered kernel sources. In this case we don’t care, because we only want to add modules to the kernel and do not need the kernel image or the camera. So we edit the file “drivers/media/video/Kconfig” and comment the including out:

# if EXTERNAL_CAMERA
# source "../modules/camera/Kconfig"
# endif

After that, we run the “menuconfig” command once more. This time we entered the kernel configuration ncurses menu. To build the modules that are necessary for USB serial and GSM modem support, change the following settings:

1) Local version – append to kernel release  (General setup —> )

To make the modules load properly in our existing kernel, it is a good decision to name the modules the same way our existing kernel is named. In my case (as you can see above) the kernel is called 3.4.43-00001-g2632b25. So I am going to add this appendix here.

Android Kernel Local Name Appendix

2) Kernel support for your tablet

Chose the correct product name of your tablet (if existent). In my case the ASUS MeMo Pad FullHD 10 is called ME302C.

Android kernel Asus Memo Pad ME302C

3) USB Serial Converter support (Device Drivers —> USB Support —>)

To make the /dev/ttyUSB devices available we need to enable USB Serial support.

Android Kernel USB serial converter support

4) USB driver for GSM and CDMA modems (—> USB Serial Converter support)

To make the kernel recognize USB modems as serial devices, we need to enable this option as well.

Android Kernel USB GSM UTMS modem support

After that the kernel configuration can be saved and the modules compiled using the following command:

root@zentaur:~/kernel-2632b25# make ARCH=x86 CC=gcc-4.7 modules

The kernel modules will now compile. In result there will be three files that are necessary for USB UMTS stick support. The files are located in directory drivers/usb/serial and are called “usbserial.ko”, “usb_wwan.ko” and “option.ko”. Use your favorite method (for example owncloud) to transfer those files onto your tablet.

The next step is loading those new modules into the existing android kernel. You will need root access to your tablet once more. Use the insmod command and append the module files to make the kernel load them. (You can get my precompiled kernel drivers HERE. They are ONLY for ASUS MeMo Pad FullHD 10 – Firmware Version 5.0.16 – Intel ATOM – Do not use with ARM!)

Android Kernel load self-compiled drivers

Now the kernel should be capable to address USB serial devices so we are goint to plug in the UTMS stick again and watch PPP Widget for further information…..

And indeed, PPP Widget goes further and is “scanning for port” and “setting up the modem”, BUT then the device loses power and android tells us the following:

Android overcurrent USB port with UMTS stick

It is an “overcurrent on USB port” warning and it occurs no matter what battery level is present (event with AC connected). This error usually occurs if the USB device is broken or consumes too much power. Because my stick is working it must be the power problem.

I could use an active USB hub now, but I wanted to achive this task without additional power supplies. So I tried a passive USB hub just for experimentation and there was no “overcurrent warning” any more – very strange.

ASUS MeMo FHD 10 USB Hub and UMTS Stick

After replugging the device PPP Widget shows the following result:

PPP Widget - Disconnected

This time it says “disconnected”, recognizes the UTMS stick properly and offers to establish a connection!! We may now configure our mobile internet settings (PIN, APN, …). Afterwards we can try to connect using the stick by pressing the button.

PPP Widget - connected

Success!!! The Widget says “connected” and the sticks blue light indicates HSDPA connection. We are able to use the browser and any other online application!

15 thoughts on “Android and self-compiled drivers (ASUS MeMo FHD 10 + HUAWEI K3715 UMTS Stick)

  1. raul

    Excellent, this helped me big time. I actually have 5.0.21, and the onlysouce code posted is for 5.0.19, but I am trying anyway just to see if I am lucky..

    I already demanded ASUS that they post the source code for the 5.0.21 version
    thanks for taking the time to write this

    Reply
    1. Rup0rt Post author

      Yea, it really sucks that ASUS publishes the source code with such a delay! But if you only build kernel modules as described, the newer 5.0.21 kernel should load them (with warning) as well. Give it a try.

      Reply
  2. David

    Hello.
    This is great.
    I’ve been looking for a way to mount network drives with cifs.ko module and could not find it for download on any site .
    I do not have any programming knowledge . I have a asus with kernel 3.4.43 me302C and 5,021 x86 architecture firm .
    Would you be so kind as to compile the necessary modules and cifs.ko to have samba network drives ?.
    Thanks in advance .

    Reply
    1. Rup0rt Post author

      Hi,

      you should not need CIFS kernel module to access your windows shares. Have you already tried to use a standard file explorer to access the drives or do you _really_ need to mount them into your file system?

      Reply
  3. David

    Hi,
    Thanks for answering so quickly. My purpose is to read a huge amount of comics stored in a home nas . The problem is that readers of comics for normal android only read local files. I have tried many times but Commiton hangs . That’s why you need to mount a network drive at home to read the files there.
    Thx

    Reply
    1. Rup0rt Post author

      Hm yea, you are right. CIFS is not supported by kernel, thats sad :/. Unfortunately the recent ASUS kernel source code is still not available at their website, so it must be compiled using the old source code (5.0.19).

      I have no time to compile it at the moment. Maybe you can try it yourself? It is not that difficult and you can almost follow the description in my post. Just activate CIFS in kernel config instead of the USB dongle.

      If you got any problems, just let me know…

      Reply
    1. Rup0rt Post author

      Hi Pedro,

      I dont know this cell phone, but it might work a similar way.
      Sources for your phone are available here.

      I think the WN722n uses an Atheros chipset. So you should first
      try to enable ath9k driver (see this link).
      But there might be other drivers missing in the kernel.

      Cheers,
      Robert

      Reply
      1. pedro

        Thanks! But, i have entered Asus Zenfone 6 kernel menuconfig and i have noticed that there was an option under Device Drivers -> Network device suport -> Wireless Lan called “Atheros Wireless Cards”, which i’ve marked (‘M’) and compiled the kernel this way :

        make ARCH=x86 modules

        Than, it created this file: ath.ko, but, when i make insmod ath.ko, my device reboots… what (certanly) am i doing wrong? How may i know if this driver was loaded?

        thanks and sorry my bad english!

        Reply
        1. Rup0rt Post author

          Oh, thats bad! A rebooting device sounds like segmentation fault in kernel space. Maybe the atheros drivers depends on other drivers (and/or changes in the kernel image).
          Have other settings changed after you activated the modules (M)? It might be necessary to replace the current kernel image, but this could damage your
          current build – and I have not done this before, to give you support. -.-

          Reply
  4. pedro

    Hi,

    Im trying to compile a new kernel to my Zenfone 6, using the code below… Im still so newbie in Linux at all, but thanks God, ive learn fast…

    make ARCH=x86 CC=gcc-4.7 -k

    It goes ok, but when it finished, i cant find the zImage file that it would be generated…. would it be because of some errors ive got during compile? One of those (several) errors is “undefined reference to ieee80211_frequency_to_channel”… what may i doing wrong?

    Threre is a way that i send u my .config file for u to see?

    Thank u for all help and God bless u!

    Reply
    1. Rup0rt Post author

      “It goes ok” but there are “some errors during compile”? That sounds strange. So compiling is not successful? This would explain the missing bzImage file.

      “undefined references” can be caused by different reasons. Recheck the proper gcc version the phone uses (/proc/version).

      If you keep on getting those errors, they might be difficult to solve.

      Reply
      1. pedro

        Hi,

        Sorry my bad english… yeah, it was giving-me some errors, thats why i cant find bzimage… and i found out that “undefined references” is caused, especialy (not in all cases…), when some configuration is not compatible with target hardware…

        Now Im gona play around “menuconfigs” in order to enable all funcionalities of this greate Zenfone 6…

        Just to know, im compiling those kernels on my own zenfone 6, using this app “Linux on Android” (http://sourceforge.net/projects/linuxonandroid/)… so, im at work now, then i get my phone and start chrooted ubuntu and let it compile the kernel while im working… 😛

        Thanks and God bless u!

        Reply
  5. pedro

    Hi!

    Finaly, i get the wn722n usb adapter work on my zenfone, thanks God! First, i have modified zenfone’s kernel in menuconfig and marked all Atheros’s options there ( i also marked usb adapters options too, just for curiosity and to my Zenfone be able to handle with another adapters…) then i compile this way:

    make -f Kernelmakefile ARCH=x86 CC=gcc-4.7 (1)

    After compiled, i have flash this kernel on my zenfone and make a script with this:
    rmmod bcmdhd
    rmmod cfg80211
    insmod cfg80211 #the new one, that was created when i compiled in (1)
    insmod bcmdhd #the new one, that was created when i compiled in (1)
    insmod… (drivers for wn722n, created when i compile in (1)… i dont remenber… :p)

    Then i put this script on etc/init.d…

    Then, i have to download htc_9271.fw (https://github.com/mdamt/linux-firmware/raw/master/htc_9271.fw) and put in etc/firmware… and, finaly, when i plug my adapter, made ifconfig -a and wlan1 was there, working like a charm!!! I have tested it with my airmon-ng start wlan1, then airodump-ng mon0 and wn722n starts to blink!!!

    I wish to thank u, dude! Thanks to this site, i have a little idea on how i may put my usb adapter to work on my Asus Zenfone! Thanks for all answers and ideas u give me! I told u i learn fast (thanks God)!!!

    God bless u and your family a lot!!!

    Reply
    1. Tunap

      Hi, Pedro
      It’s great that you got it to work. I get was searching for the same thing which lead me to your post. The only difference is I have a Zenfone 5. I too have TL WN722N. I’m new to all these. Can you help me step by step? Here’s my email: admin@tunap.co

      Regards

      Reply

Leave a Reply

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