int SPI_transfer(int spidev_fd, void *tx_buffer, void *rx_buffer, int n_words) { uint8_t bits_per_word; uint32_t n_bytes; struct spi_ioc_transfer transfer; bits_per_word = SPI_getBitsPerWord(spidev_fd); if (bits_per_word < 0) return bits_per_word; n_bytes = (uint32_t) (((float) (bits_per_word * n_words)) / 8.0 + 0.5); if (!n_bytes) return 0; if (n_bytes > MAX_TRANSFER_SIZE) n_bytes = MAX_TRANSFER_SIZE; transfer.tx_buf = (uint64_t*) tx_buffer; transfer.rx_buf = (uint64_t*) rx_buffer; transfer.len = n_bytes; transfer.speed_hz = 0; transfer.delay_usecs = 0; transfer.bits_per_word = bits_per_word; transfer.cs_change = 0; if (ioctl(spidev_fd, SPI_IOC_MESSAGE(1), &transfer) < 0) return -1; return (n_bytes<<3) / bits_per_word; }
static PyObject *SPIDev_open(SPIDev *self, PyObject *args, PyObject *kwds) { self->spidev_fd[0] = SPI_open(self->bus, 0); if (self->spidev_fd[0] < 0) { PyErr_SetString(PyExc_IOError, "could not open spidev"); return NULL; } self->bits_per_word = SPI_getBitsPerWord(self->spidev_fd[0]); if (self->bits_per_word <= 8) { self->bytes_per_word = 1; } else if (self->bits_per_word <= 16) { self->bytes_per_word = 2; } else if (self->bits_per_word <= 32) { self->bytes_per_word = 4; } if (self->mode_3wire) { SPI_enable3Wire(self->spidev_fd[0]); } Py_INCREF(Py_None); return Py_None; }