mraa_spi_context mraa_spi_init_raw(unsigned int bus, unsigned int cs) { mraa_spi_context dev = mraa_spi_init_internal(plat == NULL ? NULL : plat->adv_func); if (dev == NULL) { syslog(LOG_CRIT, "spi: Failed to allocate memory for context"); return NULL; } char path[MAX_SIZE]; sprintf(path, "/dev/spidev%u.%u", bus, cs); dev->devfd = open(path, O_RDWR); if (dev->devfd < 0) { syslog(LOG_ERR, "spi: Failed opening SPI Device. bus:%s", path); free(dev); return NULL; } int speed = 0; if (ioctl(dev->devfd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) != -1) { dev->clock = speed; } else { // We had this on Galileo Gen1, so let it be a fallback value dev->clock = 4000000; syslog(LOG_WARNING, "spi: Max speed query failed, setting %d", dev->clock); } if (mraa_spi_mode(dev, MRAA_SPI_MODE0) != MRAA_SUCCESS) { free(dev); return NULL; } if (mraa_spi_lsbmode(dev, 0) != MRAA_SUCCESS) { free(dev); return NULL; } if (mraa_spi_bit_per_word(dev, 8) != MRAA_SUCCESS) { free(dev); return NULL; } return dev; }
mraa_spi_context mraa_spi_init_raw(unsigned int bus, unsigned int cs) { mraa_spi_context dev = mraa_spi_init_internal(plat == NULL ? NULL : plat->adv_func); if (dev == NULL) { syslog(LOG_CRIT, "spi: Failed to allocate memory for context"); return NULL; } char path[MAX_SIZE]; sprintf(path, "/dev/spidev%u.%u", bus, cs); dev->devfd = open(path, O_RDWR); if (dev->devfd < 0) { syslog(LOG_ERR, "spi: Failed opening SPI Device. bus:%s", path); free(dev); return NULL; } int speed = 0; if ((ioctl(dev->devfd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) != -1) && (speed < 4000000)) { dev->clock = speed; } else { dev->clock = 4000000; } if (mraa_spi_mode(dev, MRAA_SPI_MODE0) != MRAA_SUCCESS) { free(dev); return NULL; } if (mraa_spi_lsbmode(dev, 0) != MRAA_SUCCESS) { free(dev); return NULL; } if (mraa_spi_bit_per_word(dev, 8) != MRAA_SUCCESS) { free(dev); return NULL; } return dev; }
mraa_spi_context mraa_spi_init_raw(unsigned int bus, unsigned int cs) { mraa_result_t status = MRAA_SUCCESS; mraa_spi_context dev = mraa_spi_init_internal(plat == NULL ? NULL : plat->adv_func); if (dev == NULL) { syslog(LOG_CRIT, "spi: Failed to allocate memory for context"); status = MRAA_ERROR_NO_RESOURCES; goto init_raw_cleanup; } if (IS_FUNC_DEFINED(dev, spi_init_raw_replace)) { status = dev->advance_func->spi_init_raw_replace(dev, bus, cs); if (status == MRAA_SUCCESS) { return dev; } else { goto init_raw_cleanup; } } char path[MAX_SIZE]; snprintf(path, MAX_SIZE, "/dev/spidev%u.%u", bus, cs); dev->devfd = open(path, O_RDWR); if (dev->devfd < 0) { syslog(LOG_ERR, "spi: Failed opening SPI Device. bus:%s. Error %d %s", path, errno, strerror(errno)); status = MRAA_ERROR_INVALID_RESOURCE; goto init_raw_cleanup; } int speed = 0; if (ioctl(dev->devfd, SPI_IOC_RD_MAX_SPEED_HZ, &speed) != -1) { dev->clock = speed; } else { // We had this on Galileo Gen1, so let it be a fallback value dev->clock = 4000000; syslog(LOG_WARNING, "spi: Max speed query failed, setting %d", dev->clock); } status = mraa_spi_mode(dev, MRAA_SPI_MODE0); if (status != MRAA_SUCCESS) { goto init_raw_cleanup; } status = mraa_spi_lsbmode(dev, 0); if (status != MRAA_SUCCESS) { goto init_raw_cleanup; } status = mraa_spi_bit_per_word(dev, 8); if (status != MRAA_SUCCESS) { goto init_raw_cleanup; } init_raw_cleanup: if (status != MRAA_SUCCESS) { if (dev != NULL) { free(dev); } return NULL; } return dev; }