annotate packages/hal/sparclite/sleb/current/src/hal_diag.c @ 4:1d7f19c9e4d1 ecos-sw-1999-05-11

Merge from eCos master repository on 1999-05-11-21:11:10-BST
author jlarmour
date Tue, 11 May 1999 14:07:25 +0000
parents 443894e2e912
children c38311975d4f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
1 /*=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
2 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
3 // hal_diag.c
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
4 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
5 // HAL diagnostic output code
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
6 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
7 //=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
9 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
10 // -------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
11 // The contents of this file are subject to the Cygnus eCos Public License
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
12 // Version 1.0 (the "License"); you may not use this file except in
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
14 // http://sourceware.cygnus.com/ecos
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
15 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
18 // License for the specific language governing rights and limitations under
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
19 // the License.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
20 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
21 // The Original Code is eCos - Embedded Cygnus Operating System, released
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
22 // September 30, 1998.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
23 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
24 // The Initial Developer of the Original Code is Cygnus. Portions created
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
25 // by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
26 // -------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
27 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
28 //####COPYRIGHTEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
29 //=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
30 //#####DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
31 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
32 // Author(s): nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
33 // Contributors: nickg
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
34 // Date: 1998-03-02
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
35 // Purpose: HAL diagnostic output
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
36 // Description: Implementations of HAL diagnostic output support.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
37 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
38 //####DESCRIPTIONEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
39 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
40 //===========================================================================*/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
41
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
42 #include <pkgconf/system.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
43 #include <pkgconf/hal.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44 #include <pkgconf/hal_sparclite.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
45 #include <pkgconf/hal_sparclite_sleb.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47 #include <cyg/infra/cyg_type.h> // base types
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
49 #include <cyg/hal/hal_arch.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50 #include <cyg/hal/hal_diag.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51 #include <cyg/hal/hal_intr.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53 #include <cyg/hal/hal_cygm.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55 /*---------------------------------------------------------------------------*/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57 #ifdef CYG_KERNEL_DIAG_GDB
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59 #ifdef CYG_KERNEL_DIAG_GDB_SERIAL_DIRECT // then force $O packets to serial
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61 void hal_diag_init(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63 // hal_diag_init_serial();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66 void hal_diag_write_char_serial( char c )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68 HAL_REORDER_BARRIER();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 HAL_DIAG_WRITE_CHAR_DIRECT( c );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70 HAL_REORDER_BARRIER();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71 HAL_DIAG_WRITE_CHAR_WAIT_FOR_EMPTY();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72 HAL_REORDER_BARRIER();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 void hal_diag_write_char(char c)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77 static char line[100];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 static int pos = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80 // No need to send CRs
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81 if( c == '\r' ) return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83 line[pos++] = c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85 if( c == '\n' || pos == sizeof(line) )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87 CYG_INTERRUPT_STATE old;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89 // Disable interrupts. This prevents GDB trying to interrupt us
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 // while we are in the middle of sending a packet. The serial
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91 // receive interrupt will be seen when we re-enable interrupts
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92 // later.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 HAL_DISABLE_INTERRUPTS(old);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96 while(1)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98 cyg_uint32 status, c1, tries;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 static char hex[] = "0123456789ABCDEF";
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100 cyg_uint8 csum = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 int i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
102
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 hal_diag_write_char_serial('$');
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 hal_diag_write_char_serial('O');
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 csum += 'O';
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106 for( i = 0; i < pos; i++ )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108 char ch = line[i];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109 char h = hex[(ch>>4)&0xF];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 char l = hex[ch&0xF];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111 hal_diag_write_char_serial(h);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112 hal_diag_write_char_serial(l);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 csum += h;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114 csum += l;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116 hal_diag_write_char_serial('#');
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117 hal_diag_write_char_serial(hex[(csum>>4)&0xF]);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118 hal_diag_write_char_serial(hex[csum&0xF]);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
119
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
120 // Wait for the ACK character '+' from GDB here and handle
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121 // receiving a ^C instead. This is the reason for this clause
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122 // being a loop.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123 status = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 tries = 1000000000;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125 while ( 0 == (HAL_SPARC_86940_FLAG_RXRDY & status) ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126 if ( 0 == --tries )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
128 HAL_SPARC_86940_SDTR0_STAT_READ( status );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130 if ( 0 == tries ) // then we broke out after waiting
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131 continue; // the outer loop, send the packet
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133 HAL_SPARC_86940_SDTR0_RXDATA_READ( c1 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
134
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135 // We must ack the interrupt caused by that read to avoid
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136 // confusing the GDB stub ROM.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
137 HAL_INTERRUPT_ACKNOWLEDGE( CYGNUM_HAL_VECTOR_INTERRUPT_10 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
138
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139 if( c1 == '+' )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140 break; // a good acknowledge
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
141
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 if( c1 == 3 ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143 // Ctrl-C: breakpoint.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144 asm volatile( "ta 2; nop; nop; nop" );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147 // otherwise, loop round again
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150 pos = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152 // And re-enable interrupts
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
153 HAL_RESTORE_INTERRUPTS(old);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
155 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 #else // CYG_KERNEL_DIAG_GDB_SERIAL_DIRECT not defined; use CygMon
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159 // All this code provided by MSalter - ta.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 struct bsp_comm_procs {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 void *ch_data;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 void (*__write)(void *ch_data, const char *buf, int len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164 int (*__read)(void *ch_data, char *buf, int len);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 void (*__putc)(void *ch_data, char ch);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166 int (*__getc)(void *ch_data);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167 int (*__control)(void *ch_data, int func, ...);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168 };
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
169
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170 // This is pointed to by entry BSP_NOTVEC_BSP_COMM_PROCS:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171 typedef struct {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
172 int version; /* version number for future expansion */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
173 void *__ictrl_table;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
174 void *__exc_table;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
175 void *__dbg_vector;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
176 void *__kill_vector;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
177 struct bsp_comm_procs *__console_procs;
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
178 struct bsp_comm_procs *__debug_procs;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
179 void *__flush_dcache;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
180 void *__flush_icache;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
181 void *__cpu_data;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
182 void *__board_data;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
183 void *__sysinfo;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
184 int (*__set_debug_comm)(int __comm_id);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
185 void *__set_console_comm;
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
186 } bsp_shared_t;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
187
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
188
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
189 static int
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
190 hal_bsp_set_debug_comm(int arg)
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
191 {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
192 bsp_shared_t *shared;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
193
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
194 shared = (bsp_shared_t *)
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
195 (CYGMON_VECTOR_TABLE[ BSP_NOTVEC_BSP_COMM_PROCS ]);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
196
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
197 if (0 != shared->__set_debug_comm) {
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
198 return (*(shared->__set_debug_comm))(arg);
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
199 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
200 return 0;
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
201 }
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
202
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
203 static int
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
204 hal_bsp_console_write(const char *p, int len)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
205 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
206 bsp_shared_t *shared;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
207 struct bsp_comm_procs *com;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
208
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
209 shared = (bsp_shared_t *)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
210 (CYGMON_VECTOR_TABLE[ BSP_NOTVEC_BSP_COMM_PROCS ]);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
211
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
212 com = shared->__console_procs;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
213
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
214 if (0 != com) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
215 com->__write(com->ch_data, p, len);
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
216
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
217 #if 1
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
218 // FIXME: This is a workaround for PR 19926; CygMon does not
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
219 // expect to be sharing the line with a serial driver (which
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
220 // can be excused :) and so doesn't acknowledge the interrupt.
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
221 // In normal circumstances CygMon would handle the resulting
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
222 // interrupt and do the right thing. However, when using the
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
223 // serial driver it is handling the interrupts and gets
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
224 // mightily confused by these spurious interrupts.
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
225 //
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
226 // As a workaround, ask CygMon which communication port is
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
227 // using for console output. If this is the serial port
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
228 // (comm 0), acknowledge the interrupt.
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
229 if ( 0 == hal_bsp_set_debug_comm( -1 ) )
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
230 HAL_INTERRUPT_ACKNOWLEDGE( CYGNUM_HAL_VECTOR_INTERRUPT_10 );
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
231 #endif
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
232
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
233 return 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
234 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
235 return 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
236 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
237
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
238 static void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
239 hal_dumb_serial_write(const char *p, int len)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
240 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
241 int i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
242 for ( i = 0 ; i < len; i++ ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
243 HAL_DIAG_WRITE_CHAR_DIRECT( p[ i ] );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
244 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
245 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
246
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
247
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
248 void hal_diag_init(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
249 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
250 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
251
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
252 void hal_diag_write_char(char c)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
253 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
254 static char line[100];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
255 static int pos = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
256
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
257 // No need to send CRs
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
258 if( c == '\r' ) return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
259
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
260 line[pos++] = c;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
261
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
262 if( c == '\n' || pos == sizeof(line) ) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
263 CYG_INTERRUPT_STATE old;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
264
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
265 // Disable interrupts. This prevents GDB trying to interrupt us
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
266 // while we are in the middle of sending a packet. The serial
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
267 // receive interrupt will be seen when we re-enable interrupts
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
268 // later.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
269
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
270 HAL_DISABLE_INTERRUPTS(old);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
271
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
272 if ( ! hal_bsp_console_write( line, pos ) )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
273 // then there is no function registered, just spew it out serial
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
274 hal_dumb_serial_write( line, pos );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
275
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
276 pos = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
277
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
278 // And re-enable interrupts
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
279 HAL_RESTORE_INTERRUPTS(old);
4
1d7f19c9e4d1 Merge from eCos master repository on 1999-05-11-21:11:10-BST
jlarmour
parents: 2
diff changeset
280
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
281 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
282 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
283
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
284 #endif // CYG_KERNEL_DIAG_GDB_SERIAL_DIRECT not defined; use CygMon
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
285
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
286 #else // CYG_KERNEL_DIAG_GDB not defined, so we are going to the serial line
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
287 // without GDB encoding - likely to be ROM startup.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
288
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
289 /* Address of clock switch */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
290 #define CLKSW_ADDR 0x01000003
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
291
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
292 /* Address of SW1 */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
293 #define SW1_ADDR 0x02000003
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
294
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
295 void hal_diag_init(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
296 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
297 cyg_uint32 clk, tval;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
298
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
299 // first set the baud rate
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
300
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
301 clk = *(unsigned char *)CLKSW_ADDR;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
302 if (clk & 0x80)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
303 clk = 10;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
304
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
305 clk = (clk & 0x3f) * 1000000; /* in MHz */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
306
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
307 tval = clk / 19200;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
308 tval /= 32;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
309 tval -= 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
310
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
311 HAL_SPARC_86940_TCR3_WRITE(
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
312 HAL_SPARC_86940_TCR_CE |
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
313 HAL_SPARC_86940_TCR_CLKINT |
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
314 HAL_SPARC_86940_TCR_OUTC3 |
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
315 HAL_SPARC_86940_TCR_SQWAVE );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
316
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
317 HAL_SPARC_86940_RELOAD3_WRITE( tval);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
318
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
319 #define DELAY(x) \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
320 CYG_MACRO_START int i; for (i = 0; i < x; i++); CYG_MACRO_END
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
321
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
322 HAL_SPARC_86940_SDTR0_CTRL_WRITE( 0 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
323 DELAY(100);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
324 HAL_SPARC_86940_SDTR0_CTRL_WRITE( 0 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
325 DELAY(100);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
326 HAL_SPARC_86940_SDTR0_CTRL_WRITE( 0 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
327 DELAY(100);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
328
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
329 HAL_SPARC_86940_SDTR0_CTRL_WRITE( HAL_SPARC_86940_SER_CMD_IRST );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
330 DELAY(100);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
331
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
332 /* first write after reset is to mode register */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
333 HAL_SPARC_86940_SDTR0_CTRL_WRITE( HAL_SPARC_86940_SER_DIV16_CLK |
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
334 HAL_SPARC_86940_SER_8BITS |
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
335 HAL_SPARC_86940_SER_NO_PARITY |
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
336 HAL_SPARC_86940_SER_STOP1 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
337 DELAY(100);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
338
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
339 /* subsequent writes are to command register */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
340 HAL_SPARC_86940_SDTR0_CTRL_WRITE( HAL_SPARC_86940_SER_CMD_RTS |
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
341 HAL_SPARC_86940_SER_CMD_DTR |
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
342 HAL_SPARC_86940_SER_CMD_EFR |
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
343 HAL_SPARC_86940_SER_CMD_RXEN |
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
344 HAL_SPARC_86940_SER_CMD_TXEN );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
345 DELAY(100);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
346 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
347
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
348
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
349
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
350
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
351
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
352 #endif // CYG_KERNEL_DIAG_GDB
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
353
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
354 /*---------------------------------------------------------------------------*/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
355 /* End of hal_diag.c */