Search
lxdream.org :: lxdream/test/asic.c
lxdream 0.9.1
released Jun 29
Download Now
filename test/asic.c
changeset 753:1fe39c3a9bbc
prev561:533f6b478071
next815:866c103d72cd
author nkeynes
date Thu Jul 24 07:27:48 2008 +0000 (11 years ago)
permissions -rw-r--r--
last change Halt emulation after reporting an error
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  * Wait for either of 2 ASIC events. 
    47  * @return the event id if the event occurred, otherwise -1 if the wait timed out.
    48  */
    49 int asic_wait2( int event1, int event2 )
    50 {
    51     int n1 = event1 >> 5;
    52     int n2 = event2 >> 5;
    53     unsigned int mask1 = (1<< (event1&0x1f));
    54     unsigned int mask2 = (1<< (event2&0x1f));
    55     int i;
    56     for( i=0; i<TIMEOUT; i++ ) {
    57 	if( long_read(ASIC_PIRQ(n1)) & mask1 ) {
    58 	    return event1;
    59 	}
    60 	if( long_read(ASIC_PIRQ(n2)) & mask2 ) {
    61             return event2;
    62         }
    63     }
    64     return -1; /* Timeout */
    65 }
    67 /**
    68  * Clear all asic events
    69  */
    70 void asic_clear()
    71 {
    72     long_write(ASIC_PIRQ(0), 0xFFFFFFFF);
    73     long_write(ASIC_PIRQ(1), 0xFFFFFFFF);
    74     long_write(ASIC_PIRQ(2), 0xFFFFFFFF);
    75 }
    77 int asic_check( int event ) 
    78 {
    79     int n = event >> 5;
    80     unsigned int mask = (1<< (event&0x1f));
    81     return (long_read(ASIC_PIRQ(n)) & mask) != 0;
    82 }
    84 void asic_mask_all()
    85 {
    86     long_write(ASIC_IRQA(0), 0);
    87     long_write(ASIC_IRQA(1), 0);
    88     long_write(ASIC_IRQA(2), 0);
    89     long_write(ASIC_IRQB(0), 0);
    90     long_write(ASIC_IRQB(1), 0);
    91     long_write(ASIC_IRQB(2), 0);
    92     long_write(ASIC_IRQC(0), 0);
    93     long_write(ASIC_IRQC(1), 0);
    94     long_write(ASIC_IRQC(2), 0);
    95 }
    97 /**
    98  * Print the contents of the ASIC event registers to the supplied FILE
    99  */
   100 void asic_dump( FILE *f )
   101 {
   102     int i,j;
   103     fprintf( f, "Events: " );
   104     for( i=0; i<3; i++ ) {
   105 	uint32_t val = long_read(ASIC_PIRQ(i));
   106 	for( j=0; j<32; j++ ) {
   107 	    if( val & (1<<j) ) {
   108 		fprintf( f, "%d ", (i<<5)+j );
   109 	    }
   110 	}
   111     }
   112     fprintf( f, "\n" );
   113 }
.