Private
Public Access
2
0

spi: completed implementation.

* Added more functions for transaction settings.

Signed-off-by: Thomas Ingleby <thomas.c.ingleby@intel.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
Thomas Ingleby
2014-05-20 16:55:27 +01:00
committed by Brendan Le Foll
parent 66550f9487
commit a8d7473a5b
2 changed files with 63 additions and 9 deletions

View File

@@ -44,12 +44,13 @@ typedef struct _spi* maa_spi_context;
/** Initialise SPI_context, uses board mapping. Sets the muxes /** Initialise SPI_context, uses board mapping. Sets the muxes
* *
* @param bus to use, as listed in platform definition. Normally 0
* @return maa_spi_context The returned initialised SPI context * @return maa_spi_context The returned initialised SPI context
*/ */
maa_spi_context maa_spi_init(); maa_spi_context maa_spi_init(int bus);
/** Set the SPI device mode. see spidev /** Set the SPI device mode. see spidev
* * 0-3.
* @param spi the spi device context * @param spi the spi device context
* @param mode the mode. See Linux spidev * @param mode the mode. See Linux spidev
* *
@@ -85,6 +86,26 @@ uint8_t maa_spi_write(maa_spi_context dev, uint8_t data);
*/ */
uint8_t* maa_spi_write_buf(maa_spi_context dev, uint8_t* data, int length); uint8_t* maa_spi_write_buf(maa_spi_context dev, uint8_t* data, int length);
/**
*
* @param dev spi context
* @param lsb. Use least significant bit transmission. 0 for msbi
*
* @return maa result of operation
*/
maa_result_t
maa_spi_lsbmode(maa_spi_context dev, maa_boolean_t lsb)
/** Set bits per mode on transaction
* Defaults at 8.
*
* @param dev spi context
* @param bits bits per word
*
* @return Result of operation
*/
maa_result_t
maa_spi_bit_per_word(maa_spi_context dev, unsigned int bits)
/** De-inits an maa_spi_context device /** De-inits an maa_spi_context device
* *

View File

@@ -40,6 +40,10 @@
struct _spi { struct _spi {
/*@{*/ /*@{*/
int devfd; /**< File descriptor to SPI Device */ int devfd; /**< File descriptor to SPI Device */
int mode; /**< Spi mode see spidev.h */
int clock; /**< clock to run transactions at */
maa_boolean_t lsb; /**< least significant bit mode */
unsigned int bpw; /**< Bits per word */
/*@}*/ /*@}*/
}; };
@@ -63,6 +67,10 @@ maa_spi_init(int bus)
free(dev); free(dev);
return NULL; return NULL;
} }
dev->bpw = 8;
dev->clock = 4000000;
dev->lsb = 0;
dev->mode = 0;
return dev; return dev;
} }
@@ -70,13 +78,37 @@ maa_spi_init(int bus)
maa_result_t maa_result_t
maa_spi_mode(maa_spi_context dev, unsigned short mode) maa_spi_mode(maa_spi_context dev, unsigned short mode)
{ {
return MAA_ERROR_FEATURE_NOT_IMPLEMENTED; dev->mode = mode;
return MAA_SUCCESS;
} }
maa_result_t maa_result_t
maa_spi_frequency(maa_spi_context dev, int hz) maa_spi_frequency(maa_spi_context dev, int hz)
{ {
return MAA_ERROR_FEATURE_NOT_IMPLEMENTED; dev->clock = hz;
return MAA_SUCCESS;
}
maa_result_t
maa_spi_lsbmode(maa_spi_context dev, maa_boolean_t lsb)
{
uint8_t lsb_mode = 0;
if (lsb == 1) {
lsb_mode = 1;
}
if (ioctl (dev->devfd, SPI_IOC_WR_LSB_FIRST, &lsb_mode) < 0) {
fprintf(stderr, "Failed to set bit order\n");
return MAA_ERROR_INVALID_RESOURCE;
}
dev->lsb = lsb;
return MAA_SUCCESS;
}
maa_result_t
maa_spi_bit_per_word(maa_spi_context dev, unsigned int bits)
{
dev->bpw = bits;
return MAA_SUCCESS;
} }
uint8_t uint8_t
@@ -90,8 +122,8 @@ maa_spi_write(maa_spi_context dev, uint8_t data)
uint8_t recv = 0; uint8_t recv = 0;
msg.tx_buf = (unsigned long) &data; msg.tx_buf = (unsigned long) &data;
msg.rx_buf = (unsigned long) &recv; msg.rx_buf = (unsigned long) &recv;
msg.speed_hz = 100000; msg.speed_hz = dev->clock;
msg.bits_per_word = 8; msg.bits_per_word = dev->bpw;
msg.delay_usecs = 0; msg.delay_usecs = 0;
msg.len = length; msg.len = length;
if (ioctl(dev->devfd, SPI_IOC_MESSAGE(1), &msg) < 0) { if (ioctl(dev->devfd, SPI_IOC_MESSAGE(1), &msg) < 0) {
@@ -111,8 +143,8 @@ maa_spi_write_buf(maa_spi_context dev, uint8_t* data, int length)
msg.tx_buf = (unsigned long) data; msg.tx_buf = (unsigned long) data;
msg.rx_buf = (unsigned long) recv; msg.rx_buf = (unsigned long) recv;
msg.speed_hz = 100000; msg.speed_hz = dev->clock;
msg.bits_per_word = 8; msg.bits_per_word = dev->bpw;
msg.delay_usecs = 0; msg.delay_usecs = 0;
msg.len = length; msg.len = length;
if (ioctl(dev->devfd, SPI_IOC_MESSAGE(1), &msg) < 0) { if (ioctl(dev->devfd, SPI_IOC_MESSAGE(1), &msg) < 0) {
@@ -125,5 +157,6 @@ maa_spi_write_buf(maa_spi_context dev, uint8_t* data, int length)
maa_result_t maa_result_t
maa_spi_stop(maa_spi_context dev) maa_spi_stop(maa_spi_context dev)
{ {
return MAA_ERROR_FEATURE_NOT_IMPLEMENTED; close(dev->devfd);
return MAA_SUCCESS;
} }