全志平台boot里TVD倒车显示功能开发

本文详细介绍了在全志平台上开发TVD倒车显示功能的过程,包括加载驱动、设置设备参数、配置CLK和控制TVD模块寄存器。在驱动安装后,文章还提及了如何初始化显示模块并设置显示参数,确保图像正确输出。在完成倒车显示后,还应注意关闭显示和卸载驱动。
摘要由CSDN通过智能技术生成
倒车显示分两个部分,前端处理好视频输入信号,准备好内容,后端显示驱动再来把内容显示到LCD上。很明显,前端是TVD模块来处理的,后端是有DE模块来处理的,我们接下来先分析一下TVD模块怎么工作的。

      首先,需要加载驱动打开设备驱动,如果有需要还可以执行IOCTL操作,跟在linux系统里操作驱动的IOCTL类似。代码如下:

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/

[plain] view plain copy
  1. ret = wBoot_driver_install("c:\\drv_tvd.drv");  
  2. if(ret != 0)  
  3. {  
  4.     DMSG_PANIC("ERR: wBoot_driver_install drv_tvd driver failed\n");  
  5.     return -1;  
  6. }  
  7.   
  8.    ret = wBoot_script_parser_fetch("tvin_para", "tvin_reverse_channel_num", &reverseChannel, 1);  
  9. if(ret)  
  10. {  
  11.     __inf("unable to find tvin_para tvin_reverse_channel_num value\n");  
  12. }  
  13.   
  14.   
  15. __inf("BoardInit_TVD: reverseChannel=%x\n", reverseChannel);  
  16. TVDTransferToDRVInfo.ch = reverseChannel;  
  17. //open tvd devices , we transfer some TVD parameter to driver  
  18. tvd_hd = wBoot_driver_open(EGON2_EMOD_TYPE_DRV_TVD, &TVDTransferToDRVInfo);  
  19. if(tvd_hd == NULL)  
  20. {  
  21.     DMSG_PANIC("ERR: open drv_tvd driver failed\n");  
  22.     return -1;  
  23. }  

       加载驱动会执行到init接口,打开设备的时候会执行open接口,对应接口在上一篇文章中有介绍到。那么,我们可以再open的接口里对TVD    模块做一些必要的设置,当然一些模块的参数,我们可以再open的时候传给TVD的驱动,也就是传给DRV_TVD_OPEN函数接口。笔者根据需要传了一些控制参数进去,比如选择的TVD channel通道号,因为TVD有4个channel;显示的视频信号格式是NTSC信号还是PAL的信号,这样可以加快初始化,加快出正确的图像;以及Y/C的buffer地址,这里是为了让display这边方便的拿到显示buffer的地址,当然申请buffer放到TVD驱动里也是可以的,但是对应显示驱动就得晚于TVD驱动执行,这个问题其实也有人写一个固定的安全内存地址,其实也可以,只是感觉不灵活。

      下面就说说TVD的具体驱动,首先TVD需要设置的是CLK,没有CLK什么都是扯,主要是ahb bus、tvd模块、DRAM、PLL3  VIDEO相关的clock,大致如下:

[objc] view plain copy
  1.     ccm_clock_disable(TVD_CKID);  
  2.     ccm_clock_enable(TVD_CKID);  
  3.     set_wbit(CCM_DRAMCLK_GATE_CTRL, 0x1U<<4);//tvd  
  4.     if(mode<4)  
  5.     {  
  6.         put_wvalue(CCM_PLL3_VIDEO_CTRL,0x80105000);  
  7.         put_wvalue(CCM_TVD_SCLK_CTRL,0x8000800a);  
  8.     }  
  9.     else  
  10.     {  
  11.         put_wvalue(CCM_PLL3_VIDEO_CTRL,0x8010905a);  
  12.         put_wvalue(CCM_TVD_SCLK_CTRL,0x80008004);  
  13.     }  
  14.   
  15.   
  16. void ccm_clock_enable(u32 clk_id)  
  17. {  
  18.     switch(clk_id>>8) {  
  19.         case AXI_BUS:  
  20.             set_wbit(CCM_AXI_GATE_CTRL, 0x1U<<(clk_id&0xff));  
  21.             break;  
  22.         case AHB_BUS0:  
  23.             set_wbit(CCM_AHB_GATE0_CTRL, 0x1U<<(clk_id&0xff));  
  24.             break;  
  25.         
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值