| /****************************************************************************** |
| * Filename: hw_i2s_h |
| * Revised: 2016-03-14 09:20:59 +0100 (Mon, 14 Mar 2016) |
| * Revision: 45924 |
| * |
| * Copyright (c) 2015 - 2016, Texas Instruments Incorporated |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions are met: |
| * |
| * 1) Redistributions of source code must retain the above copyright notice, |
| * this list of conditions and the following disclaimer. |
| * |
| * 2) Redistributions in binary form must reproduce the above copyright notice, |
| * this list of conditions and the following disclaimer in the documentation |
| * and/or other materials provided with the distribution. |
| * |
| * 3) Neither the name of the ORGANIZATION nor the names of its contributors may |
| * be used to endorse or promote products derived from this software without |
| * specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
| * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
| * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
| * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
| * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
| * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
| * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
| * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
| * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
| * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
| * POSSIBILITY OF SUCH DAMAGE. |
| * |
| ******************************************************************************/ |
| |
| #ifndef __HW_I2S_H__ |
| #define __HW_I2S_H__ |
| |
| //***************************************************************************** |
| // |
| // This section defines the register offsets of |
| // I2S component |
| // |
| //***************************************************************************** |
| // WCLK Source Selection |
| #define I2S_O_AIFWCLKSRC 0x00000000 |
| |
| // DMA Buffer Size Configuration |
| #define I2S_O_AIFDMACFG 0x00000004 |
| |
| // Pin Direction |
| #define I2S_O_AIFDIRCFG 0x00000008 |
| |
| // Serial Interface Format Configuration |
| #define I2S_O_AIFFMTCFG 0x0000000C |
| |
| // Word Selection Bit Mask for Pin 0 |
| #define I2S_O_AIFWMASK0 0x00000010 |
| |
| // Word Selection Bit Mask for Pin 1 |
| #define I2S_O_AIFWMASK1 0x00000014 |
| |
| // Word Selection Bit Mask for Pin 2 |
| #define I2S_O_AIFWMASK2 0x00000018 |
| |
| // Audio Interface PWM Debug Value |
| #define I2S_O_AIFPWMVALUE 0x0000001C |
| |
| // DMA Input Buffer Next Pointer |
| #define I2S_O_AIFINPTRNEXT 0x00000020 |
| |
| // DMA Input Buffer Current Pointer |
| #define I2S_O_AIFINPTR 0x00000024 |
| |
| // DMA Output Buffer Next Pointer |
| #define I2S_O_AIFOUTPTRNEXT 0x00000028 |
| |
| // DMA Output Buffer Current Pointer |
| #define I2S_O_AIFOUTPTR 0x0000002C |
| |
| // SampleStaMP Generator Control Register |
| #define I2S_O_STMPCTL 0x00000034 |
| |
| // Captured XOSC Counter Value, Capture Channel 0 |
| #define I2S_O_STMPXCNTCAPT0 0x00000038 |
| |
| // XOSC Period Value |
| #define I2S_O_STMPXPER 0x0000003C |
| |
| // Captured WCLK Counter Value, Capture Channel 0 |
| #define I2S_O_STMPWCNTCAPT0 0x00000040 |
| |
| // WCLK Counter Period Value |
| #define I2S_O_STMPWPER 0x00000044 |
| |
| // WCLK Counter Trigger Value for Input Pins |
| #define I2S_O_STMPINTRIG 0x00000048 |
| |
| // WCLK Counter Trigger Value for Output Pins |
| #define I2S_O_STMPOUTTRIG 0x0000004C |
| |
| // WCLK Counter Set Operation |
| #define I2S_O_STMPWSET 0x00000050 |
| |
| // WCLK Counter Add Operation |
| #define I2S_O_STMPWADD 0x00000054 |
| |
| // XOSC Minimum Period Value |
| #define I2S_O_STMPXPERMIN 0x00000058 |
| |
| // Current Value of WCNT |
| #define I2S_O_STMPWCNT 0x0000005C |
| |
| // Current Value of XCNT |
| #define I2S_O_STMPXCNT 0x00000060 |
| |
| // Captured XOSC Counter Value, Capture Channel 1 |
| #define I2S_O_STMPXCNTCAPT1 0x00000064 |
| |
| // Captured WCLK Counter Value, Capture Channel 1 |
| #define I2S_O_STMPWCNTCAPT1 0x00000068 |
| |
| // Masked Interrupt Status Register |
| #define I2S_O_IRQMASK 0x00000070 |
| |
| // Raw Interrupt Status Register |
| #define I2S_O_IRQFLAGS 0x00000074 |
| |
| // Interrupt Set Register |
| #define I2S_O_IRQSET 0x00000078 |
| |
| // Interrupt Clear Register |
| #define I2S_O_IRQCLR 0x0000007C |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_AIFWCLKSRC |
| // |
| //***************************************************************************** |
| // Field: [2] WCLK_INV |
| // |
| // Inverts WCLK source (pad or internal) when set. |
| // |
| // 0: Not inverted |
| // 1: Inverted |
| #define I2S_AIFWCLKSRC_WCLK_INV 0x00000004 |
| #define I2S_AIFWCLKSRC_WCLK_INV_BITN 2 |
| #define I2S_AIFWCLKSRC_WCLK_INV_M 0x00000004 |
| #define I2S_AIFWCLKSRC_WCLK_INV_S 2 |
| |
| // Field: [1:0] WCLK_SRC |
| // |
| // Selects WCLK source for AIF (should be the same as the BCLK source). The |
| // BCLK source is defined in the PRCM:I2SBCLKSEL.SRC |
| // ENUMs: |
| // RESERVED Not supported. Will give same WCLK as 'NONE' |
| // ('00') |
| // INT Internal WCLK generator, from module PRCM/ClkCtrl |
| // EXT External WCLK generator, from pad |
| // NONE None ('0') |
| #define I2S_AIFWCLKSRC_WCLK_SRC_W 2 |
| #define I2S_AIFWCLKSRC_WCLK_SRC_M 0x00000003 |
| #define I2S_AIFWCLKSRC_WCLK_SRC_S 0 |
| #define I2S_AIFWCLKSRC_WCLK_SRC_RESERVED 0x00000003 |
| #define I2S_AIFWCLKSRC_WCLK_SRC_INT 0x00000002 |
| #define I2S_AIFWCLKSRC_WCLK_SRC_EXT 0x00000001 |
| #define I2S_AIFWCLKSRC_WCLK_SRC_NONE 0x00000000 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_AIFDMACFG |
| // |
| //***************************************************************************** |
| // Field: [7:0] END_FRAME_IDX |
| // |
| // Defines the length of the Writing a non-zero value to this registerfield |
| // enables and initializes AIF. Note that before doing so, all other |
| // configuration must have been done, and AIFINPTR/AIFOUTPTR must have been |
| // loaded. |
| #define I2S_AIFDMACFG_END_FRAME_IDX_W 8 |
| #define I2S_AIFDMACFG_END_FRAME_IDX_M 0x000000FF |
| #define I2S_AIFDMACFG_END_FRAME_IDX_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_AIFDIRCFG |
| // |
| //***************************************************************************** |
| // Field: [9:8] AD2 |
| // |
| // Configures the AD2 audio data pin usage |
| // |
| // 0x3: Reserved |
| // ENUMs: |
| // OUT Output mode |
| // IN Input mode |
| // DIS Not in use (disabled) |
| #define I2S_AIFDIRCFG_AD2_W 2 |
| #define I2S_AIFDIRCFG_AD2_M 0x00000300 |
| #define I2S_AIFDIRCFG_AD2_S 8 |
| #define I2S_AIFDIRCFG_AD2_OUT 0x00000200 |
| #define I2S_AIFDIRCFG_AD2_IN 0x00000100 |
| #define I2S_AIFDIRCFG_AD2_DIS 0x00000000 |
| |
| // Field: [5:4] AD1 |
| // |
| // Configures the AD1 audio data pin usage: |
| // |
| // 0x3: Reserved |
| // ENUMs: |
| // OUT Output mode |
| // IN Input mode |
| // DIS Not in use (disabled) |
| #define I2S_AIFDIRCFG_AD1_W 2 |
| #define I2S_AIFDIRCFG_AD1_M 0x00000030 |
| #define I2S_AIFDIRCFG_AD1_S 4 |
| #define I2S_AIFDIRCFG_AD1_OUT 0x00000020 |
| #define I2S_AIFDIRCFG_AD1_IN 0x00000010 |
| #define I2S_AIFDIRCFG_AD1_DIS 0x00000000 |
| |
| // Field: [1:0] AD0 |
| // |
| // Configures the AD0 audio data pin usage: |
| // |
| // 0x3: Reserved |
| // ENUMs: |
| // OUT Output mode |
| // IN Input mode |
| // DIS Not in use (disabled) |
| #define I2S_AIFDIRCFG_AD0_W 2 |
| #define I2S_AIFDIRCFG_AD0_M 0x00000003 |
| #define I2S_AIFDIRCFG_AD0_S 0 |
| #define I2S_AIFDIRCFG_AD0_OUT 0x00000002 |
| #define I2S_AIFDIRCFG_AD0_IN 0x00000001 |
| #define I2S_AIFDIRCFG_AD0_DIS 0x00000000 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_AIFFMTCFG |
| // |
| //***************************************************************************** |
| // Field: [15:8] DATA_DELAY |
| // |
| // The number of BCLK periods between a WCLK edge and MSB of the first word in |
| // a phase: |
| // |
| // 0x00: LJF format |
| // 0x01: I2S and DSP format |
| // 0x02: RJF format |
| // ... |
| // 0xFF: RJF format |
| // |
| // Note: When 0, MSB of the next word will be output in the idle period between |
| // LSB of the previous word and the start of the next word. Otherwise logical 0 |
| // will be output until the data delay has expired. |
| #define I2S_AIFFMTCFG_DATA_DELAY_W 8 |
| #define I2S_AIFFMTCFG_DATA_DELAY_M 0x0000FF00 |
| #define I2S_AIFFMTCFG_DATA_DELAY_S 8 |
| |
| // Field: [7] MEM_LEN_24 |
| // |
| // The size of each word stored to or loaded from memory: |
| // ENUMs: |
| // 24BIT 24-bit (one 8 bit and one 16 bit locked access per |
| // sample) |
| // 16BIT 16-bit (one 16 bit access per sample) |
| #define I2S_AIFFMTCFG_MEM_LEN_24 0x00000080 |
| #define I2S_AIFFMTCFG_MEM_LEN_24_BITN 7 |
| #define I2S_AIFFMTCFG_MEM_LEN_24_M 0x00000080 |
| #define I2S_AIFFMTCFG_MEM_LEN_24_S 7 |
| #define I2S_AIFFMTCFG_MEM_LEN_24_24BIT 0x00000080 |
| #define I2S_AIFFMTCFG_MEM_LEN_24_16BIT 0x00000000 |
| |
| // Field: [6] SMPL_EDGE |
| // |
| // On the serial audio interface, data (and wclk) is sampled and clocked out on |
| // opposite edges of BCLK. |
| // ENUMs: |
| // POS Data is sampled on the positive edge and clocked |
| // out on the negative edge. |
| // NEG Data is sampled on the negative edge and clocked |
| // out on the positive edge. |
| #define I2S_AIFFMTCFG_SMPL_EDGE 0x00000040 |
| #define I2S_AIFFMTCFG_SMPL_EDGE_BITN 6 |
| #define I2S_AIFFMTCFG_SMPL_EDGE_M 0x00000040 |
| #define I2S_AIFFMTCFG_SMPL_EDGE_S 6 |
| #define I2S_AIFFMTCFG_SMPL_EDGE_POS 0x00000040 |
| #define I2S_AIFFMTCFG_SMPL_EDGE_NEG 0x00000000 |
| |
| // Field: [5] DUAL_PHASE |
| // |
| // Selects dual- or single-phase format. |
| // |
| // 0: Single-phase |
| // 1: Dual-phase |
| #define I2S_AIFFMTCFG_DUAL_PHASE 0x00000020 |
| #define I2S_AIFFMTCFG_DUAL_PHASE_BITN 5 |
| #define I2S_AIFFMTCFG_DUAL_PHASE_M 0x00000020 |
| #define I2S_AIFFMTCFG_DUAL_PHASE_S 5 |
| |
| // Field: [4:0] WORD_LEN |
| // |
| // Number of bits per word (8-24): |
| // In single-phase format, this is the exact number of bits per word. |
| // In dual-phase format, this is the maximum number of bits per word. |
| // |
| // Values below 8 and above 24 give undefined behavior. Data written to memory |
| // is always aligned to 16 or 24 bits as defined by MEM_LEN_24. Bit widths that |
| // differ from this alignment will either be truncated or zero padded. |
| #define I2S_AIFFMTCFG_WORD_LEN_W 5 |
| #define I2S_AIFFMTCFG_WORD_LEN_M 0x0000001F |
| #define I2S_AIFFMTCFG_WORD_LEN_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_AIFWMASK0 |
| // |
| //***************************************************************************** |
| // Field: [7:0] MASK |
| // |
| // Bit-mask indicating valid channels in a frame on AD0. |
| // |
| // In single-phase mode, each bit represents one channel, starting with LSB for |
| // the first word in the frame. A frame can contain up to 8 channels. Channels |
| // that are not included in the mask will not be sampled and stored in memory, |
| // and clocked out as '0'. |
| // |
| // In dual-phase mode, only the two LSBs are considered. For a stereo |
| // configuration, set both bits. For a mono configuration, set bit 0 only. In |
| // mono mode, only channel 0 will be sampled and stored to memory, and channel |
| // 0 will be repeated when clocked out. |
| // |
| // In mono mode, only channel 0 will be sampled and stored to memory, and |
| // channel 0 will be repeated in the second phase when clocked out. |
| // |
| // If all bits are zero, no input words will be stored to memory, and the |
| // output data lines will be constant '0'. This can be utilized when PWM debug |
| // output is desired without any actively used output pins. |
| #define I2S_AIFWMASK0_MASK_W 8 |
| #define I2S_AIFWMASK0_MASK_M 0x000000FF |
| #define I2S_AIFWMASK0_MASK_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_AIFWMASK1 |
| // |
| //***************************************************************************** |
| // Field: [7:0] MASK |
| // |
| // Bit-mask indicating valid channels in a frame on AD1. |
| // |
| // In single-phase mode, each bit represents one channel, starting with LSB for |
| // the first word in the frame. A frame can contain up to 8 channels. Channels |
| // that are not included in the mask will not be sampled and stored in memory, |
| // and clocked out as '0'. |
| // |
| // In dual-phase mode, only the two LSBs are considered. For a stereo |
| // configuration, set both bits. For a mono configuration, set bit 0 only. In |
| // mono mode, only channel 0 will be sampled and stored to memory, and channel |
| // 0 will be repeated when clocked out. |
| // |
| // In mono mode, only channel 0 will be sampled and stored to memory, and |
| // channel 0 will be repeated in the second phase when clocked out. |
| // |
| // If all bits are zero, no input words will be stored to memory, and the |
| // output data lines will be constant '0'. This can be utilized when PWM debug |
| // output is desired without any actively used output pins. |
| #define I2S_AIFWMASK1_MASK_W 8 |
| #define I2S_AIFWMASK1_MASK_M 0x000000FF |
| #define I2S_AIFWMASK1_MASK_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_AIFWMASK2 |
| // |
| //***************************************************************************** |
| // Field: [7:0] MASK |
| // |
| // Bit-mask indicating valid channels in a frame on AD2 |
| // |
| // In single-phase mode, each bit represents one channel, starting with LSB for |
| // the first word in the frame. A frame can contain up to 8 channels. Channels |
| // that are not included in the mask will not be sampled and stored in memory, |
| // and clocked out as '0'. |
| // |
| // In dual-phase mode, only the two LSBs are considered. For a stereo |
| // configuration, set both bits. For a mono configuration, set bit 0 only. In |
| // mono mode, only channel 0 will be sampled and stored to memory, and channel |
| // 0 will be repeated when clocked out. |
| // |
| // In mono mode, only channel 0 will be sampled and stored to memory, and |
| // channel 0 will be repeated in the second phase when clocked out. |
| // |
| // If all bits are zero, no input words will be stored to memory, and the |
| // output data lines will be constant '0'. This can be utilized when PWM debug |
| // output is desired without any actively used output pins. |
| #define I2S_AIFWMASK2_MASK_W 8 |
| #define I2S_AIFWMASK2_MASK_M 0x000000FF |
| #define I2S_AIFWMASK2_MASK_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_AIFPWMVALUE |
| // |
| //***************************************************************************** |
| // Field: [15:0] PULSE_WIDTH |
| // |
| // The value written to this register determines the width of the active high |
| // PWM pulse (pwm_debug), which starts together with MSB of the first output |
| // word in a DMA buffer: |
| // |
| // 0x0000: Constant low |
| // 0x0001: Width of the pulse (number of BCLK cycles, here 1). |
| // ... |
| // 0xFFFE: Width of the pulse (number of BCLK cycles, here 65534). |
| // 0xFFFF: Constant high |
| #define I2S_AIFPWMVALUE_PULSE_WIDTH_W 16 |
| #define I2S_AIFPWMVALUE_PULSE_WIDTH_M 0x0000FFFF |
| #define I2S_AIFPWMVALUE_PULSE_WIDTH_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_AIFINPTRNEXT |
| // |
| //***************************************************************************** |
| // Field: [31:0] PTR |
| // |
| // Pointer to the first byte in the next DMA input buffer. |
| // |
| // The read value equals the last written value until the currently used DMA |
| // input buffer is completed, and then becomes null when the last written value |
| // is transferred to the DMA controller to start on the next buffer. This event |
| // is signalized by aif_dma_in_irq. |
| // |
| // At startup, the value must be written once before and once after configuring |
| // the DMA buffer size in AIFDMACFG. |
| // |
| // The next pointer must be written to this register while the DMA function |
| // uses the previously written pointer. If not written in time, |
| // IRQFLAGS.PTR_ERR will be raised and all input pins will be disabled. |
| // |
| // Note the following limitations: |
| // - Address space wrapping is not supported. That means address(last sample) |
| // must be higher than address(first sample. |
| // - A DMA block cannot be aligned with the end of the address space, that |
| // means a block cannot contain the address 0xFFFF. |
| #define I2S_AIFINPTRNEXT_PTR_W 32 |
| #define I2S_AIFINPTRNEXT_PTR_M 0xFFFFFFFF |
| #define I2S_AIFINPTRNEXT_PTR_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_AIFINPTR |
| // |
| //***************************************************************************** |
| // Field: [31:0] PTR |
| // |
| // Value of the DMA input buffer pointer currently used by the DMA controller. |
| // Incremented by 1 (byte) or 2 (word) for each AHB access. |
| #define I2S_AIFINPTR_PTR_W 32 |
| #define I2S_AIFINPTR_PTR_M 0xFFFFFFFF |
| #define I2S_AIFINPTR_PTR_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_AIFOUTPTRNEXT |
| // |
| //***************************************************************************** |
| // Field: [31:0] PTR |
| // |
| // Pointer to the first byte in the next DMA output buffer. |
| // |
| // The read value equals the last written value until the currently used DMA |
| // output buffer is completed, and then becomes null when the last written |
| // value is transferred to the DMA controller to start on the next buffer. This |
| // event is signalized by aif_dma_out_irq. |
| // |
| // At startup, the value must be written once before and once after configuring |
| // the DMA buffer size in AIFDMACFG. At this time, the first two samples will |
| // be fetched from memory. |
| // |
| // The next pointer must be written to this register while the DMA function |
| // uses the previously written pointer. If not written in time, |
| // IRQFLAGS.PTR_ERR will be raised and all output pins will be disabled. |
| // |
| // Note the following limitations: |
| // - Address space wrapping is not supported. That means address(last sample) |
| // must be higher than address(first sample. |
| // - A DMA block cannot be aligned with the end of the address space, that |
| // means a block cannot contain the address 0xFFFF. |
| #define I2S_AIFOUTPTRNEXT_PTR_W 32 |
| #define I2S_AIFOUTPTRNEXT_PTR_M 0xFFFFFFFF |
| #define I2S_AIFOUTPTRNEXT_PTR_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_AIFOUTPTR |
| // |
| //***************************************************************************** |
| // Field: [31:0] PTR |
| // |
| // Value of the DMA output buffer pointer currently used by the DMA controller |
| // Incremented by 1 (byte) or 2 (word) for each AHB access. |
| #define I2S_AIFOUTPTR_PTR_W 32 |
| #define I2S_AIFOUTPTR_PTR_M 0xFFFFFFFF |
| #define I2S_AIFOUTPTR_PTR_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_STMPCTL |
| // |
| //***************************************************************************** |
| // Field: [2] OUT_RDY |
| // |
| // Low until the output pins are ready to be started by the samplestamp |
| // generator. When started (that is STMPOUTTRIG equals the WCLK counter) the |
| // bit goes back low. |
| #define I2S_STMPCTL_OUT_RDY 0x00000004 |
| #define I2S_STMPCTL_OUT_RDY_BITN 2 |
| #define I2S_STMPCTL_OUT_RDY_M 0x00000004 |
| #define I2S_STMPCTL_OUT_RDY_S 2 |
| |
| // Field: [1] IN_RDY |
| // |
| // Low until the input pins are ready to be started by the samplestamp |
| // generator. When started (that is STMPINTRIG equals the WCLK counter) the bit |
| // goes back low. |
| #define I2S_STMPCTL_IN_RDY 0x00000002 |
| #define I2S_STMPCTL_IN_RDY_BITN 1 |
| #define I2S_STMPCTL_IN_RDY_M 0x00000002 |
| #define I2S_STMPCTL_IN_RDY_S 1 |
| |
| // Field: [0] STMP_EN |
| // |
| // Enables the samplestamp generator. The samplestamp generator must only be |
| // enabled after it has been properly configured. |
| // When cleared, all samplestamp generator counters and capture values are |
| // cleared. |
| #define I2S_STMPCTL_STMP_EN 0x00000001 |
| #define I2S_STMPCTL_STMP_EN_BITN 0 |
| #define I2S_STMPCTL_STMP_EN_M 0x00000001 |
| #define I2S_STMPCTL_STMP_EN_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_STMPXCNTCAPT0 |
| // |
| //***************************************************************************** |
| // Field: [15:0] CAPT_VALUE |
| // |
| // The value of the samplestamp XOSC counter (STMPXCNT.CURR_VALUE) last time an |
| // event was pulsed (event source selected in [EVENT.I2SSTMPSEL0.EV] for |
| // channel 0). This number corresponds to the number of 24 MHz clock cycles |
| // since the last positive edge of the selected WCLK. |
| // The value is cleared when STMPCTL.STMP_EN = 0. |
| // Note: Due to buffering and synchronization, WCLK is delayed by a small |
| // number of BCLK periods and clk periods. |
| // Note: When calculating the fractional part of the sample stamp, STMPXPER may |
| // be less than this bit field. |
| #define I2S_STMPXCNTCAPT0_CAPT_VALUE_W 16 |
| #define I2S_STMPXCNTCAPT0_CAPT_VALUE_M 0x0000FFFF |
| #define I2S_STMPXCNTCAPT0_CAPT_VALUE_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_STMPXPER |
| // |
| //***************************************************************************** |
| // Field: [15:0] VALUE |
| // |
| // The number of 24 MHz clock cycles in the previous WCLK period (that is - |
| // the next value of the XOSC counter at the positive WCLK edge, had it not |
| // been reset to 0). |
| // The value is cleared when STMPCTL.STMP_EN = 0. |
| #define I2S_STMPXPER_VALUE_W 16 |
| #define I2S_STMPXPER_VALUE_M 0x0000FFFF |
| #define I2S_STMPXPER_VALUE_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_STMPWCNTCAPT0 |
| // |
| //***************************************************************************** |
| // Field: [15:0] CAPT_VALUE |
| // |
| // The value of the samplestamp WCLK counter (STMPWCNT.CURR_VALUE) last time an |
| // event was pulsed (event source selected in EVENT:I2SSTMPSEL0.EV for channel |
| // 0). This number corresponds to the number of positive WCLK edges since the |
| // samplestamp generator was enabled (not taking modification through |
| // STMPWADD/STMPWSET into account). |
| // The value is cleared when STMPCTL.STMP_EN = 0. |
| #define I2S_STMPWCNTCAPT0_CAPT_VALUE_W 16 |
| #define I2S_STMPWCNTCAPT0_CAPT_VALUE_M 0x0000FFFF |
| #define I2S_STMPWCNTCAPT0_CAPT_VALUE_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_STMPWPER |
| // |
| //***************************************************************************** |
| // Field: [15:0] VALUE |
| // |
| // Used to define when STMPWCNT is to be reset so number of WCLK edges are |
| // found for the size of the sample buffer. This is thus a modulo value for the |
| // WCLK counter. This number must correspond to the size of the sample buffer |
| // used by the system (that is the index of the last sample plus 1). |
| #define I2S_STMPWPER_VALUE_W 16 |
| #define I2S_STMPWPER_VALUE_M 0x0000FFFF |
| #define I2S_STMPWPER_VALUE_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_STMPINTRIG |
| // |
| //***************************************************************************** |
| // Field: [15:0] IN_START_WCNT |
| // |
| // Compare value used to start the incoming audio streams. |
| // This bit field shall equal the WCLK counter value during the WCLK period in |
| // which the first input word(s) are sampled and stored to memory (that is the |
| // sample at the start of the very first DMA input buffer). |
| // |
| // The value of this register takes effect when the following conditions are |
| // met: |
| // - One or more pins are configured as inputs in AIFDIRCFG. |
| // - AIFDMACFG has been configured for the correct buffer size, and at least 32 |
| // BCLK cycle ticks have happened. |
| // |
| // Note: To avoid false triggers, this bit field should be set higher than |
| // STMPWPER.VALUE. |
| #define I2S_STMPINTRIG_IN_START_WCNT_W 16 |
| #define I2S_STMPINTRIG_IN_START_WCNT_M 0x0000FFFF |
| #define I2S_STMPINTRIG_IN_START_WCNT_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_STMPOUTTRIG |
| // |
| //***************************************************************************** |
| // Field: [15:0] OUT_START_WCNT |
| // |
| // Compare value used to start the outgoing audio streams. |
| // |
| // This bit field must equal the WCLK counter value during the WCLK period in |
| // which the first output word(s) read from memory are clocked out (that is the |
| // sample at the start of the very first DMA output buffer). |
| // |
| // The value of this register takes effect when the following conditions are |
| // met: |
| // - One or more pins are configured as outputs in AIFDIRCFG. |
| // - AIFDMACFG has been configured for the correct buffer size, and 32 BCLK |
| // cycle ticks have happened. |
| // - 2 samples have been preloaded from memory (examine the AIFOUTPTR register |
| // if necessary). |
| // Note: The memory read access is only performed when required, that is |
| // channels 0/1 must be selected in AIFWMASK0/AIFWMASK1. |
| // |
| // Note: To avoid false triggers, this bit field should be set higher than |
| // STMPWPER.VALUE. |
| #define I2S_STMPOUTTRIG_OUT_START_WCNT_W 16 |
| #define I2S_STMPOUTTRIG_OUT_START_WCNT_M 0x0000FFFF |
| #define I2S_STMPOUTTRIG_OUT_START_WCNT_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_STMPWSET |
| // |
| //***************************************************************************** |
| // Field: [15:0] VALUE |
| // |
| // WCLK counter modification: Sets the running WCLK counter equal to the |
| // written value. |
| #define I2S_STMPWSET_VALUE_W 16 |
| #define I2S_STMPWSET_VALUE_M 0x0000FFFF |
| #define I2S_STMPWSET_VALUE_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_STMPWADD |
| // |
| //***************************************************************************** |
| // Field: [15:0] VALUE_INC |
| // |
| // WCLK counter modification: Adds the written value to the running WCLK |
| // counter. If a positive edge of WCLK occurs at the same time as the |
| // operation, this will be taken into account. |
| // To add a negative value, write "STMPWPER.VALUE - value". |
| // |
| #define I2S_STMPWADD_VALUE_INC_W 16 |
| #define I2S_STMPWADD_VALUE_INC_M 0x0000FFFF |
| #define I2S_STMPWADD_VALUE_INC_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_STMPXPERMIN |
| // |
| //***************************************************************************** |
| // Field: [15:0] VALUE |
| // |
| // Each time STMPXPER is updated, the value is also loaded into this register, |
| // provided that the value is smaller than the current value in this register. |
| // When written, the register is reset to 0xFFFF (65535), regardless of the |
| // value written. |
| // The minimum value can be used to detect extra WCLK pulses (this registers |
| // value will be significantly smaller than STMPXPER.VALUE). |
| #define I2S_STMPXPERMIN_VALUE_W 16 |
| #define I2S_STMPXPERMIN_VALUE_M 0x0000FFFF |
| #define I2S_STMPXPERMIN_VALUE_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_STMPWCNT |
| // |
| //***************************************************************************** |
| // Field: [15:0] CURR_VALUE |
| // |
| // Current value of the WCLK counter |
| #define I2S_STMPWCNT_CURR_VALUE_W 16 |
| #define I2S_STMPWCNT_CURR_VALUE_M 0x0000FFFF |
| #define I2S_STMPWCNT_CURR_VALUE_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_STMPXCNT |
| // |
| //***************************************************************************** |
| // Field: [15:0] CURR_VALUE |
| // |
| // Current value of the XOSC counter, latched when reading STMPWCNT. |
| #define I2S_STMPXCNT_CURR_VALUE_W 16 |
| #define I2S_STMPXCNT_CURR_VALUE_M 0x0000FFFF |
| #define I2S_STMPXCNT_CURR_VALUE_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_STMPXCNTCAPT1 |
| // |
| //***************************************************************************** |
| // Field: [15:0] CAPT_VALUE |
| // |
| // Channel 1 is idle and can not be sampled from an external pulse as with |
| // Channel 0 STMPXCNTCAPT0 |
| #define I2S_STMPXCNTCAPT1_CAPT_VALUE_W 16 |
| #define I2S_STMPXCNTCAPT1_CAPT_VALUE_M 0x0000FFFF |
| #define I2S_STMPXCNTCAPT1_CAPT_VALUE_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_STMPWCNTCAPT1 |
| // |
| //***************************************************************************** |
| // Field: [15:0] CAPT_VALUE |
| // |
| // Channel 1 is idle and can not be sampled from an external event as with |
| // Channel 0 STMPWCNTCAPT0 |
| #define I2S_STMPWCNTCAPT1_CAPT_VALUE_W 16 |
| #define I2S_STMPWCNTCAPT1_CAPT_VALUE_M 0x0000FFFF |
| #define I2S_STMPWCNTCAPT1_CAPT_VALUE_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_IRQMASK |
| // |
| //***************************************************************************** |
| // Field: [5] AIF_DMA_IN |
| // |
| // Defines the masks state for the interrupt of IRQFLAGS.AIF_DMA_IN |
| // |
| // 0: Disable |
| // 1: Enable |
| #define I2S_IRQMASK_AIF_DMA_IN 0x00000020 |
| #define I2S_IRQMASK_AIF_DMA_IN_BITN 5 |
| #define I2S_IRQMASK_AIF_DMA_IN_M 0x00000020 |
| #define I2S_IRQMASK_AIF_DMA_IN_S 5 |
| |
| // Field: [4] AIF_DMA_OUT |
| // |
| // Defines the masks state for the interrupt of IRQFLAGS.AIF_DMA_OUT |
| // |
| // 0: Disable |
| // 1: Enable |
| #define I2S_IRQMASK_AIF_DMA_OUT 0x00000010 |
| #define I2S_IRQMASK_AIF_DMA_OUT_BITN 4 |
| #define I2S_IRQMASK_AIF_DMA_OUT_M 0x00000010 |
| #define I2S_IRQMASK_AIF_DMA_OUT_S 4 |
| |
| // Field: [3] WCLK_TIMEOUT |
| // |
| // Defines the masks state for the interrupt of IRQFLAGS.WCLK_TIMEOUT |
| // |
| // 0: Disable |
| // 1: Enable |
| #define I2S_IRQMASK_WCLK_TIMEOUT 0x00000008 |
| #define I2S_IRQMASK_WCLK_TIMEOUT_BITN 3 |
| #define I2S_IRQMASK_WCLK_TIMEOUT_M 0x00000008 |
| #define I2S_IRQMASK_WCLK_TIMEOUT_S 3 |
| |
| // Field: [2] BUS_ERR |
| // |
| // Defines the masks state for the interrupt of IRQFLAGS.BUS_ERR |
| // |
| // 0: Disable |
| // 1: Enable |
| #define I2S_IRQMASK_BUS_ERR 0x00000004 |
| #define I2S_IRQMASK_BUS_ERR_BITN 2 |
| #define I2S_IRQMASK_BUS_ERR_M 0x00000004 |
| #define I2S_IRQMASK_BUS_ERR_S 2 |
| |
| // Field: [1] WCLK_ERR |
| // |
| // Defines the masks state for the interrupt of IRQFLAGS.WCLK_ERR |
| // |
| // 0: Disable |
| // 1: Enable |
| #define I2S_IRQMASK_WCLK_ERR 0x00000002 |
| #define I2S_IRQMASK_WCLK_ERR_BITN 1 |
| #define I2S_IRQMASK_WCLK_ERR_M 0x00000002 |
| #define I2S_IRQMASK_WCLK_ERR_S 1 |
| |
| // Field: [0] PTR_ERR |
| // |
| // Defines the masks state for the interrupt of IRQFLAGS.PTR_ERR |
| // |
| // 0: Disable |
| // 1: Enable |
| #define I2S_IRQMASK_PTR_ERR 0x00000001 |
| #define I2S_IRQMASK_PTR_ERR_BITN 0 |
| #define I2S_IRQMASK_PTR_ERR_M 0x00000001 |
| #define I2S_IRQMASK_PTR_ERR_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_IRQFLAGS |
| // |
| //***************************************************************************** |
| // Field: [5] AIF_DMA_IN |
| // |
| // Set when condition for this bit field event occurs (auto cleared when input |
| // pointer is updated - AIFINPTR), see description of AIFINPTR register |
| #define I2S_IRQFLAGS_AIF_DMA_IN 0x00000020 |
| #define I2S_IRQFLAGS_AIF_DMA_IN_BITN 5 |
| #define I2S_IRQFLAGS_AIF_DMA_IN_M 0x00000020 |
| #define I2S_IRQFLAGS_AIF_DMA_IN_S 5 |
| |
| // Field: [4] AIF_DMA_OUT |
| // |
| // Set when condition for this bit field event occurs (auto cleared when output |
| // pointer is updated - AIFOUTPTR), see description of AIFOUTPTR register for |
| // details |
| #define I2S_IRQFLAGS_AIF_DMA_OUT 0x00000010 |
| #define I2S_IRQFLAGS_AIF_DMA_OUT_BITN 4 |
| #define I2S_IRQFLAGS_AIF_DMA_OUT_M 0x00000010 |
| #define I2S_IRQFLAGS_AIF_DMA_OUT_S 4 |
| |
| // Field: [3] WCLK_TIMEOUT |
| // |
| // Set when the sample stamp generator does not detect a positive WCLK edge for |
| // 65535 clk periods. This signalizes that the internal or external BCLK and |
| // WCLK generator source has been disabled. |
| // |
| // The bit is sticky and may only be cleared by software (by writing '1' to |
| // IRQCLR.WCLK_TIMEOUT). |
| #define I2S_IRQFLAGS_WCLK_TIMEOUT 0x00000008 |
| #define I2S_IRQFLAGS_WCLK_TIMEOUT_BITN 3 |
| #define I2S_IRQFLAGS_WCLK_TIMEOUT_M 0x00000008 |
| #define I2S_IRQFLAGS_WCLK_TIMEOUT_S 3 |
| |
| // Field: [2] BUS_ERR |
| // |
| // Set when a DMA operation is not completed in time (that is audio output |
| // buffer underflow, or audio input buffer overflow). |
| // This error requires a complete restart since word synchronization has been |
| // lost. The bit is sticky and may only be cleared by software (by writing '1' |
| // to IRQCLR.BUS_ERR). |
| // |
| // Note that DMA initiated transactions to illegal addresses will not trigger |
| // an interrupt. The response to such transactions is undefined. |
| #define I2S_IRQFLAGS_BUS_ERR 0x00000004 |
| #define I2S_IRQFLAGS_BUS_ERR_BITN 2 |
| #define I2S_IRQFLAGS_BUS_ERR_M 0x00000004 |
| #define I2S_IRQFLAGS_BUS_ERR_S 2 |
| |
| // Field: [1] WCLK_ERR |
| // |
| // Set when: |
| // - An unexpected WCLK edge occurs during the data delay period of a phase. |
| // Note unexpected WCLK edges during the word and idle periods of the phase are |
| // not detected. |
| // - In dual-phase mode, when two WCLK edges are less than 4 BCLK cycles |
| // apart. |
| // - In single-phase mode, when a WCLK pulse occurs before the last channel. |
| // This error requires a complete restart since word synchronization has been |
| // lost. The bit is sticky and may only be cleared by software (by writing '1' |
| // to IRQCLR.WCLK_ERR). |
| #define I2S_IRQFLAGS_WCLK_ERR 0x00000002 |
| #define I2S_IRQFLAGS_WCLK_ERR_BITN 1 |
| #define I2S_IRQFLAGS_WCLK_ERR_M 0x00000002 |
| #define I2S_IRQFLAGS_WCLK_ERR_S 1 |
| |
| // Field: [0] PTR_ERR |
| // |
| // Set when AIFINPTRNEXT or AIFOUTPTRNEXT has not been loaded with the next |
| // block address in time. |
| // This error requires a complete restart since word synchronization has been |
| // lost. The bit is sticky and may only be cleared by software (by writing '1' |
| // to IRQCLR.PTR_ERR). |
| #define I2S_IRQFLAGS_PTR_ERR 0x00000001 |
| #define I2S_IRQFLAGS_PTR_ERR_BITN 0 |
| #define I2S_IRQFLAGS_PTR_ERR_M 0x00000001 |
| #define I2S_IRQFLAGS_PTR_ERR_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_IRQSET |
| // |
| //***************************************************************************** |
| // Field: [5] AIF_DMA_IN |
| // |
| // 1: Sets the interrupt of IRQFLAGS.AIF_DMA_IN (unless a auto clear criteria |
| // was given at the same time, in which the set will be ignored) |
| #define I2S_IRQSET_AIF_DMA_IN 0x00000020 |
| #define I2S_IRQSET_AIF_DMA_IN_BITN 5 |
| #define I2S_IRQSET_AIF_DMA_IN_M 0x00000020 |
| #define I2S_IRQSET_AIF_DMA_IN_S 5 |
| |
| // Field: [4] AIF_DMA_OUT |
| // |
| // 1: Sets the interrupt of IRQFLAGS.AIF_DMA_OUT (unless a auto clear criteria |
| // was given at the same time, in which the set will be ignored) |
| #define I2S_IRQSET_AIF_DMA_OUT 0x00000010 |
| #define I2S_IRQSET_AIF_DMA_OUT_BITN 4 |
| #define I2S_IRQSET_AIF_DMA_OUT_M 0x00000010 |
| #define I2S_IRQSET_AIF_DMA_OUT_S 4 |
| |
| // Field: [3] WCLK_TIMEOUT |
| // |
| // 1: Sets the interrupt of IRQFLAGS.WCLK_TIMEOUT |
| #define I2S_IRQSET_WCLK_TIMEOUT 0x00000008 |
| #define I2S_IRQSET_WCLK_TIMEOUT_BITN 3 |
| #define I2S_IRQSET_WCLK_TIMEOUT_M 0x00000008 |
| #define I2S_IRQSET_WCLK_TIMEOUT_S 3 |
| |
| // Field: [2] BUS_ERR |
| // |
| // 1: Sets the interrupt of IRQFLAGS.BUS_ERR |
| #define I2S_IRQSET_BUS_ERR 0x00000004 |
| #define I2S_IRQSET_BUS_ERR_BITN 2 |
| #define I2S_IRQSET_BUS_ERR_M 0x00000004 |
| #define I2S_IRQSET_BUS_ERR_S 2 |
| |
| // Field: [1] WCLK_ERR |
| // |
| // 1: Sets the interrupt of IRQFLAGS.WCLK_ERR |
| #define I2S_IRQSET_WCLK_ERR 0x00000002 |
| #define I2S_IRQSET_WCLK_ERR_BITN 1 |
| #define I2S_IRQSET_WCLK_ERR_M 0x00000002 |
| #define I2S_IRQSET_WCLK_ERR_S 1 |
| |
| // Field: [0] PTR_ERR |
| // |
| // 1: Sets the interrupt of IRQFLAGS.PTR_ERR |
| #define I2S_IRQSET_PTR_ERR 0x00000001 |
| #define I2S_IRQSET_PTR_ERR_BITN 0 |
| #define I2S_IRQSET_PTR_ERR_M 0x00000001 |
| #define I2S_IRQSET_PTR_ERR_S 0 |
| |
| //***************************************************************************** |
| // |
| // Register: I2S_O_IRQCLR |
| // |
| //***************************************************************************** |
| // Field: [5] AIF_DMA_IN |
| // |
| // 1: Clears the interrupt of IRQFLAGS.AIF_DMA_IN (unless a set criteria was |
| // given at the same time in which the clear will be ignored) |
| #define I2S_IRQCLR_AIF_DMA_IN 0x00000020 |
| #define I2S_IRQCLR_AIF_DMA_IN_BITN 5 |
| #define I2S_IRQCLR_AIF_DMA_IN_M 0x00000020 |
| #define I2S_IRQCLR_AIF_DMA_IN_S 5 |
| |
| // Field: [4] AIF_DMA_OUT |
| // |
| // 1: Clears the interrupt of IRQFLAGS.AIF_DMA_OUT (unless a set criteria was |
| // given at the same time in which the clear will be ignored) |
| #define I2S_IRQCLR_AIF_DMA_OUT 0x00000010 |
| #define I2S_IRQCLR_AIF_DMA_OUT_BITN 4 |
| #define I2S_IRQCLR_AIF_DMA_OUT_M 0x00000010 |
| #define I2S_IRQCLR_AIF_DMA_OUT_S 4 |
| |
| // Field: [3] WCLK_TIMEOUT |
| // |
| // 1: Clears the interrupt of IRQFLAGS.WCLK_TIMEOUT (unless a set criteria was |
| // given at the same time in which the clear will be ignored) |
| #define I2S_IRQCLR_WCLK_TIMEOUT 0x00000008 |
| #define I2S_IRQCLR_WCLK_TIMEOUT_BITN 3 |
| #define I2S_IRQCLR_WCLK_TIMEOUT_M 0x00000008 |
| #define I2S_IRQCLR_WCLK_TIMEOUT_S 3 |
| |
| // Field: [2] BUS_ERR |
| // |
| // 1: Clears the interrupt of IRQFLAGS.BUS_ERR (unless a set criteria was given |
| // at the same time in which the clear will be ignored) |
| #define I2S_IRQCLR_BUS_ERR 0x00000004 |
| #define I2S_IRQCLR_BUS_ERR_BITN 2 |
| #define I2S_IRQCLR_BUS_ERR_M 0x00000004 |
| #define I2S_IRQCLR_BUS_ERR_S 2 |
| |
| // Field: [1] WCLK_ERR |
| // |
| // 1: Clears the interrupt of IRQFLAGS.WCLK_ERR (unless a set criteria was |
| // given at the same time in which the clear will be ignored) |
| #define I2S_IRQCLR_WCLK_ERR 0x00000002 |
| #define I2S_IRQCLR_WCLK_ERR_BITN 1 |
| #define I2S_IRQCLR_WCLK_ERR_M 0x00000002 |
| #define I2S_IRQCLR_WCLK_ERR_S 1 |
| |
| // Field: [0] PTR_ERR |
| // |
| // 1: Clears the interrupt of IRQFLAGS.PTR_ERR (unless a set criteria was given |
| // at the same time in which the clear will be ignored) |
| #define I2S_IRQCLR_PTR_ERR 0x00000001 |
| #define I2S_IRQCLR_PTR_ERR_BITN 0 |
| #define I2S_IRQCLR_PTR_ERR_M 0x00000001 |
| #define I2S_IRQCLR_PTR_ERR_S 0 |
| |
| |
| #endif // __I2S__ |