Device Driver Interface of WiLink Solution

From OMAPpedia

Revision as of 19:09, 15 April 2011 by Benzyg (Talk | contribs)
Jump to: navigation, search



WL127x and WL128x are two generations of TI connectivity chips for the OMAP platforms. With any particular OMAP processor generation any particular generation of connectivity chip may be used (for a particular product). Generally used OMAP processor and connectivity chip combinations are:

  • OMAP3 and WL127x (as in Zoom2, Zoom3 devices) or
  • OMAP4 and WL128x (as in Blaze devices)

However, a few customers and internal development teams at TI use and need these (rare) combinations:

  • OMAP3 + WL128x and
  • OMAP4 + WL127x

The following hints are provided should you have an alternative combination of devices and have chosen not to use the devices on-board (for whatever reason):

Note that for on-board devices that come on a particular platform, i.e. Zoom2/3 (with WL127x), Blaze (with WL128x) and Panda (with WL127x), the relevant software releases for the platform (or board) should get WiFi, Bluetooth and FM work out of the box.

It should be clear by now that any OMAP platform can use any TI WiLink device. Below list provides a couple of rare/odd combinations along with a couple of regular:

  • OMAP3 + 1271 + 5500 (default for OMAP3)
  • OMAP3 + 1283
  • OMAP4 + 1283 (default for OMAP4)
  • OMAP4 + 1271

Shared Transport solution

A Shared Transport driver is a line discipline driver. It acts as a generic transport driver for Bluetooth, FM and GPS connectivity (for WL128x).

Each of those protocol drivers have a register and a unregister mechanisms with the shared transport driver. Upon registration the shared transport driver can do a concurrent write. The shared transport driver then would queue up the data and send it over the UART. When the shared transport driver receives any data it interprets the data and forwards it to the receiver protocol driver via callbacks.

Shared transport driver is a platform device driver. Hence, for any platform which has a WL127x/WL128x device and you want to make use of this device, and the accompanying driver, you may do so by including an entry in the architecture specific board file.


/* wl128x BT, FM, GPS connectivity chip */
struct ti_st_plat_data wilink_pdata = {
        .nshutdown_gpio = 55,
        .dev_name = "/dev/ttyO1",
        .flow_cntrl = 1,
        .baud_rate = 3000000,
static struct platform_device wl128x_device = {
        .name           = "kim",
        .id             = -1,
        .dev.platform_data = &wilink_pdata,

Also, in one of the architecture specific init functions add:


Hardware Interface and MUX mode configuration

The WiLink connectivity chip's BT, FM and GPS IPs are interfaced with the application processor (OMAP) through UARTs. A GPIO line called nShutDown acts as the chip enable line for the connectivity chip.

Also, the connectivity chip is interfaced to BT core via PCM lines (mcbsp if OMAP) and to the FM core via i2S (or PCM). The BT-PCM lines carry the voice data during a call scenario. The FM i2S lines can be used for FM Rx audio (digital) or FM Tx audio.

The mux-mode configurations of these hardware interfaces can be configured via the OMAP MUX framework supported by the BSP as follows:

Example 1: On Zoom3 the N-Shut-Down line is connected to GPIO 109.

In file arch/arm/mach-omap2/board-zoom3.c you would find the following entry:
        omap_mux_init_gpio(109, OMAP_PIN_OUTPUT);

The configuration can be done in x-loader or u-boot. Note that the configuration may not take place in u-boot if it is already being done in x-loader.

Example 2: On OMAP3SDP/Blaze's x-loader, the McBSP1 is connected to the BT-PCM lines.

In file board/omap4430sdp/omap4430sdp.c of the ''u-boot'' source code, you will find entries which look like:

        MV(CP(ABE_MCBSP1_DX),   (OFF_EN | OFF_OUT_PTD | M0)) /* abe_mcbsp1_dx */ \
        MV(CP(ABE_MCBSP1_FSX),  (IEN | OFF_EN | OFF_PD | OFF_IN | M0)) /* abe_mcbsp1_fsx */ \
        MV(CP(ABE_MCBSP1_DX),   (OFF_EN | OFF_OUT_PTD | M0)) /* abe_mcbsp1_dx */ \
        MV(CP(ABE_MCBSP1_FSX),  (IEN | OFF_EN | OFF_PD | OFF_IN | M0)) /* abe_mcbsp1_fsx */ \

Example 3: On OMAP4SDP/Blaze, the OMAP UART2 is connected to the BT-HCI-UART.

        MV(CP(UART2_CTS),       (PTU | IEN | M0)) /* uart2_cts */ \
        MV(CP(UART2_RTS),       (M0)) /* uart2_rts */ \
        MV(CP(UART2_RX),        (IEN | M0)) /* uart2_rx */ \
        MV(CP(UART2_TX),        (M0)) /* uart2_tx */ \

Note: Since there lacks a standard way to configure the hardware interfaces, please look into relevant BSP or contact the email ID mentioned below.


BTWILINK driver (in drivers/bluetooth/btwilink.c) provides the bluetooth connectivity. The driver makes use of the shared transport driver; which talks to the bluetooth core on the WiLink chipsets.

Enable this driver either as a module or as a built-in component along with necessary bluetooth functionality in the kernel.

Similar to the TI ST driver, this is also a platform device driver. Hence, to be included it requires a relevant platform device registration, which can be achieved as follows:

static struct platform_device btwilink_device = {
       .name = "btwilink",
       .id = -1,

The inclusion of btwilink_device in one of the architecture specific init functions would enable the Bluetooth driver for WiLink chipsets. Include the following line in one of the architecture/platform specific init functions:


User Space components

An utility known as UIM is critical for the shared transport (TI_ST) driver to work. (Meaning, without UIM, TI_ST will not work.) Most line disciplines, if not all, require a user-space daemon to open the UART. Installing the line discipline thereby gives control to the line discipline driver.

You can obtain UIM from:;a=summary .

The latest can be found at the Gingerbread branch. It's named uim-sysfs. Follow this link to get it:;a=tree;f=ti_st/uim-sysfs;h=12ce6bafd461474ad90d41a0b9523a94534e4c0a;hb=refs/heads/gingerbread

UIM needs to be run at boot since some Linux flavors may require Bluetooth or GPS to be turned on at boot.

To do so (run at boot time), have the UIM entry in one of your rc.S files. Alternatively, you can specify a special udev rule based on the platform driver in addition to the device "kim" [Need Modification].

For Android, the following entry in the init.rc should suffice:

service uim /system/bin/uim-sysfs
    user root
    group media bluetooth

Setting up the Firmware

All three connectivities -- Bluetooth, FM and GPS -- require their own firmware files. The Bluetooth firmware core file is used earlier (first) than the other cores in WiLink.

The latest firmware files are available on this site:

Shared Transport driver uses the firmware class sub-system to download firmware files. Hence the firmware ".bts" files should be placed in /system/etc/firmware/ for Android and /lib/firmware/ for Ubuntu.

On Boot Check

Since there are many versions of the drivers floating around and a lot needs to be done to get them all working fine, checking a few things as mentioned below will ensure that the porting effort went well :

Enabling Profiles on Android

Important Notes

The platform data and its structure constantly, inevitably change. Hence, before adding the platform device, make sure that the platform data matches in type and structure to the platform data defined in the file: include/linux/ti_wilink_st.h.

Support Contacts

If you have any questions, doubts or suggestions please send them to: WCG Leads.

Back to Connectivity Home Page

Personal tools