Mercurial > ecos-v3_0-branch
annotate packages/devs/serial/generic/16x5x/current/src/ser_16x5x.c @ 2818:7894f6bee6e5
* src/ser_16x5x.c:
Allow platform code to override the default implementation for
writing the LCR register and reading the ISR register by using
the SER_16X5X_WRITE_LCR() and SER_16X5X_READ_ISR() macros.
| author | jlarmour |
|---|---|
| date | Thu, 19 Feb 2009 01:02:15 +0000 |
| parents | 74dbf4c3f2e1 |
| children |
| rev | line source |
|---|---|
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
1 //========================================================================== |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
2 // |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
3 // io/serial/generic/16x5x/ser_16x5x.c |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
4 // |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
5 // Generic 16x5x serial driver |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
6 // |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
7 //========================================================================== |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2488
diff
changeset
|
8 // ####ECOSGPLCOPYRIGHTBEGIN#### |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2488
diff
changeset
|
9 // ------------------------------------------- |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2488
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:
2488
diff
changeset
|
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2006 Free Software Foundation, Inc. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
12 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2488
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:
2488
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:
2488
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:
2488
diff
changeset
|
16 // version. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
17 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2488
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:
2488
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:
2488
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:
2488
diff
changeset
|
21 // for more details. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
22 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2488
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:
2488
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:
2488
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:
163
diff
changeset
|
26 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2488
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:
2488
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:
2488
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:
2488
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:
2488
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:
2488
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:
2488
diff
changeset
|
33 // General Public License v2. |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
34 // |
|
2729
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2488
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:
2488
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:
2488
diff
changeset
|
37 // ------------------------------------------- |
|
74dbf4c3f2e1
Update all copyright banners to reflect FSF ownership; fix and improve licence text.
jlarmour
parents:
2488
diff
changeset
|
38 // ####ECOSGPLCOPYRIGHTEND#### |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
39 //========================================================================== |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
40 //#####DESCRIPTIONBEGIN#### |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
41 // |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
42 // Author(s): gthomas |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
43 // Contributors: gthomas, jlarmour, jskov |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
44 // Date: 1999-02-04 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
45 // Purpose: 16x5x generic serial driver |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
46 // Description: |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
47 // |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
48 //####DESCRIPTIONEND#### |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
49 // |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
50 //========================================================================== |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
51 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
52 #include <pkgconf/system.h> |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
53 #include <pkgconf/io_serial.h> |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
54 #include <pkgconf/io.h> |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
55 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
56 #include <cyg/io/io.h> |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
57 #include <cyg/hal/hal_intr.h> |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
58 #include <cyg/io/devtab.h> |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
59 #include <cyg/io/serial.h> |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
60 #include <cyg/infra/diag.h> |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
61 #include <cyg/infra/cyg_ass.h> |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
62 #include <cyg/hal/hal_io.h> |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
63 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
64 // Only compile driver if an inline file with driver details was selected. |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
65 #ifdef CYGDAT_IO_SERIAL_GENERIC_16X5X_INL |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
66 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
67 #ifndef CYGPRI_IO_SERIAL_GENERIC_16X5X_STEP |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
68 #define CYGPRI_IO_SERIAL_GENERIC_16X5X_STEP 1 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
69 #endif |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
70 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
71 #define SER_REG(_x_) ((_x_)*CYGPRI_IO_SERIAL_GENERIC_16X5X_STEP) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
72 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
73 // Receive control Registers |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
74 #define REG_rhr SER_REG(0) // Receive holding register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
75 #define REG_isr SER_REG(2) // Interrupt status register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
76 #define REG_lsr SER_REG(5) // Line status register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
77 #define REG_msr SER_REG(6) // Modem status register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
78 #define REG_scr SER_REG(7) // Scratch register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
79 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
80 // Transmit control Registers |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
81 #define REG_thr SER_REG(0) // Transmit holding register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
82 #define REG_ier SER_REG(1) // Interrupt enable register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
83 #define REG_fcr SER_REG(2) // FIFO control register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
84 #define REG_lcr SER_REG(3) // Line control register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
85 #define REG_mcr SER_REG(4) // Modem control register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
86 #define REG_ldl SER_REG(0) // LSB of baud rate |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
87 #define REG_mdl SER_REG(1) // MSB of baud rate |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
88 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
89 // Interrupt Enable Register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
90 #define IER_RCV 0x01 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
91 #define IER_XMT 0x02 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
92 #define IER_LS 0x04 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
93 #define IER_MS 0x08 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
94 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
95 // Line Control Register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
96 #define LCR_WL5 0x00 // Word length |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
97 #define LCR_WL6 0x01 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
98 #define LCR_WL7 0x02 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
99 #define LCR_WL8 0x03 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
100 #define LCR_SB1 0x00 // Number of stop bits |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
101 #define LCR_SB1_5 0x04 // 1.5 -> only valid with 5 bit words |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
102 #define LCR_SB2 0x04 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
103 #define LCR_PN 0x00 // Parity mode - none |
|
163
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
161
diff
changeset
|
104 #define LCR_PE 0x18 // Parity mode - even |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
105 #define LCR_PO 0x08 // Parity mode - odd |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
106 #define LCR_PM 0x28 // Forced "mark" parity |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
107 #define LCR_PS 0x38 // Forced "space" parity |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
108 #define LCR_DL 0x80 // Enable baud rate latch |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
109 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
110 // Line Status Register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
111 #define LSR_RSR 0x01 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
112 #define LSR_OE 0x02 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
113 #define LSR_PE 0x04 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
114 #define LSR_FE 0x08 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
115 #define LSR_BI 0x10 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
116 #define LSR_THE 0x20 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
117 #define LSR_TEMT 0x40 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
118 #define LSR_FIE 0x80 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
119 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
120 // Modem Control Register |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
121 #define MCR_DTR 0x01 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
122 #define MCR_RTS 0x02 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
123 #define MCR_INT 0x08 // Enable interrupts |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
124 #define MCR_LOOP 0x10 // Loopback mode |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
125 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
126 // Interrupt status Register |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
127 #define ISR_MS 0x00 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
128 #define ISR_nIP 0x01 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
129 #define ISR_Tx 0x02 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
130 #define ISR_Rx 0x04 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
131 #define ISR_LS 0x06 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
132 #define ISR_RxTO 0x0C |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
133 #define ISR_64BFIFO 0x20 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
134 #define ISR_FIFOworks 0x40 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
135 #define ISR_FIFOen 0x80 |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
136 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
137 // Modem Status Register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
138 #define MSR_DCTS 0x01 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
139 #define MSR_DDSR 0x02 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
140 #define MSR_TERI 0x04 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
141 #define MSR_DDCD 0x08 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
142 #define MSR_CTS 0x10 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
143 #define MSR_DSR 0x20 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
144 #define MSR_RI 0x40 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
145 #define MSR_CD 0x80 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
146 |
|
145
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
143
diff
changeset
|
147 // FIFO Control Register |
|
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
143
diff
changeset
|
148 #define FCR_FE 0x01 // FIFO enable |
|
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
143
diff
changeset
|
149 #define FCR_CRF 0x02 // Clear receive FIFO |
|
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
143
diff
changeset
|
150 #define FCR_CTF 0x04 // Clear transmit FIFO |
|
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
143
diff
changeset
|
151 #define FCR_DMA 0x08 // DMA mode select |
|
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
143
diff
changeset
|
152 #define FCR_F64 0x20 // Enable 64 byte fifo (16750+) |
|
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
143
diff
changeset
|
153 #define FCR_RT14 0xC0 // Set Rx trigger at 14 |
|
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
143
diff
changeset
|
154 #define FCR_RT8 0x80 // Set Rx trigger at 8 |
|
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
143
diff
changeset
|
155 #define FCR_RT4 0x40 // Set Rx trigger at 4 |
|
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
143
diff
changeset
|
156 #define FCR_RT1 0x00 // Set Rx trigger at 1 |
|
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
143
diff
changeset
|
157 |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
158 static unsigned char select_word_length[] = { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
159 LCR_WL5, // 5 bits / word (char) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
160 LCR_WL6, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
161 LCR_WL7, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
162 LCR_WL8 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
163 }; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
164 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
165 static unsigned char select_stop_bits[] = { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
166 0, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
167 LCR_SB1, // 1 stop bit |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
168 LCR_SB1_5, // 1.5 stop bit |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
169 LCR_SB2 // 2 stop bits |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
170 }; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
171 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
172 static unsigned char select_parity[] = { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
173 LCR_PN, // No parity |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
174 LCR_PE, // Even parity |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
175 LCR_PO, // Odd parity |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
176 LCR_PM, // Mark parity |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
177 LCR_PS, // Space parity |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
178 }; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
179 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
180 // selec_baud[] must be define by the client |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
181 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
182 typedef struct pc_serial_info { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
183 cyg_addrword_t base; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
184 int int_num; |
| 2488 | 185 #ifdef CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO |
| 186 int int_prio; | |
| 187 #endif // CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO | |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
188 cyg_interrupt serial_interrupt; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
189 cyg_handle_t serial_interrupt_handle; |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
190 #ifdef CYGPKG_IO_SERIAL_GENERIC_16X5X_FIFO |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
191 enum { |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
192 sNone = 0, |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
193 s8250, |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
194 s16450, |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
195 s16550, |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
196 s16550a |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
197 } deviceType; |
| 2124 | 198 unsigned tx_fifo_size; |
| 199 volatile unsigned tx_fifo_avail; | |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
200 #endif |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
201 } pc_serial_info; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
202 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
203 static bool pc_serial_init(struct cyg_devtab_entry *tab); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
204 static bool pc_serial_putc(serial_channel *chan, unsigned char c); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
205 static Cyg_ErrNo pc_serial_lookup(struct cyg_devtab_entry **tab, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
206 struct cyg_devtab_entry *sub_tab, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
207 const char *name); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
208 static unsigned char pc_serial_getc(serial_channel *chan); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
209 static Cyg_ErrNo pc_serial_set_config(serial_channel *chan, cyg_uint32 key, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
210 const void *xbuf, cyg_uint32 *len); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
211 static void pc_serial_start_xmit(serial_channel *chan); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
212 static void pc_serial_stop_xmit(serial_channel *chan); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
213 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
214 static cyg_uint32 pc_serial_ISR(cyg_vector_t vector, cyg_addrword_t data); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
215 static void pc_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
216 cyg_addrword_t data); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
217 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
218 static SERIAL_FUNS(pc_serial_funs, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
219 pc_serial_putc, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
220 pc_serial_getc, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
221 pc_serial_set_config, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
222 pc_serial_start_xmit, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
223 pc_serial_stop_xmit |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
224 ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
225 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
226 #include CYGDAT_IO_SERIAL_GENERIC_16X5X_INL |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
227 |
|
1120
4b4f3b3ba6e4
* src/ser_16x5x.c (CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY): Add
jlarmour
parents:
841
diff
changeset
|
228 #ifndef CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY |
|
4b4f3b3ba6e4
* src/ser_16x5x.c (CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY): Add
jlarmour
parents:
841
diff
changeset
|
229 # define CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY 4 |
|
4b4f3b3ba6e4
* src/ser_16x5x.c (CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY): Add
jlarmour
parents:
841
diff
changeset
|
230 #endif |
|
4b4f3b3ba6e4
* src/ser_16x5x.c (CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY): Add
jlarmour
parents:
841
diff
changeset
|
231 |
| 2818 | 232 // Allow platform code to override the default implementation of |
| 233 // a write to the LCR | |
| 234 #ifndef SER_16X5X_WRITE_LCR | |
| 235 #define SER_16X5X_WRITE_LCR(_base_, _val_) HAL_WRITE_UINT8((_base_) + REG_lcr, _val_) | |
| 236 #endif | |
| 237 | |
| 238 // Allow platform code to override the default implementation of | |
| 239 // a read of the ISR | |
| 240 #ifndef SER_16X5X_READ_ISR | |
| 241 #define SER_16X5X_READ_ISR(_base_, _val_) HAL_READ_UINT8((_base_) + REG_isr, _val_) | |
| 242 #endif | |
|
1120
4b4f3b3ba6e4
* src/ser_16x5x.c (CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY): Add
jlarmour
parents:
841
diff
changeset
|
243 |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
244 // Internal function to actually configure the hardware to desired |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
245 // baud rate, etc. |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
246 static bool |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
247 serial_config_port(serial_channel *chan, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
248 cyg_serial_info_t *new_config, bool init) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
249 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
250 pc_serial_info *ser_chan = (pc_serial_info *)chan->dev_priv; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
251 cyg_addrword_t base = ser_chan->base; |
| 2488 | 252 // |
| 253 // If the device supports a dynamic per channel baudrate generator | |
| 254 // then we call the CYG_IO_SERIAL_GENERIC_16X5X_CHAN_BAUD_GENERATOR() | |
| 255 // macro to get the baud divisor. The macro takes the serial channel data | |
| 256 // pointer and the baudrate as parameters and returns the baud divisior | |
| 257 // | |
| 258 #ifdef CYG_IO_SERIAL_GENERIC_16X5X_CHAN_BAUD_GENERATOR | |
| 259 unsigned short baud_divisor = CYG_IO_SERIAL_GENERIC_16X5X_CHAN_BAUD_GENERATOR(ser_chan, new_config->baud); | |
| 260 #else | |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
261 unsigned short baud_divisor = select_baud[new_config->baud]; |
| 2488 | 262 #endif |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
263 unsigned char _lcr, _ier; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
264 if (baud_divisor == 0) return false; // Invalid configuration |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
265 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
266 // Disable port interrupts while changing hardware |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
267 HAL_READ_UINT8(base+REG_ier, _ier); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
268 HAL_WRITE_UINT8(base+REG_ier, 0); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
269 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
270 _lcr = select_word_length[new_config->word_length - CYGNUM_SERIAL_WORD_LENGTH_5] | |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
271 select_stop_bits[new_config->stop] | |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
272 select_parity[new_config->parity]; |
| 2818 | 273 SER_16X5X_WRITE_LCR(base, _lcr | LCR_DL); |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
274 HAL_WRITE_UINT8(base+REG_mdl, baud_divisor >> 8); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
275 HAL_WRITE_UINT8(base+REG_ldl, baud_divisor & 0xFF); |
| 2818 | 276 SER_16X5X_WRITE_LCR(base, _lcr); |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
277 if (init) { |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
150
diff
changeset
|
278 #ifdef CYGPKG_IO_SERIAL_GENERIC_16X5X_FIFO |
|
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
150
diff
changeset
|
279 unsigned char _fcr_thresh; |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
280 cyg_uint8 b; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
150
diff
changeset
|
281 |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
282 /* First, find out what kind of device it is. */ |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
283 ser_chan->deviceType = sNone; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
284 HAL_WRITE_UINT8(base+REG_mcr, MCR_LOOP); // enable loopback mode |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
285 HAL_READ_UINT8(base+REG_msr, b); |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
286 if (0 == (b & 0xF0)) { // see if MSR had CD, RI, DSR or CTS set |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
287 HAL_WRITE_UINT8(base+REG_mcr, MCR_LOOP|MCR_DTR|MCR_RTS); |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
288 HAL_READ_UINT8(base+REG_msr, b); |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
289 if (0xF0 != (b & 0xF0)) // check that all of CD,RI,DSR and CTS set |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
290 ser_chan->deviceType = s8250; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
291 } |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
292 HAL_WRITE_UINT8(base+REG_mcr, 0); // disable loopback mode |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
293 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
294 if (ser_chan->deviceType == s8250) { |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
295 // Check for a scratch register; scratch register |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
296 // indicates 16450 or above. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
297 HAL_WRITE_UINT8(base+REG_scr, 0x55); |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
298 HAL_READ_UINT8(base+REG_scr, b); |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
299 if (b == 0x55) { |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
300 HAL_WRITE_UINT8(base+REG_scr, 0xAA); |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
301 HAL_READ_UINT8(base+REG_scr, b); |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
302 if (b == 0xAA) |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
303 ser_chan->deviceType = s16450; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
304 } |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
150
diff
changeset
|
305 } |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
306 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
307 if (ser_chan->deviceType == s16450) { |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
308 // Check for a FIFO |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
309 HAL_WRITE_UINT8(base+REG_fcr, FCR_FE); |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
310 HAL_READ_UINT8(base+REG_isr, b); |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
311 if (b & ISR_FIFOen) |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
312 ser_chan->deviceType = s16550; // but FIFO doesn't |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
313 // necessarily work |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
314 if (b & ISR_FIFOworks) |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
315 ser_chan->deviceType = s16550a; // 16550a FIFOs work |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
316 } |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
317 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
318 if (ser_chan->deviceType == s16550a) { |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
319 switch(CYGPKG_IO_SERIAL_GENERIC_16X5X_FIFO_RX_THRESHOLD) { |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
320 default: |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
321 case 1: |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
322 _fcr_thresh=FCR_RT1; break; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
323 case 4: |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
324 _fcr_thresh=FCR_RT4; break; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
325 case 8: |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
326 _fcr_thresh=FCR_RT8; break; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
327 case 14: |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
328 _fcr_thresh=FCR_RT14; break; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
329 } |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
330 _fcr_thresh|=FCR_FE|FCR_CRF|FCR_CTF; |
| 2124 | 331 ser_chan->tx_fifo_size = |
| 332 CYGNUM_IO_SERIAL_GENERIC_16X5X_FIFO_TX_SIZE; | |
| 333 // Enable and clear FIFO | |
| 334 HAL_WRITE_UINT8(base+REG_fcr, _fcr_thresh); | |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
335 } |
| 2124 | 336 else { |
| 337 ser_chan->tx_fifo_size = 1; | |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
338 HAL_WRITE_UINT8(base+REG_fcr, 0); // make sure it's disabled |
| 2124 | 339 } |
| 340 | |
| 341 ser_chan->tx_fifo_avail = ser_chan->tx_fifo_size; | |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
150
diff
changeset
|
342 #endif |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
343 if (chan->out_cbuf.len != 0) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
344 _ier = IER_RCV; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
345 } else { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
346 _ier = 0; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
347 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
348 // Master interrupt enable |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
349 HAL_WRITE_UINT8(base+REG_mcr, MCR_INT|MCR_DTR|MCR_RTS); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
350 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
351 #ifdef CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
352 _ier |= (IER_LS|IER_MS); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
353 #endif |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
354 HAL_WRITE_UINT8(base+REG_ier, _ier); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
355 |
| 2325 | 356 #ifdef CYGPRI_IO_SERIAL_GENERIC_16X5X_PLF_INIT_HOOK |
| 357 CYGPRI_IO_SERIAL_GENERIC_16X5X_PLF_INIT_HOOK( ser_chan, new_config ); | |
| 358 #endif | |
| 359 | |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
360 if (new_config != &chan->config) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
361 chan->config = *new_config; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
362 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
363 return true; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
364 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
365 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
366 // Function to initialize the device. Called at bootstrap time. |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
367 static bool |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
368 pc_serial_init(struct cyg_devtab_entry *tab) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
369 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
370 serial_channel *chan = (serial_channel *)tab->priv; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
371 pc_serial_info *ser_chan = (pc_serial_info *)chan->dev_priv; |
|
1223
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
372 |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
373 #ifdef CYG_IO_SERIAL_GENERIC_16X5X_BAUD_GENERATOR |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
374 // Fill in baud rate table - used for platforms where this cannot |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
375 // be determined statically |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
376 int baud_idx, baud_val; |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
377 if (select_baud[0] == 9999) { |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
378 // Table not yet initialized |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
379 // Assumes that 'select_baud' looks like this: |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
380 // static int select_baud[] = { |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
381 // 9999, -- marker |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
382 // 50, -- first baud rate |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
383 // 110, -- second baud rate |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
384 // etc. |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
385 for (baud_idx = 1; baud_idx < sizeof(select_baud)/sizeof(select_baud[0]); baud_idx++) { |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
386 baud_val = CYG_IO_SERIAL_GENERIC_16X5X_BAUD_GENERATOR(select_baud[baud_idx]); |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
387 select_baud[baud_idx] = baud_val; |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
388 } |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
389 select_baud[0] = 0; |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
390 } |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
391 #endif |
|
dbcfe4e0dbd2
New platform - TAMS MOAB - and generic changes to support it
gthomas
parents:
1120
diff
changeset
|
392 |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
393 #ifdef CYGDBG_IO_INIT |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
394 diag_printf("16x5x SERIAL init - dev: %x.%d\n", |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
395 ser_chan->base, ser_chan->int_num); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
396 #endif |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
397 // Really only required for interrupt driven devices |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
398 (chan->callbacks->serial_init)(chan); |
| 2488 | 399 // |
| 400 // If the device supports per channel interrupt priorities then | |
| 401 // we take the priority from the serial channel data. If it does | |
| 402 // not support per channel interrupt priority we fall back to | |
| 403 // the old method and use CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY | |
| 404 // to define the priority | |
| 405 // | |
| 406 #ifdef CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO | |
| 407 cyg_priority_t intprio = ser_chan->int_prio; | |
| 408 #else | |
| 409 cyg_priority_t intprio = CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY; | |
| 410 #endif // CYGINT_IO_SERIAL_GENERIC_16X5X_CHAN_INTPRIO | |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
411 if (chan->out_cbuf.len != 0) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
412 cyg_drv_interrupt_create(ser_chan->int_num, |
| 2488 | 413 intprio, |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
414 (cyg_addrword_t)chan, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
415 pc_serial_ISR, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
416 pc_serial_DSR, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
417 &ser_chan->serial_interrupt_handle, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
418 &ser_chan->serial_interrupt); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
419 cyg_drv_interrupt_attach(ser_chan->serial_interrupt_handle); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
420 cyg_drv_interrupt_unmask(ser_chan->int_num); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
421 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
422 serial_config_port(chan, &chan->config, true); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
423 return true; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
424 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
425 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
426 // This routine is called when the device is "looked" up (i.e. attached) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
427 static Cyg_ErrNo |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
428 pc_serial_lookup(struct cyg_devtab_entry **tab, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
429 struct cyg_devtab_entry *sub_tab, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
430 const char *name) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
431 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
432 serial_channel *chan = (serial_channel *)(*tab)->priv; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
433 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
434 // Really only required for interrupt driven devices |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
435 (chan->callbacks->serial_init)(chan); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
436 return ENOERR; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
437 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
438 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
439 // Send a character to the device output buffer. |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
440 // Return 'true' if character is sent to device |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
441 static bool |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
442 pc_serial_putc(serial_channel *chan, unsigned char c) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
443 { |
| 2124 | 444 #ifndef CYGPKG_IO_SERIAL_GENERIC_16X5X_FIFO |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
445 cyg_uint8 _lsr; |
| 2124 | 446 #endif |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
447 pc_serial_info *ser_chan = (pc_serial_info *)chan->dev_priv; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
448 cyg_addrword_t base = ser_chan->base; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
449 |
| 2124 | 450 #ifdef CYGPKG_IO_SERIAL_GENERIC_16X5X_FIFO |
| 451 if (ser_chan->tx_fifo_avail > 0) { | |
| 452 HAL_WRITE_UINT8(base+REG_thr, c); | |
| 453 --ser_chan->tx_fifo_avail; | |
| 454 return true; | |
| 455 } | |
| 456 #else | |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
457 HAL_READ_UINT8(base+REG_lsr, _lsr); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
458 if (_lsr & LSR_THE) { |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
459 // Transmit buffer is empty |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
460 HAL_WRITE_UINT8(base+REG_thr, c); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
461 return true; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
462 } |
| 2124 | 463 #endif |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
464 // No space |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
465 return false; |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
466 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
467 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
468 // Fetch a character from the device input buffer, waiting if necessary |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
469 static unsigned char |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
470 pc_serial_getc(serial_channel *chan) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
471 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
472 unsigned char c; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
473 cyg_uint8 _lsr; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
474 pc_serial_info *ser_chan = (pc_serial_info *)chan->dev_priv; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
475 cyg_addrword_t base = ser_chan->base; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
476 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
477 // Wait for char |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
478 do { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
479 HAL_READ_UINT8(base+REG_lsr, _lsr); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
480 } while ((_lsr & LSR_RSR) == 0); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
481 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
482 HAL_READ_UINT8(base+REG_rhr, c); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
483 return c; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
484 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
485 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
486 // Set up the device characteristics; baud rate, etc. |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
487 static Cyg_ErrNo |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
488 pc_serial_set_config(serial_channel *chan, cyg_uint32 key, const void *xbuf, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
489 cyg_uint32 *len) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
490 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
491 switch (key) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
492 case CYG_IO_SET_CONFIG_SERIAL_INFO: |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
493 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
494 cyg_serial_info_t *config = (cyg_serial_info_t *)xbuf; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
495 if ( *len < sizeof(cyg_serial_info_t) ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
496 return -EINVAL; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
497 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
498 *len = sizeof(cyg_serial_info_t); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
499 if ( true != serial_config_port(chan, config, false) ) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
500 return -EINVAL; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
501 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
502 break; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
503 #ifdef CYGOPT_IO_SERIAL_FLOW_CONTROL_HW |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
504 case CYG_IO_SET_CONFIG_SERIAL_HW_RX_FLOW_THROTTLE: |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
505 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
506 cyg_uint8 _mcr; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
507 pc_serial_info *ser_chan = (pc_serial_info *)chan->dev_priv; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
508 cyg_addrword_t base = ser_chan->base; |
|
841
e34f641b6e5c
Fix inconsistent use of CYG_IO_SET_CONFIG_SERIAL_HW_RX_FLOW_THROTTLE "flag"
gthomas
parents:
210
diff
changeset
|
509 cyg_uint32 *f = (cyg_uint32 *)xbuf; |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
510 unsigned char mask=0; |
|
163
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
161
diff
changeset
|
511 if ( *len < sizeof(*f) ) |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
512 return -EINVAL; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
513 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
514 if ( chan->config.flags & CYGNUM_SERIAL_FLOW_RTSCTS_RX ) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
515 mask = MCR_RTS; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
516 if ( chan->config.flags & CYGNUM_SERIAL_FLOW_DSRDTR_RX ) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
517 mask |= MCR_DTR; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
518 HAL_READ_UINT8(base+REG_mcr, _mcr); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
519 if (*f) // we should throttle |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
520 _mcr &= ~mask; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
521 else // we should no longer throttle |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
522 _mcr |= mask; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
523 HAL_WRITE_UINT8(base+REG_mcr, _mcr); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
524 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
525 break; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
526 case CYG_IO_SET_CONFIG_SERIAL_HW_FLOW_CONFIG: |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
527 // Nothing to do because we do support both RTSCTS and DSRDTR flow |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
528 // control. |
|
1120
4b4f3b3ba6e4
* src/ser_16x5x.c (CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY): Add
jlarmour
parents:
841
diff
changeset
|
529 // Other targets would clear any unsupported flags here and |
|
4b4f3b3ba6e4
* src/ser_16x5x.c (CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY): Add
jlarmour
parents:
841
diff
changeset
|
530 // would then return -ENOSUPP - the higher layer can then query |
|
4b4f3b3ba6e4
* src/ser_16x5x.c (CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY): Add
jlarmour
parents:
841
diff
changeset
|
531 // what flags are set and decide what to do. This is optimised for |
|
4b4f3b3ba6e4
* src/ser_16x5x.c (CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY): Add
jlarmour
parents:
841
diff
changeset
|
532 // the most common case - i.e. that authors know what their hardware |
|
4b4f3b3ba6e4
* src/ser_16x5x.c (CYG_IO_SERIAL_GENERIC_16X5X_INT_PRIORITY): Add
jlarmour
parents:
841
diff
changeset
|
533 // is capable of. |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
534 // We just return ENOERR. |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
535 break; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
536 #endif |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
537 default: |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
538 return -EINVAL; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
539 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
540 return ENOERR; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
541 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
542 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
543 // Enable the transmitter on the device |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
544 static void |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
545 pc_serial_start_xmit(serial_channel *chan) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
546 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
547 pc_serial_info *ser_chan = (pc_serial_info *)chan->dev_priv; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
548 cyg_addrword_t base = ser_chan->base; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
549 cyg_uint8 _ier; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
550 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
551 HAL_READ_UINT8(base+REG_ier, _ier); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
552 _ier |= IER_XMT; // Enable xmit interrupt |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
553 HAL_WRITE_UINT8(base+REG_ier, _ier); |
|
2401
55aa7418e249
Add option to 'prime' UART Tx - on behalf of Alexander Aganichev
gthomas
parents:
2325
diff
changeset
|
554 #ifdef CYGPKG_IO_SERIAL_GENERIC_16X5X_XMIT_REQUIRE_PRIME |
|
55aa7418e249
Add option to 'prime' UART Tx - on behalf of Alexander Aganichev
gthomas
parents:
2325
diff
changeset
|
555 (chan->callbacks->xmt_char)(chan); |
|
55aa7418e249
Add option to 'prime' UART Tx - on behalf of Alexander Aganichev
gthomas
parents:
2325
diff
changeset
|
556 #endif |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
557 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
558 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
559 // Disable the transmitter on the device |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
560 static void |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
561 pc_serial_stop_xmit(serial_channel *chan) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
562 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
563 pc_serial_info *ser_chan = (pc_serial_info *)chan->dev_priv; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
564 cyg_addrword_t base = ser_chan->base; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
565 cyg_uint8 _ier; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
566 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
567 HAL_READ_UINT8(base+REG_ier, _ier); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
568 _ier &= ~IER_XMT; // Disable xmit interrupt |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
569 HAL_WRITE_UINT8(base+REG_ier, _ier); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
570 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
571 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
572 // Serial I/O - low level interrupt handler (ISR) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
573 static cyg_uint32 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
574 pc_serial_ISR(cyg_vector_t vector, cyg_addrword_t data) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
575 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
576 serial_channel *chan = (serial_channel *)data; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
577 pc_serial_info *ser_chan = (pc_serial_info *)chan->dev_priv; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
578 cyg_drv_interrupt_mask(ser_chan->int_num); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
579 cyg_drv_interrupt_acknowledge(ser_chan->int_num); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
580 return CYG_ISR_CALL_DSR; // Cause DSR to be run |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
581 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
582 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
583 // Serial I/O - high level interrupt handler (DSR) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
584 static void |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
585 pc_serial_DSR(cyg_vector_t vector, cyg_ucount32 count, cyg_addrword_t data) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
586 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
587 serial_channel *chan = (serial_channel *)data; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
588 pc_serial_info *ser_chan = (pc_serial_info *)chan->dev_priv; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
589 cyg_addrword_t base = ser_chan->base; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
590 cyg_uint8 _isr; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
591 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
592 // Check if we have an interrupt pending - note that the interrupt |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
593 // is pending of the low bit of the isr is *0*, not 1. |
| 2818 | 594 SER_16X5X_READ_ISR(base, _isr); |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
595 while ((_isr & ISR_nIP) == 0) { |
|
150
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
145
diff
changeset
|
596 switch (_isr&0xE) { |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
597 case ISR_Rx: |
|
150
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
145
diff
changeset
|
598 case ISR_RxTO: |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
599 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
600 cyg_uint8 _lsr; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
601 unsigned char c; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
602 HAL_READ_UINT8(base+REG_lsr, _lsr); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
603 while(_lsr & LSR_RSR) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
604 HAL_READ_UINT8(base+REG_rhr, c); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
605 (chan->callbacks->rcv_char)(chan, c); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
606 HAL_READ_UINT8(base+REG_lsr, _lsr); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
607 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
608 break; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
609 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
610 case ISR_Tx: |
| 2124 | 611 #ifdef CYGPKG_IO_SERIAL_GENERIC_16X5X_FIFO |
| 612 ser_chan->tx_fifo_avail = ser_chan->tx_fifo_size; | |
| 613 #endif | |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
614 (chan->callbacks->xmt_char)(chan); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
615 break; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
616 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
617 #ifdef CYGOPT_IO_SERIAL_SUPPORT_LINE_STATUS |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
618 case ISR_LS: |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
619 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
620 cyg_serial_line_status_t stat; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
621 cyg_uint8 _lsr; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
622 HAL_READ_UINT8(base+REG_lsr, _lsr); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
623 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
624 // this might look expensive, but it is rarely the case that |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
625 // more than one of these is set |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
626 stat.value = 1; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
627 if ( _lsr & LSR_OE ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
628 stat.which = CYGNUM_SERIAL_STATUS_OVERRUNERR; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
629 (chan->callbacks->indicate_status)(chan, &stat ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
630 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
631 if ( _lsr & LSR_PE ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
632 stat.which = CYGNUM_SERIAL_STATUS_PARITYERR; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
633 (chan->callbacks->indicate_status)(chan, &stat ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
634 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
635 if ( _lsr & LSR_FE ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
636 stat.which = CYGNUM_SERIAL_STATUS_FRAMEERR; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
637 (chan->callbacks->indicate_status)(chan, &stat ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
638 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
639 if ( _lsr & LSR_BI ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
640 stat.which = CYGNUM_SERIAL_STATUS_BREAK; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
641 (chan->callbacks->indicate_status)(chan, &stat ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
642 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
643 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
644 break; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
645 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
646 case ISR_MS: |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
647 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
648 cyg_serial_line_status_t stat; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
649 cyg_uint8 _msr; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
650 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
651 HAL_READ_UINT8(base+REG_msr, _msr); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
652 #ifdef CYGOPT_IO_SERIAL_FLOW_CONTROL_HW |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
653 if ( _msr & MSR_DDSR ) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
654 if ( chan->config.flags & CYGNUM_SERIAL_FLOW_DSRDTR_TX ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
655 stat.which = CYGNUM_SERIAL_STATUS_FLOW; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
656 stat.value = (0 != (_msr & MSR_DSR)); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
657 (chan->callbacks->indicate_status)(chan, &stat ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
658 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
659 if ( _msr & MSR_DCTS ) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
660 if ( chan->config.flags & CYGNUM_SERIAL_FLOW_RTSCTS_TX ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
661 stat.which = CYGNUM_SERIAL_STATUS_FLOW; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
662 stat.value = (0 != (_msr & MSR_CTS)); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
663 (chan->callbacks->indicate_status)(chan, &stat ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
664 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
665 #endif |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
666 if ( _msr & MSR_DDCD ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
667 stat.which = CYGNUM_SERIAL_STATUS_CARRIERDETECT; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
668 stat.value = (0 != (_msr & MSR_CD)); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
669 (chan->callbacks->indicate_status)(chan, &stat ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
670 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
671 if ( _msr & MSR_RI ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
672 stat.which = CYGNUM_SERIAL_STATUS_RINGINDICATOR; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
673 stat.value = 1; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
674 (chan->callbacks->indicate_status)(chan, &stat ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
675 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
676 if ( _msr & MSR_TERI ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
677 stat.which = CYGNUM_SERIAL_STATUS_RINGINDICATOR; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
678 stat.value = 0; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
679 (chan->callbacks->indicate_status)(chan, &stat ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
680 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
681 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
682 break; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
683 #endif |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
684 default: |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
685 // Yes, this assertion may well not be visible. *But* |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
686 // if debugging, we may still successfully hit a breakpoint |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
687 // on cyg_assert_fail, which _is_ useful |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
688 CYG_FAIL("unhandled serial interrupt state"); |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
689 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
690 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
691 HAL_READ_UINT8(base+REG_isr, _isr); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
692 } // while |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
693 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
694 cyg_drv_interrupt_unmask(ser_chan->int_num); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
695 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
696 #endif |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
697 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
698 // EOF ser_16x5x.c |
