1 //==========================================================================
3 // io/serial/arm/arm_lpc24xx_ser.inl
5 // ARM LPC24XX Serial I/O definitions
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
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.
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
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.
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.
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####
41 // Author(s): Uwe Kindler
42 // Contributors: gthomas, jlarmour
44 // Purpose: LPC24XX Serial I/O module (interrupt driven version)
47 //####DESCRIPTIONEND####
49 //==========================================================================
52 //==========================================================================
54 //==========================================================================
55 #include <cyg/hal/hal_intr.h>
56 #include <cyg/hal/lpc24xx_misc.h>
59 //==========================================================================
61 //==========================================================================
62 // Baud rate specification
63 static const unsigned int select_baud[] =
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)
96 cyg_uint8 pclk_id = CYNUM_HAL_LPC24XX_PCLK_UART0;
97 switch (ser_chan->base)
99 case CYGARC_HAL_LPC24XX_REG_UART0_BASE:
100 pclk_id = CYNUM_HAL_LPC24XX_PCLK_UART0;
103 case CYGARC_HAL_LPC24XX_REG_UART1_BASE:
104 pclk_id = CYNUM_HAL_LPC24XX_PCLK_UART1;
107 case CYGARC_HAL_LPC24XX_REG_UART2_BASE:
108 pclk_id = CYNUM_HAL_LPC24XX_PCLK_UART2;
111 case CYGARC_HAL_LPC24XX_REG_UART3_BASE:
112 pclk_id = CYNUM_HAL_LPC24XX_PCLK_UART3;
116 CYG_FAIL("Invalid UART base address");
117 } // (ser_chan->base)
119 return CYG_HAL_ARM_LPC24XX_BAUD_GENERATOR(pclk_id, select_baud[baud]);
123 #define CYG_IO_SERIAL_GENERIC_16X5X_CHAN_BAUD_GENERATOR(_ser_chan_, _baud_) \
124 lpc24xx_baud_generator((_ser_chan_), (_baud_))
128 //==========================================================================
130 //==========================================================================
131 #ifdef CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL0
132 static pc_serial_info lpc24xx_serial_info0 =
134 CYGARC_HAL_LPC24XX_REG_UART0_BASE,
135 CYGNUM_HAL_INTERRUPT_UART0,
136 CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL0_INTPRIO
139 #if CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL0_BUFSIZE > 0
141 lpc24xx_serial_out_buf0[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL0_BUFSIZE];
143 lpc24xx_serial_in_buf0[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL0_BUFSIZE];
145 static SERIAL_CHANNEL_USING_INTERRUPTS(lpc24xx_serial_channel0,
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)
159 static SERIAL_CHANNEL(lpc24xx_serial_channel0,
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
170 DEVTAB_ENTRY(lpc24xx_serial_io0,
171 CYGDAT_IO_SERIAL_ARM_LPC24XX_SERIAL0_NAME,
172 0, // Does not depend on a lower
174 &cyg_io_serial_devio,
176 pc_serial_lookup, // Serial driver may need initializing
177 &lpc24xx_serial_channel0
179 #endif // CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL0
182 //==========================================================================
184 //==========================================================================
185 #ifdef CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL1
186 static pc_serial_info lpc24xx_serial_info1 =
188 CYGARC_HAL_LPC24XX_REG_UART1_BASE,
189 CYGNUM_HAL_INTERRUPT_UART1,
190 CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL1_INTPRIO
193 #if CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL1_BUFSIZE > 0
195 lpc24xx_serial_out_buf1[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL1_BUFSIZE];
197 lpc24xx_serial_in_buf1[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL1_BUFSIZE];
199 static SERIAL_CHANNEL_USING_INTERRUPTS(lpc24xx_serial_channel1,
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)
213 static SERIAL_CHANNEL(lpc24xx_serial_channel1,
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
224 DEVTAB_ENTRY(lpc24xx_serial_io1,
225 CYGDAT_IO_SERIAL_ARM_LPC24XX_SERIAL1_NAME,
226 0, // Does not depend on a lower
228 &cyg_io_serial_devio,
230 pc_serial_lookup, // Serial driver may need initializing
231 &lpc24xx_serial_channel1
233 #endif // CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL1
236 //==========================================================================
238 //==========================================================================
239 #ifdef CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL2
240 static pc_serial_info lpc24xx_serial_info2 =
242 CYGARC_HAL_LPC24XX_REG_UART2_BASE,
243 CYGNUM_HAL_INTERRUPT_UART2,
244 CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL2_INTPRIO
247 #if CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL2_BUFSIZE > 0
249 lpc24xx_serial_out_buf2[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL2_BUFSIZE];
251 lpc24xx_serial_in_buf2[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL2_BUFSIZE];
253 static SERIAL_CHANNEL_USING_INTERRUPTS(lpc24xx_serial_channel2,
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)
267 static SERIAL_CHANNEL(lpc24xx_serial_channel2,
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
278 DEVTAB_ENTRY(lpc24xx_serial_io2,
279 CYGDAT_IO_SERIAL_ARM_LPC24XX_SERIAL2_NAME,
280 0, // Does not depend on a lower
282 &cyg_io_serial_devio,
284 pc_serial_lookup, // Serial driver may need initializing
285 &lpc24xx_serial_channel2
287 #endif // CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL2
290 //==========================================================================
292 //==========================================================================
293 #ifdef CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL3
294 static pc_serial_info lpc24xx_serial_info3 =
296 CYGARC_HAL_LPC24XX_REG_UART3_BASE,
297 CYGNUM_HAL_INTERRUPT_UART3,
298 CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL3_INTPRIO
301 #if CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL3_BUFSIZE > 0
303 lpc24xx_serial_out_buf3[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL3_BUFSIZE];
305 lpc24xx_serial_in_buf3[CYGNUM_IO_SERIAL_ARM_LPC24XX_SERIAL3_BUFSIZE];
307 static SERIAL_CHANNEL_USING_INTERRUPTS(lpc24xx_serial_channel3,
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)
321 static SERIAL_CHANNEL(lpc24xx_serial_channel3,
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
332 DEVTAB_ENTRY(lpc24xx_serial_io3,
333 CYGDAT_IO_SERIAL_ARM_LPC24XX_SERIAL3_NAME,
334 0, // Does not depend on a lower
336 &cyg_io_serial_devio,
338 pc_serial_lookup, // Serial driver may need initializing
339 &lpc24xx_serial_channel3
341 #endif // CYGPKG_IO_SERIAL_ARM_LPC24XX_SERIAL3
344 //----------------------------------------------------------------------------
345 // EOF arm_lpc2xxx_ser.inl