OMAP-L137 Audio Drivers in the DSP + Linux

From Texas Instruments Embedded Processors Wiki

Jump to: navigation, search
Translate this page to   

Contents

Introduction

This article discusses implementing communication between the ARM and DSP processors within a highly integrated SoC device, using DSPLink. A demo is provided for the OMAP-L137 DSP + ARM processor. For more information, about this processor please see C674x/OMAPL1x Introductory Information.

In the traditional use for the multicore DSP + ARM devices with Codec Engine, the DSP works as a hardware accelerator to run algorithms that are 'too heavy' for the ARM to run by itself. So, in this case, the ARM has device drivers that control the peripherals (McASP, SPI, UART, etc), and the DSP acts as little more than an 'accelerator' peripheral to the ARM as seen in the figure below.

Codec Engine Application Block Diagram

If you are not using the Drivers on the DSP side, only using the DSP as a hardware accelerator to run algorithms, particularly if you want to work with multiple XDAIS compliant algorithms, please see:

Getting started with IUNIVERSAL

OMAP-L137 iUniversal + ALSA driver

Some developers might want more flexibility for specific applications where the DSP would be able to talk to the peripherals as well as shown in the figure below.

DSPLink Application Block Diagram

The demo provided in this article is an example application where this is implemented. The audio interface is controlled by the DSP, and a simple command line GUI is implemented by the ARM. The ARM and DSP communicate using DSPLink.

This application is a basic example provided "as is" to help developers get started.

Overview of the Application

Here is the diagram of how this example project operates:

DSPLink Audio Example Application Block Diagram


The ARM side of this application:


The DSP side of this application:

Prerequisites

Stop and make sure you have the prerequisites installed

Before you get started with this application:


After installing the software, make sure you are using a consistent version combination. Here are the combinations tested and approved:

1) For the versions below, use the installation part of the Getting Started Guides above:

2)

  • Available (requires my.ti.com account) here

Adapting your Linux Kernel to avoid conflicts

In this application, the DSP and the ARM access peripherals using device drivers. In this case, it is necessary to make sure that only one of the cores has control of a given peripheral to avoid access conflicts.

Resource conflict between ARM and DSP

For example, if the DSP is controlling the McASP port, than the ARM should not try to access it in order to avoid conflicts. So the first step in this case would be to identify all of the resources that are used in the DSP and disable it's use in the ARM side. It is possible to achieve that by disabling this resources in the Linux kernel.

Resource agreement between ARM and DSP


Resources used by the DSP

Here is the list of the peripherals that the DSP side uses:

Resources used by the ARM

This Linux side application does not directly touch any peripherals that could cause conflicts with the DSP side. If this example is used as a starting point to more complex applications, make sure to avoid conflitcs with the resources used by the DSP.

Disabling resources in the ARM

To change the Linux Driver configuration, please follow the steps in the page: Building the OMAP-L137 Linux Kernel. In the menuconfig step (host $ make ARCH=arm CROSS_COMPILE=arm_v5t_le- menuconfig), please make the changes below.

Necessary changes in the Linux kernel

Disabling Audio Driver

Necessary: If the Sound Card Support is not disabled, the DSP side can not access it's audio driver, so application does not work.

To change the Linux Driver configuration, please follow the steps in the page: Building the OMAP-L137 Linux Kernel

In menuconfig (see Configuring Linux Kernel in the page above) , disable Device Drivers -> Sound ---> Sound Card support:

Removing Sound Card support from the Linux kernel
Disabling I2C Driver

Necessary: If the I2C Support is not disabled, the DSP side I2C driver conflicts with the I2C Linux driver, so application does not work around 30% of the time it is called.


In menuconfig, disable CONFIG_I2C at Device Device Drivers -> I2C Support -> I2C support:

Removing I2C support from the Linux kernel

Optional changes in the Linux kernel

Disabling Timer1

