Menu

Firmware

Flashing the firmware

OSX

#Load environment variables
source /Applications/XMOS_xTIMEcomposer_Community_14.2.3/SetEnv.sh

#Flash with xflash
/Applications/XMOS_xTIMEcomposer_Community_14.2.3/bin/xflash --spi-spec AT25S.spec 8SoundsUSB_Firmware_500MHz_3.0.2.xe

Building the firmware

You can get the code by agreeing to the licence on the XMOS site and make few changes to the sw_usb_audio-[sw]_6.15.2rc1 reference firmware. Start from the app_usb_aud_l2 project and change the .xn file, customdefines.h and duplicate the i2c calls in audiohw.xc to configure both codecs.

File: 8SoundsUSB.xn (add to the project)

<?xml version="1.0" encoding="UTF-8"?>
<Network xmlns="http://www.xmos.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.xmos.com http://www.xmos.com">
  <Type>Device</Type>
  <Name>XS1-L16A-128-QF124-C10 Device</Name>

  <Declarations>
    <Declaration>tileref tile[2]</Declaration>
  </Declarations>

  <Nodes>
      <!-- Warning, This will cause C8 devices out of specs. Should not be problematic -->
      <!-- Use 400MHz if you prefer -->
      <Node Id="0" Type="XS1-L8A-64" oscillator="13Mhz" systemfrequency="500Mhz" referencefrequency="100MHz">
      <Core Number="0" Reference="tile[0]">
        <!-- SPI Ports --> 
        <Port Location="XS1_PORT_1A" Name="PORT_SPI_MISO"/>
        <Port Location="XS1_PORT_1B" Name="PORT_SPI_SS"/>
        <Port Location="XS1_PORT_1C" Name="PORT_SPI_CLK"/> 
        <Port Location="XS1_PORT_1D" Name="PORT_SPI_MOSI"/>

        <!-- Standard USB Audio Ports -->
        <Port Location="XS1_PORT_1L" Name="PORT_MCLK_IN2"/> 
        <Port Location="XS1_PORT_1M" Name="PORT_USB_RESET"/>
        <!--<Port Location="XS1_PORT_4E" Name="PORT_PLL_CLK"/>  -->
        <Port Location="XS1_PORT_32A" Name="PORT_MCLK_COUNT"/>
      </Core>
      <Boot>
        <Source Location="SPI:bootFlash"/>
        <Bootee NodeId="1"/>
      </Boot>
    </Node>
    <!-- Warning, This will cause C8 devices out of specs. Should not be problematic -->
    <!-- Use 400MHz if you prefer -->
    <Node Id="1" Type="XS1-L8A-64" oscillator="13Mhz" systemfrequency="500MHz" referencefrequency="100MHz">
      <Boot>
        <Source Location="XMOSLINK"/>
      </Boot>
      <Core Number="0" Reference="tile[1]">
        <!-- Standard USB Audio Ports -->
        <Port Location="XS1_PORT_1A" Name="PORT_I2S_ADC3"/>
        <Port Location="XS1_PORT_1B" Name="PORT_I2S_ADC2"/>
        <Port Location="XS1_PORT_1C" Name="PORT_I2C_SDA"/>
        <Port Location="XS1_PORT_1D" Name="PORT_I2C_SCL"/>
        <Port Location="XS1_PORT_1E" Name="PORT_I2S_LRCLK"/>
        <Port Location="XS1_PORT_1I" Name="PORT_I2S_BCLK"/>
        <Port Location="XS1_PORT_1J" Name="PORT_I2S_ADC0"/>
        <Port Location="XS1_PORT_1K" Name="PORT_I2S_ADC1"/>
        <Port Location="XS1_PORT_1L" Name="PORT_MCLK_IN"/>
        <Port Location="XS1_PORT_1M" Name="PORT_I2S_DAC0"/>
        <Port Location="XS1_PORT_1N" Name="PORT_I2S_DAC1"/>
        <Port Location="XS1_PORT_1O" Name="PORT_MIDI_OUT"/>
        <Port Location="XS1_PORT_1P" Name="PORT_MIDI_IN"/>

        <Port Location="XS1_PORT_4A" Name="PORT_AUD_CFG"/>
        <Port Location="XS1_PORT_4E" Name="PORT_PLL_REF"/>
        <Port Location="XS1_PORT_4F" Name="PORT_GPIO"/>
        <Port Location="XS1_PORT_8B" Name="PORT_LED"/>
      </Core>
    </Node>
  </Nodes>

  <Links>
    <Link Encoding="5wire" Delays="0,1">
      <LinkEndpoint NodeId="0" Link="4"/>
      <LinkEndpoint NodeId="1" Link="7"/>
    </Link>
    <Link Encoding="5wire" Delays="0,1">
      <LinkEndpoint NodeId="0" Link="5"/>
      <LinkEndpoint NodeId="1" Link="6"/>
    </Link>
    <Link Encoding="5wire" Delays="0,1">
      <LinkEndpoint NodeId="0" Link="6"/>
      <LinkEndpoint NodeId="1" Link="5"/>
    </Link>
    <Link Encoding="5wire" Delays="0,1">
      <LinkEndpoint NodeId="0" Link="7"/>
      <LinkEndpoint NodeId="1" Link="4"/>
    </Link>
    <Link Encoding="2wire" Delays="4,4" Flags="XSCOPE">
      <LinkEndpoint NodeId="0" Link="X0LA" />
      <LinkEndpoint RoutingId="0x8000" Chanend="1" />
    </Link>
  </Links>

  <Packages>
    <Package ID="0" Type="XS1-LnA-128-QF124">
      <Component NodeId="0" InPackage="0"/>
      <Component NodeId="1" InPackage="1"/>
    </Package>
  </Packages>

  <ExternalDevices>
    <Device NodeId="0" Core="0" Class="SPIFlash" Name="bootFlash" Type="AT25DF041A">
      <Attribute Name="PORT_SPI_MISO" Value="PORT_SPI_MISO"/>
      <Attribute Name="PORT_SPI_SS"   Value="PORT_SPI_SS"/>
      <Attribute Name="PORT_SPI_CLK"  Value="PORT_SPI_CLK"/>
      <Attribute Name="PORT_SPI_MOSI" Value="PORT_SPI_MOSI"/>
    </Device>
  </ExternalDevices>

  <JTAGChain>
     <JTAGDevice NodeId="0"/>
     <JTAGDevice NodeId="1"/>
  </JTAGChain>

