Zephyr API Documentation  2.7.0-rc2
A Scalable Open Source RTOS
i2s.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2017 Piotr Mienkowski
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
12#ifndef ZEPHYR_INCLUDE_DRIVERS_I2S_H_
13#define ZEPHYR_INCLUDE_DRIVERS_I2S_H_
14
26#include <zephyr/types.h>
27#include <device.h>
28
29#ifdef __cplusplus
30extern "C" {
31#endif
32
33/*
34 * The following #defines are used to configure the I2S controller.
35 */
36
37
39
41#define I2S_FMT_DATA_FORMAT_SHIFT 0
43#define I2S_FMT_DATA_FORMAT_MASK (0x7 << I2S_FMT_DATA_FORMAT_SHIFT)
44
62#define I2S_FMT_DATA_FORMAT_I2S (0 << I2S_FMT_DATA_FORMAT_SHIFT)
63
81#define I2S_FMT_DATA_FORMAT_PCM_SHORT (1 << I2S_FMT_DATA_FORMAT_SHIFT)
82
101#define I2S_FMT_DATA_FORMAT_PCM_LONG (2 << I2S_FMT_DATA_FORMAT_SHIFT)
102
122#define I2S_FMT_DATA_FORMAT_LEFT_JUSTIFIED (3 << I2S_FMT_DATA_FORMAT_SHIFT)
123
143#define I2S_FMT_DATA_FORMAT_RIGHT_JUSTIFIED (4 << I2S_FMT_DATA_FORMAT_SHIFT)
144
146#define I2S_FMT_DATA_ORDER_MSB (0 << 3)
148#define I2S_FMT_DATA_ORDER_LSB BIT(3)
150#define I2S_FMT_DATA_ORDER_INV I2S_FMT_DATA_ORDER_LSB
151
153#define I2S_FMT_CLK_FORMAT_SHIFT 4
155#define I2S_FMT_CLK_FORMAT_MASK (0x3 << I2S_FMT_CLK_FORMAT_SHIFT)
156
158#define I2S_FMT_BIT_CLK_INV BIT(4)
160#define I2S_FMT_FRAME_CLK_INV BIT(5)
161
165#define I2S_FMT_CLK_NF_NB (0 << I2S_FMT_CLK_FORMAT_SHIFT)
166#define I2S_FMT_CLK_NF_IB (1 << I2S_FMT_CLK_FORMAT_SHIFT)
167#define I2S_FMT_CLK_IF_NB (2 << I2S_FMT_CLK_FORMAT_SHIFT)
168#define I2S_FMT_CLK_IF_IB (3 << I2S_FMT_CLK_FORMAT_SHIFT)
169
171
173#define I2S_OPT_BIT_CLK_CONT (0 << 0)
175#define I2S_OPT_BIT_CLK_GATED BIT(0)
177#define I2S_OPT_BIT_CLK_MASTER (0 << 1)
179#define I2S_OPT_BIT_CLK_SLAVE BIT(1)
181#define I2S_OPT_FRAME_CLK_MASTER (0 << 2)
183#define I2S_OPT_FRAME_CLK_SLAVE BIT(2)
184
190#define I2S_OPT_LOOPBACK BIT(7)
191
200#define I2S_OPT_PINGPONG BIT(6)
201
212};
213
231};
232
274};
275
307 struct k_mem_slab *mem_slab;
310};
311
317__subsystem struct i2s_driver_api {
318 int (*configure)(const struct device *dev, enum i2s_dir dir,
319 const struct i2s_config *cfg);
320 const struct i2s_config *(*config_get)(const struct device *dev,
321 enum i2s_dir dir);
322 int (*read)(const struct device *dev, void **mem_block, size_t *size);
323 int (*write)(const struct device *dev, void *mem_block, size_t size);
324 int (*trigger)(const struct device *dev, enum i2s_dir dir,
325 enum i2s_trigger_cmd cmd);
326};
353__syscall int i2s_configure(const struct device *dev, enum i2s_dir dir,
354 const struct i2s_config *cfg);
355
356static inline int z_impl_i2s_configure(const struct device *dev,
357 enum i2s_dir dir,
358 const struct i2s_config *cfg)
359{
360 const struct i2s_driver_api *api =
361 (const struct i2s_driver_api *)dev->api;
362
363 return api->configure(dev, dir, cfg);
364}
365
374static inline const struct i2s_config *i2s_config_get(const struct device *dev,
375 enum i2s_dir dir)
376{
377 const struct i2s_driver_api *api =
378 (const struct i2s_driver_api *)dev->api;
379
380 return api->config_get(dev, dir);
381}
382
414static inline int i2s_read(const struct device *dev, void **mem_block,
415 size_t *size)
416{
417 const struct i2s_driver_api *api =
418 (const struct i2s_driver_api *)dev->api;
419
420 return api->read(dev, mem_block, size);
421}
422
447__syscall int i2s_buf_read(const struct device *dev, void *buf, size_t *size);
448
475static inline int i2s_write(const struct device *dev, void *mem_block,
476 size_t size)
477{
478 const struct i2s_driver_api *api =
479 (const struct i2s_driver_api *)dev->api;
480
481 return api->write(dev, mem_block, size);
482}
483
503__syscall int i2s_buf_write(const struct device *dev, void *buf, size_t size);
504
522__syscall int i2s_trigger(const struct device *dev, enum i2s_dir dir,
523 enum i2s_trigger_cmd cmd);
524
525static inline int z_impl_i2s_trigger(const struct device *dev,
526 enum i2s_dir dir,
527 enum i2s_trigger_cmd cmd)
528{
529 const struct i2s_driver_api *api =
530 (const struct i2s_driver_api *)dev->api;
531
532 return api->trigger(dev, dir, cmd);
533}
534
539#ifdef __cplusplus
540}
541#endif
542
543#include <syscalls/i2s.h>
544
545#endif /* ZEPHYR_INCLUDE_DRIVERS_I2S_H_ */
static void cmd(uint32_t command)
Execute a display list command by co-processor engine.
Definition: ft8xx_reference_api.h:153
static int i2s_write(const struct device *dev, void *mem_block, size_t size)
Write data to the TX queue.
Definition: i2s.h:475
uint8_t i2s_fmt_t
Definition: i2s.h:38
int i2s_configure(const struct device *dev, enum i2s_dir dir, const struct i2s_config *cfg)
Configure operation of a host I2S controller.
int i2s_buf_read(const struct device *dev, void *buf, size_t *size)
Read data from the RX queue into a provided buffer.
static int i2s_read(const struct device *dev, void **mem_block, size_t *size)
Read data from the RX queue.
Definition: i2s.h:414
i2s_dir
I2C Direction.
Definition: i2s.h:205
i2s_state
Definition: i2s.h:215
int i2s_buf_write(const struct device *dev, void *buf, size_t size)
Write data to the TX queue from a provided buffer.
int i2s_trigger(const struct device *dev, enum i2s_dir dir, enum i2s_trigger_cmd cmd)
Send a trigger command.
i2s_trigger_cmd
Definition: i2s.h:234
static const struct i2s_config * i2s_config_get(const struct device *dev, enum i2s_dir dir)
Fetch configuration information of a host I2S controller.
Definition: i2s.h:374
uint8_t i2s_opt_t
Definition: i2s.h:170
@ I2S_DIR_BOTH
Definition: i2s.h:211
@ I2S_DIR_TX
Definition: i2s.h:209
@ I2S_DIR_RX
Definition: i2s.h:207
@ I2S_STATE_ERROR
Definition: i2s.h:230
@ I2S_STATE_NOT_READY
The interface is not ready.
Definition: i2s.h:222
@ I2S_STATE_STOPPING
Definition: i2s.h:228
@ I2S_STATE_RUNNING
Definition: i2s.h:226
@ I2S_STATE_READY
Definition: i2s.h:224
@ I2S_TRIGGER_STOP
Stop the transmission / reception of data.
Definition: i2s.h:251
@ I2S_TRIGGER_PREPARE
Prepare the queues after underrun/overrun error has occurred.
Definition: i2s.h:273
@ I2S_TRIGGER_START
Start the transmission / reception of data.
Definition: i2s.h:241
@ I2S_TRIGGER_DRAIN
Empty the transmit queue.
Definition: i2s.h:260
@ I2S_TRIGGER_DROP
Discard the transmit / receive queue.
Definition: i2s.h:267
__UINT32_TYPE__ uint32_t
Definition: stdint.h:60
__INT32_TYPE__ int32_t
Definition: stdint.h:44
__UINT8_TYPE__ uint8_t
Definition: stdint.h:58
Runtime device structure (in ROM) per driver instance.
Definition: device.h:367
const void * api
Definition: device.h:373
Interface configuration options.
Definition: i2s.h:301
struct k_mem_slab * mem_slab
Definition: i2s.h:307
i2s_opt_t options
Definition: i2s.h:305
uint8_t word_size
Definition: i2s.h:302
size_t block_size
Definition: i2s.h:308
i2s_fmt_t format
Definition: i2s.h:304
int32_t timeout
Definition: i2s.h:309
uint32_t frame_clk_freq
Definition: i2s.h:306
uint8_t channels
Definition: i2s.h:303
Definition: test_pipe_contexts.c:43