]> git.karo-electronics.de Git - karo-tx-redboot.git/blob - packages/hal/arm/xscale/iq80310/v2_0/src/diag/diag.c
Initial revision
[karo-tx-redboot.git] / packages / hal / arm / xscale / iq80310 / v2_0 / src / diag / diag.c
1 //==========================================================================
2 //
3 //      diag.c
4 //
5 //      Additional RedBoot commands to run board diags.
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, 2003 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):    msalter
44 // Contributors: msalter
45 // Date:         2000-10-10
46 // Purpose:      
47 // Description:  
48 //              
49 // This code is part of RedBoot (tm).
50 //
51 //####DESCRIPTIONEND####
52 //
53 //==========================================================================
54
55 #include <redboot.h>
56 #ifdef CYGPKG_IO_ETH_DRIVERS
57 #include <cyg/io/eth/eth_drv.h>
58 #endif
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
63
64 #include <cyg/hal/hal_tables.h>
65
66 #include "iq80310.h"
67
68 int pci_config_cycle = 0;       /* skip exception handling when performing pci config cycle */
69
70 static void do_hdwr_diag(int argc, char *argv[]);
71
72 RedBoot_cmd("diag", 
73             "Run board diagnostics", 
74             "",
75             do_hdwr_diag
76     );
77
78
79 void hdwr_diag (void);
80
81 void do_hdwr_diag(int arg, char *argv[])
82 {
83     hal_virtual_comm_table_t* __chan;
84
85     // Turn off interrupts on debug channel.
86     // All others should already be disabled.
87     __chan = CYGACC_CALL_IF_DEBUG_PROCS();
88     if (__chan)
89         CYGACC_COMM_IF_CONTROL(*__chan, __COMMCTL_IRQ_DISABLE);
90
91 #ifdef CYGPKG_IO_ETH_DRIVERS
92     HAL_INTERRUPT_MASK(eth_drv_int_vector());
93 #endif
94
95     hdwr_diag();
96 }
97
98 void __disableDCache(void)
99 {
100     HAL_DCACHE_SYNC();
101     HAL_DCACHE_DISABLE();
102 }
103
104 void __enableDCache(void)
105 {
106     HAL_DCACHE_ENABLE();
107 }
108
109
110 void _flushICache(void)
111 {
112     HAL_ICACHE_INVALIDATE_ALL();
113 }
114
115 void __enableICache(void)
116 {
117     HAL_ICACHE_ENABLE();
118 }
119
120 void __disableICache(void)
121 {
122     HAL_ICACHE_DISABLE();
123 }
124
125 void _enableFiqIrq(void)
126 {
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;"
131          "orr           r0, r0, #3;"
132          "mcr   p13, 0, r0, c0, c0, 0;"
133          : : );
134 }
135
136
137 void _enable_timer(void)
138 {
139     asm("ldr r1, =0x00000005;"
140         "mcr p14, 0, r1, c0, c0, 0 ;"
141         : : : "r1" );
142 }
143
144 void _disable_timer(void)
145 {
146     asm("ldr r1, =0x00000000;"
147         "mcr p14, 0, r1, c0, c0, 0 ;"
148         : : : "r1" );
149 }
150
151 void _usec_delay(void)
152 {
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");
161 }
162
163 void _msec_delay(void)
164 {
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");
173 }
174
175 unsigned int _read_timer(void)
176 {
177     unsigned x;
178     asm("mrc p14, 0, %0, c1, c0, 0;" : "=r"(x) : );
179     return x;
180 }
181