diff --git a/Tools/px4moduledoc/srcparser.py b/Tools/px4moduledoc/srcparser.py index 7e0f74926a..2e8ccc1894 100644 --- a/Tools/px4moduledoc/srcparser.py +++ b/Tools/px4moduledoc/srcparser.py @@ -15,7 +15,8 @@ class ModuleDocumentation(object): # TOC in https://github.com/PX4/Devguide/blob/master/en/SUMMARY.md valid_categories = ['driver', 'estimator', 'controller', 'system', 'communication', 'command', 'template', 'simulation'] - valid_subcategories = ['', 'distance_sensor'] + valid_subcategories = ['', 'distance_sensor', 'imu', 'airspeed_sensor', + 'magnetometer', 'baro'] max_line_length = 80 # wrap lines that are longer than this diff --git a/platforms/common/i2c_spi_buses.cpp b/platforms/common/i2c_spi_buses.cpp index 09c1d4b7be..ed82029ff9 100644 --- a/platforms/common/i2c_spi_buses.cpp +++ b/platforms/common/i2c_spi_buses.cpp @@ -45,7 +45,7 @@ BusInstanceIterator::BusInstanceIterator(I2CSPIInstance **instances, int max_num_instances, const BusCLIArguments &cli_arguments, uint16_t devid_driver_index) : _instances(instances), _max_num_instances(max_num_instances), - _bus_option(cli_arguments.bus_option), + _bus_option(cli_arguments.bus_option), _type(cli_arguments.type), _spi_bus_iterator(spiFilter(cli_arguments.bus_option), cli_arguments.bus_option == I2CSPIBusOption::SPIExternal ? cli_arguments.chipselect_index : devid_driver_index, cli_arguments.requested_bus), @@ -58,7 +58,8 @@ bool BusInstanceIterator::next() int bus = -1; if (busType() == BOARD_INVALID_BUS) { - while (++_current_instance < _max_num_instances && _instances[_current_instance] == nullptr) {} + while (++_current_instance < _max_num_instances && (_instances[_current_instance] == nullptr + || _type != _instances[_current_instance]->_type)) {} return _current_instance < _max_num_instances; @@ -82,7 +83,7 @@ bool BusInstanceIterator::next() continue; } - if (_bus_option == _instances[i]->_bus_option && bus == _instances[i]->_bus) { + if (_bus_option == _instances[i]->_bus_option && bus == _instances[i]->_bus && _type == _instances[i]->_type) { _current_instance = i; } } @@ -164,7 +165,7 @@ uint32_t BusInstanceIterator::devid() const } } -uint32_t BusInstanceIterator::DRDYGPIO() const +spi_drdy_gpio_t BusInstanceIterator::DRDYGPIO() const { if (busType() == BOARD_INVALID_BUS) { return 0; @@ -233,7 +234,8 @@ int I2CSPIDriverBase::module_start(const BusCLIArguments &cli, BusInstanceIterat while (iterator.next()) { if (iterator.instance()) { - continue; // already running + PX4_WARN("Already running on bus %i", iterator.bus()); + continue; } const int free_index = iterator.nextFreeInstance(); diff --git a/platforms/common/include/px4_platform_common/i2c_spi_buses.h b/platforms/common/include/px4_platform_common/i2c_spi_buses.h index 73c2fdedbe..7535ff203c 100644 --- a/platforms/common/include/px4_platform_common/i2c_spi_buses.h +++ b/platforms/common/include/px4_platform_common/i2c_spi_buses.h @@ -59,8 +59,8 @@ enum class I2CSPIBusOption : uint8_t { class I2CSPIInstance { public: - I2CSPIInstance(I2CSPIBusOption bus_option, int bus) - : _bus_option(bus_option), _bus(bus) {} + I2CSPIInstance(I2CSPIBusOption bus_option, int bus, int type) + : _bus_option(bus_option), _bus(bus), _type(type) {} virtual ~I2CSPIInstance() = default; @@ -70,15 +70,20 @@ private: const I2CSPIBusOption _bus_option; const int _bus; + const int _type; ///< device type (driver-specific) }; struct BusCLIArguments { I2CSPIBusOption bus_option{I2CSPIBusOption::All}; + int type{0}; ///< device type (driver-specific) int requested_bus{-1}; int chipselect_index{1}; Rotation rotation{ROTATION_NONE}; - int custom1; ///< driver-specific custom argument - int custom2; ///< driver-specific custom argument + int bus_frequency{0}; + int spi_mode{-1}; + int custom1{0}; ///< driver-specific custom argument + int custom2{0}; ///< driver-specific custom argument + void *custom_data{nullptr}; ///< driver-specific custom argument }; /** @@ -103,7 +108,7 @@ public: board_bus_types busType() const; int bus() const; uint32_t devid() const; - uint32_t DRDYGPIO() const; + spi_drdy_gpio_t DRDYGPIO() const; bool external() const; static I2CBusIterator::FilterType i2cFilter(I2CSPIBusOption bus_option); @@ -112,6 +117,7 @@ private: I2CSPIInstance **_instances; const int _max_num_instances; const I2CSPIBusOption _bus_option; + const int _type; SPIBusIterator _spi_bus_iterator; I2CBusIterator _i2c_bus_iterator; int _current_instance{-1}; @@ -124,9 +130,9 @@ private: class I2CSPIDriverBase : public px4::ScheduledWorkItem, public I2CSPIInstance { public: - I2CSPIDriverBase(const char *module_name, const px4::wq_config_t &config, I2CSPIBusOption bus_option, int bus) + I2CSPIDriverBase(const char *module_name, const px4::wq_config_t &config, I2CSPIBusOption bus_option, int bus, int type) : ScheduledWorkItem(module_name, config), - I2CSPIInstance(bus_option, bus) {} + I2CSPIInstance(bus_option, bus, type) {} static int module_stop(BusInstanceIterator &iterator); static int module_status(BusInstanceIterator &iterator); @@ -178,8 +184,8 @@ public: static I2CSPIInstance **instances() { return _instances; } protected: - I2CSPIDriver(const char *module_name, const px4::wq_config_t &config, I2CSPIBusOption bus_option, int bus) - : I2CSPIDriverBase(module_name, config, bus_option, bus) {} + I2CSPIDriver(const char *module_name, const px4::wq_config_t &config, I2CSPIBusOption bus_option, int bus, int type = 0) + : I2CSPIDriverBase(module_name, config, bus_option, bus, type) {} virtual ~I2CSPIDriver() = default; diff --git a/platforms/common/include/px4_platform_common/spi.h b/platforms/common/include/px4_platform_common/spi.h index b76650c9e0..665f089c59 100644 --- a/platforms/common/include/px4_platform_common/spi.h +++ b/platforms/common/include/px4_platform_common/spi.h @@ -46,10 +46,12 @@ //#define PX4_SPI_DEV_ID(devid) ((devid) & 0xffff) #define PX4_SPIDEVID_TYPE(devid) (((uint32_t)(devid) >> 16) & 0xffff) +typedef uint32_t spi_drdy_gpio_t; + #define SPI_BUS_MAX_DEVICES 5 struct px4_spi_bus_device_t { uint32_t cs_gpio; ///< chip-select GPIO (0 if this device is not used) - uint32_t drdy_gpio; ///< data ready GPIO (0 if not set) + spi_drdy_gpio_t drdy_gpio; ///< data ready GPIO (0 if not set) uint32_t devid; ///< SPIDEV_ID(type,index). For PX4 devices on NuttX: index is the device type, and for external buses the CS index uint16_t devtype_driver; ///< driver device type, e.g. DRV_IMU_DEVTYPE_ICM20689 (on NuttX: PX4_SPI_DEV_ID(devid) == devtype_driver) }; @@ -148,7 +150,7 @@ public: bool next(); const px4_spi_bus_t &bus() const { return px4_spi_buses[_index]; } - uint32_t DRDYGPIO() const { return px4_spi_buses[_index].devices[_bus_device_index].drdy_gpio; } + spi_drdy_gpio_t DRDYGPIO() const { return px4_spi_buses[_index].devices[_bus_device_index].drdy_gpio; } uint32_t devid() const { return px4_spi_buses[_index].devices[_bus_device_index].devid; }