Search
lxdream.org :: lxdream/test/asic.c
lxdream 0.9.1
released Jun 29
Download Now
filename test/asic.c
changeset 561:533f6b478071
prev193:31151fcc3cb7
next753:1fe39c3a9bbc
author nkeynes
date Thu Jan 31 09:35:01 2008 +0000 (12 years ago)
permissions -rw-r--r--
last change Update release notes for 0.8.3
view annotate diff log raw
     1 /**
     2  * $Id$
     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 }
.