test
Fork of mbed-dev by
Diff: drivers/SPI.cpp
- Revision:
- 170:e3b6fe271b81
- Parent:
- 168:e84263d55307
- Child:
- 171:19eb464bc2be
diff -r 9672193075cf -r e3b6fe271b81 drivers/SPI.cpp --- a/drivers/SPI.cpp Thu Jul 06 15:42:05 2017 +0100 +++ b/drivers/SPI.cpp Wed Jul 19 17:31:21 2017 +0100 @@ -36,23 +36,35 @@ // 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 @@ 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(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 @@ 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);