Changeset 684
- Timestamp:
- 12/04/09 17:54:09 (14 years ago)
- Location:
- branches/smartreader
- Files:
-
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/smartreader/csctapi/icc_async.c
r8 r684 69 69 70 70 /* Initialize Baudrate */ 71 // if (IFD_Towitoko_SetBaudrate (ifd, ICC_ASYNC_BAUDRATE)!= IFD_TOWITOKO_OK) 72 if (IFD_Towitoko_SetBaudrate (ifd, 9600)!= IFD_TOWITOKO_OK) 71 if (IFD_Towitoko_SetBaudrate (ifd, ICC_ASYNC_BAUDRATE)!= IFD_TOWITOKO_OK) 73 72 return ICC_ASYNC_IFD_ERROR; 74 73 … … 169 168 { 170 169 icc->baudrate = baudrate; 170 printf ("ENTERED SETBaudrate = %lu", baudrate); 171 171 172 172 return ICC_ASYNC_OK; … … 176 176 { 177 177 (*baudrate) = icc->baudrate; 178 printf ("ENTERED GetBaudrate = %lu", (*baudrate)); 178 179 179 180 return ICC_ASYNC_OK; -
branches/smartreader/csctapi/ifd_towitoko.c
r677 r684 790 790 if(ifd->io->reader_type == RTYP_SMART) 791 791 { 792 if((*atr) !=NULL && ret == IFD_TOWITOKO_OK && ifd->io!=NULL)792 if((*atr) && ret == IFD_TOWITOKO_OK && ifd->io) 793 793 { 794 794 if((ifd->io)->SmartReaderConf!=NULL) … … 812 812 } 813 813 } 814 else if (*atr) { //if valid ATR switch to post-ATR baudrate 815 double atrparam_f,atrparam_d; 816 if (ATR_GetParameter(*atr,ATR_PARAMETER_F,&atrparam_f)!=ATR_OK) { 817 cs_log ("Error getting ATR parameter (F)"); 818 ATR_Delete (*atr); 819 (*atr) = NULL; 820 return IFD_TOWITOKO_IO_ERROR; 821 } 822 if (ATR_GetParameter(*atr,ATR_PARAMETER_D,&atrparam_d)!=ATR_OK) { 823 cs_log ("Error getting ATR parameter (D)"); 824 ATR_Delete (*atr); 825 (*atr) = NULL; 826 return IFD_TOWITOKO_IO_ERROR; 827 } 828 829 if (atrparam_f && atrparam_d) { //both should be valid 830 int baudrate = (int)(IFD_TOWITOKO_BAUDRATE * ATR_DEFAULT_F * atrparam_d / atrparam_f); 831 832 if (baudrate != IFD_TOWITOKO_BAUDRATE) { 833 cs_debug("After ATR switching to baudrate %i. F=%.0f, D=%f",baudrate, atrparam_f, atrparam_d); 834 if (IFD_Towitoko_SetBaudrate (ifd, baudrate) != IFD_TOWITOKO_OK) //switch to baud, if error stay on normal baudrate 835 cs_debug("After ATR switching failed"); 836 } 837 } 838 } 839 814 840 return ret; 815 841 } -
branches/smartreader/globals.h
r660 r684 352 352 char device[128]; 353 353 int detect; 354 int mhz; //actual clock rate of reader in 10khz steps354 int mhz; //actual clock rate of reader in 10khz steps 355 355 int cardmhz; //standard clock speed your card should have in 10khz steps; normally 357 but for Irdeto cards 600 356 int custom_speed; //request immediate baudrate adaption after ATR; no PTS/PPS will be executed357 356 int r_port; 358 357 char r_usr[64]; -
branches/smartreader/oscam-config.c
r660 r684 1093 1093 if (!strcmp(token, "mhz")) { rdr->mhz=atoi(value); return; } 1094 1094 if (!strcmp(token, "cardmhz")) { rdr->cardmhz=atoi(value); return; } 1095 if (!strcmp(token, "customspeed")) { rdr->custom_speed=atoi(value); return; }1096 1095 if (!strcmp(token, "protocol")) 1097 1096 { … … 1174 1173 return; 1175 1174 } 1176 if (!strcmp(token, " version")) { // cccam version1175 if (!strcmp(token, "cccversion")) { // cccam version 1177 1176 if (strlen(value)>sizeof(rdr->cc_version)-1) { 1178 1177 fprintf(stderr, "cccam config: version too long\n"); … … 1183 1182 return; 1184 1183 } 1185 if (!strcmp(token, " build")) { // cccam build number1184 if (!strcmp(token, "cccbuild")) { // cccam build number 1186 1185 if (strlen(value)>sizeof(rdr->cc_build)-1) { 1187 1186 fprintf(stderr, "cccam config build number too long\n"); … … 1224 1223 reader[nr].mhz = 357; 1225 1224 reader[nr].cardmhz = 357; 1226 reader[nr].custom_speed = 1;1227 1225 strcpy(reader[nr].pincode, "none"); 1228 1226 for (i=1; i<CS_MAXCAIDTAB; reader[nr].ctab.mask[i++]=0xffff); -
branches/smartreader/reader-common.c
r636 r684 446 446 return(rc); 447 447 } 448 -
branches/smartreader/reader-nagra.c
r668 r684 25 25 // Card Status checks 26 26 #define HAS_CW ((cam_state[2]&6)==6) 27 #define RENEW_SESSIONKEY ((cam_state[0]& 64)==64 || (cam_state[0]&32)==32)27 #define RENEW_SESSIONKEY ((cam_state[0]&128)==128 || (cam_state[0]&64)==64 || (cam_state[0]&32)==32) 28 28 #define SENDDATETIME ((cam_state[0]&16)==16) 29 29 // Datatypes … … 36 36 #define MAX_REC 20 37 37 #define SYSTEM_NAGRA 0x1800 38 #define SYSTEM_MASK 0xFF00 38 39 39 40 unsigned char XorSum(const unsigned char *mem, int len) … … 304 305 305 306 // RSA data can never be bigger than the modulo 306 //decryptedRsaDT08[63] |= static_dt08[0] & 0x80;307 static_dt08[64] |= static_dt08[0] & 0x80; 307 308 308 309 // IdeaCamKey … … 461 462 } 462 463 463 int chk_caid(ushort caid, CAIDTAB *ctab) 464 465 int chk_caid(CAIDTAB *ctab) 464 466 { 465 467 int n; 466 468 for (n=0; (n<CS_MAXCAIDTAB); n++) 467 if (caid == ctab->caid[n]) 468 { 469 cs_debug("[nagra-reader] switching back to Betacrypt mode"); 470 return 1; 469 { 470 if ((ctab->caid[n]&SYSTEM_MASK)==SYSTEM_NAGRA && (ctab->caid[n]&0xFF)>0) 471 { 472 cs_debug("[nagra-reader] using nagra mode"); 473 return 1; 474 } 471 475 } 476 cs_debug("[nagra-reader] using irdeto mode"); 472 477 return 0; 473 478 } 474 int setBaudrate(void)475 {476 #ifdef OS_LINUX477 if (reader[ridx].typ != R_INTERN)478 {479 int bconst=B38400;480 int baud=115200 * reader[ridx].mhz/reader[ridx].cardmhz;481 482 int fd=open(reader[ridx].device,O_RDWR|O_NONBLOCK|O_NOCTTY);483 484 struct termios tio;485 memset(&tio,0,sizeof(tio));486 tio.c_cflag = (CS8 | CREAD | HUPCL | CLOCAL);487 tio.c_cflag |= CSTOPB;488 tio.c_iflag = (INPCK | BRKINT);489 tio.c_cc[VMIN] = 1;490 cfsetispeed(&tio,bconst);491 cfsetospeed(&tio,bconst);492 tio.c_cflag |= (PARENB | PARODD);493 494 struct serial_struct s;495 if(ioctl(fd,TIOCGSERIAL,&s)<0)496 {497 cs_log("%s: get serial failed: %s",reader[ridx].device,strerror(errno));498 return 0;499 }500 if(!tcsetattr(fd,TCSANOW,&tio))501 {502 if (reader[ridx].custom_speed)503 {504 s.custom_divisor=(s.baud_base+(baud/2))/baud;505 s.flags=(s.flags&~ASYNC_SPD_MASK) | ASYNC_SPD_CUST;506 cs_log ("%s: custom: baud_base=%d baud=%d divisor=%d -> effective baudrate %d (%+.2f%% off)",507 reader[ridx].device,s.baud_base,baud,s.custom_divisor,s.baud_base/s.custom_divisor,508 (float)(s.baud_base/s.custom_divisor-baud)/(float)baud);509 }510 else511 {512 s.flags &= ~ASYNC_SPD_CUST;513 cs_log ("%s: baud=%d", reader[ridx].device, 38400);514 }515 if(ioctl(fd,TIOCSSERIAL,&s)<0)516 {517 cs_log ("%s: set serial failed: %s",reader[ridx].device,strerror(errno));518 return 0;519 }520 }521 else522 {523 cs_log ("%s: tcsetattr failed: %s",reader[ridx].device,strerror(errno));524 return 0;525 }526 }527 #endif528 return 1;529 }530 479 531 480 int nagra2_card_init(uchar *atr, int atrlen) 532 481 { 533 482 memset(rom, 0, 15); 534 // hardcoded for testing only535 483 reader[ridx].nprov = 1; 536 484 memset (reader[ridx].sa, 0xff, sizeof (reader[ridx].sa)); … … 540 488 { 541 489 //if(SetIFS(0xFE) != 1) return 0; 542 if (!setBaudrate()) return 0;543 490 cs_debug("[nagra-reader] detect pure nagra card T1 protocol"); 544 491 is_pure_nagra=1; … … 547 494 else if (!memcmp(atr+4, "IRDETO", 6)) 548 495 { 496 /* 549 497 cs_debug("[nagra-reader] support for non native nagra cards not finished Switching back to irdeto mode"); 550 498 return 0; 551 /* 552 cs_debug("[nagra-reader] detect tunneled nagra card T14 protocol"); 499 */ 500 cs_debug("[nagra-reader] detect Irdeto tunneled nagra card"); 501 if(!chk_caid(&reader[ridx].ctab)) return 0; 553 502 is_pure_nagra=0; 554 503 if(!do_cmd(0x10,0x02,0x90,0x11,0)) … … 558 507 } 559 508 memcpy(rom,cta_res+2,15); 560 */561 509 } 562 510 else return 0; … … 583 531 if(!GetDataType(0x04,0x44,MAX_REC)) return 0; 584 532 cs_debug("[nagra-reader] DT04 DONE"); 585 if(!GetDataType(TIERS,0x57,MAX_REC)) return 0;586 cs_debug("[nagra-reader] TIERS DONE");587 533 if(!GetDataType(DT06,0x16,MAX_REC)) return 0; 588 534 cs_debug("[nagra-reader] DT06 DONE"); … … 599 545 int nagra2_card_info(void) 600 546 { 547 if(!GetDataType(TIERS,0x57,MAX_REC)) return 0; 548 cs_debug("[nagra-reader] TIERS DONE"); 601 549 cs_log("ROM: %c %c %c %c %c %c %c %c", rom[0], rom[1], rom[2],rom[3], rom[4], rom[5], rom[6], rom[7]); 602 550 cs_log("REV: %c %c %c %c %c %c %c", rom[8], rom[9], rom[10], rom[11], rom[12], rom[13], rom[14]); … … 609 557 int nagra2_do_ecm(ECM_REQUEST *er) 610 558 { 611 int retry; 559 if RENEW_SESSIONKEY NegotiateSessionKey(); 560 if SENDDATETIME DateTimeCMD(); 612 561 if(!do_cmd(er->ecm[3],er->ecm[4]+2,0x87,0x02, er->ecm+3+2)) 613 562 { … … 615 564 return (0); 616 565 } 617 cs_sleepms(100); 618 for(retry = 0;;retry++) 619 { 620 if(CamStateRequest()) break; 621 if( retry == 7 ) return 0; 622 } 566 //cs_sleepms(100); 567 CamStateRequest(); 623 568 624 569 if (HAS_CW && do_cmd(0x1C,0x02,0x9C,0x36,NULL)) … … 629 574 memset(v,0,sizeof(v)); 630 575 idea_cbc_encrypt(&cta_res[30],er->cw+8,8,&ksSession,v,IDEA_DECRYPT); 576 // after cw received. //Todo: Do not block!// 577 CamStateRequest(); 578 //cs_sleepms(20); 579 if RENEW_SESSIONKEY NegotiateSessionKey(); 580 if SENDDATETIME DateTimeCMD(); 631 581 return (1); 632 582 } -
branches/smartreader/reader-videoguard2.c
r636 r684 608 608 { 609 609 cs_log("Type: Videoguard Sky Italia"); 610 if (reader[ridx].custom_speed) {611 cs_log("Notice: for Sky Italia 'customspeed = 1' will not work; resetting to 'customspeed = 0'");612 reader[ridx].custom_speed = 0;613 }614 610 if (reader[ridx].mhz != 357) 615 611 cs_log("Warning: for Sky Italia currently only 'mhz = 357' is known to work! Device %s has mhz = %i",reader[ridx].device,reader[ridx].mhz); … … 634 630 { 635 631 cs_log("Type: Videoguard Sky Italia new (093B)"); 636 if (reader[ridx].custom_speed) {637 cs_log("Notice: for Sky Italia 'customspeed = 1' will not work; resetting to 'customspeed = 0'");638 reader[ridx].custom_speed = 0;639 }640 632 if (reader[ridx].mhz != 357) 641 633 cs_log("Warning: for Sky Italia currently only 'mhz = 357' is known to work! Device %s has mhz = %i",reader[ridx].device,reader[ridx].mhz); … … 652 644 //a non videoguard2/NDS card will fail on read_cmd_len(ins7401) 653 645 //this way also unknown videoguard2/NDS cards will work 654 655 656 #ifdef OS_LINUX657 if (reader[ridx].typ != R_INTERN) {658 int bconst=B38400;659 int baud=64516 * reader[ridx].mhz/reader[ridx].cardmhz;660 int fd=open(reader[ridx].device,O_RDWR|O_NONBLOCK|O_NOCTTY);661 662 struct termios tio;663 memset(&tio,0,sizeof(tio));664 tio.c_cflag = (CS8 | CREAD | HUPCL | CLOCAL);665 tio.c_cflag |= CSTOPB;666 tio.c_iflag = (INPCK | BRKINT);667 tio.c_cc[VMIN] = 1;668 cfsetispeed(&tio,bconst);669 cfsetospeed(&tio,bconst);670 tio.c_cflag |= (PARENB | PARODD);671 672 struct serial_struct s;673 if(ioctl(fd,TIOCGSERIAL,&s)<0) {674 cs_log("%s: get serial failed: %s",reader[ridx].device,strerror(errno));675 return 0;676 }677 if(!tcsetattr(fd,TCSANOW,&tio)) {678 if (reader[ridx].custom_speed) {679 s.custom_divisor=(s.baud_base+(baud/2))/baud;680 s.flags=(s.flags&~ASYNC_SPD_MASK) | ASYNC_SPD_CUST;681 cs_log ("%s: custom: baud_base=%d baud=%d divisor=%d -> effective baudrate %d (%+.2f%% off)",682 reader[ridx].device,s.baud_base,baud,s.custom_divisor,s.baud_base/s.custom_divisor,683 (float)(s.baud_base/s.custom_divisor-baud)/(float)baud);684 } else {685 s.flags &= ~ASYNC_SPD_CUST;686 cs_log ("%s: baud=%d", reader[ridx].device, 38400);687 }688 if(ioctl(fd,TIOCSSERIAL,&s)<0) {689 cs_log ("%s: set serial failed: %s",reader[ridx].device,strerror(errno));690 return 0;691 }692 }693 else {694 cs_log ("%s: tcsetattr failed: %s",reader[ridx].device,strerror(errno));695 return 0;696 }697 }698 #endif699 646 700 647 unsigned char ins7401[5] = { 0xD0,0x74,0x01,0x00,0x00 };
Note:
See TracChangeset
for help on using the changeset viewer.