Changeset 1352
- Timestamp:
- 01/22/10 20:27:19 (14 years ago)
- Location:
- branches/smartreader
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/smartreader/csctapi/ct_slot.c
r1336 r1352 74 74 if (reader[ridx].typ == R_SMART) { 75 75 dev_index=atoi((const char *)reader[ridx].device); 76 if(!SR_Init( dev_index))76 if(!SR_Init(&reader[ridx],dev_index)) 77 77 return ERR_TRANS; 78 78 } -
branches/smartreader/csctapi/icc_async.c
r1336 r1352 118 118 #if defined(HAVE_LIBUSB) && defined(USE_PTHREAD) 119 119 if(reader[ridx].typ == R_SMART) { 120 if (!SR_GetStatus(& in))120 if (!SR_GetStatus(&reader[ridx],&in)) 121 121 return ICC_ASYNC_IFD_ERROR; 122 122 } … … 192 192 #if defined(HAVE_LIBUSB) && defined(USE_PTHREAD) 193 193 if (reader[ridx].typ == R_SMART) { 194 if (!SR_Reset(& (atr))) {194 if (!SR_Reset(&reader[ridx],&(atr))) { 195 195 atr = NULL; 196 196 return ICC_ASYNC_IFD_ERROR; … … 265 265 #if defined(HAVE_LIBUSB) && defined(USE_PTHREAD) 266 266 if (reader[ridx].typ == R_SMART) { 267 sr_config.inv= (convention == ATR_CONVENTION_INVERSE) ? 1: 0;267 reader[ridx].sr_config.inv= (convention == ATR_CONVENTION_INVERSE) ? 1: 0; 268 268 } 269 269 else … … 349 349 #if defined(HAVE_LIBUSB) && defined(USE_PTHREAD) 350 350 if (reader[ridx].typ == R_SMART) { 351 if (!SR_Transmit( sent, size))351 if (!SR_Transmit(&reader[ridx], sent, size)) 352 352 return ICC_ASYNC_IFD_ERROR; 353 353 } … … 378 378 #if defined(HAVE_LIBUSB) && defined(USE_PTHREAD) 379 379 if (reader[ridx].typ == R_SMART) { 380 if (!SR_Receive( data, size))380 if (!SR_Receive(&reader[ridx], data, size)) 381 381 return ICC_ASYNC_IFD_ERROR; 382 382 } -
branches/smartreader/csctapi/ifd_smartreader.c
r1349 r1352 13 13 #define ERROR 0 14 14 15 int SR_Init ( int device_index)15 int SR_Init (struct s_reader *reader, int device_index) 16 16 { 17 17 18 18 int ret; 19 smartreader_usb_dev=NULL;20 if(!( smartreader_usb_dev=find_smartreader(device_index, &ftdic)))19 reader->smartreader_usb_dev=NULL; 20 if(!(reader->smartreader_usb_dev=find_smartreader(device_index, &reader->ftdic))) 21 21 return ERROR; 22 22 //The smartreader has different endpoint addresses … … 24 24 //also a good way to compare a real FT232 with a smartreader 25 25 //if you enumarate usb devices 26 ftdic.in_ep = 0x1;27 ftdic.out_ep = 0x82;26 reader->ftdic.in_ep = 0x1; 27 reader->ftdic.out_ep = 0x82; 28 28 29 29 30 30 //open the smartreader device if found by find_smartreader 31 if ((ret = ftdi_usb_open_dev(& ftdic,smartreader_usb_dev)) < 0) {32 cs_log("unable to open ftdi device: %d (%s)", ret, ftdi_get_error_string(& ftdic));31 if ((ret = ftdi_usb_open_dev(&reader->ftdic,reader->smartreader_usb_dev)) < 0) { 32 cs_log("unable to open ftdi device: %d (%s)", ret, ftdi_get_error_string(&reader->ftdic)); 33 33 return ERROR; 34 34 } … … 38 38 #endif 39 39 //Set the FTDI latency timer to 1ms 40 ret = ftdi_set_latency_timer(& ftdic, 1);40 ret = ftdi_set_latency_timer(&reader->ftdic, 1); 41 41 42 42 //Set databits to 8o2 43 ret = ftdi_set_line_property(& ftdic, BITS_8, STOP_BIT_2, ODD);43 ret = ftdi_set_line_property(&reader->ftdic, BITS_8, STOP_BIT_2, ODD); 44 44 45 45 //Set the DTR HIGH and RTS LOW 46 ftdi_setdtr_rts(& ftdic, 1, 1);46 ftdi_setdtr_rts(&reader->ftdic, 1, 1); 47 47 48 48 //Disable flow control 49 ftdi_setflowctrl(& ftdic, 0);49 ftdi_setflowctrl(&reader->ftdic, 0); 50 50 51 51 // star the reading thread 52 g_read_buffer_size = 0;53 modem_status = 0 ;54 pthread_mutex_init(& g_read_mutex,NULL);55 pthread_mutex_init(& g_usb_mutex,NULL);56 ret = pthread_create(&r t, NULL, ReaderThread, (void *)&ftdic);52 reader->g_read_buffer_size = 0; 53 reader->modem_status = 0 ; 54 pthread_mutex_init(&reader->g_read_mutex,NULL); 55 pthread_mutex_init(&reader->g_usb_mutex,NULL); 56 ret = pthread_create(&reader->rt, NULL, ReaderThread, (void *)(reader)); 57 57 if (ret) { 58 58 cs_log("ERROR; return code from pthread_create() is %d", ret); … … 64 64 65 65 66 int SR_GetStatus ( int * in)66 int SR_GetStatus (struct s_reader *reader, int * in) 67 67 { 68 68 int state; 69 69 70 pthread_mutex_lock(& g_read_mutex);71 state =( modem_status & 0x80) == 0x80 ? 0 : 2;72 pthread_mutex_unlock(& g_read_mutex);70 pthread_mutex_lock(&reader->g_read_mutex); 71 state =(reader->modem_status & 0x80) == 0x80 ? 0 : 2; 72 pthread_mutex_unlock(&reader->g_read_mutex); 73 73 74 74 … … 81 81 } 82 82 83 int SR_Reset ( ATR ** atr)84 { 85 unsigned char data[ATR_MAX_SIZE ] = {0};83 int SR_Reset (struct s_reader *reader, ATR ** atr) 84 { 85 unsigned char data[ATR_MAX_SIZE*2]; 86 86 int ret; 87 87 88 memset(data,0,sizeof(data)); 88 89 //Reset smartreader to defaults 89 ResetSmartReader( &ftdic);90 ResetSmartReader(reader); 90 91 91 92 //Reset smartcard 92 pthread_mutex_lock(& g_usb_mutex);93 ftdi_setdtr_rts(& ftdic, 1, 1);93 pthread_mutex_lock(&reader->g_usb_mutex); 94 ftdi_setdtr_rts(&reader->ftdic, 1, 1); 94 95 usleep(200000); 95 ftdi_setdtr_rts(& ftdic, 1, 0);96 pthread_mutex_unlock(& g_usb_mutex);96 ftdi_setdtr_rts(&reader->ftdic, 1, 0); 97 pthread_mutex_unlock(&reader->g_usb_mutex); 97 98 usleep(2000); 98 99 sched_yield(); 99 100 100 101 //Read the ATR 101 ret = smart_read( data, ATR_MAX_SIZE,1);102 ret = smart_read(reader,data, ATR_MAX_SIZE,1); 102 103 #ifdef DEBUG_IO 103 104 cs_log("IO:SR: get ATR ret = %d" , ret); … … 108 109 109 110 if(data[0]==0x03) { 110 sr_config.inv=1;111 EnableSmartReader( &ftdic, 3571200, 372, 1, 0, 0,sr_config.inv);111 reader->sr_config.inv=1; 112 EnableSmartReader(reader, 3571200, 372, 1, 0, 0, reader->sr_config.inv); 112 113 } 113 114 // parse atr … … 130 131 } 131 132 132 int SR_Transmit (BYTE * sent, unsigned size) 133 int SR_Transmit (struct s_reader *reader, BYTE * buffer, unsigned size) 134 133 135 { 134 136 unsigned int ret; 135 ret = smart_write( &ftdic, sent, size, 0);137 ret = smart_write(reader, buffer, size, 0); 136 138 if (ret!=size) 137 139 return ERROR; … … 140 142 } 141 143 142 int SR_Receive ( BYTE * data, unsigned size)144 int SR_Receive (struct s_reader *reader, BYTE * buffer, unsigned size) 143 145 { 144 146 unsigned int ret; 145 ret = smart_read( data, size,1);147 ret = smart_read(reader, buffer, size, 1); 146 148 if (ret!=size) 147 149 return ERROR; … … 150 152 } 151 153 152 int SR_SetBaudrate (int mhz) 153 { 154 155 sr_config.fs=mhz*1000; //freq in KHz 156 EnableSmartReader(&ftdic, sr_config.fs, sr_config.F, (BYTE)sr_config.D, sr_config.N, sr_config.T, sr_config.inv); 154 int SR_SetBaudrate (struct s_reader *reader) 155 { 156 reader->sr_config.fs=reader->mhz*10000; //freq in KHz 157 EnableSmartReader(reader, reader->sr_config.fs, reader->sr_config.F, (BYTE)reader->sr_config.D, reader->sr_config.N, reader->sr_config.T, reader->sr_config.inv); 157 158 //baud rate not really used in native mode since 158 159 //it's handled by the card, so just set to maximum 3Mb/s 159 pthread_mutex_lock(& g_usb_mutex);160 ftdi_set_baudrate(& ftdic, 3000000);161 pthread_mutex_unlock(& g_usb_mutex);160 pthread_mutex_lock(&reader->g_usb_mutex); 161 ftdi_set_baudrate(&reader->ftdic, 3000000); 162 pthread_mutex_unlock(&reader->g_usb_mutex); 162 163 sched_yield(); 163 164 … … 222 223 } 223 224 224 static void smart_flush(struct ftdi_context* ftdic)225 { 226 227 pthread_mutex_lock(& g_usb_mutex);228 ftdi_usb_purge_buffers( ftdic);229 pthread_mutex_unlock(& g_usb_mutex);230 231 pthread_mutex_lock(& g_read_mutex);232 g_read_buffer_size = 0;233 pthread_mutex_unlock(& g_read_mutex);225 static void smart_flush(struct s_reader *reader) 226 { 227 228 pthread_mutex_lock(&reader->g_usb_mutex); 229 ftdi_usb_purge_buffers(&reader->ftdic); 230 pthread_mutex_unlock(&reader->g_usb_mutex); 231 232 pthread_mutex_lock(&reader->g_read_mutex); 233 reader->g_read_buffer_size = 0; 234 pthread_mutex_unlock(&reader->g_read_mutex); 234 235 usleep(500); 235 236 sched_yield(); 236 237 } 237 238 238 static unsigned int smart_read( unsigned char* buff, size_t size, int timeout_sec)239 static unsigned int smart_read(struct s_reader *reader, unsigned char* buff, size_t size, int timeout_sec) 239 240 { 240 241 … … 247 248 while(total_read < size && dif.tv_sec < timeout_sec) { 248 249 249 pthread_mutex_lock(& g_read_mutex);250 if( g_read_buffer_size > 0) {250 pthread_mutex_lock(&reader->g_read_mutex); 251 if(reader->g_read_buffer_size > 0) { 251 252 252 ret = g_read_buffer_size>size-total_read ? size-total_read :g_read_buffer_size;253 memcpy(buff+total_read, g_read_buffer,ret);254 g_read_buffer_size -= ret;253 ret = reader->g_read_buffer_size > size-total_read ? size-total_read : reader->g_read_buffer_size; 254 memcpy(buff+total_read,reader->g_read_buffer,ret); 255 reader->g_read_buffer_size -= ret; 255 256 total_read+=ret; 256 257 } 257 pthread_mutex_unlock(& g_read_mutex);258 pthread_mutex_unlock(&reader->g_read_mutex); 258 259 259 260 gettimeofday(&now,NULL); … … 267 268 } 268 269 269 static unsigned int smart_write(struct ftdi_context* ftdic, unsigned char* buff, size_t size, int udelay)270 static unsigned int smart_write(struct s_reader *reader, unsigned char* buff, size_t size, int udelay) 270 271 { 271 272 … … 274 275 275 276 if (udelay == 0) { 276 pthread_mutex_lock(& g_usb_mutex);277 ret = ftdi_write_data( ftdic, buff, size);278 pthread_mutex_unlock(& g_usb_mutex);277 pthread_mutex_lock(&reader->g_usb_mutex); 278 ret = ftdi_write_data(&reader->ftdic, buff, size); 279 pthread_mutex_unlock(&reader->g_usb_mutex); 279 280 } 280 281 else { 281 282 for (idx = 0; idx < size; idx++) { 282 pthread_mutex_lock(& g_usb_mutex);283 if ((ret = ftdi_write_data( ftdic, &buff[idx], 1)) < 0){284 pthread_mutex_unlock(& g_usb_mutex);283 pthread_mutex_lock(&reader->g_usb_mutex); 284 if ((ret = ftdi_write_data(&reader->ftdic, &buff[idx], 1)) < 0){ 285 pthread_mutex_unlock(&reader->g_usb_mutex); 285 286 break; 286 287 } 287 pthread_mutex_unlock(& g_usb_mutex);288 pthread_mutex_unlock(&reader->g_usb_mutex); 288 289 usleep(udelay); 289 290 } … … 294 295 } 295 296 296 static void EnableSmartReader(struct ftdi_context* ftdic, int clock, unsigned short Fi, unsigned char Di, unsigned char Ni, unsigned char T, unsigned char inv) {297 static void EnableSmartReader(struct s_reader *reader, int clock, unsigned short Fi, unsigned char Di, unsigned char Ni, unsigned char T, unsigned char inv) { 297 298 298 299 int ret = 0; … … 300 301 301 302 302 pthread_mutex_lock(& g_usb_mutex);303 ret = ftdi_set_baudrate( ftdic, 9600);304 ret = ftdi_set_line_property( ftdic, (enum ftdi_bits_type) 5, STOP_BIT_2, NONE);305 pthread_mutex_unlock(& g_usb_mutex);303 pthread_mutex_lock(&reader->g_usb_mutex); 304 ret = ftdi_set_baudrate(&reader->ftdic, 9600); 305 ret = ftdi_set_line_property(&reader->ftdic, (enum ftdi_bits_type) 5, STOP_BIT_2, NONE); 306 pthread_mutex_unlock(&reader->g_usb_mutex); 306 307 #ifdef DEBUG_IO 307 308 cs_log("IO:SR: sending F=%04X to smartreader",Fi); … … 310 311 311 312 unsigned char FiDi[] = {0x01, HIBYTE(Fi), LOBYTE(Fi), Di}; 312 ret = smart_write( ftdic,FiDi, sizeof (FiDi),0);313 ret = smart_write(reader,FiDi, sizeof (FiDi),0); 313 314 usleep(delay); 314 315 … … 318 319 #endif 319 320 unsigned char Freq[] = {0x02, HIBYTE(freqk), LOBYTE(freqk)}; 320 ret = smart_write( ftdic, Freq, sizeof (Freq),0);321 ret = smart_write(reader, Freq, sizeof (Freq),0); 321 322 usleep(delay); 322 323 … … 325 326 #endif 326 327 unsigned char N[] = {0x03, Ni}; 327 ret = smart_write( ftdic, N, sizeof (N),0);328 ret = smart_write(reader, N, sizeof (N),0); 328 329 usleep(delay); 329 330 … … 332 333 #endif 333 334 unsigned char Prot[] = {0x04, T}; 334 ret = smart_write( ftdic, Prot, sizeof (Prot),0);335 ret = smart_write(reader, Prot, sizeof (Prot),0); 335 336 usleep(delay); 336 337 … … 339 340 #endif 340 341 unsigned char Invert[] = {0x05, inv}; 341 ret = smart_write( ftdic, Invert, sizeof (Invert),0);342 ret = smart_write(reader, Invert, sizeof (Invert),0); 342 343 usleep(delay); 343 344 344 pthread_mutex_lock(& g_usb_mutex);345 ret = ftdi_set_line_property2( ftdic, BITS_8, STOP_BIT_2, ODD, BREAK_ON);346 pthread_mutex_unlock(& g_usb_mutex);345 pthread_mutex_lock(&reader->g_usb_mutex); 346 ret = ftdi_set_line_property2(&reader->ftdic, BITS_8, STOP_BIT_2, ODD, BREAK_ON); 347 pthread_mutex_unlock(&reader->g_usb_mutex); 347 348 348 349 usleep(50000); 349 350 350 pthread_mutex_lock(& g_usb_mutex);351 ret = ftdi_set_line_property2( ftdic, BITS_8, STOP_BIT_2, ODD, BREAK_OFF);352 pthread_mutex_unlock(& g_usb_mutex);353 354 smart_flush( ftdic);355 } 356 357 static void ResetSmartReader(struct ftdi_context* ftdic)358 { 359 360 smart_flush( ftdic);351 pthread_mutex_lock(&reader->g_usb_mutex); 352 ret = ftdi_set_line_property2(&reader->ftdic, BITS_8, STOP_BIT_2, ODD, BREAK_OFF); 353 pthread_mutex_unlock(&reader->g_usb_mutex); 354 355 smart_flush(reader); 356 } 357 358 static void ResetSmartReader(struct s_reader *reader) 359 { 360 361 smart_flush(reader); 361 362 // set smartreader+ default values 362 sr_config.F=372;363 sr_config.D=1.0;364 sr_config.fs=3571200;365 sr_config.N=0;366 sr_config.T=0;367 sr_config.inv=0;368 369 EnableSmartReader( ftdic, sr_config.fs, sr_config.F, (BYTE)sr_config.D, sr_config.N, sr_config.T,sr_config.inv);363 reader->sr_config.F=372; 364 reader->sr_config.D=1.0; 365 reader->sr_config.fs=3571200; 366 reader->sr_config.N=0; 367 reader->sr_config.T=0; 368 reader->sr_config.inv=0; 369 370 EnableSmartReader(reader, reader->sr_config.fs, reader->sr_config.F, (BYTE)reader->sr_config.D, reader->sr_config.N, reader->sr_config.T, reader->sr_config.inv); 370 371 sched_yield(); 371 372 … … 375 376 { 376 377 377 struct ftdi_context* ftdic = (struct ftdi_context*)p;378 struct s_reader *reader; 378 379 bool running = TRUE; 379 380 unsigned int ret; … … 381 382 unsigned char local_buffer[64]; //64 is max transfer size of FTDI bulk pipe 382 383 384 reader = (struct s_reader *)p; 385 383 386 while(running){ 384 387 385 if( g_read_buffer_size == sizeof(g_read_buffer)){388 if(reader->g_read_buffer_size == sizeof(reader->g_read_buffer)){ 386 389 //if out read buffer is full then delay 387 390 //slightly and go around again … … 391 394 } 392 395 393 pthread_mutex_lock(& g_usb_mutex);394 ret = usb_bulk_read( ftdic->usb_dev,ftdic->out_ep,(char*)local_buffer,64,1000);395 pthread_mutex_unlock(& g_usb_mutex);396 pthread_mutex_lock(&reader->g_usb_mutex); 397 ret = usb_bulk_read(reader->ftdic.usb_dev,reader->ftdic.out_ep,(char*)local_buffer,64,1000); 398 pthread_mutex_unlock(&reader->g_usb_mutex); 396 399 sched_yield(); 397 400 398 401 399 402 if(ret>2) { //FTDI always sends modem status bytes as first 2 chars with the 232BM 400 pthread_mutex_lock(& g_read_mutex);401 modem_status=local_buffer[0];402 403 copy_size = sizeof( g_read_buffer) - g_read_buffer_size > ret-2 ?ret-2: sizeof(g_read_buffer) -g_read_buffer_size;404 memcpy( g_read_buffer+g_read_buffer_size,local_buffer+2,copy_size);405 g_read_buffer_size += copy_size;406 pthread_mutex_unlock(& g_read_mutex);403 pthread_mutex_lock(&reader->g_read_mutex); 404 reader->modem_status=local_buffer[0]; 405 406 copy_size = sizeof(reader->g_read_buffer) - reader->g_read_buffer_size > ret-2 ?ret-2: sizeof(reader->g_read_buffer) - reader->g_read_buffer_size; 407 memcpy(reader->g_read_buffer+reader->g_read_buffer_size,local_buffer+2,copy_size); 408 reader->g_read_buffer_size += copy_size; 409 pthread_mutex_unlock(&reader->g_read_mutex); 407 410 } 408 411 else { 409 412 if(ret==2) { 410 pthread_mutex_lock(& g_read_mutex);411 modem_status=local_buffer[0];412 pthread_mutex_unlock(& g_read_mutex);413 pthread_mutex_lock(&reader->g_read_mutex); 414 reader->modem_status=local_buffer[0]; 415 pthread_mutex_unlock(&reader->g_read_mutex); 413 416 } 414 417 //sleep for 50ms since there was nothing to read last time -
branches/smartreader/csctapi/ifd_smartreader.h
r1349 r1352 26 26 #define HIBYTE(w) ((BYTE)((w) >> 8)) 27 27 28 typedef struct {29 int F;30 float D;31 int fs;32 int N;33 int T;34 int inv;35 } SR_CONFIG;36 28 37 unsigned char g_read_buffer[4096]; 38 unsigned short g_read_buffer_size; 39 pthread_mutex_t g_read_mutex; 40 pthread_mutex_t g_usb_mutex; 41 struct ftdi_context ftdic; 42 struct usb_device *smartreader_usb_dev; 43 pthread_t rt; 44 unsigned char modem_status; 45 46 SR_CONFIG sr_config; 47 48 49 int SR_Init (int device_index); 50 int SR_Reset (ATR ** atr); 51 int SR_Transmit (BYTE * buffer, unsigned size); 52 int SR_Receive (BYTE * buffer, unsigned size); 53 int SR_SetBaudrate (int mhz); 29 int SR_Init (struct s_reader *reader,int device_index); 30 int SR_GetStatus (struct s_reader *reader,int * in); 31 int SR_Reset (struct s_reader *reader, ATR ** atr); 32 int SR_Transmit (struct s_reader *reader, BYTE * buffer, unsigned size); 33 int SR_Receive (struct s_reader *reader, BYTE * buffer, unsigned size); 34 int SR_SetBaudrate (struct s_reader *reader); 54 35 55 36 // bool find_smartreader(int index, struct ftdi_context* ftdic,struct usb_device *dev); 56 37 static struct usb_device * find_smartreader(int index, struct ftdi_context* ftdic); 57 static void smart_flush(struct ftdi_context* ftdic);58 static unsigned int smart_read( unsigned char* buff, size_t size, int timeout_sec);59 static unsigned int smart_write(struct ftdi_context* ftdic, unsigned char* buff, size_t size, int udelay);60 static void EnableSmartReader(struct ftdi_context* ftdic, int clock, unsigned short Fi, unsigned char Di, unsigned char Ni, unsigned char T,unsigned char inv);61 static void ResetSmartReader(struct ftdi_context* ftdic);38 static void smart_flush(struct s_reader *reader); 39 static unsigned int smart_read(struct s_reader *reader, unsigned char* buff, size_t size, int timeout_sec); 40 static unsigned int smart_write(struct s_reader *reader, unsigned char* buff, size_t size, int udelay); 41 static void EnableSmartReader(struct s_reader *reader, int clock, unsigned short Fi, unsigned char Di, unsigned char Ni, unsigned char T,unsigned char inv); 42 static void ResetSmartReader(struct s_reader *reader); 62 43 static void* ReaderThread(void *p); 63 44 static bool smartreader_check_endpoint(struct usb_device *dev); -
branches/smartreader/csctapi/pps.c
r1336 r1352 281 281 #if defined(HAVE_LIBUSB) && defined(USE_PTHREAD) 282 282 if (reader[ridx].typ == R_SMART) { 283 sr_config.F=atr_f_table[parameters.FI];284 sr_config.D=parameters.d;285 sr_config.N=parameters.n;286 sr_config.T=parameters.t;287 SR_SetBaudrate( reader[ridx].mhz*10);283 reader[ridx].sr_config.F=atr_f_table[parameters.FI]; 284 reader[ridx].sr_config.D=parameters.d; 285 reader[ridx].sr_config.N=parameters.n; 286 reader[ridx].sr_config.T=parameters.t; 287 SR_SetBaudrate(&reader[ridx]); 288 288 return PPS_OK; 289 289 } -
branches/smartreader/globals.h
r1277 r1352 53 53 #endif 54 54 55 #if defined(HAVE_LIBUSB) && defined(USE_PTHREAD) 56 #include "csctapi/ftdi.h" 57 #endif 58 55 59 #ifndef CS_CONFDIR 56 60 #define CS_CONFDIR "/usr/local/etc" … … 260 264 PORT ports[CS_MAXPORTS]; 261 265 } GCC_PACK PTAB; 266 267 typedef struct { 268 int F; 269 float D; 270 int fs; 271 int N; 272 int T; 273 int inv; 274 } SR_CONFIG; 262 275 263 276 struct s_ecm … … 451 464 DWORD dwActiveProtocol; 452 465 #endif 466 #if defined(HAVE_LIBUSB) && defined(USE_PTHREAD) 467 unsigned char g_read_buffer[4096]; 468 unsigned short g_read_buffer_size; 469 pthread_mutex_t g_read_mutex; 470 pthread_mutex_t g_usb_mutex; 471 struct ftdi_context ftdic; 472 struct usb_device *smartreader_usb_dev; 473 pthread_t rt; 474 unsigned char modem_status; 475 SR_CONFIG sr_config; 476 #endif 453 477 454 478 };
Note:
See TracChangeset
for help on using the changeset viewer.