Subversion Repositories f9daq

Rev

Rev 81 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed



// sudo ./pts -a 0x1000000 -v 1 -w 2 turn LED ON
// sudo ./pts -a 0x1000000 -v 1 -w 1 turn LED OFF
// sudo ./ptsvmusb  -a 0x02501000  -v 2 -i a.bit -b 2
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <ctype.h>

#include <string.h>

#include "vme.h"

#include <cvirte.h>            

#include "PtsModule.h"
#include <userint.h>
#include "PtsModule_CVI.h"
#include <utility.h>
#include <formatio.h>  
static int p1;








int verbose;
uint32_t ptaddr=0;
char str[255];  

int Pts_write(uint32_t addr, uint32_t data ){
int i;
VME_A32D32_W(ptaddr+addr,data);
return 0;
}

int Pts_Mwrite(uint32_t addr, uint32_t data ){
int i;
VME_MW(VME_A32, VME_D32, ptaddr+addr,data);
return 0;
}

int Pts_read(uint32_t addr, uint32_t *data ){
VME_A32D32_R(ptaddr+addr,data);
return 0;
}


int Pts_erase( int verbose ) {
  uint32_t dum;
 
  Pts_write( ADR_CSR1, 0 );
  Delay(0.1);
  Pts_read( ADR_CSR1, &dum);
  if( verbose ) {
    sprintf(str, "CSR1(0x%02x) = 0x%04x\n", ADR_CSR1,dum & 0xffff );
    SetCtrlVal (p1, P1_RESPONSE, str);
  }  
  Pts_write( ADR_CSR1, CSR1_PROGRAM_ );
  Delay(0.1);
  Pts_read( ADR_CSR1, &dum);
  if( verbose ) {
    sprintf( str, "CSR1(0x%02x) = 0x%04x\n", ADR_CSR1, dum & 0xffff );
    SetCtrlVal (p1, P1_RESPONSE, str);
  }  
  return 1;
}

int Pts_configure_bit( const char *filename, int mode, int verbose ) {
  int c,j;
  int dummyword;
  FILE *fp;
  const long byte_per_dot = BYTE_PER_DOT;
  unsigned long nchar = 0;

  if( ( fp = fopen( filename, "rb" ) ) == NULL ) {
    if( verbose ) {
      sprintf( str, "cannot open \"%s\"\n", filename );
    SetCtrlVal (p1, P1_RESPONSE, str);
        }
    return -1;
  }
  if(verbose) sprintf( str, "file \"%s\" opened.\n", filename );
 
  /* ------------------------------------------------------------ *\
    The data for the configuration start from 0xffff_ffff_aa99_aa66
    ( cf. xapp138; we don't know the definition of the BIT file )
  \* ------------------------------------------------------------ */

  dummyword = 0;
  do{
    if( (c = getc( fp )) == EOF ) {
      if(verbose) {
         sprintf(str, "EOF detected. Exit.\n");
         
         SetCtrlVal (p1, P1_RESPONSE, str);
    }
      return -1;
    }
    (c == 0xff) ? dummyword++ : (dummyword=0);
  } while( dummyword < 4 );

  if( mode == SLAVESERIAL_MODE ) {
    if(verbose)  SetCtrlVal(p1,P1_RESPONSE,"slave serial mode");
    Pts_write( ADR_MODE, mode );
    Pts_erase( verbose );
    for( j=0; j<32; j++ ) Pts_write( ADR_CFG, 0x1 );
    while( (c=getc(fp))!=EOF ){
      for( j=0; j<8; j++ ) Pts_write( ADR_CFG, (c>>(7-j))&0x1 );
      nchar++;
      if( verbose && nchar%byte_per_dot==0 ) {
        sprintf( str,"#");
        SetCtrlVal(p1,P1_RESPONSE,str);
      }  
    }
  } else if( mode == SELECTMAP_MODE ) {
    if( verbose )  SetCtrlVal(p1,P1_RESPONSE,"select map mode\n");
    Pts_write( ADR_MODE, SELECTMAP_MODE );
    Pts_erase( verbose );
        VME_MWRST();
    for( j=0; j<4; j++ ) Pts_Mwrite( ADR_CFG, 0xff );
        VME_MWEXEC();
       
    VME_MWRST();
    while( (c=getc(fp))!=EOF ){
      int cc = 0;
      for(j=0; j<8; j++) cc |= ((c&(1<<j))>>j)<<(7-j);
      Pts_Mwrite( ADR_CFG, cc );
      nchar++;
      if( verbose && nchar%byte_per_dot==0 ){
        VME_MWEXEC();
        VME_MWRST();
        sprintf( str,"#");
        SetCtrlVal(p1,P1_RESPONSE,str);
      }  
    }
    VME_MWEXEC();
  } else {
    if(verbose) {
      sprintf(str, "\nIllegal mode\n");
      SetCtrlVal(p1,P1_RESPONSE,str);
    }  
    return -1;
  }
  if(verbose) {
     sprintf(str,"\ntotal %ld bits\n", nchar);
     
      SetCtrlVal(p1,P1_RESPONSE,str);
  }    
  fclose(fp);
  return Pts_check_configure( verbose );
}