Optional: Chaging the code and removing the watchdog timer from the Linux kernel configuration is optional. This Linux application did not present any conflicts.


The DSP side will have to use the Timer1 for the DSP/BIOS clock. To avoid possible conflicts, follow the steps bellow:

1) In the file /home/user/workdir/lsp/ti-davinci/linux-2.6.18_pro500/arch/arm/mach-da8xx/time.c, comment the usage of timer1 as the DSP is going to use this:

static  int da8xx_timer_irqs[NUM_TIMERS] = {
IRQ_DA8XX_TINT12_0,
IRQ_DA8XX_TINT34_0,
#if 0
IRQ_DA8XX_TINT12_1,
IRQ_DA8XX_TINT34_1
#endif
};

2) In the file /home/user/workdir/lsp/ti-davinci/linux-2.6.18_pro500/arch/arm/mach-da8xx/reset.c, comment the watchdog reset:

void arch_reset(char mode)
{
//      davinci_watchdog_reset(DA8XX_WDOG_BASE);
}

3) In the file /home/user/workdir/lsp/ti-davinci/linux-2.6.18_pro500/include/asm-arm/arch-davinci/time.h, comment the TI_BOT and TI_TOP:

enum {
T0_BOT,
T0_TOP,
/*        T1_BOT, */
/*        T1_TOP, */
NUM_TIMERS
};


4) Remove the support for watchdog in the Linux kernel. To change the Linux Driver configuration, please follow the steps in the page: Building the OMAP-L137 Linux Kernel.

In menuconfig (see Configuring Linux Kernel in the page above), disable CONFIG_WATCHDOG at Device Drivers-> Character devices-> Watchdog Cards-> Watchdog Timer Support:

Removing Watchdog Timer Support from the Linux kernel
Disabling SPI Driver

Optional: Removing SPI support from the Linux kernel configuration is optional. This Linux application did not present any conflicts.

As the SPI and the I2C pins are muxed, it is prudent (but not necessary) to disable SPI support in the Linux kernel.

In menuconfig, disable CONFIG_SPI at Device Device Drivers -> SPI Support -> SPI support:

Removing SPI support from the Linux kernel

Rebuilding DSPLink

Because changes were made in the kernel, it is necessary to rebuild DSPLink. Follow the procedure at (just build DSPLINK, you are not going to use Codec engine for this application):

Manually building the SDK - DSPLink

Installing the Software

Linux only build installation

If you are going to use Linux to build both DSP and ARM sides, than you do not need to download the AudioLink.zip.

  1. The software can be downloaded from the TI forum
  2. Extract the AudioDSPgpp.tgz to the desired working directory on the host Linux PC:
    host $ tar -xvzf AudioLinkLinux.tar.gz

About the software

This example has 2 parts: code for the DSP and code for the ARM.

The code provided for the ARM is inside the directory AudioDSP/AudioDSPgpp. This uses a Makefile in Linux to build the ARM side.

The code provided by the DSP in inside the directory AudioDSP/AudioDSPdsp. This uses Makefile in Linux to build the DSP side as well.

Building the application

ARM side

Adapt AudioDSP/Rules.make

Before moving on to the build process make sure the AudioDSP/Rules.make file contains the correct installation directories.

This release already uses the standard installation directory structure used in the Getting Started Guide for OMAP-L137, therefore changes to the Rules.Make should be minor.

For reference, the places to change directories are shown below.

In the Rules.make, changes should be needed at the following places:

#   ----------------------------------------------------------------------------
#   Base for toolchain
#   This may change depending if you are using Montavista or Codesourcery
#   ----------------------------------------------------------------------------
BASE_TOOLCHAIN := /opt/mv_pro_5.0/montavista/pro/devkit/arm/v5t_le
#BASE_TOOLCHAIN := /opt/arm/arm-2007q3       # Codesourcery tools

