]> git.karo-electronics.de Git - karo-tx-redboot.git/blob - packages/hal/mips/vrc437x/v2_0/src/hal_diag.c
Initial revision
[karo-tx-redboot.git] / packages / hal / mips / vrc437x / v2_0 / src / hal_diag.c
1 /*=============================================================================
2 //
3 //      hal_diag.c
4 //
5 //      HAL diagnostic output code
6 //
7 //=============================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
12 //
13 // eCos is free software; you can redistribute it and/or modify it under
14 // the terms of the GNU General Public License as published by the Free
15 // Software Foundation; either version 2 or (at your option) any later version.
16 //
17 // eCos is distributed in the hope that it will be useful, but WITHOUT ANY
18 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
19 // FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
20 // for more details.
21 //
22 // You should have received a copy of the GNU General Public License along
23 // with eCos; if not, write to the Free Software Foundation, Inc.,
24 // 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
25 //
26 // As a special exception, if other files instantiate templates or use macros
27 // or inline functions from this file, or you compile this file and link it
28 // with other works to produce a work based on this file, this file does not
29 // by itself cause the resulting work to be covered by the GNU General Public
30 // License. However the source code for this file must still be made available
31 // in accordance with section (3) of the GNU General Public License.
32 //
33 // This exception does not invalidate any other reasons why a work based on
34 // this file might be covered by the GNU General Public License.
35 //
36 // Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.
37 // at http://sources.redhat.com/ecos/ecos-license/
38 // -------------------------------------------
39 //####ECOSGPLCOPYRIGHTEND####
40 //=============================================================================
41 //#####DESCRIPTIONBEGIN####
42 //
43 // Author(s):   nickg
44 // Contributors:        nickg
45 // Date:        1998-03-02
46 // Purpose:     HAL diagnostic output
47 // Description: Implementations of HAL diagnostic output support.
48 //
49 //####DESCRIPTIONEND####
50 //
51 //===========================================================================*/
52
53 #include <pkgconf/hal.h>
54
55 #include <cyg/infra/cyg_type.h>         // base types
56 #include <cyg/infra/cyg_trac.h>         // tracing macros
57 #include <cyg/infra/cyg_ass.h>          // assertion macros
58
59 #include <cyg/hal/hal_arch.h>
60 #include <cyg/hal/hal_diag.h>
61
62 #include <cyg/hal/hal_intr.h>
63
64 #include <cyg/hal/hal_io.h>
65
66 #include <cyg/hal/plf_stub.h>
67
68
69 #if defined(CYGSEM_HAL_USE_ROM_MONITOR_GDB_stubs)
70
71 #define CYG_KERNEL_DIAG_GDB
72
73 #endif
74
75 /*---------------------------------------------------------------------------*/
76
77 void hal_diag_init()
78 {
79     cyg_hal_plf_comms_init();
80 }
81
82 /*---------------------------------------------------------------------------*/
83
84 void hal_diag_write_char(char c)
85 {
86 #ifdef CYG_KERNEL_DIAG_GDB    
87     static char line[100];
88     static int pos = 0;
89
90     // No need to send CRs
91     if( c == '\r' ) return;
92
93     line[pos++] = c;
94
95     if( c == '\n' || pos == sizeof(line) )
96     {
97
98         // Disable interrupts. This prevents GDB trying to interrupt us
99         // while we are in the middle of sending a packet. The serial
100         // receive interrupt will be seen when we re-enable interrupts
101         // later.
102         CYG_INTERRUPT_STATE oldstate;
103         HAL_DISABLE_INTERRUPTS(oldstate);
104         
105         while(1)
106         {
107             static char hex[] = "0123456789ABCDEF";
108             cyg_uint8 csum = 0;
109             int i;
110             char c1;
111         
112             cyg_hal_plf_serial_putc(NULL, '$');
113             cyg_hal_plf_serial_putc(NULL, 'O');
114             csum += 'O';
115             for( i = 0; i < pos; i++ )
116             {
117                 char ch = line[i];
118                 char h = hex[(ch>>4)&0xF];
119                 char l = hex[ch&0xF];
120                 cyg_hal_plf_serial_putc(NULL, h);
121                 cyg_hal_plf_serial_putc(NULL, l);
122                 csum += h;
123                 csum += l;
124             }
125             cyg_hal_plf_serial_putc(NULL, '#');
126             cyg_hal_plf_serial_putc(NULL, hex[(csum>>4)&0xF]);
127             cyg_hal_plf_serial_putc(NULL, hex[csum&0xF]);
128
129             c1 = cyg_hal_plf_serial_getc( NULL );
130
131             if( c1 == '+' ) break;
132
133             if( cyg_hal_is_break( &c1 , 1 ) )
134                 cyg_hal_user_break( NULL );    
135
136         }
137         
138         pos = 0;
139
140         // Wait for all data from serial line to drain
141         // and clear ready-to-send indication.
142 //        hal_diag_drain_serial0();
143
144         // Disabling the interrupts for an extended period of time
145         // can provoke a spurious interrupt 0. FIXME - why?
146 #ifdef CYGSEM_HAL_MIPS_VR4300_VRC437X_DIAG_ACKS_INT_0
147         HAL_INTERRUPT_ACKNOWLEDGE( CYGNUM_HAL_INTERRUPT_VRC437X );
148 #endif
149         
150         // And re-enable interrupts
151         HAL_RESTORE_INTERRUPTS( oldstate );
152         
153     }
154 #else
155     cyg_hal_plf_serial_putc(NULL, c);
156 #endif    
157 }
158
159 /*---------------------------------------------------------------------------*/
160
161 void hal_diag_read_char(char *c)
162 {
163     *c = cyg_hal_plf_serial_getc(NULL);
164 }
165
166 /*---------------------------------------------------------------------------*/
167 /* End of hal_diag.c */