Changeset 1719
- Timestamp:
- 02/26/10 17:04:59 (14 years ago)
- Location:
- trunk
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Makefile
r1524 r1719 68 68 OS_CULI="-lncurses" \ 69 69 OS_PTLI="-lpthread" \ 70 DS_OPTS="-O2 -DOS_LINUX -D CS_CONFDIR=${CS_CONFDIR} -Winline -Wall -Wextra -finline-functions -fomit-frame-pointer -D'CS_SVN_VERSION="\"$(SVN_REV)\""'" \70 DS_OPTS="-O2 -DOS_LINUX -DWEBIF -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="" \ -
trunk/csctapi/icc_async.c
r1658 r1719 661 661 #if defined(LIBUSB) 662 662 case R_SMART: 663 reader[ridx].sr_config.inv= (convention == ATR_CONVENTION_INVERSE) ? 1: 0; 664 reader[ridx].sr_config.parity=parity; 665 call (SR_SetParity(&reader[ridx])); 663 call (SR_SetParity(&reader[ridx], parity)); 666 664 break; 667 665 #endif … … 855 853 #if defined(LIBUSB) 856 854 if (reader[ridx].typ == R_SMART) 857 SR_WriteSettings(&reader[ridx], (unsigned short) atr_f_table[FI], (BYTE)d, (BYTE)EGT, (BYTE)protocol_type );855 SR_WriteSettings(&reader[ridx], (unsigned short) atr_f_table[FI], (BYTE)d, (BYTE)EGT, (BYTE)protocol_type, convention); 858 856 #endif 859 857 cs_log("Maximum frequency for this card is formally %i Mhz, clocking it to %.2f Mhz", atr_fs_table[FI] / 1000000, (float) reader[ridx].mhz / 100); -
trunk/csctapi/ifd_smartreader.c
r1650 r1719 14 14 #define LOBYTE(w) ((BYTE)((w) & 0xff)) 15 15 #define HIBYTE(w) ((BYTE)((w) >> 8)) 16 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 SR_CONFIG sr_config; 16 26 17 27 //The number of concurrent bulk reads to queue onto the smartreader … … 45 55 static int smartreader_set_latency_timer(S_READER *reader, unsigned short latency); 46 56 static void EnableSmartReader(S_READER *reader, int clock, unsigned short Fi, unsigned char Di, unsigned char Ni, unsigned char T,unsigned char inv, int parity); 47 static void ResetSmartReader(S_READER *reader);48 57 static void *ReaderThread(void *p); 49 58 … … 75 84 smartreader_init(reader); 76 85 77 reader->sr_config.usb_dev=find_smartreader(busname,devname);78 if(! reader->sr_config.usb_dev)86 sr_config.usb_dev=find_smartreader(busname,devname); 87 if(!sr_config.usb_dev) 79 88 return ERROR; 80 89 … … 84 93 //also a good way to compare a real FT232 with a smartreader 85 94 //if you enumarate usb devices 86 reader->sr_config.in_ep = 0x1;87 reader->sr_config.out_ep = 0x82;95 sr_config.in_ep = 0x1; 96 sr_config.out_ep = 0x82; 88 97 89 98 //open the first smartreader found in the system, this … … 113 122 114 123 // start the reading thread 115 reader->g_read_buffer_size = 0;116 reader->modem_status = 0 ;117 pthread_mutex_init(& reader->g_read_mutex,NULL);118 pthread_mutex_init(& reader->g_usb_mutex,NULL);119 ret = pthread_create(&r eader->rt, NULL, ReaderThread, (void *)(reader));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(&rt, NULL, ReaderThread, (void *)(reader)); 120 129 if (ret) { 121 130 cs_log("ERROR; return code from pthread_create() is %d", ret); … … 131 140 int state; 132 141 133 pthread_mutex_lock(& reader->g_read_mutex);134 state =( reader->modem_status & 0x80) == 0x80 ? 0 : 2;135 pthread_mutex_unlock(& reader->g_read_mutex);142 pthread_mutex_lock(&g_read_mutex); 143 state =(modem_status & 0x80) == 0x80 ? 0 : 2; 144 pthread_mutex_unlock(&g_read_mutex); 136 145 137 146 … … 157 166 158 167 if(reader->mhz==reader->cardmhz && reader->cardmhz*10000 > 3690000) 159 reader->sr_config.fs=reader->cardmhz*10000;168 sr_config.fs=reader->cardmhz*10000; 160 169 else 161 reader->sr_config.fs=3690000; 162 163 ResetSmartReader(reader); 170 sr_config.fs=3690000; 171 172 smart_flush(reader); 173 // set smartreader+ default values 174 sr_config.F=372; 175 sr_config.D=1.0; 176 if(reader->mhz==reader->cardmhz && reader->cardmhz*10000 > 3690000) 177 sr_config.fs=reader->cardmhz*10000; 178 else 179 sr_config.fs=3690000; 180 sr_config.N=0; 181 sr_config.T=0; 182 sr_config.inv=0; 183 164 184 for(i=0 ; i < 4 ;i++) { 165 reader->sr_config.irdeto=FALSE;185 sr_config.irdeto=FALSE; 166 186 atr_ok=ERROR; 167 187 memset(data,0,sizeof(data)); 168 reader->sr_config.parity=parity[i]; 169 170 cs_debug_mask (D_IFD,"IO:SR: Trying with parity %s",parity_str[reader->sr_config.parity]); 188 cs_debug_mask (D_IFD,"IO:SR: Trying with parity %s",parity_str[parity[i]]); 171 189 172 190 … … 174 192 if(i==3) { 175 193 cs_debug_mask (D_IFD,"IO:SR: Trying irdeto"); 176 177 reader->sr_config.F=618; /// magic smartreader value 178 reader->sr_config.D=1; 179 reader->sr_config.T=2; // will be set to T=1 in EnableSmartReader 180 reader->sr_config.irdeto=TRUE; 194 sr_config.F=618; /// magic smartreader value 195 sr_config.D=1; 196 sr_config.T=2; // will be set to T=1 in EnableSmartReader 197 sr_config.irdeto=TRUE; 181 198 } 182 199 183 200 smart_flush(reader); 184 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,reader->sr_config.parity);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]); 185 202 sched_yield(); 186 203 cs_sleepms(500); //smartreader in mouse mode needs this, so it might also be needed in native mode. … … 209 226 210 227 if(data[0]!=0x3B && data[0]!=0x03 && data[0]!=0x3F) { 211 reader->sr_config.irdeto=FALSE;228 sr_config.irdeto=FALSE; 212 229 continue; // this is not a valid ATR. 213 230 } … … 216 233 cs_debug_mask (D_IFD,"IO:SR: Inverse convention detected, setting smartreader inv to 1"); 217 234 218 reader->sr_config.inv=1;219 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,reader->sr_config.parity);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]); 220 237 } 221 238 // parse atr … … 225 242 if(i==3) { 226 243 cs_debug_mask (D_IFD,"IO:SR: Locking F and D for Irdeto mode"); 227 reader->sr_config.irdeto=TRUE;244 sr_config.irdeto=TRUE; 228 245 } 229 246 } … … 258 275 } 259 276 260 int SR_WriteSettings (struct s_reader *reader, unsigned short F, BYTE D, BYTE N, BYTE T )277 int SR_WriteSettings (struct s_reader *reader, unsigned short F, BYTE D, BYTE N, BYTE T, unsigned short convention) 261 278 { 262 279 // maintaining all this admin seems overdone, since after this init the values are nowhere needed … … 265 282 // reader[ridx].sr_config.N=N; 266 283 // reader[ridx].sr_config.T=T; 267 // reader->sr_config.fs=reader->mhz*10000; //freq in Hz */268 // 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);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); 269 286 270 287 // 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 routine 271 289 if (reader->mhz >=1600) reader->mhz = 1600; else 272 290 if (reader->mhz >=1200) reader->mhz = 1200; else … … 282 300 if (reader->mhz >=343) reader->mhz = 343; else 283 301 reader->mhz = 320; 284 EnableSmartReader(reader, reader->mhz, F, D, N, T, reader->sr_config.inv,reader->sr_config.parity);302 EnableSmartReader(reader, reader->mhz, F, D, N, T, sr_config.inv,sr_config.parity); 285 303 286 304 //baud rate not really used in native mode since … … 292 310 } 293 311 294 int SR_SetParity (struct s_reader *reader )312 int SR_SetParity (struct s_reader *reader, unsigned short parity) 295 313 { 296 314 int ret; 297 315 298 299 cs_debug_mask (D_IFD,"IO:SR: Setting parity to %s",parity_str[ reader->sr_config.parity]);300 301 ret = smartreader_set_line_property(reader, (enum smartreader_bits_type) 8, STOP_BIT_2, reader->sr_config.parity);316 char *parity_str[5]={"NONE", "ODD", "EVEN", "MARK", "SPACE"}; 317 cs_debug_mask (D_IFD,"IO:SR: Setting parity to %s",parity_str[parity]); 318 319 ret = smartreader_set_line_property(reader, (enum smartreader_bits_type) 8, STOP_BIT_2, parity); 302 320 if(ret) 303 321 return ERROR; … … 313 331 cs_debug_mask(D_IFD,"IO:SR: Closing smarteader\n"); 314 332 315 reader->sr_config.running=FALSE;316 pthread_join(r eader->rt,NULL);317 libusb_close( reader->sr_config.usb_dev_handle);333 sr_config.running=FALSE; 334 pthread_join(rt,NULL); 335 libusb_close(sr_config.usb_dev_handle); 318 336 libusb_exit(NULL); 319 337 return OK; … … 337 355 338 356 // command 1, set F and D parameter 339 if(! reader->sr_config.irdeto) {357 if(!sr_config.irdeto) { 340 358 cs_debug_mask (D_IFD,"IO:SR: sending F=%04X (%d) to smartreader",Fi,Fi); 341 359 cs_debug_mask (D_IFD,"IO:SR: sending D=%02X (%d) to smartreader",Di,Di); … … 366 384 367 385 // command 4 , set parameter T 368 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=0386 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=0 369 387 { 370 388 T=1; 371 reader->sr_config.T=1;389 sr_config.T=1; 372 390 } 373 391 else if (T==1) … … 391 409 392 410 smart_flush(reader); 393 }394 395 static void ResetSmartReader(S_READER *reader)396 {397 398 smart_flush(reader);399 // set smartreader+ default values400 reader->sr_config.F=372;401 reader->sr_config.D=1.0;402 if(reader->mhz==reader->cardmhz && reader->cardmhz*10000 > 3690000)403 reader->sr_config.fs=reader->cardmhz*10000;404 else405 reader->sr_config.fs=3690000;406 reader->sr_config.N=0;407 reader->sr_config.T=0;408 reader->sr_config.inv=0;409 410 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,reader->sr_config.parity);411 sched_yield();412 413 411 } 414 412 … … 507 505 void smartreader_init(S_READER *reader) 508 506 { 509 reader->sr_config.usb_dev = NULL;510 reader->sr_config.usb_dev_handle=NULL;511 reader->sr_config.usb_read_timeout = 10000;512 reader->sr_config.usb_write_timeout = 10000;513 514 reader->sr_config.type = TYPE_BM; /* chip type */515 reader->sr_config.baudrate = -1;516 reader->sr_config.bitbang_enabled = 0; /* 0: normal mode 1: any of the bitbang modes enabled */517 518 reader->sr_config.writebuffer_chunksize = 64;519 reader->sr_config.max_packet_size = 0;520 521 reader->sr_config.interface = INTERFACE_ANY;522 reader->sr_config.index = INTERFACE_A;523 reader->sr_config.in_ep = 0x02;524 reader->sr_config.out_ep = 0x82;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; 525 523 } 526 524 … … 538 536 // New hi-speed devices from FTDI use a packet size of 512 bytes 539 537 // but could be connected to a normal speed USB hub -> 64 bytes packet size. 540 if ( reader->sr_config.type == TYPE_2232H || reader->sr_config.type == TYPE_4232H)538 if (sr_config.type == TYPE_2232H || sr_config.type == TYPE_4232H) 541 539 packet_size = 512; 542 540 else 543 541 packet_size = 64; 544 542 545 ret = libusb_get_device_descriptor( reader->sr_config.usb_dev, &desc);543 ret = libusb_get_device_descriptor(sr_config.usb_dev, &desc); 546 544 if (ret < 0) { 547 545 cs_log("Smartreader : couldn't read device descriptor , using default packet size"); … … 550 548 if (desc.bNumConfigurations) 551 549 { 552 ret=libusb_get_active_config_descriptor( reader->sr_config.usb_dev,&configDesc);550 ret=libusb_get_active_config_descriptor(sr_config.usb_dev,&configDesc); 553 551 if(ret) { 554 552 cs_log("Smartreader : couldn't read config descriptor , using default packet size"); … … 556 554 } 557 555 558 if ( reader->sr_config.interface < configDesc->bNumInterfaces)556 if (sr_config.interface < configDesc->bNumInterfaces) 559 557 { 560 interface=configDesc->interface[ reader->sr_config.interface];558 interface=configDesc->interface[sr_config.interface]; 561 559 if (interface.num_altsetting > 0) 562 560 { … … 578 576 int ret = 0; 579 577 580 if ( reader->sr_config.usb_dev_handle)581 { 582 libusb_close ( reader->sr_config.usb_dev_handle);583 reader->sr_config.usb_dev_handle=NULL;578 if (sr_config.usb_dev_handle) 579 { 580 libusb_close (sr_config.usb_dev_handle); 581 sr_config.usb_dev_handle=NULL; 584 582 } 585 583 … … 590 588 int smartreader_usb_reset(S_READER *reader) 591 589 { 592 if (libusb_control_transfer( reader->sr_config.usb_dev_handle,590 if (libusb_control_transfer(sr_config.usb_dev_handle, 593 591 FTDI_DEVICE_OUT_REQTYPE, 594 592 SIO_RESET_REQUEST, 595 593 SIO_RESET_SIO, 596 reader->sr_config.index,594 sr_config.index, 597 595 NULL, 598 596 0, 599 reader->sr_config.usb_write_timeout) != 0) {597 sr_config.usb_write_timeout) != 0) { 600 598 cs_log("Smartreader reset failed"); 601 599 return (-1); … … 621 619 #endif 622 620 623 ret=libusb_open( reader->sr_config.usb_dev,&reader->sr_config.usb_dev_handle);621 ret=libusb_open(sr_config.usb_dev,&sr_config.usb_dev_handle); 624 622 if (ret) { 625 623 cs_log("Smartreader usb_open() failed"); … … 634 632 // detach operation might be denied and everything still works fine. 635 633 // Likely scenario is a static smartreader_sio kernel module. 636 if (libusb_detach_kernel_driver( reader->sr_config.usb_dev_handle, reader->sr_config.interface) != 0 && errno != ENODATA) {634 if (libusb_detach_kernel_driver(sr_config.usb_dev_handle, sr_config.interface) != 0 && errno != ENODATA) { 637 635 detach_errno = errno; 638 636 cs_log("Couldn't detach interface from kernel. Please unload the FTDI drivers"); … … 640 638 } 641 639 #endif 642 ret = libusb_get_device_descriptor( reader->sr_config.usb_dev, &desc);640 ret = libusb_get_device_descriptor(sr_config.usb_dev, &desc); 643 641 644 642 #ifdef __WIN32__ … … 649 647 if (desc.bNumConfigurations > 0) 650 648 { 651 ret=libusb_get_configuration( reader->sr_config.usb_dev_handle,&config);649 ret=libusb_get_configuration(sr_config.usb_dev_handle,&config); 652 650 653 651 // libusb-win32 on Windows 64 can return a null pointer for a valid device 654 if (libusb_set_configuration( reader->sr_config.usb_dev_handle, config) &&652 if (libusb_set_configuration(sr_config.usb_dev_handle, config) && 655 653 errno != EBUSY) 656 654 { … … 668 666 #endif 669 667 670 ret=libusb_claim_interface( reader->sr_config.usb_dev_handle, reader->sr_config.interface) ;668 ret=libusb_claim_interface(sr_config.usb_dev_handle, sr_config.interface) ; 671 669 if (ret!= 0) 672 670 { … … 692 690 if (desc.bcdDevice == 0x400 || (desc.bcdDevice == 0x200 693 691 && desc.iSerialNumber == 0)) 694 reader->sr_config.type = TYPE_BM;692 sr_config.type = TYPE_BM; 695 693 else if (desc.bcdDevice == 0x200) 696 reader->sr_config.type = TYPE_AM;694 sr_config.type = TYPE_AM; 697 695 else if (desc.bcdDevice == 0x500) 698 reader->sr_config.type = TYPE_2232C;696 sr_config.type = TYPE_2232C; 699 697 else if (desc.bcdDevice == 0x600) 700 reader->sr_config.type = TYPE_R;698 sr_config.type = TYPE_R; 701 699 else if (desc.bcdDevice == 0x700) 702 reader->sr_config.type = TYPE_2232H;700 sr_config.type = TYPE_2232H; 703 701 else if (desc.bcdDevice == 0x800) 704 reader->sr_config.type = TYPE_4232H;702 sr_config.type = TYPE_4232H; 705 703 706 704 // Set default interface on dual/quad type chips 707 switch( reader->sr_config.type) {705 switch(sr_config.type) { 708 706 case TYPE_2232C: 709 707 case TYPE_2232H: 710 708 case TYPE_4232H: 711 if (! reader->sr_config.index)712 reader->sr_config.index = INTERFACE_A;709 if (!sr_config.index) 710 sr_config.index = INTERFACE_A; 713 711 break; 714 712 default: … … 717 715 718 716 // Determine maximum packet size 719 reader->sr_config.max_packet_size = smartreader_determine_max_packet_size(reader);717 sr_config.max_packet_size = smartreader_determine_max_packet_size(reader); 720 718 721 719 if (smartreader_set_baudrate (reader, 9600) != 0) { … … 731 729 int smartreader_usb_purge_rx_buffer(S_READER *reader) 732 730 { 733 if (libusb_control_transfer( reader->sr_config.usb_dev_handle,731 if (libusb_control_transfer(sr_config.usb_dev_handle, 734 732 FTDI_DEVICE_OUT_REQTYPE, 735 733 SIO_RESET_REQUEST, 736 734 SIO_RESET_PURGE_RX, 737 reader->sr_config.index,735 sr_config.index, 738 736 NULL, 739 737 0, 740 reader->sr_config.usb_write_timeout) != 0) {738 sr_config.usb_write_timeout) != 0) { 741 739 cs_log("FTDI purge of RX buffer failed"); 742 740 return (-1); … … 749 747 int smartreader_usb_purge_tx_buffer(S_READER *reader) 750 748 { 751 if (libusb_control_transfer( reader->sr_config.usb_dev_handle,749 if (libusb_control_transfer(sr_config.usb_dev_handle, 752 750 FTDI_DEVICE_OUT_REQTYPE, 753 751 SIO_RESET_REQUEST, 754 752 SIO_RESET_PURGE_TX, 755 reader->sr_config.index,753 sr_config.index, 756 754 NULL, 757 755 0, 758 reader->sr_config.usb_write_timeout) != 0) {756 sr_config.usb_write_timeout) != 0) { 759 757 cs_log("FTDI purge of TX buffer failed"); 760 758 return (-1); … … 796 794 divisor = 24000000 / baudrate; 797 795 798 if ( reader->sr_config.type == TYPE_AM)796 if (sr_config.type == TYPE_AM) 799 797 { 800 798 // Round down to supported fraction (AM only) … … 818 816 try_divisor = 8; 819 817 } 820 else if ( reader->sr_config.type != TYPE_AM && try_divisor < 12)818 else if (sr_config.type != TYPE_AM && try_divisor < 12) 821 819 { 822 820 // BM doesn't support divisors 9 through 11 inclusive … … 830 828 else 831 829 { 832 if ( reader->sr_config.type == TYPE_AM)830 if (sr_config.type == TYPE_AM) 833 831 { 834 832 // Round up to supported fraction (AM only) … … 886 884 // Split into "value" and "index" values 887 885 *value = (unsigned short)(encoded_divisor & 0xFFFF); 888 if ( reader->sr_config.type == TYPE_2232C || reader->sr_config.type == TYPE_2232H || reader->sr_config.type == TYPE_4232H)886 if (sr_config.type == TYPE_2232C || sr_config.type == TYPE_2232H || sr_config.type == TYPE_4232H) 889 887 { 890 888 *index = (unsigned short)(encoded_divisor >> 8); 891 889 *index &= 0xFF00; 892 *index |= reader->sr_config.index;890 *index |= sr_config.index; 893 891 } 894 892 else … … 904 902 int actual_baudrate; 905 903 906 if ( reader->sr_config.bitbang_enabled)904 if (sr_config.bitbang_enabled) 907 905 { 908 906 baudrate = baudrate*4; … … 924 922 } 925 923 926 if (libusb_control_transfer( reader->sr_config.usb_dev_handle,924 if (libusb_control_transfer(sr_config.usb_dev_handle, 927 925 FTDI_DEVICE_OUT_REQTYPE, 928 926 SIO_SET_BAUDRATE_REQUEST, … … 931 929 NULL, 932 930 0, 933 reader->sr_config.usb_write_timeout) != 0) {931 sr_config.usb_write_timeout) != 0) { 934 932 cs_log("Setting new baudrate failed"); 935 933 return (-2); 936 934 } 937 935 938 reader->sr_config.baudrate = baudrate;936 sr_config.baudrate = baudrate; 939 937 return 0; 940 938 } … … 954 952 usb_val |= SIO_SET_RTS_LOW; 955 953 956 if (libusb_control_transfer( reader->sr_config.usb_dev_handle,954 if (libusb_control_transfer(sr_config.usb_dev_handle, 957 955 FTDI_DEVICE_OUT_REQTYPE, 958 956 SIO_SET_MODEM_CTRL_REQUEST, 959 957 usb_val, 960 reader->sr_config.index,958 sr_config.index, 961 959 NULL, 962 960 0, 963 reader->sr_config.usb_write_timeout) != 0) {961 sr_config.usb_write_timeout) != 0) { 964 962 cs_log("set of rts/dtr failed"); 965 963 return (-1); … … 971 969 int smartreader_setflowctrl(S_READER *reader, int flowctrl) 972 970 { 973 if (libusb_control_transfer( reader->sr_config.usb_dev_handle,971 if (libusb_control_transfer(sr_config.usb_dev_handle, 974 972 FTDI_DEVICE_OUT_REQTYPE, 975 973 SIO_SET_FLOW_CTRL_REQUEST, 976 974 0, 977 (flowctrl | reader->sr_config.index),975 (flowctrl | sr_config.index), 978 976 NULL, 979 977 0, 980 reader->sr_config.usb_write_timeout) != 0) {978 sr_config.usb_write_timeout) != 0) { 981 979 cs_log("set flow control failed"); 982 980 return (-1); … … 1034 1032 } 1035 1033 1036 if (libusb_control_transfer( reader->sr_config.usb_dev_handle,1034 if (libusb_control_transfer(sr_config.usb_dev_handle, 1037 1035 FTDI_DEVICE_OUT_REQTYPE, 1038 1036 SIO_SET_DATA_REQUEST, 1039 1037 value, 1040 reader->sr_config.index,1038 sr_config.index, 1041 1039 NULL, 1042 1040 0, 1043 reader->sr_config.usb_write_timeout) != 0) {1041 sr_config.usb_write_timeout) != 0) { 1044 1042 cs_log("Setting new line property failed"); 1045 1043 return (-1); … … 1063 1061 smartreader_usb_purge_buffers(reader); 1064 1062 1065 pthread_mutex_lock(& reader->g_read_mutex);1066 reader->g_read_buffer_size = 0;1067 pthread_mutex_unlock(& reader->g_read_mutex);1063 pthread_mutex_lock(&g_read_mutex); 1064 g_read_buffer_size = 0; 1065 pthread_mutex_unlock(&g_read_mutex); 1068 1066 sched_yield(); 1069 1067 } … … 1078 1076 1079 1077 while(total_read < size && dif.tv_sec < timeout_sec) { 1080 pthread_mutex_lock(& reader->g_read_mutex);1078 pthread_mutex_lock(&g_read_mutex); 1081 1079 1082 if( reader->g_read_buffer_size > 0) {1080 if(g_read_buffer_size > 0) { 1083 1081 1084 ret = reader->g_read_buffer_size > size-total_read ? size-total_read : reader->g_read_buffer_size;1085 memcpy(buff+total_read, reader->g_read_buffer,ret);1086 reader->g_read_buffer_size -= ret;1087 1088 if( reader->g_read_buffer_size > 0){1089 memcpy( reader->g_read_buffer, reader->g_read_buffer + ret, reader->g_read_buffer_size);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); 1090 1088 } 1091 1089 1092 1090 total_read+=ret; 1093 1091 } 1094 pthread_mutex_unlock(& reader->g_read_mutex);1092 pthread_mutex_unlock(&g_read_mutex); 1095 1093 1096 1094 gettimeofday(&now,NULL); … … 1116 1114 int written; 1117 1115 1118 if(size< reader->sr_config.writebuffer_chunksize)1116 if(size<sr_config.writebuffer_chunksize) 1119 1117 write_size=size; 1120 1118 else 1121 write_size = reader->sr_config.writebuffer_chunksize;1119 write_size = sr_config.writebuffer_chunksize; 1122 1120 1123 1121 while (offset < size) … … 1127 1125 write_size = size-offset; 1128 1126 1129 ret = libusb_bulk_transfer( reader->sr_config.usb_dev_handle,1130 reader->sr_config.in_ep,1127 ret = libusb_bulk_transfer(sr_config.usb_dev_handle, 1128 sr_config.in_ep, 1131 1129 buf+offset, 1132 1130 write_size, 1133 1131 &written, 1134 reader->sr_config.usb_write_timeout);1132 sr_config.usb_write_timeout); 1135 1133 if (ret < 0) { 1136 1134 cs_log("usb bulk write failed : ret = %d",ret); … … 1155 1153 1156 1154 usb_val = latency; 1157 if (libusb_control_transfer( reader->sr_config.usb_dev_handle,1155 if (libusb_control_transfer(sr_config.usb_dev_handle, 1158 1156 FTDI_DEVICE_OUT_REQTYPE, 1159 1157 SIO_SET_LATENCY_TIMER_REQUEST, 1160 1158 usb_val, 1161 reader->sr_config.index,1159 sr_config.index, 1162 1160 NULL, 1163 1161 0, 1164 reader->sr_config.usb_write_timeout) != 0) {1162 sr_config.usb_write_timeout) != 0) { 1165 1163 cs_log("unable to set latency timer"); 1166 1164 return (-2); … … 1207 1205 if(transfer->actual_length > 2) { //FTDI always sends modem status bytes as first 2 chars with the 232BM 1208 1206 1209 pthread_mutex_lock(& reader->g_read_mutex);1210 1211 if( reader->g_read_buffer_size == sizeof(reader->g_read_buffer)) {1207 pthread_mutex_lock(&g_read_mutex); 1208 1209 if(g_read_buffer_size == sizeof(g_read_buffer)) { 1212 1210 cs_log("IO:SR: buffer full\n"); 1213 1211 //if out read buffer is full then delay … … 1216 1214 if(ret!=0) 1217 1215 cs_log("IO:SR: submit async transfer failed with error %d\n",ret); 1218 pthread_mutex_unlock(& reader->g_read_mutex);1216 pthread_mutex_unlock(&g_read_mutex); 1219 1217 return; 1220 1218 } 1221 1219 1222 reader->modem_status = transfer->buffer[1];1223 copy_size = sizeof( reader->g_read_buffer) - reader->g_read_buffer_size > (unsigned int)transfer->actual_length-2 ? (unsigned int)transfer->actual_length-2: sizeof(reader->g_read_buffer) - reader->g_read_buffer_size;1224 memcpy( reader->g_read_buffer+reader->g_read_buffer_size,transfer->buffer+2,copy_size);1225 reader->g_read_buffer_size += copy_size;1226 pthread_mutex_unlock(& reader->g_read_mutex);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); 1227 1225 } 1228 1226 else { 1229 1227 if(transfer->actual_length==2) { 1230 pthread_mutex_lock(& reader->g_read_mutex);1231 reader->modem_status=transfer->buffer[1];1232 pthread_mutex_unlock(& reader->g_read_mutex);1228 pthread_mutex_lock(&g_read_mutex); 1229 modem_status=transfer->buffer[1]; 1230 pthread_mutex_unlock(&g_read_mutex); 1233 1231 } 1234 1232 } … … 1255 1253 1256 1254 reader = (struct s_reader *)p; 1257 reader->sr_config.running=TRUE;1255 sr_config.running=TRUE; 1258 1256 1259 1257 for(idx=0; idx<NUM_TXFERS; idx++) { … … 1261 1259 1262 1260 libusb_fill_bulk_transfer( usbt[idx], 1263 reader->sr_config.usb_dev_handle,1264 reader->sr_config.out_ep,1261 sr_config.usb_dev_handle, 1262 sr_config.out_ep, 1265 1263 usb_buffers[idx], 1266 1264 64, … … 1272 1270 } 1273 1271 1274 while( reader->sr_config.running) {1272 while(sr_config.running) { 1275 1273 ret = libusb_handle_events(NULL); 1276 1274 if(ret!=0) -
trunk/csctapi/ifd_smartreader.h
r1419 r1719 29 29 int SR_Receive (struct s_reader *reader, BYTE * buffer, unsigned size); 30 30 int SR_SetBaudrate (struct s_reader *reader); 31 int SR_SetParity (struct s_reader *reader );31 int SR_SetParity (struct s_reader *reader, unsigned short parity); 32 32 int SR_Close (struct s_reader *reader); 33 33 -
trunk/globals.h
r1718 r1719 524 524 DWORD dwActiveProtocol; 525 525 #endif 526 #if defined(LIBUSB)527 unsigned char g_read_buffer[4096];528 unsigned int g_read_buffer_size;529 pthread_mutex_t g_read_mutex;530 pthread_mutex_t g_usb_mutex;531 struct usb_device *smartreader_usb_dev;532 pthread_t rt;533 unsigned char modem_status;534 SR_CONFIG sr_config;535 #endif536 526 }; 537 527
Note:
See TracChangeset
for help on using the changeset viewer.