首先,需要加载驱动打开设备驱动,如果有需要还可以执行IOCTL操作,跟在linux系统里操作驱动的IOCTL类似。代码如下:
/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/
- ret = wBoot_driver_install("c:\\drv_tvd.drv");
- if(ret != 0)
- {
- DMSG_PANIC("ERR: wBoot_driver_install drv_tvd driver failed\n");
- return -1;
- }
- ret = wBoot_script_parser_fetch("tvin_para", "tvin_reverse_channel_num", &reverseChannel, 1);
- if(ret)
- {
- __inf("unable to find tvin_para tvin_reverse_channel_num value\n");
- }
- __inf("BoardInit_TVD: reverseChannel=%x\n", reverseChannel);
- TVDTransferToDRVInfo.ch = reverseChannel;
- //open tvd devices , we transfer some TVD parameter to driver
- tvd_hd = wBoot_driver_open(EGON2_EMOD_TYPE_DRV_TVD, &TVDTransferToDRVInfo);
- if(tvd_hd == NULL)
- {
- DMSG_PANIC("ERR: open drv_tvd driver failed\n");
- return -1;
- }
加载驱动会执行到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,大致如下:
- ccm_clock_disable(TVD_CKID);
- ccm_clock_enable(TVD_CKID);
- set_wbit(CCM_DRAMCLK_GATE_CTRL, 0x1U<<4);//tvd
- if(mode<4)
- {
- put_wvalue(CCM_PLL3_VIDEO_CTRL,0x80105000);
- put_wvalue(CCM_TVD_SCLK_CTRL,0x8000800a);
- }
- else
- {
- put_wvalue(CCM_PLL3_VIDEO_CTRL,0x8010905a);
- put_wvalue(CCM_TVD_SCLK_CTRL,0x80008004);
- }
- void ccm_clock_enable(u32 clk_id)
- {
- switch(clk_id>>8) {
- case AXI_BUS:
- set_wbit(CCM_AXI_GATE_CTRL, 0x1U<<(clk_id&0xff));
- break;
- case AHB_BUS0:
- set_wbit(CCM_AHB_GATE0_CTRL, 0x1U<<(clk_id&0xff));
- break;