int Pts_check_configure( int verbose ) {
  uint32_t csr1_value;
  Pts_read(ADR_CSR1,&csr1_value);
  if(verbose) {
      sprintf( str,"CSR1(0x%02x)=0x%04x\n",ADR_CSR1,csr1_value&0xffff);
   
      SetCtrlVal(p1,P1_RESPONSE,str);
  }    
  if(csr1_value&CSR1_DONE) {
    if(verbose) SetCtrlVal(p1,P1_RESPONSE, "configure complete.\n");
    return 1;
  } else {
    if(verbose)  SetCtrlVal(p1,P1_RESPONSE,"configure not complete.");
    return -1;
  }
}

int Pts_reset( int verbose ) {
  Pts_write(ADR_CSR0,1);
  if( verbose ) {
    sprintf( str, "CSR0(0x%02x) = 0x01\n", ADR_CSR0 );
     SetCtrlVal(p1,P1_RESPONSE,str);
  }  
  return 1;
}

int Pts_write_csr( int verbose, uint32_t value ) {
  Pts_write(ADR_CSR0,value);
  if( verbose ) {
    sprintf( str,"Pts_write_csr 0x%08x\n", value  );
    SetCtrlVal(p1,P1_RESPONSE,str);
  }  
  return 1;
}


void help(char *argv){
 sprintf(str,"Usage: %s -a ptsaddr -v verbose -c  .... Pts_check_configure\n", argv);
 SetCtrlVal(p1,P1_RESPONSE,str);
 sprintf(str,"Usage: %s -a ptsaddr -v verbose -i filename -b mode (2) ... Pts_configure_bit\n", argv);
 SetCtrlVal(p1,P1_RESPONSE,str);
 sprintf(str,"Usage: %s -a ptsaddr -v verbose -e  .... Pts_erase\n", argv);
 SetCtrlVal(p1,P1_RESPONSE,str);
 sprintf(str,"Usage: %s -a ptsaddr -v verbose -x  .... Pts_reset\n", argv);
 SetCtrlVal(p1,P1_RESPONSE,str);
 sprintf(str,"Usage: %s -a ptsaddr -v verbose -c  .... Pts_check_configure\n", argv);
 SetCtrlVal(p1,P1_RESPONSE,str);
 sprintf(str,"Usage: %s -a ptsaddr -v verbose -r  .... vme read\n", argv);
 SetCtrlVal(p1,P1_RESPONSE,str);
 sprintf(str,"Usage: %s -a ptsaddr -v verbose -w value .... vme write\n", argv);
 SetCtrlVal(p1,P1_RESPONSE,str);
 sprintf(str,"Usage: %s -a ptsaddr -v verbose -s value .... Pts_write_csr\n", argv);
 SetCtrlVal(p1,P1_RESPONSE,str);
 sprintf(str,"Example: %s  --address  0x1000000 --verbose 1 --erase\n", argv);
 SetCtrlVal(p1,P1_RESPONSE,str);
 sprintf(str,"Example: %s --address  0x1000000 --verbose 1 --input pts_scaler.bit --load-bit 2\n", argv);
 SetCtrlVal(p1,P1_RESPONSE,str);
 sprintf(str,"Example: %s --address  0x1000004 --write-csr 0x7600\n", argv);SetCtrlVal(p1,P1_RESPONSE,str);
}



