API Reference
This document summarizes the public interfaces exposed by linux-wire. For usage examples and build instructions, see docs/index.md.
C API (linux_wire.h)
typedef struct
{
int fd;
char device_path[LINUX_WIRE_DEVICE_PATH_MAX];
uint32_t timeout_us;
} lw_i2c_bus;
Bus Management
| Function | Description |
|---|---|
int lw_open_bus(lw_i2c_bus *bus, const char *path); |
Opens /dev/i2c-X and populates the handle. Returns 0 on success, -1 on error (sets errno). |
void lw_close_bus(lw_i2c_bus *bus); |
Closes the file descriptor if open. Safe to call multiple times. |
int lw_set_slave(lw_i2c_bus *bus, uint8_t addr); |
Issues I2C_SLAVE ioctl to select the target address. |
int lw_set_timeout(lw_i2c_bus *bus, uint32_t timeout_us); |
Stores a timeout hint (currently informational). |
Simple Read/Write
| Function | Description |
|---|---|
ssize_t lw_write(lw_i2c_bus *bus, const uint8_t *data, size_t len, int send_stop); |
Writes len bytes via write(2). send_stop is accepted for parity with the C++ API but always issues a STOP. |
ssize_t lw_read(lw_i2c_bus *bus, uint8_t *data, size_t len); |
Reads up to len bytes via read(2). |
void lw_set_error_logging(lw_i2c_bus *bus, int enable); |
Enable (enable != 0) or suppress (enable == 0) perror logging for that bus handle. |
Both functions return the number of bytes processed or -1 on error (errno set).
Combined Transactions
| Function | Description |
|---|---|
ssize_t lw_ioctl_read(lw_i2c_bus *bus, uint16_t addr, const uint8_t *iaddr, size_t iaddr_len, uint8_t *data, size_t len, uint16_t flags); |
Issues an I2C_RDWR ioctl with an optional internal register write followed by a read (repeated-start behavior). |
ssize_t lw_ioctl_write(lw_i2c_bus *bus, uint16_t addr, const uint8_t *iaddr, size_t iaddr_len, const uint8_t *data, size_t len, uint16_t flags); |
Builds a single write message combining an optional internal address and payload. |
The helper validates inputs (non-null buffers, length ≤ 4096, etc.) before calling into the kernel.
C++ API (Wire.h)
TwoWire mirrors the Arduino Wire API for master-mode use. A global TwoWire Wire; instance is provided, but you can instantiate additional objects if desired.
Core Methods
| Method | Description |
|---|---|
void begin(const char *device = "/dev/i2c-1"); |
Opens the specified I²C device. Calling begin() again reopens the bus. |
void begin(uint8_t); void begin(int); |
Provided for Arduino compatibility; they’re no-ops in Linux master mode. |
void end(); |
Closes the bus and clears buffers. |
void setClock(uint32_t frequency); |
Currently a no-op (bus speed is controlled by the kernel). |
void setWireTimeout(uint32_t timeout_us = 25000, bool reset_with_timeout = false); |
Stores a timeout threshold; when the underlying I/O reports ETIMEDOUT, getWireTimeoutFlag() becomes true and (optionally) the bus is reopened. |
bool getWireTimeoutFlag() const; / void clearWireTimeoutFlag(); |
Query/reset the timeout flag. |
void setErrorLogging(bool enable); |
Toggle low-level perror logging (handy when probing addresses that are expected to NACK). |
Master Transmit
| Method | Description |
|---|---|
void beginTransmission(uint8_t address); |
Starts buffering data for the given device. |
void beginTransmission(int address); |
Overload that forwards to the uint8_t version. |
uint8_t endTransmission(uint8_t sendStop = 1); |
Writes the buffered bytes. Return codes match Arduino: 0 success, 1 buffer overflow, 4 other error. Passing 0 for sendStop defers the actual write until the next requestFrom (repeated-start semantics). |
size_t write(uint8_t data); / size_t write(const uint8_t *data, size_t len); / size_t write(const char *str); |
Append data to the TX buffer (up to 32 bytes). |
Master Receive
| Method | Description |
|---|---|
uint8_t requestFrom(uint8_t address, uint8_t quantity, uint8_t sendStop = 1); |
Reads up to quantity bytes. If prior endTransmission(false) buffered data for the same address, it performs a combined I2C_RDWR transaction. |
uint8_t requestFrom(uint8_t address, uint8_t quantity, uint32_t iaddress, uint8_t isize, uint8_t sendStop); |
Arduino-style register helper; isize is clamped to 4. |
uint8_t requestFrom(int address, int quantity); / uint8_t requestFrom(int address, int quantity, int sendStop); |
Compatibility overloads. |
int available() const; int read(); int peek(); void flush(); |
Buffer inspection helpers matching Arduino semantics. |
Repeated-start semantics
endTransmission(false)leaves the TX buffer intact for the nextrequestFromto the same address. If you later target a different address or callbeginTransmissionwithout a read in between, linux-wire automatically flushes the pending data with a STOP so nothing is silently dropped.
Timeout behavior
- When
lw_read/lw_ioctl_readreportsETIMEDOUT,wireTimeoutFlag_is set. Ifreset_with_timeoutwas true whensetWireTimeoutwas called, the bus descriptor is closed and reopened automatically.
Examples
See the examples/ directory for concrete flows:
i2c_scanner: iterates over addresses and usesendTransmission()to probe each one.master_writer: simple register write.master_reader: demonstratesendTransmission(false)+requestFromrepeated-start read.
For mock-based tests of buffer management and timeout logic, inspect tests/test_wire.cpp.