Library to access LPC17xx peripherals. It uses static inline functions, constant propagation and dead code elimination to be as fast as possible.
Dependents: Chua-VGA Wolfram-1D-VGA WolframRnd-1D-VGA Basin-VGA ... more
i2s.h@0:7a91348b4a02, 2011-07-03 (annotated)
- Committer:
- Ivop
- Date:
- Sun Jul 03 17:11:55 2011 +0000
- Revision:
- 0:7a91348b4a02
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Ivop | 0:7a91348b4a02 | 1 | /* Copyright (C) 2010, 2011 by Ivo van Poorten <ivop@euronet.nl> |
Ivop | 0:7a91348b4a02 | 2 | * This file is licensed under the terms of the GNU Lesser |
Ivop | 0:7a91348b4a02 | 3 | * General Public License, version 3. |
Ivop | 0:7a91348b4a02 | 4 | */ |
Ivop | 0:7a91348b4a02 | 5 | |
Ivop | 0:7a91348b4a02 | 6 | #ifndef FASTLIB_I2S_H |
Ivop | 0:7a91348b4a02 | 7 | #define FASTLIB_I2S_H |
Ivop | 0:7a91348b4a02 | 8 | |
Ivop | 0:7a91348b4a02 | 9 | #include "fastlib/common.h" |
Ivop | 0:7a91348b4a02 | 10 | |
Ivop | 0:7a91348b4a02 | 11 | /* important: in mono mode, each word is transmitted twice(!) */ |
Ivop | 0:7a91348b4a02 | 12 | |
Ivop | 0:7a91348b4a02 | 13 | #define FL_I2SDAO ((volatile uint32_t *) 0x400A8000) |
Ivop | 0:7a91348b4a02 | 14 | #define FL_I2SDAI ((volatile uint32_t *) 0x400A8004) |
Ivop | 0:7a91348b4a02 | 15 | #define FL_I2STXFIFO ((volatile uint32_t *) 0x400A8008) |
Ivop | 0:7a91348b4a02 | 16 | #define FL_I2SRXFIFO ((volatile uint32_t *) 0x400A800C) |
Ivop | 0:7a91348b4a02 | 17 | #define FL_I2SSTATE ((volatile uint32_t *) 0x400A8010) |
Ivop | 0:7a91348b4a02 | 18 | #define FL_I2SDMA1 ((volatile uint32_t *) 0x400A8014) |
Ivop | 0:7a91348b4a02 | 19 | #define FL_I2SDMA2 ((volatile uint32_t *) 0x400A8018) |
Ivop | 0:7a91348b4a02 | 20 | #define FL_I2SIRQ ((volatile uint32_t *) 0x400A801C) |
Ivop | 0:7a91348b4a02 | 21 | #define FL_I2STXRATE ((volatile uint32_t *) 0x400A8020) |
Ivop | 0:7a91348b4a02 | 22 | #define FL_I2SRXRATE ((volatile uint32_t *) 0x400A8024) |
Ivop | 0:7a91348b4a02 | 23 | #define FL_I2STXBITRATE ((volatile uint32_t *) 0x400A8028) |
Ivop | 0:7a91348b4a02 | 24 | #define FL_I2SRXBITRATE ((volatile uint32_t *) 0x400A802C) |
Ivop | 0:7a91348b4a02 | 25 | #define FL_I2STXMODE ((volatile uint32_t *) 0x400A8030) |
Ivop | 0:7a91348b4a02 | 26 | #define FL_I2SRXMODE ((volatile uint32_t *) 0x400A8034) |
Ivop | 0:7a91348b4a02 | 27 | |
Ivop | 0:7a91348b4a02 | 28 | static inline void fl_i2s_output_set_config(const unsigned width, const unsigned mono, const unsigned halfperiod, |
Ivop | 0:7a91348b4a02 | 29 | const unsigned stop, const unsigned reset, const unsigned mute, const unsigned slave) { |
Ivop | 0:7a91348b4a02 | 30 | *FL_I2SDAO = width | (mono<<2) | ((halfperiod-1)<<6) | (stop<<3) | (reset<<4) | (mute<<15) | (slave<<5); |
Ivop | 0:7a91348b4a02 | 31 | } |
Ivop | 0:7a91348b4a02 | 32 | |
Ivop | 0:7a91348b4a02 | 33 | static inline unsigned fl_i2s_output_get_config(void) { |
Ivop | 0:7a91348b4a02 | 34 | return *FL_I2SDAO; |
Ivop | 0:7a91348b4a02 | 35 | } |
Ivop | 0:7a91348b4a02 | 36 | |
Ivop | 0:7a91348b4a02 | 37 | static inline void fl_i2s_input_set_config(const unsigned width, const unsigned mono, const unsigned halfperiod, |
Ivop | 0:7a91348b4a02 | 38 | const unsigned stop, const unsigned reset, const unsigned mute, const unsigned slave) { |
Ivop | 0:7a91348b4a02 | 39 | *FL_I2SDAI = width | (mono<<2) | ((halfperiod-1)<<6) | (stop<<3) | (reset<<4) | (mute<<15) | (slave<<5); |
Ivop | 0:7a91348b4a02 | 40 | } |
Ivop | 0:7a91348b4a02 | 41 | |
Ivop | 0:7a91348b4a02 | 42 | static inline unsigned fl_i2s_input_get_config(void) { |
Ivop | 0:7a91348b4a02 | 43 | return *FL_I2SDAI; |
Ivop | 0:7a91348b4a02 | 44 | } |
Ivop | 0:7a91348b4a02 | 45 | |
Ivop | 0:7a91348b4a02 | 46 | static inline void fl_i2s_write_tx_fifo(const unsigned value) { |
Ivop | 0:7a91348b4a02 | 47 | *FL_I2STXFIFO = value; |
Ivop | 0:7a91348b4a02 | 48 | } |
Ivop | 0:7a91348b4a02 | 49 | |
Ivop | 0:7a91348b4a02 | 50 | static inline unsigned fl_i2s_read_rx_fifo(void) { |
Ivop | 0:7a91348b4a02 | 51 | return *FL_I2SRXFIFO; |
Ivop | 0:7a91348b4a02 | 52 | } |
Ivop | 0:7a91348b4a02 | 53 | |
Ivop | 0:7a91348b4a02 | 54 | static inline unsigned fl_i2s_status_irq(void) { |
Ivop | 0:7a91348b4a02 | 55 | return *FL_I2SSTATE & (1U<<0); |
Ivop | 0:7a91348b4a02 | 56 | } |
Ivop | 0:7a91348b4a02 | 57 | |
Ivop | 0:7a91348b4a02 | 58 | static inline unsigned fl_i2s_status_dmareq1(void) { |
Ivop | 0:7a91348b4a02 | 59 | return *FL_I2SSTATE & (1U<<1); |
Ivop | 0:7a91348b4a02 | 60 | } |
Ivop | 0:7a91348b4a02 | 61 | |
Ivop | 0:7a91348b4a02 | 62 | static inline unsigned fl_i2s_status_dmareq2(void) { |
Ivop | 0:7a91348b4a02 | 63 | return *FL_I2SSTATE & (1U<<2); |
Ivop | 0:7a91348b4a02 | 64 | } |
Ivop | 0:7a91348b4a02 | 65 | |
Ivop | 0:7a91348b4a02 | 66 | static inline unsigned fl_i2s_get_rx_level(void) { |
Ivop | 0:7a91348b4a02 | 67 | return (*FL_I2SSTATE >> 8) & 15; |
Ivop | 0:7a91348b4a02 | 68 | } |
Ivop | 0:7a91348b4a02 | 69 | |
Ivop | 0:7a91348b4a02 | 70 | static inline unsigned fl_i2s_get_tx_level(void) { |
Ivop | 0:7a91348b4a02 | 71 | return (*FL_I2SSTATE >> 16) & 15; |
Ivop | 0:7a91348b4a02 | 72 | } |
Ivop | 0:7a91348b4a02 | 73 | |
Ivop | 0:7a91348b4a02 | 74 | /* rx/tx_state: 0-1 rx/tx-level: 0-15 */ |
Ivop | 0:7a91348b4a02 | 75 | static inline void fl_i2s_config_dma1(const unsigned rx_state, const unsigned tx_state, const unsigned rx_level, const unsigned tx_level) { |
Ivop | 0:7a91348b4a02 | 76 | *FL_I2SDMA1 = rx_state | (tx_state<<1) | (rx_level<<8) | (tx_level<<16); |
Ivop | 0:7a91348b4a02 | 77 | } |
Ivop | 0:7a91348b4a02 | 78 | static inline void fl_i2s_config_dma2(const unsigned rx_state, const unsigned tx_state, const unsigned rx_level, const unsigned tx_level) { |
Ivop | 0:7a91348b4a02 | 79 | *FL_I2SDMA2 = rx_state | (tx_state<<1) | (rx_level<<8) | (tx_level<<16); |
Ivop | 0:7a91348b4a02 | 80 | } |
Ivop | 0:7a91348b4a02 | 81 | |
Ivop | 0:7a91348b4a02 | 82 | /* rx/tx_irq: 0-1 */ |
Ivop | 0:7a91348b4a02 | 83 | static inline void fl_i2s_config_irq(const unsigned rx_irq, const unsigned tx_irq, const unsigned rx_level, const unsigned tx_level) { |
Ivop | 0:7a91348b4a02 | 84 | *FL_I2SIRQ = rx_irq | (tx_irq<<1) | (rx_level<<8) | (tx_level<<16); |
Ivop | 0:7a91348b4a02 | 85 | } |
Ivop | 0:7a91348b4a02 | 86 | |
Ivop | 0:7a91348b4a02 | 87 | /* tx rate = PCLK_I2S * (X/Y) / 2 X and Y: 1-255 (0=no clock) */ |
Ivop | 0:7a91348b4a02 | 88 | static inline void fl_i2s_set_tx_rate(const unsigned X, const unsigned Y) { |
Ivop | 0:7a91348b4a02 | 89 | *FL_I2STXRATE = Y | (X<<8); |
Ivop | 0:7a91348b4a02 | 90 | } |
Ivop | 0:7a91348b4a02 | 91 | static inline void fl_i2s_set_rx_rate(const unsigned X, const unsigned Y) { |
Ivop | 0:7a91348b4a02 | 92 | *FL_I2SRXRATE = Y | (X<<8); |
Ivop | 0:7a91348b4a02 | 93 | } |
Ivop | 0:7a91348b4a02 | 94 | |
Ivop | 0:7a91348b4a02 | 95 | /* bitrate: 1-32 */ |
Ivop | 0:7a91348b4a02 | 96 | static inline void fl_i2s_set_tx_bitrate(const unsigned bitrate) { |
Ivop | 0:7a91348b4a02 | 97 | *FL_I2STXBITRATE = bitrate-1; |
Ivop | 0:7a91348b4a02 | 98 | } |
Ivop | 0:7a91348b4a02 | 99 | static inline void fl_i2s_set_rx_bitrate(const unsigned bitrate) { |
Ivop | 0:7a91348b4a02 | 100 | *FL_I2SRXBITRATE = bitrate-1; |
Ivop | 0:7a91348b4a02 | 101 | } |
Ivop | 0:7a91348b4a02 | 102 | |
Ivop | 0:7a91348b4a02 | 103 | #define FL_TX_FRACTIONAL_RATE_DIVIDER 0 |
Ivop | 0:7a91348b4a02 | 104 | #define FL_TX_USE_RX_CLOCK 1 |
Ivop | 0:7a91348b4a02 | 105 | |
Ivop | 0:7a91348b4a02 | 106 | static inline void fl_i2s_tx_mode_clock(const unsigned tx_clock) { |
Ivop | 0:7a91348b4a02 | 107 | if (tx_clock) *FL_I2STXMODE |= 1U<<1; |
Ivop | 0:7a91348b4a02 | 108 | else *FL_I2STXMODE &= ~(1U<<1); |
Ivop | 0:7a91348b4a02 | 109 | } |
Ivop | 0:7a91348b4a02 | 110 | |
Ivop | 0:7a91348b4a02 | 111 | #define FL_RX_FRACTIONAL_RATE_DIVIDER 0 |
Ivop | 0:7a91348b4a02 | 112 | #define FL_RX_USE_TX_CLOCK 1 |
Ivop | 0:7a91348b4a02 | 113 | |
Ivop | 0:7a91348b4a02 | 114 | static inline void fl_i2s_rx_mode_clock(const unsigned rx_clock) { |
Ivop | 0:7a91348b4a02 | 115 | if (rx_clock) *FL_I2SRXMODE |= 1U<<1; |
Ivop | 0:7a91348b4a02 | 116 | else *FL_I2SRXMODE &= ~(1U<<1); |
Ivop | 0:7a91348b4a02 | 117 | } |
Ivop | 0:7a91348b4a02 | 118 | |
Ivop | 0:7a91348b4a02 | 119 | static inline void fl_i2s_tx_mode_4pin(const unsigned state) { |
Ivop | 0:7a91348b4a02 | 120 | if (state) *FL_I2STXMODE |= 1U<<2; |
Ivop | 0:7a91348b4a02 | 121 | else *FL_I2STXMODE &= ~(1U<<2); |
Ivop | 0:7a91348b4a02 | 122 | } |
Ivop | 0:7a91348b4a02 | 123 | |
Ivop | 0:7a91348b4a02 | 124 | static inline void fl_i2s_rx_mode_4pin(const unsigned state) { |
Ivop | 0:7a91348b4a02 | 125 | if (state) *FL_I2SRXMODE |= 1U<<2; |
Ivop | 0:7a91348b4a02 | 126 | else *FL_I2SRXMODE &= ~(1U<<2); |
Ivop | 0:7a91348b4a02 | 127 | } |
Ivop | 0:7a91348b4a02 | 128 | |
Ivop | 0:7a91348b4a02 | 129 | static inline void fl_i2s_tx_clock_output(const unsigned state) { |
Ivop | 0:7a91348b4a02 | 130 | if (state) *FL_I2STXMODE |= 1U<<3; |
Ivop | 0:7a91348b4a02 | 131 | else *FL_I2STXMODE &= ~(1U<<3); |
Ivop | 0:7a91348b4a02 | 132 | } |
Ivop | 0:7a91348b4a02 | 133 | |
Ivop | 0:7a91348b4a02 | 134 | static inline void fl_i2s_rx_clock_output(const unsigned state) { |
Ivop | 0:7a91348b4a02 | 135 | if (state) *FL_I2SRXMODE |= 1U<<3; |
Ivop | 0:7a91348b4a02 | 136 | else *FL_I2SRXMODE &= ~(1U<<3); |
Ivop | 0:7a91348b4a02 | 137 | } |
Ivop | 0:7a91348b4a02 | 138 | |
Ivop | 0:7a91348b4a02 | 139 | #endif |