int __stdcall WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                       LPSTR lpszCmdLine, int nCmdShow)
{
    char saddr[255];
        if (InitCVIRTE (hInstance, 0, 0) == 0)
                return -1;      /* out of memory */
        if ((p1 = LoadPanel (0, "PtsModule_CVI.uir", P1)) < 0)
                return -1;
        DisplayPanel (p1);
       
        GetCtrlVal(p1,P1_VERBOSE,&verbose);  
        GetCtrlVal(p1,P1_ADDRESS,saddr);
     ptaddr  =  strtoul (saddr,NULL,0);  
        RunUserInterface ();
        DiscardPanel (p1);
        VME_STOP();
        return 0;
}

int CVICALLBACK Reset (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
        switch (event)
                {
                case EVENT_COMMIT:
                        Pts_reset(verbose);
                        break;
                }
        return 0;
}

int CVICALLBACK Erase (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
        switch (event)
                {
                case EVENT_COMMIT:
                         Pts_erase(verbose);  
                        break;
                }
        return 0;
}

int CVICALLBACK Download (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
    char filename[254];
    int mode=0;
        switch (event)
                {
                case EVENT_COMMIT:
                         GetCtrlVal(p1,P1_FIRMWARE,filename);
                         GetCtrlVal(p1,P1_MODE,&mode);
             if(VME_CONNECTED() >=0 ) {
               Pts_configure_bit( filename, mode,  verbose );
                         } else {
                           MessagePopup ("Warning", "Connect VME!!");
                         }  
                        break;
                }
        return 0;
}

int CVICALLBACK Check (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
        switch (event)
                {
                case EVENT_COMMIT:
                         Pts_check_configure( verbose );  
                        break;
                }
        return 0;
}

int CVICALLBACK Read (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
    uint32_t value=0;
    char str[0xFF];
        char saddr[256];
        int offset;
        switch (event)
                {
                case EVENT_COMMIT:
                        GetCtrlVal(p1,P1_OFFSET,saddr);
                        offset = strtoul (saddr,NULL,0);
                        Pts_read( offset , &value );
                        if( verbose ) {
               sprintf(str, "VME Read addr 0x%0x+0x%0x  response 0x%0x\n", ptaddr, offset, value );
               SetCtrlVal (p1, P1_RESPONSE, str);
            }
                        break;
                }
        return 0;
}

int CVICALLBACK Write (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
    int value;
        int offset;
    char svalue[256];
    char saddr[256];
        switch (event)
                {
                case EVENT_COMMIT:
                      GetCtrlVal(p1,P1_DATA,svalue);
                          GetCtrlVal(p1,P1_OFFSET,saddr);  
                         value  = strtoul (svalue,NULL,0);
                         offset = strtoul (saddr,NULL,0);
            Pts_write( offset , value );
                        if( verbose ) {
               sprintf(str, "VME Write addr 0x%0x+0x%0x  data 0x%0x\n", ptaddr, offset, value );
               SetCtrlVal (p1, P1_RESPONSE, str);
            }
                        break;
                }
        return 0;
}

