mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-10-21 02:23:34 +08:00
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:
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
/**
|
||||
|
||||
@@ -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...
|
||||
|
||||
@@ -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();
|
||||
|
||||
/**
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
/**
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
/**
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
/**
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user