#   ----------------------------------------------------------------------------
#   Name of the Linux compiler
#   This may change depending if you are using Montavista or Codesourcery
#   ----------------------------------------------------------------------------
CC_GPP := arm_v5t_le-gcc
#CC_GPP := arm-none-linux-gnueabi-gcc
#   ----------------------------------------------------------------------------
#   Base for SDK
#   This may have to be changed depending on your installation paths and SDK 
#   version
#   ----------------------------------------------------------------------------
SDK_INSTALL_DIR = /home/user/OMAPL137_arm_1_00_00_10
#   ----------------------------------------------------------------------------
#   Base for DSPLink
#   This may have to be changed depending on your installation paths 
#   and DSPLink version
#   ----------------------------------------------------------------------------
DSPLINK = $(SDK_INSTALL_DIR)/dsplink-1_61_03-prebuilt/packages/dsplink
# Path to copy the executable on the target file system
APP_INSTALL_DIR = /home/user/workdir/filesys/opt/AudioDSPlink

Build ARM side

To build the ARM side of the application, please use the commands:

host $ cd AudioDSPgpp
host $ make clean
host $ make all

After the build is complete, the ARM executable will be at:

AudioDSPgpp/Debug
OR
AudioDSPgpp/Release

DSP side

Copy PSP

Because you are buillding the application in Linux and the PSP comes with a Windows installer (that was installed in the Getting Started Guide for C6747), you need to copy the files from your Windows machine to your Linux machine.

So choose your favorite method to tranfer the directory below from your Windows machine:

To the directory below in your Linux machine:

Adapt AudioDSP/Rules.make

Before moving on to the build process make sure the AudioDSP/Rules.make file contains the correct installation directories.

This release already uses the standard installation directory structure used in the Getting Started Guide for OMAP-L137, therefore changes to the Rules.Make should be minor.

For reference, the places to change directories are shown below.

In the Rules.make, changes should be needed at the following places:

#   ----------------------------------------------------------------------------
#   Base for TI toolchain
#   This may change depending if you are using other versions of the compiler
#   ----------------------------------------------------------------------------
BASE_COMPILER = $(SDK_INSTALL_DIR)/cg6x_6_1_9
BASE_SABIOS = $(SDK_INSTALL_DIR)/bios_5_33_05

# Path to XDC Tools root dir
XDC_INSTALL_DIR = $(SDK_INSTALL_DIR)/xdctools_3_16_01_27

# Path the DSP-side EDMA3 Low Level Driver root dir 
EDMA3LLD_INSTALL_DIR = $(SDK_INSTALL_DIR)/edma3_lld_01_10_00_01
# Path to the DSP-side Platform Support Package driver root dir
BIOSPSP_INSTALL_DIR = $(SDK_INSTALL_DIR)/pspdrivers_01_20_00

If you did not rebuild DSPLink it is necessary to adapt the variables LDINCLUDES_D and LDINCLUDES_R in the AudioDSP/Rules.make file:

#   ----------------------------------------------------------------------------
#   Linker library search path for Debug
#   ----------------------------------------------------------------------------
LDINCLUDES_D = $(LDINCLUDES) -i$(DSPLINK)/dsp/export/BIN/DspBios/OMAPL1XX/OMAPL1XXGEM_0/DEBUG/
# If the DSP/Link was rebuilt by the user, replace the line above 
# with the one below to use the updated libraries
#LDINCLUDES_D = $(LDINCLUDES) -i$(DSPLINK)/dsp/BUILD/OMAPL1XXGEM_0/EXPORT/DEBUG/

