GitHunt
PR

projectgus/kernel_wm8505

Working on the WM8505 SoC Linux kernel release by VIA

(These are notes about the WM8505 kernel port, please see README.linux
for the original Linux kernel README.)

******** PREREQUISITES ********

  • A host running Linux to build from. You may be able to build from
    BSD/OSX as well, I don't know.

  • An appropriate ARM cross-compiler toolchain. Make sure it has EABI support.

    Recommended/tested choices are Emdebian for Debian/Ubuntu hosts, or
    the Android NDK toolchain for other hosts (see below.) Problems have
    been reported using CodeSourcery.

  • The mkimage tool installed on your host. On Debian/Ubuntu, the
    package to install is 'uboot-mkimage'

******** INSTALLING A TOOLCHAIN ********

**** Emdebian Option

To install Emdebian on an Debian or Ubuntu host, follow the steps
under "Get the Binaries" on emdebian wiki:
http://wiki.debian.org/EmdebianToolchain#Getthebinaries (you don't
need all those packages listed there to just compile a kernel, but
they don't hurt.)

Before building, you will need to set an environment variable for
your cross-compiler:

export CROSS_COMPILE=arm-linux-gnueabi-   

(you can alternately supply this on the command-line to make, if you desire.)

**** Android NDK Option

To install the Android NDK, first download from
http://developer.android.com/sdk/ndk/index.html

Then untar it to your chosen install point and add the prebuilt 

binary toolchain to your path. The steps will be something like:
cd /usr/local
sudo tar jxvf ~/Downloads/android-ndk-r5b-linux-x86.tar.bz2
sudo chmod -R +rX android-ndk-r5b/
export PATH="$PATH:pwd/android-ndk-r5b/toolchains/arm-eabi-4.4.0/prebuilt/linux-x86/bin"

You will probably want to add the last line above to your .bashrc or
similar, so the toolchain is always in your PATH

You will also need to set the cross-compiler environment variable:
 
 export CROSS_COMPILE=arm-eabi-

(you can alternately supply this on the command-line to make, if you desire.)

******** CONFIGURE YOUR FIRST KERNEL ********

After you have a toolchain, you can configure a WM8505 kernel with a
default config (defconfig) as follows:

For Eken M001 kernel suitable for Android:

make eken_m001_android_defconfig ARCH=arm

For Eken M001 kernel more suitable for Debian:

make eken_m001_debian_defconfig ARCH=arm

(Other WM8505 tablets/netbooks can probably use the M001 config as well.)

******** BUILD YOUR FIRST KERNEL ********

After you have a config, you can build a kernel:

make via_obj uImage modules ARCH=arm

If compilation succeeds, the kernel image will be at arch/arm/uImage
(this file is equivalent to the uzImage.bin file used in common WM8505
boot environments, you can copy it over the top to change the kernel
which is installed/booted from SD.)

To install the built kernel modules somewhere, run:

make modules_install ARCH=arm INSTALL_MOD_PATH=/some/staging/path

******** FURTHER CONFIGURATION **********

You can edit the current config with

make menuconfig ARCH=arm

As well as the two recommended defconfigs, there are some older
configurations available under arch/arm/configs. These are not known
to work, and are mostly for comparison/information purposes only:

  • arch/arm/configs/android_wm8505_config

  • arch/arm/configs/wmt_defconfig

    These two came as-is with the source tarball.

  • arch/arm/configs/wm8505_initial_config

    This file was the .config that came as-is the source tarball (different to the
    above two configs.)

  • arch/arm/configs/eken_m001_factory_configuration

    This is a dump of /proc/config.gz on a factory Eken M001 kernel (different again.)

******** OTHER BUILDING NOTES ********

  • The via_obj target is a custom VIA target to copy the mmc_atsmb.o
    file into the source tree before building. VIA/Wondermedia have not
    released this one source file.

  • If you are building for Android, and you want to use some of the
    binary-only kernel modules that came with WM8505 Android by default
    (or vice-versa if you want to use a new module with an old kernel),
    then you need to force the kernel revision so they will load. This is
    a horrible hack, but even WM seem to do it in their Android releases.

    Do this by overriding the KERNELRELEASE make variable on the command line
    as KERNELRELEASE=2.6.29-00236-g4f8dbbb-dirty - ie:

    make uImage modules ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- KERNELRELEASE=2.6.29-00236-g4f8dbbb-dirty

**** u-boot scripts

U-boot boot scripts for SD card booting/installing are saved at the path
'script/scriptcmd' on SD card.

To read a scriptcmd:

tail -c +72 scriptcmd

To write a scriptcmd:

mkimage -A arm -O linux -T script -C none -a 1 -e 0 -n "script image" -d cmd scriptcmd

(Where 'cmd' is your source scriptcmd script.)

******* kernel arguments ******

Scriptcmd has a line for kernel args:

setenv bootargs mem=112M root=/dev/mmcblk0p2 lcdid=1 console=ttyS0,115200n

Relevant args:

  • mem=112M
    is also mem=109M on non-Android boots. Suspect extra 3M is video memory?!?

  • console=ttyS0,115200n
    gives you kernel console on serial. If you're building for Debian or
    any other non-Android userland then you may want to remove this, and enable
    framebuffer console in configuration (this is enabled already in Debian
    defconfig.)

  • lcdid=1 enables VOUT to LCD on tablets. Some other machines
    (netbooks?) use VT1632 which is the default if lcdid is not set (in
    this case, you won't see any video on a tablet.)

****** WiFi Driver ******

This tree contains the rt2870sta kernel module, backported from kernel
2.6.35. I have had mixed success with this driver, you may also want
to try Ralink's OEM source release driver (especially on Android.)

The WiFi driver that ships with WM8505 Android is a custom one with
vendor-specific patches to enable the GPIO and load the firmware. If
you go with a standard driver, you will need to perform these
functions yourself:

  • Run these commands to turn on the Signal GPIO that powers the USB
    stick inside the Eken. We'll probably come up with something better
    eventually, but for now:

    echo out > /sys/class/gpio/gpio2/direction
    echo 1 > /sys/class/gpio/gpio2/value
    modprobe rt2870sta

  • Install a firmware file. To get a firmware file in debian, you
    can install firmware-ralink from non-free. Alternatively, download
    the USB firmwares from http://www.ralink.com.tw/support.php?s=2

    The rt2870.bin firmware will do as long as it's recent.

    You can choose to load the firmware at runtime, or to compile it
    directly into the kernel. Choosing to compile it in is currently the
    path of least resistance for most userlands (look in menuconfig
    under (under Device Drivers -> Generic Driver Options -> Include
    in-kernel firmware blobs...)

Languages

C97.2%Assembly2.7%Perl0.1%Shell0.0%C++0.0%Python0.0%SuperCollider0.0%Objective-C0.0%ASP0.0%
Other
Created July 29, 2010
Updated February 17, 2026
projectgus/kernel_wm8505 | GitHunt