Quentin Roche / ST_I2S

Dependents:   X_NUCLEO_CCA02M1

Fork of ST_I2S by ST

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