Line data Source code
1 1 : /*
2 : * Copyright (c) 2017 Piotr Mienkowski
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : /**
8 : * @file
9 : * @brief Public APIs for the I2S (Inter-IC Sound) bus drivers.
10 : */
11 :
12 : #ifndef ZEPHYR_INCLUDE_DRIVERS_I2S_H_
13 : #define ZEPHYR_INCLUDE_DRIVERS_I2S_H_
14 :
15 : /**
16 : * @defgroup i2s_interface I2S Interface
17 : * @since 1.9
18 : * @version 1.0.0
19 : * @ingroup io_interfaces
20 : * @brief I2S (Inter-IC Sound) Interface
21 : *
22 : * The I2S API provides support for the standard I2S interface standard as well
23 : * as common non-standard extensions such as PCM Short/Long Frame Sync,
24 : * Left/Right Justified Data Format.
25 : * @{
26 : */
27 :
28 : #include <zephyr/types.h>
29 : #include <zephyr/device.h>
30 :
31 : #ifdef __cplusplus
32 : extern "C" {
33 : #endif
34 :
35 : /*
36 : * The following #defines are used to configure the I2S controller.
37 : */
38 :
39 : /** I2S data stream format options */
40 1 : typedef uint8_t i2s_fmt_t;
41 :
42 : /** Data Format bit field position. */
43 1 : #define I2S_FMT_DATA_FORMAT_SHIFT 0
44 : /** Data Format bit field mask. */
45 1 : #define I2S_FMT_DATA_FORMAT_MASK (0x7 << I2S_FMT_DATA_FORMAT_SHIFT)
46 :
47 : /** @brief Standard I2S Data Format.
48 : *
49 : * Serial data is transmitted in two's complement with the MSB first. Both
50 : * Word Select (WS) and Serial Data (SD) signals are sampled on the rising edge
51 : * of the clock signal (SCK). The MSB is always sent one clock period after the
52 : * WS changes. Left channel data are sent first indicated by WS = 0, followed
53 : * by right channel data indicated by WS = 1.
54 : *
55 : * -. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-.
56 : * SCK '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '
57 : * -. .-------------------------------.
58 : * WS '-------------------------------' '----
59 : * -.---.---.---.---.---.---.---.---.---.---.---.---.---.---.---.---.---.
60 : * SD | |MSB| |...| |LSB| x |...| x |MSB| |...| |LSB| x |...| x |
61 : * -'---'---'---'---'---'---'---'---'---'---'---'---'---'---'---'---'---'
62 : * | Left channel | Right channel |
63 : */
64 1 : #define I2S_FMT_DATA_FORMAT_I2S (0 << I2S_FMT_DATA_FORMAT_SHIFT)
65 :
66 : /** @brief PCM Short Frame Sync Data Format.
67 : *
68 : * Serial data is transmitted in two's complement with the MSB first. Both
69 : * Word Select (WS) and Serial Data (SD) signals are sampled on the falling edge
70 : * of the clock signal (SCK). The falling edge of the frame sync signal (WS)
71 : * indicates the start of the PCM word. The frame sync is one clock cycle long.
72 : * An arbitrary number of data words can be sent in one frame.
73 : *
74 : * .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-.
75 : * SCK -' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-
76 : * .---. .---.
77 : * WS -' '- -' '-
78 : * -.---.---.---.---.---.---.---.---.---.---.---.---.---.---.---.---.---
79 : * SD | |MSB| |...| |LSB|MSB| |...| |LSB|MSB| |...| |LSB|
80 : * -'---'---'---'---'---'---'---'---'---'---'---'---'---'---'---'---'---
81 : * | Word 1 | Word 2 | Word 3 | Word n |
82 : */
83 1 : #define I2S_FMT_DATA_FORMAT_PCM_SHORT (1 << I2S_FMT_DATA_FORMAT_SHIFT)
84 :
85 : /** @brief PCM Long Frame Sync Data Format.
86 : *
87 : * Serial data is transmitted in two's complement with the MSB first. Both
88 : * Word Select (WS) and Serial Data (SD) signals are sampled on the falling edge
89 : * of the clock signal (SCK). The rising edge of the frame sync signal (WS)
90 : * indicates the start of the PCM word. The frame sync has an arbitrary length,
91 : * however it has to fall before the start of the next frame. An arbitrary
92 : * number of data words can be sent in one frame.
93 : *
94 : * .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-.
95 : * SCK -' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-
96 : * .--- ---. ---. ---. .---
97 : * WS -' '- '- '- -'
98 : * -.---.---.---.---.---.---.---.---.---.---.---.---.---.---.---.---.---
99 : * SD | |MSB| |...| |LSB|MSB| |...| |LSB|MSB| |...| |LSB|
100 : * -'---'---'---'---'---'---'---'---'---'---'---'---'---'---'---'---'---
101 : * | Word 1 | Word 2 | Word 3 | Word n |
102 : */
103 1 : #define I2S_FMT_DATA_FORMAT_PCM_LONG (2 << I2S_FMT_DATA_FORMAT_SHIFT)
104 :
105 : /**
106 : * @brief Left Justified Data Format.
107 : *
108 : * Serial data is transmitted in two's complement with the MSB first. Both
109 : * Word Select (WS) and Serial Data (SD) signals are sampled on the rising edge
110 : * of the clock signal (SCK). The bits within the data word are left justified
111 : * such that the MSB is always sent in the clock period following the WS
112 : * transition. Left channel data are sent first indicated by WS = 1, followed
113 : * by right channel data indicated by WS = 0.
114 : *
115 : * .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-.
116 : * SCK -' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-
117 : * .-------------------------------. .-
118 : * WS ---' '-------------------------------'
119 : * ---.---.---.---.---.---.---.---.---.---.---.---.---.---.---.---.---.-
120 : * SD |MSB| |...| |LSB| x |...| x |MSB| |...| |LSB| x |...| x |
121 : * ---'---'---'---'---'---'---'---'---'---'---'---'---'---'---'---'---'-
122 : * | Left channel | Right channel |
123 : */
124 1 : #define I2S_FMT_DATA_FORMAT_LEFT_JUSTIFIED (3 << I2S_FMT_DATA_FORMAT_SHIFT)
125 :
126 : /**
127 : * @brief Right Justified Data Format.
128 : *
129 : * Serial data is transmitted in two's complement with the MSB first. Both
130 : * Word Select (WS) and Serial Data (SD) signals are sampled on the rising edge
131 : * of the clock signal (SCK). The bits within the data word are right justified
132 : * such that the LSB is always sent in the clock period preceding the WS
133 : * transition. Left channel data are sent first indicated by WS = 1, followed
134 : * by right channel data indicated by WS = 0.
135 : *
136 : * .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-. .-.
137 : * SCK -' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-' '-
138 : * .-------------------------------. .-
139 : * WS ---' '-------------------------------'
140 : * ---.---.---.---.---.---.---.---.---.---.---.---.---.---.---.---.---.-
141 : * SD | x |...| x |MSB| |...| |LSB| x |...| x |MSB| |...| |LSB|
142 : * ---'---'---'---'---'---'---'---'---'---'---'---'---'---'---'---'---'-
143 : * | Left channel | Right channel |
144 : */
145 1 : #define I2S_FMT_DATA_FORMAT_RIGHT_JUSTIFIED (4 << I2S_FMT_DATA_FORMAT_SHIFT)
146 :
147 : /** Send MSB first */
148 1 : #define I2S_FMT_DATA_ORDER_MSB (0 << 3)
149 : /** Send LSB first */
150 1 : #define I2S_FMT_DATA_ORDER_LSB BIT(3)
151 : /** Invert bit ordering, send LSB first */
152 1 : #define I2S_FMT_DATA_ORDER_INV I2S_FMT_DATA_ORDER_LSB
153 :
154 : /** Data Format bit field position. */
155 1 : #define I2S_FMT_CLK_FORMAT_SHIFT 4
156 : /** Data Format bit field mask. */
157 1 : #define I2S_FMT_CLK_FORMAT_MASK (0x3 << I2S_FMT_CLK_FORMAT_SHIFT)
158 :
159 : /** Invert bit clock */
160 1 : #define I2S_FMT_BIT_CLK_INV BIT(4)
161 : /** Invert frame clock */
162 1 : #define I2S_FMT_FRAME_CLK_INV BIT(5)
163 :
164 : /** Normal Frame, Normal Bit Clk */
165 1 : #define I2S_FMT_CLK_NF_NB (0 << I2S_FMT_CLK_FORMAT_SHIFT)
166 : /** Normal Frame, Inverted Bit Clk */
167 1 : #define I2S_FMT_CLK_NF_IB (1 << I2S_FMT_CLK_FORMAT_SHIFT)
168 : /** Inverted Frame, Normal Bit Clk */
169 1 : #define I2S_FMT_CLK_IF_NB (2 << I2S_FMT_CLK_FORMAT_SHIFT)
170 : /** Inverted Frame, Inverted Bit Clk */
171 1 : #define I2S_FMT_CLK_IF_IB (3 << I2S_FMT_CLK_FORMAT_SHIFT)
172 :
173 : /** I2S configuration options */
174 1 : typedef uint8_t i2s_opt_t;
175 :
176 : /** Run bit clock continuously */
177 1 : #define I2S_OPT_BIT_CLK_CONT (0 << 0)
178 : /** Run bit clock when sending data only */
179 1 : #define I2S_OPT_BIT_CLK_GATED BIT(0)
180 : /** I2S driver is bit clock master */
181 1 : #define I2S_OPT_BIT_CLK_MASTER (0 << 1)
182 : /** I2S driver is bit clock slave */
183 1 : #define I2S_OPT_BIT_CLK_SLAVE BIT(1)
184 : /** I2S driver is frame clock master */
185 1 : #define I2S_OPT_FRAME_CLK_MASTER (0 << 2)
186 : /** I2S driver is frame clock slave */
187 1 : #define I2S_OPT_FRAME_CLK_SLAVE BIT(2)
188 :
189 : /** @brief Loop back mode.
190 : *
191 : * In loop back mode RX input will be connected internally to TX output.
192 : * This is used primarily for testing.
193 : */
194 1 : #define I2S_OPT_LOOPBACK BIT(7)
195 :
196 : /** @brief Ping pong mode
197 : *
198 : * In ping pong mode TX output will keep alternating between a ping buffer
199 : * and a pong buffer. This is normally used in audio streams when one buffer
200 : * is being populated while the other is being played (DMAed) and vice versa.
201 : * So, in this mode, 2 sets of buffers fixed in size are used. Static Arrays
202 : * are used to achieve this and hence they are never freed.
203 : */
204 1 : #define I2S_OPT_PINGPONG BIT(6)
205 :
206 : /**
207 : * @brief I2C Direction
208 : */
209 1 : enum i2s_dir {
210 : /** Receive data */
211 : I2S_DIR_RX,
212 : /** Transmit data */
213 : I2S_DIR_TX,
214 : /** Both receive and transmit data */
215 : I2S_DIR_BOTH,
216 : };
217 :
218 : /** Interface state */
219 1 : enum i2s_state {
220 : /** @brief The interface is not ready.
221 : *
222 : * The interface was initialized but is not yet ready to receive /
223 : * transmit data. Call i2s_configure() to configure interface and change
224 : * its state to READY.
225 : */
226 : I2S_STATE_NOT_READY,
227 : /** The interface is ready to receive / transmit data. */
228 : I2S_STATE_READY,
229 : /** The interface is receiving / transmitting data. */
230 : I2S_STATE_RUNNING,
231 : /** The interface is draining its transmit queue. */
232 : I2S_STATE_STOPPING,
233 : /** TX buffer underrun or RX buffer overrun has occurred. */
234 : I2S_STATE_ERROR,
235 : };
236 :
237 : /** Trigger command */
238 1 : enum i2s_trigger_cmd {
239 : /** @brief Start the transmission / reception of data.
240 : *
241 : * If I2S_DIR_TX is set some data has to be queued for transmission by
242 : * the i2s_write() function. This trigger can be used in READY state
243 : * only and changes the interface state to RUNNING.
244 : */
245 : I2S_TRIGGER_START,
246 : /** @brief Stop the transmission / reception of data.
247 : *
248 : * Stop the transmission / reception of data at the end of the current
249 : * memory block. This trigger can be used in RUNNING state only and at
250 : * first changes the interface state to STOPPING. When the current TX /
251 : * RX block is transmitted / received the state is changed to READY.
252 : * Subsequent START trigger will resume transmission / reception where
253 : * it stopped.
254 : */
255 : I2S_TRIGGER_STOP,
256 : /** @brief Empty the transmit queue.
257 : *
258 : * Send all data in the transmit queue and stop the transmission.
259 : * If the trigger is applied to the RX queue it has the same effect as
260 : * I2S_TRIGGER_STOP. This trigger can be used in RUNNING state only and
261 : * at first changes the interface state to STOPPING. When all TX blocks
262 : * are transmitted the state is changed to READY.
263 : */
264 : I2S_TRIGGER_DRAIN,
265 : /** @brief Discard the transmit / receive queue.
266 : *
267 : * Stop the transmission / reception immediately and discard the
268 : * contents of the respective queue. This trigger can be used in any
269 : * state other than NOT_READY and changes the interface state to READY.
270 : */
271 : I2S_TRIGGER_DROP,
272 : /** @brief Prepare the queues after underrun/overrun error has occurred.
273 : *
274 : * This trigger can be used in ERROR state only and changes the
275 : * interface state to READY.
276 : */
277 : I2S_TRIGGER_PREPARE,
278 : };
279 :
280 : /** @struct i2s_config
281 : * @brief Interface configuration options.
282 : *
283 : * Memory slab pointed to by the mem_slab field has to be defined and
284 : * initialized by the user. For I2S driver to function correctly number of
285 : * memory blocks in a slab has to be at least 2 per queue. Size of the memory
286 : * block should be multiple of frame_size where frame_size = (channels *
287 : * word_size_bytes). As an example 16 bit word will occupy 2 bytes, 24 or 32
288 : * bit word will occupy 4 bytes.
289 : *
290 : * Please check Zephyr Kernel Primer for more information on memory slabs.
291 : *
292 : * @remark When I2S data format is selected parameter channels is ignored,
293 : * number of words in a frame is always 2.
294 : */
295 1 : struct i2s_config {
296 : /** Number of bits representing one data word. */
297 1 : uint8_t word_size;
298 : /** Number of words per frame. */
299 1 : uint8_t channels;
300 : /** Data stream format as defined by I2S_FMT_* constants. */
301 1 : i2s_fmt_t format;
302 : /** Configuration options as defined by I2S_OPT_* constants. */
303 1 : i2s_opt_t options;
304 : /** Frame clock (WS) frequency, this is sampling rate. */
305 1 : uint32_t frame_clk_freq;
306 : /** Memory slab to store RX/TX data. */
307 1 : struct k_mem_slab *mem_slab;
308 : /** Size of one RX/TX memory block (buffer) in bytes. */
309 1 : size_t block_size;
310 : /** Read/Write timeout. Number of milliseconds to wait in case TX queue
311 : * is full or RX queue is empty, or 0, or SYS_FOREVER_MS.
312 : */
313 1 : int32_t timeout;
314 : };
315 :
316 : /**
317 : * @cond INTERNAL_HIDDEN
318 : *
319 : * For internal use only, skip these in public documentation.
320 : */
321 : __subsystem struct i2s_driver_api {
322 : int (*configure)(const struct device *dev, enum i2s_dir dir,
323 : const struct i2s_config *cfg);
324 : const struct i2s_config *(*config_get)(const struct device *dev,
325 : enum i2s_dir dir);
326 : int (*read)(const struct device *dev, void **mem_block, size_t *size);
327 : int (*write)(const struct device *dev, void *mem_block, size_t size);
328 : int (*trigger)(const struct device *dev, enum i2s_dir dir,
329 : enum i2s_trigger_cmd cmd);
330 : };
331 : /**
332 : * @endcond
333 : */
334 :
335 : /**
336 : * @brief Configure operation of a host I2S controller.
337 : *
338 : * The dir parameter specifies if Transmit (TX) or Receive (RX) direction
339 : * will be configured by data provided via cfg parameter.
340 : *
341 : * The function can be called in NOT_READY or READY state only. If executed
342 : * successfully the function will change the interface state to READY.
343 : *
344 : * If the function is called with the parameter cfg->frame_clk_freq set to 0
345 : * the interface state will be changed to NOT_READY.
346 : *
347 : * @param dev Pointer to the device structure for the driver instance.
348 : * @param dir Stream direction: RX, TX, or both, as defined by I2S_DIR_*.
349 : * The I2S_DIR_BOTH value may not be supported by some drivers.
350 : * For those, the RX and TX streams need to be configured separately.
351 : * @param cfg Pointer to the structure containing configuration parameters.
352 : *
353 : * @retval 0 If successful.
354 : * @retval -EINVAL Invalid argument.
355 : * @retval -ENOSYS I2S_DIR_BOTH value is not supported.
356 : */
357 1 : __syscall int i2s_configure(const struct device *dev, enum i2s_dir dir,
358 : const struct i2s_config *cfg);
359 :
360 : static inline int z_impl_i2s_configure(const struct device *dev,
361 : enum i2s_dir dir,
362 : const struct i2s_config *cfg)
363 : {
364 : const struct i2s_driver_api *api =
365 : (const struct i2s_driver_api *)dev->api;
366 :
367 : return api->configure(dev, dir, cfg);
368 : }
369 :
370 : /**
371 : * @brief Fetch configuration information of a host I2S controller
372 : *
373 : * @param dev Pointer to the device structure for the driver instance
374 : * @param dir Stream direction: RX or TX as defined by I2S_DIR_*
375 : * @retval Pointer to the structure containing configuration parameters,
376 : * or NULL if un-configured
377 : */
378 1 : static inline const struct i2s_config *i2s_config_get(const struct device *dev,
379 : enum i2s_dir dir)
380 : {
381 : const struct i2s_driver_api *api =
382 : (const struct i2s_driver_api *)dev->api;
383 :
384 : return api->config_get(dev, dir);
385 : }
386 :
387 : /**
388 : * @brief Read data from the RX queue.
389 : *
390 : * Data received by the I2S interface is stored in the RX queue consisting of
391 : * memory blocks preallocated by this function from rx_mem_slab (as defined by
392 : * i2s_configure). Ownership of the RX memory block is passed on to the user
393 : * application which has to release it.
394 : *
395 : * The data is read in chunks equal to the size of the memory block. If the
396 : * interface is in READY state the number of bytes read can be smaller.
397 : *
398 : * If there is no data in the RX queue the function will block waiting for
399 : * the next RX memory block to fill in. This operation can timeout as defined
400 : * by i2s_configure. If the timeout value is set to K_NO_WAIT the function
401 : * is non-blocking.
402 : *
403 : * Reading from the RX queue is possible in any state other than NOT_READY.
404 : * If the interface is in the ERROR state it is still possible to read all the
405 : * valid data stored in RX queue. Afterwards the function will return -EIO
406 : * error.
407 : *
408 : * @param dev Pointer to the device structure for the driver instance.
409 : * @param mem_block Pointer to the RX memory block containing received data.
410 : * @param size Pointer to the variable storing the number of bytes read.
411 : *
412 : * @retval 0 If successful.
413 : * @retval -EIO The interface is in NOT_READY or ERROR state and there are no
414 : * more data blocks in the RX queue.
415 : * @retval -EBUSY Returned without waiting.
416 : * @retval -EAGAIN Waiting period timed out.
417 : */
418 1 : static inline int i2s_read(const struct device *dev, void **mem_block,
419 : size_t *size)
420 : {
421 : const struct i2s_driver_api *api =
422 : (const struct i2s_driver_api *)dev->api;
423 :
424 : return api->read(dev, mem_block, size);
425 : }
426 :
427 : /**
428 : * @brief Read data from the RX queue into a provided buffer
429 : *
430 : * Data received by the I2S interface is stored in the RX queue consisting of
431 : * memory blocks preallocated by this function from rx_mem_slab (as defined by
432 : * i2s_configure). Calling this function removes one block from the queue
433 : * which is copied into the provided buffer and then freed.
434 : *
435 : * The provided buffer must be large enough to contain a full memory block
436 : * of data, which is parameterized for the channel via i2s_configure().
437 : *
438 : * This function is otherwise equivalent to i2s_read().
439 : *
440 : * @param dev Pointer to the device structure for the driver instance.
441 : * @param buf Destination buffer for read data, which must be at least the
442 : * as large as the configured memory block size for the RX channel.
443 : * @param size Pointer to the variable storing the number of bytes read.
444 : *
445 : * @retval 0 If successful.
446 : * @retval -EIO The interface is in NOT_READY or ERROR state and there are no
447 : * more data blocks in the RX queue.
448 : * @retval -EBUSY Returned without waiting.
449 : * @retval -EAGAIN Waiting period timed out.
450 : */
451 1 : __syscall int i2s_buf_read(const struct device *dev, void *buf, size_t *size);
452 :
453 : /**
454 : * @brief Write data to the TX queue.
455 : *
456 : * Data to be sent by the I2S interface is stored first in the TX queue. TX
457 : * queue consists of memory blocks preallocated by the user from tx_mem_slab
458 : * (as defined by i2s_configure). This function takes ownership of the memory
459 : * block and will release it when all data are transmitted.
460 : *
461 : * If there are no free slots in the TX queue the function will block waiting
462 : * for the next TX memory block to be send and removed from the queue. This
463 : * operation can timeout as defined by i2s_configure. If the timeout value is
464 : * set to K_NO_WAIT the function is non-blocking.
465 : *
466 : * Writing to the TX queue is only possible if the interface is in READY or
467 : * RUNNING state.
468 : *
469 : * @param dev Pointer to the device structure for the driver instance.
470 : * @param mem_block Pointer to the TX memory block containing data to be sent.
471 : * @param size Number of bytes to write. This value has to be equal or smaller
472 : * than the size of the memory block.
473 : *
474 : * @retval 0 If successful.
475 : * @retval -EIO The interface is not in READY or RUNNING state.
476 : * @retval -EBUSY Returned without waiting.
477 : * @retval -EAGAIN Waiting period timed out.
478 : */
479 1 : static inline int i2s_write(const struct device *dev, void *mem_block,
480 : size_t size)
481 : {
482 : const struct i2s_driver_api *api =
483 : (const struct i2s_driver_api *)dev->api;
484 :
485 : return api->write(dev, mem_block, size);
486 : }
487 :
488 : /**
489 : * @brief Write data to the TX queue from a provided buffer
490 : *
491 : * This function acquires a memory block from the I2S channel TX queue
492 : * and copies the provided data buffer into it. It is otherwise equivalent
493 : * to i2s_write().
494 : *
495 : * @param dev Pointer to the device structure for the driver instance.
496 : * @param buf Pointer to a buffer containing the data to transmit.
497 : * @param size Number of bytes to write. This value has to be equal or smaller
498 : * than the size of the channel's TX memory block configuration.
499 : *
500 : * @retval 0 If successful.
501 : * @retval -EIO The interface is not in READY or RUNNING state.
502 : * @retval -EBUSY Returned without waiting.
503 : * @retval -EAGAIN Waiting period timed out.
504 : * @retval -ENOMEM No memory in TX slab queue.
505 : * @retval -EINVAL Size parameter larger than TX queue memory block.
506 : */
507 1 : __syscall int i2s_buf_write(const struct device *dev, void *buf, size_t size);
508 :
509 : /**
510 : * @brief Send a trigger command.
511 : *
512 : * @param dev Pointer to the device structure for the driver instance.
513 : * @param dir Stream direction: RX, TX, or both, as defined by I2S_DIR_*.
514 : * The I2S_DIR_BOTH value may not be supported by some drivers.
515 : * For those, triggering need to be done separately for the RX
516 : * and TX streams.
517 : * @param cmd Trigger command.
518 : *
519 : * @retval 0 If successful.
520 : * @retval -EINVAL Invalid argument.
521 : * @retval -EIO The trigger cannot be executed in the current state or a DMA
522 : * channel cannot be allocated.
523 : * @retval -ENOMEM RX/TX memory block not available.
524 : * @retval -ENOSYS I2S_DIR_BOTH value is not supported.
525 : */
526 1 : __syscall int i2s_trigger(const struct device *dev, enum i2s_dir dir,
527 : enum i2s_trigger_cmd cmd);
528 :
529 : static inline int z_impl_i2s_trigger(const struct device *dev,
530 : enum i2s_dir dir,
531 : enum i2s_trigger_cmd cmd)
532 : {
533 : const struct i2s_driver_api *api =
534 : (const struct i2s_driver_api *)dev->api;
535 :
536 : return api->trigger(dev, dir, cmd);
537 : }
538 :
539 : /**
540 : * @}
541 : */
542 :
543 : #ifdef __cplusplus
544 : }
545 : #endif
546 :
547 : #include <zephyr/syscalls/i2s.h>
548 :
549 : #endif /* ZEPHYR_INCLUDE_DRIVERS_I2S_H_ */
|