i2c_spi_buses: add support for multiple instances of the same device on a bus

This also simplifies the API a bit, since we anyway have to change the
drivers to pass additional information (the bus device index).

The orientation flag is merged with the rotation.
This commit is contained in:
Beat Küng
2021-07-08 12:59:35 -04:00
committed by Daniel Agar
parent e4983ab88c
commit c5aef9d512
19 changed files with 252 additions and 60 deletions
+6
View File
@@ -42,6 +42,7 @@
#include "I2C.hpp"
#include <px4_platform_common/i2c_spi_buses.h>
#include <nuttx/i2c/i2c_master.h>
namespace device
@@ -64,6 +65,11 @@ I2C::I2C(uint8_t device_type, const char *name, const int bus, const uint16_t ad
_device_id.devid_s.address = address;
}
I2C::I2C(const I2CSPIDriverConfig &config)
: I2C(config.devid_driver_index, config.module_name, config.bus, config.i2c_address, config.bus_frequency)
{
}
I2C::~I2C()
{
if (_dev) {
+3
View File
@@ -45,6 +45,8 @@
#include <nuttx/i2c/i2c_master.h>
struct I2CSPIDriverConfig;
#if !defined(CONFIG_I2C)
# error I2C support requires CONFIG_I2C
#endif
@@ -87,6 +89,7 @@ protected:
* @param frequency I2C bus frequency for the device (currently not used)
*/
I2C(uint8_t device_type, const char *name, const int bus, const uint16_t address, const uint32_t frequency);
I2C(const I2CSPIDriverConfig &config);
virtual ~I2C();
/**
+8 -2
View File
@@ -47,6 +47,7 @@
#include "SPI.hpp"
#include <px4_platform_common/i2c_spi_buses.h>
#include <px4_platform_common/px4_config.h>
#include <nuttx/arch.h>
@@ -67,8 +68,7 @@ SPI::SPI(uint8_t device_type, const char *name, int bus, uint32_t device, enum s
// fill in _device_id fields for a SPI device
_device_id.devid_s.bus_type = DeviceBusType_SPI;
_device_id.devid_s.bus = bus;
// Use the 2. LSB byte as SPI address. This is currently 0, but will allow to extend
// for multiple instances of the same device on a bus, should that ever be required.
// Use the 2. LSB byte as SPI address, which is non-zero for multiple instances of the same device on a bus
_device_id.devid_s.address = (uint8_t)(device >> 8);
if (!px4_spi_bus_requires_locking(bus)) {
@@ -76,6 +76,12 @@ SPI::SPI(uint8_t device_type, const char *name, int bus, uint32_t device, enum s
}
}
SPI::SPI(const I2CSPIDriverConfig &config)
: SPI(config.devid_driver_index, config.module_name, config.bus, config.spi_devid, config.spi_mode,
config.bus_frequency)
{
}
SPI::~SPI()
{
// XXX no way to let go of the bus...
+5
View File
@@ -45,6 +45,8 @@
#include <nuttx/spi/spi.h>
#include <px4_platform_common/spi.h>
struct I2CSPIDriverConfig;
namespace device __EXPORT
{
@@ -72,6 +74,9 @@ protected:
* @param frequency SPI clock frequency
*/
SPI(uint8_t device_type, const char *name, int bus, uint32_t device, enum spi_mode_e mode, uint32_t frequency);
SPI(const I2CSPIDriverConfig &config);
virtual ~SPI();
/**
+7
View File
@@ -47,6 +47,8 @@
#include <linux/i2c.h>
#include <linux/i2c-dev.h>
#include <px4_platform_common/i2c_spi_buses.h>
namespace device
{
@@ -60,6 +62,11 @@ I2C::I2C(uint8_t device_type, const char *name, const int bus, const uint16_t ad
_device_id.devid_s.address = address;
}
I2C::I2C(const I2CSPIDriverConfig &config)
: I2C(config.devid_driver_index, config.module_name, config.bus, config.i2c_address, config.bus_frequency)
{
}
I2C::~I2C()
{
if (_fd >= 0) {
+3
View File
@@ -43,6 +43,8 @@
#include "../CDev.hpp"
#include <px4_platform_common/i2c.h>
struct I2CSPIDriverConfig;
namespace device __EXPORT
{
@@ -79,6 +81,7 @@ protected:
* @param frequency I2C bus frequency for the device (currently not used)
*/
I2C(uint8_t device_type, const char *name, const int bus, const uint16_t address, const uint32_t frequency);
I2C(const I2CSPIDriverConfig &config);
virtual ~I2C();
/**
+8
View File
@@ -48,6 +48,7 @@
#include <linux/types.h>
#include <linux/spi/spidev.h>
#include <px4_platform_common/i2c_spi_buses.h>
#include <px4_platform_common/px4_config.h>
namespace device
@@ -66,6 +67,13 @@ SPI::SPI(uint8_t device_type, const char *name, int bus, uint32_t device, enum s
_device_id.devid_s.address = (uint8_t)device;
}
SPI::SPI(const I2CSPIDriverConfig &config)
: SPI(config.devid_driver_index, config.module_name, config.bus, config.spi_devid, config.spi_mode,
config.bus_frequency)
{
}
SPI::~SPI()
{
if (_fd >= 0) {
+5
View File
@@ -58,6 +58,8 @@ enum spi_mode_e {
SPIDEV_MODE3 = SPI_MODE_3 /* CPOL=1 CHPHA=1 */
};
struct I2CSPIDriverConfig;
namespace device __EXPORT
{
@@ -85,6 +87,9 @@ protected:
* @param frequency SPI clock frequency
*/
SPI(uint8_t device_type, const char *name, int bus, uint32_t device, enum spi_mode_e mode, uint32_t frequency);
SPI(const I2CSPIDriverConfig &config);
virtual ~SPI();
/**
+7
View File
@@ -44,6 +44,8 @@
#include <dev_fs_lib_i2c.h>
#include <px4_platform_common/i2c_spi_buses.h>
namespace device
{
@@ -58,6 +60,11 @@ I2C::I2C(uint8_t device_type, const char *name, const int bus, const uint16_t ad
_device_id.devid_s.address = address;
}
I2C::I2C(const I2CSPIDriverConfig &config)
: I2C(config.devid_driver_index, config.module_name, config.bus, config.i2c_address, config.bus_frequency)
{
}
I2C::~I2C()
{
if (_fd >= 0) {
+3
View File
@@ -42,6 +42,8 @@
#include "../CDev.hpp"
struct I2CSPIDriverConfig;
namespace device __EXPORT
{
@@ -78,6 +80,7 @@ protected:
* @param frequency I2C bus frequency for the device (currently not used)
*/
I2C(uint8_t device_type, const char *name, const int bus, const uint16_t address, const uint32_t frequency);
I2C(const I2CSPIDriverConfig &config);
virtual ~I2C();
/**
+7
View File
@@ -46,6 +46,7 @@
#include "dev_fs_lib_spi.h"
#include <px4_platform_common/i2c_spi_buses.h>
#include <px4_platform_common/px4_config.h>
namespace device
@@ -64,6 +65,12 @@ SPI::SPI(uint8_t device_type, const char *name, int bus, uint32_t device, enum s
_device_id.devid_s.address = (uint8_t)device;
}
SPI::SPI(const I2CSPIDriverConfig &config)
: SPI(config.devid_driver_index, config.module_name, config.bus, config.spi_devid, config.spi_mode,
config.bus_frequency)
{
}
SPI::~SPI()
{
if (_fd >= 0) {
+3
View File
@@ -50,6 +50,8 @@ enum spi_mode_e {
SPIDEV_MODE3 = 3 /* CPOL=1 CHPHA=1 */
};
struct I2CSPIDriverConfig;
namespace device __EXPORT
{
@@ -70,6 +72,7 @@ protected:
* @param frequency SPI clock frequency
*/
SPI(uint8_t device_type, const char *name, int bus, uint32_t device, enum spi_mode_e mode, uint32_t frequency);
SPI(const I2CSPIDriverConfig &config);
virtual ~SPI();
/**