Skip to content

Commit

Permalink
Add mutex locking to SPI functions for RPi
Browse files Browse the repository at this point in the history
per #172 #173

- Add mutex locking to SPI for RPi interrupt usage
- Leave rfInterrupts() rfNoInterrupts() functions for testing purposes
  • Loading branch information
TMRh20 committed Dec 19, 2015
1 parent a381194 commit 715edc5
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 2 deletions.
8 changes: 8 additions & 0 deletions utility/RPi/interrupt.c
Expand Up @@ -168,3 +168,11 @@ int attachInterrupt (int pin, int mode, void (*function)(void))
return 0 ;
}

void rfNoInterrupts(){
pthread_mutex_lock (&pinMutex) ;
}

void rfInterrupts(){
pthread_mutex_unlock (&pinMutex) ;
}

2 changes: 2 additions & 0 deletions utility/RPi/interrupt.h
Expand Up @@ -52,6 +52,8 @@ extern int piHiPri (const int pri);
*********************************************************************************
*/
extern int attachInterrupt (int pin, int mode, void (*function)(void));
extern void rfNoInterrupts();
extern void rfInterrupts();
#ifdef __cplusplus
}
#endif
11 changes: 10 additions & 1 deletion utility/RPi/spi.cpp
Expand Up @@ -8,12 +8,13 @@ SPI::SPI() {


void SPI::begin( int busNo ) {

rfNoInterrupts();
if (!bcm2835_init()){
return;
}

bcm2835_spi_begin();
rfInterrupts();

}

Expand All @@ -22,19 +23,27 @@ void SPI::end() {
}

void SPI::setBitOrder(uint8_t bit_order) {
rfNoInterrupts();
bcm2835_spi_setBitOrder(bit_order);
rfInterrupts();
}

void SPI::setDataMode(uint8_t data_mode) {
rfNoInterrupts();
bcm2835_spi_setDataMode(data_mode);
rfInterrupts();
}

void SPI::setClockDivider(uint16_t spi_speed) {
rfNoInterrupts();
bcm2835_spi_setClockDivider(spi_speed);
rfInterrupts();
}

void SPI::chipSelect(int csn_pin){
rfNoInterrupts();
bcm2835_spi_chipSelect(csn_pin);
rfInterrupts();
}

SPI::~SPI() {
Expand Down
10 changes: 9 additions & 1 deletion utility/RPi/spi.h
Expand Up @@ -12,6 +12,7 @@

#include <stdio.h>
#include "bcm2835.h"
#include "interrupt.h"

class SPI {
public:
Expand All @@ -34,16 +35,23 @@ class SPI {


uint8_t SPI::transfer(uint8_t _data) {
return bcm2835_spi_transfer(_data);
rfNoInterrupts();
uint8_t data = bcm2835_spi_transfer(_data);
rfInterrupts();
return data;
}

void SPI::transfernb(char* tbuf, char* rbuf, uint32_t len){
rfNoInterrupts();
bcm2835_spi_transfernb( tbuf, rbuf, len);
rfInterrupts();
}

void SPI::transfern(char* buf, uint32_t len)
{
rfNoInterrupts();
transfernb(buf, buf, len);
rfInterrupts();
}
/**
* \endcond
Expand Down

0 comments on commit 715edc5

Please sign in to comment.