STMicroelectronics' implementation of an I2S driver, also including DMA support.

Dependents:   temp X_NUCLEO_CCA01M1 X_NUCLEO_CCA01M1 X_NUCLEO_CCA02M1

Platform compatibility

This driver has been designed to support a wide range of the Nucleo F4 Family of platforms and MCUs, but not all members of this family support I2S and/or some of the members might require slight modifications to the sources of this driver in order to make it work on those.

This driver has for now been tested only with the following platforms:

Committer:
Wolfgang Betz
Date:
Thu Dec 22 12:02:24 2016 +0100
Revision:
10:1a612c2e4a85
Parent:
9:c4c2240e06d6
Child:
11:50562a5f8a93
Make driver mbed-classic compatible

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wolfgang Betz 0:752e74bf5ef1 1 #include "drivers/I2S.h"
Wolfgang Betz 0:752e74bf5ef1 2 #include "platform/critical.h"
Wolfgang Betz 0:752e74bf5ef1 3 #include "platform/mbed_assert.h"
Wolfgang Betz 0:752e74bf5ef1 4
Wolfgang Betz 0:752e74bf5ef1 5 #if DEVICE_I2S
Wolfgang Betz 0:752e74bf5ef1 6
Wolfgang Betz 0:752e74bf5ef1 7 namespace mbed {
Wolfgang Betz 0:752e74bf5ef1 8
Wolfgang Betz 0:752e74bf5ef1 9 /* betzw - WAS
Wolfgang Betz 9:c4c2240e06d6 10 #if TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 9:c4c2240e06d6 11 CircularBuffer<Transaction<I2S>, TRANSACTION_QUEUE_SIZE_I2S> I2S::_transaction_buffer;
Wolfgang Betz 9:c4c2240e06d6 12 #endif
Wolfgang Betz 0:752e74bf5ef1 13 */
Wolfgang Betz 0:752e74bf5ef1 14
Wolfgang Betz 10:1a612c2e4a85 15 I2S* I2S::_owner = NULL;
Wolfgang Betz 10:1a612c2e4a85 16 SingletonPtr<PlatformMutex> I2S::_mutex; // intentional class level lock!
Wolfgang Betz 0:752e74bf5ef1 17
Wolfgang Betz 10:1a612c2e4a85 18 events::EventQueue I2S::i2s_bh_queue;
Wolfgang Betz 0:752e74bf5ef1 19
Wolfgang Betz 10:1a612c2e4a85 20 void I2S::lock() {
Wolfgang Betz 10:1a612c2e4a85 21 #if defined(NDEBUG) || !defined(MBED_CONF_RTOS_PRESENT)
Wolfgang Betz 10:1a612c2e4a85 22 _mutex->lock(); // intentional class level lock!
Wolfgang Betz 0:752e74bf5ef1 23 #else
Wolfgang Betz 10:1a612c2e4a85 24 osStatus ret = _mutex->lock(); // intentional class level lock!
Wolfgang Betz 10:1a612c2e4a85 25 MBED_ASSERT(ret == osOK);
Wolfgang Betz 0:752e74bf5ef1 26 #endif
Wolfgang Betz 10:1a612c2e4a85 27 }
Wolfgang Betz 10:1a612c2e4a85 28
Wolfgang Betz 10:1a612c2e4a85 29 void I2S::unlock() {
Wolfgang Betz 10:1a612c2e4a85 30 #if defined(NDEBUG) || !defined(MBED_CONF_RTOS_PRESENT)
Wolfgang Betz 10:1a612c2e4a85 31 _mutex->unlock(); // intentional class level lock!
Wolfgang Betz 10:1a612c2e4a85 32 #else
Wolfgang Betz 10:1a612c2e4a85 33 osStatus ret = _mutex->unlock(); // intentional class level lock!
Wolfgang Betz 10:1a612c2e4a85 34 MBED_ASSERT(ret == osOK);
Wolfgang Betz 10:1a612c2e4a85 35 #endif
Wolfgang Betz 10:1a612c2e4a85 36 }
Wolfgang Betz 0:752e74bf5ef1 37
Wolfgang Betz 10:1a612c2e4a85 38 I2S::I2S(PinName dpin, PinName clk, PinName wsel, PinName fdpin, PinName mck) :
Wolfgang Betz 10:1a612c2e4a85 39 _i2s(),
Wolfgang Betz 10:1a612c2e4a85 40 _irq_tx(this), _irq_rx(this),
Wolfgang Betz 10:1a612c2e4a85 41 _priority(MEDIUM),
Wolfgang Betz 10:1a612c2e4a85 42 _dbits(16),
Wolfgang Betz 10:1a612c2e4a85 43 _fbits(16),
Wolfgang Betz 10:1a612c2e4a85 44 _polarity(0),
Wolfgang Betz 10:1a612c2e4a85 45 _protocol(PHILIPS),
Wolfgang Betz 10:1a612c2e4a85 46 _mode(MASTER_TX),
Wolfgang Betz 10:1a612c2e4a85 47 _circular(false),
Wolfgang Betz 10:1a612c2e4a85 48 _hz(44100) {
Wolfgang Betz 10:1a612c2e4a85 49 lock();
Wolfgang Betz 10:1a612c2e4a85 50 /* Init instance */
Wolfgang Betz 10:1a612c2e4a85 51 i2s_init(&_i2s, dpin, clk, wsel, fdpin, mck, _mode);
Wolfgang Betz 10:1a612c2e4a85 52 acquire();
Wolfgang Betz 10:1a612c2e4a85 53 unlock();
Wolfgang Betz 10:1a612c2e4a85 54 }
Wolfgang Betz 0:752e74bf5ef1 55
Wolfgang Betz 10:1a612c2e4a85 56 int I2S::format(int dbits, int fbits, int polarity) {
Wolfgang Betz 10:1a612c2e4a85 57 lock();
Wolfgang Betz 10:1a612c2e4a85 58 if (i2s_active(&_i2s)) {
Wolfgang Betz 9:c4c2240e06d6 59 unlock();
Wolfgang Betz 10:1a612c2e4a85 60 return -1;
Wolfgang Betz 0:752e74bf5ef1 61 }
Wolfgang Betz 10:1a612c2e4a85 62 _dbits = dbits;
Wolfgang Betz 10:1a612c2e4a85 63 _fbits = fbits;
Wolfgang Betz 10:1a612c2e4a85 64 _polarity = polarity;
Wolfgang Betz 10:1a612c2e4a85 65 I2S::_owner = NULL; // Not that elegant, but works. rmeyer
Wolfgang Betz 10:1a612c2e4a85 66 acquire();
Wolfgang Betz 10:1a612c2e4a85 67 unlock();
Wolfgang Betz 10:1a612c2e4a85 68 return 0;
Wolfgang Betz 10:1a612c2e4a85 69 }
Wolfgang Betz 0:752e74bf5ef1 70
Wolfgang Betz 10:1a612c2e4a85 71 int I2S::audio_frequency(unsigned int hz) {
Wolfgang Betz 10:1a612c2e4a85 72 lock();
Wolfgang Betz 10:1a612c2e4a85 73 if (i2s_active(&_i2s)) {
Wolfgang Betz 9:c4c2240e06d6 74 unlock();
Wolfgang Betz 10:1a612c2e4a85 75 return -1;
Wolfgang Betz 0:752e74bf5ef1 76 }
Wolfgang Betz 10:1a612c2e4a85 77 _hz = hz;
Wolfgang Betz 10:1a612c2e4a85 78 I2S::_owner = NULL; // Not that elegant, but works. rmeyer
Wolfgang Betz 10:1a612c2e4a85 79 acquire();
Wolfgang Betz 10:1a612c2e4a85 80 unlock();
Wolfgang Betz 10:1a612c2e4a85 81 return 0;
Wolfgang Betz 10:1a612c2e4a85 82 }
Wolfgang Betz 0:752e74bf5ef1 83
Wolfgang Betz 10:1a612c2e4a85 84 int I2S::set_protocol(i2s_bitorder_t protocol) {
Wolfgang Betz 10:1a612c2e4a85 85 lock();
Wolfgang Betz 10:1a612c2e4a85 86 if (i2s_active(&_i2s)) {
Wolfgang Betz 9:c4c2240e06d6 87 unlock();
Wolfgang Betz 10:1a612c2e4a85 88 return -1;
Wolfgang Betz 0:752e74bf5ef1 89 }
Wolfgang Betz 10:1a612c2e4a85 90 _protocol = protocol;
Wolfgang Betz 10:1a612c2e4a85 91 I2S::_owner = NULL; // Not that elegant, but works. rmeyer
Wolfgang Betz 10:1a612c2e4a85 92 acquire();
Wolfgang Betz 10:1a612c2e4a85 93 unlock();
Wolfgang Betz 10:1a612c2e4a85 94 return 0;
Wolfgang Betz 10:1a612c2e4a85 95 }
Wolfgang Betz 0:752e74bf5ef1 96
Wolfgang Betz 10:1a612c2e4a85 97 int I2S::set_mode(i2s_mode_t mode, bool circular) {
Wolfgang Betz 10:1a612c2e4a85 98 lock();
Wolfgang Betz 10:1a612c2e4a85 99 if (i2s_active(&_i2s)) {
Wolfgang Betz 9:c4c2240e06d6 100 unlock();
Wolfgang Betz 10:1a612c2e4a85 101 return -1;
Wolfgang Betz 10:1a612c2e4a85 102 }
Wolfgang Betz 10:1a612c2e4a85 103 _mode = mode;
Wolfgang Betz 10:1a612c2e4a85 104 _circular = circular;
Wolfgang Betz 10:1a612c2e4a85 105 I2S::_owner = NULL; // Not that elegant, but works. rmeyer
Wolfgang Betz 10:1a612c2e4a85 106 acquire();
Wolfgang Betz 10:1a612c2e4a85 107 unlock();
Wolfgang Betz 10:1a612c2e4a85 108 return 0;
Wolfgang Betz 10:1a612c2e4a85 109 }
Wolfgang Betz 10:1a612c2e4a85 110
Wolfgang Betz 10:1a612c2e4a85 111 int I2S::harmonize(I2S &dev_i2s_1, I2S &dev_i2s_2) {
Wolfgang Betz 10:1a612c2e4a85 112 dev_i2s_1.lock();
Wolfgang Betz 10:1a612c2e4a85 113 if (i2s_active(&dev_i2s_1._i2s)) {
Wolfgang Betz 10:1a612c2e4a85 114 dev_i2s_1.unlock();
Wolfgang Betz 10:1a612c2e4a85 115 return -1;
Wolfgang Betz 0:752e74bf5ef1 116 }
Wolfgang Betz 9:c4c2240e06d6 117
Wolfgang Betz 10:1a612c2e4a85 118 dev_i2s_2.lock();
Wolfgang Betz 10:1a612c2e4a85 119 if (i2s_active(&dev_i2s_2._i2s)) {
Wolfgang Betz 9:c4c2240e06d6 120 dev_i2s_1.unlock();
Wolfgang Betz 10:1a612c2e4a85 121 return -1;
Wolfgang Betz 9:c4c2240e06d6 122 }
Wolfgang Betz 9:c4c2240e06d6 123
Wolfgang Betz 10:1a612c2e4a85 124 uint32_t hz1 = dev_i2s_1._hz;
Wolfgang Betz 10:1a612c2e4a85 125 uint32_t hz2 = dev_i2s_2._hz;
Wolfgang Betz 10:1a612c2e4a85 126 int8_t ret = i2s_harmonize(&dev_i2s_1._i2s, &hz1, &dev_i2s_2._i2s, &hz2);
Wolfgang Betz 0:752e74bf5ef1 127
Wolfgang Betz 10:1a612c2e4a85 128 if(ret == 0) {
Wolfgang Betz 10:1a612c2e4a85 129 dev_i2s_1.audio_frequency(hz1);
Wolfgang Betz 10:1a612c2e4a85 130 dev_i2s_2.audio_frequency(hz2);
Wolfgang Betz 9:c4c2240e06d6 131 }
Wolfgang Betz 0:752e74bf5ef1 132
Wolfgang Betz 10:1a612c2e4a85 133 dev_i2s_2.unlock();
Wolfgang Betz 10:1a612c2e4a85 134 dev_i2s_1.unlock();
Wolfgang Betz 10:1a612c2e4a85 135
Wolfgang Betz 10:1a612c2e4a85 136 return ret;
Wolfgang Betz 10:1a612c2e4a85 137 }
Wolfgang Betz 10:1a612c2e4a85 138
Wolfgang Betz 10:1a612c2e4a85 139 void I2S::abort_transfer()
Wolfgang Betz 10:1a612c2e4a85 140 {
Wolfgang Betz 10:1a612c2e4a85 141 lock();
Wolfgang Betz 10:1a612c2e4a85 142 i2s_abort_asynch(&_i2s);
Wolfgang Betz 10:1a612c2e4a85 143 #if TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 10:1a612c2e4a85 144 dequeue_transaction();
Wolfgang Betz 10:1a612c2e4a85 145 #endif
Wolfgang Betz 10:1a612c2e4a85 146 unlock();
Wolfgang Betz 10:1a612c2e4a85 147 }
Wolfgang Betz 10:1a612c2e4a85 148
Wolfgang Betz 0:752e74bf5ef1 149
Wolfgang Betz 10:1a612c2e4a85 150 void I2S::clear_transfer_buffer()
Wolfgang Betz 10:1a612c2e4a85 151 {
Wolfgang Betz 10:1a612c2e4a85 152 #if TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 10:1a612c2e4a85 153 lock();
Wolfgang Betz 10:1a612c2e4a85 154 _transaction_buffer.reset();
Wolfgang Betz 10:1a612c2e4a85 155 unlock();
Wolfgang Betz 10:1a612c2e4a85 156 #endif
Wolfgang Betz 10:1a612c2e4a85 157 }
Wolfgang Betz 0:752e74bf5ef1 158
Wolfgang Betz 10:1a612c2e4a85 159 void I2S::abort_all_transfers()
Wolfgang Betz 10:1a612c2e4a85 160 {
Wolfgang Betz 10:1a612c2e4a85 161 lock();
Wolfgang Betz 10:1a612c2e4a85 162 clear_transfer_buffer();
Wolfgang Betz 10:1a612c2e4a85 163 abort_transfer();
Wolfgang Betz 10:1a612c2e4a85 164 unlock();
Wolfgang Betz 10:1a612c2e4a85 165 }
Wolfgang Betz 10:1a612c2e4a85 166
Wolfgang Betz 10:1a612c2e4a85 167 int I2S::get_transfer_status()
Wolfgang Betz 10:1a612c2e4a85 168 {
Wolfgang Betz 10:1a612c2e4a85 169 lock();
Wolfgang Betz 10:1a612c2e4a85 170 if (i2s_active(&_i2s)) {
Wolfgang Betz 9:c4c2240e06d6 171 unlock();
Wolfgang Betz 10:1a612c2e4a85 172 return -1;
Wolfgang Betz 0:752e74bf5ef1 173 }
Wolfgang Betz 10:1a612c2e4a85 174 unlock();
Wolfgang Betz 10:1a612c2e4a85 175 return 0;
Wolfgang Betz 10:1a612c2e4a85 176 }
Wolfgang Betz 0:752e74bf5ef1 177
Wolfgang Betz 10:1a612c2e4a85 178 unsigned int I2S::get_module()
Wolfgang Betz 10:1a612c2e4a85 179 {
Wolfgang Betz 10:1a612c2e4a85 180 return i2s_get_module(&_i2s);
Wolfgang Betz 10:1a612c2e4a85 181 }
Wolfgang Betz 0:752e74bf5ef1 182
Wolfgang Betz 10:1a612c2e4a85 183 int I2S::set_dma_priority(i2s_dma_prio_t prio)
Wolfgang Betz 10:1a612c2e4a85 184 {
Wolfgang Betz 10:1a612c2e4a85 185 lock();
Wolfgang Betz 10:1a612c2e4a85 186 if (i2s_active(&_i2s)) {
Wolfgang Betz 10:1a612c2e4a85 187 unlock();
Wolfgang Betz 10:1a612c2e4a85 188 return -1;
Wolfgang Betz 10:1a612c2e4a85 189 }
Wolfgang Betz 10:1a612c2e4a85 190 _priority = prio;
Wolfgang Betz 10:1a612c2e4a85 191 unlock();
Wolfgang Betz 10:1a612c2e4a85 192 return 0;
Wolfgang Betz 10:1a612c2e4a85 193 }
Wolfgang Betz 10:1a612c2e4a85 194
Wolfgang Betz 10:1a612c2e4a85 195 int I2S::queue_transfer(const void *tx_buffer, int tx_length, void *rx_buffer, int rx_length, const event_callback_t& callback, int event)
Wolfgang Betz 10:1a612c2e4a85 196 { // betzw: MUST be called with lock held!
Wolfgang Betz 10:1a612c2e4a85 197 #if TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 10:1a612c2e4a85 198 transaction_t t;
Wolfgang Betz 10:1a612c2e4a85 199
Wolfgang Betz 10:1a612c2e4a85 200 t.tx_buffer = const_cast<void *>(tx_buffer);
Wolfgang Betz 10:1a612c2e4a85 201 t.tx_length = tx_length;
Wolfgang Betz 10:1a612c2e4a85 202 t.rx_buffer = rx_buffer;
Wolfgang Betz 10:1a612c2e4a85 203 t.rx_length = rx_length;
Wolfgang Betz 10:1a612c2e4a85 204 t.event = event;
Wolfgang Betz 10:1a612c2e4a85 205 t.callback = callback;
Wolfgang Betz 10:1a612c2e4a85 206 t.width = 16;
Wolfgang Betz 10:1a612c2e4a85 207 Transaction<I2S> transaction(this, t);
Wolfgang Betz 10:1a612c2e4a85 208 core_util_critical_section_enter();
Wolfgang Betz 10:1a612c2e4a85 209 if (_transaction_buffer.full()) {
Wolfgang Betz 9:c4c2240e06d6 210 core_util_critical_section_enter();
Wolfgang Betz 10:1a612c2e4a85 211 return -1; // the buffer is full
Wolfgang Betz 10:1a612c2e4a85 212 } else {
Wolfgang Betz 10:1a612c2e4a85 213 _transaction_buffer.push(transaction);
Wolfgang Betz 10:1a612c2e4a85 214 core_util_critical_section_exit();
Wolfgang Betz 10:1a612c2e4a85 215 // betzw - seems to be redundant - WAS: dequeue_transaction();
Wolfgang Betz 10:1a612c2e4a85 216 return 0;
Wolfgang Betz 10:1a612c2e4a85 217 }
Wolfgang Betz 9:c4c2240e06d6 218 #else
Wolfgang Betz 10:1a612c2e4a85 219 return -1;
Wolfgang Betz 9:c4c2240e06d6 220 #endif
Wolfgang Betz 10:1a612c2e4a85 221 }
Wolfgang Betz 0:752e74bf5ef1 222
Wolfgang Betz 0:752e74bf5ef1 223
Wolfgang Betz 9:c4c2240e06d6 224 // ignore the fact that there are multiple physical i2s's, and always update if it wasn't us last
Wolfgang Betz 10:1a612c2e4a85 225 void I2S::acquire() { // betzw: MUST be called with lock held!
Wolfgang Betz 10:1a612c2e4a85 226 if (_owner != this) {
Wolfgang Betz 10:1a612c2e4a85 227 i2s_format(&_i2s, _dbits, _fbits, _polarity);
Wolfgang Betz 10:1a612c2e4a85 228 i2s_audio_frequency(&_i2s, _hz);
Wolfgang Betz 10:1a612c2e4a85 229 i2s_set_protocol(&_i2s, _protocol);
Wolfgang Betz 10:1a612c2e4a85 230 i2s_set_mode(&_i2s, _mode);
Wolfgang Betz 10:1a612c2e4a85 231 _owner = this;
Wolfgang Betz 0:752e74bf5ef1 232 }
Wolfgang Betz 10:1a612c2e4a85 233 }
Wolfgang Betz 0:752e74bf5ef1 234
Wolfgang Betz 10:1a612c2e4a85 235 void I2S::start_transfer(const void *tx_buffer, int tx_length, void *rx_buffer, int rx_length,
Wolfgang Betz 10:1a612c2e4a85 236 const event_callback_t& callback, int event)
Wolfgang Betz 10:1a612c2e4a85 237 { // betzw: MUST be called with lock held!
Wolfgang Betz 10:1a612c2e4a85 238 acquire();
Wolfgang Betz 10:1a612c2e4a85 239 _callback = callback;
Wolfgang Betz 10:1a612c2e4a85 240 _irq_tx.callback(&I2S::irq_handler_asynch_tx);
Wolfgang Betz 10:1a612c2e4a85 241 _irq_rx.callback(&I2S::irq_handler_asynch_rx);
Wolfgang Betz 10:1a612c2e4a85 242 i2s_transfer(&_i2s,
Wolfgang Betz 10:1a612c2e4a85 243 const_cast<void *>(tx_buffer), tx_length, rx_buffer, rx_length,
Wolfgang Betz 10:1a612c2e4a85 244 _circular, _priority,
Wolfgang Betz 10:1a612c2e4a85 245 _irq_tx.entry(), _irq_rx.entry(),
Wolfgang Betz 10:1a612c2e4a85 246 event);
Wolfgang Betz 10:1a612c2e4a85 247 }
Wolfgang Betz 0:752e74bf5ef1 248
Wolfgang Betz 0:752e74bf5ef1 249 #if TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 0:752e74bf5ef1 250
Wolfgang Betz 10:1a612c2e4a85 251 void I2S::start_transaction(transaction_t *data)
Wolfgang Betz 10:1a612c2e4a85 252 { // betzw: MUST be called with lock held!
Wolfgang Betz 10:1a612c2e4a85 253 start_transfer(data->tx_buffer, data->tx_length, data->rx_buffer, data->rx_length, data->callback, data->event);
Wolfgang Betz 10:1a612c2e4a85 254 }
Wolfgang Betz 0:752e74bf5ef1 255
Wolfgang Betz 10:1a612c2e4a85 256 void I2S::dequeue_transaction()
Wolfgang Betz 10:1a612c2e4a85 257 {
Wolfgang Betz 10:1a612c2e4a85 258 lock();
Wolfgang Betz 10:1a612c2e4a85 259 if (!i2s_active(&_i2s)) {
Wolfgang Betz 10:1a612c2e4a85 260 Transaction<I2S> t;
Wolfgang Betz 10:1a612c2e4a85 261 if (_transaction_buffer.pop(t)) {
Wolfgang Betz 10:1a612c2e4a85 262 I2S* obj = t.get_object();
Wolfgang Betz 10:1a612c2e4a85 263 transaction_t* data = t.get_transaction();
Wolfgang Betz 10:1a612c2e4a85 264 MBED_ASSERT(obj == this); // betzw: what if 'obj' is NOT equal to 'this'?
Wolfgang Betz 10:1a612c2e4a85 265 obj->start_transaction(data);
Wolfgang Betz 9:c4c2240e06d6 266 }
Wolfgang Betz 0:752e74bf5ef1 267 }
Wolfgang Betz 10:1a612c2e4a85 268 unlock();
Wolfgang Betz 10:1a612c2e4a85 269 }
Wolfgang Betz 0:752e74bf5ef1 270
Wolfgang Betz 0:752e74bf5ef1 271 #endif
Wolfgang Betz 0:752e74bf5ef1 272
Wolfgang Betz 10:1a612c2e4a85 273 void I2S::irq_handler_asynch_rx(void)
Wolfgang Betz 10:1a612c2e4a85 274 {
Wolfgang Betz 10:1a612c2e4a85 275 int event = i2s_irq_handler_asynch(&_i2s, I2S_RX_EVENT);
Wolfgang Betz 10:1a612c2e4a85 276 if (_callback && (event & I2S_EVENT_ALL)) {
Wolfgang Betz 10:1a612c2e4a85 277 I2sBhHandler::i2s_defer_function(_callback, event & I2S_EVENT_ALL);
Wolfgang Betz 10:1a612c2e4a85 278 }
Wolfgang Betz 0:752e74bf5ef1 279 #if TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 10:1a612c2e4a85 280 if (event & I2S_EVENT_INTERNAL_TRANSFER_COMPLETE) {
Wolfgang Betz 10:1a612c2e4a85 281 I2sBhHandler::i2s_defer_function(Callback<void()>(this, &I2S::dequeue_transaction));
Wolfgang Betz 10:1a612c2e4a85 282 }
Wolfgang Betz 0:752e74bf5ef1 283 #endif
Wolfgang Betz 10:1a612c2e4a85 284 }
Davide Aliprandi 4:21603d68bcf7 285
Wolfgang Betz 10:1a612c2e4a85 286 void I2S::irq_handler_asynch_tx(void)
Wolfgang Betz 10:1a612c2e4a85 287 {
Wolfgang Betz 10:1a612c2e4a85 288 int event = i2s_irq_handler_asynch(&_i2s, I2S_TX_EVENT);
Wolfgang Betz 10:1a612c2e4a85 289 if (_callback && (event & I2S_EVENT_ALL)) {
Wolfgang Betz 10:1a612c2e4a85 290 I2sBhHandler::i2s_defer_function(_callback, event & I2S_EVENT_ALL);
Wolfgang Betz 10:1a612c2e4a85 291 }
Wolfgang Betz 9:c4c2240e06d6 292 #if TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 10:1a612c2e4a85 293 if (event & I2S_EVENT_INTERNAL_TRANSFER_COMPLETE) {
Wolfgang Betz 10:1a612c2e4a85 294 I2sBhHandler::i2s_defer_function(Callback<void()>(this, &I2S::dequeue_transaction));
Wolfgang Betz 10:1a612c2e4a85 295 }
Wolfgang Betz 9:c4c2240e06d6 296 #endif
Wolfgang Betz 10:1a612c2e4a85 297 }
Davide Aliprandi 4:21603d68bcf7 298
Wolfgang Betz 0:752e74bf5ef1 299 } // namespace mbed
Wolfgang Betz 0:752e74bf5ef1 300
Wolfgang Betz 0:752e74bf5ef1 301 #endif