int CVICALLBACK WriteCSR (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
      int value;
    char svalue[256];
        switch (event)
                {
                case EVENT_COMMIT:
                     GetCtrlVal(p1,P1_DATA,svalue);
                         value = strtoul (svalue,NULL,0);
                         Pts_write_csr( verbose, value );
                        break;
                }
        return 0;
}

int CVICALLBACK Verbose (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
    int * data;
        switch (event)
                {
                case EVENT_COMMIT:
                    GetCtrlVal(panel,control,&verbose);
                         
                        break;
                }
        return 0;
}

int CVICALLBACK Help (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
        switch (event)
                {
                case EVENT_COMMIT:
                        help("PtsModule");
                        break;
                }
        return 0;
}

int CVICALLBACK Address (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
   char saddr[100];
        switch (event)
                {
                case EVENT_COMMIT:
                    GetCtrlVal(p1,P1_ADDRESS,saddr);
                        ptaddr  =  strtoul (saddr,NULL,0);  
                        break;
                }
        return 0;
}

int CVICALLBACK Exit (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
        switch (event)
                {
                case EVENT_COMMIT:
                        QuitUserInterface(0);
                        break;
                }
        return 0;
}

int CVICALLBACK FSelect (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
   int status;
   char pathName[MAX_PATHNAME_LEN];
        switch (event)
                {
                case EVENT_COMMIT:
                        status = FileSelectPopup ("", "*.bit", "*.bit", "Select Firmware file",
                                                                          VAL_SELECT_BUTTON, 0, 0, 1, 0, pathName);
                        if (status>0) SetCtrlVal(p1,P1_FIRMWARE,pathName);                                               
                        break;
                }
        return 0;
}

int CVICALLBACK LedCB (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
        switch (event)
                {
                int value=0;
                case EVENT_COMMIT:
                        GetCtrlVal(p1,P1_LED,&value);
                         
            Pts_write( 0 , value+1 );
                       
                        break;
                }
        return 0;
}

int CVICALLBACK Execute (int panel, int control, int event,
                void *callbackData, int eventData1, int eventData2)
{
        switch (event)
        {
                case EVENT_COMMIT:{
                    int n,i,nb;
                        char buf[400];
                        unsigned int data, addr;
                        char sdata[255], saddr[255], rw[255];
                        GetNumTextBoxLines(panel, P1_COMMANDS,&n);
                        for (i=0;i<n;i++){
                      GetTextBoxLine(panel, P1_COMMANDS, i, buf);
                      nb = sscanf(buf,"%s%s%s",rw, saddr,sdata);
                      addr  =   strtoul (saddr,NULL,0);
                          data  =   strtoul (sdata,NULL,0);    
              if (strstr(rw,"W")!=NULL){
                             Pts_write( addr , data );
                                 if( verbose ) {
                   sprintf(str, "VME Write addr 0x%0x+0x%0x  data 0x%0x\n", ptaddr, addr, data );
                   SetCtrlVal (p1, P1_RESPONSE, str);
                 }
                          } else {
                            Pts_read( addr , &data );
                            if( verbose ) {
                  sprintf(str, "VME Read addr 0x%0x+0x%0x  response 0x%0x\n", ptaddr,  addr, data);
                  SetCtrlVal (p1, P1_RESPONSE, str);
                }
                          }
                        }  
                        break;
                                                  }
        }
        return 0;
}

int CVICALLBACK Connect (int panel, int control, int event,
                                                 void *callbackData, int eventData1, int eventData2)
{
        int interface = 0;
        switch (event)
        {
               
                case EVENT_COMMIT:
                        GetCtrlVal (p1, P1_VMEINTERFACE, &interface);
                VME_START(interface);  
                        break;
        }
        return 0;
}

int CVICALLBACK Disconnect (int panel, int control, int event,
                                                        void *callbackData, int eventData1, int eventData2)
{
        switch (event)
        {
                case EVENT_COMMIT:
                        VME_STOP();
                        break;
        }
        return 0;
}