| 1 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 2 | // File     : spi_driver.h | 
|---|
| 3 | // Date     : 31/08/2012 | 
|---|
| 4 | // Author   : cesar fuguet | 
|---|
| 5 | // Copyright (c) UPMC-LIP6 | 
|---|
| 6 | /////////////////////////////////////////////////////////////////////////////////// | 
|---|
| 7 | #ifndef _GIET_SPI_DRIVER_H_ | 
|---|
| 8 | #define _GIET_SPI_DRIVER_H_ | 
|---|
| 9 |  | 
|---|
| 10 | #include <io.h> | 
|---|
| 11 | #include <mapping_info.h> | 
|---|
| 12 |  | 
|---|
| 13 | /////////////////////////////////////////////////////////////////////////////// | 
|---|
| 14 | // SPI structure definition | 
|---|
| 15 | /////////////////////////////////////////////////////////////////////////////// | 
|---|
| 16 | struct spi_dev | 
|---|
| 17 | { | 
|---|
| 18 | // RX/TX registers of the SPI controller | 
|---|
| 19 | unsigned int rx_tx[4]; | 
|---|
| 20 |  | 
|---|
| 21 | // control register of the SPI controller | 
|---|
| 22 | unsigned int ctrl; | 
|---|
| 23 |  | 
|---|
| 24 | // divider register for the SPI controller generated clock signal | 
|---|
| 25 | unsigned int divider; | 
|---|
| 26 |  | 
|---|
| 27 | // slave select register of the SPI controller | 
|---|
| 28 | unsigned int ss; | 
|---|
| 29 |  | 
|---|
| 30 | // SPI-DMA registers | 
|---|
| 31 | unsigned int dma_base; | 
|---|
| 32 | unsigned int dma_baseh; | 
|---|
| 33 | unsigned int dma_count; | 
|---|
| 34 | }; | 
|---|
| 35 |  | 
|---|
| 36 | void spi_put_tx(struct spi_dev * spi, unsigned char byte, int index); | 
|---|
| 37 |  | 
|---|
| 38 | inline volatile unsigned char spi_get_rx(struct spi_dev * spi, int index); | 
|---|
| 39 |  | 
|---|
| 40 | unsigned int spi_get_data(struct spi_dev * spi, paddr_t buffer, unsigned int count); | 
|---|
| 41 |  | 
|---|
| 42 | inline void spi_ss_assert(struct spi_dev * spi, int index); | 
|---|
| 43 |  | 
|---|
| 44 | inline void spi_ss_deassert(struct spi_dev * spi, int index); | 
|---|
| 45 |  | 
|---|
| 46 | void _spi_init ( struct spi_dev * spi, | 
|---|
| 47 | int spi_freq        , | 
|---|
| 48 | int sys_freq        , | 
|---|
| 49 | int char_len        , | 
|---|
| 50 | int tx_edge         , | 
|---|
| 51 | int rx_edge         ); | 
|---|
| 52 |  | 
|---|
| 53 | extern void _spi_isr( unsigned int irq_type, | 
|---|
| 54 | unsigned int irq_id, | 
|---|
| 55 | unsigned int channel ); | 
|---|
| 56 |  | 
|---|
| 57 | /////////////////////////////////////////////////////////////////////////////// | 
|---|
| 58 | // SPI macros and constants | 
|---|
| 59 | /////////////////////////////////////////////////////////////////////////////// | 
|---|
| 60 | #define SPI_TX_POSEDGE         1           // MOSI is changed on neg edge | 
|---|
| 61 | #define SPI_TX_NEGEDGE         0           // MOSI is changed on pos edge | 
|---|
| 62 | #define SPI_RX_POSEDGE         1           // MISO is latched on pos edge | 
|---|
| 63 | #define SPI_RX_NEGEDGE         0           // MISO is latched on neg edge | 
|---|
| 64 |  | 
|---|
| 65 | #define SPI_CTRL_ASS_EN        ( 1 << 13 ) // Auto Slave Sel Assertion | 
|---|
| 66 | #define SPI_CTRL_IE_EN         ( 1 << 12 ) // Interrupt Enable | 
|---|
| 67 | #define SPI_CTRL_LSB_EN        ( 1 << 11 ) // LSB are sent first | 
|---|
| 68 | #define SPI_CTRL_TXN_EN        ( 1 << 10 ) // MOSI is changed on neg edge | 
|---|
| 69 | #define SPI_CTRL_RXN_EN        ( 1 << 9  ) // MISO is latched on neg edge | 
|---|
| 70 | #define SPI_CTRL_GO_BSY        ( 1 << 8  ) // Start the transfer | 
|---|
| 71 | #define SPI_CTRL_DMA_BSY       ( 1 << 16 ) // DMA in progress | 
|---|
| 72 | #define SPI_CTRL_CHAR_LEN_MASK (  0xFF   ) // Bits transmited in 1 transfer | 
|---|
| 73 | #define SPI_RXTX_MASK          (  0xFF   ) // Mask for the an RX/TX value | 
|---|
| 74 |  | 
|---|
| 75 | #define SPI_DMA_COUNT_READ     ( 1 << 0  ) // operation is a read (else write) | 
|---|
| 76 |  | 
|---|
| 77 | /////////////////////////////////////////////////////////////////////////////// | 
|---|
| 78 | //      SPI_IS_BUSY() | 
|---|
| 79 | // This macro checks the GO_BSY and DMA_BSY bits of the SPI controller which | 
|---|
| 80 | // indicates an ongoing transfer. | 
|---|
| 81 | // | 
|---|
| 82 | // Returns 1 if there is an unfinished transfer | 
|---|
| 83 | /////////////////////////////////////////////////////////////////////////////// | 
|---|
| 84 | #define SPI_IS_BUSY(x) \ | 
|---|
| 85 | ((ioread32(&x->ctrl) & (SPI_CTRL_GO_BSY|SPI_CTRL_DMA_BSY)) != 0) ? 1 : 0 | 
|---|
| 86 |  | 
|---|
| 87 | #endif | 
|---|
| 88 |  | 
|---|
| 89 | // Local Variables: | 
|---|
| 90 | // tab-width: 4 | 
|---|
| 91 | // c-basic-offset: 4 | 
|---|
| 92 | // c-file-offsets:((innamespace . 0)(inline-open . 0)) | 
|---|
| 93 | // indent-tabs-mode: nil | 
|---|
| 94 | // End: | 
|---|
| 95 | // vim: filetype=c:expandtab:shiftwidth=4:tabstop=4:softtabstop=4 | 
|---|