annotate packages/hal/powerpc/csb281/current/src/hal_diag.c @ 472:3bad6dc606d2

Add new board port for Cogent CSB281
author gthomas
date Tue, 24 Dec 2002 16:00:44 +0000
parents
children a8431517bdd1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
472
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
1 //=============================================================================
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
2 //
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
3 // hal_diag.c
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
4 //
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
5 // HAL diagnostic I/O code
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
6 //
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
7 //=============================================================================
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
9 // -------------------------------------------
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
10 // This file is part of eCos, the Embedded Configurable Operating System.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
12 // Copyright (C) 2002 Gary Thomas
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
13 //
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
14 // eCos is free software; you can redistribute it and/or modify it under
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
15 // the terms of the GNU General Public License as published by the Free
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
16 // Software Foundation; either version 2 or (at your option) any later version.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
17 //
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
18 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
19 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
20 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
21 // for more details.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
22 //
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
23 // You should have received a copy of the GNU General Public License along
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
24 // with eCos; if not, write to the Free Software Foundation, Inc.,
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
25 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
26 //
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
27 // As a special exception, if other files instantiate templates or use macros
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
28 // or inline functions from this file, or you compile this file and link it
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
29 // with other works to produce a work based on this file, this file does not
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
30 // by itself cause the resulting work to be covered by the GNU General Public
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
31 // License. However the source code for this file must still be made available
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
32 // in accordance with section (3) of the GNU General Public License.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
33 //
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
34 // This exception does not invalidate any other reasons why a work based on
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
35 // this file might be covered by the GNU General Public License.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
36 //
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
37 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
38 // at http://sources.redhat.com/ecos/ecos-license/
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
39 // -------------------------------------------
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
40 //####ECOSGPLCOPYRIGHTEND####
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
41 //=============================================================================
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
42 //#####DESCRIPTIONBEGIN####
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
43 //
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
44 // Author(s): hmt
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
45 // Contributors:hmt, gthomas
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
46 // Date: 1999-06-08
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
47 // Purpose: HAL diagnostic output
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
48 // Description: Implementations of HAL diagnostic I/O support.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
49 //
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
50 //####DESCRIPTIONEND####
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
51 //
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
52 //=============================================================================
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
53
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
54 #include <pkgconf/hal.h>
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
55
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
56 #include <cyg/infra/cyg_type.h> // base types
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
57 #include <cyg/infra/cyg_trac.h> // tracing macros
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
58 #include <cyg/infra/cyg_ass.h> // assertion macros
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
59
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
60 #include <cyg/hal/hal_io.h> // IO macros
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
61 #include <cyg/hal/hal_diag.h>
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
62 #include <cyg/hal/hal_intr.h> // Interrupt macros
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
63 #include <cyg/hal/drv_api.h>
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
64
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
65 #if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
66 #include <cyg/hal/hal_stub.h> // hal_output_gdb_string
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
67 #endif
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
68
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
69 #include <cyg/hal/ppc_regs.h>
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
70
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
71 //=============================================================================
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
72 // Serial driver
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
73 //=============================================================================
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
74
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
75 //-----------------------------------------------------------------------------
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
76 // There are two serial ports.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
77 #define CYG_DEV_SERIAL_BASE_A 0xF0004500 // port A
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
78 #define CYG_DEV_SERIAL_BASE_B 0xF0004600 // port B
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
79
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
80 //-----------------------------------------------------------------------------
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
81 // Default baud rate is 38400
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
82 #define _MEMCLK (CYGHWR_HAL_POWERPC_MEM_SPEED*1000000)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
83 #define _BAUD CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
84 #define CYG_DEV_SERIAL_RS232_T1_VALUE_B38400 (((_MEMCLK/16)/_BAUD) >> 8)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
85 #define CYG_DEV_SERIAL_RS232_T2_VALUE_B38400 (((_MEMCLK/16)/_BAUD) & 0xFF)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
86
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
87 //-----------------------------------------------------------------------------
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
88 // Define the serial registers. The 8245 has a 16552 UART builtin.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
89 //
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
90 #define CYG_DEV_SERIAL_RBR 0x00 // receiver buffer register, read, dlab = 0
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
91 #define CYG_DEV_SERIAL_THR 0x00 // transmitter holding register, write, dlab = 0
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
92 #define CYG_DEV_SERIAL_DLL 0x00 // divisor latch (LS), read/write, dlab = 1
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
93 #define CYG_DEV_SERIAL_IER 0x01 // interrupt enable register, read/write, dlab = 0
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
94 #define CYG_DEV_SERIAL_DLM 0x01 // divisor latch (MS), read/write, dlab = 1
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
95 #define CYG_DEV_SERIAL_IIR 0x02 // interrupt identification register, read, dlab = 0
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
96 #define CYG_DEV_SERIAL_FCR 0x02 // fifo control register, write, dlab = 0
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
97 #define CYG_DEV_SERIAL_AFR 0x02 // alternate function register, read/write, dlab = 1
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
98 #define CYG_DEV_SERIAL_LCR 0x03 // line control register, read/write
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
99 #define CYG_DEV_SERIAL_MCR 0x04
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
100 #define CYG_DEV_SERIAL_MCR_A 0x04
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
101 #define CYG_DEV_SERIAL_MCR_B 0x04
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
102 #define CYG_DEV_SERIAL_LSR 0x05 // line status register, read
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
103 #define CYG_DEV_SERIAL_MSR 0x06 // modem status register, read
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
104 #define CYG_DEV_SERIAL_SCR 0x07 // scratch pad register
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
105
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
106 // The interrupt enable register bits.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
107 #define SIO_IER_ERDAI 0x01 // enable received data available irq
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
108 #define SIO_IER_ETHREI 0x02 // enable THR empty interrupt
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
109 #define SIO_IER_ELSI 0x04 // enable receiver line status irq
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
110 #define SIO_IER_EMSI 0x08 // enable modem status interrupt
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
111
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
112 // The interrupt identification register bits.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
113 #define SIO_IIR_IP 0x01 // 0 if interrupt pending
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
114 #define SIO_IIR_ID_MASK 0x0e // mask for interrupt ID bits
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
115 #define ISR_Tx 0x02
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
116 #define ISR_Rx 0x04
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
117
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
118 // The line status register bits.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
119 #define SIO_LSR_DR 0x01 // data ready
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
120 #define SIO_LSR_OE 0x02 // overrun error
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
121 #define SIO_LSR_PE 0x04 // parity error
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
122 #define SIO_LSR_FE 0x08 // framing error
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
123 #define SIO_LSR_BI 0x10 // break interrupt
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
124 #define SIO_LSR_THRE 0x20 // transmitter holding register empty
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
125 #define SIO_LSR_TEMT 0x40 // transmitter register empty
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
126 #define SIO_LSR_ERR 0x80 // any error condition
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
127
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
128 // The modem status register bits.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
129 #define SIO_MSR_DCTS 0x01 // delta clear to send
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
130 #define SIO_MSR_DDSR 0x02 // delta data set ready
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
131 #define SIO_MSR_TERI 0x04 // trailing edge ring indicator
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
132 #define SIO_MSR_DDCD 0x08 // delta data carrier detect
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
133 #define SIO_MSR_CTS 0x10 // clear to send
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
134 #define SIO_MSR_DSR 0x20 // data set ready
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
135 #define SIO_MSR_RI 0x40 // ring indicator
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
136 #define SIO_MSR_DCD 0x80 // data carrier detect
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
137
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
138 // The line control register bits.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
139 #define SIO_LCR_WLS0 0x01 // word length select bit 0
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
140 #define SIO_LCR_WLS1 0x02 // word length select bit 1
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
141 #define SIO_LCR_STB 0x04 // number of stop bits
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
142 #define SIO_LCR_PEN 0x08 // parity enable
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
143 #define SIO_LCR_EPS 0x10 // even parity select
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
144 #define SIO_LCR_SP 0x20 // stick parity
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
145 #define SIO_LCR_SB 0x40 // set break
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
146 #define SIO_LCR_DLAB 0x80 // divisor latch access bit
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
147
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
148 // The FIFO control register
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
149 #define SIO_FCR_FCR0 0x01 // enable xmit and rcvr fifos
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
150 #define SIO_FCR_FCR1 0x02 // clear RCVR FIFO
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
151 #define SIO_FCR_FCR2 0x04 // clear XMIT FIFO
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
152
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
153
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
154 //-----------------------------------------------------------------------------
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
155 typedef struct {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
156 cyg_uint8* base;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
157 cyg_int32 msec_timeout;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
158 int isr_vector;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
159 } channel_data_t;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
160
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
161 //-----------------------------------------------------------------------------
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
162 static void
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
163 init_serial_channel(const channel_data_t* __ch_data)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
164 {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
165 cyg_uint8* base = __ch_data->base;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
166 cyg_uint8 lcr;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
167
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
168 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_IER, 0);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
169
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
170 // Disable and clear FIFOs (need to enable to clear).
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
171 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_FCR,
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
172 (SIO_FCR_FCR0 | SIO_FCR_FCR1 | SIO_FCR_FCR2));
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
173 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_FCR, 0);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
174
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
175 // 8-1-no parity.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
176 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_LCR, SIO_LCR_WLS0 | SIO_LCR_WLS1);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
177
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
178 // Set speed to 38400.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
179 HAL_READ_UINT8(base+CYG_DEV_SERIAL_LCR, lcr);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
180 lcr |= SIO_LCR_DLAB;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
181 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_LCR, lcr);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
182
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
183
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
184 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_DLL,
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
185 CYG_DEV_SERIAL_RS232_T2_VALUE_B38400);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
186 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_DLM,
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
187 CYG_DEV_SERIAL_RS232_T1_VALUE_B38400);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
188 lcr &= ~SIO_LCR_DLAB;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
189 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_LCR, lcr);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
190
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
191 #if 0 // Necessary?
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
192 {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
193 // Special initialization for ST16C552 on CMA102
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
194 cyg_uint8 mcr;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
195
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
196 HAL_READ_UINT8(base+CYG_DEV_SERIAL_MCR_A, mcr);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
197 mcr |= 8;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
198 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_MCR_A, mcr);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
199
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
200 HAL_READ_UINT8(base+CYG_DEV_SERIAL_MCR_B, mcr);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
201 mcr |= 8;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
202 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_MCR_B, mcr);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
203 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
204 #endif
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
205
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
206 // Enable FIFOs (and clear them).
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
207 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_FCR,
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
208 (SIO_FCR_FCR0 | SIO_FCR_FCR1 | SIO_FCR_FCR2));
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
209 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
210
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
211 static cyg_bool
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
212 cyg_hal_plf_serial_getc_nonblock(void* __ch_data, cyg_uint8* ch)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
213 {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
214 cyg_uint8* base = ((channel_data_t*)__ch_data)->base;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
215 cyg_uint8 lsr;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
216
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
217 HAL_READ_UINT8(base+CYG_DEV_SERIAL_LSR, lsr);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
218 if ((lsr & SIO_LSR_DR) == 0)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
219 return false;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
220
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
221 HAL_READ_UINT8(base+CYG_DEV_SERIAL_RBR, *ch);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
222
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
223 return true;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
224 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
225
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
226
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
227 cyg_uint8
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
228 cyg_hal_plf_serial_getc(void* __ch_data)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
229 {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
230 cyg_uint8 ch;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
231 CYGARC_HAL_SAVE_GP();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
232
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
233 while(!cyg_hal_plf_serial_getc_nonblock(__ch_data, &ch));
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
234
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
235 CYGARC_HAL_RESTORE_GP();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
236 return ch;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
237 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
238
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
239 void
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
240 cyg_hal_plf_serial_putc(void* __ch_data, cyg_uint8 c)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
241 {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
242 cyg_uint8* base = ((channel_data_t*)__ch_data)->base;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
243 cyg_uint8 lsr;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
244 CYGARC_HAL_SAVE_GP();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
245
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
246 do {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
247 HAL_READ_UINT8(base+CYG_DEV_SERIAL_LSR, lsr);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
248 } while ((lsr & SIO_LSR_THRE) == 0);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
249
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
250 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_THR, c);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
251
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
252 // Hang around until the character has been safely sent.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
253 do {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
254 HAL_READ_UINT8(base+CYG_DEV_SERIAL_LSR, lsr);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
255 } while ((lsr & SIO_LSR_THRE) == 0);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
256
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
257 CYGARC_HAL_RESTORE_GP();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
258 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
259
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
260 static const channel_data_t channels[2] = {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
261 { (cyg_uint8*)CYG_DEV_SERIAL_BASE_A, 1000, CYGNUM_HAL_INTERRUPT_UART0},
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
262 #if (CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS > 1)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
263 { (cyg_uint8*)CYG_DEV_SERIAL_BASE_B, 1000, CYGNUM_HAL_INTERRUPT_UART1},
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
264 #endif
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
265 };
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
266
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
267 static void
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
268 cyg_hal_plf_serial_write(void* __ch_data, const cyg_uint8* __buf,
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
269 cyg_uint32 __len)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
270 {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
271 CYGARC_HAL_SAVE_GP();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
272
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
273 while(__len-- > 0)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
274 cyg_hal_plf_serial_putc(__ch_data, *__buf++);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
275
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
276 CYGARC_HAL_RESTORE_GP();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
277 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
278
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
279 static void
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
280 cyg_hal_plf_serial_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
281 {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
282 CYGARC_HAL_SAVE_GP();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
283
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
284 while(__len-- > 0)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
285 *__buf++ = cyg_hal_plf_serial_getc(__ch_data);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
286
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
287 CYGARC_HAL_RESTORE_GP();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
288 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
289
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
290 cyg_bool
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
291 cyg_hal_plf_serial_getc_timeout(void* __ch_data, cyg_uint8* ch)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
292 {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
293 int delay_count;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
294 channel_data_t* chan = (channel_data_t*)__ch_data;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
295 cyg_bool res;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
296 CYGARC_HAL_SAVE_GP();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
297
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
298 delay_count = chan->msec_timeout * 10; // delay in .1 ms steps
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
299 for(;;) {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
300 res = cyg_hal_plf_serial_getc_nonblock(__ch_data, ch);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
301 if (res || 0 == delay_count--)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
302 break;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
303
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
304 CYGACC_CALL_IF_DELAY_US(100);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
305 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
306
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
307 CYGARC_HAL_RESTORE_GP();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
308 return res;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
309 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
310
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
311 static int
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
312 cyg_hal_plf_serial_control(void *__ch_data, __comm_control_cmd_t __func, ...)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
313 {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
314 static int irq_state = 0;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
315 channel_data_t* chan = (channel_data_t*)__ch_data;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
316 cyg_uint8 ier;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
317 int ret = 0;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
318 CYGARC_HAL_SAVE_GP();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
319
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
320 switch (__func) {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
321 case __COMMCTL_IRQ_ENABLE:
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
322 HAL_INTERRUPT_UNMASK(chan->isr_vector);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
323 HAL_INTERRUPT_SET_LEVEL(chan->isr_vector, 1);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
324 HAL_READ_UINT8(chan->base+CYG_DEV_SERIAL_IER, ier);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
325 ier |= SIO_IER_ERDAI;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
326 HAL_WRITE_UINT8(chan->base+CYG_DEV_SERIAL_IER, ier);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
327 irq_state = 1;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
328 break;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
329 case __COMMCTL_IRQ_DISABLE:
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
330 ret = irq_state;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
331 irq_state = 0;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
332 HAL_INTERRUPT_MASK(chan->isr_vector);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
333 HAL_READ_UINT8(chan->base+CYG_DEV_SERIAL_IER, ier);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
334 ier &= ~SIO_IER_ERDAI;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
335 HAL_WRITE_UINT8(chan->base+CYG_DEV_SERIAL_IER, ier);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
336 break;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
337 case __COMMCTL_DBG_ISR_VECTOR:
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
338 ret = chan->isr_vector;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
339 break;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
340 case __COMMCTL_SET_TIMEOUT:
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
341 {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
342 va_list ap;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
343
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
344 va_start(ap, __func);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
345
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
346 ret = chan->msec_timeout;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
347 chan->msec_timeout = va_arg(ap, cyg_uint32);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
348
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
349 va_end(ap);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
350 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
351 default:
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
352 break;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
353 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
354 CYGARC_HAL_RESTORE_GP();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
355 return ret;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
356 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
357
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
358 static int
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
359 cyg_hal_plf_serial_isr(void *__ch_data, int* __ctrlc,
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
360 CYG_ADDRWORD __vector, CYG_ADDRWORD __data)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
361 {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
362 channel_data_t* chan = (channel_data_t*)__ch_data;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
363 cyg_uint8 _iir;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
364 int res = 0;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
365 CYGARC_HAL_SAVE_GP();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
366
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
367 HAL_READ_UINT8(chan->base+CYG_DEV_SERIAL_IIR, _iir);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
368 _iir &= SIO_IIR_ID_MASK;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
369
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
370 *__ctrlc = 0;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
371 if ( ISR_Rx == _iir ) {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
372 cyg_uint8 c, lsr;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
373 HAL_READ_UINT8(chan->base+CYG_DEV_SERIAL_LSR, lsr);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
374 if (lsr & SIO_LSR_DR) {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
375
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
376 HAL_READ_UINT8(chan->base+CYG_DEV_SERIAL_RBR, c);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
377
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
378 if( cyg_hal_is_break( &c , 1 ) )
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
379 *__ctrlc = 1;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
380 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
381
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
382 // Acknowledge the interrupt
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
383 HAL_INTERRUPT_ACKNOWLEDGE(chan->isr_vector);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
384 res = CYG_ISR_HANDLED;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
385 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
386
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
387 CYGARC_HAL_RESTORE_GP();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
388 return res;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
389 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
390
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
391 static void
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
392 cyg_hal_plf_serial_init(void)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
393 {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
394 hal_virtual_comm_table_t* comm;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
395 int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
396
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
397 // Disable interrupts.
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
398 HAL_INTERRUPT_MASK(channels[0].isr_vector);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
399 #if (CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS > 1)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
400 HAL_INTERRUPT_MASK(channels[1].isr_vector);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
401 #endif
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
402
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
403 // Init channels
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
404 init_serial_channel(&channels[0]);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
405 #if (CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS > 1)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
406 init_serial_channel(&channels[1]);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
407 #endif
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
408
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
409 // Setup procs in the vector table
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
410
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
411 // Set channel 0
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
412 CYGACC_CALL_IF_SET_CONSOLE_COMM(0);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
413 comm = CYGACC_CALL_IF_CONSOLE_PROCS();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
414 CYGACC_COMM_IF_CH_DATA_SET(*comm, &channels[0]);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
415 CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_serial_write);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
416 CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_serial_read);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
417 CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_serial_putc);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
418 CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_serial_getc);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
419 CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_serial_control);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
420 CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_serial_isr);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
421 CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_serial_getc_timeout);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
422
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
423 #if (CYGNUM_HAL_VIRTUAL_VECTOR_COMM_CHANNELS > 1)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
424 // Set channel 1
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
425 CYGACC_CALL_IF_SET_CONSOLE_COMM(1);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
426 comm = CYGACC_CALL_IF_CONSOLE_PROCS();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
427 CYGACC_COMM_IF_CH_DATA_SET(*comm, &channels[1]);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
428 CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_serial_write);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
429 CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_serial_read);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
430 CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_serial_putc);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
431 CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_serial_getc);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
432 CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_serial_control);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
433 CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_serial_isr);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
434 CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_serial_getc_timeout);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
435 #endif
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
436
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
437 // Restore original console
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
438 CYGACC_CALL_IF_SET_CONSOLE_COMM(cur);
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
439 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
440
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
441 void
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
442 cyg_hal_plf_comms_init(void)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
443 {
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
444 static int initialized = 0;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
445
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
446 if (initialized)
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
447 return;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
448 initialized = 1;
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
449
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
450 cyg_hal_plf_serial_init();
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
451 }
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
452
3bad6dc606d2 Add new board port for Cogent CSB281
gthomas
parents:
diff changeset
453 // EOF hal_diag.c