Changeset 1723
- Timestamp:
- 02/26/10 19:05:09 (11 years ago)
- Location:
- trunk
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Makefile
r1722 r1723 68 68 OS_CULI="-lncurses" \ 69 69 OS_PTLI="-lpthread" \ 70 DS_OPTS="-O2 -DOS_LINUX -D WEBIF -DCS_CONFDIR=${CS_CONFDIR} -Winline -Wall -Wextra -finline-functions -fomit-frame-pointer -D'CS_SVN_VERSION="\"$(SVN_REV)\""'" \70 DS_OPTS="-O2 -DOS_LINUX -DCS_CONFDIR=${CS_CONFDIR} -Winline -Wall -Wextra -finline-functions -fomit-frame-pointer -D'CS_SVN_VERSION="\"$(SVN_REV)\""'" \ 71 71 DS_CFLAGS="-c" \ 72 72 DS_LDFLAGS="" \ … … 89 89 OS_CULI="-lncurses" \ 90 90 OS_PTLI="-lpthread" \ 91 DS_OPTS="-O2 -DOS_LINUX -D USE_PTHREAD -DLIBUSB -DCS_CONFDIR=${CS_CONFDIR} -Winline -Wall -Wextra -finline-functions -fomit-frame-pointer -D'CS_SVN_VERSION="\"$(SVN_REV)\""' -I/usr/local/include" \91 DS_OPTS="-O2 -DOS_LINUX -DLIBUSB -DCS_CONFDIR=${CS_CONFDIR} -Winline -Wall -Wextra -finline-functions -fomit-frame-pointer -D'CS_SVN_VERSION="\"$(SVN_REV)\""' -I/usr/local/include" \ 92 92 DS_CFLAGS="-c" \ 93 93 DS_LDFLAGS="" \ … … 132 132 OS_CULI="-lncurses" \ 133 133 OS_PTLI="-lpthread -lpcsclite" \ 134 DS_OPTS="-O2 -DOS_LINUX -D USE_PTHREAD -DLIBUSB -DCS_CONFDIR=${CS_CONFDIR} -DHAVE_PCSC=1 -I/usr/include/PCSC -Winline -Wall -Wextra -finline-functions -fomit-frame-pointer -D'CS_SVN_VERSION="\"$(SVN_REV)\""' -I/usr/local/include" \134 DS_OPTS="-O2 -DOS_LINUX -DLIBUSB -DCS_CONFDIR=${CS_CONFDIR} -DHAVE_PCSC=1 -I/usr/include/PCSC -Winline -Wall -Wextra -finline-functions -fomit-frame-pointer -D'CS_SVN_VERSION="\"$(SVN_REV)\""' -I/usr/local/include" \ 135 135 DS_CFLAGS="-c" \ 136 136 DS_LDFLAGS="" \ … … 153 153 OS_CULI="-lncurses" \ 154 154 OS_PTLI="-lpthread" \ 155 DS_OPTS="-O2 -DOS_MACOSX -DNEED_DAEMON -DCS_NOSHM -DHAVE_PTHREAD_H -D USE_PTHREAD -DCS_CONFDIR=${CS_CONFDIR} -DHAVE_PCSC=1 -m32 -Winline -Wall -Wextra -finline-functions -fomit-frame-pointer -D'CS_SVN_VERSION="\"$(SVN_REV)\""'" \155 DS_OPTS="-O2 -DOS_MACOSX -DNEED_DAEMON -DCS_NOSHM -DHAVE_PTHREAD_H -DCS_CONFDIR=${CS_CONFDIR} -DHAVE_PCSC=1 -m32 -Winline -Wall -Wextra -finline-functions -fomit-frame-pointer -D'CS_SVN_VERSION="\"$(SVN_REV)\""'" \ 156 156 DS_CFLAGS="-c" \ 157 157 DS_LDFLAGS="-framework PCSC" \ … … 175 175 OS_CULI="-lncurses" \ 176 176 OS_PTLI="-lpthread" \ 177 DS_OPTS="-O2 -DOS_MACOSX -DNEED_DAEMON -DCS_NOSHM -DHAVE_PTHREAD_H -DUSE_PTHREAD-DCS_CONFDIR=${CS_CONFDIR} -DHAVE_PCSC=1 -DLIBUSB -m32 -Winline -Wall -Wextra -finline-functions -fomit-frame-pointer -D'CS_SVN_VERSION="\"$(SVN_REV)\""' -I/usr/local/include" \177 DS_OPTS="-O2 -DOS_MACOSX -DNEED_DAEMON -DCS_NOSHM -DHAVE_PTHREAD_H -DCS_CONFDIR=${CS_CONFDIR} -DHAVE_PCSC=1 -DLIBUSB -m32 -Winline -Wall -Wextra -finline-functions -fomit-frame-pointer -D'CS_SVN_VERSION="\"$(SVN_REV)\""' -I/usr/local/include" \ 178 178 DS_CFLAGS="-c" \ 179 179 DS_LDFLAGS="-framework PCSC -Wl,-framework -Wl,IOKit -Wl,-framework -Wl,CoreFoundation -Wl,-prebind -no-undefined" \ -
trunk/csctapi/ifd_smartreader.c
r1719 r1723 16 16 17 17 //local globals 18 unsigned char g_read_buffer[4096];19 unsigned int g_read_buffer_size;20 pthread_mutex_t g_read_mutex;21 pthread_mutex_t g_usb_mutex;22 //struct usb_device *smartreader_usb_dev;23 pthread_t rt;24 unsigned char modem_status;25 18 SR_CONFIG sr_config; 26 19 … … 73 66 return ERROR; 74 67 } 75 68 reader->sr_config=malloc(sizeof(SR_CONFIG)); 69 if(!reader) { 70 cs_log("Couldn't allocate memory for Device=%s config",reader->device); 71 return ERROR; 72 } 76 73 cs_debug_mask (D_IFD,"IO:SR: Looking for device %s on bus %s",devname,busname); 77 74 … … 84 81 smartreader_init(reader); 85 82 86 sr_config.usb_dev=find_smartreader(busname,devname);87 if(! sr_config.usb_dev)83 reader->sr_config->usb_dev=find_smartreader(busname,devname); 84 if(!reader->sr_config->usb_dev) 88 85 return ERROR; 89 86 … … 93 90 //also a good way to compare a real FT232 with a smartreader 94 91 //if you enumarate usb devices 95 sr_config.in_ep = 0x1;96 sr_config.out_ep = 0x82;92 reader->sr_config->in_ep = 0x1; 93 reader->sr_config->out_ep = 0x82; 97 94 98 95 //open the first smartreader found in the system, this … … 122 119 123 120 // start the reading thread 124 g_read_buffer_size = 0;125 modem_status = 0 ;126 pthread_mutex_init(& g_read_mutex,NULL);127 pthread_mutex_init(& g_usb_mutex,NULL);128 ret = pthread_create(&r t, NULL, ReaderThread, (void *)(reader));121 reader->sr_config->g_read_buffer_size = 0; 122 reader->sr_config->modem_status = 0 ; 123 pthread_mutex_init(&reader->sr_config->g_read_mutex,NULL); 124 pthread_mutex_init(&reader->sr_config->g_usb_mutex,NULL); 125 ret = pthread_create(&reader->sr_config->rt, NULL, ReaderThread, (void *)(reader)); 129 126 if (ret) { 130 127 cs_log("ERROR; return code from pthread_create() is %d", ret); … … 140 137 int state; 141 138 142 pthread_mutex_lock(& g_read_mutex);143 state =( modem_status & 0x80) == 0x80 ? 0 : 2;144 pthread_mutex_unlock(& g_read_mutex);139 pthread_mutex_lock(&reader->sr_config->g_read_mutex); 140 state =(reader->sr_config->modem_status & 0x80) == 0x80 ? 0 : 2; 141 pthread_mutex_unlock(&reader->sr_config->g_read_mutex); 145 142 146 143 … … 166 163 167 164 if(reader->mhz==reader->cardmhz && reader->cardmhz*10000 > 3690000) 168 sr_config.fs=reader->cardmhz*10000;165 reader->sr_config->fs=reader->cardmhz*10000; 169 166 else 170 sr_config.fs=3690000;167 reader->sr_config->fs=3690000; 171 168 172 169 smart_flush(reader); 173 170 // set smartreader+ default values 174 sr_config.F=372;175 sr_config.D=1.0;171 reader->sr_config->F=372; 172 reader->sr_config->D=1.0; 176 173 if(reader->mhz==reader->cardmhz && reader->cardmhz*10000 > 3690000) 177 sr_config.fs=reader->cardmhz*10000;174 reader->sr_config->fs=reader->cardmhz*10000; 178 175 else 179 sr_config.fs=3690000;180 sr_config.N=0;181 sr_config.T=0;182 sr_config.inv=0;176 reader->sr_config->fs=3690000; 177 reader->sr_config->N=0; 178 reader->sr_config->T=0; 179 reader->sr_config->inv=0; 183 180 184 181 for(i=0 ; i < 4 ;i++) { 185 sr_config.irdeto=FALSE;182 reader->sr_config->irdeto=FALSE; 186 183 atr_ok=ERROR; 187 184 memset(data,0,sizeof(data)); … … 192 189 if(i==3) { 193 190 cs_debug_mask (D_IFD,"IO:SR: Trying irdeto"); 194 sr_config.F=618; /// magic smartreader value195 sr_config.D=1;196 sr_config.T=2; // will be set to T=1 in EnableSmartReader197 sr_config.irdeto=TRUE;191 reader->sr_config->F=618; /// magic smartreader value 192 reader->sr_config->D=1; 193 reader->sr_config->T=2; // will be set to T=1 in EnableSmartReader 194 reader->sr_config->irdeto=TRUE; 198 195 } 199 196 200 197 smart_flush(reader); 201 EnableSmartReader(reader, sr_config.fs/10000, sr_config.F, (BYTE)sr_config.D, sr_config.N, sr_config.T, sr_config.inv,parity[i]);198 EnableSmartReader(reader, reader->sr_config->fs/10000, reader->sr_config->F, (BYTE)reader->sr_config->D, reader->sr_config->N, reader->sr_config->T, reader->sr_config->inv,parity[i]); 202 199 sched_yield(); 203 200 cs_sleepms(500); //smartreader in mouse mode needs this, so it might also be needed in native mode. … … 226 223 227 224 if(data[0]!=0x3B && data[0]!=0x03 && data[0]!=0x3F) { 228 sr_config.irdeto=FALSE;225 reader->sr_config->irdeto=FALSE; 229 226 continue; // this is not a valid ATR. 230 227 } … … 233 230 cs_debug_mask (D_IFD,"IO:SR: Inverse convention detected, setting smartreader inv to 1"); 234 231 235 sr_config.inv=1;236 EnableSmartReader(reader, sr_config.fs/10000, sr_config.F, (BYTE)sr_config.D, sr_config.N, sr_config.T, sr_config.inv,parity[i]);232 reader->sr_config->inv=1; 233 EnableSmartReader(reader, reader->sr_config->fs/10000, reader->sr_config->F, (BYTE)reader->sr_config->D, reader->sr_config->N, reader->sr_config->T, reader->sr_config->inv,parity[i]); 237 234 } 238 235 // parse atr … … 242 239 if(i==3) { 243 240 cs_debug_mask (D_IFD,"IO:SR: Locking F and D for Irdeto mode"); 244 sr_config.irdeto=TRUE;241 reader->sr_config->irdeto=TRUE; 245 242 } 246 243 } … … 278 275 { 279 276 // maintaining all this admin seems overdone, since after this init the values are nowhere needed 280 // reader[ridx]. sr_config.F=F;281 // reader[ridx]. sr_config.D=D;282 // reader[ridx]. sr_config.N=N;283 // reader[ridx]. sr_config.T=T;284 // sr_config.fs=reader->mhz*10000; //freq in Hz */285 // EnableSmartReader(reader, sr_config.fs, sr_config.F, (BYTE)sr_config.D, sr_config.N, sr_config.T, sr_config.inv,sr_config.parity);277 // reader[ridx].reader->sr_config->F=F; 278 // reader[ridx].reader->sr_config->D=D; 279 // reader[ridx].reader->sr_config->N=N; 280 // reader[ridx].reader->sr_config->T=T; 281 // reader->sr_config->fs=reader->mhz*10000; //freq in Hz */ 282 // 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,reader->sr_config->parity); 286 283 287 284 // smartreader supports 3.20, 3.43, 3.69, 4.00, 4.36, 4.80, 5.34, 6.00, 6.86, 8.00, 9.61, 12.0, 16.0 Mhz 288 sr_config.inv = convention;//FIXME this one is set by icc_async and local smartreader reset routine285 reader->sr_config->inv = convention;//FIXME this one is set by icc_async and local smartreader reset routine 289 286 if (reader->mhz >=1600) reader->mhz = 1600; else 290 287 if (reader->mhz >=1200) reader->mhz = 1200; else … … 300 297 if (reader->mhz >=343) reader->mhz = 343; else 301 298 reader->mhz = 320; 302 EnableSmartReader(reader, reader->mhz, F, D, N, T, sr_config.inv,sr_config.parity);299 EnableSmartReader(reader, reader->mhz, F, D, N, T, reader->sr_config->inv,reader->sr_config->parity); 303 300 304 301 //baud rate not really used in native mode since … … 331 328 cs_debug_mask(D_IFD,"IO:SR: Closing smarteader\n"); 332 329 333 sr_config.running=FALSE;334 pthread_join(r t,NULL);335 libusb_close( sr_config.usb_dev_handle);330 reader->sr_config->running=FALSE; 331 pthread_join(reader->sr_config->rt,NULL); 332 libusb_close(reader->sr_config->usb_dev_handle); 336 333 libusb_exit(NULL); 334 free(reader->sr_config); 337 335 return OK; 338 336 … … 355 353 356 354 // command 1, set F and D parameter 357 if(! sr_config.irdeto) {355 if(!reader->sr_config->irdeto) { 358 356 cs_debug_mask (D_IFD,"IO:SR: sending F=%04X (%d) to smartreader",Fi,Fi); 359 357 cs_debug_mask (D_IFD,"IO:SR: sending D=%02X (%d) to smartreader",Di,Di); … … 384 382 385 383 // command 4 , set parameter T 386 if( sr_config.irdeto && T==2) // special trick to get ATR for Irdeto card, we need T=1 at reset, after that oscam takes care of T1 protocol, so we need T=0384 if(reader->sr_config->irdeto && T==2) // special trick to get ATR for Irdeto card, we need T=1 at reset, after that oscam takes care of T1 protocol, so we need T=0 387 385 { 388 386 T=1; 389 sr_config.T=1;387 reader->sr_config->T=1; 390 388 } 391 389 else if (T==1) … … 505 503 void smartreader_init(S_READER *reader) 506 504 { 507 sr_config.usb_dev = NULL;508 sr_config.usb_dev_handle=NULL;509 sr_config.usb_read_timeout = 10000;510 sr_config.usb_write_timeout = 10000;511 512 sr_config.type = TYPE_BM; /* chip type */513 sr_config.baudrate = -1;514 sr_config.bitbang_enabled = 0; /* 0: normal mode 1: any of the bitbang modes enabled */515 516 sr_config.writebuffer_chunksize = 64;517 sr_config.max_packet_size = 0;518 519 sr_config.interface = INTERFACE_ANY;520 sr_config.index = INTERFACE_A;521 sr_config.in_ep = 0x02;522 sr_config.out_ep = 0x82;505 reader->sr_config->usb_dev = NULL; 506 reader->sr_config->usb_dev_handle=NULL; 507 reader->sr_config->usb_read_timeout = 10000; 508 reader->sr_config->usb_write_timeout = 10000; 509 510 reader->sr_config->type = TYPE_BM; /* chip type */ 511 reader->sr_config->baudrate = -1; 512 reader->sr_config->bitbang_enabled = 0; /* 0: normal mode 1: any of the bitbang modes enabled */ 513 514 reader->sr_config->writebuffer_chunksize = 64; 515 reader->sr_config->max_packet_size = 0; 516 517 reader->sr_config->interface = INTERFACE_ANY; 518 reader->sr_config->index = INTERFACE_A; 519 reader->sr_config->in_ep = 0x02; 520 reader->sr_config->out_ep = 0x82; 523 521 } 524 522 … … 536 534 // New hi-speed devices from FTDI use a packet size of 512 bytes 537 535 // but could be connected to a normal speed USB hub -> 64 bytes packet size. 538 if ( sr_config.type == TYPE_2232H || sr_config.type == TYPE_4232H)536 if (reader->sr_config->type == TYPE_2232H || reader->sr_config->type == TYPE_4232H) 539 537 packet_size = 512; 540 538 else 541 539 packet_size = 64; 542 540 543 ret = libusb_get_device_descriptor( sr_config.usb_dev, &desc);541 ret = libusb_get_device_descriptor(reader->sr_config->usb_dev, &desc); 544 542 if (ret < 0) { 545 543 cs_log("Smartreader : couldn't read device descriptor , using default packet size"); … … 548 546 if (desc.bNumConfigurations) 549 547 { 550 ret=libusb_get_active_config_descriptor( sr_config.usb_dev,&configDesc);548 ret=libusb_get_active_config_descriptor(reader->sr_config->usb_dev,&configDesc); 551 549 if(ret) { 552 550 cs_log("Smartreader : couldn't read config descriptor , using default packet size"); … … 554 552 } 555 553 556 if ( sr_config.interface < configDesc->bNumInterfaces)554 if (reader->sr_config->interface < configDesc->bNumInterfaces) 557 555 { 558 interface=configDesc->interface[ sr_config.interface];556 interface=configDesc->interface[reader->sr_config->interface]; 559 557 if (interface.num_altsetting > 0) 560 558 { … … 576 574 int ret = 0; 577 575 578 if ( sr_config.usb_dev_handle)579 { 580 libusb_close ( sr_config.usb_dev_handle);581 sr_config.usb_dev_handle=NULL;576 if (reader->sr_config->usb_dev_handle) 577 { 578 libusb_close (reader->sr_config->usb_dev_handle); 579 reader->sr_config->usb_dev_handle=NULL; 582 580 } 583 581 … … 588 586 int smartreader_usb_reset(S_READER *reader) 589 587 { 590 if (libusb_control_transfer( sr_config.usb_dev_handle,588 if (libusb_control_transfer(reader->sr_config->usb_dev_handle, 591 589 FTDI_DEVICE_OUT_REQTYPE, 592 590 SIO_RESET_REQUEST, 593 591 SIO_RESET_SIO, 594 sr_config.index,592 reader->sr_config->index, 595 593 NULL, 596 594 0, 597 sr_config.usb_write_timeout) != 0) {595 reader->sr_config->usb_write_timeout) != 0) { 598 596 cs_log("Smartreader reset failed"); 599 597 return (-1); … … 619 617 #endif 620 618 621 ret=libusb_open( sr_config.usb_dev,&sr_config.usb_dev_handle);619 ret=libusb_open(reader->sr_config->usb_dev,&reader->sr_config->usb_dev_handle); 622 620 if (ret) { 623 621 cs_log("Smartreader usb_open() failed"); … … 632 630 // detach operation might be denied and everything still works fine. 633 631 // Likely scenario is a static smartreader_sio kernel module. 634 if (libusb_detach_kernel_driver( sr_config.usb_dev_handle, sr_config.interface) != 0 && errno != ENODATA) {632 if (libusb_detach_kernel_driver(reader->sr_config->usb_dev_handle, reader->sr_config->interface) != 0 && errno != ENODATA) { 635 633 detach_errno = errno; 636 634 cs_log("Couldn't detach interface from kernel. Please unload the FTDI drivers"); … … 638 636 } 639 637 #endif 640 ret = libusb_get_device_descriptor( sr_config.usb_dev, &desc);638 ret = libusb_get_device_descriptor(reader->sr_config->usb_dev, &desc); 641 639 642 640 #ifdef __WIN32__ … … 647 645 if (desc.bNumConfigurations > 0) 648 646 { 649 ret=libusb_get_configuration( sr_config.usb_dev_handle,&config);647 ret=libusb_get_configuration(reader->sr_config->usb_dev_handle,&config); 650 648 651 649 // libusb-win32 on Windows 64 can return a null pointer for a valid device 652 if (libusb_set_configuration( sr_config.usb_dev_handle, config) &&650 if (libusb_set_configuration(reader->sr_config->usb_dev_handle, config) && 653 651 errno != EBUSY) 654 652 { … … 666 664 #endif 667 665 668 ret=libusb_claim_interface( sr_config.usb_dev_handle, sr_config.interface) ;666 ret=libusb_claim_interface(reader->sr_config->usb_dev_handle, reader->sr_config->interface) ; 669 667 if (ret!= 0) 670 668 { … … 690 688 if (desc.bcdDevice == 0x400 || (desc.bcdDevice == 0x200 691 689 && desc.iSerialNumber == 0)) 692 sr_config.type = TYPE_BM;690 reader->sr_config->type = TYPE_BM; 693 691 else if (desc.bcdDevice == 0x200) 694 sr_config.type = TYPE_AM;692 reader->sr_config->type = TYPE_AM; 695 693 else if (desc.bcdDevice == 0x500) 696 sr_config.type = TYPE_2232C;694 reader->sr_config->type = TYPE_2232C; 697 695 else if (desc.bcdDevice == 0x600) 698 sr_config.type = TYPE_R;696 reader->sr_config->type = TYPE_R; 699 697 else if (desc.bcdDevice == 0x700) 700 sr_config.type = TYPE_2232H;698 reader->sr_config->type = TYPE_2232H; 701 699 else if (desc.bcdDevice == 0x800) 702 sr_config.type = TYPE_4232H;700 reader->sr_config->type = TYPE_4232H; 703 701 704 702 // Set default interface on dual/quad type chips 705 switch( sr_config.type) {703 switch(reader->sr_config->type) { 706 704 case TYPE_2232C: 707 705 case TYPE_2232H: 708 706 case TYPE_4232H: 709 if (! sr_config.index)710 sr_config.index = INTERFACE_A;707 if (!reader->sr_config->index) 708 reader->sr_config->index = INTERFACE_A; 711 709 break; 712 710 default: … … 715 713 716 714 // Determine maximum packet size 717 sr_config.max_packet_size = smartreader_determine_max_packet_size(reader);715 reader->sr_config->max_packet_size = smartreader_determine_max_packet_size(reader); 718 716 719 717 if (smartreader_set_baudrate (reader, 9600) != 0) { … … 729 727 int smartreader_usb_purge_rx_buffer(S_READER *reader) 730 728 { 731 if (libusb_control_transfer( sr_config.usb_dev_handle,729 if (libusb_control_transfer(reader->sr_config->usb_dev_handle, 732 730 FTDI_DEVICE_OUT_REQTYPE, 733 731 SIO_RESET_REQUEST, 734 732 SIO_RESET_PURGE_RX, 735 sr_config.index,733 reader->sr_config->index, 736 734 NULL, 737 735 0, 738 sr_config.usb_write_timeout) != 0) {736 reader->sr_config->usb_write_timeout) != 0) { 739 737 cs_log("FTDI purge of RX buffer failed"); 740 738 return (-1); … … 747 745 int smartreader_usb_purge_tx_buffer(S_READER *reader) 748 746 { 749 if (libusb_control_transfer( sr_config.usb_dev_handle,747 if (libusb_control_transfer(reader->sr_config->usb_dev_handle, 750 748 FTDI_DEVICE_OUT_REQTYPE, 751 749 SIO_RESET_REQUEST, 752 750 SIO_RESET_PURGE_TX, 753 sr_config.index,751 reader->sr_config->index, 754 752 NULL, 755 753 0, 756 sr_config.usb_write_timeout) != 0) {754 reader->sr_config->usb_write_timeout) != 0) { 757 755 cs_log("FTDI purge of TX buffer failed"); 758 756 return (-1); … … 794 792 divisor = 24000000 / baudrate; 795 793 796 if ( sr_config.type == TYPE_AM)794 if (reader->sr_config->type == TYPE_AM) 797 795 { 798 796 // Round down to supported fraction (AM only) … … 816 814 try_divisor = 8; 817 815 } 818 else if ( sr_config.type != TYPE_AM && try_divisor < 12)816 else if (reader->sr_config->type != TYPE_AM && try_divisor < 12) 819 817 { 820 818 // BM doesn't support divisors 9 through 11 inclusive … … 828 826 else 829 827 { 830 if ( sr_config.type == TYPE_AM)828 if (reader->sr_config->type == TYPE_AM) 831 829 { 832 830 // Round up to supported fraction (AM only) … … 884 882 // Split into "value" and "index" values 885 883 *value = (unsigned short)(encoded_divisor & 0xFFFF); 886 if ( sr_config.type == TYPE_2232C || sr_config.type == TYPE_2232H || sr_config.type == TYPE_4232H)884 if (reader->sr_config->type == TYPE_2232C || reader->sr_config->type == TYPE_2232H || reader->sr_config->type == TYPE_4232H) 887 885 { 888 886 *index = (unsigned short)(encoded_divisor >> 8); 889 887 *index &= 0xFF00; 890 *index |= sr_config.index;888 *index |= reader->sr_config->index; 891 889 } 892 890 else … … 902 900 int actual_baudrate; 903 901 904 if ( sr_config.bitbang_enabled)902 if (reader->sr_config->bitbang_enabled) 905 903 { 906 904 baudrate = baudrate*4; … … 922 920 } 923 921 924 if (libusb_control_transfer( sr_config.usb_dev_handle,922 if (libusb_control_transfer(reader->sr_config->usb_dev_handle, 925 923 FTDI_DEVICE_OUT_REQTYPE, 926 924 SIO_SET_BAUDRATE_REQUEST, … … 929 927 NULL, 930 928 0, 931 sr_config.usb_write_timeout) != 0) {929 reader->sr_config->usb_write_timeout) != 0) { 932 930 cs_log("Setting new baudrate failed"); 933 931 return (-2); 934 932 } 935 933 936 sr_config.baudrate = baudrate;934 reader->sr_config->baudrate = baudrate; 937 935 return 0; 938 936 } … … 952 950 usb_val |= SIO_SET_RTS_LOW; 953 951 954 if (libusb_control_transfer( sr_config.usb_dev_handle,952 if (libusb_control_transfer(reader->sr_config->usb_dev_handle, 955 953 FTDI_DEVICE_OUT_REQTYPE, 956 954 SIO_SET_MODEM_CTRL_REQUEST, 957 955 usb_val, 958 sr_config.index,956 reader->sr_config->index, 959 957 NULL, 960 958 0, 961 sr_config.usb_write_timeout) != 0) {959 reader->sr_config->usb_write_timeout) != 0) { 962 960 cs_log("set of rts/dtr failed"); 963 961 return (-1); … … 969 967 int smartreader_setflowctrl(S_READER *reader, int flowctrl) 970 968 { 971 if (libusb_control_transfer( sr_config.usb_dev_handle,969 if (libusb_control_transfer(reader->sr_config->usb_dev_handle, 972 970 FTDI_DEVICE_OUT_REQTYPE, 973 971 SIO_SET_FLOW_CTRL_REQUEST, 974 972 0, 975 (flowctrl | sr_config.index),973 (flowctrl | reader->sr_config->index), 976 974 NULL, 977 975 0, 978 sr_config.usb_write_timeout) != 0) {976 reader->sr_config->usb_write_timeout) != 0) { 979 977 cs_log("set flow control failed"); 980 978 return (-1); … … 1032 1030 } 1033 1031 1034 if (libusb_control_transfer( sr_config.usb_dev_handle,1032 if (libusb_control_transfer(reader->sr_config->usb_dev_handle, 1035 1033 FTDI_DEVICE_OUT_REQTYPE, 1036 1034 SIO_SET_DATA_REQUEST, 1037 1035 value, 1038 sr_config.index,1036 reader->sr_config->index, 1039 1037 NULL, 1040 1038 0, 1041 sr_config.usb_write_timeout) != 0) {1039 reader->sr_config->usb_write_timeout) != 0) { 1042 1040 cs_log("Setting new line property failed"); 1043 1041 return (-1); … … 1061 1059 smartreader_usb_purge_buffers(reader); 1062 1060 1063 pthread_mutex_lock(& g_read_mutex);1064 g_read_buffer_size = 0;1065 pthread_mutex_unlock(& g_read_mutex);1061 pthread_mutex_lock(&reader->sr_config->g_read_mutex); 1062 reader->sr_config->g_read_buffer_size = 0; 1063 pthread_mutex_unlock(&reader->sr_config->g_read_mutex); 1066 1064 sched_yield(); 1067 1065 } … … 1076 1074 1077 1075 while(total_read < size && dif.tv_sec < timeout_sec) { 1078 pthread_mutex_lock(& g_read_mutex);1076 pthread_mutex_lock(&reader->sr_config->g_read_mutex); 1079 1077 1080 if( g_read_buffer_size > 0) {1078 if(reader->sr_config->g_read_buffer_size > 0) { 1081 1079 1082 ret = g_read_buffer_size > size-total_read ? size-total_read :g_read_buffer_size;1083 memcpy(buff+total_read, g_read_buffer,ret);1084 g_read_buffer_size -= ret;1085 1086 if( g_read_buffer_size > 0){1087 memcpy( g_read_buffer, g_read_buffer + ret,g_read_buffer_size);1080 ret = reader->sr_config->g_read_buffer_size > size-total_read ? size-total_read : reader->sr_config->g_read_buffer_size; 1081 memcpy(buff+total_read,reader->sr_config->g_read_buffer,ret); 1082 reader->sr_config->g_read_buffer_size -= ret; 1083 1084 if(reader->sr_config->g_read_buffer_size > 0){ 1085 memcpy(reader->sr_config->g_read_buffer, reader->sr_config->g_read_buffer + ret, reader->sr_config->g_read_buffer_size); 1088 1086 } 1089 1087 1090 1088 total_read+=ret; 1091 1089 } 1092 pthread_mutex_unlock(& g_read_mutex);1090 pthread_mutex_unlock(&reader->sr_config->g_read_mutex); 1093 1091 1094 1092 gettimeofday(&now,NULL); … … 1114 1112 int written; 1115 1113 1116 if(size< sr_config.writebuffer_chunksize)1114 if(size<reader->sr_config->writebuffer_chunksize) 1117 1115 write_size=size; 1118 1116 else 1119 write_size = sr_config.writebuffer_chunksize;1117 write_size = reader->sr_config->writebuffer_chunksize; 1120 1118 1121 1119 while (offset < size) … … 1125 1123 write_size = size-offset; 1126 1124 1127 ret = libusb_bulk_transfer( sr_config.usb_dev_handle,1128 sr_config.in_ep,1125 ret = libusb_bulk_transfer(reader->sr_config->usb_dev_handle, 1126 reader->sr_config->in_ep, 1129 1127 buf+offset, 1130 1128 write_size, 1131 1129 &written, 1132 sr_config.usb_write_timeout);1130 reader->sr_config->usb_write_timeout); 1133 1131 if (ret < 0) { 1134 1132 cs_log("usb bulk write failed : ret = %d",ret); … … 1153 1151 1154 1152 usb_val = latency; 1155 if (libusb_control_transfer( sr_config.usb_dev_handle,1153 if (libusb_control_transfer(reader->sr_config->usb_dev_handle, 1156 1154 FTDI_DEVICE_OUT_REQTYPE, 1157 1155 SIO_SET_LATENCY_TIMER_REQUEST, 1158 1156 usb_val, 1159 sr_config.index,1157 reader->sr_config->index, 1160 1158 NULL, 1161 1159 0, 1162 sr_config.usb_write_timeout) != 0) {1160 reader->sr_config->usb_write_timeout) != 0) { 1163 1161 cs_log("unable to set latency timer"); 1164 1162 return (-2); … … 1205 1203 if(transfer->actual_length > 2) { //FTDI always sends modem status bytes as first 2 chars with the 232BM 1206 1204 1207 pthread_mutex_lock(& g_read_mutex);1208 1209 if( g_read_buffer_size == sizeof(g_read_buffer)) {1205 pthread_mutex_lock(&reader->sr_config->g_read_mutex); 1206 1207 if(reader->sr_config->g_read_buffer_size == sizeof(reader->sr_config->g_read_buffer)) { 1210 1208 cs_log("IO:SR: buffer full\n"); 1211 1209 //if out read buffer is full then delay … … 1214 1212 if(ret!=0) 1215 1213 cs_log("IO:SR: submit async transfer failed with error %d\n",ret); 1216 pthread_mutex_unlock(& g_read_mutex);1214 pthread_mutex_unlock(&reader->sr_config->g_read_mutex); 1217 1215 return; 1218 1216 } 1219 1217 1220 modem_status = transfer->buffer[1];1221 copy_size = sizeof( g_read_buffer) - g_read_buffer_size > (unsigned int)transfer->actual_length-2 ? (unsigned int)transfer->actual_length-2: sizeof(g_read_buffer) -g_read_buffer_size;1222 memcpy( g_read_buffer+g_read_buffer_size,transfer->buffer+2,copy_size);1223 g_read_buffer_size += copy_size;1224 pthread_mutex_unlock(& g_read_mutex);1218 reader->sr_config->modem_status = transfer->buffer[1]; 1219 copy_size = sizeof(reader->sr_config->g_read_buffer) - reader->sr_config->g_read_buffer_size > (unsigned int)transfer->actual_length-2 ? (unsigned int)transfer->actual_length-2: sizeof(reader->sr_config->g_read_buffer) - reader->sr_config->g_read_buffer_size; 1220 memcpy(reader->sr_config->g_read_buffer+reader->sr_config->g_read_buffer_size,transfer->buffer+2,copy_size); 1221 reader->sr_config->g_read_buffer_size += copy_size; 1222 pthread_mutex_unlock(&reader->sr_config->g_read_mutex); 1225 1223 } 1226 1224 else { 1227 1225 if(transfer->actual_length==2) { 1228 pthread_mutex_lock(& g_read_mutex);1229 modem_status=transfer->buffer[1];1230 pthread_mutex_unlock(& g_read_mutex);1226 pthread_mutex_lock(&reader->sr_config->g_read_mutex); 1227 reader->sr_config->modem_status=transfer->buffer[1]; 1228 pthread_mutex_unlock(&reader->sr_config->g_read_mutex); 1231 1229 } 1232 1230 } … … 1253 1251 1254 1252 reader = (struct s_reader *)p; 1255 sr_config.running=TRUE;1253 reader->sr_config->running=TRUE; 1256 1254 1257 1255 for(idx=0; idx<NUM_TXFERS; idx++) { … … 1259 1257 1260 1258 libusb_fill_bulk_transfer( usbt[idx], 1261 sr_config.usb_dev_handle,1262 sr_config.out_ep,1259 reader->sr_config->usb_dev_handle, 1260 reader->sr_config->out_ep, 1263 1261 usb_buffers[idx], 1264 1262 64, … … 1270 1268 } 1271 1269 1272 while( sr_config.running) {1270 while(reader->sr_config->running) { 1273 1271 ret = libusb_handle_events(NULL); 1274 1272 if(ret!=0) … … 1279 1277 } 1280 1278 1281 #endif // HAVE_LIBUSB && USE_PTHREAD1279 #endif // HAVE_LIBUSB -
trunk/csctapi/ifd_smartreader.h
r1719 r1723 33 33 34 34 #endif // __SMARTREADER__ 35 #endif // HAVE_LIBUSB && USE_PTHREAD35 #endif // HAVE_LIBUSB -
trunk/globals.h
r1722 r1723 306 306 /** maximum packet size. Needed for filtering modem status bytes every n packets. */ 307 307 unsigned int max_packet_size; 308 unsigned char g_read_buffer[4096]; 309 unsigned int g_read_buffer_size; 310 pthread_mutex_t g_read_mutex; 311 pthread_mutex_t g_usb_mutex; 312 pthread_t rt; 313 unsigned char modem_status; 308 314 } SR_CONFIG; 309 315 #endif … … 524 530 DWORD dwActiveProtocol; 525 531 #endif 532 #ifdef LIBUSB 533 SR_CONFIG *sr_config; 534 #endif 526 535 }; 527 536
Note:
See TracChangeset
for help on using the changeset viewer.