SPIDriver: fixed handling of 0 based SPI bus numbers

This commit is contained in:
Andrew Tridgell 2014-08-18 12:32:57 +10:00
parent 5fb2ad0068
commit a4ef512f10
2 changed files with 21 additions and 14 deletions

View File

@ -42,8 +42,8 @@ LinuxSPIDeviceDriver LinuxSPIDeviceManager::_device[0];
#endif #endif
// have a separate semaphore per bus // have a separate semaphore per bus
LinuxSemaphore LinuxSPIDeviceManager::_semaphore[LINUX_SPI_NUM_BUSES]; LinuxSemaphore LinuxSPIDeviceManager::_semaphore[LINUX_SPI_MAX_BUSES];
int LinuxSPIDeviceManager::_fd[LINUX_SPI_NUM_BUSES]; int LinuxSPIDeviceManager::_fd[LINUX_SPI_MAX_BUSES];
LinuxSPIDeviceDriver::LinuxSPIDeviceDriver(uint8_t bus, enum AP_HAL::SPIDevice type, uint8_t mode, uint8_t bitsPerWord, uint8_t cs_pin, uint32_t lowspeed, uint32_t highspeed): LinuxSPIDeviceDriver::LinuxSPIDeviceDriver(uint8_t bus, enum AP_HAL::SPIDevice type, uint8_t mode, uint8_t bitsPerWord, uint8_t cs_pin, uint32_t lowspeed, uint32_t highspeed):
_bus(bus), _bus(bus),
@ -111,15 +111,23 @@ void LinuxSPIDeviceDriver::transfer(const uint8_t *data, uint16_t len)
void LinuxSPIDeviceManager::init(void *) void LinuxSPIDeviceManager::init(void *)
{ {
char path[] = "/dev/spidevN.0"; for (uint8_t i=0; i<LINUX_SPI_MAX_BUSES; i++) {
for (uint8_t i=0; i<LINUX_SPI_NUM_BUSES; i++) { _fd[i] = -1;
path[11] = '0' + i;
_fd[i] = open(path, O_RDWR);
if (_fd[i] == -1) {
hal.scheduler->panic("SPIDriver: unable to open SPI bus");
}
} }
for (uint8_t i=0; i<LINUX_SPI_DEVICE_NUM_DEVICES; i++) { for (uint8_t i=0; i<LINUX_SPI_DEVICE_NUM_DEVICES; i++) {
if (_device[i]._bus >= LINUX_SPI_MAX_BUSES) {
hal.scheduler->panic("SPIDriver: invalid bus number");
}
if (_fd[_device[i]._bus] == -1) {
char path[] = "/dev/spidevN.0";
path[11] = '0' + _device[i]._bus;
_fd[_device[i]._bus] = open(path, O_RDWR);
if (_fd[_device[i]._bus] == -1) {
hal.scheduler->panic("SPIDriver: unable to open SPI bus");
}
printf("Opened %s\n", path);
fflush(stdout);
}
_device[i].init(); _device[i].init();
} }
} }

View File

@ -6,16 +6,15 @@
#include "Semaphores.h" #include "Semaphores.h"
#if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_PXF || CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_ERLE #if CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_PXF || CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_ERLE
#define LINUX_SPI_NUM_BUSES 2
#define LINUX_SPI_DEVICE_NUM_DEVICES 6 #define LINUX_SPI_DEVICE_NUM_DEVICES 6
#elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO #elif CONFIG_HAL_BOARD_SUBTYPE == HAL_BOARD_SUBTYPE_LINUX_NAVIO
#define LINUX_SPI_NUM_BUSES 1
#define LINUX_SPI_DEVICE_NUM_DEVICES 1 #define LINUX_SPI_DEVICE_NUM_DEVICES 1
#else #else
#define LINUX_SPI_NUM_BUSES 0
#define LINUX_SPI_DEVICE_NUM_DEVICES 0 #define LINUX_SPI_DEVICE_NUM_DEVICES 0
#endif #endif
#define LINUX_SPI_MAX_BUSES 3
class Linux::LinuxSPIDeviceDriver : public AP_HAL::SPIDeviceDriver { class Linux::LinuxSPIDeviceDriver : public AP_HAL::SPIDeviceDriver {
public: public:
friend class Linux::LinuxSPIDeviceManager; friend class Linux::LinuxSPIDeviceManager;
@ -55,8 +54,8 @@ public:
private: private:
static LinuxSPIDeviceDriver _device[LINUX_SPI_DEVICE_NUM_DEVICES]; static LinuxSPIDeviceDriver _device[LINUX_SPI_DEVICE_NUM_DEVICES];
static LinuxSemaphore _semaphore[LINUX_SPI_NUM_BUSES]; static LinuxSemaphore _semaphore[LINUX_SPI_MAX_BUSES];
static int _fd[LINUX_SPI_NUM_BUSES]; static int _fd[LINUX_SPI_MAX_BUSES];
}; };
#endif // __AP_HAL_LINUX_SPIDRIVER_H__ #endif // __AP_HAL_LINUX_SPIDRIVER_H__