1 /*=============================================================================
5 // HAL diagnostic output code
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.
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.
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
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.
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.
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.
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####
44 // Contributors: nickg, dmoseley
46 // Purpose: HAL diagnostic output
47 // Description: Implementations of HAL diagnostic output support.
49 //####DESCRIPTIONEND####
51 //===========================================================================*/
53 #include <pkgconf/hal.h>
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
59 #include <cyg/hal/hal_arch.h>
60 #include <cyg/hal/hal_diag.h>
62 #include <cyg/hal/hal_intr.h>
64 #include <cyg/hal/hal_io.h>
66 //-----------------------------------------------------------------------------
67 // Select which diag channels to use
69 //#define CYG_KERNEL_DIAG_LCD
70 #define CYG_KERNEL_DIAG_SERIAL
72 /*---------------------------------------------------------------------------*/
74 void hal_diag_led(int x)
78 externC void diag_write_string (const char*);
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*);
86 void hal_diag_init(void)
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");
96 #if defined(CYG_KERNEL_DIAG_SERIAL)
97 cyg_hal_plf_comms_init();
101 #if defined(CYG_KERNEL_DIAG_LCD)
102 static void hal_diag_clear_lcd(void)
104 volatile int i = 0x20000;
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, ' ');
116 #endif /* defined(CYG_KERNEL_DIAG_LCD) */
118 void hal_diag_write_char(char c)
120 #if defined(CYG_KERNEL_DIAG_LCD)
121 static volatile CYG_WORD* reg = HAL_DISPLAY_ASCIIPOS0;
124 unsigned long __state;
126 HAL_DISABLE_INTERRUPTS(__state);
130 #if defined(CYG_KERNEL_DIAG_LCD)
131 reg = HAL_DISPLAY_ASCIIPOS0;
132 hal_diag_clear_lcd();
134 #if defined (CYG_KERNEL_DIAG_SERIAL)
135 cyg_hal_plf_serial_putc(NULL, '\r');
136 cyg_hal_plf_serial_putc(NULL, '\n');
145 #if defined(CYG_KERNEL_DIAG_LCD)
146 if (reg == HAL_DISPLAY_ASCIIPOS0)
147 hal_diag_clear_lcd();
149 HAL_WRITE_UINT32(reg, c);
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;
169 #if defined(CYG_KERNEL_DIAG_SERIAL)
170 cyg_hal_plf_serial_putc(NULL, c);
174 HAL_RESTORE_INTERRUPTS(__state);
177 void hal_diag_read_char(char* c)
179 *c = cyg_hal_plf_serial_getc(NULL);
182 /*---------------------------------------------------------------------------*/
183 /* End of hal_diag.c */