nkeynes@185: /** nkeynes@561: * $Id$ nkeynes@185: * nkeynes@185: * General ASIC support code nkeynes@185: * nkeynes@185: * Copyright (c) 2006 Nathan Keynes. nkeynes@185: * nkeynes@185: * This program is free software; you can redistribute it and/or modify nkeynes@185: * it under the terms of the GNU General Public License as published by nkeynes@185: * the Free Software Foundation; either version 2 of the License, or nkeynes@185: * (at your option) any later version. nkeynes@185: * nkeynes@185: * This program is distributed in the hope that it will be useful, nkeynes@185: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@185: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@185: * GNU General Public License for more details. nkeynes@185: */ nkeynes@185: nkeynes@185: #include "lib.h" nkeynes@185: nkeynes@185: #define ASIC_BASE 0xA05F6000 nkeynes@185: #define ASIC_PIRQ(n) (ASIC_BASE + 0x900 + (n<<2)) nkeynes@185: #define ASIC_IRQA(n) (ASIC_BASE + 0x910 + (n<<2)) nkeynes@185: #define ASIC_IRQB(n) (ASIC_BASE + 0x920 + (n<<2)) nkeynes@185: #define ASIC_IRQC(n) (ASIC_BASE + 0x930 + (n<<2)) nkeynes@185: #define TIMEOUT 10000000 nkeynes@185: nkeynes@185: /** nkeynes@185: * Wait for an ASIC event. nkeynes@185: * @return 0 if the event occurred, otherwise -1 if the wait timed out. nkeynes@185: */ nkeynes@185: int asic_wait( int event ) nkeynes@185: { nkeynes@185: int n = event >> 5; nkeynes@185: unsigned int mask = (1<< (event&0x1f)); nkeynes@185: int i; nkeynes@185: for( i=0; i> 5; nkeynes@193: unsigned int mask = (1<< (event&0x1f)); nkeynes@193: return (long_read(ASIC_PIRQ(n)) & mask) != 0; nkeynes@193: } nkeynes@193: nkeynes@185: void asic_mask_all() nkeynes@185: { nkeynes@185: long_write(ASIC_IRQA(0), 0); nkeynes@185: long_write(ASIC_IRQA(1), 0); nkeynes@185: long_write(ASIC_IRQA(2), 0); nkeynes@185: long_write(ASIC_IRQB(0), 0); nkeynes@185: long_write(ASIC_IRQB(1), 0); nkeynes@185: long_write(ASIC_IRQB(2), 0); nkeynes@185: long_write(ASIC_IRQC(0), 0); nkeynes@185: long_write(ASIC_IRQC(1), 0); nkeynes@185: long_write(ASIC_IRQC(2), 0); nkeynes@185: } nkeynes@185: nkeynes@185: /** nkeynes@185: * Print the contents of the ASIC event registers to the supplied FILE nkeynes@185: */ nkeynes@185: void asic_dump( FILE *f ) nkeynes@185: { nkeynes@185: int i,j; nkeynes@185: fprintf( f, "Events: " ); nkeynes@185: for( i=0; i<3; i++ ) { nkeynes@185: uint32_t val = long_read(ASIC_PIRQ(i)); nkeynes@185: for( j=0; j<32; j++ ) { nkeynes@185: if( val & (1<