找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4166|回复: 6
收起左侧

it6801_HDMI_driver_for_Hi3516D源程序

[复制链接]
ID:625958 发表于 2019-10-18 02:54 | 显示全部楼层 |阅读模式
it6801 Driver for Hi3516D.
0.png

源程序如下:
  1. #include "hdmirx.h"
  2. #include "io.h"
  3. #include "version.h"
  4. #include "EDID.h"

  5. #define DUMP_TIME 20

  6. BOOL ReadRXIntPin();

  7. void InitHDMIRX(BOOL bFullInit);
  8. BOOL CheckHDMIRX();
  9. void Initial8051Timer1();
  10. void InitUrt(void);
  11. int dump_vidmode();
  12. int dump_audSts();
  13. void dump_InfoFrame();
  14. /////////////////////////////////////////////////////
  15. // Global Data
  16. /////////////////////////////////////////////////////
  17. int xCntSum, xCntCnt ;

  18. #include <sys/time.h>

  19. void SleepX(int milli)
  20. {
  21.    
  22. struct timespec abstime,resttime;
  23.   memset(&abstime,0,sizeof(abstime));

  24.   memset(&resttime,0,sizeof(resttime));
  25.   //if (milli > 1000)
  26.   abstime.tv_sec = milli / 1000;
  27.   abstime.tv_nsec = (milli % 1000) * 1000000;
  28.   nanosleep(&abstime,&resttime);
  29. }


  30. int main(void)
  31. {
  32.     static BOOL bSignal ;
  33.     BOOL bOldSignal = -1, bChangeMode ;
  34.     int dump_count = 0 ;

  35.         printf("\n%s\n" , VERSION_STRING);

  36.     EnableHDMIRXVideoOutput(VIDEO_AUTO) ;
  37.     SelectHDMIPort(CAT_HDMI_PORTA);
  38.         InitHDMIRX(TRUE);



  39.     xCntCnt = 0 ;
  40.     xCntSum = 0 ;

  41.     while(1){

  42.            Check_HDMInterrupt();
  43.             
  44.         #if 0
  45.         // for switching to port B
  46.             hdmirx_clear_hpd();
  47.         EnableHDMIRXVideoOutput(VIDEO_AUTO) ;
  48.         SelectHDMIPort(CAT_HDMI_PORTB);
  49.             hdmirx_set_hpd();
  50.         #endif

  51.             if(1)
  52.             {
  53.             dump_count ++ ;

  54.                     //bOldSignal = bSignal ;
  55.                     bSignal = CheckHDMIRX();
  56.             printf("bSignal:%d bOldSignal:%d\n",bSignal, bOldSignal);
  57.                     bChangeMode = (bSignal != bOldSignal);


  58.             if(bChangeMode)
  59.             {
  60.                 // if Changed Mode ...
  61.                     if(bSignal)
  62.                     {
  63.                         // if signal is TRUE , then ...
  64.                     dump_vidmode();
  65.                                         if( IsHDMIRXHDMIMode() ) dump_InfoFrame() ;
  66.                     dump_audSts();
  67.                     }
  68.                     else
  69.                     {
  70.                         // if signal is FALSE , then ...
  71.                     xCntCnt = 0 ;
  72.                     xCntSum = 0 ;

  73.                     }
  74.                // SetHDMIRXVideoOutputFormat(0x20, 0x00, 0x1);   
  75.                             bChangeMode = FALSE ; // clear bChange Mode action
  76.             }
  77.             else
  78.             {
  79.                 // if not change mode, ...
  80.                     if(bSignal)
  81.                     {
  82.                         // if signal is TRUE , then ...
  83.                         if( (dump_count % 20) == 1 )
  84.                         {
  85.                         xCntCnt ++ ;
  86.                         xCntSum += getHDMIRXxCnt() ;
  87.                         if( xCntCnt > 40 )
  88.                         {
  89.                             xCntCnt /= 2 ;
  90.                             xCntSum /= 2 ;
  91.                         }

  92.                         }
  93.                     }
  94.                     else
  95.                     {
  96.                         // if signal is FALSE , then ...
  97.                     xCntCnt = 0 ;
  98.                     xCntSum = 0 ;
  99.                     }
  100.             }

  101.             if( dump_count > (DUMP_TIME*1000/20) )
  102.             {
  103.                 dump_count = 0 ;
  104.                 if( bSignal )
  105.                 {
  106.                     dump_vidmode();
  107.                     if( IsHDMIRXHDMIMode() ) dump_InfoFrame() ;
  108.                                         dump_audSts();

  109.                 }
  110.                 else
  111.                 {
  112.                     printf("There is no signal: Reg10 = %02X Reg12 = %02X Reg64 = %02X Reg65 = %02X\n"
  113.                         ,(int)HDMIRX_ReadI2C_Byte(0x10)
  114.                         ,(int)HDMIRX_ReadI2C_Byte(0x12)
  115.                         ,(int)HDMIRX_ReadI2C_Byte(0x64)
  116.                         ,(int)HDMIRX_ReadI2C_Byte(0x65) ) ;
  117.                 }
  118.                 printf("\n\n") ;
  119.                 DumpHDMIRXReg();
  120.             }
  121.             }
  122.         sleep(1);

  123.     }
  124.         return 0;
  125. }

  126. int dump_vidmode()
  127. {
  128.     USHORT HActive, VActive ;
  129.     USHORT HTotal, VTotal ;
  130.     ULONG HFreq, VFreq ;
  131.     ULONG PCLK ;

  132.     xCntCnt ++ ;
  133.     xCntSum += getHDMIRXxCnt() ;

  134.     HActive = getHDMIRXHorzActive() ;
  135.     VActive = getHDMIRXVertActive() ;
  136.     HTotal = getHDMIRXHorzTotal() ;
  137.     VTotal = getHDMIRXVertTotal() ;

  138.     PCLK = 27000L * 128;
  139.     PCLK *= (ULONG) xCntCnt ;
  140.     PCLK /= (ULONG) xCntSum ;
  141.     PCLK *= 1000L ; // 100*PCLK ;

  142.     HFreq = PCLK / (ULONG)HTotal ; // HFreq
  143.     VFreq = (HFreq*100) / (ULONG)VTotal ; // VFreq * 100


  144.         printf("\n========================================================================\n") ;
  145.         printf("%s mode\n",IsHDMIRXHDMIMode()?"HDMI":"DVI") ;
  146.     printf("Mode - %dx%d@",HActive,VActive);
  147.     printf("%ld.%02ldHz",VFreq/100,VFreq%100) ;
  148.     switch(getHDMIRXOutputColorDepth())
  149.     {
  150.     case 0x7: printf("@48bits") ; break ;
  151.     case 0x6: printf("@36bits") ; break ;
  152.     case 0x5: printf("@30bits") ; break ;
  153.     case 0x4: printf("@24bits") ; break ;
  154.     default: printf("@No def(24bits)") ; break ;
  155.     }
  156.     printf(", PCLK = %ld.%02ldMHz", PCLK/1000000, (PCLK/10000)%100) ;
  157.     PCLK = xCntSum ;
  158.     PCLK *= 100 ;
  159.     PCLK /= xCntCnt ;
  160.     PCLK -= (ULONG)(xCntSum / xCntCnt)*100 ;
  161.     printf(",xCnt= %d.%02ld\n", xCntSum/xCntCnt,PCLK) ;

  162.     printf("<%4dx%4d>,",HTotal,VTotal);

  163.     printf("H:(%d,%d,%d),"
  164.                 ,getHDMIRXHorzFrontPorch()
  165.             ,getHDMIRXHorzSyncWidth()
  166.             ,getHDMIRXHorzBackPorch());

  167.     printf("V:(%d,%d,%d), "
  168.                 ,getHDMIRXVertFrontPorch()
  169.             ,getHDMIRXVertSyncWidth()
  170.             ,getHDMIRXVertSyncBackPorch());

  171.     printf("VSyncToDE = %d\n",getHDMIRXVertSyncToDE());
  172.         printf("========================================================================\n") ;
  173.     printf("HDCP %s\n",IsHDCPOn()?"ON":"OFF") ;
  174.         printf("========================================================================\n") ;
  175. }

  176. int dump_audSts()
  177. {
  178.     BYTE audio_status ;

  179.         printf("\n========================================================================\n") ;
  180.     audio_status = getHDMIRXAudioStatus() ;
  181.     if( (audio_status & T_AUDIO_MASK)!=T_AUDIO_OFF )
  182.     {
  183.         BYTE ch[5] ;
  184.         if( audio_status == T_AUDIO_HBR )
  185.         {
  186.             printf("Audio input is HBR (High Bit Rate) audio.\n") ;
  187.         }
  188.         else if( audio_status == T_AUDIO_DSD )
  189.         {
  190.             printf("Audio input is DSD (One Bit Audio) audio.\n") ;
  191.         }
  192.         else
  193.         {
  194.             if( audio_status & T_AUDIO_NLPCM )
  195.             {
  196.                 printf("Audio input is IEC 61937 compressed audio.\n") ;
  197.             }
  198.             else
  199.             {
  200.                 printf("Audio input is IEC 60958 linear PCM audio.\n") ;
  201.             }

  202.             setHDMIRX_I2SOutput(0x1);
  203.             printf("layout %d, ",(audio_status & F_AUDIO_LAYOUT_1)?1:0) ;
  204.             printf("%d source\n", (USHORT)audio_status & 7) ;

  205.             getHDMIRXAudioChannelStatus(ch) ;
  206.             printf("Channel Status: %02X %02X %02X %02X %02X\n",(int)ch[0],(int)ch[1],(int)ch[2],(int)ch[3],(int)ch[4]) ;
  207.         }
  208.     }
  209.     else
  210.     {
  211.         printf("No Audio.\n") ;
  212.     }
  213.         printf("========================================================================\n") ;
  214. }

  215. void
  216. dump_InfoFrame()
  217. {
  218.     BYTE INFOFRAME[31] ;
  219.     int i ;


  220.     if( GetAVIInfoFrame(INFOFRAME) )
  221.     {
  222.         printf("GetAVIInfoFrame():") ;
  223.         for( i = 0 ; i <= (3+(INFOFRAME[2] & 0x1F)) ; i++ )
  224.         {
  225.             printf(" %02X",(int)INFOFRAME[i]) ;
  226.         }
  227.         printf("\n") ;
  228.     }
  229.     else
  230.     {
  231.         printf("Cannot get AVI Infoframe()\n") ;
  232.     }



  233. ……………………

  234. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
it6801_HDMI_driver_for_Hi3516D.zip (55.52 KB, 下载次数: 40)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:747485 发表于 2020-5-9 11:11 | 显示全部楼层
个人觉得这个片子可支持4K高清视频,可完全补充海思处理器接口定制的鸡肋
回复

使用道具 举报

ID:841623 发表于 2020-11-10 17:01 | 显示全部楼层
mark it .download later.
回复

使用道具 举报

ID:956718 发表于 2021-7-27 09:53 | 显示全部楼层

mark it .download later too。
回复

使用道具 举报

ID:958310 发表于 2021-8-3 15:11 | 显示全部楼层
我的天,这里也有搞海思的老哥啊
回复

使用道具 举报

ID:694326 发表于 2021-10-31 16:20 | 显示全部楼层
mark it .download later.
回复

使用道具 举报

ID:909736 发表于 2024-7-31 19:03 来自手机 | 显示全部楼层
mark it
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表