</Network>

File: customdefines.h

#include "user_main.h"

/* Audio I/O is on tile 1 */
#define AUDIO_IO_TILE 1

/* Audio Class Version */
#ifndef AUDIO_CLASS
#define AUDIO_CLASS        (2)
#endif

/* When connected to a full-speed hub, run in USB Audio Class 2.0 mode */
#ifndef FULL_SPEED_AUDIO_2
#if (AUDIO_CLASS == 2)
#define FULL_SPEED_AUDIO_2 (1)
#else
#define FULL_SPEED_AUDIO_2 (0)
#endif
#endif

/* Defines relating to channel count and channel arrangement (0 for disable) */
/* Number of USB streaming channels */
#ifndef NUM_USB_CHAN_IN
#define NUM_USB_CHAN_IN    (8)              /* Device to Host */
#endif

#ifndef NUM_USB_CHAN_OUT
#define NUM_USB_CHAN_OUT   (4)              /* Host to Device */
#endif

/* S/PDIF Tx enabled by default */
#ifndef SPDIF_TX
#define SPDIF_TX           0
#endif

/* Enable Mixer Core(s) */
#ifndef MIXER
#define MIXER             1
#endif

/* Disable mixing - mixer core used for volume only */
#ifndef MAX_MIX_COUNT
#define MAX_MIX_COUNT      0
#endif

/* Device is self powered (i.e. not USB bus powered) */
#define SELF_POWERED       1

/* Number of IS2 chans to DAC..*/
#ifndef I2S_CHANS_DAC
#define I2S_CHANS_DAC      (4)
#endif

/* Number of I2S chans from ADC */
#ifndef I2S_CHANS_ADC
#define I2S_CHANS_ADC      (8)
#endif

/* SPDIF and ADAT first input chan indices */
#define SPDIF_RX_INDEX     (6)
#define ADAT_RX_INDEX      (8)
#define SPDIF_TX_INDEX     (I2S_CHANS_DAC)

#if defined(SPDIF_TX) && (SPDIF_TX==1)
#define ADAT_TX_INDEX      (SPDIF_TX_INDEX+2)
#else
#define ADAT_TX_INDEX      (I2S_CHANS_DAC)
#endif

/* Master clock defines (in Hz) */
#define MCLK_441           (512*44100)       /* 44.1, 88.2 etc */
#define MCLK_48            (512*48000)       /* 48, 96 etc */

/* Maximum frequency device runs at */
#ifndef MAX_FREQ
#define MAX_FREQ           (192000)
#endif

/***** Defines relating to USB descriptors etc *****/
#define VENDOR_ID          (0x0000)
#define PID_AUDIO_1        (0x0005)
#define PID_AUDIO_2        (0x0004)

