filename | test/asic.c |
changeset | 193:31151fcc3cb7 |
prev | 185:6755a04c447f |
next | 561:533f6b478071 |
author | nkeynes |
date | Thu Jan 25 10:16:32 2007 +0000 (17 years ago) |
permissions | -rw-r--r-- |
last change | Move PVR2 dma handling (0x10000000-0x13FFFFFF) into pvr2mem.c, minor register cleanups in asic.c |
view | annotate | diff | log | raw |
1 /**
2 * $Id: asic.c,v 1.2 2006-08-04 01:38:30 nkeynes Exp $
3 *
4 * General ASIC support code
5 *
6 * Copyright (c) 2006 Nathan Keynes.
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 */
19 #include "lib.h"
21 #define ASIC_BASE 0xA05F6000
22 #define ASIC_PIRQ(n) (ASIC_BASE + 0x900 + (n<<2))
23 #define ASIC_IRQA(n) (ASIC_BASE + 0x910 + (n<<2))
24 #define ASIC_IRQB(n) (ASIC_BASE + 0x920 + (n<<2))
25 #define ASIC_IRQC(n) (ASIC_BASE + 0x930 + (n<<2))
26 #define TIMEOUT 10000000
28 /**
29 * Wait for an ASIC event.
30 * @return 0 if the event occurred, otherwise -1 if the wait timed out.
31 */
32 int asic_wait( int event )
33 {
34 int n = event >> 5;
35 unsigned int mask = (1<< (event&0x1f));
36 int i;
37 for( i=0; i<TIMEOUT; i++ ) {
38 if( long_read(ASIC_PIRQ(n)) & mask ) {
39 return 0;
40 }
41 }
42 return -1; /* Timeout */
43 }
45 /**
46 * Clear all asic events
47 */
48 void asic_clear()
49 {
50 long_write(ASIC_PIRQ(0), 0xFFFFFFFF);
51 long_write(ASIC_PIRQ(1), 0xFFFFFFFF);
52 long_write(ASIC_PIRQ(2), 0xFFFFFFFF);
53 }
55 int asic_check( int event )
56 {
57 int n = event >> 5;
58 unsigned int mask = (1<< (event&0x1f));
59 return (long_read(ASIC_PIRQ(n)) & mask) != 0;
60 }
62 void asic_mask_all()
63 {
64 long_write(ASIC_IRQA(0), 0);
65 long_write(ASIC_IRQA(1), 0);
66 long_write(ASIC_IRQA(2), 0);
67 long_write(ASIC_IRQB(0), 0);
68 long_write(ASIC_IRQB(1), 0);
69 long_write(ASIC_IRQB(2), 0);
70 long_write(ASIC_IRQC(0), 0);
71 long_write(ASIC_IRQC(1), 0);
72 long_write(ASIC_IRQC(2), 0);
73 }
75 /**
76 * Print the contents of the ASIC event registers to the supplied FILE
77 */
78 void asic_dump( FILE *f )
79 {
80 int i,j;
81 fprintf( f, "Events: " );
82 for( i=0; i<3; i++ ) {
83 uint32_t val = long_read(ASIC_PIRQ(i));
84 for( j=0; j<32; j++ ) {
85 if( val & (1<<j) ) {
86 fprintf( f, "%d ", (i<<5)+j );
87 }
88 }
89 }
90 fprintf( f, "\n" );
91 }
.