#   ----------------------------------------------------------------------------
#   Linker library search path for Release
#   ----------------------------------------------------------------------------
LDINCLUDES_R = $(LDINCLUDES) -i$(DSPLINK)/dsp/export/BIN/DspBios/OMAPL1XX/OMAPL1XXGEM_0/RELEASE/
# If the DSP/Link was rebuilt by the user, replace the line above 
# with the one below to use the updated libraries
#LDINCLUDES_R = $(LDINCLUDES) -i$(DSPLINK)/dsp/BUILD/OMAPL1XXGEM_0/EXPORT/RELEASE/
Build DSP side in Linux
  1. To build the DSP side of the application, please use the commands:
    host $ cd AudioDSPdsp
    host $ make clean
    host $ make all
  2. If you have any problems, please see secion tips for "Build DSP side in Linux"
  3. After the build is complete, the DSP executable will be at:
    AudioDSPdsp/Debug
    OR
    AudioDSPdsp/Release

Calling the application

In this guide, commands are preceded by prompts that indicate the environment where the command is to be typed. For example:

Indicates command to be typed into the shell window of the host Linux workstation.
Indicates commands to be typed into the Linux shell in the terminal window connected to the EVM board's serial port.

Copy the files to the target filesystem

  1. Make the directory:
    • host $ mkdir /home/user/workdir/filesys/opt/AudioDSPlink
    • host $ cd home/user/workdir/filesys/opt/AudioDSPlink
    NOTE: the directory above has to be compatible with the APP_INSTALL_DIR variablen in the Rules.make file.
  2. Copy the file AudioDSPgpp from the installation directory AudioDSPgpp/Debug or AudioDSPgpp/Release to the /home/user/workdir/filesys/opt/AudioDSPlink, you can do that by using the "make installD" or make "InstallR" option:
    • cd to the AudioDSPgpp directory
    • To copy the Debug version (after version is built):
    • host $ make installD
    • To copy the Release version (after version is built):
    • host $ make installR
    NOTE: this will copy the the files to the install directory (APP_INSTALL_DIR) specified at the Rules.make file.
  3. Copy the file AudioLink.out to the /home/user/workdir/filesys/opt/AudioDSPlink directory in your Linux Machine:
    • If you chose to build the DSP side in Linux:
    • cd to the AudioDSPdsp directory
    • To copy the Debug version (after version is built):
    • host $ make installD
    • To copy the Release version (after version is built):
    • host $ make installR
    NOTE: this will copy the the files to the install directory (APP_INSTALL_DIR) specified at the Rules.make file.
  4. Copy the file loadmodules.sh from the installation application's installation directory to the /home/user/workdir/filesys/opt/AudioDSPlink
  5. Copy the dsplink module:
    Get the one you rebuilt according to page Building The OMAP-L1 SDK:
    • host $ cp /home/<useracct>/OMAPL137_arm_1_##_##_##/DSPLINK_DIR/packages/dsplink/gpp/export/BIN/Linux/OMAPL1XX/RELEASE/dsplinkk.ko .

Running the application

From the target board command prompt, the application can be executed as follows:

target $ cd /opt/AudioDSPlink
target $ ./loadmodules.sh
OR
target $ insmod dsplinkk.ko
target $ rm -f /dev/dsplink
target $ mknod /dev/dsplink c 230 0
target $ ./AudioDSPgpp AudioLink.out

The screen would show something similar to:

root@xx.xx.xx.xx:/opt/AudioDSPlink# ./AudioDSPgpp AudioLink.out
========== Sample Application : AudioDSP ==========
Entered AudioDSP_Create ()
Leaving AudioDSP_Create ()
Entered AudioDSP_Execute ()

Commands:
Change volume      - v <volume 0-256>  e.g. 'v 100'
Quit               - q

>

v 100

Debugging tips

