divers/lrs1190.c

Go to the documentation of this file.
00001 /*-----------------------------------------------------------------------------
00002  * Copyright (c) 1996      TRIUMF Data Acquistion Group
00003  * Please leave this header in any reproduction of that distribution
00004  * 
00005  * TRIUMF Data Acquisition Group, 4004 Wesbrook Mall, Vancouver, B.C. V6T 2A3
00006  * Email: online@triumf.ca           Tel: (604) 222-1047  Fax: (604) 222-1074
00007  *         amaudruz@triumf.ca
00008  * ----------------------------------------------------------------------------
00009  *  
00010  * Description  : VME Macros and functions for the LRS1190 Dual port buffer
00011  *                Display result on the VME console screen.
00012  *                No reference to Midas.
00013  *
00014  * Application : VME + Vxworks
00015  *
00016  * Author:  Pierre-Andre Amaudruz Data Acquisition Group
00017  * 
00018 
00019   $Id: lrs1190.c 2753 2005-10-07 14:55:31Z ritt $
00020 
00021 
00022  * Revision 1.0  1996/ Pierre    Initial revision
00023  * Revision 1.1  1998/ Pierre    Split include for specific hardware.
00024  * ---------------------------------------------------------------------------- */
00025 /*------------------------------------------------------------------------------------*/
00026 #include <stdio.h>
00027 
00028 #if defined( _MSC_VER )
00029 #define INLINE __inline
00030 #elif defined(__GNUC__)
00031 #define INLINE __inline__
00032 #else
00033 #define INLINE
00034 #endif
00035 
00036 #define EXTERNAL extern
00037 
00038 #ifndef MIDAS_TYPE_DEFINED
00039 #define MIDAS_TYPE_DEFINED
00040 
00041 typedef short int INT;
00042 typedef unsigned short int WORD;
00043 
00044 #ifdef __alpha
00045 typedef unsigned int DWORD;
00046 #else
00047 typedef unsigned long int DWORD;
00048 #endif
00049 
00050 #endif                          /* MIDAS_TYPE_DEFINED */
00051 
00052 #ifdef PPCxxx
00053 #define A32D24_1190            0xfa000000       /* A32D24_1151 access */
00054 #else
00055 #define A32D24_1190            0xf0000000       /* A32D24_1151 access */
00056 #endif
00057 
00058 /*-Macros--------------------------------------------------------*/
00059 /*-command-------------------------------------------------------*/
00060 #define LRS1190_ENABLE(_vmebase){\
00061                                     {\
00062                                        volatile DWORD _ll, _local;\
00063                                        _ll = _vmebase;\
00064                                        _local = ((_ll) | 0x8002) | A32D24_1190;\
00065                                        *(WORD *)_local = 0x1;\
00066                                    }\
00067                                 }
00068 
00069 /*-command-------------------------------------------------------*/
00070 #define LRS1190_DISABLE(_vmebase){\
00071                                     {\
00072                                        volatile DWORD _ll, _local;\
00073                                       _ll = _vmebase;\
00074                                        _local = ((_ll) | 0x8002) | A32D24_1190;\
00075                                        *(WORD *)_local = 0x0;\
00076                                    }\
00077                                 }
00078 
00079 /*-command-------------------------------------------------------*/
00080 #define LRS1190_RESET(_vmebase){\
00081                                    {\
00082                                       volatile DWORD _ll, _dummy, _local;\
00083                                       _ll = _vmebase;\
00084                                       _local = (_ll) | A32D24_1190;\
00085                                       _dummy = *(WORD *) _local;\
00086                                   }\
00087                                }
00088 
00089 /*-command-------------------------------------------------------*/
00090 #define LRS1190_COUNT(_vmebase, _d){\
00091                                         {\
00092                                          volatile DWORD _ll, *_pcount;\
00093                                          _ll = _vmebase;\
00094                                          _pcount = (DWORD *) (((_ll) | 0x8000) | A32D24_1190);\
00095                                          *((WORD *) _d) = *(WORD *) _pcount;\
00096                                        }\
00097                                     }
00098 
00099 
00100 /*-input---------------------------------------------------------*/
00101 #define LRS1190_READI4(_vmebase,_d,_r){\
00102                                         {\
00103                                          volatile DWORD _ll, *_local, __r, _count;\
00104                                          DWORD *_pcount;\
00105                                          __r = _r;\
00106                                          _ll = _vmebase;\
00107                                          _pcount = (DWORD *) (((_ll) | 0x8000) | A32D24_1190);\
00108                                          _count = *(WORD *) _pcount;\
00109                                          if (_count <= __r)\
00110                                            __r = _count;\
00111                                          _local = (DWORD *)((_ll)  | A32D24_1190);\
00112                                          while (__r > 0) {\
00113                                                 *_d++ = *_local++;\
00114                                                 __r--;}\
00115                                          }\
00116                                       }
00117 
00118 /*-input---------------------------------------------------------*/
00119 #define LRS1190_READL2(_vmebase,_d,_r){\
00120                                         {\
00121                                          volatile DWORD _ll, *_pcount, *_local, __r, _count;\
00122                                          __r = _r;\
00123                                          _ll = _vmebase;\
00124                                          _pcount = (DWORD *) (((_ll) | 0x8000) | A32D24_1190);\
00125                                          _count = *(WORD *) _pcount;\
00126                                          if (_count <= __r)\
00127                                            __r = _count;\
00128                                          _local = (DWORD *)((_ll)  | A32D24_1190);\
00129                                          while (__r > 0) {\
00130                                                 *(WORD *) _d = *(WORD *)_local;\
00131                                                 ((WORD *)_d)++;\
00132                                                 (_local)++;\
00133                                                 __r--;}\
00134                                          }\
00135                                       }
00136 
00137 /*-input---------------------------------------------------------*/
00138 #define LRS1190_READH2(_vmebase,_d,_r){\
00139                                         {\
00140                                          volatile DWORD _ll, *_pcount, *_local, _count, __r;\
00141                                          __r = _r;\
00142                                          _ll = _vmebase;\
00143                                          _pcount = (DWORD *) (((_ll) | 0x8000) | A32D24_1190);\
00144                                          _count = *(WORD *) _pcount;\
00145                                          if (_count <= __r)\
00146                                            __r = _count;\
00147                                          _local = (DWORD *)((_ll)  | A32D24_1190);\
00148                                          while (__r > 0) {\
00149                                                 *(WORD *) _d = *(++((WORD *)_local));\
00150                                                 ((WORD *)_d)++;\
00151                                                 ((WORD *)_local)++;\
00152                                                 __r--;}\
00153                                          }\
00154                                       }
00155 
00156 /*-input---------------------------------------------------------*/
00157 #define LRS_1190_READL2_TONY(_vmebase,_d,_r){\
00158                                         {\
00159                                          volatile DWORD _ll, *_pcount, *_local, __r, _count;\
00160                                          __r = _r;\
00161                                          _ll = _vmebase;\
00162                                          _pcount = (DWORD *) (((_ll) | 0x8000) | A32D24_1190);\
00163                                          _count = *(WORD *) _pcount;\
00164                                          if (_count <= __r)\
00165                                            __r = _count;\
00166                                          _local = (DWORD *)((_ll)  | A32D24_1190);\
00167                                          *(WORD *) _d = __r;\
00168                                          ((WORD *)_d)++;\
00169                                          while (__r > 0) {\
00170                                                 *(WORD *) _d = *(WORD *)_local;\
00171                                                 ((WORD *)_d)++;\
00172                                                 (_local)++;\
00173                                                 __r--;}\
00174                                          }\
00175                                       }
00176 /*---------------------------------------------------------------*/
00177 
00178 /*-Functions-----------------------------------------------------*/
00179 INLINE void lrs1190_enable(DWORD vmeBase)
00180 {
00181    volatile DWORD local;
00182 
00183    local = ((vmeBase) | 0x8002) | A32D24_1190;
00184    *(WORD *) local = 0x1;
00185 }
00186 
00187 /*-Functions-----------------------------------------------------*/
00188 INLINE void lrs1190_disable(DWORD vmeBase)
00189 {
00190    volatile DWORD local;
00191 
00192    local = ((vmeBase) | 0x8002) | A32D24_1190;
00193    *(WORD *) local = 0x0;
00194 }
00195 
00196 /*-Functions-----------------------------------------------------*/
00197 INLINE void lrs1190_reset(DWORD vmeBase)
00198 {
00199    volatile DWORD local, dummy;
00200 
00201    local = vmeBase | A32D24_1190;
00202    dummy = *(WORD *) local;
00203 }
00204 
00205 /*-Functions-----------------------------------------------------*/
00206 INLINE void lrs1190_count(DWORD vmeBase, INT * count)
00207 {
00208    volatile DWORD local;
00209 
00210    local = (vmeBase | 0x8000 | A32D24_1190);
00211    *count = *(WORD *) local;
00212 }
00213 
00214 /*-input---------------------------------------------------------*/
00215 INLINE void lrs1190_readi4(DWORD vmeBase, DWORD ** d, INT r)
00216 {
00217    volatile DWORD local, count;
00218 
00219    local = (vmeBase | 0x8000 | A32D24_1190);
00220    count = *(WORD *) local;
00221    if ((int) count <= r)
00222       r = count;
00223    local = vmeBase | A32D24_1190;
00224    while (r > 0) {
00225       *((*d)++) = *((DWORD *) local);
00226       ((DWORD *) local)++;
00227       r--;
00228    }
00229 }
00230 
00231 /*-input---------------------------------------------------------*/
00232 INLINE void lrs1190_readl2(DWORD vmeBase, WORD ** d, INT r)
00233 {
00234    volatile DWORD local, count;
00235 
00236    local = (vmeBase | 0x8000 | A32D24_1190);
00237    count = *(WORD *) local;
00238    if ((int) count <= r)
00239       r = count;
00240    local = vmeBase | A32D24_1190;
00241    while (r > 0) {
00242       *((*d)++) = *((WORD *) local);
00243       ((DWORD *) local)++;
00244       r--;
00245    }
00246 }
00247 
00248 /*-input---------------------------------------------------------*/
00249 INLINE void lrs1190_readh2(DWORD vmeBase, WORD ** d, INT r)
00250 {
00251    volatile DWORD local, count;
00252 
00253    local = (vmeBase | 0x8000 | A32D24_1190);
00254    count = *(WORD *) local;
00255    if ((int) count <= r)
00256       r = count;
00257    local = vmeBase | A32D24_1190;
00258    while (r > 0) {
00259       *((*d)++) = *(++((WORD *) local));
00260       ((WORD *) local)++;
00261       r--;
00262    }
00263 }
00264 
00265 /*-input---------------------------------------------------------*/
00266 INLINE void lrs1190_readl2z(DWORD vmeBase, WORD ** d, INT r)
00267 {
00268    volatile DWORD *local, count;
00269 
00270    local = (DWORD *) (vmeBase | 0x8000 | A32D24_1190);
00271    count = *(WORD *) local;
00272    if ((int) count <= r)
00273       r = count;
00274    local = (DWORD *) (vmeBase | A32D24_1190);
00275 
00276    *((*d)++) = r;
00277    while (r > 0) {
00278       *((*d)++) = *((WORD *) local);
00279       (local)++;
00280       r--;
00281    }
00282 }
00283 
00284 /*-Tests---------------------------------------------------------*/
00285 void lrs1190(void)
00286 {
00287    printf("\n---> LRS 1190 Dual port memory buffer (lrs1190.c) <---\n");
00288    printf("Macro  : LRS1190_ENABLE (DWORD vmeBase);\n");
00289    printf("Macro  : LRS1190_DISABLE (DWORD vmeBase);\n");
00290    printf("Macro  : LRS1190_CLEAR (DWORD vmeBase);\n");
00291    printf("Macro  : LRS1190_COUNT (DWORD vmeBase, int * count);\n");
00292    printf("Macro  : LRS1190_READI4 (DWORD vmeBase, DWORD *d , int repeat);\n");
00293    printf("Macro  : LRS1190_READL2 (DWORD vmeBase, WORD *d , int repeat);\n");
00294    printf("Macro  : LRS1190_READH2 (DWORD vmeBase, WORD *d , int repeat);\n");
00295    printf("Macro  : LRS1190_READL2_TONY (DWORD vmeBase, DWORD *d , int repeat);\n");
00296    printf("Inline : lrs1190_enable (DWORD vmeBase);\n");
00297    printf("Inline : lrs1190_disable (DWORD vmeBase);\n");
00298    printf("Inline : lrs1190_clear (DWORD vmeBase);\n");
00299    printf("Inline : lrs1190_count (DWORD vmeBase, int * count);\n");
00300    printf("Inline : lrs1190_readi4 (DWORD vmeBase, DWORD *d , int repeat);\n");
00301    printf("Inline : lrs1190_readl2 (DWORD vmeBase, DWORD *d , int repeat);\n");
00302    printf("Inline : lrs1190_readh2 (DWORD vmeBase, DWORD *d , int repeat);\n");
00303    printf("Inline : lrs1190_readl2_tony (DWORD vmeBase, DWORD *d , int repeat);\n");
00304    printf("Test : ena1190  (0x7f0000)         <--- enable  VME buffer\n");
00305    printf("Test : dis1190  (0x7f0000)         <--- disable VME buffer\n");
00306    printf("Test : res1190  (0x7f0000)         <--- reset   VME buffer\n");
00307    printf("Test : cn1190   (0x7f0000)         <--- read    WORD count register\n");
00308    printf("Test : rd1190   (0x7f0000)         <--- read             VME buffer\n");
00309    printf("Test : rd1190l  (0x7f0000)         <--- read low  WORD   VME buffer\n");
00310    printf("Test : rd1190h  (0x7f0000)         <--- read high WORD   VME buffer\n");
00311 }
00312 
00313 void ena1190(DWORD vmeBase)
00314 {
00315    lrs1190_enable(vmeBase);
00316 }
00317 
00318 void dis1190(DWORD vmeBase)
00319 {
00320    lrs1190_disable(vmeBase);
00321 }
00322 
00323 void res1190(DWORD vmeBase)
00324 {
00325    lrs1190_reset(vmeBase);
00326 }
00327 
00328 void cn1190(DWORD vmeBase)
00329 {
00330    INT count;
00331    lrs1190_count(vmeBase, &count);
00332    printf("Inline counter %i\n", count);
00333    LRS1190_COUNT(vmeBase, &count);
00334    printf("Macro  counter %i\n", count);
00335 }
00336 
00337 void rd1190l(DWORD vmeBase, DWORD r)
00338 {
00339    DWORD dd[1024], *pdd;
00340    INT i, buf_counter;
00341 
00342    for (i = 0; i < 1024; i++)
00343       dd[i] = 0;
00344    pdd = &dd[0];
00345    lrs1190_disable(vmeBase);
00346    lrs1190_count(vmeBase, &buf_counter);
00347    printf("counter %i\n", buf_counter);
00348    lrs1190_readl2(vmeBase, (WORD **) & pdd, r);
00349    lrs1190_enable(vmeBase);
00350    for (i = 0; i < buf_counter; i++)
00351       printf("%i-> %8.8x\n", i, dd[i]);
00352 }
00353 
00354 void rd1190h(DWORD vmeBase, DWORD r)
00355 {
00356    DWORD dd[1024], *pdd;
00357    INT i, buf_counter;
00358 
00359    for (i = 0; i < 1024; i++)
00360       dd[i] = 0;
00361    pdd = &dd[0];
00362    lrs1190_disable(vmeBase);
00363    lrs1190_count(vmeBase, &buf_counter);
00364    printf("counter %i\n", buf_counter);
00365    lrs1190_readh2(vmeBase, (WORD **) & pdd, r);
00366    lrs1190_enable(vmeBase);
00367    for (i = 0; i < buf_counter; i++)
00368       printf("%i-> %8.8x\n", i, dd[i]);
00369 }
00370 
00371 void rd1190(DWORD vmeBase, DWORD r)
00372 {
00373    DWORD dd[1024], *pdd;
00374    INT i, buf_counter;
00375 
00376    for (i = 0; i < 1024; i++)
00377       dd[i] = 0;
00378    pdd = &dd[0];
00379    lrs1190_disable(vmeBase);
00380    lrs1190_count(vmeBase, &buf_counter);
00381    printf("counter %i\n", buf_counter);
00382    lrs1190_readi4(vmeBase, &pdd, r);
00383    lrs1190_enable(vmeBase);
00384    for (i = 0; i < buf_counter; i++)
00385       printf("%i-> %8.8x\n", i, dd[i]);
00386 }

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