📄 modectrl.lst
字号:
490 5 m_dwBuff[0] = m_dwBuff[1];
491 5 EepPrivate.cAltID = m_cBuff[0];
492 5 }
493 4 }
494 3 }
495 2 }
496 1
497 1 if (EepPrivate.cAltID == 0xff)
498 1 return FALSE;
499 1 else
500 1 return TRUE;
501 1 }
502
503
504 void SetModeCaptureData(uWORD wHTotal, uWORD wHsst, uCHAR cVsst, uCHAR cVCO)
505 {
506 1 //~ Set PLL Freq. ~//
507 1 I2CWriteByte(TW803_P0, ADC_PLLDIV_H, (cVCO&0x01)<<6);
508 1 //~ Set PLL Divider 0x16[3~0],0x15[7~0] ~//
509 1 I2CWriteByte(TW803_P0, ADC_PLLDIV_H, ((I2CReadByte(TW803_P0, ADC_PLLDIV_H)&0xF0)|((uCHAR)(wHTotal>> 8))))
-;
510 1 I2CWriteByte(TW803_P0, ADC_PLLDIV_L, (uCHAR)(wHTotal));
511 1 //~ Set VCO and Charge Pump ~//
512 1 I2CWriteByte(TW803_P0, ADC_VCOCP, cVCO&0xFE);
513 1 //~ Set ADC Capture HSync Back Proch 0x4C, 0x4D ~//
514 1 I2CWriteByte(TW803_P0, HSST_L, (uCHAR)wHsst);
515 1 I2CWriteByte(TW803_P0, HSST_H, (uCHAR)(wHsst>>8));
516 1
517 1 //~ Set ADC Capture VSync Back Proch 0x4E, 0x4F ~//
518 1 I2CWriteByte(TW803_P0, VSST_L, (uCHAR)cVsst);
519 1 I2CWriteByte(TW803_P0, VSST_H, (uCHAR)(cVsst >> 8));
520 1
521 1 //~ Set ADC Capture HSize 0x48, 0x49 ~//
522 1 I2CWriteByte(TW803_P0, HATVC_L, (uCHAR)m_pResolutionPtr->wHRes);
523 1 I2CWriteByte(TW803_P0, HATVC_H, (uCHAR)(m_pResolutionPtr->wHRes>>8));
524 1 //~ Set ADC Capture VSize 0x4A, 0x4B ~//
525 1 I2CWriteByte(TW803_P0, VATVR_L, (uCHAR)m_pResolutionPtr->wVRes);
526 1 I2CWriteByte(TW803_P0, VATVR_H, (uCHAR)(m_pResolutionPtr->wVRes>>8));
527 1 }
528
529
530 void GetModeCaptureData(void)
531 {
532 1 if(m_bAlt)
533 1 {
534 2 m_pAltHTotalPtr = &AltHTotals[EepPrivate.cAltID];
535 2 m_cBuff[0] = m_pAltHTotalPtr->cResID;
536 2 m_pResolutionPtr = &ResolutionTable[m_cBuff[0]];
537 2 EepPrivate.wHTotal = m_pAltHTotalPtr->wHTotal;
538 2 m_wHRes = m_pResolutionPtr->wHRes;
539 2 m_wVRes = m_pResolutionPtr->wVRes;
540 2 m_cBuff[0] = m_pAltHTotalPtr->cModeFlags; //VCO & Charge Pump
C51 COMPILER V7.50 MODECTRL 10/30/2006 16:14:45 PAGE 10
541 2 }
542 1 else
543 1 {
544 2 m_pModeDescriptorPtr = &ModeTable[EepPrivate.cModeID];
545 2
546 2 m_cBuff[0] = m_pModeDescriptorPtr->cResID;
547 2 m_pResolutionPtr = &ResolutionTable[m_cBuff[0]];
548 2 EepPrivate.wHTotal = m_pModeDescriptorPtr->wHTotal;
549 2 m_wHRes = m_pResolutionPtr->wHRes;
550 2 m_wVRes = m_pResolutionPtr->wVRes;
551 2 m_cBuff[0] = m_pModeDescriptorPtr->cModeFlags2; //VCO & Charge Pump
552 2 }
553 1 /* Ruby 2005 11 01
554 1 if (m_cModeStatus & ADCHIGHRANGE)
555 1 {
556 1 EepPrivate.wHTotal /= 2;
557 1 m_wHRes /= 2;
558 1 }
559 1
560 1 if (m_cModeStatus & ADCLOWRANGE)
561 1 {
562 1 EepPrivate.wHTotal *= 2;
563 1 m_wHRes *= 2;
564 1 }
565 1 */
566 1 if(m_bInterlaced)
567 1 {
568 2 m_wVRes /= 2;
569 2 }
570 1
571 1
572 1 }
573
574 //Only used in analog inputs
575 void SetupMode(void)
576 {
577 1 if(!m_bDigital)
578 1 {
579 2 if(I2CReadByte(TW803_P0, 0x3F)&0x10)
580 2 I2CWriteByte(TW803_P0, 0x63, 0xCF);
581 2 else
582 2 I2CWriteByte(TW803_P0, 0x63, 0x40);
583 2 }
584 1
585 1 GetModeCaptureData();
586 1 //m_cBuff[0] saved VCO&Charge Pump
587 1 SetModeCaptureData(EepPrivate.wHTotal, FIXEDHSST, FIXEDVSST, m_cBuff[0]);
588 1
589 1 }
590
591
592 #define MINVRES 0x0000
593 #define MAXVRES 0xFFFF
594 BOOL GetVResolution(void)
595 {
596 1 //How to define THRESHOLD is a question mark, need confirm later.
597 1 McWaitReady(0x04, 0x08);
598 1
599 1 //start data
600 1 m_wBuff[0] = I2CReadByte(TW803_P0, POS_TB_H);
601 1 m_wBuff[0] <<= 8;
602 1 m_wBuff[0] |= I2CReadByte(TW803_P0, POS_TB_L);
C51 COMPILER V7.50 MODECTRL 10/30/2006 16:14:45 PAGE 11
603 1
604 1 //end data
605 1 m_wBuff[1] = I2CReadByte(TW803_P0, POS_BB_H);
606 1 m_wBuff[1] <<= 8;
607 1 m_wBuff[1] |= I2CReadByte(TW803_P0, POS_BB_L);
608 1
609 1 m_wVRes = m_wBuff[1] - m_wBuff[0] + 1;
610 1
611 1
612 1 return FALSE;
613 1
614 1 //How can I know the VRes is valid or not, inputs depend on input pattern
615 1 if (m_wVRes >= MINVRES && m_wVRes <= MAXVRES)
616 1 return TRUE;
617 1 else
618 1 return FALSE;
619 1 }
620
621
622
623 void GetModeInfo(uWORD *wVTotal, uWORD *wHPeriodCount, uDWORD dwFrameCnt)
624 {
625 1 uWORD wTemp;
626 1 int i;
627 1
628 1 //~ Get HSync period. ~//
629 1 I2CWriteByte(TW803_P0, 0x14, I2CReadByte(TW803_P0, 0x14)&0xEF); // Disable HSo source from PLL.
630 1 I2CWriteByte(TW803_P0, 0x16, I2CReadByte(TW803_P0, 0x16)|0x04); // Set PLL divider default value.
631 1 wTemp=0;
632 1 for(i=0; i<30; i++)
633 1 {
634 2 twdDelay1(10);
635 2 *wHPeriodCount = I2CReadByte(TW803_P0, HS_PERIOD_H);
636 2 *wHPeriodCount <<= 8;
637 2 *wHPeriodCount += I2CReadByte(TW803_P0, HS_PERIOD_L);
638 2 if((wTemp&0xFF00)==((*wHPeriodCount)&0xFF00))
639 2 break;
640 2 else
641 2 wTemp = *wHPeriodCount;
642 2 }
643 1 wTemp = dwFrameCnt * 32 * 10 / (*wHPeriodCount);
644 1 if(wTemp % 10 >= 9)
645 1 m_wBuff[0] = wTemp/10 + 1;
646 1 else
647 1 m_wBuff[0] = wTemp/10;
648 1
649 1 *wVTotal = m_wBuff[0];
650 1 I2CWriteByte(TW803_P0, 0x14, I2CReadByte(TW803_P0, 0x14)|(~0xEF)); // Enable HSo source from PLL.
651 1 }
652
653
654
655
656 // ================================================================
657 // McPolDetect Kevin Hsu. Mar. 2th, 2006
658 // ================================================================
659 // Description: Detect VSyn and HSyn polarity.
660 // Output: VGA sync. type.
661 // ---------------------------------------------------------------
662 uCHAR McPolDetect(void)
663 {
664 1 I2CWriteByte(TW803_P0, 0x10, I2CReadByte(TW803_P0, 0x10)|0x10);
C51 COMPILER V7.50 MODECTRL 10/30/2006 16:14:45 PAGE 12
665 1 m_cBuff[0] = I2CReadByte(TW803_P0, 0x10)>>6;
666 1 return m_cBuff[0]&0x03;
667 1 }
668
669 BOOL McWaitReady(uCHAR cEnableBit, uCHAR cReadyBit)
670 {
671 1 I2CWriteByte(TW803_P0, 0x50, I2CReadByte(TW803_P0, 0x50)|cEnableBit);
672 1
673 1 m_cBuff[0] = 0xFF;
674 1 while(m_cBuff[0]--)
675 1 {
676 2 twdDelay(1);
677 2 if(I2CReadByte(TW803_P0, 0x50)&cReadyBit)
678 2 break;
679 2 }
680 1 //Disable Enable bit for next sync coming in
681 1 I2CWriteByte(TW803_P0, 0x50, I2CReadByte(TW803_P0, 0x50)&~(cEnableBit|cReadyBit));
682 1 if(m_cBuff[0]) return TRUE;
683 1 else return FALSE;
684 1 }
685
686
687 // ================================================================
688 // GetInputVSyncXclkCnt Kevin Hsu. Mar. 7th, 2006
689 // ================================================================
690 // Description: Get VSync. period
691 // Output: dwVSyncCount : VSync period.
692 // ---------------------------------------------------------------
693 uDWORD GetInputVSyncXclkCnt(void)
694 {
695 1 uDWORD dwVSyncCount;
696 1
697 1 I2CWriteByte(TW803_P0, 0x14, I2CReadByte(TW803_P0, 0x14)&0xEF); // Disable HSo source from PLL.
698 1
699 1 m_dwBuff[0] = 0;
700 1 m_cBuff[1]=20;
701 1 RECHECK:
702 1 twdDelay(100);
703 1 m_cBuff[1]--;
704 1 m_cBuff[0] = I2CReadByte(TW803_P0, 0x50);
705 1 I2CWriteByte(TW803_P0, 0x50, m_cBuff[0] | 0x10); //Enable VSYNC counter
706 1 m_cBuff[0] = 100;
707 1 while(m_cBuff[0]--)
708 1 {
709 2 twdDelay(1);
710 2 if ((I2CReadByte(TW803_P0, 0x50)&0x20)) //V sync counter is done exit
711 2 break;
712 2 }
713 1 m_cBuff[0] = I2CReadByte(TW803_P0, 0x50);
714 1 m_cBuff[0] &= 0xCF; //Disable Auto Position
715 1 I2CWriteByte(TW803_P0, 0x50, m_cBuff[0]);
716 1
717 1 dwVSyncCount = I2CReadByte(TW803_P0, 0x53);
718 1 dwVSyncCount <<= 8;
719 1 dwVSyncCount |= I2CReadByte(TW803_P0, 0x52);
720 1 dwVSyncCount <<= 8;
721 1 dwVSyncCount |= I2CReadByte(TW803_P0, 0x51);
722 1 if((m_dwBuff[0]&0xFFFF00)!=(dwVSyncCount&0xFFFF00))
723 1 {
724 2 m_dwBuff[0] = dwVSyncCount;
725 2 if(m_cBuff[1])
726 2 goto RECHECK;
C51 COMPILER V7.50 MODECTRL 10/30/2006 16:14:45 PAGE 13
727 2 }
728 1 I2CWriteByte(TW803_P0, 0x14, I2CReadByte(TW803_P0, 0x14)|(~0xEF)); // Enable HSo source from PLL.
729 1 return dwVSyncCount;
730 1 }
731 void VGAScaling(void)
732 {
733 1 float x;
734 1 m_wBuff[0] = I2CReadByte(TW803_P0, 0x59);
735 1 m_wBuff[0] <<= 8;
736 1 m_wBuff[0] |= I2CReadByte(TW803_P0, 0x58);
737 1
738 1 switch(m_cDspPllSwitch)
739 1 {
740 2 case DSPPLL_100:x=DNDIV_100;break;
741 2 case DSPPLL_108:x=DNDIV_108;break;
742 2 case DSPPLL_120:x=DNDIV_120;break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -