This commit is contained in:
joan 2015-03-02 22:38:55 +00:00
parent adb8c8dbf6
commit 68553c1ed6
5 changed files with 504 additions and 192 deletions

View File

@ -118,6 +118,8 @@ Pi_Hasher_t *Pi_Hasher(int gpio, Pi_Hasher_CB_t callback, int timeout)
gpioSetMode(gpio, PI_INPUT); gpioSetMode(gpio, PI_INPUT);
gpioSetAlertFuncEx(gpio, _cb, hasher); gpioSetAlertFuncEx(gpio, _cb, hasher);
return hasher;
} }
void Pi_Hasher_cancel(Pi_Hasher_t *hasher) void Pi_Hasher_cancel(Pi_Hasher_t *hasher)
@ -127,6 +129,8 @@ void Pi_Hasher_cancel(Pi_Hasher_t *hasher)
gpioSetAlertFunc(hasher->gpio, 0); gpioSetAlertFunc(hasher->gpio, 0);
free(hasher); free(hasher);
hasher = NULL;
} }
} }

View File

@ -26,7 +26,7 @@ For more information, please refer to <http://unlicense.org/>
*/ */
/* /*
This version is for pigpio version 30+ This version is for pigpio version 31+
*/ */
#include <stdio.h> #include <stdio.h>
@ -494,6 +494,8 @@ static errInfo_t errInfo[]=
{PI_BAD_DATABITS , "serial data bits not 1-32"}, {PI_BAD_DATABITS , "serial data bits not 1-32"},
{PI_MSG_TOOBIG , "socket/pipe message too big"}, {PI_MSG_TOOBIG , "socket/pipe message too big"},
{PI_BAD_MALLOC_MODE , "bad memory allocation mode"}, {PI_BAD_MALLOC_MODE , "bad memory allocation mode"},
{PI_TOO_MANY_PARTS , "too many I2C transaction parts"},
{PI_BAD_I2C_PART , "a combined I2C transaction failed"},
}; };

206
pigpio.3
View File

@ -2062,6 +2062,42 @@ No flags are currently defined. This parameter should be set to zero.
Returns a handle (>=0) if OK, otherwise PI_BAD_I2C_BUS, PI_BAD_I2C_ADDR, Returns a handle (>=0) if OK, otherwise PI_BAD_I2C_BUS, PI_BAD_I2C_ADDR,
PI_BAD_FLAGS, PI_NO_HANDLE, or PI_I2C_OPEN_FAILED. PI_BAD_FLAGS, PI_NO_HANDLE, or PI_I2C_OPEN_FAILED.
.br
.br
For the smbus commands the low level transactions are shown at the end
of the function description. The following abbreviations are used.
.br
.br
.EX
S (1 bit) : Start bit
.br
P (1 bit) : Stop bit
.br
Rd/Wr (1 bit) : Read/Write bit. Rd equals 1, Wr equals 0.
.br
A, NA (1 bit) : Accept and not accept bit.
.br
.br
.br
Addr (7 bits): I2C 7 bit address.
.br
Comm (8 bits): Command byte, a data byte which often selects a register.
.br
Data (8 bits): A data byte.
.br
Count (8 bits): A data byte containing the length of a block operation.
.br
.br
[..]: Data sent by the device.
.br
.EE
.IP "\fBint i2cClose(unsigned handle)\fP" .IP "\fBint i2cClose(unsigned handle)\fP"
.IP "" 4 .IP "" 4
This closes the I2C device associated with the handle. This closes the I2C device associated with the handle.
@ -2157,6 +2193,12 @@ PI_I2C_WRITE_FAILED.
.br .br
Quick command. smbus 2.0 5.5.1 Quick command. smbus 2.0 5.5.1
.EX
S Addr Rd/Wr [A] P
.br
.EE
.IP "\fBint i2cWriteByte(unsigned handle, unsigned bVal)\fP" .IP "\fBint i2cWriteByte(unsigned handle, unsigned bVal)\fP"
.IP "" 4 .IP "" 4
This sends a single byte to the device associated with handle. This sends a single byte to the device associated with handle.
@ -2184,6 +2226,12 @@ PI_I2C_WRITE_FAILED.
.br .br
Send byte. smbus 2.0 5.5.2 Send byte. smbus 2.0 5.5.2
.EX
S Addr Wr [A] Data [A] P
.br
.EE
.IP "\fBint i2cReadByte(unsigned handle)\fP" .IP "\fBint i2cReadByte(unsigned handle)\fP"
.IP "" 4 .IP "" 4
This reads a single byte from the device associated with handle. This reads a single byte from the device associated with handle.
@ -2209,6 +2257,12 @@ or PI_I2C_READ_FAILED.
.br .br
Receive byte. smbus 2.0 5.5.3 Receive byte. smbus 2.0 5.5.3
.EX
S Addr Rd [A] [Data] NA P
.br
.EE
.IP "\fBint i2cWriteByteData(unsigned handle, unsigned i2cReg, unsigned bVal)\fP" .IP "\fBint i2cWriteByteData(unsigned handle, unsigned i2cReg, unsigned bVal)\fP"
.IP "" 4 .IP "" 4
This writes a single byte to the specified register of the device This writes a single byte to the specified register of the device
@ -2239,6 +2293,12 @@ PI_I2C_WRITE_FAILED.
.br .br
Write byte. smbus 2.0 5.5.4 Write byte. smbus 2.0 5.5.4
.EX
S Addr Wr [A] Comm [A] Data [A] P
.br
.EE
.IP "\fBint i2cWriteWordData(unsigned handle, unsigned i2cReg, unsigned wVal)\fP" .IP "\fBint i2cWriteWordData(unsigned handle, unsigned i2cReg, unsigned wVal)\fP"
.IP "" 4 .IP "" 4
This writes a single 16 bit word to the specified register of the device This writes a single 16 bit word to the specified register of the device
@ -2269,6 +2329,12 @@ PI_I2C_WRITE_FAILED.
.br .br
Write word. smbus 2.0 5.5.4 Write word. smbus 2.0 5.5.4
.EX
S Addr Wr [A] Comm [A] DataLow [A] DataHigh [A] P
.br
.EE
.IP "\fBint i2cReadByteData(unsigned handle, unsigned i2cReg)\fP" .IP "\fBint i2cReadByteData(unsigned handle, unsigned i2cReg)\fP"
.IP "" 4 .IP "" 4
This reads a single byte from the specified register of the device This reads a single byte from the specified register of the device
@ -2297,6 +2363,12 @@ PI_BAD_PARAM, or PI_I2C_READ_FAILED.
.br .br
Read byte. smbus 2.0 5.5.5 Read byte. smbus 2.0 5.5.5
.EX
S Addr Wr [A] Comm [A] S Addr Rd [A] [Data] NA P
.br
.EE
.IP "\fBint i2cReadWordData(unsigned handle, unsigned i2cReg)\fP" .IP "\fBint i2cReadWordData(unsigned handle, unsigned i2cReg)\fP"
.IP "" 4 .IP "" 4
This reads a single 16 bit word from the specified register of the device This reads a single 16 bit word from the specified register of the device
@ -2325,6 +2397,12 @@ PI_BAD_PARAM, or PI_I2C_READ_FAILED.
.br .br
Read word. smbus 2.0 5.5.5 Read word. smbus 2.0 5.5.5
.EX
S Addr Wr [A] Comm [A] S Addr Rd [A] [DataLow] A [DataHigh] NA P
.br
.EE
.IP "\fBint i2cProcessCall(unsigned handle, unsigned i2cReg, unsigned wVal)\fP" .IP "\fBint i2cProcessCall(unsigned handle, unsigned i2cReg, unsigned wVal)\fP"
.IP "" 4 .IP "" 4
This writes 16 bits of data to the specified register of the device This writes 16 bits of data to the specified register of the device
@ -2355,6 +2433,14 @@ PI_BAD_PARAM, or PI_I2C_READ_FAILED.
.br .br
Process call. smbus 2.0 5.5.6 Process call. smbus 2.0 5.5.6
.EX
S Addr Wr [A] Comm [A] DataLow [A] DataHigh [A]
.br
S Addr Rd [A] [DataLow] A [DataHigh] NA P
.br
.EE
.IP "\fBint i2cWriteBlockData(unsigned handle, unsigned i2cReg, char *buf, unsigned count)\fP" .IP "\fBint i2cWriteBlockData(unsigned handle, unsigned i2cReg, char *buf, unsigned count)\fP"
.IP "" 4 .IP "" 4
This writes up to 32 bytes to the specified register of the device This writes up to 32 bytes to the specified register of the device
@ -2387,6 +2473,12 @@ PI_I2C_WRITE_FAILED.
.br .br
Block write. smbus 2.0 5.5.7 Block write. smbus 2.0 5.5.7
.EX
S Addr Wr [A] Comm [A] Count [A] Data [A] Data [A] ... [A] Data [A] P
.br
.EE
.IP "\fBint i2cReadBlockData(unsigned handle, unsigned i2cReg, char *buf)\fP" .IP "\fBint i2cReadBlockData(unsigned handle, unsigned i2cReg, char *buf)\fP"
.IP "" 4 .IP "" 4
This reads a block of up to 32 bytes from the specified register of This reads a block of up to 32 bytes from the specified register of
@ -2422,6 +2514,14 @@ PI_BAD_PARAM, or PI_I2C_READ_FAILED.
.br .br
Block read. smbus 2.0 5.5.7 Block read. smbus 2.0 5.5.7
.EX
S Addr Wr [A] Comm [A]
.br
S Addr Rd [A] [Count] A [Data] A [Data] A ... A [Data] NA P
.br
.EE
.IP "\fBint i2cBlockProcessCall(unsigned handle, unsigned i2cReg, char *buf, unsigned count)\fP" .IP "\fBint i2cBlockProcessCall(unsigned handle, unsigned i2cReg, char *buf, unsigned count)\fP"
.IP "" 4 .IP "" 4
This writes data bytes to the specified register of the device This writes data bytes to the specified register of the device
@ -2462,6 +2562,14 @@ bytes sent/received must be 32 or less.
.br .br
Block write-block read. smbus 2.0 5.5.8 Block write-block read. smbus 2.0 5.5.8
.EX
S Addr Wr [A] Comm [A] Count [A] Data [A] ...
.br
S Addr Rd [A] [Count] A [Data] ... A P
.br
.EE
.IP "\fBint i2cReadI2CBlockData(unsigned handle, unsigned i2cReg, char *buf, unsigned count)\fP" .IP "\fBint i2cReadI2CBlockData(unsigned handle, unsigned i2cReg, char *buf, unsigned count)\fP"
.IP "" 4 .IP "" 4
This reads count bytes from the specified register of the device This reads count bytes from the specified register of the device
@ -2489,6 +2597,18 @@ i2cReg: 0-255, the register to read
Returns the number of bytes read (>0) if OK, otherwise PI_BAD_HANDLE, Returns the number of bytes read (>0) if OK, otherwise PI_BAD_HANDLE,
PI_BAD_PARAM, or PI_I2C_READ_FAILED. PI_BAD_PARAM, or PI_I2C_READ_FAILED.
.br
.br
.EX
S Addr Wr [A] Comm [A]
.br
S Addr Rd [A] [Data] A [Data] A ... A [Data] NA P
.br
.EE
.IP "\fBint i2cWriteI2CBlockData(unsigned handle, unsigned i2cReg, char *buf, unsigned count)\fP" .IP "\fBint i2cWriteI2CBlockData(unsigned handle, unsigned i2cReg, char *buf, unsigned count)\fP"
.IP "" 4 .IP "" 4
This writes 1 to 32 bytes to the specified register of the device This writes 1 to 32 bytes to the specified register of the device
@ -2516,6 +2636,16 @@ i2cReg: 0-255, the register to write
Returns 0 if OK, otherwise PI_BAD_HANDLE, PI_BAD_PARAM, or Returns 0 if OK, otherwise PI_BAD_HANDLE, PI_BAD_PARAM, or
PI_I2C_WRITE_FAILED. PI_I2C_WRITE_FAILED.
.br
.br
.EX
S Addr Wr [A] Comm [A] Data [A] Data [A] ... [A] Data [A] P
.br
.EE
.IP "\fBint spiOpen(unsigned spiChan, unsigned spiBaud, unsigned spiFlags)\fP" .IP "\fBint spiOpen(unsigned spiChan, unsigned spiBaud, unsigned spiFlags)\fP"
.IP "" 4 .IP "" 4
This function returns a handle for the SPI device on the channel. This function returns a handle for the SPI device on the channel.
@ -5697,10 +5827,6 @@ The number of bits stored in a buffer.
.br .br
.IP "\fBnumBytes\fP" 0 .IP "\fBnumBytes\fP" 0
.br
.br
The number of bytes used to store characters in a string. Depending The number of bytes used to store characters in a string. Depending
on the number of bits per character there may be 1, 2, or 4 bytes on the number of bits per character there may be 1, 2, or 4 bytes
per character. per character.
@ -5710,21 +5836,20 @@ per character.
.br .br
.IP "\fBnumPar\fP: 0-10" 0 .IP "\fBnumPar\fP: 0-10" 0
.br
.br
The number of parameters passed to a script. The number of parameters passed to a script.
.br .br
.br .br
.IP "\fBnumParts\fP" 0
The number of parts in a combined I2C transaction.
.br
.br
.IP "\fBnumPulses\fP" 0 .IP "\fBnumPulses\fP" 0
.br
.br
The number of pulses to be added to a waveform. The number of pulses to be added to a waveform.
.br .br
@ -5732,10 +5857,6 @@ The number of pulses to be added to a waveform.
.br .br
.IP "\fBoffset\fP" 0 .IP "\fBoffset\fP" 0
.br
.br
The associated data starts this number of microseconds from the start of The associated data starts this number of microseconds from the start of
tghe waveform. tghe waveform.
@ -5744,21 +5865,44 @@ tghe waveform.
.br .br
.IP "\fB*param\fP" 0 .IP "\fB*param\fP" 0
.br
.br
An array of script parameters. An array of script parameters.
.br .br
.br .br
.IP "\fB*parts\fP" 0
An array of the part transactions which make up a combined I2C transaction.
.br
.br
.IP "\fBpi_i2c_msg_t\fP" 0
.EX
typedef struct
.br
{
.br
uint16_t addr; // slave address
.br
uint16_t flags;
.br
uint16_t len; // msg length
.br
uint8_t *buf; // pointer to msg data
.br
} pi_i2c_msg_t;
.br
.EE
.br
.br
.IP "\fBport\fP: 1024-32000" 0 .IP "\fBport\fP: 1024-32000" 0
.br
.br
The port used to bind to the pigpio socket. Defaults to 8888. The port used to bind to the pigpio socket. Defaults to 8888.
.br .br
@ -5766,10 +5910,6 @@ The port used to bind to the pigpio socket. Defaults to 8888.
.br .br
.IP "\fBpos\fP" 0 .IP "\fBpos\fP" 0
.br
.br
The position of an item. The position of an item.
.br .br
@ -5777,10 +5917,6 @@ The position of an item.
.br .br
.IP "\fBprimaryChannel\fP: 0-14" 0 .IP "\fBprimaryChannel\fP: 0-14" 0
.br
.br
The DMA channel used to time the sampling of gpios and to time servo and The DMA channel used to time the sampling of gpios and to time servo and
PWM pulses. PWM pulses.
@ -6902,6 +7038,12 @@ A 16-bit word value.
#define PI_MSG_TOOBIG -103 // socket/pipe message too big #define PI_MSG_TOOBIG -103 // socket/pipe message too big
.br .br
#define PI_BAD_MALLOC_MODE -104 // bad memory allocation mode #define PI_BAD_MALLOC_MODE -104 // bad memory allocation mode
.br
#define PI_TOO_MANY_PARTS -105 // too many I2C transaction parts
.br
#define PI_BAD_I2C_PART -106 // a combined I2C transaction failed
.br
.br .br
.br .br

353
pigpio.c
View File

@ -25,7 +25,9 @@ OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <http://unlicense.org/> For more information, please refer to <http://unlicense.org/>
*/ */
/* pigpio version 30 */ /* pigpio version 31 */
/* include ------------------------------------------------------- */
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@ -178,7 +180,7 @@ bit 0 READ_LAST_NOT_SET_ERROR
6 C3 System Timer Compare 3 6 C3 System Timer Compare 3
*/ */
/* --------------------------------------------------------------- */ /* define -------------------------------------------------------- */
#define THOUSAND 1000 #define THOUSAND 1000
#define MILLION 1000000 #define MILLION 1000000
@ -283,14 +285,8 @@ bit 0 READ_LAST_NOT_SET_ERROR
} \ } \
while (0) while (0)
static volatile uint32_t piModel = 1;
#define PI_PERI_BUS 0x7E000000 #define PI_PERI_BUS 0x7E000000
static volatile uint32_t pi_peri_phys = 0x20000000;
static volatile uint32_t pi_dram_bus = 0x40000000;
static volatile uint32_t pi_mem_flag = 0x00000004;
#define AUX_BASE (pi_peri_phys + 0x00215000) #define AUX_BASE (pi_peri_phys + 0x00215000)
#define CLK_BASE (pi_peri_phys + 0x00101000) #define CLK_BASE (pi_peri_phys + 0x00101000)
#define DMA_BASE (pi_peri_phys + 0x00007000) #define DMA_BASE (pi_peri_phys + 0x00007000)
@ -720,6 +716,7 @@ static volatile uint32_t pi_mem_flag = 0x00000004;
#define SRX_BUF_SIZE 8192 #define SRX_BUF_SIZE 8192
#define PI_I2C_SLAVE 0x0703 #define PI_I2C_SLAVE 0x0703
#define PI_I2C_RDWR 0x0707
#define PI_I2C_SMBUS 0x0720 #define PI_I2C_SMBUS 0x0720
#define PI_I2C_SMBUS_READ 1 #define PI_I2C_SMBUS_READ 1
@ -758,7 +755,31 @@ static volatile uint32_t pi_mem_flag = 0x00000004;
#define MB_UNLOCK_MEMORY_TAG 0x3000E #define MB_UNLOCK_MEMORY_TAG 0x3000E
#define MB_RELEASE_MEMORY_TAG 0x3000F #define MB_RELEASE_MEMORY_TAG 0x3000F
/* --------------------------------------------------------------- */ #define PI_SCRIPT_FREE 0
#define PI_SCRIPT_RESERVED 1
#define PI_SCRIPT_IN_USE 2
#define PI_SCRIPT_DYING 3
#define PI_SCRIPT_HALT 0
#define PI_SCRIPT_RUN 1
#define PI_SCRIPT_DELETE 2
#define PI_SCRIPT_STACK_SIZE 256
#define PI_SPI_FLAGS_CHANNEL(x) ((x&7)<<29)
#define PI_SPI_FLAGS_GET_CHANNEL(x) (((x)>>29)&7)
#define PI_SPI_FLAGS_GET_BITLEN(x) (((x)>>16)&63)
#define PI_SPI_FLAGS_GET_RX_LSB(x) (((x)>>15)&1)
#define PI_SPI_FLAGS_GET_TX_LSB(x) (((x)>>14)&1)
#define PI_SPI_FLAGS_GET_3WREN(x) (((x)>>10)&15)
#define PI_SPI_FLAGS_GET_3WIRE(x) (((x)>>9)&1)
#define PI_SPI_FLAGS_GET_AUX_SPI(x) (((x)>>8)&1)
#define PI_SPI_FLAGS_GET_RESVD(x) (((x)>>5)&7)
#define PI_SPI_FLAGS_GET_CSPOLS(x) (((x)>>2)&7)
#define PI_SPI_FLAGS_GET_MODE(x) ((x)&3)
/* typedef ------------------------------------------------------- */
typedef void (*callbk_t) (); typedef void (*callbk_t) ();
@ -830,17 +851,6 @@ typedef struct
pthread_t pthId; pthread_t pthId;
} gpioTimer_t; } gpioTimer_t;
#define PI_SCRIPT_FREE 0
#define PI_SCRIPT_RESERVED 1
#define PI_SCRIPT_IN_USE 2
#define PI_SCRIPT_DYING 3
#define PI_SCRIPT_HALT 0
#define PI_SCRIPT_RUN 1
#define PI_SCRIPT_DELETE 2
#define PI_SCRIPT_STACK_SIZE 256
typedef struct typedef struct
{ {
unsigned id; unsigned id;
@ -892,19 +902,6 @@ typedef struct
uint32_t flags; uint32_t flags;
} spiInfo_t; } spiInfo_t;
#define PI_SPI_FLAGS_CHANNEL(x) ((x&7)<<29)
#define PI_SPI_FLAGS_GET_CHANNEL(x) (((x)>>29)&7)
#define PI_SPI_FLAGS_GET_BITLEN(x) (((x)>>16)&63)
#define PI_SPI_FLAGS_GET_RX_LSB(x) (((x)>>15)&1)
#define PI_SPI_FLAGS_GET_TX_LSB(x) (((x)>>14)&1)
#define PI_SPI_FLAGS_GET_3WREN(x) (((x)>>10)&15)
#define PI_SPI_FLAGS_GET_3WIRE(x) (((x)>>9)&1)
#define PI_SPI_FLAGS_GET_AUX_SPI(x) (((x)>>8)&1)
#define PI_SPI_FLAGS_GET_RESVD(x) (((x)>>5)&7)
#define PI_SPI_FLAGS_GET_CSPOLS(x) (((x)>>2)&7)
#define PI_SPI_FLAGS_GET_MODE(x) ((x)&3)
typedef struct typedef struct
{ {
uint32_t startTick; uint32_t startTick;
@ -983,6 +980,12 @@ struct my_smbus_ioctl_data
union my_smbus_data *data; union my_smbus_data *data;
}; };
typedef struct
{
pi_i2c_msg_t *msgs; /* pointers to pi_i2c_msgs */
uint32_t nmsgs; /* number of pi_i2c_msgs */
} my_i2c_rdwr_ioctl_data_t;
typedef struct typedef struct
{ {
unsigned div; unsigned div;
@ -998,34 +1001,27 @@ typedef struct
unsigned size; /* in bytes */ unsigned size; /* in bytes */
} DMAMem_t; } DMAMem_t;
/* --------------------------------------------------------------- */ /* global -------------------------------------------------------- */
/* initialise once then preserve */ /* initialise once then preserve */
static volatile gpioCfg_t gpioCfg = static volatile uint32_t piModel = 1;
{ static volatile uint32_t pi_peri_phys = 0x20000000;
PI_DEFAULT_BUFFER_MILLIS, static volatile uint32_t pi_dram_bus = 0x40000000;
PI_DEFAULT_CLK_MICROS, static volatile uint32_t pi_mem_flag = 0x0C;
PI_DEFAULT_CLK_PERIPHERAL,
PI_DEFAULT_DMA_PRIMARY_CHANNEL,
PI_DEFAULT_DMA_SECONDARY_CHANNEL,
PI_DEFAULT_SOCKET_PORT,
PI_DEFAULT_IF_FLAGS,
0,
0,
PI_DEFAULT_MEM_ALLOC_MODE,
};
static volatile gpioStats_t gpioStats; static int libInitialised = 0;
static int gpioMaskSet = 0;
/* initialise every gpioInitialise */ /* initialise every gpioInitialise */
static struct timespec libStarted; static struct timespec libStarted;
static int waveClockInited = 0; static int waveClockInited = 0;
/* initialse if not libInitialised */ static volatile gpioStats_t gpioStats;
static int gpioMaskSet = 0;
/* initialise if not libInitialised */
static uint64_t gpioMask; static uint64_t gpioMask;
@ -1058,8 +1054,7 @@ static volatile uint32_t notifyBits = 0;
static volatile uint32_t scriptBits = 0; static volatile uint32_t scriptBits = 0;
static volatile int DMAstarted = 0; static volatile int DMAstarted = 0;
static volatile int terminating = 0;
static int libInitialised = 0;
static int pthAlertRunning = 0; static int pthAlertRunning = 0;
static int pthFifoRunning = 0; static int pthFifoRunning = 0;
@ -1085,19 +1080,7 @@ static gpioTimer_t gpioTimer [PI_MAX_TIMER+1];
static int pwmFreq[PWM_FREQS]; static int pwmFreq[PWM_FREQS];
/* no initialisation required */ /* reset after gpioTerminated */
static unsigned bufferBlocks; /* number of blocks in buffer */
static unsigned bufferCycles; /* number of cycles */
static pthread_attr_t pthAttr;
static pthread_t pthAlert;
static pthread_t pthFifo;
static pthread_t pthSocket;
static gpioSample_t gpioSample[DATUMS];
static gpioReport_t gpioReport[DATUMS];
/* resources which must be released on gpioTerminate */ /* resources which must be released on gpioTerminate */
@ -1133,7 +1116,70 @@ static volatile uint32_t * systReg = MAP_FAILED;
static volatile uint32_t * dmaIn = MAP_FAILED; static volatile uint32_t * dmaIn = MAP_FAILED;
static volatile uint32_t * dmaOut = MAP_FAILED; static volatile uint32_t * dmaOut = MAP_FAILED;
/* constant data */ static uint32_t hw_clk_freq[3];
static uint32_t hw_pwm_freq[2];
static uint32_t hw_pwm_duty[2];
static uint32_t hw_pwm_real_range[2];
static volatile gpioCfg_t gpioCfg =
{
PI_DEFAULT_BUFFER_MILLIS,
PI_DEFAULT_CLK_MICROS,
PI_DEFAULT_CLK_PERIPHERAL,
PI_DEFAULT_DMA_PRIMARY_CHANNEL,
PI_DEFAULT_DMA_SECONDARY_CHANNEL,
PI_DEFAULT_SOCKET_PORT,
PI_DEFAULT_IF_FLAGS,
DBG_MIN_LEVEL,
0,
PI_DEFAULT_MEM_ALLOC_MODE,
};
/* no initialisation required */
static unsigned bufferBlocks; /* number of blocks in buffer */
static unsigned bufferCycles; /* number of cycles */
static pthread_t pthAlert;
static pthread_t pthFifo;
static pthread_t pthSocket;
static gpioSample_t gpioSample[DATUMS];
static gpioReport_t gpioReport[DATUMS];
static uint32_t spi_dummy;
static unsigned old_mode_ce0;
static unsigned old_mode_ce1;
static unsigned old_mode_sclk;
static unsigned old_mode_miso;
static unsigned old_mode_mosi;
static uint32_t old_spi_cs;
static uint32_t old_spi_clk;
static unsigned old_mode_ace0;
static unsigned old_mode_ace1;
static unsigned old_mode_ace2;
static unsigned old_mode_asclk;
static unsigned old_mode_amiso;
static unsigned old_mode_amosi;
static uint32_t old_spi_cntl0;
static uint32_t old_spi_cntl1;
/* const --------------------------------------------------------- */
static const uint8_t clkDef[PI_MAX_GPIO + 1] =
{
/* 0 1 2 3 4 5 6 7 8 9 */
/* 0 */ 0x00, 0x00, 0x00, 0x00, 0x84, 0x94, 0xA4, 0x00, 0x00, 0x00,
/* 1 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 2 */ 0x82, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 3 */ 0x00, 0x00, 0x84, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 4 */ 0x00, 0x00, 0x94, 0xA4, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 5 */ 0x00, 0x00, 0x00, 0x00,
};
/* /*
7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
@ -1156,17 +1202,15 @@ CC: 00 CLK0, 01 CLK1, 10 CLK2
gpio44 GPCLK1 ALT0 Compute module only (reserved for system use) gpio44 GPCLK1 ALT0 Compute module only (reserved for system use)
*/ */
uint32_t hw_clk_freq[3]; static const uint8_t PWMDef[PI_MAX_GPIO + 1] =
uint8_t clkDef[PI_MAX_GPIO + 1] =
{ {
/* 0 1 2 3 4 5 6 7 8 9 */ /* 0 1 2 3 4 5 6 7 8 9 */
/* 0 */ 0x00, 0x00, 0x00, 0x00, 0x84, 0x94, 0xA4, 0x00, 0x00, 0x00, /* 0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 1 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 1 */ 0x00, 0x00, 0x84, 0x94, 0x00, 0x00, 0x00, 0x00, 0x82, 0x92,
/* 2 */ 0x82, 0x92, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, /* 2 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 3 */ 0x00, 0x00, 0x84, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, /* 3 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 4 */ 0x00, 0x00, 0x94, 0xA4, 0x94, 0x00, 0x00, 0x00, 0x00, 0x00, /* 4 */ 0x84, 0x94, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x00,
/* 5 */ 0x00, 0x00, 0x00, 0x00, /* 5 */ 0x00, 0x00, 0x85, 0x95,
}; };
/* /*
@ -1188,21 +1232,6 @@ uint8_t clkDef[PI_MAX_GPIO + 1] =
gpio53 pwm1 ALT1 gpio53 pwm1 ALT1
*/ */
uint32_t hw_pwm_freq[2];
uint32_t hw_pwm_duty[2];
uint32_t hw_pwm_real_range[2];
uint8_t PWMDef[PI_MAX_GPIO + 1] =
{
/* 0 1 2 3 4 5 6 7 8 9 */
/* 0 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 1 */ 0x00, 0x00, 0x84, 0x94, 0x00, 0x00, 0x00, 0x00, 0x82, 0x92,
/* 2 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 3 */ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
/* 4 */ 0x84, 0x94, 0x00, 0x00, 0x00, 0x94, 0x00, 0x00, 0x00, 0x00,
/* 5 */ 0x00, 0x00, 0x85, 0x95,
};
static const clkCfg_t clkCfg[]= static const clkCfg_t clkCfg[]=
{ {
/* valid servo */ /* valid servo */
@ -1227,18 +1256,18 @@ static const uint16_t pwmRealRange[PWM_FREQS]=
{ 25, 50, 100, 125, 200, 250, 400, 500, 625, { 25, 50, 100, 125, 200, 250, 400, 500, 625,
800, 1000, 1250, 2000, 2500, 4000, 5000, 10000, 20000}; 800, 1000, 1250, 2000, 2500, 4000, 5000, 10000, 20000};
/* ======================================================================= */ /* prototype ----------------------------------------------------- */
/* Internal prototypes.
*/
static void intNotifyBits(void); static void intNotifyBits(void);
static void intScriptBits(void); static void intScriptBits(void);
static int gpioNotifyOpenInBand(int fd); static int gpioNotifyOpenInBand(int fd);
static void initHWClk static void initHWClk
(int clkCtl, int clkDiv, int clkSrc, int divI, int divF, int MASH); (int clkCtl, int clkDiv, int clkSrc, int divI, int divF, int MASH);
static void initDMAgo(volatile uint32_t *dmaAddr, uint32_t cbAddr);
static void initDMAgo(volatile uint32_t *dmaAddr, uint32_t cbAddr);
/* ======================================================================= */ /* ======================================================================= */
@ -1444,7 +1473,7 @@ static void flushMemory(void)
static void waitForDMAstarted(void) static void waitForDMAstarted(void)
{ {
while (!DMAstarted) while ((!DMAstarted) && (!terminating))
{ {
if (piModel == 1) myGpioDelay(1000); if (piModel == 1) myGpioDelay(1000);
else flushMemory(); else flushMemory();
@ -1531,7 +1560,7 @@ static int myDoCommand(uint32_t *p, unsigned bufSize, char *buf)
case PI_CMD_CF2: case PI_CMD_CF2:
/* a couple of extra precautions for untruested code */ /* a couple of extra precautions for untrusted code */
if (p[2] > bufSize) p[2] = bufSize; if (p[2] > bufSize) p[2] = bufSize;
res = gpioCustom2(p[1], buf, p[3], buf, p[2]); res = gpioCustom2(p[1], buf, p[3], buf, p[2]);
if (res > p[2]) res = p[2]; if (res > p[2]) res = p[2];
@ -2110,7 +2139,7 @@ static void myGpioSetServo(unsigned gpio, int oldVal, int newVal)
https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface https://github.com/raspberrypi/firmware/wiki/Mailbox-property-interface
*/ */
int mbCreate(void) static int mbCreate(void)
{ {
/* <0 error */ /* <0 error */
@ -2119,14 +2148,14 @@ int mbCreate(void)
return mknod(MB_DEV, S_IFCHR|0600, makedev(MB_DEV_MAJOR, 0)); return mknod(MB_DEV, S_IFCHR|0600, makedev(MB_DEV_MAJOR, 0));
} }
int mbOpen(void) static int mbOpen(void)
{ {
/* <0 error */ /* <0 error */
return open(MB_DEV, 0); return open(MB_DEV, 0);
} }
void mbClose(int fd) static void mbClose(int fd)
{ {
close(fd); close(fd);
} }
@ -2136,7 +2165,7 @@ static int mbProperty(int fd, void *buf)
return ioctl(fd, MB_IOCTL, buf); return ioctl(fd, MB_IOCTL, buf);
} }
unsigned mbAllocateMemory( static unsigned mbAllocateMemory(
int fd, unsigned size, unsigned align, unsigned flags) int fd, unsigned size, unsigned align, unsigned flags)
{ {
int i=1; int i=1;
@ -2157,7 +2186,7 @@ unsigned mbAllocateMemory(
return p[5]; return p[5];
} }
unsigned mbLockMemory(int fd, unsigned handle) static unsigned mbLockMemory(int fd, unsigned handle)
{ {
int i=1; int i=1;
unsigned p[32]; unsigned p[32];
@ -2175,7 +2204,7 @@ unsigned mbLockMemory(int fd, unsigned handle)
return p[5]; return p[5];
} }
unsigned mbUnlockMemory(int fd, unsigned handle) static unsigned mbUnlockMemory(int fd, unsigned handle)
{ {
int i=1; int i=1;
unsigned p[32]; unsigned p[32];
@ -2193,7 +2222,7 @@ unsigned mbUnlockMemory(int fd, unsigned handle)
return p[5]; return p[5];
} }
unsigned mbReleaseMemory(int fd, unsigned handle) static unsigned mbReleaseMemory(int fd, unsigned handle)
{ {
int i=1; int i=1;
unsigned p[32]; unsigned p[32];
@ -2211,7 +2240,7 @@ unsigned mbReleaseMemory(int fd, unsigned handle)
return p[5]; return p[5];
} }
void *mbMapMem(unsigned base, unsigned size) static void *mbMapMem(unsigned base, unsigned size)
{ {
void *mem = MAP_FAILED; void *mem = MAP_FAILED;
@ -2220,13 +2249,13 @@ void *mbMapMem(unsigned base, unsigned size)
return mem; return mem;
} }
int mbUnmapMem(void *addr, unsigned size) static int mbUnmapMem(void *addr, unsigned size)
{ {
/* 0 okay, -1 fail */ /* 0 okay, -1 fail */
return munmap(addr, size); return munmap(addr, size);
} }
void mbDMAFree(DMAMem_t *DMAMemP) static void mbDMAFree(DMAMem_t *DMAMemP)
{ {
if (DMAMemP->handle) if (DMAMemP->handle)
{ {
@ -2237,7 +2266,7 @@ void mbDMAFree(DMAMem_t *DMAMemP)
} }
} }
int mbDMAAlloc(DMAMem_t *DMAMemP, unsigned size, uint32_t pi_mem_flag) static int mbDMAAlloc(DMAMem_t *DMAMemP, unsigned size, uint32_t pi_mem_flag)
{ {
DMAMemP->size = size; DMAMemP->size = size;
@ -3388,31 +3417,51 @@ int i2cClose(unsigned handle)
return 0; return 0;
} }
int i2cTransaction(unsigned handle, pi_i2c_msg_t *parts, unsigned numParts)
{
int retval, fd;
my_i2c_rdwr_ioctl_data_t rdwr;
DBG(DBG_USER, "handle=%d", handle);
CHECK_INITED;
if (handle >= PI_I2C_SLOTS)
SOFT_ERROR(PI_BAD_HANDLE, "bad handle (%d)", handle);
if (i2cInfo[handle].state != PI_I2C_OPENED)
SOFT_ERROR(PI_BAD_HANDLE, "bad handle (%d)", handle);
if (parts == NULL)
SOFT_ERROR(PI_BAD_POINTER, "null parts");
if (numParts > PI_I2C_RDRW_IOCTL_MAX_MSGS)
SOFT_ERROR(PI_TOO_MANY_PARTS, "too many parts (%d)", numParts);
fd = open(PI_I2C_COMBINED, O_RDWR);
if (fd >= 0)
{
write(fd, "1", 1);
close(fd);
}
rdwr.msgs = parts;
rdwr.nmsgs = numParts;
retval = ioctl(i2cInfo[handle].fd, PI_I2C_RDWR, &rdwr);
DBG(0, "i2cTransaction retval=%d", retval);
if (retval >= 0) return retval;
else return PI_BAD_I2C_PART;
}
/* ======================================================================= */ /* ======================================================================= */
/*SPI */ /*SPI */
static uint32_t spi_dummy; /* only used to prevent warning */
static unsigned old_mode_ce0;
static unsigned old_mode_ce1;
static unsigned old_mode_sclk;
static unsigned old_mode_miso;
static unsigned old_mode_mosi;
static uint32_t old_spi_cs;
static uint32_t old_spi_clk;
static unsigned old_mode_ace0;
static unsigned old_mode_ace1;
static unsigned old_mode_ace2;
static unsigned old_mode_asclk;
static unsigned old_mode_amiso;
static unsigned old_mode_amosi;
static uint32_t old_spi_cntl0;
static uint32_t old_spi_cntl1;
static uint32_t _spiTXBits(char *buf, int pos, int bitlen, int msbf) static uint32_t _spiTXBits(char *buf, int pos, int bitlen, int msbf)
{ {
uint32_t bits=0; uint32_t bits=0;
@ -3767,7 +3816,7 @@ static void spiInit(uint32_t flags)
} }
} }
void spiTerm(uint32_t flags) static void spiTerm(uint32_t flags)
{ {
int resvd; int resvd;
@ -6343,6 +6392,7 @@ static void initClearGlobals(void)
libInitialised = 0; libInitialised = 0;
DMAstarted = 0; DMAstarted = 0;
terminating = 0;
pthAlertRunning = 0; pthAlertRunning = 0;
pthFifoRunning = 0; pthFifoRunning = 0;
@ -6598,19 +6648,22 @@ static void initReleaseResources(void)
int initInitialise(void) int initInitialise(void)
{ {
int i; int rev, i;
struct sockaddr_in server; struct sockaddr_in server;
char * portStr; char * portStr;
unsigned port; unsigned port;
struct sched_param param; struct sched_param param;
pthread_attr_t pthAttr;
DBG(DBG_STARTUP, "");
if (libInitialised) return PIGPIO_VERSION;
waveClockInited = 0; waveClockInited = 0;
clock_gettime(CLOCK_REALTIME, &libStarted); clock_gettime(CLOCK_REALTIME, &libStarted);
DBG(DBG_STARTUP, ""); rev = gpioHardwareRevision();
if (libInitialised) return PIGPIO_VERSION;
initClearGlobals(); initClearGlobals();
@ -6623,12 +6676,10 @@ int initInitialise(void)
if (!gpioMaskSet) if (!gpioMaskSet)
{ {
i = gpioHardwareRevision(); if (rev == 0) gpioMask = PI_DEFAULT_UPDATE_MASK_R0;
else if (rev == 17) gpioMask = PI_DEFAULT_UPDATE_MASK_COMPUTE;
if (i == 0) gpioMask = PI_DEFAULT_UPDATE_MASK_R0; else if (rev < 4) gpioMask = PI_DEFAULT_UPDATE_MASK_R1;
else if (i == 17) gpioMask = PI_DEFAULT_UPDATE_MASK_COMPUTE; else if (rev < 16) gpioMask = PI_DEFAULT_UPDATE_MASK_R2;
else if (i < 4) gpioMask = PI_DEFAULT_UPDATE_MASK_R1;
else if (i < 16) gpioMask = PI_DEFAULT_UPDATE_MASK_R2;
else gpioMask = PI_DEFAULT_UPDATE_MASK_R3; else gpioMask = PI_DEFAULT_UPDATE_MASK_R3;
gpioMaskSet = 1; gpioMaskSet = 1;
@ -6937,10 +6988,14 @@ void gpioTerminate(void)
DBG(DBG_USER, ""); DBG(DBG_USER, "");
gpioMaskSet = 0; terminating = 1;
if (libInitialised) if (libInitialised)
{ {
libInitialised = 0;
gpioMaskSet = 0;
/* reset DMA */ /* reset DMA */
DMAstarted = 0; DMAstarted = 0;
@ -6948,8 +7003,6 @@ void gpioTerminate(void)
dmaIn[DMA_CS] = DMA_CHANNEL_RESET; dmaIn[DMA_CS] = DMA_CHANNEL_RESET;
dmaOut[DMA_CS] = DMA_CHANNEL_RESET; dmaOut[DMA_CS] = DMA_CHANNEL_RESET;
libInitialised = 0;
if (gpioCfg.showStats) if (gpioCfg.showStats)
{ {
fprintf(stderr, fprintf(stderr,
@ -8573,6 +8626,8 @@ static int intGpioSetTimerFunc(unsigned id,
int user, int user,
void *userdata) void *userdata)
{ {
pthread_attr_t pthAttr;
DBG(DBG_INTERNAL, "id=%d millis=%d function=%08X user=%d userdata=%08X", DBG(DBG_INTERNAL, "id=%d millis=%d function=%08X user=%d userdata=%08X",
id, millis, (uint32_t)f, user, (uint32_t)userdata); id, millis, (uint32_t)f, user, (uint32_t)userdata);
@ -8587,6 +8642,14 @@ static int intGpioSetTimerFunc(unsigned id,
if (!gpioTimer[id].running) if (!gpioTimer[id].running)
{ {
if (pthread_attr_init(&pthAttr))
SOFT_ERROR(PI_TIMER_FAILED,
"pthread_attr_init failed (%m)");
if (pthread_attr_setstacksize(&pthAttr, STACK_SIZE))
SOFT_ERROR(PI_TIMER_FAILED,
"pthread_attr_setstacksize failed (%m)");
if (pthread_create( if (pthread_create(
&gpioTimer[id].pthId, &pthAttr, pthTimerTick, &gpioTimer[id])) &gpioTimer[id].pthId, &pthAttr, pthTimerTick, &gpioTimer[id]))
SOFT_ERROR(PI_TIMER_FAILED, SOFT_ERROR(PI_TIMER_FAILED,
@ -9377,7 +9440,7 @@ unsigned gpioHardwareRevision(void)
chars = 4; chars = 4;
pi_peri_phys = 0x20000000; pi_peri_phys = 0x20000000;
pi_dram_bus = 0x40000000; pi_dram_bus = 0x40000000;
pi_mem_flag = 0x0c; pi_mem_flag = 0x0C;
} }
else if (strstr (buf, "ARMv7") != NULL) else if (strstr (buf, "ARMv7") != NULL)
{ {

121
pigpio.h
View File

@ -31,7 +31,7 @@ For more information, please refer to <http://unlicense.org/>
#include <stdint.h> #include <stdint.h>
#include <pthread.h> #include <pthread.h>
#define PIGPIO_VERSION 30 #define PIGPIO_VERSION 31
/*TEXT /*TEXT
@ -319,6 +319,8 @@ OVERVIEW*/
#define PI_LOCKFILE "/var/run/pigpio.pid" #define PI_LOCKFILE "/var/run/pigpio.pid"
#define PI_I2C_COMBINED "/sys/module/i2c_bcm2708/parameters/combined"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -399,6 +401,29 @@ uint32_t next;
uint32_t pad[2]; uint32_t pad[2];
} rawCbs_t; } rawCbs_t;
/* max pi_i2c_msg_t per transaction */
#define PI_I2C_RDRW_IOCTL_MAX_MSGS 42
/* flags for pi_i2c_msg_t */
#define PI_I2C_M_WR 0x0000 /* write data */
#define PI_I2C_M_RD 0x0001 /* read data */
#define PI_I2C_M_TEN 0x0010 /* ten bit chip address */
#define PI_I2C_M_RECV_LEN 0x0400 /* length will be first received byte */
#define PI_I2C_M_NO_RD_ACK 0x0800 /* if I2C_FUNC_PROTOCOL_MANGLING */
#define PI_I2C_M_IGNORE_NAK 0x1000 /* if I2C_FUNC_PROTOCOL_MANGLING */
#define PI_I2C_M_REV_DIR_ADDR 0x2000 /* if I2C_FUNC_PROTOCOL_MANGLING */
#define PI_I2C_M_NOSTART 0x4000 /* if I2C_FUNC_PROTOCOL_MANGLING */
typedef struct
{
uint16_t addr; /* slave address */
uint16_t flags;
uint16_t len; /* msg length */
uint8_t *buf; /* pointer to msg data */
} pi_i2c_msg_t;
typedef void (*gpioAlertFunc_t) (int gpio, typedef void (*gpioAlertFunc_t) (int gpio,
int level, int level,
uint32_t tick); uint32_t tick);
@ -1699,7 +1724,6 @@ user_gpio: 0-31, previously opened with [*gpioSerialReadOpen*]
Returns 0 if OK, otherwise PI_BAD_USER_GPIO, or PI_NOT_SERIAL_GPIO. Returns 0 if OK, otherwise PI_BAD_USER_GPIO, or PI_NOT_SERIAL_GPIO.
D*/ D*/
/*F*/ /*F*/
int i2cOpen(unsigned i2cBus, unsigned i2cAddr, unsigned i2cFlags); int i2cOpen(unsigned i2cBus, unsigned i2cAddr, unsigned i2cFlags);
/*D /*D
@ -1715,6 +1739,22 @@ No flags are currently defined. This parameter should be set to zero.
Returns a handle (>=0) if OK, otherwise PI_BAD_I2C_BUS, PI_BAD_I2C_ADDR, Returns a handle (>=0) if OK, otherwise PI_BAD_I2C_BUS, PI_BAD_I2C_ADDR,
PI_BAD_FLAGS, PI_NO_HANDLE, or PI_I2C_OPEN_FAILED. PI_BAD_FLAGS, PI_NO_HANDLE, or PI_I2C_OPEN_FAILED.
For the smbus commands the low level transactions are shown at the end
of the function description. The following abbreviations are used.
. .
S (1 bit) : Start bit
P (1 bit) : Stop bit
Rd/Wr (1 bit) : Read/Write bit. Rd equals 1, Wr equals 0.
A, NA (1 bit) : Accept and not accept bit.
Addr (7 bits): I2C 7 bit address.
Comm (8 bits): Command byte, a data byte which often selects a register.
Data (8 bits): A data byte.
Count (8 bits): A data byte containing the length of a block operation.
[..]: Data sent by the device.
. .
D*/ D*/
@ -1762,6 +1802,10 @@ Returns 0 if OK, otherwise PI_BAD_HANDLE, PI_BAD_PARAM, or
PI_I2C_WRITE_FAILED. PI_I2C_WRITE_FAILED.
D*/ D*/
int i2cTransaction(unsigned handle, pi_i2c_msg_t *parts, unsigned numParts);
/*
This performs a combined I2C transction made up of count parts.
*/
/*F*/ /*F*/
int i2cWriteQuick(unsigned handle, unsigned bit); int i2cWriteQuick(unsigned handle, unsigned bit);
@ -1778,6 +1822,9 @@ Returns 0 if OK, otherwise PI_BAD_HANDLE, PI_BAD_PARAM, or
PI_I2C_WRITE_FAILED. PI_I2C_WRITE_FAILED.
Quick command. smbus 2.0 5.5.1 Quick command. smbus 2.0 5.5.1
. .
S Addr Rd/Wr [A] P
. .
D*/ D*/
@ -1795,6 +1842,9 @@ Returns 0 if OK, otherwise PI_BAD_HANDLE, PI_BAD_PARAM, or
PI_I2C_WRITE_FAILED. PI_I2C_WRITE_FAILED.
Send byte. smbus 2.0 5.5.2 Send byte. smbus 2.0 5.5.2
. .
S Addr Wr [A] Data [A] P
. .
D*/ D*/
@ -1811,6 +1861,9 @@ Returns the byte read (>=0) if OK, otherwise PI_BAD_HANDLE,
or PI_I2C_READ_FAILED. or PI_I2C_READ_FAILED.
Receive byte. smbus 2.0 5.5.3 Receive byte. smbus 2.0 5.5.3
. .
S Addr Rd [A] [Data] NA P
. .
D*/ D*/
@ -1830,6 +1883,9 @@ Returns 0 if OK, otherwise PI_BAD_HANDLE, PI_BAD_PARAM, or
PI_I2C_WRITE_FAILED. PI_I2C_WRITE_FAILED.
Write byte. smbus 2.0 5.5.4 Write byte. smbus 2.0 5.5.4
. .
S Addr Wr [A] Comm [A] Data [A] P
. .
D*/ D*/
@ -1849,6 +1905,9 @@ Returns 0 if OK, otherwise PI_BAD_HANDLE, PI_BAD_PARAM, or
PI_I2C_WRITE_FAILED. PI_I2C_WRITE_FAILED.
Write word. smbus 2.0 5.5.4 Write word. smbus 2.0 5.5.4
. .
S Addr Wr [A] Comm [A] DataLow [A] DataHigh [A] P
. .
D*/ D*/
@ -1867,6 +1926,9 @@ Returns the byte read (>=0) if OK, otherwise PI_BAD_HANDLE,
PI_BAD_PARAM, or PI_I2C_READ_FAILED. PI_BAD_PARAM, or PI_I2C_READ_FAILED.
Read byte. smbus 2.0 5.5.5 Read byte. smbus 2.0 5.5.5
. .
S Addr Wr [A] Comm [A] S Addr Rd [A] [Data] NA P
. .
D*/ D*/
@ -1885,6 +1947,9 @@ Returns the word read (>=0) if OK, otherwise PI_BAD_HANDLE,
PI_BAD_PARAM, or PI_I2C_READ_FAILED. PI_BAD_PARAM, or PI_I2C_READ_FAILED.
Read word. smbus 2.0 5.5.5 Read word. smbus 2.0 5.5.5
. .
S Addr Wr [A] Comm [A] S Addr Rd [A] [DataLow] A [DataHigh] NA P
. .
D*/ D*/
@ -1904,6 +1969,10 @@ Returns the word read (>=0) if OK, otherwise PI_BAD_HANDLE,
PI_BAD_PARAM, or PI_I2C_READ_FAILED. PI_BAD_PARAM, or PI_I2C_READ_FAILED.
Process call. smbus 2.0 5.5.6 Process call. smbus 2.0 5.5.6
. .
S Addr Wr [A] Comm [A] DataLow [A] DataHigh [A]
S Addr Rd [A] [DataLow] A [DataHigh] NA P
. .
D*/ D*/
@ -1925,6 +1994,9 @@ Returns 0 if OK, otherwise PI_BAD_HANDLE, PI_BAD_PARAM, or
PI_I2C_WRITE_FAILED. PI_I2C_WRITE_FAILED.
Block write. smbus 2.0 5.5.7 Block write. smbus 2.0 5.5.7
. .
S Addr Wr [A] Comm [A] Count [A] Data [A] Data [A] ... [A] Data [A] P
. .
D*/ D*/
@ -1946,6 +2018,10 @@ Returns the number of bytes read (>=0) if OK, otherwise PI_BAD_HANDLE,
PI_BAD_PARAM, or PI_I2C_READ_FAILED. PI_BAD_PARAM, or PI_I2C_READ_FAILED.
Block read. smbus 2.0 5.5.7 Block read. smbus 2.0 5.5.7
. .
S Addr Wr [A] Comm [A]
S Addr Rd [A] [Count] A [Data] A [Data] A ... A [Data] NA P
. .
D*/ D*/
@ -1972,6 +2048,10 @@ sent and a minimum of 1 byte may be received. The total number of
bytes sent/received must be 32 or less. bytes sent/received must be 32 or less.
Block write-block read. smbus 2.0 5.5.8 Block write-block read. smbus 2.0 5.5.8
. .
S Addr Wr [A] Comm [A] Count [A] Data [A] ...
S Addr Rd [A] [Count] A [Data] ... A P
. .
D*/ D*/
@ -1991,6 +2071,11 @@ i2cReg: 0-255, the register to read
Returns the number of bytes read (>0) if OK, otherwise PI_BAD_HANDLE, Returns the number of bytes read (>0) if OK, otherwise PI_BAD_HANDLE,
PI_BAD_PARAM, or PI_I2C_READ_FAILED. PI_BAD_PARAM, or PI_I2C_READ_FAILED.
. .
S Addr Wr [A] Comm [A]
S Addr Rd [A] [Data] A [Data] A ... A [Data] NA P
. .
D*/ D*/
@ -2010,6 +2095,10 @@ i2cReg: 0-255, the register to write
Returns 0 if OK, otherwise PI_BAD_HANDLE, PI_BAD_PARAM, or Returns 0 if OK, otherwise PI_BAD_HANDLE, PI_BAD_PARAM, or
PI_I2C_WRITE_FAILED. PI_I2C_WRITE_FAILED.
. .
S Addr Wr [A] Comm [A] Data [A] Data [A] ... [A] Data [A] P
. .
D*/ D*/
@ -3742,38 +3831,47 @@ numBits::
The number of bits stored in a buffer. The number of bits stored in a buffer.
numBytes:: numBytes::
The number of bytes used to store characters in a string. Depending The number of bytes used to store characters in a string. Depending
on the number of bits per character there may be 1, 2, or 4 bytes on the number of bits per character there may be 1, 2, or 4 bytes
per character. per character.
numPar:: 0-10 numPar:: 0-10
The number of parameters passed to a script. The number of parameters passed to a script.
numPulses:: numParts::
The number of parts in a combined I2C transaction.
numPulses::
The number of pulses to be added to a waveform. The number of pulses to be added to a waveform.
offset:: offset::
The associated data starts this number of microseconds from the start of The associated data starts this number of microseconds from the start of
tghe waveform. tghe waveform.
*param:: *param::
An array of script parameters. An array of script parameters.
port:: 1024-32000 *parts::
An array of the part transactions which make up a combined I2C transaction.
pi_i2c_msg_t::
. .
typedef struct
{
uint16_t addr; // slave address
uint16_t flags;
uint16_t len; // msg length
uint8_t *buf; // pointer to msg data
} pi_i2c_msg_t;
. .
port:: 1024-32000
The port used to bind to the pigpio socket. Defaults to 8888. The port used to bind to the pigpio socket. Defaults to 8888.
pos:: pos::
The position of an item. The position of an item.
primaryChannel:: 0-14 primaryChannel:: 0-14
The DMA channel used to time the sampling of gpios and to time servo and The DMA channel used to time the sampling of gpios and to time servo and
PWM pulses. PWM pulses.
@ -4323,6 +4421,9 @@ after this command is issued.
#define PI_BAD_STOPBITS -102 // serial (half) stop bits not 2-8 #define PI_BAD_STOPBITS -102 // serial (half) stop bits not 2-8
#define PI_MSG_TOOBIG -103 // socket/pipe message too big #define PI_MSG_TOOBIG -103 // socket/pipe message too big
#define PI_BAD_MALLOC_MODE -104 // bad memory allocation mode #define PI_BAD_MALLOC_MODE -104 // bad memory allocation mode
#define PI_TOO_MANY_PARTS -105 // too many I2C transaction parts
#define PI_BAD_I2C_PART -106 // a combined I2C transaction failed
#define PI_PIGIF_ERR_0 -2000 #define PI_PIGIF_ERR_0 -2000
#define PI_PIGIF_ERR_99 -2099 #define PI_PIGIF_ERR_99 -2099