tips for "Build DSP side in Linux"

  1. If you get the error below when building the application:
     <Linking>
     error: cannot find file "dsplinkdata.lib"
    
    It means that you did not rebuild DSPLink according to the page Building The OMAP-L1 SDK. Simply remove -ldsplinkdata.lib to the LIBS variable in the AudioDSP/Rules.make file.
  2. If you get the error below when building the application:
    
     ERROR:
     
     undefined           first referenced 
     
      symbol                  in file
     
     ---------         ----------------
     
     _DSPLINKDATA_init /home/user/OMAPL137_arm_1_00_00_10/dsplink-1_61_03-prebuilt/packages/dsplink/dsp/BUILD/OMAPL1XXGEM_0/EXPORT/DEBUG/dsplink.lib<dsplink.obj>
    
    It means that you rebuilt DSPLink according to the page Building The OMAP-L1 SDK. Simply add -ldsplinkdata.lib to the LIBS variable in the AudioDSP/Rules.make file.


  3. If you get the error below when building the application:
     /home/<useract>/OMAPL137_arm_1_00_00_11/bios_5_33_05/xdctools/tconf: Permission denied
     *** [AudioLinkcfg.s62] Error 126
     Leaving directory `/home/<useract>/workdir/omaplaudio/AudioDSP/AudioDSPdsp/build'
     make: *** [build/AudioLinkcfg.cmd] Error 2
    

    You probably have DSP/BIOS version 5.33.05. Due to a bug in DSP/BIOS 5.33.05 for Linux, you will have to add executable permissions to the <tconf> and <tconf.x86U> files in the bios directory. For example:

    host $ cd /home/user/OMAPL137_arm_1_00_00_xx/bios_5_33_05/xdctools
    host $ chmod +x tconf
    host $ chmod +x tconf.x86U
  4. If you get the error below when building the application:
     <Linking>
     undefined                        first referenced                                                           
      symbol                              in file                                                                
     ---------                        ----------------    
    _EDMA3_DRV_disableLogicalChannel  /home/a0193480/OMAPL137_arm_1_00_00_11/pspdrivers_01_30_01/packages/ti/pspiom/i2c/lib/OMAPL137/Debug/ti.pspiom.i2c.a674<I2c.obj>
     error: unresolved symbols remain
     errors encountered during linking; "Debug/AudioLink.out" not built
     Compilation failure
     make: *** [Debug/AudioLink.out] Error 1
    
    Your EDMA version maybe old comared with your PSP version. Please get the latest EDMA version at this link.
  5. If you get the error below when building the application:
    <Linking>
    error: cannot find file "dsplink.lib"
    error: cannot find file "dsplinkpool.lib"
    error: cannot find file "dsplinkmpcs.lib"
    error: cannot find file "dsplinkmplist.lib"
    error: cannot find file "dsplinkmsg.lib"
    error: cannot find file "dsplinknotify.lib"
    error: cannot find file "dsplinkringio.lib"
      undefined     first referenced
     symbol           in file
     ---------     ----------------
    _DSPLINK_init Release/AudioLink_main.obj
    _SMAPOOL_FXNS Release/AudioDSP_config.obj
    _SMAPOOL_init Release/AudioDSP_config.obj
    _ZCPYMQT_FXNS Release/AudioDSP_config.obj
    _ZCPYMQT_init Release/AudioDSP_config.obj
    error: unresolved symbols remain
    error: errors encountered during linking; "Release/AudioLink.out" not built
    >> Compilation failure
    make: *** [Release/AudioLink.out] Error 1
    
    It means that you did not rebuild DSPLink according to the page [[Building_The_OMAP-L137_SDK#DSPLink | Building The OMAP-L1 SDK]. Please see Adapt AudioDSP/AudioDSPdsp/Rules.make
E2e.jpg For technical support on OMAP please post your questions on The OMAP Forum. Please post only comments about the article OMAP-L137 Audio Drivers in the DSP + Linux here.
Hyperlink blue.png Links
ARM Microcontroller MCU ARM Processor Digital Media Processor Digital Signal Processing Microcontroller MCU Multi Core Processor
Ultra Low Power DSP 8 bit Microcontroller MCU 16 bit Microcontroller MCU 32 bit Microcontroller MCU

Leave a Comment
Personal tools
Namespaces
Variants
Actions
Navigation
Print/export
Toolbox