mirror of https://github.com/ARMmbed/mbed-os.git
Merge pull request #4635 from deepikabhavnani/spi_acquire
_acquire() function added & removed duplication in format/freq callspull/4736/head
commit
28df3aeb87
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue