1
0
mirror of https://github.com/esp8266/Arduino.git synced 2025-07-24 19:42:27 +03:00
Files
esp8266/libraries/I2S/src/I2S.h
Earle F. Philhower, III e99df4fe1a Add I2S class support (#7874)
Fixes #427

Adds a basic I2S class based off of the Arduino-SAMD core.  The raw
i2s_xxx functions are still a better  way to use I2S due to their
flexibility, but this will allow basic Arduino sketches to work.
2021-03-07 08:14:07 -08:00

96 lines
3.1 KiB
C++

/*
Based off of ArduinoCore-SAMD I2S interface. Modified for the
ESP8266 by Earle F. Philhower, III <earlephilhower@yahoo.com>
Copyright (c) 2016 Arduino LLC. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _I2S_H_INCLUDED
#define _I2S_H_INCLUDED
#include <Arduino.h>
#include <core_esp8266_i2s.h>
typedef enum {
I2S_PHILIPS_MODE // Only mode allowed for now by the core
} i2s_mode_t;
class I2SClass : public Stream
{
public:
// By default only transmit and drive the clock pins
I2SClass(bool enableTransmit = true, bool enableRecv = false,
bool driveClocks = true);
// Only 16 and 24 bitsPerSample are allowed by the hardware
// 24-bit is MSB-aligned, with 0x00 in the lowest byte of each element.
int begin(i2s_mode_t mode, long sampleRate, int bitsPerSample);
void end();
// from Stream
virtual int available();
virtual int read(); // Blocking, will wait for incoming data
virtual int peek(); // Blocking, will wait for incoming data
virtual void flush();
// from Print (see notes on write() methods below)
virtual size_t write(uint8_t);
virtual size_t write(const uint8_t *buffer, size_t size);
virtual int availableForWrite();
// Read up to size samples from the I2S device. Non-blocking, will read
// from 0...size samples and return the count read. Be sure your app handles
// the partial read case (i.e. yield()ing and trying to read more).
int read(void* buffer, size_t size);
// Write a single sample to the I2S device. Blocking until write succeeds
size_t write(int32_t);
// Write up to size samples to the I2S device. Non-blocking, will write
// from 0...size samples and return that count. Be sure your app handles
// partial writes (i.e. by yield()ing and then retrying to write the
// remaining data.
size_t write(const void *buffer, size_t size);
// Note that these callback are called from **INTERRUPT CONTEXT** and hence
// must be both stored in IRAM and not perform anything that's not legal in
// an interrupt
void onTransmit(void(*)(void));
void onReceive(void(*)(void));
private:
int _bps;
bool _running;
bool _enableTx;
bool _enableRx;
bool _driveClk;
void (*_onTransmit)(void);
void (*_onReceive)(void);
// Support for peek() on read path
uint32_t _peekedData;
int _havePeeked;
// Support for ::write(x) on 16b wuantities
uint32_t _writtenData;
bool _writtenHalf;
};
#if !defined(NO_GLOBAL_INSTANCES) && !defined(NO_GLOBAL_I2S)
extern I2SClass I2S;
#endif
#endif