00001
00002
00010
00011
00012
00014
00016 #include <memory.h>
00017 #include <string.h>
00018
00019 #include "cvt_board_commons.h"
00020
00022
00024
00026
00028
00030
00032
00034
00036 UINT8 cvt_ror_bits( UINT8 data, int num_bits)
00037 {
00038 while( num_bits--)
00039 {
00040 data= ( data& 0x01)? (data>> 1)|0x80: (data>> 1);
00041 }
00042 return data;
00043 }
00044
00046
00048 UINT8 cvt_swap_bits( UINT8 data)
00049 {
00050 UINT8 tmp= 0x00;
00051 UINT8 msk_l, msk_r;
00052 for( msk_l= 0x80, msk_r= 0x01; msk_l; msk_l>>= 1, msk_r<<= 1)
00053 {
00054 tmp|= (data& msk_l)? msk_r: 0x00;
00055 }
00056 return tmp;
00057 }
00058
00060
00062 void cvt_delay(int msec)
00063 {
00064 #ifdef LINUX
00065 usleep( msec* 1000);
00066 #else
00067 Sleep( msec);
00068 #endif
00069 }
00070
00072
00074
00075 #ifdef WIN32
00076
00077
00078
00079
00080
00081
00082
00083
00084 BOOL WINAPI DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
00085 {
00086 static int m_num_instances= 0;
00087
00088 switch (ul_reason_for_call) {
00089 case DLL_PROCESS_ATTACH:
00090 {
00091 if( !m_num_instances)
00092 {
00093 }
00094
00095 ++m_num_instances;
00096 }
00097 break;
00098 case DLL_PROCESS_DETACH:
00099 --m_num_instances;
00100 break;
00101 case DLL_THREAD_ATTACH:
00102 case DLL_THREAD_DETACH:
00103 break;
00104 }
00105 return TRUE;
00106 }
00107
00108 #else //Linux
00109
00110
00111
00112
00113
00114
00115
00116
00117 void _init( void )
00118 {
00119 }
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 void _fini( void )
00130 {
00131 }
00132
00133 #endif // WIN32
00134
00136
00137
00138
00140
00142
00144 BOOL cvt_board_open( cvt_board_data* p_data, UINT16 base_address, long vme_handle, const cvt_reg_table *p_reg_table)
00145 {
00146 memset( p_data, 0, sizeof( cvt_board_data));
00147
00148
00149 p_data->m_base_address= base_address;
00150 p_data->m_vme_handle= vme_handle;
00151 p_data->m_p_reg_table= p_reg_table;
00152
00153 return TRUE;
00154 }
00156
00158 BOOL cvt_board_close( cvt_board_data* p_data)
00159 {
00160 return TRUE;
00161 }
00162
00164
00165
00166
00168
00170
00172 BOOL cvt_write( cvt_board_data* p_data, UINT16 address, const void* p_value, CVAddressModifier am, CVDataWidth data_size)
00173 {
00174 CVErrorCodes err_code;
00175 if( ( err_code= CAENVME_WriteCycle( p_data->m_vme_handle, (((UINT32)p_data->m_base_address)<< 16)| address, (void*)p_value, am, data_size))!= cvSuccess)
00176 {
00177 TRACE( "CAENVME_WriteCycle: ");
00178 TRACE( CAENVME_DecodeError( err_code));
00179 TRACE( "\n");
00180 return FALSE;
00181 }
00182 return TRUE;
00183 }
00184
00186
00188 BOOL cvt_read( cvt_board_data* p_data, UINT16 address, void* p_value, CVAddressModifier am, CVDataWidth data_size)
00189 {
00190 CVErrorCodes err_code;
00191 if( ( err_code= CAENVME_ReadCycle( p_data->m_vme_handle, (((UINT32)p_data->m_base_address)<< 16)| address, (void*)p_value, am, data_size))!= cvSuccess)
00192 {
00193 TRACE( "CAENVME_ReadCycle: ");
00194 TRACE( CAENVME_DecodeError( err_code));
00195 TRACE( "\n");
00196 return FALSE;
00197 }
00198 return TRUE;
00199 }
00200
00202
00204 BOOL cvt_set_bitmask( cvt_board_data* p_data, UINT16 address, void *p_value, CVAddressModifier am, CVDataWidth data_size)
00205 {
00206 switch( data_size)
00207 {
00208 case cvD8:
00209 {
00210 UINT8 reg_value= 0;
00211 if( !cvt_read( p_data, address, ®_value, am, data_size))
00212 return FALSE;
00213 reg_value|= *(UINT8*)p_value;
00214 if( !cvt_write( p_data, address, ®_value, am, data_size))
00215 return FALSE;
00216 }
00217 break;
00218 case cvD16:
00219 case cvD16_swapped:
00220 {
00221 UINT16 reg_value= 0;
00222 if( !cvt_read( p_data, address, ®_value, am, data_size))
00223 return FALSE;
00224 reg_value|= *(UINT16*)p_value;
00225 if( !cvt_write( p_data, address, ®_value, am, data_size))
00226 return FALSE;
00227 }
00228 break;
00229 case cvD32:
00230 case cvD32_swapped:
00231 {
00232 UINT32 reg_value= 0;
00233 if( !cvt_read( p_data, address, ®_value, am, data_size))
00234 return FALSE;
00235 reg_value|= *(UINT32*)p_value;
00236 if( !cvt_write( p_data, address, ®_value, am, data_size))
00237 return FALSE;
00238 }
00239 break;
00240 default:
00241 return FALSE;
00242 }
00243
00244 return TRUE;
00245 }
00246
00248
00250 BOOL cvt_clear_bitmask( cvt_board_data* p_data, UINT16 address, void* p_value, CVAddressModifier am, CVDataWidth data_size)
00251 {
00252 switch( data_size)
00253 {
00254 case cvD8:
00255 {
00256 UINT8 reg_value= 0;
00257 if( !cvt_read( p_data, address, ®_value, am, data_size))
00258 return FALSE;
00259 reg_value&= ~*(UINT8*)p_value;
00260 if( !cvt_write( p_data, address, ®_value, am, data_size))
00261 return FALSE;
00262 }
00263 break;
00264 case cvD16:
00265 case cvD16_swapped:
00266 {
00267 UINT16 reg_value= 0;
00268 if( !cvt_read( p_data, address, ®_value, am, data_size))
00269 return FALSE;
00270 reg_value&= ~*(UINT16*)p_value;
00271 if( !cvt_write( p_data, address, ®_value, am, data_size))
00272 return FALSE;
00273 }
00274 break;
00275 case cvD32:
00276 case cvD32_swapped:
00277 {
00278 UINT32 reg_value= 0;
00279 if( !cvt_read( p_data, address, ®_value, am, data_size))
00280 return FALSE;
00281 reg_value&= ~*(UINT32*)p_value;
00282 if( !cvt_write( p_data, address, ®_value, am, data_size))
00283 return FALSE;
00284 }
00285 break;
00286 default:
00287 return FALSE;
00288 }
00289
00290 return TRUE;
00291 }
00292
00294
00296 BOOL cvt_FIFO_BLT_read( cvt_board_data* p_data, UINT16 address, void* p_buffer, UINT32 buffer_size, UINT32 *p_read_bytes, CVAddressModifier am, CVDataWidth data_size, BOOL *p_is_berr)
00297 {
00298 CVErrorCodes err_code= CAENVME_FIFOBLTReadCycle( p_data->m_vme_handle, (((UINT32)p_data->m_base_address)<< 16)| address, (void*)p_buffer, buffer_size, am, data_size, p_read_bytes);
00299 *p_is_berr= FALSE;
00300 switch( err_code)
00301 {
00302 case cvBusError:
00303 *p_is_berr= TRUE;
00304 case cvSuccess:
00305 break;
00306 default:
00307 TRACE( "CAENVME_FIFOBLTReadCycle: ");
00308 TRACE( CAENVME_DecodeError( err_code));
00309 TRACE( "\n");
00310 return FALSE;
00311 }
00312 return TRUE;
00313 }
00314
00316
00318 BOOL cvt_write_reg( cvt_board_data* p_data, UINT16 reg_index, const void* p_value)
00319 {
00320 return cvt_write( p_data, p_data->m_p_reg_table[ reg_index].m_address, p_value, p_data->m_p_reg_table[ reg_index].m_am, p_data->m_p_reg_table[ reg_index].m_data_size);
00321 }
00322
00324
00326 BOOL cvt_read_reg( cvt_board_data* p_data, UINT16 reg_index, void* p_value)
00327 {
00328 return cvt_read( p_data, p_data->m_p_reg_table[ reg_index].m_address, p_value, p_data->m_p_reg_table[ reg_index].m_am, p_data->m_p_reg_table[ reg_index].m_data_size);
00329 }
00330
00332
00334 BOOL cvt_set_bitmask_reg( cvt_board_data* p_data, UINT16 reg_index, void *p_value)
00335 {
00336 return cvt_set_bitmask( p_data, p_data->m_p_reg_table[ reg_index].m_address, p_value, p_data->m_p_reg_table[ reg_index].m_am, p_data->m_p_reg_table[ reg_index].m_data_size);
00337 }
00338
00340
00342 BOOL cvt_clear_bitmask_reg( cvt_board_data* p_data, UINT16 reg_index, void* p_value)
00343 {
00344 return cvt_clear_bitmask( p_data, p_data->m_p_reg_table[ reg_index].m_address, p_value, p_data->m_p_reg_table[ reg_index].m_am, p_data->m_p_reg_table[ reg_index].m_data_size);
00345 }
00346
00348
00350 BOOL cvt_FIFO_BLT_read_reg( cvt_board_data* p_data, UINT16 reg_index, void* p_buffer, UINT32 buffer_size, UINT32 *p_read_bytes, BOOL *p_is_berr)
00351 {
00352 return cvt_FIFO_BLT_read( p_data, p_data->m_p_reg_table[ reg_index].m_address, p_buffer, buffer_size, p_read_bytes, p_data->m_p_reg_table[ reg_index].m_am, p_data->m_p_reg_table[ reg_index].m_data_size, p_is_berr);
00353 }
00354
00356
00357
00358
00360
00362
00364 BOOL cvt_set_MCST_CBLT( UINT8 address, cvt_board_data** board_array, UINT16 board_array_len)
00365 {
00366 MCST_CBLT_board_pos pos= MCST_CBLT_board_pos_last;
00367 while( board_array_len--)
00368 {
00369 if( !board_array[ board_array_len]->set_MCST_CBLT)
00370 {
00371 TRACE1("cvt_set_MCST_CBLT: no set_MCST_CBLT method setted for board 0x%8p\n", board_array[ board_array_len]);
00372 return FALSE;
00373 }
00374 if( !(board_array[ board_array_len]->set_MCST_CBLT)( board_array[ board_array_len], address, pos))
00375 {
00376 TRACE1("cvt_set_MCST_CBLT: set_MCST_CBLT method failure for board 0x%8p\n", board_array[ board_array_len]);
00377 return FALSE;
00378 }
00379 pos= ( board_array_len- 1)? MCST_CBLT_board_pos_mid: MCST_CBLT_board_pos_first;
00380 }
00381 return TRUE;
00382 }
00384
00385
00386
00388
00390
00392 const char* cvt_SW_rev( void)
00393 {
00394 return "CAENVMETool Rev. 1.2";
00395 }