annotate packages/hal/arm/cma230/current/src/hal_diag.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 25e238959bae
children d2c90368aeef
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
1 /*=============================================================================
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
2 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
3 // hal_diag.c
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
4 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
5 // HAL diagnostic output code
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
6 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
7 //=============================================================================
208
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 151
diff changeset
8 //####ECOSGPLCOPYRIGHTBEGIN####
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 151
diff changeset
9 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 151
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: 151
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: 151
diff changeset
12 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 151
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: 151
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: 151
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: 151
diff changeset
16 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 151
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: 151
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: 151
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: 151
diff changeset
20 // for more details.
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 151
diff changeset
21 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 151
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: 151
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: 151
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: 151
diff changeset
25 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 151
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: 151
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: 151
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: 151
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: 151
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: 151
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: 151
diff changeset
32 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 151
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: 151
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: 151
diff changeset
35 //
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 151
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: 151
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: 151
diff changeset
38 // -------------------------------------------
e0c0827131d1 Merge from eCos master repository on 2002-05-20-20:11:54-BST
jlarmour
parents: 151
diff changeset
39 //####ECOSGPLCOPYRIGHTEND####
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
40 //=============================================================================
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
41 //#####DESCRIPTIONBEGIN####
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
42 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
43 // Author(s): nickg, gthomas
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
44 // Contributors: nickg, gthomas
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
45 // Date: 1998-03-02
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
46 // Purpose: HAL diagnostic output
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
47 // Description: Implementations of HAL diagnostic output support.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
48 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
49 //####DESCRIPTIONEND####
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
50 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
51 //===========================================================================*/
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
52
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
53 #include <pkgconf/hal.h>
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
54 #include <pkgconf/hal_arm_cma230.h> // board specifics
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
55
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
56 #include <cyg/infra/cyg_type.h> // base types
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
57 #include <cyg/infra/cyg_trac.h> // tracing macros
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
58 #include <cyg/infra/cyg_ass.h> // assertion macros
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
59
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
60 #include <cyg/hal/hal_arch.h> // basic machine info
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
61 #include <cyg/hal/hal_intr.h> // interrupt macros
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
62 #include <cyg/hal/hal_io.h> // IO macros
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
63 #include <cyg/hal/hal_diag.h>
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
64 #include <cyg/hal/hal_cma230.h> // Hardware definitions
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
65 #include <cyg/hal/hal_if.h> // Calling-if API
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
66 #include <cyg/hal/drv_api.h> // driver API
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
67 #include <cyg/hal/hal_misc.h> // Helper functions
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
68
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
69 static void cyg_hal_plf_serial_init(void);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
70
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
71 // FIXME: Copy LCD driver from powerpc/cogent
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
72 //static void cyg_hal_plf_lcd_init(void);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
73
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
74 void
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
75 cyg_hal_plf_comms_init(void)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
76 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
77 static int initialized = 0;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
78
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
79 if (initialized)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
80 return;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
81
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
82 initialized = 1;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
83
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
84 cyg_hal_plf_serial_init();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
85 // cyg_hal_plf_lcd_init();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
86 }
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
87
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
88 //=============================================================================
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
89 // Serial driver
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
90 //=============================================================================
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
91
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
92 //-----------------------------------------------------------------------------
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
93 // There are two serial ports.
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
94 #define CYG_DEV_SERIAL_BASE_A 0xe900047 // port A
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
95 #define CYG_DEV_SERIAL_BASE_B 0xe900007 // port B
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
96
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
97 //-----------------------------------------------------------------------------
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
98 // Default baud rate is 38400
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
99 // Based on 3.6864 MHz xtal
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
100 #if CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD==9600
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
101 #define CYG_DEV_SERIAL_BAUD_MSB 0x00
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
102 #define CYG_DEV_SERIAL_BAUD_LSB 0x18
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
103 #endif
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
104 #if CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD==19200
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
105 #define CYG_DEV_SERIAL_BAUD_MSB 0x00
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
106 #define CYG_DEV_SERIAL_BAUD_LSB 0x0C
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
107 #endif
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
108 #if CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD==38400
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
109 #define CYG_DEV_SERIAL_BAUD_MSB 0x00
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
110 #define CYG_DEV_SERIAL_BAUD_LSB 0x06
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
111 #endif
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
112 #if CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL_BAUD==115200
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
113 #define CYG_DEV_SERIAL_BAUD_MSB 0x00
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
114 #define CYG_DEV_SERIAL_BAUD_LSB 0x02
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
115 #endif
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
116
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
117 #ifndef CYG_DEV_SERIAL_BAUD_MSB
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
118 #error Missing/incorrect serial baud rate defined - CDL error?
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
119 #endif
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
120
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
121 //-----------------------------------------------------------------------------
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
122 // Define the serial registers. The Cogent board is equipped with a 16552
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
123 // serial chip.
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
124 #define CYG_DEV_SERIAL_RBR 0x00 // receiver buffer register, read, dlab = 0
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
125 #define CYG_DEV_SERIAL_THR 0x00 // transmitter holding register, write, dlab = 0
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
126 #define CYG_DEV_SERIAL_DLL 0x00 // divisor latch (LS), read/write, dlab = 1
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
127 #define CYG_DEV_SERIAL_IER 0x08 // interrupt enable register, read/write, dlab = 0
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
128 #define CYG_DEV_SERIAL_DLM 0x08 // divisor latch (MS), read/write, dlab = 1
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
129 #define CYG_DEV_SERIAL_IIR 0x10 // interrupt identification register, read, dlab = 0
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
130 #define CYG_DEV_SERIAL_FCR 0x10 // fifo control register, write, dlab = 0
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
131 #define CYG_DEV_SERIAL_AFR 0x10 // alternate function register, read/write, dlab = 1
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
132 #define CYG_DEV_SERIAL_LCR 0x18 // line control register, read/write
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
133 #define CYG_DEV_SERIAL_MCR 0x20
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
134 #define CYG_DEV_SERIAL_MCR_A 0x20
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
135 #define CYG_DEV_SERIAL_MCR_B 0x20
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
136 #define CYG_DEV_SERIAL_LSR 0x28 // line status register, read
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
137 #define CYG_DEV_SERIAL_MSR 0x30 // modem status register, read
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
138 #define CYG_DEV_SERIAL_SCR 0x38 // scratch pad register
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
139
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
140 // The interrupt enable register bits.
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
141 #define SIO_IER_ERDAI 0x01 // enable received data available irq
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
142 #define SIO_IER_ETHREI 0x02 // enable THR empty interrupt
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
143 #define SIO_IER_ELSI 0x04 // enable receiver line status irq
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
144 #define SIO_IER_EMSI 0x08 // enable modem status interrupt
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
145
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
146 // The interrupt identification register bits.
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
147 #define SIO_IIR_IP 0x01 // 0 if interrupt pending
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
148 #define SIO_IIR_ID_MASK 0x0e // mask for interrupt ID bits
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
149 #define ISR_Tx 0x02
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
150 #define ISR_Rx 0x04
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
151
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
152 // The line status register bits.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
153 #define SIO_LSR_DR 0x01 // data ready
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
154 #define SIO_LSR_OE 0x02 // overrun error
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
155 #define SIO_LSR_PE 0x04 // parity error
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
156 #define SIO_LSR_FE 0x08 // framing error
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
157 #define SIO_LSR_BI 0x10 // break interrupt
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
158 #define SIO_LSR_THRE 0x20 // transmitter holding register empty
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
159 #define SIO_LSR_TEMT 0x40 // transmitter register empty
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
160 #define SIO_LSR_ERR 0x80 // any error condition
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
161
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
162 // The modem status register bits.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
163 #define SIO_MSR_DCTS 0x01 // delta clear to send
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
164 #define SIO_MSR_DDSR 0x02 // delta data set ready
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
165 #define SIO_MSR_TERI 0x04 // trailing edge ring indicator
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
166 #define SIO_MSR_DDCD 0x08 // delta data carrier detect
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
167 #define SIO_MSR_CTS 0x10 // clear to send
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
168 #define SIO_MSR_DSR 0x20 // data set ready
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
169 #define SIO_MSR_RI 0x40 // ring indicator
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
170 #define SIO_MSR_DCD 0x80 // data carrier detect
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
171
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
172 // The line control register bits.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
173 #define SIO_LCR_WLS0 0x01 // word length select bit 0
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
174 #define SIO_LCR_WLS1 0x02 // word length select bit 1
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
175 #define SIO_LCR_STB 0x04 // number of stop bits
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
176 #define SIO_LCR_PEN 0x08 // parity enable
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
177 #define SIO_LCR_EPS 0x10 // even parity select
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
178 #define SIO_LCR_SP 0x20 // stick parity
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
179 #define SIO_LCR_SB 0x40 // set break
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
180 #define SIO_LCR_DLAB 0x80 // divisor latch access bit
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
181
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
182 // The FIFO control register
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
183 #define SIO_FCR_FCR0 0x01 // enable xmit and rcvr fifos
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
184 #define SIO_FCR_FCR1 0x02 // clear RCVR FIFO
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
185 #define SIO_FCR_FCR2 0x04 // clear XMIT FIFO
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
186
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
187
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
188 //-----------------------------------------------------------------------------
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
189 typedef struct {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
190 cyg_uint8* base;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
191 cyg_int32 msec_timeout;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
192 int isr_vector;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
193 } channel_data_t;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
194
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
195 //-----------------------------------------------------------------------------
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
196 static void
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
197 init_serial_channel(const channel_data_t* __ch_data)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
198 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
199 cyg_uint8* base = __ch_data->base;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
200 cyg_uint8 lcr;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
201
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
202 // 8-1-no parity.
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
203 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_LCR,
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
204 SIO_LCR_WLS0 | SIO_LCR_WLS1);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
205
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
206 HAL_READ_UINT8(base+CYG_DEV_SERIAL_LCR, lcr);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
207 lcr |= SIO_LCR_DLAB;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
208 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_LCR, lcr);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
209 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_DLL, CYG_DEV_SERIAL_BAUD_LSB);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
210 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_DLM, CYG_DEV_SERIAL_BAUD_MSB);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
211 lcr &= ~SIO_LCR_DLAB;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
212 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_LCR, lcr);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
213 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_FCR, 0x07); // Enable & clear FIFO
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
214 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
215
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
216 static cyg_bool
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
217 cyg_hal_plf_serial_getc_nonblock(void* __ch_data, cyg_uint8* ch)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
218 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
219 cyg_uint8* base = ((channel_data_t*)__ch_data)->base;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
220 cyg_uint8 lsr;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
221
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
222 HAL_READ_UINT8(base+CYG_DEV_SERIAL_LSR, lsr);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
223 if ((lsr & SIO_LSR_DR) == 0)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
224 return false;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
225
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
226 HAL_READ_UINT8(base+CYG_DEV_SERIAL_RBR, *ch);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
227
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
228 return true;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
229 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
230
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
231
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
232 cyg_uint8
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
233 cyg_hal_plf_serial_getc(void* __ch_data)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
234 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
235 cyg_uint8 ch;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
236 CYGARC_HAL_SAVE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
237
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
238 while(!cyg_hal_plf_serial_getc_nonblock(__ch_data, &ch));
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
239
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
240 CYGARC_HAL_RESTORE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
241 return ch;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
242 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
243
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
244 void
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
245 cyg_hal_plf_serial_putc(void* __ch_data, cyg_uint8 c)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
246 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
247 cyg_uint8* base = ((channel_data_t*)__ch_data)->base;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
248 cyg_uint8 lsr;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
249 CYGARC_HAL_SAVE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
250
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
251 do {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
252 HAL_READ_UINT8(base+CYG_DEV_SERIAL_LSR, lsr);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
253 } while ((lsr & SIO_LSR_THRE) == 0);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
254
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
255 HAL_WRITE_UINT8(base+CYG_DEV_SERIAL_THR, c);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
256
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
257 // Hang around until the character has been safely sent.
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
258 do {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
259 HAL_READ_UINT8(base+CYG_DEV_SERIAL_LSR, lsr);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
260 } while ((lsr & SIO_LSR_THRE) == 0);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
261
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
262 CYGARC_HAL_RESTORE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
263 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
264
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
265 static const channel_data_t channels[2] = {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
266 { (cyg_uint8*)CMA101_DUARTA, 1000, CYGNUM_HAL_INTERRUPT_SERIAL_A},
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
267 { (cyg_uint8*)CMA101_DUARTB, 1000, CYGNUM_HAL_INTERRUPT_SERIAL_B}
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
268 };
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
269
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
270 static void
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
271 cyg_hal_plf_serial_write(void* __ch_data, const cyg_uint8* __buf,
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
272 cyg_uint32 __len)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
273 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
274 CYGARC_HAL_SAVE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
275
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
276 while(__len-- > 0)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
277 cyg_hal_plf_serial_putc(__ch_data, *__buf++);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
278
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
279 CYGARC_HAL_RESTORE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
280 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
281
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
282 static void
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
283 cyg_hal_plf_serial_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
284 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
285 CYGARC_HAL_SAVE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
286
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
287 while(__len-- > 0)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
288 *__buf++ = cyg_hal_plf_serial_getc(__ch_data);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
289
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
290 CYGARC_HAL_RESTORE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
291 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
292
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
293 cyg_bool
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
294 cyg_hal_plf_serial_getc_timeout(void* __ch_data, cyg_uint8* ch)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
295 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
296 int delay_count;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
297 channel_data_t* chan = (channel_data_t*)__ch_data;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
298 cyg_bool res;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
299 CYGARC_HAL_SAVE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
300
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
301 delay_count = chan->msec_timeout * 10; // delay in .1 ms steps
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
302 for(;;) {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
303 res = cyg_hal_plf_serial_getc_nonblock(__ch_data, ch);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
304 if (res || 0 == delay_count--)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
305 break;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
306
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
307 CYGACC_CALL_IF_DELAY_US(100);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
308 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
309
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
310 CYGARC_HAL_RESTORE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
311 return res;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
312 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
313
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
314 static int
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
315 cyg_hal_plf_serial_control(void *__ch_data, __comm_control_cmd_t __func, ...)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
316 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
317 static int irq_state = 0;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
318 channel_data_t* chan = (channel_data_t*)__ch_data;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
319 cyg_uint8 ier;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
320 int ret = 0;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
321 CYGARC_HAL_SAVE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
322
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
323 switch (__func) {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
324 case __COMMCTL_IRQ_ENABLE:
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
325 HAL_INTERRUPT_UNMASK(chan->isr_vector);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
326 HAL_INTERRUPT_SET_LEVEL(chan->isr_vector, 1);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
327 HAL_READ_UINT8(chan->base+CYG_DEV_SERIAL_IER, ier);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
328 ier |= SIO_IER_ERDAI;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
329 HAL_WRITE_UINT8(chan->base+CYG_DEV_SERIAL_IER, ier);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
330 irq_state = 1;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
331 break;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
332 case __COMMCTL_IRQ_DISABLE:
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
333 ret = irq_state;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
334 irq_state = 0;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
335 HAL_INTERRUPT_MASK(chan->isr_vector);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
336 HAL_READ_UINT8(chan->base+CYG_DEV_SERIAL_IER, ier);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
337 ier &= ~SIO_IER_ERDAI;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
338 HAL_WRITE_UINT8(chan->base+CYG_DEV_SERIAL_IER, ier);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
339 break;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
340 case __COMMCTL_DBG_ISR_VECTOR:
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
341 ret = chan->isr_vector;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
342 break;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
343 case __COMMCTL_SET_TIMEOUT:
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
344 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
345 va_list ap;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
346
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
347 va_start(ap, __func);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
348
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
349 ret = chan->msec_timeout;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
350 chan->msec_timeout = va_arg(ap, cyg_uint32);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
351
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
352 va_end(ap);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
353 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
354 default:
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
355 break;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
356 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
357 CYGARC_HAL_RESTORE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
358 return ret;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
359 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
360
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
361 static int
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
362 cyg_hal_plf_serial_isr(void *__ch_data, int* __ctrlc,
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
363 CYG_ADDRWORD __vector, CYG_ADDRWORD __data)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
364 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
365 channel_data_t* chan = (channel_data_t*)__ch_data;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
366 cyg_uint8 _iir;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
367 int res = 0;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
368 CYGARC_HAL_SAVE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
369
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
370 HAL_READ_UINT8(chan->base+CYG_DEV_SERIAL_IIR, _iir);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
371 _iir &= SIO_IIR_ID_MASK;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
372
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
373 *__ctrlc = 0;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
374 if ( ISR_Rx == _iir ) {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
375 cyg_uint8 c, lsr;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
376 HAL_READ_UINT8(chan->base+CYG_DEV_SERIAL_LSR, lsr);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
377 if (lsr & SIO_LSR_DR) {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
378
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
379 HAL_READ_UINT8(chan->base+CYG_DEV_SERIAL_RBR, c);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
380
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
381 if( cyg_hal_is_break( &c , 1 ) )
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
382 *__ctrlc = 1;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
383 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
384
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
385 // Acknowledge the interrupt
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
386 HAL_INTERRUPT_ACKNOWLEDGE(chan->isr_vector);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
387 res = CYG_ISR_HANDLED;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
388 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
389
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
390 CYGARC_HAL_RESTORE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
391 return res;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
392 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
393
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
394 static void
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
395 cyg_hal_plf_serial_init(void)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
396 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
397 hal_virtual_comm_table_t* comm;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
398 int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
399
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
400 // Disable interrupts.
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
401 HAL_INTERRUPT_MASK(channels[0].isr_vector);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
402 HAL_INTERRUPT_MASK(channels[1].isr_vector);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
403
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
404 // Init channels
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
405 init_serial_channel(&channels[0]);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
406 init_serial_channel(&channels[1]);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
407
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
408 // Setup procs in the vector table
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
409
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
410 // Set channel 0
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
411 CYGACC_CALL_IF_SET_CONSOLE_COMM(0);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
412 comm = CYGACC_CALL_IF_CONSOLE_PROCS();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
413 CYGACC_COMM_IF_CH_DATA_SET(*comm, &channels[0]);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
414 CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_serial_write);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
415 CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_serial_read);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
416 CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_serial_putc);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
417 CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_serial_getc);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
418 CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_serial_control);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
419 CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_serial_isr);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
420 CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_serial_getc_timeout);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
421
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
422 // Set channel 1
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
423 CYGACC_CALL_IF_SET_CONSOLE_COMM(1);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
424 comm = CYGACC_CALL_IF_CONSOLE_PROCS();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
425 CYGACC_COMM_IF_CH_DATA_SET(*comm, &channels[1]);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
426 CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_serial_write);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
427 CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_serial_read);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
428 CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_serial_putc);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
429 CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_serial_getc);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
430 CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_serial_control);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
431 CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_serial_isr);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
432 CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_serial_getc_timeout);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
433
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
434 // Restore original console
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
435 CYGACC_CALL_IF_SET_CONSOLE_COMM(cur);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
436 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
437
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
438 //=============================================================================
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
439 // Compatibility with older stubs
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
440 //=============================================================================
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
441
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
442 #ifndef CYGSEM_HAL_VIRTUAL_VECTOR_DIAG
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
443
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
444
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
445 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
446 #include <cyg/hal/drv_api.h>
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
447 #include <cyg/hal/hal_stub.h> // cyg_hal_gdb_interrupt
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
448 #endif
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
449
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
450 // Assumption: all diagnostic output must be GDB packetized unless this is a ROM (i.e.
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
451 // totally stand-alone) system.
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
452
151
25e238959bae Merge from eCos master repository on 2001-02-12-23:44:24-GMT
jlarmour
parents: 110
diff changeset
453 #if defined(CYG_HAL_STARTUP_ROM) || !defined(CYGDBG_HAL_DIAG_TO_DEBUG_CHAN)
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
454 #define HAL_DIAG_USES_HARDWARE
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
455 #endif
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
456
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
457 /*---------------------------------------------------------------------------*/
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
458 #if CYGNUM_HAL_VIRTUAL_VECTOR_CONSOLE_CHANNEL==0
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
459 // This is the base address of the A-channel
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
460 #define CYG_DEV_SERIAL_BASE CMA101_DUARTA
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
461 #define CYG_DEV_SERIAL_INT CYGNUM_HAL_INTERRUPT_SERIAL_A
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
462 #else
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
463 // This is the base address of the B-channel
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
464 #define CYG_DEV_SERIAL_BASE CMA101_DUARTB
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
465 #define CYG_DEV_SERIAL_INT CYGNUM_HAL_INTERRUPT_SERIAL_B
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
466 #endif
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
467
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
468 static channel_data_t ser_channel = { (cyg_uint8*)CYG_DEV_SERIAL_BASE, 0, 0};
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
469
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
470 #ifdef HAL_DIAG_USES_HARDWARE
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
471
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
472 void hal_diag_init(void)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
473 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
474 static int init = 0;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
475 char *msg = "\n\rARM eCos\n\r";
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
476 cyg_uint8 lcr;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
477
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
478 if (init++) return;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
479
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
480 init_serial_channel(&ser_channel);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
481
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
482 while (*msg) hal_diag_write_char(*msg++);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
483 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
484
56
755351606154 Merge from eCos master repository on 1999-12-01-18:03:05-GMT
jlarmour
parents: 54
diff changeset
485 #ifdef DEBUG_DIAG
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
486 #if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
487 #define DIAG_BUFSIZE 32
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
488 #else
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
489 #define DIAG_BUFSIZE 2048
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
490 #endif
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
491 static char diag_buffer[DIAG_BUFSIZE];
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
492 static int diag_bp = 0;
56
755351606154 Merge from eCos master repository on 1999-12-01-18:03:05-GMT
jlarmour
parents: 54
diff changeset
493 #endif
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
494
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
495 void hal_diag_write_char(char c)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
496 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
497 cyg_uint8 lsr;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
498
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
499 hal_diag_init();
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
500
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
501 cyg_hal_plf_serial_putc(&ser_channel, c)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
502
56
755351606154 Merge from eCos master repository on 1999-12-01-18:03:05-GMT
jlarmour
parents: 54
diff changeset
503 #ifdef DEBUG_DIAG
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
504 diag_buffer[diag_bp++] = c;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
505 if (diag_bp == DIAG_BUFSIZE) {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
506 while (1) ;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
507 diag_bp = 0;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
508 }
56
755351606154 Merge from eCos master repository on 1999-12-01-18:03:05-GMT
jlarmour
parents: 54
diff changeset
509 #endif
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
510 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
511
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
512 void hal_diag_read_char(char *c)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
513 {
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
514 *c = cyg_hal_plf_serial_getc(&ser_channel);
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
515 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
516
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
517 #else // HAL_DIAG relies on GDB
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
518
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
519 // Initialize diag port - assume GDB channel is already set up
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
520 void hal_diag_init(void)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
521 {
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
522 if (0) init_serial_channel(&ser_channel); // avoid warning
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
523 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
524
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
525 // Actually send character down the wire
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
526 static void
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
527 hal_diag_write_char_serial(char c)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
528 {
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
529 cyg_hal_plf_serial_putc(&ser_channel, c);
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
530 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
531
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
532 static bool
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
533 hal_diag_read_serial(char *c)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
534 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
535 long timeout = 1000000000; // A long time...
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
536 while (!cyg_hal_plf_serial_getc_nonblock(&ser_channel, c))
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
537 if (0 == --timeout) return false;
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
538
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
539 return true;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
540 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
541
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
542 void
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
543 hal_diag_read_char(char *c)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
544 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
545 while (!hal_diag_read_serial(c)) ;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
546 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
547
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
548 void
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
549 hal_diag_write_char(char c)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
550 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
551 static char line[100];
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
552 static int pos = 0;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
553
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
554 // No need to send CRs
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
555 if( c == '\r' ) return;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
556
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
557 line[pos++] = c;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
558
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
559 if( c == '\n' || pos == sizeof(line) )
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
560 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
561 CYG_INTERRUPT_STATE old;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
562
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
563 // Disable interrupts. This prevents GDB trying to interrupt us
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
564 // while we are in the middle of sending a packet. The serial
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
565 // receive interrupt will be seen when we re-enable interrupts
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
566 // later.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
567
50
a0774359f013 Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents: 46
diff changeset
568 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
a0774359f013 Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents: 46
diff changeset
569 CYG_HAL_GDB_ENTER_CRITICAL_IO_REGION(old);
a0774359f013 Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents: 46
diff changeset
570 #else
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
571 HAL_DISABLE_INTERRUPTS(old);
50
a0774359f013 Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents: 46
diff changeset
572 #endif
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
573
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
574 while(1)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
575 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
576 static char hex[] = "0123456789ABCDEF";
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
577 cyg_uint8 csum = 0;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
578 int i;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
579 char c1;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
580
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
581 hal_diag_write_char_serial('$');
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
582 hal_diag_write_char_serial('O');
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
583 csum += 'O';
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
584 for( i = 0; i < pos; i++ )
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
585 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
586 char ch = line[i];
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
587 char h = hex[(ch>>4)&0xF];
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
588 char l = hex[ch&0xF];
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
589 hal_diag_write_char_serial(h);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
590 hal_diag_write_char_serial(l);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
591 csum += h;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
592 csum += l;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
593 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
594 hal_diag_write_char_serial('#');
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
595 hal_diag_write_char_serial(hex[(csum>>4)&0xF]);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
596 hal_diag_write_char_serial(hex[csum&0xF]);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
597
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
598 // Wait for the ACK character '+' from GDB here and handle
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
599 // receiving a ^C instead. This is the reason for this clause
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
600 // being a loop.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
601 if (!hal_diag_read_serial(&c1))
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
602 continue; // No response - try sending packet again
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
603
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
604 if( c1 == '+' )
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
605 break; // a good acknowledge
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
606
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
607 #ifdef CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
608 cyg_drv_interrupt_acknowledge(CYG_DEV_SERIAL_INT);
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
609 if( c1 == 3 ) {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
610 // Ctrl-C: breakpoint.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
611 cyg_hal_gdb_interrupt (__builtin_return_address(0));
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
612 break;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
613 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
614 #endif
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
615 // otherwise, loop round again
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
616 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
617
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
618 pos = 0;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
619
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
620 // And re-enable interrupts
50
a0774359f013 Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents: 46
diff changeset
621 #ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
a0774359f013 Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents: 46
diff changeset
622 CYG_HAL_GDB_LEAVE_CRITICAL_IO_REGION(old);
a0774359f013 Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents: 46
diff changeset
623 #else
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
624 HAL_RESTORE_INTERRUPTS(old);
50
a0774359f013 Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents: 46
diff changeset
625 #endif
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
626
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
627 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
628 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
629 #endif
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
630
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
631 #endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
632
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
633 /*---------------------------------------------------------------------------*/
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
634 /* End of hal_diag.c */