Example #1
0
void interruptHandler(void)
{
    LOG("Interrupt\n");
    if ( readReg32(DMA_BASE, DMA_C0_CONFIGURATION) & 0x8000 ) {
        LOG("Interrupt ch0 0x%x\n", readReg32(DMA_BASE, DMA_C0_CONFIGURATION));
        writeReg32(DMA_BASE, DMA_C0_CONFIGURATION, 0);
        interruptCount++;
    }

    if ( readReg32(DMA_BASE, DMA_C1_CONFIGURATION) & 0x8000 ) {
        LOG("Interrupt ch1 0x%x\n", readReg32(DMA_BASE, DMA_C1_CONFIGURATION));
        writeReg32(DMA_BASE, DMA_C1_CONFIGURATION, 0);
        interruptCount++;
    }
}
Example #2
0
/***************************************************
* scaler_read()
* return pointer to array of scaler values (on the card)
****************************************************/
STATIC long scaler_read(scalerRecord *psr, long *val)
{
	devScalerPvt *dpvt = psr->dpvt;
	int card = dpvt->card;
	long preset;
	unsigned long rawval;
	volatile char *addr= scaler_state[card]->localAddr;
	int i, offset;
	unsigned short mask;

	Debug(8,"scaler_read: card %d\n", card);
	if ((card+1) > scaler_total_cards) return(ERROR);
	if (!scaler_state[card]->card_exists) return(ERROR);

	mask = readReg16(addr,DIRECTION_OFFSET);
	Debug(5,"scaler_read: readback of up/down mask: 0x%x\n", mask);
	mask = readReg16(addr,IRQ_MASK_OFFSET);
	Debug(5,"scaler_read: readback of IRQ mask: 0x%x\n", mask);
	for (i=0, offset=DATA_0_OFFSET; i < scaler_state[card]->num_channels; i++, offset+=4) {
	    preset = scaler_state[card]->preset[i];
		rawval = readReg32(addr,offset);
	    val[i] = (mask & (1<<i)) ? preset-rawval:rawval;
		if (i <= (devScalerDebug-19)) {
			logMsg("scaler_read: channel %d\n", i);
	    	logMsg("scaler_read: ...(dir i = %s)\n", (mask & (1<<i)) ? "DN":"UP");
	    	logMsg("scaler_read: ...(preset i = %d)\n", (unsigned int)preset);
	    	logMsg("scaler_read: ...(data i = %d)\n",rawval);
	    	logMsg("scaler_read: ...(chan i = %d)\n\n", (unsigned int)val[i]);
		}
	}
	return(0);
}
Example #3
0
/***************************************************
* scalerVS_read()
* return pointer to array of scaler values (on the card)
****************************************************/
STATIC long scalerVS_read(scalerRecord *psr, long *val)
{
	devScalerPvt *dpvt = psr->dpvt;
	int card = dpvt->card;
	volatile char *addr;
	int i, offset;

	Debug(8,"scalerVS_read: card %d\n", card);
	if (card >= scalerVS_total_cards) return(ERROR);
	addr = scalerVS_state[card]->localAddr;

	/* any write clocks all transfer registers */
	writeReg16(addr,CLOCK_XFER_REG_OFFSET,1);

	for (i=0, offset=READ_XFER_REG_OFFSET; i < scalerVS_state[card]->num_channels; i++, offset+=4) {
		val[i] = readReg32(addr,offset);
		if (i==0) {
			Debug2(11,"scalerVS_read: ...(chan %d = %ld)\n", i, val[i]);
		} else {
			Debug2(20,"scalerVS_read: ...(chan %d = %ld)\n", i, val[i]);
		}
	}

	Debug2(10,"scalerVS_read: status=0x%x; irq vector=0x%x\n",
		readReg16(scalerVS_state[card]->localAddr,STATUS_OFFSET),
		readReg16(addr,IRQ_3_GATE_VECTOR_OFFSET)&0xff);

	return(0);
}
Example #4
0
/* debugging function */
void VSCscaler_debug(int card, int numReads, int waitLoops)
{
	volatile char *addr = scaler_state[card]->localAddr;
	int i, j, offset;

	if (vsc_num_cards == 0) {
		printf("VSCscaler_debug: No Joerger VSC cards\n");
		return;
	}

	printf("VSCscaler_debug: card %d %s\n", card, scaler_state[card]->card_exists ? "exists" : "not found");
	if (!scaler_state[card]->card_exists) return;
	for (i=0; i<numReads; i++) {
		printf("VSCscaler_debug: ctrl reg = 0x%x\n", readReg16(addr,CTRL_OFFSET) &0xf);
		for (j=0; j<waitLoops; j++);
	}
	for (i=0; i<numReads; i++) {
		printf("VSCscaler_debug: dir reg = 0x%x\n",readReg16(addr,DIRECTION_OFFSET) );
		for (j=0; j<waitLoops; j++);
	}
	for (i=0; i<numReads; i++) {
		printf("VSCscaler_debug: irq vector = 0x%x\n",readReg16(addr,STATUS_ID_OFFSET) &0xff);
		for (j=0; j<waitLoops; j++);
	}
	for (i=0; i<numReads; i++) {
		printf("VSCscaler_debug: irq level/enable = 0x%x\n",readReg16(addr,IRQ_LEVEL_ENABLE_OFFSET) &0xff);
		for (j=0; j<waitLoops; j++);
	}
	for (i=0; i<numReads; i++) {
		printf("VSCscaler_debug: irq mask reg = 0x%x\n", readReg16(addr,IRQ_MASK_OFFSET));
		for (j=0; j<waitLoops; j++);
	}
	for (i=0; i<numReads; i++) {
		printf("VSCscaler_debug: rev. ser# reg = 0x%x\n", readReg16(addr,REV_SERIAL_NO_OFFSET));
		for (j=0; j<waitLoops; j++);
	}
	for (i=0; i<numReads; i++) {
		printf("VSCscaler_debug: module type = 0x%x\n",readReg16(addr,MODULE_TYPE_OFFSET) &0xff);
		for (j=0; j<waitLoops; j++);
	}
	for (i=0; i<numReads; i++) {
		printf("VSCscaler_debug: manuf. ID = 0x%x\n",readReg16(addr,MANUFACTURER_ID_OFFSET) &0xff);
		for (j=0; j<waitLoops; j++);
	}
	offset = DATA_0_OFFSET;
	for (i=0; i<2; i++, offset+=4 ) {
		for (j=0; j<numReads; j++) {
			printf("    VSCscaler_debug: channel %d counts = %d\n", i,readReg32(addr,offset) );
		}
	}
	/* Note reading from PRESET_0_OFFSET reads and clears data at DATA_0_OFFSET */
}
Example #5
0
/***************************************************
* scaler_read()
* return pointer to array of scaler values (on the card)
****************************************************/
STATIC long scaler_read(scalerRecord *psr, long *val)
{
	devScalerPvt *dpvt = psr->dpvt;
	int card = dpvt->card;
	long preset;
	volatile char *addr= scaler_state[card]->localAddr;
	int i, offset;
	unsigned short mask;

	Debug(8,"scaler_read: card %d\n", card);
	if ((card+1) > scaler_total_cards) return(ERROR);
	if (!scaler_state[card]->card_exists) return(ERROR);

	mask = readReg16(scaler_state[card]->localAddr,DIRECTION_OFFSET);
	for (i=0, offset=DATA_0_OFFSET; i < scaler_state[card]->num_channels; i++, offset+=4) {
	    preset = scaler_state[card]->preset[i];
	    val[i] = (mask & (1<<i)) ? preset-readReg32(addr,offset):readReg32(addr,offset);
	    Debug(20,"scaler_read: ...(dir i = %s)\n", (mask & (1<<i)) ? "DN":"UP");
	    Debug(20,"scaler_read: ...(preset i = 0x%x)\n", (unsigned int)preset);
	    Debug(20,"scaler_read: ...(data i = 0x%x)\n",readReg32(addr,offset));
	    Debug(10,"scaler_read: ...(chan i = 0x%x)\n\n", (unsigned int)val[i]);
	}
	return(0);
}
Example #6
0
/* debugging function */
void scalerVS_show(int card, int level)
{
	volatile char *addr;
	int i, num_channels, offset, saveDebug;
	char module_type[16];

	printf("scalerVS_show: software version: %f\n", VERSION);
	printf("scalerVS_show: %ld Joerger VS cards in use.\n", vs_num_cards);

	if ((vs_num_cards == 0) || (card >= vs_num_cards)) return;

	addr = scalerVS_state[card]->localAddr;
	saveDebug = devScaler_VSDebug;
	devScaler_VSDebug = 0;
	
	printf("scalerVS_show: card %d\n", card);
	printf("scalerVS_show: local address %p\n", addr);
	printf("scalerVS_show: control reg = 0x%x\n", readReg16(addr,CTRL_OFFSET) & 0x3);
	printf("scalerVS_show: status reg = 0x%x\n", readReg16(addr,STATUS_OFFSET) & 0x1ff);
	printf("scalerVS_show: irq level/enable = 0x%x\n", readReg16(addr,IRQ_SETUP_OFFSET) & 0xfff);
	printf("scalerVS_show: irq 3 (end-of-gate) interrupt vector = %d\n", readReg16(addr,IRQ_3_GATE_VECTOR_OFFSET) & 0xff);

	i = (readReg16(addr,ID_OFFSET) & 0xfc00) >> 10;
	if ((i >= 16) && (i <= 29)) {
		strncpy(module_type, VS_module_types[i-16].type, 15);
		num_channels = VS_module_types[i-16].num_channels;
	} else {
		sprintf(module_type, "unknown(%d)", i);
		num_channels = 0;
	}
	printf("scalerVS_show: module type = %d ('%s'), %d channels, serial # %d\n",
			i, module_type, num_channels, readReg16(addr,ID_OFFSET) & 0x3ff);

	num_channels = level ? scalerVS_state[card]->num_channels : 1;
	for (i=0, offset=READ_XFER_REG_OFFSET; i<num_channels; i++, offset+=4) {
		printf("    scalerVS_show: channel %d xfer-reg counts = %u\n", i, readReg32(addr,offset));
	}
	printf("scalerVS_show: scalerVS_state[card]->done = %d\n", scalerVS_state[card]->done);

	devScaler_VSDebug = saveDebug;
	return;
}
Example #7
0
/* debugging function */
void VSCscaler_show(int card)
{
	volatile char *addr = scaler_state[card]->localAddr;
	int i, offset;

	if (vsc_num_cards == 0) {
		printf("VSCscaler_show: No Joerger VSC cards\n");
		return;
	}

	printf("VSCscaler_show: card %d %s\n", card, scaler_state[card]->card_exists ? "exists" : "not found");
	if (!scaler_state[card]->card_exists) return;
	printf("VSCscaler_show: ctrl reg = 0x%x\n", readReg16(addr,CTRL_OFFSET) &0xf);
	printf("VSCscaler_show: dir reg = 0x%x\n",readReg16(addr,DIRECTION_OFFSET) );
	printf("VSCscaler_show: irq vector = 0x%x\n",readReg16(addr,STATUS_ID_OFFSET) &0xff);
	printf("VSCscaler_show: irq level/enable = 0x%x\n",readReg16(addr,IRQ_LEVEL_ENABLE_OFFSET) &0xff);
	printf("VSCscaler_show: irq mask reg = 0x%x\n", readReg16(addr,IRQ_MASK_OFFSET));
	printf("VSCscaler_show: module type = 0x%x\n",readReg16(addr,MODULE_TYPE_OFFSET) &0xff);
	offset = DATA_0_OFFSET;
	for (i=0; i<scaler_state[card]->num_channels; i++, offset+=4 ) {
		printf("    VSCscaler_show: channel %d counts = %d\n", i,readReg32(addr,offset) );
	}
	printf("VSCscaler_show: scaler_state[card]->done = %d\n", scaler_state[card]->done);
}