]> git.sur5r.net Git - freertos/blob - FreeRTOS/Demo/CORTEX_AT91SAM3U256_IAR/AT91Lib/peripherals/pio/pio.h
Add FreeRTOS-Plus directory.
[freertos] / FreeRTOS / Demo / CORTEX_AT91SAM3U256_IAR / AT91Lib / peripherals / pio / pio.h
1 /* ----------------------------------------------------------------------------\r
2  *         ATMEL Microcontroller Software Support \r
3  * ----------------------------------------------------------------------------\r
4  * Copyright (c) 2008, Atmel Corporation\r
5  *\r
6  * All rights reserved.\r
7  *\r
8  * Redistribution and use in source and binary forms, with or without\r
9  * modification, are permitted provided that the following conditions are met:\r
10  *\r
11  * - Redistributions of source code must retain the above copyright notice,\r
12  * this list of conditions and the disclaimer below.\r
13  *\r
14  * Atmel's name may not be used to endorse or promote products derived from\r
15  * this software without specific prior written permission.\r
16  *\r
17  * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR\r
18  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\r
19  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE\r
20  * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,\r
21  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\r
22  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,\r
23  * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
24  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
25  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,\r
26  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
27  * ----------------------------------------------------------------------------\r
28  */\r
29 \r
30 //------------------------------------------------------------------------------\r
31 /// \unit\r
32 ///\r
33 /// !!!Purpose\r
34 /// \r
35 /// This file provides a basic API for PIO configuration and usage of\r
36 /// user-controlled pins. Please refer to the board.h file for a list of\r
37 /// available pin definitions.\r
38 /// \r
39 /// !!!Usage\r
40 /// \r
41 /// -# Define a constant pin description array such as the following one, using\r
42 ///    the existing definitions provided by the board.h file if possible:\r
43 ///    \code\r
44 ///       const Pin pPins[] = {PIN_USART0_TXD, PIN_USART0_RXD};\r
45 ///    \endcode\r
46 ///    Alternatively, it is possible to add new pins by provided the full Pin\r
47 ///    structure:\r
48 ///    \code\r
49 ///    // Pin instance to configure PA10 & PA11 as inputs with the internal\r
50 ///    // pull-up enabled.\r
51 ///    const Pin pPins = {\r
52 ///         (1 << 10) | (1 << 11),\r
53 ///         AT91C_BASE_PIOA,\r
54 ///         AT91C_ID_PIOA,\r
55 ///         PIO_INPUT,\r
56 ///         PIO_PULLUP\r
57 ///    };\r
58 ///    \endcode\r
59 /// -# Configure a pin array by calling PIO_Configure() with a pointer to the\r
60 ///    array and its size (which is computed using the PIO_LISTSIZE macro).\r
61 /// -# Change and get the value of a user-controlled pin using the PIO_Set,\r
62 ///    PIO_Clear and PIO_Get methods.\r
63 /// -# Get the level being currently output by a user-controlled pin configured\r
64 ///    as an output using PIO_GetOutputDataStatus().\r
65 //------------------------------------------------------------------------------\r
66  \r
67 #ifndef PIO_H\r
68 #define PIO_H\r
69 \r
70 //------------------------------------------------------------------------------\r
71 //         Headers\r
72 //------------------------------------------------------------------------------\r
73 \r
74 #include <board.h>\r
75 \r
76 //------------------------------------------------------------------------------\r
77 //         Global Definitions\r
78 //------------------------------------------------------------------------------\r
79 \r
80 /// The pin is controlled by the associated signal of peripheral A.\r
81 #define PIO_PERIPH_A                0\r
82 /// The pin is controlled by the associated signal of peripheral B.\r
83 #define PIO_PERIPH_B                1\r
84 /// The pin is an input.\r
85 #define PIO_INPUT                   2\r
86 /// The pin is an output and has a default level of 0.\r
87 #define PIO_OUTPUT_0                3\r
88 /// The pin is an output and has a default level of 1.\r
89 #define PIO_OUTPUT_1                4\r
90 \r
91 /// Default pin configuration (no attribute).\r
92 #define PIO_DEFAULT                 (0 << 0)\r
93 /// The internal pin pull-up is active.\r
94 #define PIO_PULLUP                  (1 << 0)\r
95 /// The internal glitch filter is active.\r
96 #define PIO_DEGLITCH                (1 << 1)\r
97 /// The pin is open-drain.\r
98 #define PIO_OPENDRAIN               (1 << 2)\r
99 \r
100 //------------------------------------------------------------------------------\r
101 //         Global Macros\r
102 //------------------------------------------------------------------------------\r
103 \r
104 //------------------------------------------------------------------------------\r
105 /// Calculates the size of an array of Pin instances. The array must be defined\r
106 /// locally (i.e. not a pointer), otherwise the computation will not be correct.\r
107 /// \param pPins  Local array of Pin instances.\r
108 /// \return Number of elements in array.\r
109 //------------------------------------------------------------------------------\r
110 #define PIO_LISTSIZE(pPins)    (sizeof(pPins) / sizeof(Pin))\r
111 \r
112 //------------------------------------------------------------------------------\r
113 //         Global Types\r
114 //------------------------------------------------------------------------------\r
115 typedef struct _ExtIntMode {\r
116   ///indicate which pin to enable/disable additional Interrupt mode\r
117   ///each of 32 bit field represents one PIO line.\r
118   unsigned int itMask;\r
119   ///select Edge or level interrupt detection source\r
120   ///each of 32 bit field represents one PIO line, 0 is Edge, 1 is Level\r
121   unsigned int edgeLvlSel;\r
122   ///select rising/high or falling/low detection event\r
123   ///each of 32 bit field represents one PIO line:\r
124   ///0 is Falling Edge detection event (if selected Edge interrupt \r
125   ///   detection source, or Low Level detection (if selected\r
126   ///   Level interrupt detection source;\r
127   ///1 is Rising Edge detection(if selected Edge interrupt \r
128   ///   source, or Low Level detection event(if selected Level\r
129   ///   interrupt detection source.\r
130   unsigned int lowFallOrRiseHighSel;\r
131 \r
132 } ExtIntMode;\r
133 \r
134 typedef struct _GlitchDeBounceFilter {\r
135   ///Select Glitch/Debounce filtering for PIO input\r
136   ///each of 32 bit field represents one PIO line\r
137   ///0 is Glitch, 1 is Debouncing\r
138   unsigned int filterSel;\r
139   ///slow clock divider selection for Debouncing filter\r
140   unsigned int clkDivider:14;\r
141 \r
142 } GlitchDebounceFilter;\r
143 \r
144 //------------------------------------------------------------------------------\r
145 /// Describes the type and attribute of one PIO pin or a group of similar pins.\r
146 /// The #type# field can have the following values:\r
147 ///    - PIO_PERIPH_A\r
148 ///    - PIO_PERIPH_B\r
149 ///    - PIO_OUTPUT_0\r
150 ///    - PIO_OUTPUT_1\r
151 ///    - PIO_INPUT\r
152 ///\r
153 /// The #attribute# field is a bitmask that can either be set to PIO_DEFAULt,\r
154 /// or combine (using bitwise OR '|') any number of the following constants:\r
155 ///    - PIO_PULLUP\r
156 ///    - PIO_DEGLITCH\r
157 ///    - PIO_OPENDRAIN\r
158 //------------------------------------------------------------------------------\r
159 typedef struct {\r
160 \r
161     /// Bitmask indicating which pin(s) to configure.\r
162     unsigned int mask; \r
163     /// Pointer to the PIO controller which has the pin(s).\r
164     AT91S_PIO    *pio;\r
165     /// Peripheral ID of the PIO controller which has the pin(s).\r
166     unsigned char id;\r
167     /// Pin type.\r
168     unsigned char type;\r
169     /// Pin attribute.\r
170     unsigned char attribute;\r
171 #if defined(AT91C_PIOA_AIMMR)\r
172     ///Additional Interrupt Mode\r
173     ExtIntMode itMode;\r
174 #endif\r
175 \r
176 #if defined(AT91C_PIOA_IFDGSR)\r
177     ///Glitch/Debouncing filter\r
178     GlitchDebounceFilter inFilter;\r
179 #endif\r
180 \r
181 } Pin;\r
182 \r
183 //------------------------------------------------------------------------------\r
184 //         Global Access Macros \r
185 //------------------------------------------------------------------------------\r
186 \r
187 //Get Glitch input filter enable/disable status\r
188 #define PIO_GetIFSR(pPin)       ((pPin)->pio->PIO_IFSR)\r
189 \r
190 //Get Glitch/Deboucing selection status\r
191 #define PIO_GetIFDGSR(pPin) ((pPin)->pio->PIO_IFDGSR)\r
192 \r
193 //Get Additional PIO interrupt mode mask status\r
194 #define PIO_GetAIMMR(pPin)  ((pPin)->pio->PIO_AIMMR)\r
195 \r
196 //Get Interrupt status\r
197 #define PIO_GetISR(pPin)        ((pPin)->pio->PIO_ISR)\r
198 \r
199 //Get Edge or Level selection status\r
200 #define PIO_GetELSR(pPin)       ((pPin)->pio->PIO_ELSR)\r
201 \r
202 //Get Fall/Rise or Low/High selection status\r
203 #define PIO_GetFRLHSR(pPin)     ((pPin)->pio->PIO_FRLHSR)\r
204 \r
205 //Get PIO Lock Status\r
206 #define PIO_GetLockStatus(pPin) ((pPin)->pio->PIO_LOCKSR)\r
207 \r
208 //------------------------------------------------------------------------------\r
209 //         Global Functions\r
210 //------------------------------------------------------------------------------\r
211 \r
212 extern unsigned char PIO_Configure(const Pin *list, unsigned int size);\r
213 \r
214 extern void PIO_Set(const Pin *pin);\r
215 \r
216 extern void PIO_Clear(const Pin *pin);\r
217 \r
218 extern unsigned char PIO_Get(const Pin *pin);\r
219 \r
220 //extern unsigned int PIO_GetISR(const Pin *pin);\r
221 \r
222 extern unsigned char PIO_GetOutputDataStatus(const Pin *pin);\r
223 \r
224 #endif //#ifndef PIO_H\r
225 \r