isegvhs.c

Go to the documentation of this file.
00001 /*********************************************************************
00002   Name:         isegvhs.c
00003   Created by:   P.-A. Amaudruz
00004 
00005   Contents:     ISEGVHS 32-channel 
00006                 
00007   $Id$
00008 *********************************************************************/
00009 #include <stdio.h>
00010 #include <stdint.h>
00011 #include <string.h>
00012 #include "isegvhsdrv.h"
00013 #include "isegvhs.h"
00014 #include "mvmestd.h"
00015 
00016 /*****************************************************************/
00017 /*
00018 Read isegvhs register value
00019 */
00020 static uint32_t regRead(MVME_INTERFACE *mvme, DWORD base, int offset)
00021 {
00022   mvme_set_am(mvme, MVME_AM_A16);
00023   mvme_set_dmode(mvme, MVME_DMODE_D16);
00024   return (mvme_read_value(mvme, base + offset) & 0xFFFF);
00025 }
00026 
00027 static float regReadFloat(MVME_INTERFACE *mvme, DWORD base, int offset)
00028 {
00029   uint32_t temp, temp1;
00030   float ftemp;
00031   mvme_set_am(mvme, MVME_AM_A16);
00032   mvme_set_dmode(mvme, MVME_DMODE_D16);
00033   temp = mvme_read_value(mvme, base + offset);
00034   temp1 = mvme_read_value(mvme, base + offset+2);
00035   temp = (temp<<16) | (temp1 & 0xFFFF);
00036   //ftemp = *((float *)&temp);
00037   memcpy(&ftemp, &temp, 4);
00038   //  printf("regReadFloat : %f 0x%x\n", ftemp, temp);
00039   return (ftemp);
00040 }
00041 
00042 /*****************************************************************/
00043 /*
00044 Write isegvhs register value
00045 */
00046 static void regWrite(MVME_INTERFACE *mvme, DWORD base, int offset, uint32_t value)
00047 {
00048   mvme_set_am(mvme, MVME_AM_A16);
00049   mvme_set_dmode(mvme, MVME_DMODE_D16);
00050   mvme_write_value(mvme, base + offset, value);
00051 }
00052 
00053 static void regWriteFloat(MVME_INTERFACE *mvme, DWORD base, int offset, float value)
00054 {
00055   uint32_t temp;
00056   memcpy(&temp, &value, 4);
00057   mvme_set_am(mvme, MVME_AM_A16);
00058   mvme_set_dmode(mvme, MVME_DMODE_D16);
00059   mvme_write_value(mvme, base + offset, ((temp>>16)&0xFFFF));
00060   mvme_write_value(mvme, base + offset+2, (temp & 0xFFFF));
00061 }
00062 
00063 /*****************************************************************/
00064 uint32_t isegvhs_RegisterRead(MVME_INTERFACE *mvme, DWORD base, int offset)
00065 {
00066   return regRead(mvme, base, offset);
00067 }
00068 
00069 /*****************************************************************/
00070 float isegvhs_RegisterReadFloat(MVME_INTERFACE *mvme, DWORD base, int offset)
00071 {
00072   float temp;
00073   temp = regReadFloat(mvme, base, offset);
00074   //  printf("temp:%f\n", temp);
00075   return temp;
00076 }
00077 
00078 /*****************************************************************/
00079 void     isegvhs_RegisterWrite(MVME_INTERFACE *mvme, DWORD base, int offset, uint32_t value)
00080 {
00081   regWrite(mvme,base,offset,value);
00082 }
00083 
00084 /*****************************************************************/
00085 void     isegvhs_RegisterWriteFloat(MVME_INTERFACE *mvme, DWORD base, int offset, float value)
00086 {
00087   regWriteFloat(mvme, base, offset, value);
00088 }
00089 
00090 /*****************************************************************/
00091 void  isegvhs_Status(MVME_INTERFACE *mvme, DWORD base)
00092 {
00093   uint32_t sn=0, csr;
00094   uint64_t vendor=0;
00095   printf("ISEGVHS at A32 0x%x\n", (int)base);
00096   vendor = (regRead(mvme,base,ISEGVHS_VENDOR_ID)<<16) | regRead(mvme,base,ISEGVHS_VENDOR_ID+2);
00097   printf("Module Vendor     : 0x%x%x\n", regRead(mvme,base,ISEGVHS_VENDOR_ID), regRead(mvme,base,ISEGVHS_VENDOR_ID+2));
00098   printf("Module Vendor     : %s\t\t", (char *)&vendor);
00099   csr = regRead(mvme,base,ISEGVHS_MODULE_STATUS);
00100   printf("Module Status     : 0x%x\n >> ", csr);
00101   printf("%s", csr & 0x0001 ? "FineAdj /" : " NoFineAdj /"); 
00102   printf("%s", csr & 0x0080 ? "CmdCpl /" : " /"); 
00103   printf("%s", csr & 0x0100 ? "noError /" : " ERROR /"); 
00104   printf("%s", csr & 0x0200 ? "noRamp /" : " RAMPING /"); 
00105   printf("%s", csr & 0x0400 ? "Saf closed /" : " /"); 
00106   printf("%s", csr & 0x0800 ? "Evt Active /" : " /"); 
00107   printf("%s", csr & 0x1000 ? "Mod Good /" : " MOD NO good /"); 
00108   printf("%s", csr & 0x2000 ? "Supply Good /" : " Supply NO good /"); 
00109   printf("%s\n", csr & 0x4000 ? "Temp Good /" : " Temp NO good /"); 
00110   printf("Module Control    : 0x%x\t\t", regRead(mvme,base,ISEGVHS_MODULE_CONTROL));
00111   sn = regRead(mvme, base, ISEGVHS_SERIAL_NUMBER);
00112   printf("Module S/N        : %d\n", (sn<<16)|regRead(mvme, base, ISEGVHS_SERIAL_NUMBER+2));
00113   printf("Module Temp.      : %f\t\t", isegvhs_RegisterReadFloat(mvme, base, ISEGVHS_TEMPERATURE));
00114   printf("Module Supply P5  : %f\n", regReadFloat(mvme, base, ISEGVHS_SUPPLY_P5));
00115   printf("Module Supply P12 : %f\t\t", regReadFloat(mvme, base, ISEGVHS_SUPPLY_P12));
00116   printf("Module Supply N12 : %f\n", regReadFloat(mvme, base, ISEGVHS_SUPPLY_N12));
00117   printf("Module Trim V Max : %f\t\t", regReadFloat(mvme, base, ISEGVHS_VOLTAGE_MAX));
00118   printf("Module Trim I Max : %f\n", regReadFloat(mvme, base, ISEGVHS_CURRENT_MAX));
00119   printf("Module Event Stat : 0x%04x\t\t", regRead(mvme, base, ISEGVHS_MODULE_EVENT_STATUS));
00120   printf("Module Event Mask : 0x%04x\n", regRead(mvme, base, ISEGVHS_MODULE_EVENT_MASK));
00121   printf("Channel Event Stat: 0x%04x\t\t", regRead(mvme, base, ISEGVHS_CHANNEL_EVENT_STATUS));
00122   printf("Channel Event Mask: 0x%04x\n\n", regRead(mvme, base, ISEGVHS_CHANNEL_EVENT_MASK));
00123 }
00124 
00125 /*****************************************************************/
00126 /*-PAA- For test purpose only */
00127 #ifdef MAIN_ENABLE
00128 int main (int argc, char* argv[]) {
00129 
00130   uint32_t ISEGVHS_BASE  = 0x4000;
00131   MVME_INTERFACE *myvme;
00132   int status, i;
00133   
00134   if (argc>1) {
00135     sscanf(argv[1],"%x", &ISEGVHS_BASE);
00136   }
00137   
00138   // Test under vmic
00139   status = mvme_open(&myvme, 0);
00140 
00141   isegvhs_Status(myvme, ISEGVHS_BASE);
00142 
00143   //    regWrite(myvme, ISEGVHS_BASE, ISEGVHS_MODULE_CONTROL, 0x40);    // doCLEAR
00144   //    regWrite(myvme, ISEGVHS_BASE, ISEGVHS_MODULE_CONTROL, 0x1000);    // setADJ
00145   //    regWrite(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+ISEGVHS_CHANNEL_CONTROL, 0x0);
00146   //  printf(" Channel 0: Status        :0x%x\n", regRead(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+ISEGVHS_CHANNEL_STATUS));
00147   //  printf(" Channel 0: Control       :0x%x\n\n", regRead(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+ISEGVHS_CHANNEL_CONTROL));
00148 
00149  
00150   // regWrite(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+ISEGVHS_CHANNEL_CONTROL, 0x4);
00151   //  regWriteFloat(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+ISEGVHS_VOLTAGE_RAMP_SPEED, 5.);
00152   //  regWriteFloat(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+ISEGVHS_CURRENT_RAMP_SPEED, 6.);
00153 
00154   //  regWriteFloat(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+ISEGVHS_VOLTAGE_BOUND, 1.0);
00155   //  regWriteFloat(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+ISEGVHS_VOLTAGE_NOMINAL, 2000.0);
00156   //  regWriteFloat(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+ISEGVHS_VOLTAGE_SET, 0.0);
00157 
00158   //  regWrite(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+ISEGVHS_CHANNEL_CONTROL, 0x8);
00159   // regWriteFloat(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+ISEGVHS_CURRENT_BOUND, 0.022);
00160   //  regWriteFloat(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+ISEGVHS_CURRENT_NOMINAL, 0.0012);
00161 
00162   printf("Chn     Vrmp   Irmp      Vset      Vmes    Vbnd    Vnom      IsetmA   ImesmA  Ibnd   CSta   CCtl\n");
00163   for (i=0;i<12;i++) {
00164     printf("%02d ", i);
00165     regWriteFloat(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+(i*ISEGVHS_CHANNEL_OFFSET)+ISEGVHS_VOLTAGE_BOUND, 0.5);
00166     //    regWriteFloat(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+(i*ISEGVHS_CHANNEL_OFFSET)+ISEGVHS_CURRENT_BOUND, 0.004);
00167     printf("%8.2f ", regReadFloat(myvme, ISEGVHS_BASE, ISEGVHS_VOLTAGE_RAMP_SPEED));
00168     printf("%8.2f ", regReadFloat(myvme, ISEGVHS_BASE, ISEGVHS_CURRENT_RAMP_SPEED));
00169     printf("%8.2f ", regReadFloat(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+(i*ISEGVHS_CHANNEL_OFFSET)+ISEGVHS_VOLTAGE_SET));
00170     printf("%8.2f ", regReadFloat(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+(i*ISEGVHS_CHANNEL_OFFSET)+ISEGVHS_VOLTAGE_MEASURE));
00171     printf("%8.2f ", regReadFloat(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+(i*ISEGVHS_CHANNEL_OFFSET)+ISEGVHS_VOLTAGE_BOUND));
00172     printf("%8.2f ", regReadFloat(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+(i*ISEGVHS_CHANNEL_OFFSET)+ISEGVHS_VOLTAGE_NOMINAL));
00173     
00174     printf("%8.3f ", 1000.*regReadFloat(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+(i*ISEGVHS_CHANNEL_OFFSET)+ISEGVHS_CURRENT_SET));
00175     printf("%8.3f ", 1000.*regReadFloat(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+(i*ISEGVHS_CHANNEL_OFFSET)+ISEGVHS_CURRENT_MEASURE));
00176     printf("%8.2f ", regReadFloat(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+(i*ISEGVHS_CHANNEL_OFFSET)+ISEGVHS_CURRENT_BOUND));
00177     
00178     printf("0x%04x ", regRead(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+(i*ISEGVHS_CHANNEL_OFFSET)+ISEGVHS_CHANNEL_STATUS));
00179     printf("0x%04x ", regRead(myvme, ISEGVHS_BASE, ISEGVHS_CHANNEL_BASE+(i*ISEGVHS_CHANNEL_OFFSET)+ISEGVHS_CHANNEL_CONTROL));
00180     
00181     printf("\n");
00182   }
00183   // Close VME   
00184   status = mvme_close(myvme);
00185 
00186  return 1;
00187 
00188 }
00189 #endif
00190 
00191 /* emacs
00192  * Local Variables:
00193  * mode:C
00194  * mode:font-lock
00195  * tab-width: 8
00196  * c-basic-offset: 2
00197  * End:
00198  */
00199 
00200 //end

Midas DOC Version 3.0.0 ---- PSI Stefan Ritt ----
Contributions: Pierre-Andre Amaudruz - Sergio Ballestrero - Suzannah Daviel - Doxygen - Peter Green - Qing Gu - Greg Hackman - Gertjan Hofman - Paul Knowles - Exaos Lee - Rudi Meier - Glenn Moloney - Dave Morris - John M O'Donnell - Konstantin Olchanski - Renee Poutissou - Tamsen Schurman - Andreas Suter - Jan M.Wouters - Piotr Adam Zolnierczuk