private unsafe void RdWrInterfaceTransfer(byte *writeBufferPtr, byte *readBufferPtr, int writeBufferLength, int readBufferLength) { int messageCount = 0; if (writeBufferPtr != null) { messageCount++; } if (readBufferPtr != null) { messageCount++; } i2c_msg *messagesPtr = stackalloc i2c_msg[messageCount]; messageCount = 0; if (writeBufferPtr != null) { messagesPtr[messageCount++] = new i2c_msg() { flags = I2cMessageFlags.I2C_M_WR, addr = (ushort)_settings.DeviceAddress, len = (ushort)writeBufferLength, buf = writeBufferPtr }; } if (readBufferPtr != null) { messagesPtr[messageCount++] = new i2c_msg() { flags = I2cMessageFlags.I2C_M_RD, addr = (ushort)_settings.DeviceAddress, len = (ushort)readBufferLength, buf = readBufferPtr }; } var tr = new i2c_rdwr_ioctl_data() { msgs = messagesPtr, nmsgs = (uint)messageCount }; int ret = ioctl(_deviceFileDescriptor, (uint)I2cSettings.I2C_RDWR, new IntPtr(&tr)); if (ret < 0) { throw Utils.CreateIOException("Error performing I2c data transfer", ret); } }
private unsafe void ReadWriteInterfaceTransfer(byte *writeBuffer, byte *readBuffer, int writeBufferLength, int readBufferLength) { // Allocating space for 2 messages in case we want to read and write on the same call. i2c_msg *messagesPtr = stackalloc i2c_msg[2]; int messageCount = 0; if (writeBuffer != null) { messagesPtr[messageCount++] = new i2c_msg() { flags = I2cMessageFlags.I2C_M_WR, addr = (ushort)_settings.DeviceAddress, len = (ushort)writeBufferLength, buf = writeBuffer }; } if (readBuffer != null) { messagesPtr[messageCount++] = new i2c_msg() { flags = I2cMessageFlags.I2C_M_RD, addr = (ushort)_settings.DeviceAddress, len = (ushort)readBufferLength, buf = readBuffer }; } var msgset = new i2c_rdwr_ioctl_data() { msgs = messagesPtr, nmsgs = (uint)messageCount }; int result = Interop.ioctl(_deviceFileDescriptor, (uint)I2cSettings.I2C_RDWR, new IntPtr(&msgset)); if (result < 0) { throw new IOException($"Error {Marshal.GetLastWin32Error()} performing I2C data transfer."); } }