diff options
author | Damien George <damien@micropython.org> | 2023-10-10 16:44:02 +1100 |
---|---|---|
committer | Damien George <damien@micropython.org> | 2023-10-20 17:40:17 +1100 |
commit | 91a3f183916e1514fbb8dc58ca5b77acc59d4346 (patch) | |
tree | 9468a7b456e4c7b325d3c3de034769eb71457dc8 /extmod/machine_i2s.c | |
parent | 46ae3b5a34d33d3c696e1fb66661983315686712 (diff) |
extmod/machine_i2s: Factor comments, some enums and macros.
Signed-off-by: Damien George <damien@micropython.org>
Diffstat (limited to 'extmod/machine_i2s.c')
-rw-r--r-- | extmod/machine_i2s.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/extmod/machine_i2s.c b/extmod/machine_i2s.c index bbff560a0..cc97f011a 100644 --- a/extmod/machine_i2s.c +++ b/extmod/machine_i2s.c @@ -32,6 +32,52 @@ #include "extmod/modmachine.h" +// The I2S class has 3 modes of operation: +// +// Mode1: Blocking +// - readinto() and write() methods block until the supplied buffer is filled (read) or emptied (write) +// - this is the default mode of operation +// +// Mode2: Non-Blocking +// - readinto() and write() methods return immediately +// - buffer filling and emptying happens asynchronously to the main MicroPython task +// - a callback function is called when the supplied buffer has been filled (read) or emptied (write) +// - non-blocking mode is enabled when a callback is set with the irq() method +// - implementation of asynchronous background operations is port specific +// +// Mode3: Asyncio +// - implements the stream protocol +// - asyncio mode is enabled when the ioctl() function is called +// - the state of the internal ring buffer is used to detect that I2S samples can be read or written +// +// The samples contained in the app buffer supplied for the readinto() and write() methods have the following convention: +// Mono: little endian format +// Stereo: little endian format, left channel first +// +// I2S terms: +// "frame": consists of two audio samples (Left audio sample + Right audio sample) +// +// Misc: +// - for Mono configuration: +// - readinto method: samples are gathered from the L channel only +// - write method: every sample is output to both the L and R channels +// - for readinto method the I2S hardware is read using 8-byte frames +// (this is standard for almost all I2S hardware, such as MEMS microphones) + +#define NUM_I2S_USER_FORMATS (4) +#define I2S_RX_FRAME_SIZE_IN_BYTES (8) + +typedef enum { + MONO, + STEREO +} format_t; + +typedef enum { + BLOCKING, + NON_BLOCKING, + ASYNCIO +} io_mode_t; + // Arguments for I2S() constructor and I2S.init(). enum { ARG_sck, |