Very big update according to API documented for LPC122x and LPC82x micro-controllers
[lpc11u3x] / include / drivers / adc.h
1 /****************************************************************************
2  *  drivers/adc.h
3  *
4  * Copyright 2012 Nathael Pajani <nathael.pajani@ed3l.fr>
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  *
19  *************************************************************************** */
21 #ifndef DRIVERS_ADC_H
22 #define DRIVERS_ADC_H
26 #include "lib/stdint.h"
27 #include "core/lpc_regs.h"
29 /***************************************************************************** */
30 /*                Analog to Digital Converter (ADC)                            */
31 /***************************************************************************** */
33 /* ADC driver for the integrated ADC module of the LPC11u3x.
34  * Refer to LPC11u3x documentation (UM10462.pdf) for more information.
35  */
37 #define NB_ADC_CHANNELS  8
38 #define NB_ADC_SEQUENCES 1
40 #define LPC_ADC_SEQ(x)  0
43 /* Read the conversion from the given channel
44  * This function reads the conversion value directly in the data register and
45  * always returns a value.
46  * Return 0 if the value is a new one and no overrun occured.
47  * Return -EINVAL if channel does not exist
48  * Retuen 1 if the value is an old one
49  * Return 2 if an overrun occured
50  */
51 int adc_get_value(uint16_t * val, uint8_t channel);
53 /* Start a conversion on the given channel (0 to 7)
54  * Unsupported yet : Set use_int to 1 to have your interrupt callback called upon conversion done.
55  */
56 void adc_start_convertion_once(uint8_t channel, uint8_t seq_num, uint8_t use_int);
58 /* Start burst conversions.
59  * channels is a bit mask of requested channels.
60  * Use ADC_MCH(x) (x = 0 .. 7) for channels selection.
61  */
62 void adc_start_burst_conversion(uint16_t channels, uint8_t seq_num);
63 void adc_stop_burst_conversion(uint8_t seq_num);
66 enum lpc_adc_start_conv_events {
67         LPC_ADC_START_CONV_EDGE_CT16B0_CAP0 = 2,
68         LPC_ADC_START_CONV_EDGE_CT32B0_CAP0,
69         LPC_ADC_START_CONV_EDGE_CT32B0_MAT0,
70         LPC_ADC_START_CONV_EDGE_CT32B0_MAT1,
71         LPC_ADC_START_CONV_EDGE_CT16B0_MAT0,
72         LPC_ADC_START_CONV_EDGE_CT16B0_MAT1,
73 };
74 /* This should be used to configure conversion start on falling or rising edges of
75  * some signals, or on timer for burst conversions.
76  */
77 void adc_prepare_conversion_on_event(uint16_t channels, uint8_t seq_num, uint8_t event,
78                                                                                 uint8_t use_int, uint32_t mode);
80 /* Software trigger of the given configured sequence.
81  * Note : If the sequence was configured for triggering on an external event, it won't be anymore.
82  */
83 void adc_trigger_sequence_conversion(uint8_t seq_num);
86 /***************************************************************************** */
87 /*   ADC Setup : private part : Clocks, Pins, Power and Mode   */
88 void adc_on(void (*adc_callback)(uint32_t));
89 void adc_off(void);
91 /* Change The ADC resolution.
92  * Use defines from lpc_regs_11xx.h to specify the bit width for the convertion.
93  * Ranges from LPC_ADC_3BITS to LPC_ADC_10BITS.
94  */
95 int adc_set_resolution(int bits);
98 /***************************************************************************** */
99 /*                     Analog-to-Digital Converter                             */
100 /***************************************************************************** */
101 /* Analog-to-Digital Converter (ADC) */
102 struct lpc_adc
104         volatile uint32_t ctrl;         /* 0x000 : A/D Control Register (R/W) */
105         volatile uint32_t global_data;  /* 0x004 : A/D Global Data Register (R/W) */
106         uint32_t reserved_0;
107         volatile uint32_t int_en;  /* 0x00C : A/D Interrupt Enable Register (R/W) */
108         volatile uint32_t data[8]; /* Offset: 0x010-0x02C A/D Channel 0..7 Data Register (R/W) */
109         volatile const uint32_t status; /* 0x030 : A/D Status Register (R/ ) */
110 };
111 #define LPC_ADC_REGS      ((struct lpc_adc *) LPC_ADC_BASE)
113 /* ADC Control register bits */
114 #define LPC_ADC_CTRL_MASK  0x0F01FFFF
115 /* ADC_MCH_* are also used for interrupt register */
116 #define ADC_MCH_MASK    (0xFF << 0)
117 #define ADC_MCH(x)      (0x01 << ((x) & 0x07))
118 #define LPC_ADC_BURST   (0x01 << 16)
120 #define LPC_ADC_10BITS  (0x00 << 17)
121 #define LPC_ADC_9BITS   (0x01 << 17)
122 #define LPC_ADC_8BITS   (0x02 << 17)
123 #define LPC_ADC_7BITS   (0x03 << 17)
124 #define LPC_ADC_6BITS   (0x04 << 17)
125 #define LPC_ADC_5BITS   (0x05 << 17)
126 #define LPC_ADC_4BITS   (0x06 << 17)
127 #define LPC_ADC_3BITS   (0x07 << 17)
128 #define LPC_ADC_BITS_MASK  (0x07 << 17)
131 #define LPC_ADC_START_CONV_MASK (0x07 << 24)
132 #define LPC_ADC_START_CONV_NOW  (0x01 << 24)
133 #define LPC_ADC_START_CONV_EVENT(x) (((x) & 0x7) << 24)
134 #define LPC_ADC_START_EDGE_FALLING  (0x1 << 27)
135 #define LPC_ADC_START_EDGE_RISING   (0x0 << 27)
136 #define LPC_ADC_ADDITIONAL_MODE_MASK (0x1 << 27)
138 /* ADC Data register bits */
139 #define LPC_ADC_RESULT_SHIFT  6
140 #define LPC_ADC_RESULT_MASK   0x3FF
141 #define LPC_ADC_OVERRUN    (0x01 << 30)
142 #define LPC_ADC_CONV_DONE  (0x01 << 31)
144 /* For more readability when selecting a channel number */
145 #define LPC_ADC(x)    (x)
148 #endif /* DRIVERS_ADC_H */