Exemplo n.º 1
0
        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);
            }
        }
Exemplo n.º 2
0
        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.");
            }
        }