driver: i2s: move to new logger
Move drivers to new logger and change samples enabling logging in prj.conf. Signed-off-by: Anas Nashif <anas.nashif@intel.com>
This commit is contained in:
parent
5cfe06b6bc
commit
a66967b0f2
5 changed files with 71 additions and 79 deletions
|
@ -20,19 +20,9 @@ config I2S_INIT_PRIORITY
|
||||||
help
|
help
|
||||||
Device driver initialization priority.
|
Device driver initialization priority.
|
||||||
|
|
||||||
config SYS_LOG_I2S_LEVEL
|
module = I2S
|
||||||
int "I2S Driver Log level"
|
module-str = i2s
|
||||||
depends on SYS_LOG
|
source "subsys/logging/Kconfig.template.log_config"
|
||||||
default 0
|
|
||||||
range 0 4
|
|
||||||
help
|
|
||||||
Sets log level for I2S drivers.
|
|
||||||
Levels are:
|
|
||||||
0 OFF, do not write
|
|
||||||
1 ERROR, only write SYS_LOG_ERR
|
|
||||||
2 WARNING, write SYS_LOG_WRN in addition to previous level
|
|
||||||
3 INFO, write SYS_LOG_INF in addition to previous levels
|
|
||||||
4 DEBUG, write SYS_LOG_DBG in addition to previous levels
|
|
||||||
|
|
||||||
comment "Device Drivers"
|
comment "Device Drivers"
|
||||||
|
|
||||||
|
|
|
@ -23,9 +23,10 @@
|
||||||
#include <soc.h>
|
#include <soc.h>
|
||||||
#include "i2s_cavs.h"
|
#include "i2s_cavs.h"
|
||||||
|
|
||||||
#define SYS_LOG_DOMAIN "dev/i2s_cavs"
|
#define LOG_DOMAIN dev_i2s_cavs
|
||||||
#define SYS_LOG_LEVEL CONFIG_SYS_LOG_I2S_LEVEL
|
#define LOG_LEVEL CONFIG_I2S_LOG_LEVEL
|
||||||
#include <logging/sys_log.h>
|
#include <logging/log.h>
|
||||||
|
LOG_MODULE_REGISTER(LOG_DOMAIN);
|
||||||
|
|
||||||
#ifdef CONFIG_DCACHE_WRITEBACK
|
#ifdef CONFIG_DCACHE_WRITEBACK
|
||||||
#define DCACHE_INVALIDATE(addr, size) \
|
#define DCACHE_INVALIDATE(addr, size) \
|
||||||
|
@ -210,13 +211,13 @@ static int start_dma(struct device *dev_dma, u32_t channel,
|
||||||
|
|
||||||
ret = dma_config(dev_dma, channel, cfg);
|
ret = dma_config(dev_dma, channel, cfg);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SYS_LOG_ERR("dma_config failed: %d", ret);
|
LOG_ERR("dma_config failed: %d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = dma_start(dev_dma, channel);
|
ret = dma_start(dev_dma, channel);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SYS_LOG_ERR("dma_start failed: %d", ret);
|
LOG_ERR("dma_start failed: %d", ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -243,7 +244,7 @@ static void dma_tx_callback(struct device *dev_dma, u32_t channel, int status)
|
||||||
|
|
||||||
/* Stop transmission if there was an error */
|
/* Stop transmission if there was an error */
|
||||||
if (strm->state == I2S_STATE_ERROR) {
|
if (strm->state == I2S_STATE_ERROR) {
|
||||||
SYS_LOG_DBG("TX error detected");
|
LOG_DBG("TX error detected");
|
||||||
goto tx_disable;
|
goto tx_disable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -274,7 +275,7 @@ static void dma_tx_callback(struct device *dev_dma, u32_t channel, int status)
|
||||||
strm->mem_block, (void *)&(ssp->ssd),
|
strm->mem_block, (void *)&(ssp->ssd),
|
||||||
mem_block_size);
|
mem_block_size);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SYS_LOG_DBG("Failed to start TX DMA transfer: %d", ret);
|
LOG_DBG("Failed to start TX DMA transfer: %d", ret);
|
||||||
goto tx_disable;
|
goto tx_disable;
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
@ -315,13 +316,13 @@ static int i2s_cavs_configure(struct device *dev, enum i2s_dir dir,
|
||||||
if (dir == I2S_DIR_TX) {
|
if (dir == I2S_DIR_TX) {
|
||||||
strm = &dev_data->tx;
|
strm = &dev_data->tx;
|
||||||
} else {
|
} else {
|
||||||
SYS_LOG_ERR("TX direction must be selected");
|
LOG_ERR("TX direction must be selected");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strm->state != I2S_STATE_NOT_READY &&
|
if (strm->state != I2S_STATE_NOT_READY &&
|
||||||
strm->state != I2S_STATE_READY) {
|
strm->state != I2S_STATE_READY) {
|
||||||
SYS_LOG_ERR("invalid state");
|
LOG_ERR("invalid state");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -334,13 +335,13 @@ static int i2s_cavs_configure(struct device *dev, enum i2s_dir dir,
|
||||||
|
|
||||||
if (word_size_bits < CAVS_SSP_WORD_SIZE_BITS_MIN ||
|
if (word_size_bits < CAVS_SSP_WORD_SIZE_BITS_MIN ||
|
||||||
word_size_bits > CAVS_SSP_WORD_SIZE_BITS_MAX) {
|
word_size_bits > CAVS_SSP_WORD_SIZE_BITS_MAX) {
|
||||||
SYS_LOG_ERR("Unsupported I2S word size");
|
LOG_ERR("Unsupported I2S word size");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (num_words < CAVS_SSP_WORD_PER_FRAME_MIN ||
|
if (num_words < CAVS_SSP_WORD_PER_FRAME_MIN ||
|
||||||
num_words > CAVS_SSP_WORD_PER_FRAME_MAX) {
|
num_words > CAVS_SSP_WORD_PER_FRAME_MAX) {
|
||||||
SYS_LOG_ERR("Unsupported words per frame number");
|
LOG_ERR("Unsupported words per frame number");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -408,7 +409,7 @@ static int i2s_cavs_configure(struct device *dev, enum i2s_dir dir,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
SYS_LOG_ERR("Unsupported Clock format");
|
LOG_ERR("Unsupported Clock format");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -417,7 +418,7 @@ static int i2s_cavs_configure(struct device *dev, enum i2s_dir dir,
|
||||||
|
|
||||||
/* BCLK is generated from MCLK - must be divisible */
|
/* BCLK is generated from MCLK - must be divisible */
|
||||||
if (mclk % bit_clk_freq) {
|
if (mclk % bit_clk_freq) {
|
||||||
SYS_LOG_INF("MCLK/BCLK is not an integer, using M/N divider");
|
LOG_INF("MCLK/BCLK is not an integer, using M/N divider");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Simplification: Instead of calculating lowest values of
|
* Simplification: Instead of calculating lowest values of
|
||||||
|
@ -440,7 +441,7 @@ static int i2s_cavs_configure(struct device *dev, enum i2s_dir dir,
|
||||||
|
|
||||||
/* divisor must be within SCR range */
|
/* divisor must be within SCR range */
|
||||||
if (mdiv > (SSCR0_SCR_MASK >> 8)) {
|
if (mdiv > (SSCR0_SCR_MASK >> 8)) {
|
||||||
SYS_LOG_ERR("Divisor is not within SCR range");
|
LOG_ERR("Divisor is not within SCR range");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -476,7 +477,7 @@ static int i2s_cavs_configure(struct device *dev, enum i2s_dir dir,
|
||||||
case I2S_FMT_DATA_FORMAT_PCM_SHORT:
|
case I2S_FMT_DATA_FORMAT_PCM_SHORT:
|
||||||
case I2S_FMT_DATA_FORMAT_PCM_LONG:
|
case I2S_FMT_DATA_FORMAT_PCM_LONG:
|
||||||
default:
|
default:
|
||||||
SYS_LOG_ERR("Unsupported I2S data format");
|
LOG_ERR("Unsupported I2S data format");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -532,7 +533,7 @@ static int tx_stream_start(struct stream *strm,
|
||||||
strm->mem_block, (void *)&(ssp->ssd),
|
strm->mem_block, (void *)&(ssp->ssd),
|
||||||
mem_block_size);
|
mem_block_size);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SYS_LOG_ERR("Failed to start TX DMA transfer: %d", ret);
|
LOG_ERR("Failed to start TX DMA transfer: %d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -605,14 +606,14 @@ static int i2s_cavs_trigger(struct device *dev, enum i2s_dir dir,
|
||||||
if (dir == I2S_DIR_TX) {
|
if (dir == I2S_DIR_TX) {
|
||||||
strm = &dev_data->tx;
|
strm = &dev_data->tx;
|
||||||
} else {
|
} else {
|
||||||
SYS_LOG_ERR("TX direction must be selected");
|
LOG_ERR("TX direction must be selected");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case I2S_TRIGGER_START:
|
case I2S_TRIGGER_START:
|
||||||
if (strm->state != I2S_STATE_READY) {
|
if (strm->state != I2S_STATE_READY) {
|
||||||
SYS_LOG_DBG("START trigger: invalid state");
|
LOG_DBG("START trigger: invalid state");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -620,7 +621,7 @@ static int i2s_cavs_trigger(struct device *dev, enum i2s_dir dir,
|
||||||
|
|
||||||
ret = strm->stream_start(strm, ssp, dev_data->dev_dma);
|
ret = strm->stream_start(strm, ssp, dev_data->dev_dma);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SYS_LOG_DBG("START trigger failed %d", ret);
|
LOG_DBG("START trigger failed %d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -632,7 +633,7 @@ static int i2s_cavs_trigger(struct device *dev, enum i2s_dir dir,
|
||||||
key = irq_lock();
|
key = irq_lock();
|
||||||
if (strm->state != I2S_STATE_RUNNING) {
|
if (strm->state != I2S_STATE_RUNNING) {
|
||||||
irq_unlock(key);
|
irq_unlock(key);
|
||||||
SYS_LOG_DBG("STOP trigger: invalid state");
|
LOG_DBG("STOP trigger: invalid state");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
strm->state = I2S_STATE_STOPPING;
|
strm->state = I2S_STATE_STOPPING;
|
||||||
|
@ -644,7 +645,7 @@ static int i2s_cavs_trigger(struct device *dev, enum i2s_dir dir,
|
||||||
key = irq_lock();
|
key = irq_lock();
|
||||||
if (strm->state != I2S_STATE_RUNNING) {
|
if (strm->state != I2S_STATE_RUNNING) {
|
||||||
irq_unlock(key);
|
irq_unlock(key);
|
||||||
SYS_LOG_DBG("DRAIN trigger: invalid state");
|
LOG_DBG("DRAIN trigger: invalid state");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
strm->state = I2S_STATE_STOPPING;
|
strm->state = I2S_STATE_STOPPING;
|
||||||
|
@ -653,7 +654,7 @@ static int i2s_cavs_trigger(struct device *dev, enum i2s_dir dir,
|
||||||
|
|
||||||
case I2S_TRIGGER_DROP:
|
case I2S_TRIGGER_DROP:
|
||||||
if (strm->state == I2S_STATE_NOT_READY) {
|
if (strm->state == I2S_STATE_NOT_READY) {
|
||||||
SYS_LOG_DBG("DROP trigger: invalid state");
|
LOG_DBG("DROP trigger: invalid state");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
strm->stream_disable(strm, ssp, dev_data->dev_dma);
|
strm->stream_disable(strm, ssp, dev_data->dev_dma);
|
||||||
|
@ -663,7 +664,7 @@ static int i2s_cavs_trigger(struct device *dev, enum i2s_dir dir,
|
||||||
|
|
||||||
case I2S_TRIGGER_PREPARE:
|
case I2S_TRIGGER_PREPARE:
|
||||||
if (strm->state != I2S_STATE_ERROR) {
|
if (strm->state != I2S_STATE_ERROR) {
|
||||||
SYS_LOG_DBG("PREPARE trigger: invalid state");
|
LOG_DBG("PREPARE trigger: invalid state");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
strm->state = I2S_STATE_READY;
|
strm->state = I2S_STATE_READY;
|
||||||
|
@ -671,7 +672,7 @@ static int i2s_cavs_trigger(struct device *dev, enum i2s_dir dir,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
SYS_LOG_ERR("Unsupported trigger command");
|
LOG_ERR("Unsupported trigger command");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -686,13 +687,13 @@ static int i2s_cavs_write(struct device *dev, void *mem_block, size_t size)
|
||||||
|
|
||||||
if (dev_data->tx.state != I2S_STATE_RUNNING &&
|
if (dev_data->tx.state != I2S_STATE_RUNNING &&
|
||||||
dev_data->tx.state != I2S_STATE_READY) {
|
dev_data->tx.state != I2S_STATE_READY) {
|
||||||
SYS_LOG_ERR("invalid state");
|
LOG_ERR("invalid state");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = k_sem_take(&dev_data->tx.sem, dev_data->tx.cfg.timeout);
|
ret = k_sem_take(&dev_data->tx.sem, dev_data->tx.cfg.timeout);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SYS_LOG_ERR("Failure taking sem");
|
LOG_ERR("Failure taking sem");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -729,14 +730,14 @@ static int i2s1_cavs_initialize(struct device *dev)
|
||||||
|
|
||||||
dev_data->dev_dma = device_get_binding(CONFIG_I2S_CAVS_DMA_NAME);
|
dev_data->dev_dma = device_get_binding(CONFIG_I2S_CAVS_DMA_NAME);
|
||||||
if (!dev_data->dev_dma) {
|
if (!dev_data->dev_dma) {
|
||||||
SYS_LOG_ERR("%s device not found", CONFIG_I2S_CAVS_DMA_NAME);
|
LOG_ERR("%s device not found", CONFIG_I2S_CAVS_DMA_NAME);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Enable module's IRQ */
|
/* Enable module's IRQ */
|
||||||
irq_enable(dev_cfg->irq_id);
|
irq_enable(dev_cfg->irq_id);
|
||||||
|
|
||||||
SYS_LOG_INF("Device %s initialized", DEV_NAME(dev));
|
LOG_INF("Device %s initialized", DEV_NAME(dev));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,9 +27,10 @@
|
||||||
#include <i2s.h>
|
#include <i2s.h>
|
||||||
#include <soc.h>
|
#include <soc.h>
|
||||||
|
|
||||||
#define SYS_LOG_DOMAIN "dev/i2s_sam_ssc"
|
#define LOG_DOMAIN dev_i2s_sam_ssc
|
||||||
#define SYS_LOG_LEVEL CONFIG_SYS_LOG_I2S_LEVEL
|
#define LOG_LEVEL CONFIG_I2S_LOG_LEVEL
|
||||||
#include <logging/sys_log.h>
|
#include <logging/log.h>
|
||||||
|
LOG_MODULE_REGISTER(LOG_DOMAIN);
|
||||||
|
|
||||||
/* FIXME change to
|
/* FIXME change to
|
||||||
* #if __DCACHE_PRESENT == 1
|
* #if __DCACHE_PRESENT == 1
|
||||||
|
@ -234,7 +235,7 @@ static void dma_rx_callback(struct device *dev_dma, u32_t channel, int status)
|
||||||
(void *)&(ssc->SSC_RHR), stream->mem_block,
|
(void *)&(ssc->SSC_RHR), stream->mem_block,
|
||||||
stream->cfg.block_size);
|
stream->cfg.block_size);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SYS_LOG_DBG("Failed to start RX DMA transfer: %d", ret);
|
LOG_DBG("Failed to start RX DMA transfer: %d", ret);
|
||||||
goto rx_disable;
|
goto rx_disable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -263,7 +264,7 @@ static void dma_tx_callback(struct device *dev_dma, u32_t channel, int status)
|
||||||
|
|
||||||
/* Stop transmission if there was an error */
|
/* Stop transmission if there was an error */
|
||||||
if (stream->state == I2S_STATE_ERROR) {
|
if (stream->state == I2S_STATE_ERROR) {
|
||||||
SYS_LOG_DBG("TX error detected");
|
LOG_DBG("TX error detected");
|
||||||
goto tx_disable;
|
goto tx_disable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -293,7 +294,7 @@ static void dma_tx_callback(struct device *dev_dma, u32_t channel, int status)
|
||||||
stream->mem_block, (void *)&(ssc->SSC_THR),
|
stream->mem_block, (void *)&(ssc->SSC_THR),
|
||||||
mem_block_size);
|
mem_block_size);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SYS_LOG_DBG("Failed to start TX DMA transfer: %d", ret);
|
LOG_DBG("Failed to start TX DMA transfer: %d", ret);
|
||||||
goto tx_disable;
|
goto tx_disable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -360,7 +361,7 @@ static int set_rx_data_format(const struct i2s_sam_dev_cfg *const dev_cfg,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
SYS_LOG_ERR("Unsupported I2S data format");
|
LOG_ERR("Unsupported I2S data format");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -446,7 +447,7 @@ static int set_tx_data_format(const struct i2s_sam_dev_cfg *const dev_cfg,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
SYS_LOG_ERR("Unsupported I2S data format");
|
LOG_ERR("Unsupported I2S data format");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -497,13 +498,13 @@ static int bit_clock_set(Ssc *const ssc, u32_t bit_clk_freq)
|
||||||
u32_t clk_div = SOC_ATMEL_SAM_MCK_FREQ_HZ / bit_clk_freq / 2;
|
u32_t clk_div = SOC_ATMEL_SAM_MCK_FREQ_HZ / bit_clk_freq / 2;
|
||||||
|
|
||||||
if (clk_div == 0 || clk_div >= (1 << 12)) {
|
if (clk_div == 0 || clk_div >= (1 << 12)) {
|
||||||
SYS_LOG_ERR("Invalid bit clock frequency");
|
LOG_ERR("Invalid bit clock frequency");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ssc->SSC_CMR = clk_div;
|
ssc->SSC_CMR = clk_div;
|
||||||
|
|
||||||
SYS_LOG_DBG("freq = %d", bit_clk_freq);
|
LOG_DBG("freq = %d", bit_clk_freq);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -545,13 +546,13 @@ static int i2s_sam_configure(struct device *dev, enum i2s_dir dir,
|
||||||
} else if (dir == I2S_DIR_TX) {
|
} else if (dir == I2S_DIR_TX) {
|
||||||
stream = &dev_data->tx;
|
stream = &dev_data->tx;
|
||||||
} else {
|
} else {
|
||||||
SYS_LOG_ERR("Either RX or TX direction must be selected");
|
LOG_ERR("Either RX or TX direction must be selected");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (stream->state != I2S_STATE_NOT_READY &&
|
if (stream->state != I2S_STATE_NOT_READY &&
|
||||||
stream->state != I2S_STATE_READY) {
|
stream->state != I2S_STATE_READY) {
|
||||||
SYS_LOG_ERR("invalid state");
|
LOG_ERR("invalid state");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -563,26 +564,26 @@ static int i2s_sam_configure(struct device *dev, enum i2s_dir dir,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i2s_cfg->format & I2S_FMT_FRAME_CLK_INV) {
|
if (i2s_cfg->format & I2S_FMT_FRAME_CLK_INV) {
|
||||||
SYS_LOG_ERR("Frame clock inversion is not implemented");
|
LOG_ERR("Frame clock inversion is not implemented");
|
||||||
SYS_LOG_ERR("Please submit a patch");
|
LOG_ERR("Please submit a patch");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i2s_cfg->format & I2S_FMT_BIT_CLK_INV) {
|
if (i2s_cfg->format & I2S_FMT_BIT_CLK_INV) {
|
||||||
SYS_LOG_ERR("Bit clock inversion is not implemented");
|
LOG_ERR("Bit clock inversion is not implemented");
|
||||||
SYS_LOG_ERR("Please submit a patch");
|
LOG_ERR("Please submit a patch");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (word_size_bits < SAM_SSC_WORD_SIZE_BITS_MIN ||
|
if (word_size_bits < SAM_SSC_WORD_SIZE_BITS_MIN ||
|
||||||
word_size_bits > SAM_SSC_WORD_SIZE_BITS_MAX) {
|
word_size_bits > SAM_SSC_WORD_SIZE_BITS_MAX) {
|
||||||
SYS_LOG_ERR("Unsupported I2S word size");
|
LOG_ERR("Unsupported I2S word size");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (num_words < SAM_SSC_WORD_PER_FRAME_MIN ||
|
if (num_words < SAM_SSC_WORD_PER_FRAME_MIN ||
|
||||||
num_words > SAM_SSC_WORD_PER_FRAME_MAX) {
|
num_words > SAM_SSC_WORD_PER_FRAME_MAX) {
|
||||||
SYS_LOG_ERR("Unsupported words per frame number");
|
LOG_ERR("Unsupported words per frame number");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -635,7 +636,7 @@ static int rx_stream_start(struct stream *stream, Ssc *const ssc,
|
||||||
(void *)&(ssc->SSC_RHR), stream->mem_block,
|
(void *)&(ssc->SSC_RHR), stream->mem_block,
|
||||||
stream->cfg.block_size);
|
stream->cfg.block_size);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SYS_LOG_ERR("Failed to start RX DMA transfer: %d", ret);
|
LOG_ERR("Failed to start RX DMA transfer: %d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -676,7 +677,7 @@ static int tx_stream_start(struct stream *stream, Ssc *const ssc,
|
||||||
stream->mem_block, (void *)&(ssc->SSC_THR),
|
stream->mem_block, (void *)&(ssc->SSC_THR),
|
||||||
mem_block_size);
|
mem_block_size);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SYS_LOG_ERR("Failed to start TX DMA transfer: %d", ret);
|
LOG_ERR("Failed to start TX DMA transfer: %d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -757,14 +758,14 @@ static int i2s_sam_trigger(struct device *dev, enum i2s_dir dir,
|
||||||
} else if (dir == I2S_DIR_TX) {
|
} else if (dir == I2S_DIR_TX) {
|
||||||
stream = &dev_data->tx;
|
stream = &dev_data->tx;
|
||||||
} else {
|
} else {
|
||||||
SYS_LOG_ERR("Either RX or TX direction must be selected");
|
LOG_ERR("Either RX or TX direction must be selected");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case I2S_TRIGGER_START:
|
case I2S_TRIGGER_START:
|
||||||
if (stream->state != I2S_STATE_READY) {
|
if (stream->state != I2S_STATE_READY) {
|
||||||
SYS_LOG_DBG("START trigger: invalid state");
|
LOG_DBG("START trigger: invalid state");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -772,7 +773,7 @@ static int i2s_sam_trigger(struct device *dev, enum i2s_dir dir,
|
||||||
|
|
||||||
ret = stream->stream_start(stream, ssc, dev_data->dev_dma);
|
ret = stream->stream_start(stream, ssc, dev_data->dev_dma);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
SYS_LOG_DBG("START trigger failed %d", ret);
|
LOG_DBG("START trigger failed %d", ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -784,7 +785,7 @@ static int i2s_sam_trigger(struct device *dev, enum i2s_dir dir,
|
||||||
key = irq_lock();
|
key = irq_lock();
|
||||||
if (stream->state != I2S_STATE_RUNNING) {
|
if (stream->state != I2S_STATE_RUNNING) {
|
||||||
irq_unlock(key);
|
irq_unlock(key);
|
||||||
SYS_LOG_DBG("STOP trigger: invalid state");
|
LOG_DBG("STOP trigger: invalid state");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
stream->state = I2S_STATE_STOPPING;
|
stream->state = I2S_STATE_STOPPING;
|
||||||
|
@ -796,7 +797,7 @@ static int i2s_sam_trigger(struct device *dev, enum i2s_dir dir,
|
||||||
key = irq_lock();
|
key = irq_lock();
|
||||||
if (stream->state != I2S_STATE_RUNNING) {
|
if (stream->state != I2S_STATE_RUNNING) {
|
||||||
irq_unlock(key);
|
irq_unlock(key);
|
||||||
SYS_LOG_DBG("DRAIN trigger: invalid state");
|
LOG_DBG("DRAIN trigger: invalid state");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
stream->state = I2S_STATE_STOPPING;
|
stream->state = I2S_STATE_STOPPING;
|
||||||
|
@ -805,7 +806,7 @@ static int i2s_sam_trigger(struct device *dev, enum i2s_dir dir,
|
||||||
|
|
||||||
case I2S_TRIGGER_DROP:
|
case I2S_TRIGGER_DROP:
|
||||||
if (stream->state == I2S_STATE_NOT_READY) {
|
if (stream->state == I2S_STATE_NOT_READY) {
|
||||||
SYS_LOG_DBG("DROP trigger: invalid state");
|
LOG_DBG("DROP trigger: invalid state");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
stream->stream_disable(stream, ssc, dev_data->dev_dma);
|
stream->stream_disable(stream, ssc, dev_data->dev_dma);
|
||||||
|
@ -815,7 +816,7 @@ static int i2s_sam_trigger(struct device *dev, enum i2s_dir dir,
|
||||||
|
|
||||||
case I2S_TRIGGER_PREPARE:
|
case I2S_TRIGGER_PREPARE:
|
||||||
if (stream->state != I2S_STATE_ERROR) {
|
if (stream->state != I2S_STATE_ERROR) {
|
||||||
SYS_LOG_DBG("PREPARE trigger: invalid state");
|
LOG_DBG("PREPARE trigger: invalid state");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
stream->state = I2S_STATE_READY;
|
stream->state = I2S_STATE_READY;
|
||||||
|
@ -823,7 +824,7 @@ static int i2s_sam_trigger(struct device *dev, enum i2s_dir dir,
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
SYS_LOG_ERR("Unsupported trigger command");
|
LOG_ERR("Unsupported trigger command");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -836,7 +837,7 @@ static int i2s_sam_read(struct device *dev, void **mem_block, size_t *size)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (dev_data->rx.state == I2S_STATE_NOT_READY) {
|
if (dev_data->rx.state == I2S_STATE_NOT_READY) {
|
||||||
SYS_LOG_DBG("invalid state");
|
LOG_DBG("invalid state");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -863,7 +864,7 @@ static int i2s_sam_write(struct device *dev, void *mem_block, size_t size)
|
||||||
|
|
||||||
if (dev_data->tx.state != I2S_STATE_RUNNING &&
|
if (dev_data->tx.state != I2S_STATE_RUNNING &&
|
||||||
dev_data->tx.state != I2S_STATE_READY) {
|
dev_data->tx.state != I2S_STATE_READY) {
|
||||||
SYS_LOG_DBG("invalid state");
|
LOG_DBG("invalid state");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -894,14 +895,14 @@ static void i2s_sam_isr(void *arg)
|
||||||
dev_data->rx.state = I2S_STATE_ERROR;
|
dev_data->rx.state = I2S_STATE_ERROR;
|
||||||
/* Disable interrupt */
|
/* Disable interrupt */
|
||||||
ssc->SSC_IDR = SSC_IDR_OVRUN;
|
ssc->SSC_IDR = SSC_IDR_OVRUN;
|
||||||
SYS_LOG_DBG("RX buffer overrun error");
|
LOG_DBG("RX buffer overrun error");
|
||||||
}
|
}
|
||||||
/* Check for TX buffer underrun */
|
/* Check for TX buffer underrun */
|
||||||
if (isr_status & SSC_SR_TXEMPTY) {
|
if (isr_status & SSC_SR_TXEMPTY) {
|
||||||
dev_data->tx.state = I2S_STATE_ERROR;
|
dev_data->tx.state = I2S_STATE_ERROR;
|
||||||
/* Disable interrupt */
|
/* Disable interrupt */
|
||||||
ssc->SSC_IDR = SSC_IDR_TXEMPTY;
|
ssc->SSC_IDR = SSC_IDR_TXEMPTY;
|
||||||
SYS_LOG_DBG("TX buffer underrun error");
|
LOG_DBG("TX buffer underrun error");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -921,7 +922,7 @@ static int i2s_sam_initialize(struct device *dev)
|
||||||
|
|
||||||
dev_data->dev_dma = device_get_binding(CONFIG_I2S_SAM_SSC_DMA_NAME);
|
dev_data->dev_dma = device_get_binding(CONFIG_I2S_SAM_SSC_DMA_NAME);
|
||||||
if (!dev_data->dev_dma) {
|
if (!dev_data->dev_dma) {
|
||||||
SYS_LOG_ERR("%s device not found", CONFIG_I2S_SAM_SSC_DMA_NAME);
|
LOG_ERR("%s device not found", CONFIG_I2S_SAM_SSC_DMA_NAME);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -937,7 +938,7 @@ static int i2s_sam_initialize(struct device *dev)
|
||||||
/* Enable module's IRQ */
|
/* Enable module's IRQ */
|
||||||
irq_enable(dev_cfg->irq_id);
|
irq_enable(dev_cfg->irq_id);
|
||||||
|
|
||||||
SYS_LOG_INF("Device %s initialized", DEV_NAME(dev));
|
LOG_INF("Device %s initialized", DEV_NAME(dev));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
CONFIG_I2S=y
|
CONFIG_I2S=y
|
||||||
CONFIG_SYS_LOG=y
|
CONFIG_LOG=y
|
||||||
CONFIG_SYS_LOG_I2S_LEVEL=3
|
CONFIG_I2S_LOG_LEVEL_DBG=y
|
||||||
CONFIG_ZTEST=y
|
CONFIG_ZTEST=y
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
CONFIG_I2S=y
|
CONFIG_I2S=y
|
||||||
CONFIG_SYS_LOG=y
|
CONFIG_LOG=y
|
||||||
CONFIG_SYS_LOG_I2S_LEVEL=3
|
CONFIG_I2S_LOG_LEVEL_DBG=y
|
||||||
CONFIG_ZTEST=y
|
CONFIG_ZTEST=y
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue