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

Committer:
Ivop
Date:
Wed Jan 04 01:42:56 2012 +0000
Revision:
2:148b9af2b336
Parent:
0:7a91348b4a02
fixed bug in fl_uart_send_byte. thanks to smayr for finding it

Who changed what in which revision?

UserRevisionLine numberNew 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