/*************************************** * src: tvm.c 09/08/1990 GdA * * * * * * Gestione PITs per TVM742/743 * * * ***************************************/ #include #include #include "std.h" #include "pit.h" #include "tvmev.h" /**************************** * * * INIZIALIZZAZIONE PIT * * * ****************************/ ARGINT TVM_Init(m) int m; { int i; FAST PIT *p; UCOUNT vec = VEC; UCOUNT vect; /* IMPORT VOID ip1(), ip2(), ip3(), ip4(); IMPORT VOID ip5(), ip6(), ip7(), ip8(); IMPORT VOID ip9(), ip10(), ip11(), ip12(); IMPORT VOID ip13(), ip14(), ip15(), ip16(); FAST VOID (**v)(); */ if(m > NTVM || p0[m] < 0xff0000 || p0[m] > 0xffffff) return(-1); if(tvm_typ[m][0] < 742 || tvm_typ[m][0] > 743) return(-1); fpermit(p0[m], 1024); /* open VME memory */ /* create or link to the event */ if ((ev_id[m] = _ev_link(TVM_event[m])) == -1){ /* if event does noes not exist : a) create event; b) init TVM; */ if ((ev_id[m] = _ev_creat(0, -1, 1, TVM_event[m])) == -1) exit(_errmsg(errno,"Tvm_Init: error getting access to event - ")); if(tvm_typ[m][0] == 743 && vec != 0){ p = (PIT *) (p0[m] | PIT1); vect = vec; if(deblev[0]) printf("TVM_Init, 1: p0,PIT1 = %x,%x\n", p0[m],PIT1); if(deblev[0]) printf("TVM_Init, 1: p = %x\n", p); #include "pit_out.macro" p = (PIT *) (p0[m] | PIT2); vect = vec + 4; if(deblev[0]) printf("TVM_Init, 2: p0,PIT2 = %x,%x\n", p0[m],PIT2); if(deblev[0]) printf("TVM_Init, 2: p = %x\n", p); #include "pit_out.macro" p = (PIT *) (p0[m] | PIT3); vect = vec + 8; if(deblev[0]) printf("TVM_Init, 3: p0,PIT3 = %x,%x\n", p0[m],PIT3); if(deblev[0]) printf("TVM_Init, 3: p = %x\n", p); #include "pit_out.macro" p = (PIT*) (p0[m] | PIT4); vect = vec + 12; if(deblev[0]) printf("TVM_Init, 4: p0,PIT1 = %x,%x\n", p0[m],PIT4); if(deblev[0]) printf("TVM_Init, 4: p = %x\n", p); #include "pit_out.macro" for (i = 0; i < 8; i++) out_val[m][i] = 0xff; } else if(tvm_typ[m][0] == 742 && vec != 0){ p = (PIT *) (p0[m] | PIT1); vect = vec; #include "pit_in.macro" p = (PIT *) (p0[m] | PIT2); vect = vec + 4; #include "pit_in.macro" p = (PIT *) (p0[m] | PIT3); vect = vec + 8; #include "pit_in.macro" p = (PIT *) (p0[m] | PIT4); vect = vec + 12; #include "pit_in.macro" } /* leaving critical section */ if (_ev_signal(ev_id[m], 0) == -1) exit(_errmsg(errno, "TVM_Init: error signalling the evnt - ")); } } TVM_End(m) int m; { /* unlink from event */ if (_ev_unlink(ev_id[m]) == -1) exit(_errmsg(errno, "error unlinking from event - ")); /* delete event from system if this was the last process to unlink */ if (_ev_delete(TVM_event[m]) == -1 && errno != E_EVBUSY) exit(_errmsg(errno,"error deleting from system -")); return 0; } /************************************************************* * * * Switch one channel on/off * * * * E' preferibile usare questa routine per accendere * * e spegnere un canale perche' NON si basa sul contenuto di * * out_val[m][ibyte] che potrebbe essere non aggiornato !! * * * *************************************************************/ ARGINT TVM_Switch(m, ch, action) int m, ch; char *action; { FAST PIT *p; int ibyte, ibit; UTINY a, val; if(tvm_typ[m][0] != 743) return(-1); ibyte = (64 - ch)/8; ibit = (ch - 1)% 8; a = 1 << ibit; if(_ev_wait( ev_id[m], 1, 1) == -1) exit(_errmsg(errno,"Out_Ch_Check : error waiting event ")); /* check before previous status */ switch (ibyte){ case 7: p = (PIT *) (p0[m] | PIT2); val = p->pbdr; /* bits 1-8 */ break; case 6: p = (PIT *) (p0[m] | PIT1); val = p->pbdr; /* bits 9-16 */ break; case 5: p = (PIT *) (p0[m] | PIT2); val = p->padr; /* bits 17-24 */ break; case 4: p = (PIT *) (p0[m] | PIT1); val = p->padr; /* bits 25-32 */ break; case 3: p = (PIT *) (p0[m] | PIT4); val = p->pbdr; /* bits 33-40 */ break; case 2: p = (PIT *) (p0[m] | PIT3); val = p->pbdr; /* bits 41-48 */ break; case 1: p = (PIT *) (p0[m] | PIT4); val = p->padr; /* bits 49-56 */ break; case 0: p = (PIT *) (p0[m] | PIT3); val = p->padr; /* bits 57-64 */ break; } if ( strcmp(action, "on") == 0 || strcmp( action, "ON") == 0) if ( ! (val & a) ) goto end_signal; else val &= ~a; else if( strcmp(action, "off") == 0 || strcmp (action, "OFF") == 0) if ( val & a) goto end_signal; else val |= a; else { printf(" tvm_switch: \"%s\" is an unrecognized command \n", action); goto end_signal; } switch (ibyte){ case 7: p = (PIT *) (p0[m] | PIT2); p->pbdr = val; /* bits 1-8 */ break; case 6: p = (PIT *) (p0[m] | PIT1); p->pbdr = val; /* bits 9-16 */ break; case 5: p = (PIT *) (p0[m] | PIT2); p->padr = val; /* bits 17-24 */ break; case 4: p = (PIT *) (p0[m] | PIT1); p->padr = val; /* bits 25-32 */ break; case 3: p = (PIT *) (p0[m] | PIT4); p->pbdr = val; /* bits 33-40 */ break; case 2: p = (PIT *) (p0[m] | PIT3); p->pbdr = val; /* bits 41-48 */ break; case 1: p = (PIT *) (p0[m] | PIT4); p->padr = val; /* bits 49-56 */ break; case 0: p = (PIT *) (p0[m] | PIT3); p->padr = val; /* bits 57-64 */ break; } end_signal: if (_ev_signal(ev_id[m], 0) == -1) exit(_errmsg(errno, "Out_Ch_Check: error signalling the evnt - ")); return( ! (val & a) ); /* =0 -> off ; !=0 -> on */ } /************************************** * * * OUTPUT UNA DOUBLE WORD (64 bits) * * * **************************************/ ARGINT Out64(m, a) UTINY a[8]; int m; { FAST PIT *p; int i; if(tvm_typ[m][0] != 743) return(-1); if(_ev_wait( ev_id[m], 1, 1) == -1) exit(_errmsg(errno,"Out64 : error waiting event ")); p = (PIT *) (p0[m] | PIT2); p->pbdr = a[7]; /* bits 1-8 */ p = (PIT *) (p0[m] | PIT1); p->pbdr = a[6]; /* bits 9-16 */ p = (PIT *) (p0[m] | PIT2); p->padr = a[5]; /* bits 17-24 */ p = (PIT *) (p0[m] | PIT1); p->padr = a[4]; /* bits 25-32 */ p = (PIT *) (p0[m] | PIT4); p->pbdr = a[3]; /* bits 33-40 */ p = (PIT *) (p0[m] | PIT3); p->pbdr = a[2]; /* bits 41-48 */ p = (PIT *) (p0[m] | PIT4); p->padr = a[1]; /* bits 49-56 */ p = (PIT *) (p0[m] | PIT3); p->padr = a[0]; /* bits 57-64 */ for (i = 0; i < 8; i++) out_val[m][i] = a[i]; if (_ev_signal(ev_id[m], 0) == -1) exit(_errmsg(errno, "Out64_Init: error signalling the evnt - ")); } /******************************* * get informations * * about TVM * *******************************/ ARGINT TVM_Info(m, base, tipo, level) int *base, *tipo, *level; int m; { if(m > NTVM || p0[m] < 0xff0000 || p0[m] > 0xffffff) return(-1); if(tvm_typ[m][0] < 742 || tvm_typ[m][0] > 743) return(-1); *base = p0[m]; *tipo = tvm_typ[m][0]; *level = tvm_typ[m][1]; } /**************************************** * * * LEGGE VALORE DELLE USCITE SETTATE * * * ****************************************/ ARGINT Read_OutVal(m, a) UTINY a[8]; int m; { FAST PIT *p; int i; if(tvm_typ[m][0] != 743) return(-1); if(_ev_wait( ev_id[m], 1, 1) == -1) exit(_errmsg(errno,"Read_OutVal : error waiting event ")); p = (PIT *) (p0[m] | PIT2); a[7] = p->pbdr; /* bits 1-8 */ p = (PIT *) (p0[m] | PIT1); a[6] = p->pbdr; /* bits 9-16 */ p = (PIT *) (p0[m] | PIT2); a[5] = p->padr; /* bits 17-24 */ p = (PIT *) (p0[m] | PIT1); a[4] = p->padr; /* bits 25-32 */ p = (PIT *) (p0[m] | PIT4); a[3] = p->pbdr; /* bits 33-40 */ p = (PIT *) (p0[m] | PIT3); a[2] = p->pbdr; /* bits 41-48 */ p = (PIT *) (p0[m] | PIT4); a[1] = p->padr; /* bits 49-56 */ p = (PIT *) (p0[m] | PIT3); a[0] = p->padr; /* bits 57-64 */ if (_ev_signal(ev_id[m], 0) == -1) exit(_errmsg(errno, "Read_OutVal: error signalling the evnt - ")); } /**************************************** * * * ottiene il valore di out_val * * ( software) * ****************************************/ VOID get_out_val(m, a) UTINY a[8]; int m; { int i; for (i = 0; i < 8; i++) a[i] = out_val[m][i]; } /************************************** * * * accende un canale * * * Att. meglio usare TVM_Switch ! * * * **************************************/ ARGINT Ch_On(m, ch) int m, ch; { FAST PIT *p; int ibyte, ibit, i; UTINY a; if(tvm_typ[m][0] != 743) return(-1); ibyte = (64 - ch)/8; ibit = (ch - 1) % 8; a = 1 << ibit; if ( !(out_val[m][ibyte] & a) ) return(0); out_val[m][ibyte] &= ~a; if(_ev_wait( ev_id[m], 1, 1) == -1) exit(_errmsg(errno,"Ch_On : error waiting event ")); switch (ibyte){ case 7: p = (PIT *) (p0[m] | PIT2); p->pbdr = out_val[m][ibyte]; /* bits 1-8 */ break; case 6: p = (PIT *) (p0[m] | PIT1); p->pbdr = out_val[m][ibyte]; /* bits 9-16 */ break; case 5: p = (PIT *) (p0[m] | PIT2); p->padr = out_val[m][ibyte]; /* bits 17-24 */ break; case 4: p = (PIT *) (p0[m] | PIT1); p->padr = out_val[m][ibyte]; /* bits 25-32 */ break; case 3: p = (PIT *) (p0[m] | PIT4); p->pbdr = out_val[m][ibyte]; /* bits 33-40 */ break; case 2: p = (PIT *) (p0[m] | PIT3); p->pbdr = out_val[m][ibyte]; /* bits 41-48 */ break; case 1: p = (PIT *) (p0[m] | PIT4); p->padr = out_val[m][ibyte]; /* bits 49-56 */ break; case 0: p = (PIT *) (p0[m] | PIT3); p->padr = out_val[m][ibyte]; /* bits 57-64 */ break; } if (_ev_signal(ev_id[m], 0) == -1) exit(_errmsg(errno, "Ch_On: error signalling the evnt - ")); } /************************************** * * * spegne un canale * * * * Att. meglio TVM_Switch * **************************************/ ARGINT Ch_Off(m, ch) int m, ch; { FAST PIT *p; int ibyte, ibit; UTINY a; if(tvm_typ[m][0] != 743) return(-1); ibyte = (64 - ch)/8; ibit = (ch - 1)% 8; a = 1 << ibit; if ((out_val[m][ibyte] & a)) return(0); out_val[m][ibyte] |= a; if(_ev_wait( ev_id[m], 1, 1) == -1) exit(_errmsg(errno,"Ch_Off : error waiting event ")); switch (ibyte){ case 7: p = (PIT *) (p0[m] | PIT2); p->pbdr = out_val[m][ibyte]; /* bits 1-8 */ break; case 6: p = (PIT *) (p0[m] | PIT1); p->pbdr = out_val[m][ibyte]; /* bits 9-16 */ break; case 5: p = (PIT *) (p0[m] | PIT2); p->padr = out_val[m][ibyte]; /* bits 17-24 */ break; case 4: p = (PIT *) (p0[m] | PIT1); p->padr = out_val[m][ibyte]; /* bits 25-32 */ break; case 3: p = (PIT *) (p0[m] | PIT4); p->pbdr = out_val[m][ibyte]; /* bits 33-40 */ break; case 2: p = (PIT *) (p0[m] | PIT3); p->pbdr = out_val[m][ibyte]; /* bits 41-48 */ break; case 1: p = (PIT *) (p0[m] | PIT4); p->padr = out_val[m][ibyte]; /* bits 49-56 */ break; case 0: p = (PIT *) (p0[m] | PIT3); p->padr = out_val[m][ibyte]; /* bits 57-64 */ break; } if (_ev_signal(ev_id[m], 0) == -1) exit(_errmsg(errno, "Ch_Off: error signalling the evnt - ")); } /***************************************************** * * * Controlla se il singolo canale OUTPUT e' on/off * * * *****************************************************/ ARGINT Out_Ch_Check(m, ch) int m, ch; { FAST PIT *p; int ibyte, ibit; UTINY a, val; if(tvm_typ[m][0] != 743) return(-1); ibyte = (64 - ch)/8; ibit = (ch - 1)% 8; a = 1 << ibit; if(_ev_wait( ev_id[m], 1, 1) == -1) exit(_errmsg(errno,"Out_Ch_Check : error waiting event ")); switch (ibyte){ case 7: p = (PIT *) (p0[m] | PIT2); val = p->pbdr; /* bits 1-8 */ break; case 6: p = (PIT *) (p0[m] | PIT1); val = p->pbdr; /* bits 9-16 */ break; case 5: p = (PIT *) (p0[m] | PIT2); val = p->padr; /* bits 17-24 */ break; case 4: p = (PIT *) (p0[m] | PIT1); val = p->padr; /* bits 25-32 */ break; case 3: p = (PIT *) (p0[m] | PIT4); val = p->pbdr; /* bits 33-40 */ break; case 2: p = (PIT *) (p0[m] | PIT3); val = p->pbdr; /* bits 41-48 */ break; case 1: p = (PIT *) (p0[m] | PIT4); val = p->padr; /* bits 49-56 */ break; case 0: p = (PIT *) (p0[m] | PIT3); val = p->padr; /* bits 57-64 */ break; } if (_ev_signal(ev_id[m], 0) == -1) exit(_errmsg(errno, "Out_Ch_Check: error signalling the evnt - ")); return( ! (val & a) ); /* =0 -> off ; !=0 -> on */ } /************************************** * * * INPUT UNA WORD (16 bits) * * * * ( from TVM743 ) * **************************************/ ARGINT In16(m, a) int m; FAST UCOUNT *a; { FAST PIT *p; if(tvm_typ[m][0] != 743) return(-1); if(_ev_wait( ev_id[m], 1, 1) == -1) exit(_errmsg(errno,"In16 : error waiting event ")); *a = 0; p = (PIT *) (p0[m] | PIT1); *a = p->psr >>4; /* *a = *a << 4; */ p = (PIT *) (p0[m] | PIT2); *a |= p->psr & 0xf0; p = (PIT *) (p0[m] | PIT3); *a |= (p->psr & 0xf0) << 4; p = (PIT *) (p0[m] | PIT4); *a |= (p->psr & 0xf0) << 8; if (_ev_signal(ev_id[m], 0) == -1) exit(_errmsg(errno, "In16: error signalling the evnt - ")); return(0); } /***************************************************** * * * Controlla se il singolo canale di INPUT * * del TVM743 e' on/off * * * *****************************************************/ ARGINT In16_Ch_Check(m, ch) int m, ch; { FAST PIT *p; int ibyte, ibit; UTINY a, val; if(tvm_typ[m][0] != 743) return(-1); ibyte = (16 - ch)/4; ibit = (ch - 1)% 4; a = 1 << ibit; if(_ev_wait( ev_id[m], 1, 1) == -1) exit(_errmsg(errno,"In16_Ch_Check : error waiting event ")); switch (ibyte){ case 3: p = (PIT *) (p0[m] | PIT1); val = p->psr >> 4; /* bits 1-4 */ break; case 2: p = (PIT *) (p0[m] | PIT2); val = p->psr >> 4; /* bits 5-8 */ break; case 1: p = (PIT *) (p0[m] | PIT3); val = p->psr >> 4; /* bits 9-12 */ break; case 0: p = (PIT *) (p0[m] | PIT4); val = p->psr >> 4; /* bits 13-16 */ break; } if (_ev_signal(ev_id[m], 0) == -1) exit(_errmsg(errno, "In16_Ch_Check: error signalling the evnt - ")); return( ! (val & a) ); /* =0 -> off ; !=0 -> on */ } /************************************** * * * INPUT UNA DOUBLE WORD (64 bits) * * * **************************************/ ARGINT In64(m, a) UTINY a[8]; int m; { FAST PIT *p; int i; if(tvm_typ[m][0] != 742) return(-1); if(_ev_wait( ev_id[m], 1, 1) == -1) exit(_errmsg(errno,"In64 : error waiting event ")); p = (PIT *) (p0[m] | PIT1); a[7] = p->padr; /* bits 1-8 */ p = (PIT *) (p0[m] | PIT1); a[6] = p->pbdr; /* bits 9-16 */ p = (PIT *) (p0[m] | PIT2); a[5] = p->padr; /* bits 17-24 */ p = (PIT *) (p0[m] | PIT2); a[4] = p->pbdr; /* bits 25-32 */ p = (PIT *) (p0[m] | PIT3); a[3] = p->padr; /* bits 33-40 */ p = (PIT *) (p0[m] | PIT3); a[2] = p->pbdr; /* bits 41-48 */ p = (PIT *) (p0[m] | PIT4); a[1] = p->padr; /* bits 49-56 */ p = (PIT *) (p0[m] | PIT4); a[0] = p->pbdr; /* bits 57-64 */ if (_ev_signal(ev_id[m], 0) == -1) exit(_errmsg(errno, "In64: error signalling the evnt - ")); } /**************************************** * * * LEGGE VALORE DEGLI INGRESSI * * * * ( alias in64 ) * ****************************************/ ARGINT Rd_In_Val(m, a) UTINY a[8]; int m; { return(In64(m, a)); } /***************************************************** * * * Controlla se il singolo canale di INPUT e' on/off * * * *****************************************************/ ARGINT In_Ch_Check(m, ch) int m, ch; { FAST PIT *p; int ibyte, ibit; UTINY a, val; if(tvm_typ[m][0] != 742) return(-1); ibyte = (64 - ch)/8; ibit = (ch - 1)% 8; a = 1 << ibit; if(_ev_wait( ev_id[m], 1, 1) == -1) exit(_errmsg(errno,"In_Ch_Check : error waiting event ")); switch (ibyte){ case 7: p = (PIT *) (p0[m] | PIT1); val = p->padr; /* bits 1-8 */ break; case 6: p = (PIT *) (p0[m] | PIT1); val = p->pbdr; /* bits 9-16 */ break; case 5: p = (PIT *) (p0[m] | PIT2); val = p->padr; /* bits 17-24 */ break; case 4: p = (PIT *) (p0[m] | PIT2); val = p->pbdr; /* bits 25-32 */ break; case 3: p = (PIT *) (p0[m] | PIT3); val = p->padr; /* bits 33-40 */ break; case 2: p = (PIT *) (p0[m] | PIT3); val = p->pbdr; /* bits 41-48 */ break; case 1: p = (PIT *) (p0[m] | PIT4); val = p->padr; /* bits 49-56 */ break; case 0: p = (PIT *) (p0[m] | PIT4); val = p->pbdr; /* bits 57-64 */ break; } if (_ev_signal(ev_id[m], 0) == -1) exit(_errmsg(errno, "In_Ch_Check: error signalling the evnt - ")); return( ! (val & a) ); /* =0 -> off ; !=0 -> on */ }