00001
00038 #include <assert.h>
00039 #include <bitops.h>
00040 #include <spi.h>
00041 #include <board/spi.h>
00042
00055 void spi_polled_start(struct spi_master *spim, uint8_t tx_byte, size_t residue)
00056 {
00057 struct spi_master_polled *spim_poll = spi_master_polled_of(spim);
00058
00059 spim->residue = residue;
00060 spim->status = OPERATION_IN_PROGRESS;
00061 spim_poll->start(spim, tx_byte);
00062 spi_polled_sched_poll(spim);
00063 }
00064
00069 void spi_polled_write(struct spi_master *spim, const uint8_t *data, size_t len)
00070 {
00071 struct spi_master_polled *spim_poll = spi_master_polled_of(spim);
00072
00073 spim_poll->op = 1 << SPI_OP_WRITE;
00074 spim_poll->write_data = data + 1;
00075 spi_polled_start(spim, *data, len);
00076 }
00077
00082 void spi_polled_read(struct spi_master *spim, uint8_t *data, size_t len)
00083 {
00084 struct spi_master_polled *spim_poll = spi_master_polled_of(spim);
00085
00086 spim_poll->op = 1 << SPI_OP_READ;
00087 spim_poll->read_data = data;
00088 spi_polled_start(spim, 0, len);
00089 }
00090
00095 void spi_polled_exchange(struct spi_master *spim, const uint8_t *write,
00096 uint8_t *read, size_t len)
00097 {
00098 struct spi_master_polled *spim_poll = spi_master_polled_of(spim);
00099
00100 spim_poll->op = (1 << SPI_OP_WRITE) | (1 << SPI_OP_READ);
00101 spim_poll->write_data = write + 1;
00102 spim_poll->read_data = read;
00103 spi_polled_start(spim, *write, len);
00104 }
00105
00113 void spi_polled_master_init(struct spi_master *spim, workqueue_func_t poll,
00114 spi_start_func_t start)
00115 {
00116 struct spi_master_polled *spim_poll = spi_master_polled_of(spim);
00117
00118 nested_workqueue_init(&spim->nwq);
00119 workqueue_task_init(&spim_poll->poll, poll);
00120 spim_poll->start = start;
00121 spi_polled_buf_list_init(spim);
00122 }
00123