Browse Source

#243

pull/247/head
mstroh76 6 months ago
parent
commit
5546986129
6 changed files with 115 additions and 34 deletions
  1. +1
    -1
      VERSION
  2. +2
    -2
      version.h
  3. +1
    -1
      wiringPi/wiringPiI2C.c
  4. +1
    -1
      wiringPi/wiringPiI2C.h
  5. +99
    -28
      wiringPi/wiringPiSPI.c
  6. +11
    -1
      wiringPi/wiringPiSPI.h

+ 1
- 1
VERSION View File

@@ -1 +1 @@
3.4
3.5

+ 2
- 2
version.h View File

@@ -1,3 +1,3 @@
#define VERSION "3.4"
#define VERSION "3.5"
#define VERSION_MAJOR 3 #define VERSION_MAJOR 3
#define VERSION_MINOR 4
#define VERSION_MINOR 5

+ 1
- 1
wiringPi/wiringPiI2C.c View File

@@ -1,7 +1,7 @@
/* /*
* wiringPiI2C.c: * wiringPiI2C.c:
* Simplified I2C access routines * Simplified I2C access routines
* Copyright (c) 2013 Gordon Henderson
* Copyright (c) 2013-2024 Gordon Henderson and contributors
*********************************************************************** ***********************************************************************
* This file is part of wiringPi: * This file is part of wiringPi:
* https://github.com/WiringPi/WiringPi/ * https://github.com/WiringPi/WiringPi/


+ 1
- 1
wiringPi/wiringPiI2C.h View File

@@ -1,7 +1,7 @@
/* /*
* wiringPiI2C.h: * wiringPiI2C.h:
* Simplified I2C access routines * Simplified I2C access routines
* Copyright (c) 2013 Gordon Henderson
* Copyright (c) 2013-2024 Gordon Henderson and contributors
*********************************************************************** ***********************************************************************
* This file is part of wiringPi: * This file is part of wiringPi:
* https://github.com/WiringPi/WiringPi/ * https://github.com/WiringPi/WiringPi/


+ 99
- 28
wiringPi/wiringPiSPI.c View File

@@ -24,6 +24,7 @@




#include <stdio.h> #include <stdio.h>
#include <unistd.h>
#include <stdint.h> #include <stdint.h>
#include <stdlib.h> #include <stdlib.h>
#include <fcntl.h> #include <fcntl.h>
@@ -32,9 +33,7 @@
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <asm/ioctl.h> #include <asm/ioctl.h>
#include <linux/spi/spidev.h> #include <linux/spi/spidev.h>

#include "wiringPi.h" #include "wiringPi.h"

#include "wiringPiSPI.h" #include "wiringPiSPI.h"




@@ -45,10 +44,50 @@
//static const char *spiDev1 = "/dev/spidev0.1" ; //static const char *spiDev1 = "/dev/spidev0.1" ;
static const uint8_t spiBPW = 8 ; static const uint8_t spiBPW = 8 ;
static const uint16_t spiDelay = 0 ; 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: * 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 ; struct spi_ioc_transfer spi ;


channel &= 1 ;
RETURN_ON_LIMIT_FAIL


// Mentioned in spidev.h but not used in the original kernel documentation // Mentioned in spidev.h but not used in the original kernel documentation
// test program )-: // test program )-:
@@ -86,12 +132,15 @@ int wiringPiSPIDataRW (int channel, unsigned char *data, int len)
spi.rx_buf = (unsigned long)data ; spi.rx_buf = (unsigned long)data ;
spi.len = len ; spi.len = len ;
spi.delay_usecs = spiDelay ; spi.delay_usecs = spiDelay ;
spi.speed_hz = spiSpeeds [channel] ;
spi.speed_hz = spiSpeeds [number][channel] ;
spi.bits_per_word = spiBPW ; 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: * 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 ; int fd ;
char spiDev [32] ; 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. // Set SPI parameters.


if (ioctl (fd, SPI_IOC_WR_MODE, &mode) < 0) 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) 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) 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 ; return fd ;
} }




int wiringPiSPISetupMode (int channel, int speed, int mode) {
return wiringPiSPIxSetupMode (0, channel, speed, mode);
}


/* /*
* wiringPiSPISetup: * wiringPiSPISetup:
* Open the SPI device, and set it up, etc. in the default MODE 0 * 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);
}


+ 11
- 1
wiringPi/wiringPiSPI.h View File

@@ -1,7 +1,7 @@
/* /*
* wiringPiSPI.h: * wiringPiSPI.h:
* Simplified SPI access routines * Simplified SPI access routines
* Copyright (c) 2012-2015 Gordon Henderson
* Copyright (c) 2012-2024 Gordon Henderson and contributors
*********************************************************************** ***********************************************************************
* This file is part of wiringPi: * This file is part of wiringPi:
* https://github.com/WiringPi/WiringPi/ * https://github.com/WiringPi/WiringPi/
@@ -26,10 +26,20 @@
extern "C" { extern "C" {
#endif #endif




int wiringPiSPIGetFd (int channel) ; int wiringPiSPIGetFd (int channel) ;
int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ; int wiringPiSPIDataRW (int channel, unsigned char *data, int len) ;
int wiringPiSPISetupMode (int channel, int speed, int mode) ; int wiringPiSPISetupMode (int channel, int speed, int mode) ;
int wiringPiSPISetup (int channel, int speed) ; 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 #ifdef __cplusplus
} }


Loading…
Cancel
Save