1 //==========================================================================
5 // Additional RedBoot commands to run board diags.
7 //==========================================================================
8 //####ECOSGPLCOPYRIGHTBEGIN####
9 // -------------------------------------------
10 // This file is part of eCos, the Embedded Configurable Operating System.
11 // Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 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: msalter
49 // This code is part of RedBoot (tm).
51 //####DESCRIPTIONEND####
53 //==========================================================================
56 #ifdef CYGPKG_IO_ETH_DRIVERS
57 #include <cyg/io/eth/eth_drv.h>
59 #include <cyg/hal/hal_arch.h>
60 #include <cyg/hal/hal_intr.h>
61 #include <cyg/hal/hal_cache.h>
62 #include CYGHWR_MEMORY_LAYOUT_H
64 #include <cyg/hal/hal_tables.h>
68 int pci_config_cycle = 0; /* skip exception handling when performing pci config cycle */
70 static void do_hdwr_diag(int argc, char *argv[]);
73 "Run board diagnostics",
79 void hdwr_diag (void);
81 void do_hdwr_diag(int arg, char *argv[])
83 hal_virtual_comm_table_t* __chan;
85 // Turn off interrupts on debug channel.
86 // All others should already be disabled.
87 __chan = CYGACC_CALL_IF_DEBUG_PROCS();
89 CYGACC_COMM_IF_CONTROL(*__chan, __COMMCTL_IRQ_DISABLE);
91 #ifdef CYGPKG_IO_ETH_DRIVERS
92 HAL_INTERRUPT_MASK(eth_drv_int_vector());
98 void __disableDCache(void)
101 HAL_DCACHE_DISABLE();
104 void __enableDCache(void)
110 void _flushICache(void)
112 HAL_ICACHE_INVALIDATE_ALL();
115 void __enableICache(void)
120 void __disableICache(void)
122 HAL_ICACHE_DISABLE();
125 void _enableFiqIrq(void)
127 asm ("mrc p15, 0, r0, c13, c0, 1;"
128 "orr r0, r0, #0x2000;"
129 "mrc p15, 0, r0, c13, c0, 1;"
130 "mrc p13, 0, r0, c0, c0, 0;"
132 "mcr p13, 0, r0, c0, c0, 0;"
137 void _enable_timer(void)
139 asm("ldr r1, =0x00000005;"
140 "mcr p14, 0, r1, c0, c0, 0 ;"
144 void _disable_timer(void)
146 asm("ldr r1, =0x00000000;"
147 "mcr p14, 0, r1, c0, c0, 0 ;"
151 void _usec_delay(void)
153 asm ("ldr r2, =0x258;" /* 1 microsec = 600 clocks (600 MHz CPU core) */
154 "0: mrc p14, 0, r0, c1, c0, 0;" /*read CCNT into r0 */
155 "cmp r2, r0;" /* compare the current count */
156 "bpl 0b;" /* stay in loop until count is greater */
157 "mrc p14, 0, r1, c0, c0, 0;"
158 "orr r1, r1, #4;" /* clear the timer */
159 "mcr p14, 0, r1, c0, c0, 0 ;"
160 : : : "r0","r1","r2");
163 void _msec_delay(void)
165 asm ("ldr r2, =0x927c0;" /* 1 millisec = 600,000 clocks (600 MHz CPU core) */
166 "0: mrc p14, 0, r0, c1, c0, 0;" /*read CCNT into r0 */
167 "cmp r2, r0;" /* compare the current count */
168 "bpl 0b;" /* stay in loop until count is greater */
169 "mrc p14, 0, r1, c0, c0, 0;"
170 "orr r1, r1, #4;" /* clear the timer */
171 "mcr p14, 0, r1, c0, c0, 0 ;"
172 : : : "r0","r1","r2");
175 unsigned int _read_timer(void)
178 asm("mrc p14, 0, %0, c1, c0, 0;" : "=r"(x) : );