]> git.karo-electronics.de Git - karo-tx-redboot.git/blob - packages/hal/calmrisc16/ceb/v2_0/src/hal_diag.c
Initial revision
[karo-tx-redboot.git] / packages / hal / calmrisc16 / ceb / 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, dmoseley
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 //-----------------------------------------------------------------------------
67 // Select which diag channels to use
68
69 //#define CYG_KERNEL_DIAG_LCD
70 #define CYG_KERNEL_DIAG_SERIAL
71
72 /*---------------------------------------------------------------------------*/
73
74 void hal_diag_led(int x)
75 {
76 }
77
78 externC void diag_write_string (const char*);
79
80 #ifdef CYG_KERNEL_DIAG_SERIAL
81 extern void cyg_hal_plf_comms_init(void);
82 extern void cyg_hal_plf_serial_putc(void*, cyg_uint8);
83 extern cyg_uint8 cyg_hal_plf_serial_getc(void*);
84 #endif
85
86 void hal_diag_init(void)
87 {
88 #if defined(CYGSEM_HAL_ROM_MONITOR) && !defined(CYG_KERNEL_DIAG_SERIAL)
89   // It's handy to have the LCD initialized at reset when using it
90   // for debugging output.
91   // The serial port likely doesn't work yet.  Let's wait.
92   diag_write_string ("eCos ROM   " __TIME__ "\n");
93   diag_write_string (__DATE__ "\n");
94 #endif
95
96 #if defined(CYG_KERNEL_DIAG_SERIAL)
97   cyg_hal_plf_comms_init();
98 #endif
99 }
100
101 #if defined(CYG_KERNEL_DIAG_LCD)
102 static void hal_diag_clear_lcd(void)
103 {
104   volatile int i = 0x20000;
105   while (--i) ;
106
107   HAL_WRITE_UINT32(HAL_DISPLAY_ASCIIPOS0, ' ');
108   HAL_WRITE_UINT32(HAL_DISPLAY_ASCIIPOS1, ' ');
109   HAL_WRITE_UINT32(HAL_DISPLAY_ASCIIPOS2, ' ');
110   HAL_WRITE_UINT32(HAL_DISPLAY_ASCIIPOS3, ' ');
111   HAL_WRITE_UINT32(HAL_DISPLAY_ASCIIPOS4, ' ');
112   HAL_WRITE_UINT32(HAL_DISPLAY_ASCIIPOS5, ' ');
113   HAL_WRITE_UINT32(HAL_DISPLAY_ASCIIPOS6, ' ');
114   HAL_WRITE_UINT32(HAL_DISPLAY_ASCIIPOS7, ' ');
115 }
116 #endif /* defined(CYG_KERNEL_DIAG_LCD) */
117
118 void hal_diag_write_char(char c)
119 {
120 #if defined(CYG_KERNEL_DIAG_LCD)
121   static volatile CYG_WORD* reg = HAL_DISPLAY_ASCIIPOS0;
122 #endif
123
124   unsigned long __state;
125
126   HAL_DISABLE_INTERRUPTS(__state);
127
128   if(c == '\n')
129     {
130 #if defined(CYG_KERNEL_DIAG_LCD)
131       reg = HAL_DISPLAY_ASCIIPOS0;
132       hal_diag_clear_lcd();
133 #endif
134 #if defined (CYG_KERNEL_DIAG_SERIAL)
135       cyg_hal_plf_serial_putc(NULL, '\r');
136       cyg_hal_plf_serial_putc(NULL, '\n');
137 #endif
138     }
139   else if (c == '\r')
140     {
141       // Ignore '\r'
142     }
143   else
144     {
145 #if defined(CYG_KERNEL_DIAG_LCD)
146       if (reg == HAL_DISPLAY_ASCIIPOS0)
147         hal_diag_clear_lcd();
148
149       HAL_WRITE_UINT32(reg, c);
150
151       // Advance to next LED position.
152       if (reg == HAL_DISPLAY_ASCIIPOS0)
153         reg = HAL_DISPLAY_ASCIIPOS1;
154       else if (reg == HAL_DISPLAY_ASCIIPOS1)
155         reg = HAL_DISPLAY_ASCIIPOS2;
156       else if (reg == HAL_DISPLAY_ASCIIPOS2)
157         reg = HAL_DISPLAY_ASCIIPOS3;
158       else if (reg == HAL_DISPLAY_ASCIIPOS3)
159         reg = HAL_DISPLAY_ASCIIPOS4;
160       else if (reg == HAL_DISPLAY_ASCIIPOS4)
161         reg = HAL_DISPLAY_ASCIIPOS5;
162       else if (reg == HAL_DISPLAY_ASCIIPOS5)
163         reg = HAL_DISPLAY_ASCIIPOS6;
164       else if (reg == HAL_DISPLAY_ASCIIPOS6)
165         reg = HAL_DISPLAY_ASCIIPOS7;
166       else // reg == HAL_DISPLAY_ASCIIPOS7 or UNKNOWN
167         reg = HAL_DISPLAY_ASCIIPOS0;
168 #endif
169 #if defined(CYG_KERNEL_DIAG_SERIAL)
170       cyg_hal_plf_serial_putc(NULL, c);
171 #endif
172     }
173
174   HAL_RESTORE_INTERRUPTS(__state);
175 }
176
177 void hal_diag_read_char(char* c)
178 {
179   *c = cyg_hal_plf_serial_getc(NULL);
180 }
181
182 /*---------------------------------------------------------------------------*/
183 /* End of hal_diag.c */