/* Flash device for DFU.  Device supported by tools so no need to spec */
//#define DFU_FLASH_DEVICE FL_DEVICE_ATMEL_AT25DF041A

#define PRODUCT_STR_A1 "8SoundsUSB Audio 1.0"
#define PRODUCT_STR_A2 "8SoundsUSB Audio 2.0"
#define AUDIO_CLASS_FALLBACK 0 //disabled
#define VENDOR_STR "IntRoLab"
#define BCD_DEVICE (0x0530)
#define MIN_FREQ 48000
#define DEFAULT_FREQ 96000

//NO DFU
#ifdef DFU
#undef DFU
#endif

File: audiohw.xc

//Define codec0 & codec1 addresses
#define COD0_DEV_ADRS                (0x90>>1)
#define COD1_DEV_ADRS                (0x92>>1)

//Find & replace the reset of codecs

//DL - reset both codecs    
p_aud_cfg <: 0b1001;

//Find & replace the i2c code to configure both codecs 

//0x2
i2c_master_write_reg(COD0_DEV_ADRS, 0x2, tmp, 1, i2cPorts);
i2c_master_write_reg(COD1_DEV_ADRS, 0x2, tmp, 1, i2cPorts);

//0x4
i2c_master_write_reg(COD0_DEV_ADRS, 0x4, tmp, 1, i2cPorts);
i2c_master_write_reg(COD1_DEV_ADRS, 0x4, tmp, 1, i2cPorts);

//0x5
//DL - DIFFERENTIAL...
//tmp[0] = 0x1C;
tmp[0] = 0x00;
i2c_master_write_reg(COD0_DEV_ADRS, 0x5, tmp, 1, i2cPorts);
i2c_master_write_reg(COD1_DEV_ADRS, 0x5, tmp, 1, i2cPorts);

//0x3
i2c_master_write_reg(COD0_DEV_ADRS, 0x3, tmp, 1, i2cPorts);
i2c_master_write_reg(COD1_DEV_ADRS, 0x3, tmp, 1, i2cPorts);

//0x2
i2c_master_write_reg(COD0_DEV_ADRS, 0x2, tmp, 1, i2cPorts);
i2c_master_write_reg(COD1_DEV_ADRS, 0x2, tmp, 1, i2cPorts);

File: Makefile

# The TARGET variable determines what target system the application is 
# compiled for. It either refers to an XN file in the source directories
# or a valid argument for the --target option when compiling.

TARGET = 8SoundsUSB
APP_NAME =

# The flags passed to xcc when building the application
BUILD_FLAGS     =  -DFLASH_MAX_UPGRADE_SIZE=64*1024 -fcomment-asm -Xmapper --map -Xmapper MAPFILE -Wall -O3 -report -lflash -fsubword-select -save-temps -g -DXUD_SERIES_SUPPORT=2 -DXSCOPE=1 -fxscope -DADAT_TX_USE_SHARED_BUFF=1
#-fschedule

TEST_DFU_1 ?= 0
ifeq ($(TEST_DFU_1),1)
BUILD_FLAGS += -DBCD_DEVICE=0x9901
endif
TEST_DFU_2 ?= 0
ifeq ($(TEST_DFU_2),1)
BUILD_FLAGS += -DBCD_DEVICE=0x9902
endif

#Test build configs (Note these make use of the defaults in customdefines.h)

# Audio Class 2, Input, Output, No MIDI, No SPDIF, TDM
XCC_FLAGS_2io_tdm8 = $(BUILD_FLAGS) -DSPDIF_TX=0 -DI2S_MODE_TDM=1 -DMAX_FREQ=96000 -DI2S_CHANS_DAC=8 -DI2S_CHANS_ADC=8 -DNUM_USB_CHAN_OUT=8 -DNUM_USB_CHAN_IN=8
INCLUDE_ONLY_IN_2io_tdm8 =

# Audio Class 2, no Input, Output, no MIDI, SPDIF
XCC_FLAGS_2xoxs = $(BUILD_FLAGS) -DMIDI=0 -DSPDIF_TX=1 -DNUM_USB_CHAN_IN=0 -DI2S_CHANS_ADC=0
INCLUDE_ONLY_IN_2xoxs = 

# Audio Class 2, Input, Output, No MIDI, No SPDIF
XCC_FLAGS_2ioxx = $(BUILD_FLAGS) -DSPDIF_TX=0
INCLUDE_ONLY_IN_2ioxx =  

