From 55469861299ae48e19e1b1d8d25f5b3b7d8ebd9a Mon Sep 17 00:00:00 2001 From: mstroh76 Date: Sun, 12 May 2024 17:33:43 +0200 Subject: [PATCH] #243 --- VERSION | 2 +- version.h | 4 +- wiringPi/wiringPiI2C.c | 2 +- wiringPi/wiringPiI2C.h | 2 +- wiringPi/wiringPiSPI.c | 127 ++++++++++++++++++++++++++++++++++++++----------- wiringPi/wiringPiSPI.h | 12 ++++- 6 files changed, 115 insertions(+), 34 deletions(-) diff --git a/VERSION b/VERSION index 2f4b607..5a95802 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.4 +3.5 diff --git a/version.h b/version.h index a018dc1..87082e3 100644 --- a/version.h +++ b/version.h @@ -1,3 +1,3 @@ -#define VERSION "3.4" +#define VERSION "3.5" #define VERSION_MAJOR 3 -#define VERSION_MINOR 4 +#define VERSION_MINOR 5 diff --git a/wiringPi/wiringPiI2C.c b/wiringPi/wiringPiI2C.c index 0bd166a..95131c3 100644 --- a/wiringPi/wiringPiI2C.c +++ b/wiringPi/wiringPiI2C.c @@ -1,7 +1,7 @@ /* * wiringPiI2C.c: * Simplified I2C access routines - * Copyright (c) 2013 Gordon Henderson + * Copyright (c) 2013-2024 Gordon Henderson and contributors *********************************************************************** * This file is part of wiringPi: * https://github.com/WiringPi/WiringPi/ diff --git a/wiringPi/wiringPiI2C.h b/wiringPi/wiringPiI2C.h index d9660b9..112257a 100644 --- a/wiringPi/wiringPiI2C.h +++ b/wiringPi/wiringPiI2C.h @@ -1,7 +1,7 @@ /* * wiringPiI2C.h: * Simplified I2C access routines - * Copyright (c) 2013 Gordon Henderson + * Copyright (c) 2013-2024 Gordon Henderson and contributors *********************************************************************** * This file is part of wiringPi: * https://github.com/WiringPi/WiringPi/ diff --git a/wiringPi/wiringPiSPI.c b/wiringPi/wiringPiSPI.c index 94e32a8..480d18c 100644 --- a/wiringPi/wiringPiSPI.c +++ b/wiringPi/wiringPiSPI.c @@ -24,6 +24,7 @@ #include +#include #include #include #include @@ -32,9 +33,7 @@ #include #include #include - #include "wiringPi.h" - #include "wiringPiSPI.h" @@ -45,10 +44,50 @@ //static const char *spiDev1 = "/dev/spidev0.1" ; static const uint8_t spiBPW = 8 ; static const uint16_t spiDelay = 0 ; +//https://datasheets.raspberrypi.com/cm4/cm4-datasheet.pdf +const uint8_t WPI_MaxSPINumbers = 7 ; +const uint8_t WPI_MaxSPIChannels = 3 ; + + +static uint32_t spiSpeeds [7][3] = +{ + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, + {0, 0, 0}, +}; + +static int spiFds [7][3] = +{ + {-1, -1, -1}, + {-1, -1, -1}, + {-1, -1, -1}, + {-1, -1, -1}, + {-1, -1, -1}, + {-1, -1, -1}, + {-1, -1, -1}, +}; + + + +int SPICheckLimits(const int number, const int channel) { + if (channel<0 || channel>=WPI_MaxSPIChannels) { + fprintf (stderr, "wiringPiSPI: Invalid SPI channel (%d, valid range 0-%d)", channel, WPI_MaxSPIChannels-1); + return EINVAL; + } + if (number<0 || number>=WPI_MaxSPINumbers) { + fprintf (stderr, "wiringPiSPI: Invalid SPI number (%d, valid range 0-%d)", number, WPI_MaxSPINumbers-1); + return EINVAL; + } + + return 0; //sucess +} -static uint32_t spiSpeeds [2] ; -static int spiFds [2] ; +#define RETURN_ON_LIMIT_FAIL int ret = SPICheckLimits(number, channel); if(ret!=0) { return ret; }; /* * wiringPiSPIGetFd: @@ -56,9 +95,16 @@ static int spiFds [2] ; ********************************************************************************* */ -int wiringPiSPIGetFd (int channel) +int wiringPiSPIxGetFd(const int number, int channel) { - return spiFds [channel & 1] ; + if (SPICheckLimits(number, channel)!=0) { + return -1; + } + return spiFds[number][channel]; +} + +int wiringPiSPIGetFd(int channel) { + return wiringPiSPIxGetFd(0, channel); } @@ -71,11 +117,11 @@ int wiringPiSPIGetFd (int channel) ********************************************************************************* */ -int wiringPiSPIDataRW (int channel, unsigned char *data, int len) +int wiringPiSPIxDataRW (const int number, const int channel, unsigned char *data, const int len) { struct spi_ioc_transfer spi ; - channel &= 1 ; + RETURN_ON_LIMIT_FAIL // Mentioned in spidev.h but not used in the original kernel documentation // test program )-: @@ -86,12 +132,15 @@ int wiringPiSPIDataRW (int channel, unsigned char *data, int len) spi.rx_buf = (unsigned long)data ; spi.len = len ; spi.delay_usecs = spiDelay ; - spi.speed_hz = spiSpeeds [channel] ; + spi.speed_hz = spiSpeeds [number][channel] ; spi.bits_per_word = spiBPW ; - return ioctl (spiFds [channel], SPI_IOC_MESSAGE(1), &spi) ; + return ioctl (spiFds[number][channel], SPI_IOC_MESSAGE(1), &spi) ; } +int wiringPiSPIDataRW (int channel, unsigned char *data, int len) { + return wiringPiSPIxDataRW(0, channel, data, len); +} /* * wiringPiSPISetupMode: @@ -99,46 +148,68 @@ int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ********************************************************************************* */ -int wiringPiSPISetupMode (int channel, int speed, int mode) + +int wiringPiSPIxSetupMode(const int number, const int channel, const int speed, const int mode) { int fd ; char spiDev [32] ; - mode &= 3 ; // Mode is 0, 1, 2 or 3 - -// Channel can be anything - lets hope for the best -// channel &= 1 ; // Channel is 0 or 1 - - snprintf (spiDev, 31, "/dev/spidev0.%d", channel) ; + RETURN_ON_LIMIT_FAIL + if (mode<0 || mode>3) { // Mode is 0, 1, 2 or 3 original + fprintf (stderr, "wiringPiSPI: Invalid mode (%d, valid range 0-%d)", mode, 3); + return EINVAL; + } - if ((fd = open (spiDev, O_RDWR)) < 0) - return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device: %s\n", strerror (errno)) ; - - spiSpeeds [channel] = speed ; - spiFds [channel] = fd ; + snprintf (spiDev, 31, "/dev/spidev%d.%d", number, channel) ; + if ((fd = open (spiDev, O_RDWR)) < 0) { + return wiringPiFailure (WPI_ALMOST, "Unable to open SPI device %s: %s\n", spiDev, strerror (errno)) ; + } + spiSpeeds [number][channel] = speed ; + spiFds [number][channel] = fd ; // Set SPI parameters. if (ioctl (fd, SPI_IOC_WR_MODE, &mode) < 0) - return wiringPiFailure (WPI_ALMOST, "SPI Mode Change failure: %s\n", strerror (errno)) ; + return wiringPiFailure (WPI_ALMOST, "SPI mode change failure: %s\n", strerror (errno)) ; if (ioctl (fd, SPI_IOC_WR_BITS_PER_WORD, &spiBPW) < 0) - return wiringPiFailure (WPI_ALMOST, "SPI BPW Change failure: %s\n", strerror (errno)) ; + return wiringPiFailure (WPI_ALMOST, "SPI BPW change failure: %s\n", strerror (errno)) ; if (ioctl (fd, SPI_IOC_WR_MAX_SPEED_HZ, &speed) < 0) - return wiringPiFailure (WPI_ALMOST, "SPI Speed Change failure: %s\n", strerror (errno)) ; + return wiringPiFailure (WPI_ALMOST, "SPI speed change failure: %s\n", strerror (errno)) ; return fd ; } +int wiringPiSPISetupMode (int channel, int speed, int mode) { + return wiringPiSPIxSetupMode (0, channel, speed, mode); +} + + /* * wiringPiSPISetup: * Open the SPI device, and set it up, etc. in the default MODE 0 ********************************************************************************* */ -int wiringPiSPISetup (int channel, int speed) -{ - return wiringPiSPISetupMode (channel, speed, 0) ; +int wiringPiSPISetup (int channel, int speed) { + return wiringPiSPIxSetupMode(0, channel, speed, 0) ; +} + + +int wiringPiSPIxClose (const int number, const int channel) { + + RETURN_ON_LIMIT_FAIL + if (spiFds[number][channel]>0) { + ret = close(spiFds[number][channel]); + } + spiSpeeds [number][channel] = 0 ; + spiFds [number][channel] = -1 ; + return ret; } + +int wiringPiSPIClose (const int channel) { + return wiringPiSPIxClose (0, channel); +} + diff --git a/wiringPi/wiringPiSPI.h b/wiringPi/wiringPiSPI.h index 44a8cfc..cd1bc03 100644 --- a/wiringPi/wiringPiSPI.h +++ b/wiringPi/wiringPiSPI.h @@ -1,7 +1,7 @@ /* * wiringPiSPI.h: * Simplified SPI access routines - * Copyright (c) 2012-2015 Gordon Henderson + * Copyright (c) 2012-2024 Gordon Henderson and contributors *********************************************************************** * This file is part of wiringPi: * https://github.com/WiringPi/WiringPi/ @@ -26,10 +26,20 @@ extern "C" { #endif + + int wiringPiSPIGetFd (int channel) ; int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ; int wiringPiSPISetupMode (int channel, int speed, int mode) ; int wiringPiSPISetup (int channel, int speed) ; +int wiringPiSPIClose (const int channel); //Interface 3.5 + +//Interface 3.5 +int wiringPiSPIxGetFd (const int number, const int channel) ; +int wiringPiSPIxDataRW (const int number, const int channel, unsigned char *data, const int len) ; +int wiringPiSPIxSetupMode (const int number, const int channel, const int speed, const int mode) ; +int wiringPiSPIxSetup (const int number, const int channel, const int speed) ; +int wiringPiSPIxClose (const int number, const int channel); #ifdef __cplusplus }