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 14:39:28 2016 +0100
Revision:
11:50562a5f8a93
Parent:
10:1a612c2e4a85
Child:
16:04e1abb4cca3
Correct synchronization

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 11:50562a5f8a93 120 dev_i2s_2.unlock();
Wolfgang Betz 9:c4c2240e06d6 121 dev_i2s_1.unlock();
Wolfgang Betz 10:1a612c2e4a85 122 return -1;
Wolfgang Betz 9:c4c2240e06d6 123 }
Wolfgang Betz 9:c4c2240e06d6 124
Wolfgang Betz 10:1a612c2e4a85 125 uint32_t hz1 = dev_i2s_1._hz;
Wolfgang Betz 10:1a612c2e4a85 126 uint32_t hz2 = dev_i2s_2._hz;
Wolfgang Betz 10:1a612c2e4a85 127 int8_t ret = i2s_harmonize(&dev_i2s_1._i2s, &hz1, &dev_i2s_2._i2s, &hz2);
Wolfgang Betz 0:752e74bf5ef1 128
Wolfgang Betz 10:1a612c2e4a85 129 if(ret == 0) {
Wolfgang Betz 10:1a612c2e4a85 130 dev_i2s_1.audio_frequency(hz1);
Wolfgang Betz 10:1a612c2e4a85 131 dev_i2s_2.audio_frequency(hz2);
Wolfgang Betz 9:c4c2240e06d6 132 }
Wolfgang Betz 0:752e74bf5ef1 133
Wolfgang Betz 10:1a612c2e4a85 134 dev_i2s_2.unlock();
Wolfgang Betz 10:1a612c2e4a85 135 dev_i2s_1.unlock();
Wolfgang Betz 10:1a612c2e4a85 136
Wolfgang Betz 10:1a612c2e4a85 137 return ret;
Wolfgang Betz 10:1a612c2e4a85 138 }
Wolfgang Betz 10:1a612c2e4a85 139
Wolfgang Betz 10:1a612c2e4a85 140 void I2S::abort_transfer()
Wolfgang Betz 10:1a612c2e4a85 141 {
Wolfgang Betz 10:1a612c2e4a85 142 lock();
Wolfgang Betz 10:1a612c2e4a85 143 i2s_abort_asynch(&_i2s);
Wolfgang Betz 10:1a612c2e4a85 144 #if TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 10:1a612c2e4a85 145 dequeue_transaction();
Wolfgang Betz 10:1a612c2e4a85 146 #endif
Wolfgang Betz 10:1a612c2e4a85 147 unlock();
Wolfgang Betz 10:1a612c2e4a85 148 }
Wolfgang Betz 10:1a612c2e4a85 149
Wolfgang Betz 0:752e74bf5ef1 150
Wolfgang Betz 10:1a612c2e4a85 151 void I2S::clear_transfer_buffer()
Wolfgang Betz 10:1a612c2e4a85 152 {
Wolfgang Betz 10:1a612c2e4a85 153 #if TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 10:1a612c2e4a85 154 lock();
Wolfgang Betz 10:1a612c2e4a85 155 _transaction_buffer.reset();
Wolfgang Betz 10:1a612c2e4a85 156 unlock();
Wolfgang Betz 10:1a612c2e4a85 157 #endif
Wolfgang Betz 10:1a612c2e4a85 158 }
Wolfgang Betz 0:752e74bf5ef1 159
Wolfgang Betz 10:1a612c2e4a85 160 void I2S::abort_all_transfers()
Wolfgang Betz 10:1a612c2e4a85 161 {
Wolfgang Betz 10:1a612c2e4a85 162 lock();
Wolfgang Betz 10:1a612c2e4a85 163 clear_transfer_buffer();
Wolfgang Betz 10:1a612c2e4a85 164 abort_transfer();
Wolfgang Betz 10:1a612c2e4a85 165 unlock();
Wolfgang Betz 10:1a612c2e4a85 166 }
Wolfgang Betz 10:1a612c2e4a85 167
Wolfgang Betz 10:1a612c2e4a85 168 int I2S::get_transfer_status()
Wolfgang Betz 10:1a612c2e4a85 169 {
Wolfgang Betz 10:1a612c2e4a85 170 lock();
Wolfgang Betz 10:1a612c2e4a85 171 if (i2s_active(&_i2s)) {
Wolfgang Betz 9:c4c2240e06d6 172 unlock();
Wolfgang Betz 10:1a612c2e4a85 173 return -1;
Wolfgang Betz 0:752e74bf5ef1 174 }
Wolfgang Betz 10:1a612c2e4a85 175 unlock();
Wolfgang Betz 10:1a612c2e4a85 176 return 0;
Wolfgang Betz 10:1a612c2e4a85 177 }
Wolfgang Betz 0:752e74bf5ef1 178
Wolfgang Betz 10:1a612c2e4a85 179 unsigned int I2S::get_module()
Wolfgang Betz 10:1a612c2e4a85 180 {
Wolfgang Betz 10:1a612c2e4a85 181 return i2s_get_module(&_i2s);
Wolfgang Betz 10:1a612c2e4a85 182 }
Wolfgang Betz 0:752e74bf5ef1 183
Wolfgang Betz 10:1a612c2e4a85 184 int I2S::set_dma_priority(i2s_dma_prio_t prio)
Wolfgang Betz 10:1a612c2e4a85 185 {
Wolfgang Betz 10:1a612c2e4a85 186 lock();
Wolfgang Betz 10:1a612c2e4a85 187 if (i2s_active(&_i2s)) {
Wolfgang Betz 10:1a612c2e4a85 188 unlock();
Wolfgang Betz 10:1a612c2e4a85 189 return -1;
Wolfgang Betz 10:1a612c2e4a85 190 }
Wolfgang Betz 10:1a612c2e4a85 191 _priority = prio;
Wolfgang Betz 10:1a612c2e4a85 192 unlock();
Wolfgang Betz 10:1a612c2e4a85 193 return 0;
Wolfgang Betz 10:1a612c2e4a85 194 }
Wolfgang Betz 10:1a612c2e4a85 195
Wolfgang Betz 10:1a612c2e4a85 196 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 197 { // betzw: MUST be called with lock held!
Wolfgang Betz 10:1a612c2e4a85 198 #if TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 10:1a612c2e4a85 199 transaction_t t;
Wolfgang Betz 10:1a612c2e4a85 200
Wolfgang Betz 10:1a612c2e4a85 201 t.tx_buffer = const_cast<void *>(tx_buffer);
Wolfgang Betz 10:1a612c2e4a85 202 t.tx_length = tx_length;
Wolfgang Betz 10:1a612c2e4a85 203 t.rx_buffer = rx_buffer;
Wolfgang Betz 10:1a612c2e4a85 204 t.rx_length = rx_length;
Wolfgang Betz 10:1a612c2e4a85 205 t.event = event;
Wolfgang Betz 10:1a612c2e4a85 206 t.callback = callback;
Wolfgang Betz 10:1a612c2e4a85 207 t.width = 16;
Wolfgang Betz 10:1a612c2e4a85 208 Transaction<I2S> transaction(this, t);
Wolfgang Betz 10:1a612c2e4a85 209 core_util_critical_section_enter();
Wolfgang Betz 10:1a612c2e4a85 210 if (_transaction_buffer.full()) {
Wolfgang Betz 9:c4c2240e06d6 211 core_util_critical_section_enter();
Wolfgang Betz 10:1a612c2e4a85 212 return -1; // the buffer is full
Wolfgang Betz 10:1a612c2e4a85 213 } else {
Wolfgang Betz 10:1a612c2e4a85 214 _transaction_buffer.push(transaction);
Wolfgang Betz 10:1a612c2e4a85 215 core_util_critical_section_exit();
Wolfgang Betz 10:1a612c2e4a85 216 // betzw - seems to be redundant - WAS: dequeue_transaction();
Wolfgang Betz 10:1a612c2e4a85 217 return 0;
Wolfgang Betz 10:1a612c2e4a85 218 }
Wolfgang Betz 9:c4c2240e06d6 219 #else
Wolfgang Betz 10:1a612c2e4a85 220 return -1;
Wolfgang Betz 9:c4c2240e06d6 221 #endif
Wolfgang Betz 10:1a612c2e4a85 222 }
Wolfgang Betz 0:752e74bf5ef1 223
Wolfgang Betz 0:752e74bf5ef1 224
Wolfgang Betz 9:c4c2240e06d6 225 // ignore the fact that there are multiple physical i2s's, and always update if it wasn't us last
Wolfgang Betz 10:1a612c2e4a85 226 void I2S::acquire() { // betzw: MUST be called with lock held!
Wolfgang Betz 10:1a612c2e4a85 227 if (_owner != this) {
Wolfgang Betz 10:1a612c2e4a85 228 i2s_format(&_i2s, _dbits, _fbits, _polarity);
Wolfgang Betz 10:1a612c2e4a85 229 i2s_audio_frequency(&_i2s, _hz);
Wolfgang Betz 10:1a612c2e4a85 230 i2s_set_protocol(&_i2s, _protocol);
Wolfgang Betz 10:1a612c2e4a85 231 i2s_set_mode(&_i2s, _mode);
Wolfgang Betz 10:1a612c2e4a85 232 _owner = this;
Wolfgang Betz 0:752e74bf5ef1 233 }
Wolfgang Betz 10:1a612c2e4a85 234 }
Wolfgang Betz 0:752e74bf5ef1 235
Wolfgang Betz 10:1a612c2e4a85 236 void I2S::start_transfer(const void *tx_buffer, int tx_length, void *rx_buffer, int rx_length,
Wolfgang Betz 10:1a612c2e4a85 237 const event_callback_t& callback, int event)
Wolfgang Betz 10:1a612c2e4a85 238 { // betzw: MUST be called with lock held!
Wolfgang Betz 10:1a612c2e4a85 239 acquire();
Wolfgang Betz 10:1a612c2e4a85 240 _callback = callback;
Wolfgang Betz 10:1a612c2e4a85 241 _irq_tx.callback(&I2S::irq_handler_asynch_tx);
Wolfgang Betz 10:1a612c2e4a85 242 _irq_rx.callback(&I2S::irq_handler_asynch_rx);
Wolfgang Betz 10:1a612c2e4a85 243 i2s_transfer(&_i2s,
Wolfgang Betz 10:1a612c2e4a85 244 const_cast<void *>(tx_buffer), tx_length, rx_buffer, rx_length,
Wolfgang Betz 10:1a612c2e4a85 245 _circular, _priority,
Wolfgang Betz 10:1a612c2e4a85 246 _irq_tx.entry(), _irq_rx.entry(),
Wolfgang Betz 10:1a612c2e4a85 247 event);
Wolfgang Betz 10:1a612c2e4a85 248 }
Wolfgang Betz 0:752e74bf5ef1 249
Wolfgang Betz 0:752e74bf5ef1 250 #if TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 0:752e74bf5ef1 251
Wolfgang Betz 10:1a612c2e4a85 252 void I2S::start_transaction(transaction_t *data)
Wolfgang Betz 10:1a612c2e4a85 253 { // betzw: MUST be called with lock held!
Wolfgang Betz 10:1a612c2e4a85 254 start_transfer(data->tx_buffer, data->tx_length, data->rx_buffer, data->rx_length, data->callback, data->event);
Wolfgang Betz 10:1a612c2e4a85 255 }
Wolfgang Betz 0:752e74bf5ef1 256
Wolfgang Betz 10:1a612c2e4a85 257 void I2S::dequeue_transaction()
Wolfgang Betz 10:1a612c2e4a85 258 {
Wolfgang Betz 10:1a612c2e4a85 259 lock();
Wolfgang Betz 10:1a612c2e4a85 260 if (!i2s_active(&_i2s)) {
Wolfgang Betz 10:1a612c2e4a85 261 Transaction<I2S> t;
Wolfgang Betz 10:1a612c2e4a85 262 if (_transaction_buffer.pop(t)) {
Wolfgang Betz 10:1a612c2e4a85 263 I2S* obj = t.get_object();
Wolfgang Betz 10:1a612c2e4a85 264 transaction_t* data = t.get_transaction();
Wolfgang Betz 10:1a612c2e4a85 265 MBED_ASSERT(obj == this); // betzw: what if 'obj' is NOT equal to 'this'?
Wolfgang Betz 10:1a612c2e4a85 266 obj->start_transaction(data);
Wolfgang Betz 9:c4c2240e06d6 267 }
Wolfgang Betz 0:752e74bf5ef1 268 }
Wolfgang Betz 10:1a612c2e4a85 269 unlock();
Wolfgang Betz 10:1a612c2e4a85 270 }
Wolfgang Betz 0:752e74bf5ef1 271
Wolfgang Betz 0:752e74bf5ef1 272 #endif
Wolfgang Betz 0:752e74bf5ef1 273
Wolfgang Betz 10:1a612c2e4a85 274 void I2S::irq_handler_asynch_rx(void)
Wolfgang Betz 10:1a612c2e4a85 275 {
Wolfgang Betz 10:1a612c2e4a85 276 int event = i2s_irq_handler_asynch(&_i2s, I2S_RX_EVENT);
Wolfgang Betz 10:1a612c2e4a85 277 if (_callback && (event & I2S_EVENT_ALL)) {
Wolfgang Betz 10:1a612c2e4a85 278 I2sBhHandler::i2s_defer_function(_callback, event & I2S_EVENT_ALL);
Wolfgang Betz 10:1a612c2e4a85 279 }
Wolfgang Betz 0:752e74bf5ef1 280 #if TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 10:1a612c2e4a85 281 if (event & I2S_EVENT_INTERNAL_TRANSFER_COMPLETE) {
Wolfgang Betz 10:1a612c2e4a85 282 I2sBhHandler::i2s_defer_function(Callback<void()>(this, &I2S::dequeue_transaction));
Wolfgang Betz 10:1a612c2e4a85 283 }
Wolfgang Betz 0:752e74bf5ef1 284 #endif
Wolfgang Betz 10:1a612c2e4a85 285 }
Davide Aliprandi 4:21603d68bcf7 286
Wolfgang Betz 10:1a612c2e4a85 287 void I2S::irq_handler_asynch_tx(void)
Wolfgang Betz 10:1a612c2e4a85 288 {
Wolfgang Betz 10:1a612c2e4a85 289 int event = i2s_irq_handler_asynch(&_i2s, I2S_TX_EVENT);
Wolfgang Betz 10:1a612c2e4a85 290 if (_callback && (event & I2S_EVENT_ALL)) {
Wolfgang Betz 10:1a612c2e4a85 291 I2sBhHandler::i2s_defer_function(_callback, event & I2S_EVENT_ALL);
Wolfgang Betz 10:1a612c2e4a85 292 }
Wolfgang Betz 9:c4c2240e06d6 293 #if TRANSACTION_QUEUE_SIZE_I2S
Wolfgang Betz 10:1a612c2e4a85 294 if (event & I2S_EVENT_INTERNAL_TRANSFER_COMPLETE) {
Wolfgang Betz 10:1a612c2e4a85 295 I2sBhHandler::i2s_defer_function(Callback<void()>(this, &I2S::dequeue_transaction));
Wolfgang Betz 10:1a612c2e4a85 296 }
Wolfgang Betz 9:c4c2240e06d6 297 #endif
Wolfgang Betz 10:1a612c2e4a85 298 }
Davide Aliprandi 4:21603d68bcf7 299
Wolfgang Betz 0:752e74bf5ef1 300 } // namespace mbed
Wolfgang Betz 0:752e74bf5ef1 301
Wolfgang Betz 0:752e74bf5ef1 302 #endif