Merge pull request #4635 from deepikabhavnani/spi_acquire

_acquire() function added & removed duplication in format/freq calls
pull/4736/head
Anna Bridge 2017-07-07 12:41:34 +01:00 committed by GitHub
commit 28df3aeb87
2 changed files with 35 additions and 8 deletions

View File

@ -36,23 +36,35 @@ SPI::SPI(PinName mosi, PinName miso, PinName sclk, PinName ssel) :
// No lock needed in the constructor
spi_init(&_spi, mosi, miso, sclk, ssel);
aquire();
_acquire();
}
void SPI::format(int bits, int mode) {
lock();
_bits = bits;
_mode = mode;
SPI::_owner = NULL; // Not that elegant, but works. rmeyer
aquire();
// If changing format while you are the owner than just
// update format, but if owner is changed than even frequency should be
// updated which is done by acquire.
if (_owner == this) {
spi_format(&_spi, _bits, _mode, 0);
} else {
_acquire();
}
unlock();
}
void SPI::frequency(int hz) {
lock();
_hz = hz;
SPI::_owner = NULL; // Not that elegant, but works. rmeyer
aquire();
// If changing format while you are the owner than just
// update frequency, but if owner is changed than even frequency should be
// updated which is done by acquire.
if (_owner == this) {
spi_frequency(&_spi, _hz);
} else {
_acquire();
}
unlock();
}
@ -70,9 +82,18 @@ void SPI::aquire() {
unlock();
}
// Note: Private function with no locking
void SPI::_acquire() {
if (_owner != this) {
spi_format(&_spi, _bits, _mode, 0);
spi_frequency(&_spi, _hz);
_owner = this;
}
}
int SPI::write(int value) {
lock();
aquire();
_acquire();
int ret = spi_master_write(&_spi, value);
unlock();
return ret;
@ -80,7 +101,7 @@ int SPI::write(int value) {
int SPI::write(const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length) {
lock();
aquire();
_acquire();
int ret = spi_master_block_write(&_spi, tx_buffer, tx_length, rx_buffer, rx_length);
unlock();
return ret;
@ -167,7 +188,7 @@ int SPI::queue_transfer(const void *tx_buffer, int tx_length, void *rx_buffer, i
void SPI::start_transfer(const void *tx_buffer, int tx_length, void *rx_buffer, int rx_length, unsigned char bit_width, const event_callback_t& callback, int event)
{
aquire();
_acquire();
_callback = callback;
_irq.callback(&SPI::irq_handler_asynch);
spi_master_transfer(&_spi, tx_buffer, tx_length, rx_buffer, rx_length, bit_width, _irq.entry(), event , _usage);

View File

@ -271,6 +271,12 @@ protected:
int _bits;
int _mode;
int _hz;
private:
/* Private acquire function without locking/unlocking
* Implemented in order to avoid duplicate locking and boost performance
*/
void _acquire(void);
};
} // namespace mbed