Added mutex for multiple SPI devices on the same SPI bus
Fork of cc3000_hostdriver_mbedsocket by
Revision 47:cc9a2501e29f, committed 2014-10-16
- Comitter:
- vpcola
- Date:
- Thu Oct 16 13:39:08 2014 +0000
- Parent:
- 46:ca8c234997c0
- Commit message:
- Added mutex if used in rtos
Changed in this revision
--- a/cc3000.cpp Sun Nov 10 21:41:44 2013 +0100
+++ b/cc3000.cpp Thu Oct 16 13:39:08 2014 +0000
@@ -47,9 +47,9 @@
static uint8_t cc3000_prefix[] = {'T', 'T', 'T'};
cc3000 *cc3000::_inst;
-cc3000::cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi)
+cc3000::cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, Mutex & mutex)
: _event(_simple_link, _hci, _spi, *this), _socket(_simple_link, _hci, _event),
- _spi(cc3000_irq, cc3000_en, cc3000_cs, cc3000_spi, _event, _simple_link), _hci(_spi),
+ _spi(cc3000_irq, cc3000_en, cc3000_cs, cc3000_spi, mutex, _event, _simple_link), _hci(_spi),
_nvmem(_hci, _event, _simple_link), _netapp(_simple_link, _nvmem, _hci, _event),
_wlan(_simple_link, _event, _spi, _hci) {
_simple_link.set_tx_complete_signal(1);
@@ -61,10 +61,10 @@
}
#if (CC3000_ETH_COMPAT == 1)
-cc3000::cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, const char *ssid,
+cc3000::cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, Mutex & mutex, const char *ssid,
const char *phrase, Security sec, bool smart_config)
: _event(_simple_link, _hci, _spi, *this), _socket(_simple_link, _hci, _event),
- _spi(cc3000_irq, cc3000_en, cc3000_cs, cc3000_spi, _event, _simple_link), _hci(_spi),
+ _spi(cc3000_irq, cc3000_en, cc3000_cs, cc3000_spi, mutex, _event, _simple_link), _hci(_spi),
_nvmem(_hci, _event, _simple_link), _netapp(_simple_link, _nvmem, _hci, _event),
_wlan(_simple_link, _event, _spi, _hci), _sec(sec), _smart_config(smart_config) {
_simple_link.set_tx_complete_signal(1);
--- a/cc3000.h Sun Nov 10 21:41:44 2013 +0100
+++ b/cc3000.h Thu Oct 16 13:39:08 2014 +0000
@@ -42,6 +42,7 @@
#define CC3000_H
#include "mbed.h"
+#include "rtos.h"
#include "cc3000_common.h"
#include "cc3000_spi.h"
#include "cc3000_simplelink.h"
@@ -1081,7 +1082,7 @@
* \param simple_link Reference to the simple link object.
* \return none
*/
- cc3000_spi(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, cc3000_event &event, cc3000_simple_link &simple_link);
+ cc3000_spi(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, Mutex & mutex, cc3000_event &event, cc3000_simple_link &simple_link);
/**
* \brief Dtor
* \param none
@@ -1175,6 +1176,7 @@
DigitalOut _wlan_en;
DigitalOut _wlan_cs;
SPI _wlan_spi;
+ Mutex & _mutex;
cc3000_event &_event;
cc3000_simple_link &_simple_link;
bool _process_irq;
@@ -1555,7 +1557,7 @@
* \param cc3000_cs Chip select pin
* \param cc3000_spi SPI interface
*/
- cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi);
+ cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, Mutex & mutex);
/**
* \brief Dtor.
*/
@@ -1706,7 +1708,7 @@
* \param sec Security of the AP
* \param smart_config Smart config selection
*/
- cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, const char *ssid, const char *phrase, Security sec, bool smart_config);
+ cc3000(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, Mutex & mutex, const char *ssid, const char *phrase, Security sec, bool smart_config);
/**
* \brief Disconnect wlan device.
* \param none
--- a/cc3000_spi.cpp Sun Nov 10 21:41:44 2013 +0100
+++ b/cc3000_spi.cpp Thu Oct 16 13:39:08 2014 +0000
@@ -43,8 +43,8 @@
namespace mbed_cc3000 {
-cc3000_spi::cc3000_spi(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, cc3000_event &event, cc3000_simple_link &simple_link)
- : _wlan_irq(cc3000_irq), _wlan_en(cc3000_en), _wlan_cs(cc3000_cs), _wlan_spi(cc3000_spi), _event(event), _simple_link(simple_link) {
+cc3000_spi::cc3000_spi(PinName cc3000_irq, PinName cc3000_en, PinName cc3000_cs, SPI cc3000_spi, Mutex & mutex, cc3000_event &event, cc3000_simple_link &simple_link)
+ : _wlan_irq(cc3000_irq), _wlan_en(cc3000_en), _wlan_cs(cc3000_cs), _wlan_spi(cc3000_spi), _mutex(mutex), _event(event), _simple_link(simple_link) {
_wlan_spi.format(8,1);
_wlan_spi.frequency(12000000);
@@ -90,6 +90,7 @@
}
uint32_t cc3000_spi::first_write(uint8_t *buffer, uint16_t length) {
+ _mutex.lock();
_wlan_cs = 0;
wait_us(50);
@@ -99,7 +100,8 @@
write_synchronous(buffer + 4, length - 4);
_spi_info.spi_state = eSPI_STATE_IDLE;
_wlan_cs = 1;
-
+ _mutex.unlock();
+
return 0;
}
@@ -144,6 +146,7 @@
_spi_info.tx_packet_length = length;
// Assert the CS line and wait until the IRQ line is active, then initialize the write operation
+ _mutex.lock();
_wlan_cs = 0;
wlan_irq_enable();
@@ -224,6 +227,7 @@
} else if (_spi_info.spi_state == eSPI_STATE_IDLE) {
_spi_info.spi_state = eSPI_STATE_READ_IRQ;
/* IRQ line goes low - acknowledge it */
+ _mutex.lock();
_wlan_cs = 0;
read_synchronous(_simple_link.get_received_buffer(), 10);
_spi_info.spi_state = eSPI_STATE_READ_EOT;
@@ -234,6 +238,7 @@
// Trigger Rx processing
wlan_irq_disable();
_wlan_cs = 1;
+ _mutex.unlock();
// The magic number resides at the end of the TX/RX buffer (1 byte after the allocated size)
// If the magic number is overwitten - buffer overrun occurred - we will be stuck here forever!
uint8_t *received_buffer = _simple_link.get_received_buffer();
@@ -248,6 +253,7 @@
write_synchronous(_simple_link.get_transmit_buffer(), _spi_info.tx_packet_length);
_spi_info.spi_state = eSPI_STATE_IDLE;
_wlan_cs = 1;
+ _mutex.unlock();
}
}
}
