Il y avait des problèmes dans la libraire...

Dependents:   X_NUCLEO_CCA02M1

Fork of ST_I2S by ST

Committer:
Davide Aliprandi
Date:
Wed Dec 21 20:24:16 2016 +0100
Revision:
4:21603d68bcf7
Parent:
1:f90318e0923b
Child:
9:c4c2240e06d6
Added algorithm to automatically harmonize two I2S peripherals' frequencies.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wolfgang Betz 0:752e74bf5ef1 1 #ifndef MBED_I2S_H
Wolfgang Betz 0:752e74bf5ef1 2 #define MBED_I2S_H
Wolfgang Betz 0:752e74bf5ef1 3
Wolfgang Betz 0:752e74bf5ef1 4 #include "platform/platform.h"
Wolfgang Betz 0:752e74bf5ef1 5
Wolfgang Betz 0:752e74bf5ef1 6 #if DEVICE_I2S
Wolfgang Betz 0:752e74bf5ef1 7
Wolfgang Betz 0:752e74bf5ef1 8 #ifndef MBED_CONF_RTOS_PRESENT
Wolfgang Betz 0:752e74bf5ef1 9 #error "I2S only supports asynchronous transfers which currently require a RTOS!"
Wolfgang Betz 0:752e74bf5ef1 10 #else
Wolfgang Betz 0:752e74bf5ef1 11 #include "rtos/Thread.h" // betzw - TODO: this requires a RTOS (i.e. needs to be generalized for mbed-classic)
Wolfgang Betz 0:752e74bf5ef1 12 #endif
Wolfgang Betz 0:752e74bf5ef1 13
Wolfgang Betz 0:752e74bf5ef1 14 #include "platform/PlatformMutex.h"
Wolfgang Betz 1:f90318e0923b 15 #include "hal/stm_i2s_api.h"
Wolfgang Betz 0:752e74bf5ef1 16 #include "platform/SingletonPtr.h"
Wolfgang Betz 0:752e74bf5ef1 17
Wolfgang Betz 0:752e74bf5ef1 18 #include "platform/CThunk.h"
Wolfgang Betz 1:f90318e0923b 19 #include "hal/stm_dma_api.h"
Wolfgang Betz 0:752e74bf5ef1 20 #include "platform/CircularBuffer.h"
Wolfgang Betz 0:752e74bf5ef1 21 #include "platform/FunctionPointer.h"
Wolfgang Betz 0:752e74bf5ef1 22 #include "platform/Transaction.h"
Wolfgang Betz 0:752e74bf5ef1 23
Wolfgang Betz 0:752e74bf5ef1 24 #include "events/EventQueue.h"
Wolfgang Betz 0:752e74bf5ef1 25
Wolfgang Betz 0:752e74bf5ef1 26 namespace mbed {
Wolfgang Betz 0:752e74bf5ef1 27
Wolfgang Betz 0:752e74bf5ef1 28 /** A I2S Master/Slave, used for communicating with I2S slave/master devices
Wolfgang Betz 0:752e74bf5ef1 29 *
Wolfgang Betz 0:752e74bf5ef1 30 * The default format is set to master transmission mode, one-shot (i.e. not circular)
Wolfgang Betz 0:752e74bf5ef1 31 * 16 data bits & 16 bits per frame, clock polarity 0,
Wolfgang Betz 0:752e74bf5ef1 32 * protocol PHILIPS, and a clock frequency of 44.1kHz
Wolfgang Betz 0:752e74bf5ef1 33 *
Wolfgang Betz 0:752e74bf5ef1 34 * TODO: "direct" PDM support
Wolfgang Betz 0:752e74bf5ef1 35 *
Wolfgang Betz 0:752e74bf5ef1 36 * Most I2S devices will also require Reset signals. These
Wolfgang Betz 0:752e74bf5ef1 37 * can be controlled using <DigitalOut> pins
Wolfgang Betz 0:752e74bf5ef1 38 *
Wolfgang Betz 0:752e74bf5ef1 39 * @Note Synchronization level: Thread safe
Wolfgang Betz 0:752e74bf5ef1 40 *
Wolfgang Betz 0:752e74bf5ef1 41 */
Wolfgang Betz 0:752e74bf5ef1 42 class I2S {
Wolfgang Betz 0:752e74bf5ef1 43
Wolfgang Betz 0:752e74bf5ef1 44 public:
Wolfgang Betz 0:752e74bf5ef1 45 /** Create a I2S master connected to the specified pins
Wolfgang Betz 0:752e74bf5ef1 46 *
Wolfgang Betz 0:752e74bf5ef1 47 * @param dpin I2S data input/output pin
Wolfgang Betz 0:752e74bf5ef1 48 * @param clk I2S clock output pin
Wolfgang Betz 0:752e74bf5ef1 49 * @param wsel I2S word select output pin (might be NC for PDM sources)
Wolfgang Betz 0:752e74bf5ef1 50 * @param fdpin I2S data input pin (for full-duplex operation, default = NC)
Wolfgang Betz 0:752e74bf5ef1 51 * @param mck I2S master clock output (additional pin when needed for some external audio devices, default = NC)
Wolfgang Betz 0:752e74bf5ef1 52 *
Wolfgang Betz 0:752e74bf5ef1 53 * @Note It is up to the application programmer to not generate at the same time two I2S instances with the
Wolfgang Betz 0:752e74bf5ef1 54 * same pin (NC excluded) for one of the parameters, otherwise the correct operation of this class cannot be
Wolfgang Betz 0:752e74bf5ef1 55 * guaranteed (e.g. things like SPI/I2S clock enabling and above all disabling might not work correctly)!
Wolfgang Betz 0:752e74bf5ef1 56 */
Wolfgang Betz 0:752e74bf5ef1 57 I2S(PinName dpin, PinName clk, PinName wsel, PinName fdpin = NC, PinName mck = NC);
Wolfgang Betz 0:752e74bf5ef1 58
Wolfgang Betz 0:752e74bf5ef1 59 /** Configure the data transmission format
Wolfgang Betz 0:752e74bf5ef1 60 *
Wolfgang Betz 0:752e74bf5ef1 61 * @param dbits Number of data bits per I2S frame (16, 24, or 32)
Wolfgang Betz 0:752e74bf5ef1 62 * @param fbits Number of bits per I2S frame (16 or 32)
Wolfgang Betz 0:752e74bf5ef1 63 * @param polarity Clock polarity (either 0/low or 1/high, default = 0)
Wolfgang Betz 0:752e74bf5ef1 64 * @return Zero if the usage was set, -1 if a transaction is on-going
Wolfgang Betz 0:752e74bf5ef1 65 */
Wolfgang Betz 0:752e74bf5ef1 66 int format(int dbits, int fbits, int polarity = 0);
Wolfgang Betz 0:752e74bf5ef1 67
Wolfgang Betz 0:752e74bf5ef1 68 /** Set the i2s audio frequency
Wolfgang Betz 0:752e74bf5ef1 69 *
Wolfgang Betz 0:752e74bf5ef1 70 * @param hz audio frequency in hz
Wolfgang Betz 0:752e74bf5ef1 71 * @return Zero if the usage was set, -1 if a transaction is on-going
Wolfgang Betz 0:752e74bf5ef1 72 */
Wolfgang Betz 0:752e74bf5ef1 73 int audio_frequency(unsigned int hz);
Wolfgang Betz 0:752e74bf5ef1 74
Wolfgang Betz 0:752e74bf5ef1 75 /** Set the i2s bus protocol
Wolfgang Betz 0:752e74bf5ef1 76 *
Wolfgang Betz 0:752e74bf5ef1 77 * @param protocol I2S protocol to be used
Wolfgang Betz 0:752e74bf5ef1 78 * @return Zero if the usage was set, -1 if a transaction is on-going
Wolfgang Betz 0:752e74bf5ef1 79 */
Wolfgang Betz 0:752e74bf5ef1 80 int set_protocol(i2s_bitorder_t protocol);
Wolfgang Betz 0:752e74bf5ef1 81
Wolfgang Betz 0:752e74bf5ef1 82 /** Set the i2s mode
Wolfgang Betz 0:752e74bf5ef1 83 *
Wolfgang Betz 0:752e74bf5ef1 84 * @param mode I2S mode to be used
Wolfgang Betz 0:752e74bf5ef1 85 * @param circular I2S should read/write buffers continuously (in circular mode)
Wolfgang Betz 0:752e74bf5ef1 86 * @return Zero if the usage was set, -1 if a transaction is on-going
Wolfgang Betz 0:752e74bf5ef1 87 */
Wolfgang Betz 0:752e74bf5ef1 88 int set_mode(i2s_mode_t mode, bool circular);
Wolfgang Betz 0:752e74bf5ef1 89
Wolfgang Betz 0:752e74bf5ef1 90 /** Start non-blocking I2S transfer as configured with above methods
Wolfgang Betz 0:752e74bf5ef1 91 *
Wolfgang Betz 0:752e74bf5ef1 92 * @param tx_buffer The TX buffer with data to be transfered. If NULL is passed,
Wolfgang Betz 0:752e74bf5ef1 93 * no transmission will be set up
Wolfgang Betz 0:752e74bf5ef1 94 * @param tx_length The length of TX buffer in bytes
Wolfgang Betz 0:752e74bf5ef1 95 * @param rx_buffer The RX buffer which is used for received data. If NULL is passed,
Wolfgang Betz 0:752e74bf5ef1 96 * received data will be ignored
Wolfgang Betz 0:752e74bf5ef1 97 * @param rx_length The length of RX buffer in bytes
Wolfgang Betz 0:752e74bf5ef1 98 * @param callback The event callback function
Wolfgang Betz 0:752e74bf5ef1 99 * @param event The logical OR of events to notify. Look at i2s hal header file for I2S events.
Wolfgang Betz 0:752e74bf5ef1 100 * @return Zero if the transfer has started (or been queued), or
Wolfgang Betz 0:752e74bf5ef1 101 * -1 if I2S peripheral is busy (or out of resources)
Wolfgang Betz 0:752e74bf5ef1 102 */
Wolfgang Betz 0:752e74bf5ef1 103 template<typename Type>
Wolfgang Betz 0:752e74bf5ef1 104 int transfer(const Type *tx_buffer, int tx_length, Type *rx_buffer, int rx_length, const event_callback_t& callback, int event) {
Wolfgang Betz 0:752e74bf5ef1 105 int ret = 0;
Wolfgang Betz 0:752e74bf5ef1 106
Wolfgang Betz 0:752e74bf5ef1 107 lock();
Wolfgang Betz 0:752e74bf5ef1 108 #if !TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 0:752e74bf5ef1 109 if(callback && (event & I2S_EVENT_ALL)) {
Wolfgang Betz 0:752e74bf5ef1 110 /* Init bottom half daemon */
Wolfgang Betz 0:752e74bf5ef1 111 I2sBhHandler::init();
Wolfgang Betz 0:752e74bf5ef1 112 }
Wolfgang Betz 0:752e74bf5ef1 113 #endif
Wolfgang Betz 0:752e74bf5ef1 114
Wolfgang Betz 0:752e74bf5ef1 115 if (i2s_active(&_i2s)
Wolfgang Betz 0:752e74bf5ef1 116 #if TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 0:752e74bf5ef1 117 || !_transaction_buffer.empty()
Wolfgang Betz 0:752e74bf5ef1 118 #endif
Wolfgang Betz 0:752e74bf5ef1 119 ) {
Wolfgang Betz 0:752e74bf5ef1 120 ret = queue_transfer(tx_buffer, tx_length, rx_buffer, rx_length, callback, event);
Wolfgang Betz 0:752e74bf5ef1 121 } else {
Wolfgang Betz 0:752e74bf5ef1 122 start_transfer(tx_buffer, tx_length, rx_buffer, rx_length, callback, event);
Wolfgang Betz 0:752e74bf5ef1 123 }
Wolfgang Betz 0:752e74bf5ef1 124 unlock();
Wolfgang Betz 0:752e74bf5ef1 125 return ret;
Wolfgang Betz 0:752e74bf5ef1 126 }
Wolfgang Betz 0:752e74bf5ef1 127
Wolfgang Betz 0:752e74bf5ef1 128 /** Acquire exclusive access to this I2S bus
Wolfgang Betz 0:752e74bf5ef1 129 */
Wolfgang Betz 0:752e74bf5ef1 130 virtual void lock(void);
Wolfgang Betz 0:752e74bf5ef1 131
Wolfgang Betz 0:752e74bf5ef1 132 /** Release exclusive access to this I2S bus
Wolfgang Betz 0:752e74bf5ef1 133 */
Wolfgang Betz 0:752e74bf5ef1 134 virtual void unlock(void);
Wolfgang Betz 0:752e74bf5ef1 135
Wolfgang Betz 0:752e74bf5ef1 136 /** Abort the on-going I2S transfer, and continue with transfer's in the queue if any.
Wolfgang Betz 0:752e74bf5ef1 137 */
Wolfgang Betz 0:752e74bf5ef1 138 void abort_transfer();
Wolfgang Betz 0:752e74bf5ef1 139
Wolfgang Betz 0:752e74bf5ef1 140 /** Clear the transaction buffer
Wolfgang Betz 0:752e74bf5ef1 141 */
Wolfgang Betz 0:752e74bf5ef1 142 void clear_transfer_buffer();
Wolfgang Betz 0:752e74bf5ef1 143
Wolfgang Betz 0:752e74bf5ef1 144 /** Clear the transaction buffer and abort on-going transfer.
Wolfgang Betz 0:752e74bf5ef1 145 */
Wolfgang Betz 0:752e74bf5ef1 146 void abort_all_transfers();
Wolfgang Betz 0:752e74bf5ef1 147
Wolfgang Betz 0:752e74bf5ef1 148 /** Get transfer status
Wolfgang Betz 0:752e74bf5ef1 149 *
Wolfgang Betz 0:752e74bf5ef1 150 * @return -1 if a transaction is on-going, zero otherwise
Wolfgang Betz 0:752e74bf5ef1 151 */
Wolfgang Betz 0:752e74bf5ef1 152 int get_transfer_status();
Wolfgang Betz 0:752e74bf5ef1 153
Wolfgang Betz 0:752e74bf5ef1 154 /** Get internal module id
Wolfgang Betz 0:752e74bf5ef1 155 *
Wolfgang Betz 0:752e74bf5ef1 156 * @return internal module id
Wolfgang Betz 0:752e74bf5ef1 157 */
Wolfgang Betz 0:752e74bf5ef1 158 unsigned int get_module();
Wolfgang Betz 0:752e74bf5ef1 159
Wolfgang Betz 0:752e74bf5ef1 160 /** Configure DMA priority for transfers
Wolfgang Betz 0:752e74bf5ef1 161 *
Wolfgang Betz 0:752e74bf5ef1 162 * @param prio The DMA priority to be used
Wolfgang Betz 0:752e74bf5ef1 163 * @return Zero if the usage was set, -1 if a transaction is on-going
Wolfgang Betz 0:752e74bf5ef1 164 */
Wolfgang Betz 0:752e74bf5ef1 165 int set_dma_priority(i2s_dma_prio_t prio);
Wolfgang Betz 0:752e74bf5ef1 166
Davide Aliprandi 4:21603d68bcf7 167 /** Harmonize the frequencies of the given I2S objects so that they are
Davide Aliprandi 4:21603d68bcf7 168 * exact multiple one of the other. It can be useful whenever two I2S
Davide Aliprandi 4:21603d68bcf7 169 * peripherals have to work together and no drift is allowed between them.
Davide Aliprandi 4:21603d68bcf7 170 *
Davide Aliprandi 4:21603d68bcf7 171 * @param dev_i2s_1 reference to the first I2S object.
Davide Aliprandi 4:21603d68bcf7 172 * @param dev_i2s_2 reference to the second I2S object.
Davide Aliprandi 4:21603d68bcf7 173 * @return Zero if the frequencies have been harmonized correctly, -1
Davide Aliprandi 4:21603d68bcf7 174 * otherwise.
Davide Aliprandi 4:21603d68bcf7 175 */
Davide Aliprandi 4:21603d68bcf7 176 static int harmonize(I2S *dev_i2s_1, I2S *dev_i2s_2);
Davide Aliprandi 4:21603d68bcf7 177
Wolfgang Betz 0:752e74bf5ef1 178 protected:
Wolfgang Betz 0:752e74bf5ef1 179 /** I2S TX DMA IRQ handler
Wolfgang Betz 0:752e74bf5ef1 180 *
Wolfgang Betz 0:752e74bf5ef1 181 */
Wolfgang Betz 0:752e74bf5ef1 182 void irq_handler_asynch_tx(void);
Wolfgang Betz 0:752e74bf5ef1 183
Wolfgang Betz 0:752e74bf5ef1 184 /** I2S RX DMA IRQ handler
Wolfgang Betz 0:752e74bf5ef1 185 *
Wolfgang Betz 0:752e74bf5ef1 186 */
Wolfgang Betz 0:752e74bf5ef1 187 void irq_handler_asynch_rx(void);
Wolfgang Betz 0:752e74bf5ef1 188
Wolfgang Betz 0:752e74bf5ef1 189 /** Add a transfer to the queue
Wolfgang Betz 0:752e74bf5ef1 190 * @param data Transaction data
Wolfgang Betz 0:752e74bf5ef1 191 * @return Zero if a transfer was added to the queue, or -1 if the queue is full
Wolfgang Betz 0:752e74bf5ef1 192 */
Wolfgang Betz 0:752e74bf5ef1 193 int queue_transfer(const void *tx_buffer, int tx_length, void *rx_buffer, int rx_length,
Wolfgang Betz 0:752e74bf5ef1 194 const event_callback_t& callback, int event);
Wolfgang Betz 0:752e74bf5ef1 195
Wolfgang Betz 0:752e74bf5ef1 196 /** Configures a callback, i2s peripheral and initiate a new transfer
Wolfgang Betz 0:752e74bf5ef1 197 *
Wolfgang Betz 0:752e74bf5ef1 198 * @param data Transaction data
Wolfgang Betz 0:752e74bf5ef1 199 */
Wolfgang Betz 0:752e74bf5ef1 200 void start_transfer(const void *tx_buffer, int tx_length, void *rx_buffer, int rx_length,
Wolfgang Betz 0:752e74bf5ef1 201 const event_callback_t& callback, int event);
Wolfgang Betz 0:752e74bf5ef1 202
Wolfgang Betz 0:752e74bf5ef1 203 class I2sBhHandler {
Wolfgang Betz 0:752e74bf5ef1 204 friend class I2S;
Wolfgang Betz 0:752e74bf5ef1 205
Wolfgang Betz 0:752e74bf5ef1 206 static void init() {
Wolfgang Betz 0:752e74bf5ef1 207 static bool inited = false;
Wolfgang Betz 0:752e74bf5ef1 208
Wolfgang Betz 0:752e74bf5ef1 209 if(!inited) {
Wolfgang Betz 0:752e74bf5ef1 210 Callback<void()> i2s_bh_task(&_i2s_bh_queue, &events::EventQueue::dispatch_forever);
Wolfgang Betz 0:752e74bf5ef1 211 _i2s_bh_daemon.start(i2s_bh_task); // betzw - TODO: this requires a RTOS (i.e. needs to be generalized for mbed-classic)
Wolfgang Betz 0:752e74bf5ef1 212 inited = true;
Wolfgang Betz 0:752e74bf5ef1 213 }
Wolfgang Betz 0:752e74bf5ef1 214 }
Wolfgang Betz 0:752e74bf5ef1 215
Wolfgang Betz 0:752e74bf5ef1 216 static void i2s_defer_function(const event_callback_t& bottom_half, int event) {
Wolfgang Betz 0:752e74bf5ef1 217 _i2s_bh_queue.call(bottom_half, event);
Wolfgang Betz 0:752e74bf5ef1 218 }
Wolfgang Betz 0:752e74bf5ef1 219
Wolfgang Betz 0:752e74bf5ef1 220 static void i2s_defer_function(const Callback<void()>& bottom_half) {
Wolfgang Betz 0:752e74bf5ef1 221 _i2s_bh_queue.call(bottom_half);
Wolfgang Betz 0:752e74bf5ef1 222 }
Wolfgang Betz 0:752e74bf5ef1 223
Wolfgang Betz 0:752e74bf5ef1 224 static rtos::Thread _i2s_bh_daemon; // betzw - TODO: this requires a RTOS (i.e. needs to be generalized for mbed-classic)
Wolfgang Betz 0:752e74bf5ef1 225 static events::EventQueue _i2s_bh_queue;
Wolfgang Betz 0:752e74bf5ef1 226 };
Wolfgang Betz 0:752e74bf5ef1 227
Wolfgang Betz 0:752e74bf5ef1 228 #if TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 0:752e74bf5ef1 229 /** Start a new transaction
Wolfgang Betz 0:752e74bf5ef1 230 *
Wolfgang Betz 0:752e74bf5ef1 231 * @param data Transaction data
Wolfgang Betz 0:752e74bf5ef1 232 */
Wolfgang Betz 0:752e74bf5ef1 233 void start_transaction(transaction_t *data);
Wolfgang Betz 0:752e74bf5ef1 234
Wolfgang Betz 0:752e74bf5ef1 235 /** Dequeue a transaction
Wolfgang Betz 0:752e74bf5ef1 236 *
Wolfgang Betz 0:752e74bf5ef1 237 */
Wolfgang Betz 0:752e74bf5ef1 238 void dequeue_transaction();
Wolfgang Betz 0:752e74bf5ef1 239
Wolfgang Betz 0:752e74bf5ef1 240 /* betzw - WAS : static */ CircularBuffer<Transaction<I2S>, TRANSACTION_QUEUE_SIZE_I2S> _transaction_buffer;
Wolfgang Betz 0:752e74bf5ef1 241 #endif // TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 0:752e74bf5ef1 242
Davide Aliprandi 4:21603d68bcf7 243 /** Compute the real frequency of a given I2S objects.
Davide Aliprandi 4:21603d68bcf7 244 *
Davide Aliprandi 4:21603d68bcf7 245 * @param dev_i2s reference to the I2S object.
Davide Aliprandi 4:21603d68bcf7 246 * @return the computed real frequency.
Davide Aliprandi 4:21603d68bcf7 247 */
Davide Aliprandi 4:21603d68bcf7 248 static float compute_real_frequency(I2S *dev_i2s);
Davide Aliprandi 4:21603d68bcf7 249
Davide Aliprandi 4:21603d68bcf7 250 /** Computes the two-div-plus-odd factor of a given I2S objects
Davide Aliprandi 4:21603d68bcf7 251 * on a desired frequency.
Davide Aliprandi 4:21603d68bcf7 252 *
Davide Aliprandi 4:21603d68bcf7 253 * @param dev_i2s reference to the I2S object.
Davide Aliprandi 4:21603d68bcf7 254 * @frequency the desired frequency.
Davide Aliprandi 4:21603d68bcf7 255 * @return the computed two-div-plus-odd factor.
Davide Aliprandi 4:21603d68bcf7 256 */
Davide Aliprandi 4:21603d68bcf7 257 static float compute_magic_factor(I2S *dev_i2s, float f);
Davide Aliprandi 4:21603d68bcf7 258
Davide Aliprandi 4:21603d68bcf7 259 /** Compute the desired frequency of a given I2S objects, given the magic
Davide Aliprandi 4:21603d68bcf7 260 * factor.
Davide Aliprandi 4:21603d68bcf7 261 *
Davide Aliprandi 4:21603d68bcf7 262 * @param dev_i2s reference to the I2S object.
Davide Aliprandi 4:21603d68bcf7 263 * @param mf the two-div-plus-odd factor.
Davide Aliprandi 4:21603d68bcf7 264 * @return the computed desired frequency.
Davide Aliprandi 4:21603d68bcf7 265 */
Davide Aliprandi 4:21603d68bcf7 266 static float compute_desired_frequency(I2S *dev_i2s, float mf);
Davide Aliprandi 4:21603d68bcf7 267
Wolfgang Betz 0:752e74bf5ef1 268 public:
Wolfgang Betz 0:752e74bf5ef1 269 virtual ~I2S() {
Wolfgang Betz 0:752e74bf5ef1 270 /* betzw - TODO: cleanup has still to be revised completely! */
Wolfgang Betz 0:752e74bf5ef1 271 abort_all_transfers();
Wolfgang Betz 0:752e74bf5ef1 272 i2s_free(&_i2s);
Wolfgang Betz 0:752e74bf5ef1 273 }
Wolfgang Betz 0:752e74bf5ef1 274
Wolfgang Betz 0:752e74bf5ef1 275 protected:
Wolfgang Betz 0:752e74bf5ef1 276 i2s_t _i2s;
Wolfgang Betz 0:752e74bf5ef1 277
Wolfgang Betz 0:752e74bf5ef1 278 CThunk<I2S> _irq_tx;
Wolfgang Betz 0:752e74bf5ef1 279 CThunk<I2S> _irq_rx;
Wolfgang Betz 0:752e74bf5ef1 280 event_callback_t _callback;
Wolfgang Betz 0:752e74bf5ef1 281 i2s_dma_prio_t _priority; // DMA priority
Wolfgang Betz 0:752e74bf5ef1 282
Wolfgang Betz 0:752e74bf5ef1 283 void acquire(void);
Wolfgang Betz 0:752e74bf5ef1 284
Wolfgang Betz 0:752e74bf5ef1 285 static I2S *_owner;
Wolfgang Betz 0:752e74bf5ef1 286 static SingletonPtr<PlatformMutex> _mutex;
Wolfgang Betz 0:752e74bf5ef1 287
Wolfgang Betz 0:752e74bf5ef1 288 int _dbits;
Wolfgang Betz 0:752e74bf5ef1 289 int _fbits;
Wolfgang Betz 0:752e74bf5ef1 290 int _polarity;
Wolfgang Betz 0:752e74bf5ef1 291 i2s_bitorder_t _protocol;
Wolfgang Betz 0:752e74bf5ef1 292 i2s_mode_t _mode;
Wolfgang Betz 0:752e74bf5ef1 293 bool _circular;
Wolfgang Betz 0:752e74bf5ef1 294 unsigned int _hz;
Wolfgang Betz 0:752e74bf5ef1 295 };
Wolfgang Betz 0:752e74bf5ef1 296
Wolfgang Betz 0:752e74bf5ef1 297 } // namespace mbed
Wolfgang Betz 0:752e74bf5ef1 298
Wolfgang Betz 0:752e74bf5ef1 299 #endif
Wolfgang Betz 0:752e74bf5ef1 300
Wolfgang Betz 0:752e74bf5ef1 301 #endif