📄 iccpdir.lst
字号:
361 3 }
362 2 SoftDelayCyl(ETU); // delay 2 etu
363 2
C51 COMPILER V8.00 ICCPDIR 04/23/2009 15:56:19 PAGE 7
364 2 starttime = GetTickCount();
365 2 mycharp = buf[i];
366 2
367 2 ///////////////////////////////////
368 2 // initialize for current byte
369 2 // get parity bit
370 2 ACC = mycharp;
371 2 TxParity = P;
372 2 if(!dir)
373 2 {
374 3 mycharp = ~mycharp;
375 3 TxParity = ~TxParity;
376 3 }
377 2
378 2 // clear parity error
379 2 parityerror = 0;
380 2 // clear endflag
381 2 endflag = 0;
382 2 // set bit counter
383 2 bitcounter = 8;
384 2
385 2 // disable receive interrupt
386 2 IccDisable(); // EX1 = 0;
387 2
388 2 disable(); // enter critical section
389 2 InitUserTimer(RLD, TxRLDStart);
390 2 StartSend();
391 2 enable(); // leave critical section
392 2
393 2 while(TxNotRx)
394 2 {
395 3 if(GetTickCount() - starttime >= TIME_OUT_MS)
396 3 {
397 4 TxNotRx = 0;
398 4 #if DEBUG_ICC
ComWrite("\xee", 1);
delay(3);
#endif
402 4 return i;
403 4 }
404 3 }
405 2 if(parityerror)
406 2 {
407 3 trytimes --;
408 3 if(!trytimes)
409 3 {
410 4 #if DEBUG_ICC
ComWrite("\xdd", 1);
delay(3);
#endif
414 4 return i;
415 4 }
416 3 else
417 3 i --;
418 3 }
419 2 //SoftDelayCyl(ETU); // delay 2 etu
420 2 }
421 1 return i;
422 1 }
423
424 void IccClear(void)
425 {
C51 COMPILER V8.00 ICCPDIR 04/23/2009 15:56:19 PAGE 8
426 1 ibufputidx = ibufgetidx;
427 1 RxWorking = 0;
428 1 TxNotRx = 0;
429 1 ICCIO = 1; // 输入状态
430 1
431 1 // if smart card
432 1 IccEnable();
433 1 // else do nothing
434 1 }
435
436 /*** set time out time in receiving a char from sam ***/
437 void IccSetTimeout(unsigned int ms)
438 {
439 1 TIME_OUT_MS = ms;
440 1 }
441
442
443 int IccOpen(char *buf) // ICC_INFO *info)
444 {
445 1 unsigned char data i, j;
446 1 unsigned char data format;
447 1 unsigned char data mylrc;
448 1 unsigned char data CWI, BWI;
449 1 unsigned char data inchar;
450 1 unsigned int data oldtmo;
451 1 unsigned char data nhistory;
452 1
453 1 if(0x03 == CardId)
454 1 {
455 2 ICCUSERSCLK = 0;
456 2 ICCUSERCLKC = 1;
457 2 }
458 1
459 1 ICCIO = 1;
460 1
461 1 mylrc = 0;
462 1 // info->protocolid = 0;
463 1 // info->infolen = INFOLEN;
464 1
465 1 oldtmo = TIME_OUT_MS;
466 1 TIME_OUT_MS = 1200;
467 1 IccEnable();
468 1
469 1 for(j=0; j<4; j++)
470 1 {
471 2 parityerrorcnt = 0;
472 2 attr[CardId].dir = 1;
473 2 dir = 1;
474 2
475 2 if(0x03 == CardId)
476 2 {
477 3 delay(10);
478 3 USERRST = 0;
479 3 delay(10);
480 3 IccClear();
481 3 fReset = 1;
482 3 USERRST = 1;
483 3 }
484 2 else
485 2 {
486 3 delay(10);
487 3 ICCRST = 0;
C51 COMPILER V8.00 ICCPDIR 04/23/2009 15:56:19 PAGE 9
488 3 delay(10);
489 3 IccClear();
490 3 fReset = 1;
491 3 ICCRST = 1;
492 3 }
493 2
494 2 i=IccRead(buf, 1); // TS
495 2 if (i < 1)
496 2 {
497 3 if(parityerrorcnt && attr[CardId].autob)
498 3 {
499 4 attr[CardId].etu ++;
500 4 IccInitETU(IccEtu[attr[CardId].etu]);
501 4 continue;
502 4 }
503 3 else
504 3 {
505 4 TIME_OUT_MS = oldtmo;
506 4 return 0;
507 4 }
508 3 }
509 2 else if(buf[0] == 0x3b)
510 2 {
511 3 break;
512 3 }
513 2 else if(buf[0] == 0x3f)
514 2 {
515 3 attr[CardId].dir = dir;
516 3 break;
517 3 }
518 2 else if(attr[CardId].autob && (j < 3))
519 2 {
520 3 attr[CardId].etu ++;
521 3 IccInitETU(IccEtu[attr[CardId].etu]);
522 3 continue;
523 3 }
524 2 else
525 2 {
526 3 TIME_OUT_MS = oldtmo;
527 3 return 0;
528 3 }
529 2 }
530 1 mylrc ^= buf[0];
531 1
532 1 j = 1;
533 1 i=IccRead(&format, 1); // TO /* T=0: format=0x69, T=1: 0xe9 */
534 1 if (i < 1)
535 1 {
536 2 TIME_OUT_MS = oldtmo;
537 2 return j;
538 2 }
539 1 mylrc ^= format;
540 1 buf[j++] = format;
541 1
542 1 nhistory = format & 0x0f;
543 1
544 1 if (format & 0x10)
545 1 {
546 2 /* TA1: ETU计算字符 */ /* T=0 and T=1 时不存在 */
547 2 i=IccRead(&inchar, 1);
548 2 if (i < 1)
549 2 {
C51 COMPILER V8.00 ICCPDIR 04/23/2009 15:56:19 PAGE 10
550 3 TIME_OUT_MS = oldtmo;
551 3 return j;
552 3 }
553 2 mylrc ^= inchar;
554 2 buf[j++] = inchar;
555 2 }
556 1 if (format & 0x20)
557 1 {
558 2 /* TB1: 编程电压Vpp信息 */ /* T=0 and T=1 时存在 */
559 2 i=IccRead(&inchar, 1);
560 2 if (i < 1)
561 2 {
562 3 TIME_OUT_MS = oldtmo;
563 3 return j;
564 3 }
565 2 mylrc ^= inchar;
566 2 buf[j++] = inchar;
567 2 // info->vpp = inchar;
568 2 }
569 1 if (format & 0x40)
570 1 {
571 2 /* TC1: 所需额外保护时间 */ /* T=0 and T=1 时存在 */
572 2 i=IccRead(&inchar, 1);
573 2 if (i < 1)
574 2 {
575 3 TIME_OUT_MS = oldtmo;
576 3 return j;
577 3 }
578 2 mylrc ^= inchar;
579 2 buf[j++] = inchar;
580 2 // info->guardtime = inchar;
581 2 }
582 1 if (format & 0x80)
583 1 {
584 2 /* TD1: 格式字符 */ /* T=1 时存在 */
585 2 i=IccRead(&format, 1);
586 2 if (i < 1)
587 2 {
588 3 TIME_OUT_MS = oldtmo;
589 3 return j;
590 3 }
591 2 mylrc ^= format;
592 2 buf[j++] = format;
593 2 // info->protocolid = format & 0x0f;
594 2
595 2 if (format & 0x10)
596 2 {
597 3 /* TA2: 模式选择 */
598 3 i=IccRead(&inchar, 1);
599 3 if (i < 1)
600 3 {
601 4 TIME_OUT_MS = oldtmo;
602 4 return j;
603 4 }
604 3 mylrc ^= inchar;
605 3 buf[j++] = inchar;
606 3 }
607 2 if (format & 0x20)
608 2 {
609 3 /* TB2: 编程电压 */
610 3 i=IccRead(&inchar, 1);
611 3 if (i < 1)
C51 COMPILER V8.00 ICCPDIR 04/23/2009 15:56:19 PAGE 11
612 3 {
613 4 TIME_OUT_MS = oldtmo;
614 4 return j;
615 4 }
616 3 mylrc ^= inchar;
617 3 buf[j++] = inchar;
618 3 }
619 2 if (format & 0x40)
620 2 {
621 3 /* TC2: 工作等待时间 */
622 3 i=IccRead(&inchar, 1);
623 3 if (i < 1)
624 3 {
625 4 TIME_OUT_MS = oldtmo;
626 4 return j;
627 4 }
628 3 mylrc ^= inchar;
629 3 buf[j++] = inchar;
630 3 }
631 2 if (format & 0x80)
632 2 {
633 3 /* TD2: 格式字符 */ /* T=1 时存在 */
634 3 i=IccRead(&format, 1);
635 3 if (i < 1)
636 3 {
637 4 TIME_OUT_MS = oldtmo;
638 4 return j;
639 4 }
640 3 mylrc ^= format;
641 3 buf[j++] = format;
642 3
643 3 /* SAM_T通讯协议 */
644 3 // info->protocolid = format & 0x0f;
645 3
646 3 if (format & 0x10)
647 3 {
648 4 /*TA3: IC卡信息域大小整数*/ /* T=1 时存在=0xb7 */
649 4 i=IccRead(&inchar, 1);
650 4 if (i < 1)
651 4 {
652 5 TIME_OUT_MS = oldtmo;
653 5 return j;
654 5 }
655 4 mylrc ^= inchar;
656 4 buf[j++] = inchar;
657 4 // info->infolen = inchar;
658 4 }
659 3 if (format & 0x20)
660 3 {
661 4 /*TB3: CWI和BWI*/ /* T=1 时存在=0x45 */
662 4 i=IccRead(&inchar, 1);
663 4 if (i < 1)
664 4 {
665 5 TIME_OUT_MS = oldtmo;
666 5 return j;
667 5 }
668 4 mylrc ^= inchar;
669 4 buf[j++] = inchar;
670 4 CWI = inchar >> 4;
671 4 BWI = inchar & 0x0f;
672 4 //计算CWT、BWT
673 4 }
C51 COMPILER V8.00 ICCPDIR 04/23/2009 15:56:19 PAGE 12
674 3 if (format & 0x40)
675 3 {
676 4 /*TC3: 块错误检测代码类型*/
677 4 i=IccRead(&inchar, 1);
678 4 if (i < 1)
679 4 {
680 5 TIME_OUT_MS = oldtmo;
681 5 return j;
682 5 }
683 4 mylrc ^= inchar;
684 4 buf[j++] = inchar;
685 4 }
686 3 }
687 2 }
688 1
689 1 i = IccRead(buf+j, nhistory); /* 获取历史字符 */
690 1 if(i < nhistory)
691 1 {
692 2 TIME_OUT_MS = oldtmo;
693 2 return j+i;
694 2 }
695 1
696 1 /*
697 1 if (info->protocolid != 0)
698 1 {
699 1 i = IccRead(&inchar, 1);
700 1 if(i < 1)
701 1 {
702 1 TIME_OUT_MS = oldtmo;
703 1 return 0;
704 1 }
705 1
706 1 for(i=0; i<info->historylen; i++)
707 1 mylrc ^= info->history[i];
708 1
709 1 if(mylrc != inchar) // 校验错误
710 1 {
711 1 TIME_OUT_MS = oldtmo;
712 1 return 0;
713 1 }
714 1 }
715 1 */
716 1
717 1 /*reset success*/
718 1 TIME_OUT_MS = oldtmo;
719 1 return j+nhistory;
720 1 }
721
722 /*** install etu for sam ***/
723 void IccInit(void)
724 {
725 1 // disable user power
726 1 IccUserPower(0);
727 1
728 1 // start sam clk
729 1 StartCLKO(2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -