summaryrefslogtreecommitdiff
path: root/extmod/machine_i2s.c
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2023-10-10 16:44:02 +1100
committerDamien George <damien@micropython.org>2023-10-20 17:40:17 +1100
commit91a3f183916e1514fbb8dc58ca5b77acc59d4346 (patch)
tree9468a7b456e4c7b325d3c3de034769eb71457dc8 /extmod/machine_i2s.c
parent46ae3b5a34d33d3c696e1fb66661983315686712 (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.c46
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,