Mercurial > ecos
annotate packages/devs/serial/generic/16x5x/current/src/ser_16x5x.c @ 208:e0c0827131d1 ecos
Merge from eCos master repository on 2002-05-20-20:11:54-BST
| author | jlarmour |
|---|---|
| date | Mon, 20 May 2002 22:19:26 +0000 |
| parents | 0d2b193a635f |
| children | d2c90368aeef |
| 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 //========================================================================== |
|
208
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
8 //####ECOSGPLCOPYRIGHTBEGIN#### |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
9 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
10 // This file is part of eCos, the Embedded Configurable Operating System. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
12 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
13 // eCos is free software; you can redistribute it and/or modify it under |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
14 // the terms of the GNU General Public License as published by the Free |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
15 // Software Foundation; either version 2 or (at your option) any later version. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
16 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
19 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
20 // for more details. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
21 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
22 // You should have received a copy of the GNU General Public License along |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
23 // with eCos; if not, write to the Free Software Foundation, Inc., |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
25 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
26 // As a special exception, if other files instantiate templates or use macros |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
27 // or inline functions from this file, or you compile this file and link it |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
28 // with other works to produce a work based on this file, this file does not |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
29 // by itself cause the resulting work to be covered by the GNU General Public |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
30 // License. However the source code for this file must still be made available |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
31 // in accordance with section (3) of the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
32 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
33 // This exception does not invalidate any other reasons why a work based on |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
34 // this file might be covered by the GNU General Public License. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
35 // |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc. |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
37 // at http://sources.redhat.com/ecos/ecos-license |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
38 // ------------------------------------------- |
|
e0c0827131d1
Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents:
163
diff
changeset
|
39 //####ECOSGPLCOPYRIGHTEND#### |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
40 //========================================================================== |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
41 //#####DESCRIPTIONBEGIN#### |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
42 // |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
43 // Author(s): gthomas |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
44 // Contributors: gthomas, jlarmour, jskov |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
45 // Date: 1999-02-04 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
46 // Purpose: 16x5x generic serial driver |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
47 // Description: |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
48 // |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
49 //####DESCRIPTIONEND#### |
|
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 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
53 #include <pkgconf/system.h> |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
54 #include <pkgconf/io_serial.h> |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
55 #include <pkgconf/io.h> |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
56 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
57 #include <cyg/io/io.h> |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
58 #include <cyg/hal/hal_intr.h> |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
59 #include <cyg/io/devtab.h> |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
60 #include <cyg/io/serial.h> |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
61 #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
|
62 #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
|
63 #include <cyg/hal/hal_io.h> |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
64 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
65 // 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
|
66 #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
|
67 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
68 #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
|
69 #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
|
70 #endif |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
71 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
72 #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
|
73 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
74 // Receive control Registers |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
75 #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
|
76 #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
|
77 #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
|
78 #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
|
79 #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
|
80 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
81 // Transmit control Registers |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
82 #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
|
83 #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
|
84 #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
|
85 #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
|
86 #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
|
87 #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
|
88 #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
|
89 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
90 // Interrupt Enable Register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
91 #define IER_RCV 0x01 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
92 #define IER_XMT 0x02 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
93 #define IER_LS 0x04 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
94 #define IER_MS 0x08 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
95 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
96 // Line Control Register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
97 #define LCR_WL5 0x00 // Word length |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
98 #define LCR_WL6 0x01 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
99 #define LCR_WL7 0x02 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
100 #define LCR_WL8 0x03 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
101 #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
|
102 #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
|
103 #define LCR_SB2 0x04 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
104 #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
|
105 #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
|
106 #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
|
107 #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
|
108 #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
|
109 #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
|
110 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
111 // Line Status Register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
112 #define LSR_RSR 0x01 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
113 #define LSR_OE 0x02 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
114 #define LSR_PE 0x04 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
115 #define LSR_FE 0x08 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
116 #define LSR_BI 0x10 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
117 #define LSR_THE 0x20 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
118 #define LSR_TEMT 0x40 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
119 #define LSR_FIE 0x80 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
120 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
121 // Modem Control Register |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
122 #define MCR_DTR 0x01 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
123 #define MCR_RTS 0x02 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
124 #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
|
125 #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
|
126 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
127 // Interrupt status Register |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
128 #define ISR_MS 0x00 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
129 #define ISR_nIP 0x01 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
130 #define ISR_Tx 0x02 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
131 #define ISR_Rx 0x04 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
132 #define ISR_LS 0x06 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
133 #define ISR_RxTO 0x0C |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
134 #define ISR_64BFIFO 0x20 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
135 #define ISR_FIFOworks 0x40 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
136 #define ISR_FIFOen 0x80 |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
137 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
138 // Modem Status Register |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
139 #define MSR_DCTS 0x01 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
140 #define MSR_DDSR 0x02 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
141 #define MSR_TERI 0x04 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
142 #define MSR_DDCD 0x08 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
143 #define MSR_CTS 0x10 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
144 #define MSR_DSR 0x20 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
145 #define MSR_RI 0x40 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
146 #define MSR_CD 0x80 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
147 |
|
145
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
143
diff
changeset
|
148 // FIFO Control Register |
|
2e9a636d9de9
Merge from eCos master repository on 2000-12-21-14:18:40-GMT
jlarmour
parents:
143
diff
changeset
|
149 #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
|
150 #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
|
151 #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
|
152 #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
|
153 #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
|
154 #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
|
155 #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
|
156 #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
|
157 #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
|
158 |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
159 static unsigned char select_word_length[] = { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
160 LCR_WL5, // 5 bits / word (char) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
161 LCR_WL6, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
162 LCR_WL7, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
163 LCR_WL8 |
|
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 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
166 static unsigned char select_stop_bits[] = { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
167 0, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
168 LCR_SB1, // 1 stop bit |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
169 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
|
170 LCR_SB2 // 2 stop bits |
|
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 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
173 static unsigned char select_parity[] = { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
174 LCR_PN, // No parity |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
175 LCR_PE, // Even parity |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
176 LCR_PO, // Odd parity |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
177 LCR_PM, // Mark parity |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
178 LCR_PS, // Space parity |
|
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 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
181 // 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
|
182 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
183 typedef struct pc_serial_info { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
184 cyg_addrword_t base; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
185 int int_num; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
186 cyg_interrupt serial_interrupt; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
187 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
|
188 #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
|
189 enum { |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
190 sNone = 0, |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
191 s8250, |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
192 s16450, |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
193 s16550, |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
194 s16550a |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
195 } deviceType; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
196 #endif |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
197 } pc_serial_info; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
198 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
199 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
|
200 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
|
201 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
|
202 struct cyg_devtab_entry *sub_tab, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
203 const char *name); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
204 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
|
205 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
|
206 const void *xbuf, cyg_uint32 *len); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
207 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
|
208 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
|
209 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
210 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
|
211 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
|
212 cyg_addrword_t data); |
|
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 SERIAL_FUNS(pc_serial_funs, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
215 pc_serial_putc, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
216 pc_serial_getc, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
217 pc_serial_set_config, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
218 pc_serial_start_xmit, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
219 pc_serial_stop_xmit |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
220 ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
221 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
222 #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
|
223 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
224 // 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
|
225 // baud rate, etc. |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
226 static bool |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
227 serial_config_port(serial_channel *chan, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
228 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
|
229 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
230 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
|
231 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
|
232 unsigned short baud_divisor = select_baud[new_config->baud]; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
233 unsigned char _lcr, _ier; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
234 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
|
235 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
236 // Disable port interrupts while changing hardware |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
237 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
|
238 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
|
239 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
240 _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
|
241 select_stop_bits[new_config->stop] | |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
242 select_parity[new_config->parity]; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
243 HAL_WRITE_UINT8(base+REG_lcr, _lcr | LCR_DL); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
244 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
|
245 HAL_WRITE_UINT8(base+REG_ldl, baud_divisor & 0xFF); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
246 HAL_WRITE_UINT8(base+REG_lcr, _lcr); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
247 if (init) { |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
150
diff
changeset
|
248 #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
|
249 unsigned char _fcr_thresh; |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
250 cyg_uint8 b; |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
150
diff
changeset
|
251 |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
252 /* 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
|
253 ser_chan->deviceType = sNone; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
254 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
|
255 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
|
256 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
|
257 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
|
258 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
|
259 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
|
260 ser_chan->deviceType = s8250; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
261 } |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
262 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
|
263 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
264 if (ser_chan->deviceType == s8250) { |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
265 // 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
|
266 // indicates 16450 or above. |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
267 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
|
268 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
|
269 if (b == 0x55) { |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
270 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
|
271 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
|
272 if (b == 0xAA) |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
273 ser_chan->deviceType = s16450; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
274 } |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
150
diff
changeset
|
275 } |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
276 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
277 if (ser_chan->deviceType == s16450) { |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
278 // Check for a FIFO |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
279 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
|
280 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
|
281 if (b & ISR_FIFOen) |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
282 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
|
283 // necessarily work |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
284 if (b & ISR_FIFOworks) |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
285 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
|
286 } |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
287 |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
288 if (ser_chan->deviceType == s16550a) { |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
289 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
|
290 default: |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
291 case 1: |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
292 _fcr_thresh=FCR_RT1; break; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
293 case 4: |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
294 _fcr_thresh=FCR_RT4; break; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
295 case 8: |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
296 _fcr_thresh=FCR_RT8; break; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
297 case 14: |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
298 _fcr_thresh=FCR_RT14; break; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
299 } |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
300 _fcr_thresh|=FCR_FE|FCR_CRF|FCR_CTF; |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
301 HAL_WRITE_UINT8(base+REG_fcr, _fcr_thresh); // Enable and clear FIFO |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
302 } |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
303 else |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
304 HAL_WRITE_UINT8(base+REG_fcr, 0); // make sure it's disabled |
|
156
b939e9cada46
Merge from eCos master repository on 2001-03-29-21:44:39-BST
jlarmour
parents:
150
diff
changeset
|
305 #endif |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
306 if (chan->out_cbuf.len != 0) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
307 _ier = IER_RCV; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
308 } else { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
309 _ier = 0; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
310 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
311 // Master interrupt enable |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
312 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
|
313 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
314 #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
|
315 _ier |= (IER_LS|IER_MS); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
316 #endif |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
317 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
|
318 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
319 if (new_config != &chan->config) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
320 chan->config = *new_config; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
321 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
322 return true; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
323 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
324 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
325 // 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
|
326 static bool |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
327 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
|
328 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
329 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
|
330 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
|
331 #ifdef CYGDBG_IO_INIT |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
332 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
|
333 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
|
334 #endif |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
335 // 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
|
336 (chan->callbacks->serial_init)(chan); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
337 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
338 if (chan->out_cbuf.len != 0) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
339 cyg_drv_interrupt_create(ser_chan->int_num, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
340 99, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
341 (cyg_addrword_t)chan, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
342 pc_serial_ISR, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
343 pc_serial_DSR, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
344 &ser_chan->serial_interrupt_handle, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
345 &ser_chan->serial_interrupt); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
346 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
|
347 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
|
348 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
349 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
|
350 return true; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
351 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
352 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
353 // 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
|
354 static Cyg_ErrNo |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
355 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
|
356 struct cyg_devtab_entry *sub_tab, |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
357 const char *name) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
358 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
359 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
|
360 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
361 // 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
|
362 (chan->callbacks->serial_init)(chan); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
363 return ENOERR; |
|
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 // 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
|
367 // 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
|
368 static bool |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
369 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
|
370 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
371 cyg_uint8 _lsr; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
372 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
|
373 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
|
374 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
375 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
|
376 if (_lsr & LSR_THE) { |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
377 // Transmit buffer is empty |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
378 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
|
379 return true; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
380 } |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
381 // No space |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
382 return false; |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
383 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
384 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
385 // 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
|
386 static unsigned char |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
387 pc_serial_getc(serial_channel *chan) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
388 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
389 unsigned char c; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
390 cyg_uint8 _lsr; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
391 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
|
392 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
|
393 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
394 // Wait for char |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
395 do { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
396 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
|
397 } while ((_lsr & LSR_RSR) == 0); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
398 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
399 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
|
400 return c; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
401 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
402 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
403 // 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
|
404 static Cyg_ErrNo |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
405 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
|
406 cyg_uint32 *len) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
407 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
408 switch (key) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
409 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
|
410 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
411 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
|
412 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
|
413 return -EINVAL; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
414 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
415 *len = sizeof(cyg_serial_info_t); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
416 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
|
417 return -EINVAL; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
418 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
419 break; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
420 #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
|
421 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
|
422 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
423 cyg_uint8 _mcr; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
424 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
|
425 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
|
426 cyg_uint8 *f = (cyg_uint8 *)xbuf; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
427 unsigned char mask=0; |
|
163
0d2b193a635f
Merge from eCos master repository on 2001-06-22-17:38:39-BST
jlarmour
parents:
161
diff
changeset
|
428 if ( *len < sizeof(*f) ) |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
429 return -EINVAL; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
430 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
431 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
|
432 mask = MCR_RTS; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
433 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
|
434 mask |= MCR_DTR; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
435 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
|
436 if (*f) // we should throttle |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
437 _mcr &= ~mask; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
438 else // we should no longer throttle |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
439 _mcr |= mask; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
440 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
|
441 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
442 break; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
443 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
|
444 // 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
|
445 // control. |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
446 // Other targets would clear any unsupported flags here. |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
447 // We just return ENOERR. |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
448 break; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
449 #endif |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
450 default: |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
451 return -EINVAL; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
452 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
453 return ENOERR; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
454 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
455 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
456 // Enable the transmitter on the device |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
457 static void |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
458 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
|
459 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
460 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
|
461 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
|
462 cyg_uint8 _ier; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
463 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
464 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
|
465 _ier |= IER_XMT; // Enable xmit interrupt |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
466 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
|
467 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
468 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
469 // Disable the transmitter on the device |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
470 static void |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
471 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
|
472 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
473 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
|
474 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
|
475 cyg_uint8 _ier; |
|
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 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
|
478 _ier &= ~IER_XMT; // Disable xmit interrupt |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
479 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
|
480 } |
|
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 // 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
|
483 static cyg_uint32 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
484 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
|
485 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
486 serial_channel *chan = (serial_channel *)data; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
487 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
|
488 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
|
489 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
|
490 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
|
491 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
492 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
493 // 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
|
494 static void |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
495 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
|
496 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
497 serial_channel *chan = (serial_channel *)data; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
498 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
|
499 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
|
500 cyg_uint8 _isr; |
|
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 // 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
|
503 // is pending of the low bit of the isr is *0*, not 1. |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
504 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
|
505 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
|
506 switch (_isr&0xE) { |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
507 case ISR_Rx: |
|
150
f0e3fb000de8
Merge from eCos master repository on 2001-01-26-06:43:02-GMT
jlarmour
parents:
145
diff
changeset
|
508 case ISR_RxTO: |
|
126
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
509 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
510 cyg_uint8 _lsr; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
511 unsigned char c; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
512 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
|
513 while(_lsr & LSR_RSR) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
514 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
|
515 (chan->callbacks->rcv_char)(chan, c); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
516 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
|
517 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
518 break; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
519 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
520 case ISR_Tx: |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
521 (chan->callbacks->xmt_char)(chan); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
522 break; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
523 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
524 #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
|
525 case ISR_LS: |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
526 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
527 cyg_serial_line_status_t stat; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
528 cyg_uint8 _lsr; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
529 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
|
530 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
531 // 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
|
532 // 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
|
533 stat.value = 1; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
534 if ( _lsr & LSR_OE ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
535 stat.which = CYGNUM_SERIAL_STATUS_OVERRUNERR; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
536 (chan->callbacks->indicate_status)(chan, &stat ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
537 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
538 if ( _lsr & LSR_PE ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
539 stat.which = CYGNUM_SERIAL_STATUS_PARITYERR; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
540 (chan->callbacks->indicate_status)(chan, &stat ); |
|
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 if ( _lsr & LSR_FE ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
543 stat.which = CYGNUM_SERIAL_STATUS_FRAMEERR; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
544 (chan->callbacks->indicate_status)(chan, &stat ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
545 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
546 if ( _lsr & LSR_BI ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
547 stat.which = CYGNUM_SERIAL_STATUS_BREAK; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
548 (chan->callbacks->indicate_status)(chan, &stat ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
549 } |
|
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 break; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
552 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
553 case ISR_MS: |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
554 { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
555 cyg_serial_line_status_t stat; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
556 cyg_uint8 _msr; |
|
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 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
|
559 #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
|
560 if ( _msr & MSR_DDSR ) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
561 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
|
562 stat.which = CYGNUM_SERIAL_STATUS_FLOW; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
563 stat.value = (0 != (_msr & MSR_DSR)); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
564 (chan->callbacks->indicate_status)(chan, &stat ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
565 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
566 if ( _msr & MSR_DCTS ) |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
567 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
|
568 stat.which = CYGNUM_SERIAL_STATUS_FLOW; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
569 stat.value = (0 != (_msr & MSR_CTS)); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
570 (chan->callbacks->indicate_status)(chan, &stat ); |
|
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 #endif |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
573 if ( _msr & MSR_DDCD ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
574 stat.which = CYGNUM_SERIAL_STATUS_CARRIERDETECT; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
575 stat.value = (0 != (_msr & MSR_CD)); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
576 (chan->callbacks->indicate_status)(chan, &stat ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
577 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
578 if ( _msr & MSR_RI ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
579 stat.which = CYGNUM_SERIAL_STATUS_RINGINDICATOR; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
580 stat.value = 1; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
581 (chan->callbacks->indicate_status)(chan, &stat ); |
|
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 if ( _msr & MSR_TERI ) { |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
584 stat.which = CYGNUM_SERIAL_STATUS_RINGINDICATOR; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
585 stat.value = 0; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
586 (chan->callbacks->indicate_status)(chan, &stat ); |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
587 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
588 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
589 break; |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
590 #endif |
|
161
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
591 default: |
|
ac086aa3217e
Merge from eCos master repository on 2001-06-08-21:11:51-BST
jlarmour
parents:
156
diff
changeset
|
592 // 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
|
593 // 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
|
594 // 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
|
595 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
|
596 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
597 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
598 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
|
599 } // while |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
600 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
601 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
|
602 } |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
603 #endif |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
604 |
|
518f42066aba
Merge from eCos master repository on 2000-09-19-06:25:26-BST
jlarmour
parents:
diff
changeset
|
605 // EOF ser_16x5x.c |
