]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - packages/devs/serial/arm/lpc24xx/v2_0/include/arm_lpc24xx_ser.inl
Initial revision
[karo-tx-redboot.git] / packages / devs / serial / arm / lpc24xx / v2_0 / include / arm_lpc24xx_ser.inl
1 //==========================================================================
2 //
3 //      io/serial/arm/arm_lpc24xx_ser.inl
4 //
5 //      ARM LPC24XX Serial I/O definitions
6 //
7 //==========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
12 // Copyright (C) 2004 eCosCentric Limited 
13 //
14 // eCos is free software; you can redistribute it and/or modify it under
15 // the terms of the GNU General Public License as published by the Free
16 // Software Foundation; either version 2 or (at your option) any later version.
17 //
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
20 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
21 // for more details.
22 //
23 // You should have received a copy of the GNU General Public License along
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
26 //
27 // As a special exception, if other files instantiate templates or use macros
28 // or inline functions from this file, or you compile this file and link it
29 // with other works to produce a work based on this file, this file does not
30 // by itself cause the resulting work to be covered by the GNU General Public
31 // License. However the source code for this file must still be made available
32 // in accordance with section (3) of the GNU General Public License.
33 //
34 // This exception does not invalidate any other reasons why a work based on
35 // this file might be covered by the GNU General Public License.
36 // -------------------------------------------
37 //####ECOSGPLCOPYRIGHTEND####
38 //==========================================================================
39 //#####DESCRIPTIONBEGIN####
40 //
41 // Author(s):    Uwe Kindler
42 // Contributors: gthomas, jlarmour
43 // Date:         2008-06-07
44 // Purpose:      LPC24XX Serial I/O module (interrupt driven version)
45 // Description: 
46 //
47 //####DESCRIPTIONEND####
48 //
49 //==========================================================================
50
51
52 //==========================================================================
53 //                               INCLUDES
54 //==========================================================================
55 #include <cyg/hal/hal_intr.h>
56 #include <cyg/hal/lpc24xx_misc.h>
57
58
59 //==========================================================================
60 //                              STATIC DATA
61 //==========================================================================
62 // Baud rate specification
63 static const unsigned int select_baud[] = 
64 {
65     9999,    // Unused
66     50,
67     75,
68     110,
69     134.5,
70     150,
71     200,
72     300,
73     600,
74     1200,
75     1800,
76     2400,
77     3600,
78     4800,
79     7200,
80     9600,
81     14400,
82     19200,
83     38400,
84     57600,
85     115200,
86     230400
87 };
88
89
90 //==========================================================================
91 // Return baudrate devisor for certain baudrate
92 //==========================================================================
93 unsigned short lpc24xx_baud_generator(pc_serial_info         *ser_chan, 
94                                       cyg_serial_baud_rate_t  baud)
95 {
96     cyg_uint8 pclk_id = CYNUM_HAL_LPC24XX_PCLK_UART0;
97     switch (ser_chan->base)
98     {
99         case CYGARC_HAL_LPC24XX_REG_UART0_BASE:
100              pclk_id = CYNUM_HAL_LPC24XX_PCLK_UART0;
101              break;
102              
103         case CYGARC_HAL_LPC24XX_REG_UART1_BASE:
104              pclk_id = CYNUM_HAL_LPC24XX_PCLK_UART1;
105              break;
106              
107         case CYGARC_HAL_LPC24XX_REG_UART2_BASE:
108              pclk_id = CYNUM_HAL_LPC24XX_PCLK_UART2;
109              break;
110              
111         case CYGARC_HAL_LPC24XX_REG_UART3_BASE:
112              pclk_id = CYNUM_HAL_LPC24XX_PCLK_UART3;
113              break;
114              
115         default:
116             CYG_FAIL("Invalid UART base address");
117     } // (ser_chan->base)
118     
119     return CYG_HAL_ARM_LPC24XX_BAUD_GENERATOR(pclk_id, select_baud[baud]); 
120 }
121
122
123 #define CYG_IO_SERIAL_GENERIC_16X5X_CHAN_BAUD_GENERATOR(_ser_chan_, _baud_) \
124         lpc24xx_baud_generator((_ser_chan_), (_baud_))
125
126
127
128 //==========================================================================
129 //                          SERIAL CHANNEL 0
130 //==========================================================================
131 #ifdef CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL0
132 static pc_serial_info lpc24xx_serial_info0 = 
133
134     CYGARC_HAL_LPC24XX_REG_UART0_BASE,
135     CYGNUM_HAL_INTERRUPT_UART0,
136     CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL0_INTPRIO
137 };
138
139 #if CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL0_BUFSIZE > 0
140 static unsigned char 
141 lpc24xx_serial_out_buf0[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL0_BUFSIZE];
142 static unsigned char 
143 lpc24xx_serial_in_buf0[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL0_BUFSIZE];
144
145 static SERIAL_CHANNEL_USING_INTERRUPTS(lpc24xx_serial_channel0,
146                                        pc_serial_funs, 
147                                        lpc24xx_serial_info0,
148                                        CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL0_BAUD),
149                                        CYG_SERIAL_STOP_DEFAULT,
150                                        CYG_SERIAL_PARITY_DEFAULT,
151                                        CYG_SERIAL_WORD_LENGTH_DEFAULT,
152                                        CYG_SERIAL_FLAGS_DEFAULT,
153                                        &lpc24xx_serial_out_buf0[0], 
154                                        sizeof(lpc24xx_serial_out_buf0),
155                                        &lpc24xx_serial_in_buf0[0], 
156                                        sizeof(lpc24xx_serial_in_buf0)
157     );
158 #else
159 static SERIAL_CHANNEL(lpc24xx_serial_channel0,
160                       pc_serial_funs, 
161                       lpc24xx_serial_info0,
162                       CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL0_BAUD),
163                       CYG_SERIAL_STOP_DEFAULT,
164                       CYG_SERIAL_PARITY_DEFAULT,
165                       CYG_SERIAL_WORD_LENGTH_DEFAULT,
166                       CYG_SERIAL_FLAGS_DEFAULT
167     );
168 #endif
169
170 DEVTAB_ENTRY(lpc24xx_serial_io0, 
171              CYGDAT_IO_SERIAL_ARM_LPC24XX_SERIAL0_NAME,
172              0,                     // Does not depend on a lower
173                                     // level interface
174              &cyg_io_serial_devio, 
175              pc_serial_init, 
176              pc_serial_lookup,     // Serial driver may need initializing
177              &lpc24xx_serial_channel0
178     );
179 #endif //  CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL0
180
181
182 //==========================================================================
183 //                          SERIAL CHANNEL 1
184 //==========================================================================
185 #ifdef CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL1
186 static pc_serial_info lpc24xx_serial_info1 = 
187
188     CYGARC_HAL_LPC24XX_REG_UART1_BASE,
189     CYGNUM_HAL_INTERRUPT_UART1,
190     CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL1_INTPRIO
191 };
192
193 #if CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL1_BUFSIZE > 0
194 static unsigned char 
195 lpc24xx_serial_out_buf1[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL1_BUFSIZE];
196 static unsigned char 
197 lpc24xx_serial_in_buf1[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL1_BUFSIZE];
198
199 static SERIAL_CHANNEL_USING_INTERRUPTS(lpc24xx_serial_channel1,
200                                        pc_serial_funs, 
201                                        lpc24xx_serial_info1,
202                                        CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL1_BAUD),
203                                        CYG_SERIAL_STOP_DEFAULT,
204                                        CYG_SERIAL_PARITY_DEFAULT,
205                                        CYG_SERIAL_WORD_LENGTH_DEFAULT,
206                                        CYG_SERIAL_FLAGS_DEFAULT,
207                                        &lpc24xx_serial_out_buf1[0], 
208                                        sizeof(lpc24xx_serial_out_buf1),
209                                        &lpc24xx_serial_in_buf1[0], 
210                                        sizeof(lpc24xx_serial_in_buf1)
211     );
212 #else
213 static SERIAL_CHANNEL(lpc24xx_serial_channel1,
214                       pc_serial_funs, 
215                       lpc24xx_serial_info1,
216                       CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL1_BAUD),
217                       CYG_SERIAL_STOP_DEFAULT,
218                       CYG_SERIAL_PARITY_DEFAULT,
219                       CYG_SERIAL_WORD_LENGTH_DEFAULT,
220                       CYG_SERIAL_FLAGS_DEFAULT
221     );
222 #endif
223
224 DEVTAB_ENTRY(lpc24xx_serial_io1, 
225              CYGDAT_IO_SERIAL_ARM_LPC24XX_SERIAL1_NAME,
226              0,                     // Does not depend on a lower
227                                     // level interface
228              &cyg_io_serial_devio, 
229              pc_serial_init, 
230              pc_serial_lookup,     // Serial driver may need initializing
231              &lpc24xx_serial_channel1
232     );
233 #endif //  CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL1
234
235
236 //==========================================================================
237 //                          SERIAL CHANNEL 2
238 //==========================================================================
239 #ifdef CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL2
240 static pc_serial_info lpc24xx_serial_info2 = 
241
242     CYGARC_HAL_LPC24XX_REG_UART2_BASE,
243     CYGNUM_HAL_INTERRUPT_UART2,
244     CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL2_INTPRIO
245 };
246
247 #if CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL2_BUFSIZE > 0
248 static unsigned char 
249 lpc24xx_serial_out_buf2[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL2_BUFSIZE];
250 static unsigned char 
251 lpc24xx_serial_in_buf2[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL2_BUFSIZE];
252
253 static SERIAL_CHANNEL_USING_INTERRUPTS(lpc24xx_serial_channel2,
254                                        pc_serial_funs, 
255                                        lpc24xx_serial_info2,
256                                        CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL2_BAUD),
257                                        CYG_SERIAL_STOP_DEFAULT,
258                                        CYG_SERIAL_PARITY_DEFAULT,
259                                        CYG_SERIAL_WORD_LENGTH_DEFAULT,
260                                        CYG_SERIAL_FLAGS_DEFAULT,
261                                        &lpc24xx_serial_out_buf2[0], 
262                                        sizeof(lpc24xx_serial_out_buf2),
263                                        &lpc24xx_serial_in_buf2[0], 
264                                        sizeof(lpc24xx_serial_in_buf2)
265     );
266 #else
267 static SERIAL_CHANNEL(lpc24xx_serial_channel2,
268                       pc_serial_funs, 
269                       lpc24xx_serial_info2,
270                       CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL2_BAUD),
271                       CYG_SERIAL_STOP_DEFAULT,
272                       CYG_SERIAL_PARITY_DEFAULT,
273                       CYG_SERIAL_WORD_LENGTH_DEFAULT,
274                       CYG_SERIAL_FLAGS_DEFAULT
275     );
276 #endif
277
278 DEVTAB_ENTRY(lpc24xx_serial_io2, 
279              CYGDAT_IO_SERIAL_ARM_LPC24XX_SERIAL2_NAME,
280              0,                     // Does not depend on a lower
281                                     // level interface
282              &cyg_io_serial_devio, 
283              pc_serial_init, 
284              pc_serial_lookup,     // Serial driver may need initializing
285              &lpc24xx_serial_channel2
286     );
287 #endif //  CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL2
288
289
290 //==========================================================================
291 //                          SERIAL CHANNEL 3
292 //==========================================================================
293 #ifdef CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL3
294 static pc_serial_info lpc24xx_serial_info3 = 
295
296     CYGARC_HAL_LPC24XX_REG_UART3_BASE,
297     CYGNUM_HAL_INTERRUPT_UART3,
298     CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL3_INTPRIO
299 };
300
301 #if CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL3_BUFSIZE > 0
302 static unsigned char 
303 lpc24xx_serial_out_buf3[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL3_BUFSIZE];
304 static unsigned char 
305 lpc24xx_serial_in_buf3[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL3_BUFSIZE];
306
307 static SERIAL_CHANNEL_USING_INTERRUPTS(lpc24xx_serial_channel3,
308                                        pc_serial_funs, 
309                                        lpc24xx_serial_info3,
310                                        CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL3_BAUD),
311                                        CYG_SERIAL_STOP_DEFAULT,
312                                        CYG_SERIAL_PARITY_DEFAULT,
313                                        CYG_SERIAL_WORD_LENGTH_DEFAULT,
314                                        CYG_SERIAL_FLAGS_DEFAULT,
315                                        &lpc24xx_serial_out_buf3[0], 
316                                        sizeof(lpc24xx_serial_out_buf3),
317                                        &lpc24xx_serial_in_buf3[0], 
318                                        sizeof(lpc24xx_serial_in_buf3)
319     );
320 #else
321 static SERIAL_CHANNEL(lpc24xx_serial_channel3,
322                       pc_serial_funs, 
323                       lpc24xx_serial_info3,
324                       CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL3_BAUD),
325                       CYG_SERIAL_STOP_DEFAULT,
326                       CYG_SERIAL_PARITY_DEFAULT,
327                       CYG_SERIAL_WORD_LENGTH_DEFAULT,
328                       CYG_SERIAL_FLAGS_DEFAULT
329     );
330 #endif
331
332 DEVTAB_ENTRY(lpc24xx_serial_io3, 
333              CYGDAT_IO_SERIAL_ARM_LPC24XX_SERIAL3_NAME,
334              0,                     // Does not depend on a lower
335                                     // level interface
336              &cyg_io_serial_devio, 
337              pc_serial_init, 
338              pc_serial_lookup,     // Serial driver may need initializing
339              &lpc24xx_serial_channel3
340     );
341 #endif //  CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL3
342
343
344 //----------------------------------------------------------------------------
345 // EOF arm_lpc2xxx_ser.inl