# Audio Class 2, Input, Output, No MIDI, No SPDIF, Mixing
XCC_FLAGS_2ioxx_mix8 = $(BUILD_FLAGS) -DSPDIF_TX=0 -DMAX_MIX_COUNT=8
INCLUDE_ONLY_IN_2ioxx_mix8 =  

# Audio Class 2, Input, Output, No MIDI, SPDIF
XCC_FLAGS_2ioxs = $(BUILD_FLAGS)
INCLUDE_ONLY_IN_2ioxs = 

# Audio Class 2, Input, Output, MIDI, no SPDIF
XCC_FLAGS_2iomx = $(BUILD_FLAGS) -DMIDI=1 -DSPDIF_TX=0
INCLUDE_ONLY_IN_2iomx = 

# Audio Class 1, Input, Output, no MIDI, no SPDIF
XCC_FLAGS_1ioxx = $(BUILD_FLAGS) -DAUDIO_CLASS=1 -DMIDI=0 -DSPDIF_TX=0
INCLUDE_ONLY_IN_1ioxx = 

# Audio Class 2, Input, Output, No MIDI, SPDIF out, SPDIF in
XCC_FLAGS_2io_spdifout_spdifin = $(BUILD_FLAGS) -DSPDIF_RX=1
INCLUDE_ONLY_IN_2io_spdifout_spdifin = 

# Audio Class 2, Input, Output, ADAT out
XCC_FLAGS_2io_adatout = $(BUILD_FLAGS) -DSPDIF_TX=0 -DMIDI=0 -DADAT_TX=1 -DMAX_FREQ=96000 -DNUM_USB_CHAN_OUT=16
INCLUDE_ONLY_IN_2io_adatout = 

# Audio Class 2, Input, Output, SPDIF out, ADAT out
XCC_FLAGS_2io_spdifout_adatout = $(BUILD_FLAGS) -DMIDI=0 -DADAT_TX=1 -DMAX_FREQ=96000 -DNUM_USB_CHAN_OUT=18
INCLUDE_ONLY_IN_2io_spdifout_adatout = 

# Audio Class 2, Input, Output, No MIDI, SPDIF out, SPDIF in, Mixer enabled
XCC_FLAGS_2io_spdifout_spdifin_mix8 = $(BUILD_FLAGS) -DSPDIF_RX=1 -DMAX_MIX_COUNT=8 -DLEVEL_METER_LEDS=1 -DLEVEL_METER_HOST=1
INCLUDE_ONLY_IN_2io_spdifout_spdifin_mix8 = 

# Audio Class 2, Input, Output, No MIDI, ADAT in
XCC_FLAGS_2io_adatin = $(BUILD_FLAGS) -DNUM_USB_CHAN_IN=16 -DADAT_RX=1 -DMAX_FREQ=96000
INCLUDE_ONLY_IN_2io_adatin = 

# Audio Class 1, no Input, Output, no MIDI, no SPDIF
XCC_FLAGS_1xoxx = $(BUILD_FLAGS) -DAUDIO_CLASS=1 -DMIDI=0 -DSPDIF_TX=0 -DNUM_USB_CHAN_IN=0
INCLUDE_ONLY_IN_1xoxx = 

ifeq ($(TEST_CONFIGS),1)
XCC_FLAGS_2ioxs_codec_master = $(BUILD_FLAGS) -DCODEC_MASTER=1
endif

ifeq ($(TEST_CONFIGS),1)
    XCC_FLAGS_upgrade1 = $(BUILD_FLAGS) -DBCD_DEVICE_J=0x99 -DBCD_DEVICE_M=0x0 -DBCD_DEVICE_N=0x1
    XCC_FLAGS_upgrade2 = $(BUILD_FLAGS) -DBCD_DEVICE_J=0x99 -DBCD_DEVICE_M=0x0 -DBCD_DEVICE_N=0x2
endif

# The USED_MODULES variable lists other module used by the application. These
# modules will extend the SOURCE_DIRS, INCLUDE_DIRS and LIB_DIRS variables. 
# Modules are expected to be in the directory above the BASE_DIR directory.
USED_MODULES = module_usb_shared module_xud module_usb_audio module_spdif_tx module_spdif_rx module_usb_midi module_dfu module_usb_device module_i2c_simple module_adat_rx module_adat_tx

MODULE_LIBRARIES = xud_l

#=============================================================================
# The following part of the Makefile includes the common build infrastructure
# for compiling XMOS applications. You should not need to edit below here.

XMOS_MAKE_PATH ?= ../..
include $(XMOS_MAKE_PATH)/xcommon/module_xcommon/build/Makefile.common

Build

Build the 2ioxx target.

That's it!

Enjoy!


Related

8SoundsUSB-Wiki: Main_Page

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.