Lancaster University's (short term!) clone of mbed-src for micro:bit. This is a copy of the github branch https://github.com/lancaster-university/mbed-classic

Fork of mbed-src by mbed official

Revision:
525:c320967f86b9
Parent:
212:34d62c0b2af6
Child:
563:536c9fb088a0
--- a/common/I2C.cpp	Mon Apr 27 09:45:08 2015 +0100
+++ b/common/I2C.cpp	Tue Apr 28 11:45:12 2015 +0100
@@ -1,5 +1,5 @@
 /* mbed Microcontroller Library
- * Copyright (c) 2006-2013 ARM Limited
+ * Copyright (c) 2006-2015 ARM Limited
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,7 +21,11 @@
 
 I2C *I2C::_owner = NULL;
 
-I2C::I2C(PinName sda, PinName scl) : _i2c(), _hz(100000) {
+I2C::I2C(PinName sda, PinName scl) :
+#if DEVICE_I2C_ASYNCH
+                                     _irq(this), _usage(DMA_USAGE_NEVER),
+#endif
+                                      _i2c(), _hz(100000) {
     // The init function also set the frequency to 100000
     i2c_init(&_i2c, sda, scl);
 
@@ -86,6 +90,39 @@
     i2c_stop(&_i2c);
 }
 
+#if DEVICE_I2C_ASYNCH
+
+int I2C::transfer(int address, char *tx_buffer, int tx_length, char *rx_buffer, int rx_length, const event_callback_t& callback, int event, bool repeated)
+{
+    if (i2c_active(&_i2c)) {
+        return -1; // transaction ongoing
+    }
+    aquire();
+
+    _callback = callback;
+    int stop = (repeated) ? 0 : 1;
+    _irq.callback(&I2C::irq_handler_asynch);
+    i2c_transfer_asynch(&_i2c, (void *)tx_buffer, tx_length, (void *)rx_buffer, rx_length, address, stop, _irq.entry(), event, _usage);
+    return 0;
+}
+
+void I2C::abort_transfer(void)
+{
+    i2c_abort_asynch(&_i2c);
+}
+
+void I2C::irq_handler_asynch(void)
+{
+    int event = i2c_irq_handler_asynch(&_i2c);
+    if (_callback && event) {
+        _callback.call(event);
+    }
+
+}
+
+
+#endif
+
 } // namespace mbed
 
 #endif