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
// have a separate semaphore per bus
LinuxSemaphore LinuxSPIDeviceManager::_semaphore[LINUX_SPI_NUM_BUSES];
int LinuxSPIDeviceManager::_fd[LINUX_SPI_NUM_BUSES];
LinuxSemaphore LinuxSPIDeviceManager::_semaphore[LINUX_SPI_MAX_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):
_bus(bus),
@ -111,15 +111,23 @@ void LinuxSPIDeviceDriver::transfer(const uint8_t *data, uint16_t len)
void LinuxSPIDeviceManager::init(void *)
{
char path[] = "/dev/spidevN.0";
for (uint8_t i=0; i<LINUX_SPI_NUM_BUSES; i++) {
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_MAX_BUSES; i++) {
_fd[i] = -1;
}
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();
}
}

View File

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