From 017c07a07747760a0ea392e8e0a4a02f7337b56e Mon Sep 17 00:00:00 2001 From: Dario Date: Mon, 14 Aug 2023 21:04:23 +0100 Subject: [PATCH 1/2] Added changes for Raspi I2C --- include/sta/bus/i2c/device.hpp | 2 +- include/sta/bus/interface.hpp | 2 +- include/sta/devices/raspi/bus/i2c.hpp | 3 ++- src/bus/interface.cpp | 10 ++++----- src/devices/raspi/bus/i2c.cpp | 30 +++++++++++++++++++++------ 5 files changed, 33 insertions(+), 14 deletions(-) diff --git a/include/sta/bus/i2c/device.hpp b/include/sta/bus/i2c/device.hpp index 88485b3..71552fc 100644 --- a/include/sta/bus/i2c/device.hpp +++ b/include/sta/bus/i2c/device.hpp @@ -18,7 +18,7 @@ namespace sta * @param intf %I2C hardware interface * @param csPin The peripheral's address. */ - I2CDevice(I2C * intf, int address, bool master=false, bool blocking=true); + I2CDevice(I2C * intf, int address, bool master=true, bool blocking=true); protected: void select() override; diff --git a/include/sta/bus/interface.hpp b/include/sta/bus/interface.hpp index a26151a..f5bbd9b 100644 --- a/include/sta/bus/interface.hpp +++ b/include/sta/bus/interface.hpp @@ -78,7 +78,7 @@ namespace sta bool isAquired(); private: Mutex * mutex_; - bool aquired_ = false; + bool acquired_ = false; }; } // namespace sta diff --git a/include/sta/devices/raspi/bus/i2c.hpp b/include/sta/devices/raspi/bus/i2c.hpp index d2573ac..b16449c 100644 --- a/include/sta/devices/raspi/bus/i2c.hpp +++ b/include/sta/devices/raspi/bus/i2c.hpp @@ -42,7 +42,8 @@ namespace sta class RaspiI2CDevice : public I2CDevice { - RaspiI2CDevice(RaspiI2C * intf, uint16_t address_10bit, Mutex* mutex=nullptr, bool master=false, bool blocking=true); + public: + RaspiI2CDevice(RaspiI2C * intf, uint16_t address_10bit, bool master=true, bool blocking=true); }; } // namespace sta diff --git a/src/bus/interface.cpp b/src/bus/interface.cpp index 627e863..d32292d 100644 --- a/src/bus/interface.cpp +++ b/src/bus/interface.cpp @@ -12,18 +12,18 @@ namespace sta void Interface::acquire() { - if (mutex_ != nullptr) - mutex_->acquire(); + mutex_->acquire(); + acquired_ = true; } void Interface::release() { - if (mutex_ != nullptr) - mutex_->release(); + mutex_->release(); + acquired_ = false; } bool Interface::isAquired() { - return aquired_; + return acquired_; } } // namespace sta diff --git a/src/devices/raspi/bus/i2c.cpp b/src/devices/raspi/bus/i2c.cpp index be270c6..689d7df 100644 --- a/src/devices/raspi/bus/i2c.cpp +++ b/src/devices/raspi/bus/i2c.cpp @@ -3,6 +3,7 @@ #ifdef STA_PLATFORM_RASPI #include +#include #include #include @@ -11,6 +12,7 @@ #include #include #include +#include #include @@ -41,21 +43,33 @@ namespace sta { STA_ASSERT(open_); - write(i2cfd_, &value, 1); + ssize_t n_out = write(i2cfd_, &value, 1); + + if (n_out < 0) + { + STA_DEBUG_PRINT("Transfer of single byte failed: "); + STA_DEBUG_PRINTLN(strerror(errno)); + } + + STA_ASSERT(n_out == 1); } void RaspiI2C::transfer16(uint16_t value) { STA_ASSERT(open_); - write(i2cfd_, &value, 2); + ssize_t n_out = write(i2cfd_, &value, 2); + + STA_ASSERT(n_out == 2); } void RaspiI2C::transfer(const uint8_t * buffer, size_t size) { STA_ASSERT(open_); - write(i2cfd_, buffer, size); + ssize_t n_out = write(i2cfd_, buffer, size); + + STA_ASSERT(n_out == size); } void RaspiI2C::transfer(const uint8_t * txBuffer, uint8_t * rxBuffer, size_t size) @@ -83,7 +97,9 @@ namespace sta uint8_t *buffer = new uint8_t[count]; memset(buffer, value, count); - write(i2cfd_, buffer, count); + ssize_t n_out = write(i2cfd_, buffer, count); + + STA_ASSERT(n_out == count); delete [] buffer; } @@ -100,6 +116,8 @@ namespace sta open_ = true; STA_ASSERT(i2cfd_ >= 0); + + STA_DEBUG_PRINTLN("Successfully opened file"); } void RaspiI2C::release() @@ -111,8 +129,8 @@ namespace sta I2C::release(); } - RaspiI2CDevice::RaspiI2CDevice(RaspiI2C * intf, uint16_t address_10bit, Mutex* mutex, bool master, bool blocking) - : I2CDevice { intf, address_10bit } + RaspiI2CDevice::RaspiI2CDevice(RaspiI2C * intf, uint16_t address_10bit, bool master, bool blocking) + : I2CDevice { intf, address_10bit, master, blocking } { } From 558a574793f78088b5ff41f5177b980f938cd230 Mon Sep 17 00:00:00 2001 From: Dario Date: Tue, 15 Aug 2023 17:01:32 +0100 Subject: [PATCH 2/2] fixes for raspi i2c support --- include/sta/bus/i2c/device.hpp | 1 - include/sta/config.hpp | 3 ++- include/sta/devices/raspi/bus/i2c.hpp | 1 + src/devices/raspi/bus/i2c.cpp | 32 +++++++++++++++++---------- 4 files changed, 23 insertions(+), 14 deletions(-) diff --git a/include/sta/bus/i2c/device.hpp b/include/sta/bus/i2c/device.hpp index 71552fc..5894b5b 100644 --- a/include/sta/bus/i2c/device.hpp +++ b/include/sta/bus/i2c/device.hpp @@ -22,7 +22,6 @@ namespace sta protected: void select() override; - void deselect() override; private: diff --git a/include/sta/config.hpp b/include/sta/config.hpp index f798ba8..725478f 100644 --- a/include/sta/config.hpp +++ b/include/sta/config.hpp @@ -1,7 +1,8 @@ #ifndef STA_CONFIG_HPP #define STA_CONFIG_HPP -#include +// #include +#include #define STA_DEBUGGING_ENABLED #define STA_PRINTF_USE_STDLIB diff --git a/include/sta/devices/raspi/bus/i2c.hpp b/include/sta/devices/raspi/bus/i2c.hpp index b16449c..d2ba9ef 100644 --- a/include/sta/devices/raspi/bus/i2c.hpp +++ b/include/sta/devices/raspi/bus/i2c.hpp @@ -29,6 +29,7 @@ namespace sta void transfer(const uint8_t * txBuffer, uint8_t * rxBuffer, size_t size) override; void receive(uint8_t * buffer, size_t size) override; + void selectAddress(); void acquire() override; void release() override; diff --git a/src/devices/raspi/bus/i2c.cpp b/src/devices/raspi/bus/i2c.cpp index 689d7df..393a0e4 100644 --- a/src/devices/raspi/bus/i2c.cpp +++ b/src/devices/raspi/bus/i2c.cpp @@ -43,14 +43,9 @@ namespace sta { STA_ASSERT(open_); + selectAddress(); ssize_t n_out = write(i2cfd_, &value, 1); - if (n_out < 0) - { - STA_DEBUG_PRINT("Transfer of single byte failed: "); - STA_DEBUG_PRINTLN(strerror(errno)); - } - STA_ASSERT(n_out == 1); } @@ -58,6 +53,7 @@ namespace sta { STA_ASSERT(open_); + selectAddress(); ssize_t n_out = write(i2cfd_, &value, 2); STA_ASSERT(n_out == 2); @@ -67,6 +63,7 @@ namespace sta { STA_ASSERT(open_); + selectAddress(); ssize_t n_out = write(i2cfd_, buffer, size); STA_ASSERT(n_out == size); @@ -83,16 +80,18 @@ namespace sta { STA_ASSERT(open_); - if (read(i2cfd_, buffer, size) <= 0) - { - printf("Error while reading i2c bus."); - } + selectAddress(); + ssize_t n_in = read(i2cfd_, buffer, size); + + STA_ASSERT(n_in >= 0); } void RaspiI2C::fill(uint8_t value, size_t count) { STA_ASSERT(open_); + selectAddress(); + // Initialize a buffer of size count and fill it with the value. uint8_t *buffer = new uint8_t[count]; memset(buffer, value, count); @@ -104,6 +103,14 @@ namespace sta delete [] buffer; } + void RaspiI2C::selectAddress() + { + // Select the slave with the given address. + int rslt = ioctl(i2cfd_, I2C_SLAVE, address_); + + STA_ASSERT(rslt != -1); + } + void RaspiI2C::acquire() { I2C::acquire(); @@ -116,14 +123,13 @@ namespace sta open_ = true; STA_ASSERT(i2cfd_ >= 0); - - STA_DEBUG_PRINTLN("Successfully opened file"); } void RaspiI2C::release() { if (!persistent_open_ && open_) { close(i2cfd_); + open_ = false; } I2C::release(); @@ -134,6 +140,8 @@ namespace sta { } + + } // namespace sta #endif // STA_PLATFORM_RASPI \ No newline at end of file