mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			_acquire() function added & no duplication in format/freq calls
1. Private _acquire() function is added to avoid multiple locking/unlocking 2. format and frequency functions updated to use appropriate function calls instead of a aquire()pull/4635/head
							parent
							
								
									cbfb234f07
								
							
						
					
					
						commit
						de89be35f8
					
				| 
						 | 
					@ -36,23 +36,23 @@ SPI::SPI(PinName mosi, PinName miso, PinName sclk, PinName ssel) :
 | 
				
			||||||
    // No lock needed in the constructor
 | 
					    // No lock needed in the constructor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    spi_init(&_spi, mosi, miso, sclk, ssel);
 | 
					    spi_init(&_spi, mosi, miso, sclk, ssel);
 | 
				
			||||||
    aquire();
 | 
					    _acquire();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SPI::format(int bits, int mode) {
 | 
					void SPI::format(int bits, int mode) {
 | 
				
			||||||
    lock();
 | 
					    lock();
 | 
				
			||||||
    _bits = bits;
 | 
					    _bits = bits;
 | 
				
			||||||
    _mode = mode;
 | 
					    _mode = mode;
 | 
				
			||||||
    SPI::_owner = NULL; // Not that elegant, but works. rmeyer
 | 
					    spi_format(&_spi, _bits, _mode, 0);
 | 
				
			||||||
    aquire();
 | 
					    _owner = this;
 | 
				
			||||||
    unlock();
 | 
					    unlock();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void SPI::frequency(int hz) {
 | 
					void SPI::frequency(int hz) {
 | 
				
			||||||
    lock();
 | 
					    lock();
 | 
				
			||||||
    _hz = hz;
 | 
					    _hz = hz;
 | 
				
			||||||
    SPI::_owner = NULL; // Not that elegant, but works. rmeyer
 | 
					    spi_frequency(&_spi, _hz);
 | 
				
			||||||
    aquire();
 | 
					    _owner = this;
 | 
				
			||||||
    unlock();
 | 
					    unlock();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -70,9 +70,18 @@ void SPI::aquire() {
 | 
				
			||||||
    unlock();
 | 
					    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) {
 | 
					int SPI::write(int value) {
 | 
				
			||||||
    lock();
 | 
					    lock();
 | 
				
			||||||
    aquire();
 | 
					    _acquire();
 | 
				
			||||||
    int ret = spi_master_write(&_spi, value);
 | 
					    int ret = spi_master_write(&_spi, value);
 | 
				
			||||||
    unlock();
 | 
					    unlock();
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
| 
						 | 
					@ -80,7 +89,7 @@ int SPI::write(int value) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int SPI::write(const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length) {
 | 
					int SPI::write(const char *tx_buffer, int tx_length, char *rx_buffer, int rx_length) {
 | 
				
			||||||
    lock();
 | 
					    lock();
 | 
				
			||||||
    aquire();
 | 
					    _acquire();
 | 
				
			||||||
    int ret = spi_master_block_write(&_spi, tx_buffer, tx_length, rx_buffer, rx_length);
 | 
					    int ret = spi_master_block_write(&_spi, tx_buffer, tx_length, rx_buffer, rx_length);
 | 
				
			||||||
    unlock();
 | 
					    unlock();
 | 
				
			||||||
    return ret;
 | 
					    return ret;
 | 
				
			||||||
| 
						 | 
					@ -167,7 +176,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)
 | 
					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;
 | 
					    _callback = callback;
 | 
				
			||||||
    _irq.callback(&SPI::irq_handler_asynch);
 | 
					    _irq.callback(&SPI::irq_handler_asynch);
 | 
				
			||||||
    spi_master_transfer(&_spi, tx_buffer, tx_length, rx_buffer, rx_length, bit_width, _irq.entry(), event , _usage);
 | 
					    spi_master_transfer(&_spi, tx_buffer, tx_length, rx_buffer, rx_length, bit_width, _irq.entry(), event , _usage);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -270,6 +270,12 @@ protected:
 | 
				
			||||||
    int _bits;
 | 
					    int _bits;
 | 
				
			||||||
    int _mode;
 | 
					    int _mode;
 | 
				
			||||||
    int _hz;
 | 
					    int _hz;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					private:
 | 
				
			||||||
 | 
					    /* Private acquire fucntion without locking/unlocking
 | 
				
			||||||
 | 
					     * Implemented in order to avoid duplicate locking and boost performance
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    void _acquire(void);
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
} // namespace mbed
 | 
					} // namespace mbed
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue