Search
lxdream.org :: lxdream/test/asic.c
lxdream 0.9.1
released Jun 29
Download Now
filename test/asic.c
changeset 185:6755a04c447f
next193:31151fcc3cb7
author nkeynes
date Fri Aug 04 01:36:23 2006 +0000 (17 years ago)
permissions -rw-r--r--
last change Add exact qNan test
view annotate diff log raw
     1 /**
     2  * $Id: asic.c,v 1.1 2006-07-11 01:35:23 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 void asic_mask_all()
    56 {
    57     long_write(ASIC_IRQA(0), 0);
    58     long_write(ASIC_IRQA(1), 0);
    59     long_write(ASIC_IRQA(2), 0);
    60     long_write(ASIC_IRQB(0), 0);
    61     long_write(ASIC_IRQB(1), 0);
    62     long_write(ASIC_IRQB(2), 0);
    63     long_write(ASIC_IRQC(0), 0);
    64     long_write(ASIC_IRQC(1), 0);
    65     long_write(ASIC_IRQC(2), 0);
    66 }
    68 /**
    69  * Print the contents of the ASIC event registers to the supplied FILE
    70  */
    71 void asic_dump( FILE *f )
    72 {
    73     int i,j;
    74     fprintf( f, "Events: " );
    75     for( i=0; i<3; i++ ) {
    76 	uint32_t val = long_read(ASIC_PIRQ(i));
    77 	for( j=0; j<32; j++ ) {
    78 	    if( val & (1<<j) ) {
    79 		fprintf( f, "%d ", (i<<5)+j );
    80 	    }
    81 	}
    82     }
    83     fprintf( f, "\n" );
    84 }
.