Mercurial > ecos
annotate packages/devs/serial/arm/e7t/current/src/e7t_serial.c @ 3292:7f8e529b4d82 default tip
Fix FREESCALE_EDMA_NBYTES_MLOFFYES_MLOFF() so it works with negative offsets.
| author | vae |
|---|---|
| date | Wed, 29 Apr 2015 23:31:48 +0000 |
| parents | 74dbf4c3f2e1 |
| children |
| rev | line source |
|---|---|
|
1493
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
1 //========================================================================== |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
2 // |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
3 // io/serial/arm/e7t_serial.c |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
4 // |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
5 // ARM AEB-2 Serial I/O Interface Module (interrupt driven) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
6 // |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
7 //========================================================================== |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
8 // ####ECOSGPLCOPYRIGHTBEGIN#### |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
9 // ------------------------------------------- |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
10 // This file is part of eCos, the Embedded Configurable Operating System. |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
12 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
13 // eCos is free software; you can redistribute it and/or modify it under |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
14 // the terms of the GNU General Public License as published by the Free |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
15 // Software Foundation; either version 2 or (at your option) any later |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
16 // version. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
17 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
18 // eCos is distributed in the hope that it will be useful, but WITHOUT |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
19 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
21 // for more details. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
22 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
23 // You should have received a copy of the GNU General Public License |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
24 // along with eCos; if not, write to the Free Software Foundation, Inc., |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
25 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
26 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
27 // As a special exception, if other files instantiate templates or use |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
28 // macros or inline functions from this file, or you compile this file |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
29 // and link it with other works to produce a work based on this file, |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
30 // this file does not by itself cause the resulting work to be covered by |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
31 // the GNU General Public License. However the source code for this file |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
32 // must still be made available in accordance with section (3) of the GNU |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
33 // General Public License v2. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
191
diff
changeset
|
34 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
35 // This exception does not invalidate any other reasons why a work based |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
36 // on this file might be covered by the GNU General Public License. |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
37 // ------------------------------------------- |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
1493
diff
changeset
|
38 // ####ECOSGPLCOPYRIGHTEND#### |
|
1493
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
39 // ==================================================================== |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
40 //#####DESCRIPTIONBEGIN#### |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
41 // |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
42 // Author(s): Lars.Lindqvist@combitechsystems.com |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
43 // Contributors: jlarmour |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
44 // Date: 2001-10-19 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
45 // Purpose: ARM AEB-2 Serial I/O Interface Module (interrupt driven) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
46 // Description: |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
47 // |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
48 //####DESCRIPTIONEND#### |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
49 // |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
50 // ==================================================================== |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
51 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
52 #include <pkgconf/system.h> |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
53 #include <pkgconf/io_serial.h> |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
54 #include <pkgconf/io.h> |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
55 #include <cyg/io/io.h> |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
56 #include <cyg/hal/hal_intr.h> |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
57 #include <cyg/io/devtab.h> |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
58 #include <cyg/io/serial.h> |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
59 #include <cyg/io/serialio.h> |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
60 #include <cyg/infra/diag.h> |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
61 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
62 #ifdef CYGPKG_IO_SERIAL_ARM_E7T |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
63 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
64 #include "e7t_serial.h" |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
65 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
66 typedef struct e7t_serial_info { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
67 CYG_ADDRWORD base; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
68 CYG_WORD tx_int_num; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
69 CYG_WORD rx_int_num; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
70 cyg_interrupt serial_tx_interrupt; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
71 cyg_interrupt serial_rx_interrupt; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
72 cyg_handle_t serial_tx_interrupt_handle; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
73 cyg_handle_t serial_rx_interrupt_handle; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
74 bool tx_enabled; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
75 } e7t_serial_info; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
76 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
77 static bool e7t_serial_init(struct cyg_devtab_entry *tab); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
78 static bool e7t_serial_putc(serial_channel *chan, unsigned char c); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
79 static Cyg_ErrNo e7t_serial_lookup(struct cyg_devtab_entry **tab, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
80 struct cyg_devtab_entry *sub_tab, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
81 const char *name); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
82 static unsigned char e7t_serial_getc(serial_channel *chan); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
83 static Cyg_ErrNo e7t_serial_set_config(serial_channel *chan, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
84 cyg_uint32 key, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
85 const void *xbuf, cyg_uint32 *len); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
86 static void e7t_serial_start_xmit(serial_channel *chan); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
87 static void e7t_serial_stop_xmit(serial_channel *chan); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
88 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
89 static cyg_uint32 e7t_serial_tx_ISR(cyg_vector_t vector, cyg_addrword_t data); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
90 static void e7t_serial_tx_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
91 static cyg_uint32 e7t_serial_rx_ISR(cyg_vector_t vector, cyg_addrword_t data); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
92 static void e7t_serial_rx_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
93 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
94 static SERIAL_FUNS(e7t_serial_funs, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
95 e7t_serial_putc, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
96 e7t_serial_getc, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
97 e7t_serial_set_config, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
98 e7t_serial_start_xmit, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
99 e7t_serial_stop_xmit |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
100 ); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
101 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
102 #ifdef CYGPKG_IO_SERIAL_ARM_E7T_SERIAL0 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
103 static e7t_serial_info e7t_serial_info0 = {0x07FFd000, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
104 CYGNUM_HAL_INTERRUPT_UART0_TX, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
105 CYGNUM_HAL_INTERRUPT_UART0_RX}; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
106 #if CYGNUM_IO_SERIAL_ARM_E7T_SERIAL0_BUFSIZE > 0 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
107 static unsigned char e7t_serial_out_buf0[CYGNUM_IO_SERIAL_ARM_E7T_SERIAL0_BUFSIZE]; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
108 static unsigned char e7t_serial_in_buf0[CYGNUM_IO_SERIAL_ARM_E7T_SERIAL0_BUFSIZE]; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
109 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
110 static SERIAL_CHANNEL_USING_INTERRUPTS(e7t_serial_channel0, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
111 e7t_serial_funs, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
112 e7t_serial_info0, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
113 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_E7T_SERIAL0_BAUD), |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
114 CYG_SERIAL_STOP_DEFAULT, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
115 CYG_SERIAL_PARITY_DEFAULT, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
116 CYG_SERIAL_WORD_LENGTH_DEFAULT, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
117 CYG_SERIAL_FLAGS_DEFAULT, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
118 &e7t_serial_out_buf0[0], sizeof(e7t_serial_out_buf0), |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
119 &e7t_serial_in_buf0[0], sizeof(e7t_serial_in_buf0) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
120 ); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
121 #else |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
122 static SERIAL_CHANNEL(e7t_serial_channel0, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
123 e7t_serial_funs, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
124 e7t_serial_info0, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
125 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_E7T_SERIAL0_BAUD), |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
126 CYG_SERIAL_STOP_DEFAULT, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
127 CYG_SERIAL_PARITY_DEFAULT, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
128 CYG_SERIAL_WORD_LENGTH_DEFAULT, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
129 CYG_SERIAL_FLAGS_DEFAULT |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
130 ); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
131 #endif |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
132 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
133 DEVTAB_ENTRY(e7t_serial_io0, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
134 CYGDAT_IO_SERIAL_ARM_E7T_SERIAL0_NAME, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
135 0, // Does not depend on a lower level interface |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
136 &cyg_io_serial_devio, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
137 e7t_serial_init, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
138 e7t_serial_lookup, // Serial driver may need initializing |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
139 &e7t_serial_channel0 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
140 ); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
141 #endif // CYGPKG_IO_SERIAL_ARM_E7T_SERIAL0 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
142 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
143 #ifdef CYGPKG_IO_SERIAL_ARM_E7T_SERIAL1 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
144 static e7t_serial_info e7t_serial_info1 = {0x07FFe000, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
145 CYGNUM_HAL_INTERRUPT_UART1_TX, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
146 CYGNUM_HAL_INTERRUPT_UART1_RX}; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
147 #if CYGNUM_IO_SERIAL_ARM_E7T_SERIAL1_BUFSIZE > 0 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
148 static unsigned char e7t_serial_out_buf1[CYGNUM_IO_SERIAL_ARM_E7T_SERIAL1_BUFSIZE]; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
149 static unsigned char e7t_serial_in_buf1[CYGNUM_IO_SERIAL_ARM_E7T_SERIAL1_BUFSIZE]; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
150 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
151 static SERIAL_CHANNEL_USING_INTERRUPTS(e7t_serial_channel1, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
152 e7t_serial_funs, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
153 e7t_serial_info1, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
154 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_E7T_SERIAL1_BAUD), |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
155 CYG_SERIAL_STOP_DEFAULT, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
156 CYG_SERIAL_PARITY_DEFAULT, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
157 CYG_SERIAL_WORD_LENGTH_DEFAULT, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
158 CYG_SERIAL_FLAGS_DEFAULT, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
159 &e7t_serial_out_buf1[0], sizeof(e7t_serial_out_buf1), |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
160 &e7t_serial_in_buf1[0], sizeof(e7t_serial_in_buf1) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
161 ); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
162 #else |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
163 static SERIAL_CHANNEL(e7t_serial_channel1, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
164 e7t_serial_funs, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
165 e7t_serial_info1, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
166 CYG_SERIAL_BAUD_RATE(CYGNUM_IO_SERIAL_ARM_E7T_SERIAL1_BAUD), |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
167 CYG_SERIAL_STOP_DEFAULT, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
168 CYG_SERIAL_PARITY_DEFAULT, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
169 CYG_SERIAL_WORD_LENGTH_DEFAULT, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
170 CYG_SERIAL_FLAGS_DEFAULT |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
171 ); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
172 #endif |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
173 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
174 DEVTAB_ENTRY(e7t_serial_io1, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
175 CYGDAT_IO_SERIAL_ARM_E7T_SERIAL1_NAME, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
176 0, // Does not depend on a lower level interface |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
177 &cyg_io_serial_devio, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
178 e7t_serial_init, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
179 e7t_serial_lookup, // Serial driver may need initializing |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
180 &e7t_serial_channel1 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
181 ); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
182 #endif // CYGPKG_IO_SERIAL_ARM_E7T_SERIAL1 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
183 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
184 // Internal function to actually configure the hardware to desired baud rate, etc. |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
185 static bool |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
186 e7t_serial_config_port(serial_channel *chan, cyg_serial_info_t *new_config, bool init) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
187 { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
188 e7t_serial_info *e7t_chan = (e7t_serial_info *)chan->dev_priv; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
189 volatile struct serial_port *port = (volatile struct serial_port *)e7t_chan->base; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
190 cyg_uint32 word_length = select_word_length[(new_config->word_length)-CYGNUM_SERIAL_WORD_LENGTH_5]; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
191 cyg_uint32 stop_bits = select_stop_bits[(new_config->stop)-CYGNUM_SERIAL_STOP_1]; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
192 cyg_uint32 parity_mode = select_parity[(new_config->parity)-CYGNUM_SERIAL_PARITY_NONE]; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
193 cyg_uint32 baud_divisor = select_baud[(new_config->baud)-CYGNUM_SERIAL_BAUD_50]; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
194 cyg_uint32 res = word_length | stop_bits | parity_mode | ULCON_SCI | ULCON_IROFF; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
195 if ((word_length|stop_bits|parity_mode|baud_divisor) == U_NOT_SUPP) { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
196 return false; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
197 }; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
198 port->REG_ULCON = res; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
199 port->REG_UCON = UCON_RXMINT | UCON_RXSIOFF | UCON_TXMINT | UCON_DSROFF | UCON_SBKOFF | UCON_LPBOFF; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
200 port->REG_UBRDIV = baud_divisor; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
201 if (new_config != &chan->config) { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
202 chan->config = *new_config; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
203 }; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
204 return true; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
205 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
206 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
207 // Function to initialize the device. Called at bootstrap time. |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
208 static bool |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
209 e7t_serial_init(struct cyg_devtab_entry *tab) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
210 { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
211 serial_channel *chan = (serial_channel *)tab->priv; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
212 e7t_serial_info *e7t_chan = (e7t_serial_info *)chan->dev_priv; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
213 #ifdef CYGDBG_IO_INIT |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
214 diag_printf("E7T SERIAL init - dev: %x.%d.%d\n", e7t_chan->base, e7t_chan->tx_int_num, e7t_chan->rx_int_num); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
215 #endif |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
216 (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
217 if (chan->out_cbuf.len != 0) { // If bufferlength > 0 then interrupts are used for tx |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
218 cyg_drv_interrupt_create(e7t_chan->tx_int_num, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
219 99, // Priority - unused |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
220 (cyg_addrword_t)chan, // Data item passed to interrupt handler |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
221 e7t_serial_tx_ISR, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
222 e7t_serial_tx_DSR, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
223 &e7t_chan->serial_tx_interrupt_handle, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
224 &e7t_chan->serial_tx_interrupt); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
225 cyg_drv_interrupt_attach(e7t_chan->serial_tx_interrupt_handle); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
226 cyg_drv_interrupt_mask(e7t_chan->tx_int_num); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
227 e7t_chan->tx_enabled = false; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
228 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
229 if (chan->in_cbuf.len != 0) { // If bufferlength > 0 then interrupts are used for rx |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
230 cyg_drv_interrupt_create(e7t_chan->rx_int_num, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
231 99, // Priority - unused |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
232 (cyg_addrword_t)chan, // Data item passed to interrupt handler |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
233 e7t_serial_rx_ISR, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
234 e7t_serial_rx_DSR, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
235 &e7t_chan->serial_rx_interrupt_handle, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
236 &e7t_chan->serial_rx_interrupt); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
237 cyg_drv_interrupt_attach(e7t_chan->serial_rx_interrupt_handle); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
238 cyg_drv_interrupt_unmask(e7t_chan->rx_int_num); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
239 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
240 e7t_serial_config_port(chan, &chan->config, true); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
241 return true; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
242 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
243 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
244 // This routine is called when the device is "looked" up (i.e. attached) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
245 static Cyg_ErrNo |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
246 e7t_serial_lookup(struct cyg_devtab_entry **tab, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
247 struct cyg_devtab_entry *sub_tab, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
248 const char *name) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
249 { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
250 serial_channel *chan = (serial_channel *)(*tab)->priv; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
251 (chan->callbacks->serial_init)(chan); // Really only required for interrupt driven devices |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
252 return ENOERR; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
253 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
254 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
255 // Send a character to the device output buffer. |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
256 // Return 'true' if character is sent to device |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
257 static bool |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
258 e7t_serial_putc(serial_channel *chan, unsigned char c) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
259 { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
260 e7t_serial_info *e7t_chan = (e7t_serial_info *)chan->dev_priv; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
261 volatile struct serial_port *port = (volatile struct serial_port *)e7t_chan->base; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
262 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
263 if (port->REG_USTAT & USTAT_TBE) { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
264 // Transmit buffer is empty |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
265 port->REG_UTXBUF = c; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
266 return true; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
267 } else { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
268 // No space |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
269 return false; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
270 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
271 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
272 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
273 // Fetch a character from the device input buffer, waiting if necessary |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
274 static unsigned char |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
275 e7t_serial_getc(serial_channel *chan) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
276 { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
277 unsigned char c; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
278 e7t_serial_info *e7t_chan = (e7t_serial_info *)chan->dev_priv; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
279 volatile struct serial_port *port = (volatile struct serial_port *)e7t_chan->base; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
280 while ((port->REG_USTAT & USTAT_RDR) == 0) ; // Wait for char |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
281 c = port->REG_URXBUF; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
282 return c; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
283 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
284 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
285 // Set up the device characteristics; baud rate, etc. |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
286 static Cyg_ErrNo |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
287 e7t_serial_set_config(serial_channel *chan, cyg_uint32 key, |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
288 const void *xbuf, cyg_uint32 *len) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
289 { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
290 switch (key) { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
291 case CYG_IO_SET_CONFIG_SERIAL_INFO: |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
292 { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
293 cyg_serial_info_t *config = (cyg_serial_info_t *)xbuf; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
294 if ( *len < sizeof(cyg_serial_info_t) ) { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
295 return -EINVAL; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
296 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
297 *len = sizeof(cyg_serial_info_t); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
298 if ( true != e7t_serial_config_port(chan, config, false) ) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
299 return -EINVAL; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
300 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
301 break; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
302 default: |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
303 return -EINVAL; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
304 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
305 return ENOERR; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
306 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
307 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
308 // Enable the transmitter on the device |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
309 static void |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
310 e7t_serial_start_xmit(serial_channel *chan) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
311 { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
312 e7t_serial_info *e7t_chan = (e7t_serial_info *)chan->dev_priv; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
313 e7t_chan->tx_enabled = true; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
314 (chan->callbacks->xmt_char)(chan); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
315 if (e7t_chan->tx_enabled) { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
316 cyg_drv_interrupt_unmask(e7t_chan->tx_int_num); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
317 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
318 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
319 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
320 // Disable the transmitter on the device |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
321 static void |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
322 e7t_serial_stop_xmit(serial_channel *chan) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
323 { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
324 e7t_serial_info *e7t_chan = (e7t_serial_info *)chan->dev_priv; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
325 cyg_drv_interrupt_mask(e7t_chan->tx_int_num); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
326 e7t_chan->tx_enabled = false; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
327 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
328 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
329 // Serial I/O - low level tx interrupt handler (ISR) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
330 static cyg_uint32 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
331 e7t_serial_tx_ISR(cyg_vector_t vector, cyg_addrword_t data) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
332 { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
333 serial_channel *chan = (serial_channel *)data; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
334 e7t_serial_info *e7t_chan = (e7t_serial_info *)chan->dev_priv; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
335 cyg_drv_interrupt_mask(e7t_chan->tx_int_num); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
336 cyg_drv_interrupt_acknowledge(e7t_chan->tx_int_num); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
337 return CYG_ISR_CALL_DSR; // Cause DSR to be run |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
338 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
339 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
340 // Serial I/O - high level tx interrupt handler (DSR) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
341 static void |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
342 e7t_serial_tx_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
343 { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
344 serial_channel *chan = (serial_channel *)data; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
345 e7t_serial_info *e7t_chan = (e7t_serial_info *)chan->dev_priv; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
346 (chan->callbacks->xmt_char)(chan); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
347 if (e7t_chan->tx_enabled) { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
348 cyg_drv_interrupt_unmask(e7t_chan->tx_int_num); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
349 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
350 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
351 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
352 // Serial I/O - low level rx interrupt handler (ISR) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
353 static cyg_uint32 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
354 e7t_serial_rx_ISR(cyg_vector_t vector, cyg_addrword_t data) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
355 { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
356 serial_channel *chan = (serial_channel *)data; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
357 e7t_serial_info *e7t_chan = (e7t_serial_info *)chan->dev_priv; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
358 cyg_drv_interrupt_mask(e7t_chan->rx_int_num); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
359 cyg_drv_interrupt_acknowledge(e7t_chan->rx_int_num); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
360 return CYG_ISR_CALL_DSR; // Cause DSR to be run |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
361 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
362 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
363 // Serial I/O - high level rx interrupt handler (DSR) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
364 static void |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
365 e7t_serial_rx_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
366 { |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
367 serial_channel *chan = (serial_channel *)data; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
368 e7t_serial_info *e7t_chan = (e7t_serial_info *)chan->dev_priv; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
369 volatile struct serial_port *port = (volatile struct serial_port *)e7t_chan->base; |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
370 (chan->callbacks->rcv_char)(chan, port->REG_URXBUF); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
371 cyg_drv_interrupt_unmask(e7t_chan->rx_int_num); |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
372 } |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
373 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
374 #endif // CYGPKG_IO_SERIAL_ARM_E7T |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
375 |
|
3c206814d866
* src/e7t_serial.c: The UART doesn't generate an interrupt befor the
asl
parents:
210
diff
changeset
|
376 // EOF e7t_serial.c |
