annotate packages/hal/arm/cma230/current/src/hal_diag.c @ 110:84e4bde58b26 ecos-sw-2000-07-14

Merge from eCos master repository on 2000-07-14-22:00:02-BST
author jlarmour
date Mon, 17 Jul 2000 14:42:27 +0000
parents bf00f99aec69
children 25e238959bae
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 //=============================================================================
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
9 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
10 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
11 // The contents of this file are subject to the Red Hat eCos Public License
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
12 // Version 1.1 (the "License"); you may not use this file except in
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
14 // http://www.redhat.com/
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
15 //
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
18 // License for the specific language governing rights and limitations under
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
19 // the License.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
20 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
21 // The Original Code is eCos - Embedded Configurable Operating System,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
22 // released September 30, 1998.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
23 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
24 // The Initial Developer of the Original Code is Red Hat.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
25 // Portions created by Red Hat are
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
27 // All Rights Reserved.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
28 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 56
diff changeset
29 //
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
30 //####COPYRIGHTEND####
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
31 //=============================================================================
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
32 //#####DESCRIPTIONBEGIN####
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
33 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
34 // Author(s): nickg, gthomas
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
35 // Contributors: nickg, gthomas
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
36 // Date: 1998-03-02
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
37 // Purpose: HAL diagnostic output
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
38 // 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
39 //
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
40 //####DESCRIPTIONEND####
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
41 //
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
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
44 #include <pkgconf/hal.h>
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
45 #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
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
47 #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
48 #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
49 #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
50
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
51 #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
52 #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
53 #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
54 #include <cyg/hal/hal_diag.h>
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
55 #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
56 #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
57 #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
58 #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
59
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
60 #if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
61 || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
62
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
63 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
64
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
65 // 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
66 //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
67
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
68 void
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
69 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
70 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
71 static int initialized = 0;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
72
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
73 if (initialized)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
74 return;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
75
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
76 initialized = 1;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
77
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
78 cyg_hal_plf_serial_init();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
79 // cyg_hal_plf_lcd_init();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
80 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
81 #endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
82
110
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 // Serial driver
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
85 //=============================================================================
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
86
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
87 //-----------------------------------------------------------------------------
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
88 // There are two serial ports.
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
89 #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
90 #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
91
110
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 // Default baud rate is 38400
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
94 // 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
95 #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
96 #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
97 #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
98 #endif
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
99 #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
100 #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
101 #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
102 #endif
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
103 #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
104 #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
105 #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
106 #endif
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
107 #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
108 #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
109 #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
110 #endif
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
111
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
112 #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
113 #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
114 #endif
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
115
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
116 //-----------------------------------------------------------------------------
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
117 // 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
118 // serial chip.
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
119 #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
120 #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
121 #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
122 #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
123 #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
124 #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
125 #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
126 #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
127 #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
128 #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
129 #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
130 #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
131 #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
132 #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
133 #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
134
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
135 // The interrupt enable register bits.
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
136 #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
137 #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
138 #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
139 #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
140
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
141 // The interrupt identification register bits.
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
142 #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
143 #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
144 #define ISR_Tx 0x02
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
145 #define ISR_Rx 0x04
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
146
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
147 // The line status register bits.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
148 #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
149 #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
150 #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
151 #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
152 #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
153 #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
154 #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
155 #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
156
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
157 // The modem status register bits.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
158 #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
159 #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
160 #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
161 #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
162 #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
163 #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
164 #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
165 #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
166
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
167 // The line control register bits.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
168 #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
169 #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
170 #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
171 #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
172 #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
173 #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
174 #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
175 #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
176
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
177 // The FIFO control register
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
178 #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
179 #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
180 #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
181
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
182
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
183 //-----------------------------------------------------------------------------
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
184 typedef struct {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
185 cyg_uint8* base;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
186 cyg_int32 msec_timeout;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
187 int isr_vector;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
188 } channel_data_t;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
189
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
190 //-----------------------------------------------------------------------------
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
191 static void
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
192 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
193 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
194 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
195 cyg_uint8 lcr;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
196
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
197 // 8-1-no parity.
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
198 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
199 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
200
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
201 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
202 lcr |= SIO_LCR_DLAB;
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, lcr);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
204 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
205 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
206 lcr &= ~SIO_LCR_DLAB;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
207 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
208 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
209 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
210
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
211 static cyg_bool
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
212 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
213 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
214 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
215 cyg_uint8 lsr;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
216
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
217 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
218 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
219 return false;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
220
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
221 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
222
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
223 return true;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
224 }
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
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
227 cyg_uint8
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
228 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
229 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
230 cyg_uint8 ch;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
231 CYGARC_HAL_SAVE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
232
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
233 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
234
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
235 CYGARC_HAL_RESTORE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
236 return ch;
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
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
239 void
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
240 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
241 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
242 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
243 cyg_uint8 lsr;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
244 CYGARC_HAL_SAVE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
245
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
246 do {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
247 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
248 } 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
249
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
250 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
251
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
252 // 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
253 do {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
254 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
255 } 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
256
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
257 CYGARC_HAL_RESTORE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
258 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
259
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
260 #if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
261 || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
262
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
263 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
264 { (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
265 { (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
266 };
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
267
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
268 static void
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
269 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
270 cyg_uint32 __len)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
271 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
272 CYGARC_HAL_SAVE_GP();
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 while(__len-- > 0)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
275 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
276
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
277 CYGARC_HAL_RESTORE_GP();
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
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
280 static void
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
281 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
282 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
283 CYGARC_HAL_SAVE_GP();
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 while(__len-- > 0)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
286 *__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
287
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
288 CYGARC_HAL_RESTORE_GP();
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
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
291 cyg_bool
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
292 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
293 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
294 int delay_count;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
295 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
296 cyg_bool res;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
297 CYGARC_HAL_SAVE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
298
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
299 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
300 for(;;) {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
301 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
302 if (res || 0 == delay_count--)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
303 break;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
304
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
305 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
306 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
307
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
308 CYGARC_HAL_RESTORE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
309 return res;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
310 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
311
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
312 static int
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
313 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
314 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
315 static int irq_state = 0;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
316 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
317 cyg_uint8 ier;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
318 int ret = 0;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
319 CYGARC_HAL_SAVE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
320
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
321 switch (__func) {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
322 case __COMMCTL_IRQ_ENABLE:
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
323 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
324 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
325 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
326 ier |= SIO_IER_ERDAI;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
327 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
328 irq_state = 1;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
329 break;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
330 case __COMMCTL_IRQ_DISABLE:
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
331 ret = irq_state;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
332 irq_state = 0;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
333 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
334 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
335 ier &= ~SIO_IER_ERDAI;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
336 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
337 break;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
338 case __COMMCTL_DBG_ISR_VECTOR:
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
339 ret = chan->isr_vector;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
340 break;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
341 case __COMMCTL_SET_TIMEOUT:
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
342 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
343 va_list ap;
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_start(ap, __func);
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 ret = chan->msec_timeout;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
348 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
349
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
350 va_end(ap);
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 default:
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
353 break;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
354 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
355 CYGARC_HAL_RESTORE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
356 return ret;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
357 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
358
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
359 static int
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
360 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
361 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
362 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
363 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
364 cyg_uint8 _iir;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
365 int res = 0;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
366 CYGARC_HAL_SAVE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
367
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
368 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
369 _iir &= SIO_IIR_ID_MASK;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
370
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
371 *__ctrlc = 0;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
372 if ( ISR_Rx == _iir ) {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
373 cyg_uint8 c, lsr;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
374 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
375 if (lsr & SIO_LSR_DR) {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
376
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
377 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
378
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
379 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
380 *__ctrlc = 1;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
381 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
382
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
383 // Acknowledge the interrupt
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
384 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
385 res = CYG_ISR_HANDLED;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
386 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
387
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
388 CYGARC_HAL_RESTORE_GP();
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
389 return res;
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
390 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
391
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
392 static void
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
393 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
394 {
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
395 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
396 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
397
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
398 // Disable interrupts.
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
399 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
400 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
401
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
402 // Init channels
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
403 init_serial_channel(&channels[0]);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
404 init_serial_channel(&channels[1]);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
405
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
406 // 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
407
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
408 // Set channel 0
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
409 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
410 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
411 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
412 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
413 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
414 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
415 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
416 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
417 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
418 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
419
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
420 // Set channel 1
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
421 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
422 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
423 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
424 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
425 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
426 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
427 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
428 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
429 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
430 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
431
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
432 // Restore original console
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
433 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
434 }
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
435
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
436 #endif // CYGSEM_HAL_VIRTUAL_VECTOR_DIAG || CYGPRI_HAL_IMPLEMENTS_IF_SERVICES
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 //=============================================================================
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
440 // Compatibility with older stubs
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
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
443 #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
444
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
445
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
446 #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
447 #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
448 #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
449 #endif
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
450
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
451 // 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
452 // totally stand-alone) system.
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
453
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
454 #if defined(CYG_HAL_STARTUP_ROM) || defined(CYGDBG_HAL_DIAG_DISABLE_GDB_PROTOCOL)
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
455 #define HAL_DIAG_USES_HARDWARE
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
456 #endif
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 /*---------------------------------------------------------------------------*/
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
459 #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
460 // 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
461 #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
462 #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
463 #else
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
464 // 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
465 #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
466 #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
467 #endif
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
468
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
469 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
470
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
471 #ifdef HAL_DIAG_USES_HARDWARE
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
472
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
473 void hal_diag_init(void)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
474 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
475 static int init = 0;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
476 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
477 cyg_uint8 lcr;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
478
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
479 if (init++) return;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
480
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
481 init_serial_channel(&ser_channel);
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
482
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
483 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
484 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
485
56
755351606154 Merge from eCos master repository on 1999-12-01-18:03:05-GMT
jlarmour
parents: 54
diff changeset
486 #ifdef DEBUG_DIAG
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
487 #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
488 #define DIAG_BUFSIZE 32
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
489 #else
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
490 #define DIAG_BUFSIZE 2048
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
491 #endif
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
492 static char diag_buffer[DIAG_BUFSIZE];
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
493 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
494 #endif
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
495
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
496 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
497 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
498 cyg_uint8 lsr;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
499
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
500 hal_diag_init();
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
501
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
502 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
503
56
755351606154 Merge from eCos master repository on 1999-12-01-18:03:05-GMT
jlarmour
parents: 54
diff changeset
504 #ifdef DEBUG_DIAG
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
505 diag_buffer[diag_bp++] = c;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
506 if (diag_bp == DIAG_BUFSIZE) {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
507 while (1) ;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
508 diag_bp = 0;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
509 }
56
755351606154 Merge from eCos master repository on 1999-12-01-18:03:05-GMT
jlarmour
parents: 54
diff changeset
510 #endif
46
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
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
513 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
514 {
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
515 *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
516 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
517
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
518 #else // HAL_DIAG relies on GDB
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
519
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
520 // 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
521 void hal_diag_init(void)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
522 {
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
523 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
524 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
525
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
526 // Actually send character down the wire
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
527 static void
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
528 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
529 {
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
530 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
531 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
532
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
533 static bool
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
534 hal_diag_read_serial(char *c)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
535 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
536 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
537 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
538 if (0 == --timeout) return false;
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
539
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
540 return true;
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
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
543 void
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
544 hal_diag_read_char(char *c)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
545 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
546 while (!hal_diag_read_serial(c)) ;
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
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
549 void
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
550 hal_diag_write_char(char c)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
551 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
552 static char line[100];
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
553 static int pos = 0;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
554
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
555 // No need to send CRs
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
556 if( c == '\r' ) return;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
557
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
558 line[pos++] = c;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
559
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
560 if( c == '\n' || pos == sizeof(line) )
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
561 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
562 CYG_INTERRUPT_STATE old;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
563
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
564 // 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
565 // 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
566 // 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
567 // later.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
568
50
a0774359f013 Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents: 46
diff changeset
569 #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
570 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
571 #else
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
572 HAL_DISABLE_INTERRUPTS(old);
50
a0774359f013 Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents: 46
diff changeset
573 #endif
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
574
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
575 while(1)
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
576 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
577 static char hex[] = "0123456789ABCDEF";
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
578 cyg_uint8 csum = 0;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
579 int i;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
580 char c1;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
581
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
582 hal_diag_write_char_serial('$');
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
583 hal_diag_write_char_serial('O');
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
584 csum += 'O';
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
585 for( i = 0; i < pos; i++ )
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
586 {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
587 char ch = line[i];
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
588 char h = hex[(ch>>4)&0xF];
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
589 char l = hex[ch&0xF];
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
590 hal_diag_write_char_serial(h);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
591 hal_diag_write_char_serial(l);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
592 csum += h;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
593 csum += l;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
594 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
595 hal_diag_write_char_serial('#');
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>>4)&0xF]);
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
597 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
598
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
599 // 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
600 // 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
601 // being a loop.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
602 if (!hal_diag_read_serial(&c1))
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
603 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
604
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
605 if( c1 == '+' )
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
606 break; // a good acknowledge
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
607
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
608 #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
609 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
610 if( c1 == 3 ) {
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
611 // Ctrl-C: breakpoint.
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
612 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
613 break;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
614 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
615 #endif
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
616 // otherwise, loop round again
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
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
619 pos = 0;
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
620
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
621 // And re-enable interrupts
50
a0774359f013 Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents: 46
diff changeset
622 #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
623 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
624 #else
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
625 HAL_RESTORE_INTERRUPTS(old);
50
a0774359f013 Merge from eCos master repository on 1999-11-02-17:02:15-GMT
jlarmour
parents: 46
diff changeset
626 #endif
46
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 }
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
630 #endif
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
631
110
84e4bde58b26 Merge from eCos master repository on 2000-07-14-22:00:02-BST
jlarmour
parents: 66
diff changeset
632 #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
633
46
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
634 /*---------------------------------------------------------------------------*/
797268ecc331 Merge from eCos master repository on 1999-10-19-18:55:31-BST
jlarmour
parents:
diff changeset
635 /* End of hal_diag.c */