打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
视频采集类微驱动程序结构分析

视频采集类微驱动程序结构分析


我用的是DM642+TVP5150+SAA7121,因此TIDDK提供的库就不能用了,合达提供的库不知道为什么也不能用。因此不得不研究一下类微驱动的结构。肤浅认识,多多指教!

视频采集类微驱动程序结构分析:
1、整个驱动程序分为设备相关部分(board specific part)和设备无关部分(genericpart),TI提供的DDK对应的board specificpart是SAA7115和SAA7105。如果使用其它解编码器件这部分需要另外编程,主要内容是编写EDC_Fxns类型的函数表,例如对于TVP5150需要完成三个函数供微驱动程序调用:TVP51xx_open,TVP51xx_close,TVP51xx_ctrl。FVID_xxx对应的是应用程序调用的函数,GIO_xxx对应的是类驱动程序调用的函数,mdxxxxx对应的微(mini)驱动程序。

2、(DSP/BIOS)系统初始化时,mdBindDev被调用,绑定外部设备到指定的端口,包括使能视频端口,清中断等等,特别是EDCfunction(需要用户写)将被传到其参数devParam指针,是下面几个步骤的基础。

3、主程序中调用FVID_create创建视频通道,则:FVID_create->GIO_create->mdCreateChan->TVP51xx_open,在vportcap.c中有如下代码:
代码:
if(port->chanObj[chanNum].edcFxns!= INV) {
       /* open external device */
      port->chanObj[chanNum].edcHandle
          =port->chanObj[chanNum].edcFxns->open(name, (Arg)INV);
}
"edcFxns->open"是设备相关的,需要用户对特定器件写特定代码。实际上,open函数返回的是此器件的IIC地址,即edcHandle。另外mdCreateChan还有一个重要的作用就是配置EDMA。

4、接着主程序中调用FVID_control配置器件,命令为VPORT_CMD_EDC_BASE + EDC_CONFIG,FVID_control->GIO_control->mdControlChan->TVP51xx_ctrl,可见最终还是通过用户写的TVP51xx_ctrl对器件进行配置(通过IIC)。vportcap.c中代码如下:
代码:
if(chan->edcFxns!=INV){
        retVal = chan->edcFxns->ctrl(chan->edcHandle,
           cmd-VPORT_CMD_EDC_BASE,(Arg)args);
5、接着主程序中调用FVID_control,命令为VPORT_CMD_START,FVID_control->GIO_control->mdControlChan->_startVPCapture,这是由微驱动完成的,因此它是设备无关的,而且解编码器已经配置好了。_startVPCapture完成的主要工作是使能通道,使能中断。

6、最后主程序调用FVID_alloc/FVID_exchange->GIO_submit->mdSubmitChan对存储器和EDMA进行相关操作,使得能够正常采集图像,EDMA能够正常工作。这也是设备无关的。
代码:

因此对于TVP5150,需要写三个函数TVP51xx_open,TVP51xx_close,TVP51xx_ctrl,同理对于SAA7121也一样。再将其和微驱动编译成库供主程序调用即可。以下是我简写的tvp51xx.c,只作测试用:
/* by biren
TVP51xx.c
*/
#include
#include
#include
#include

#include "tvp51xx.h"
#include "_iic.h"
#include"_tvp51xx.h"

//#define _TVP5150_IIC_ADDR (0xB8>>1)
staticvoid configTVP51xx();

static Int TVP51XX_ctrl(EDC_Handlehandle,TVP51XX_Cmd cmd, Arg param);
static EDC_HandleTVP51XX_open(String devName,Arg optArg);
static IntTVP51XX_close(EDC_Handle handle);

EDC_Fxns TVP51XX_Fxns={
      TVP51XX_open,
       TVP51XX_close,
       TVP51XX_ctrl
};
/*localvariables and arrays*/
static I2C_Handle hI2C=INV;
/********************************/
      //configTVP51xx
static void configTVP51xx()
{       //TVP5150的配置只需要设置以下两个寄存器
       Uint8 *temp=0;
       *temp=0x6D;
      _IIC_write(hI2C, _TVP5150_IIC_ADDR,0x03, temp,1);
      *temp=0x2;
_IIC_write(hI2C, _TVP5150_IIC_ADDR,0x0F, temp,1);
}

/****************************/
//tvp5100_ctrl
staticInt TVP51XX_ctrl(EDC_Handle handle,TVP51XX_Cmd cmd, Arg param)

//TVP51xx_cmd定义在tvp51xx.h中
{
       IntdevId=(Int)handle;
       //check if the Handle is correct
      if(devId!=_TVP5150_IIC_ADDR){
            return EDC_FAILED;
      }
       switch(cmd){
            case EDC_CONFIG:{
                    TVP51XX_ConfParams *tvp5150Params=(TVP51XX_ConfParams*)param;//TVP51XX_ConfParams定义在tvp51xx.h中
                    hI2C=tvp5150Params->hI2C;
                    configTVP51xx();//采用默认的配置,而不管传来的Param的值
            }
           break;
            default:
                     break;
       }
      return EDC_SUCCESS;
}
       //TVP5150_open
staticEDC_Handle TVP51XX_open(String devName,Arg optArg)
{
       return(EDC_Handle)_TVP5150_IIC_ADDR;//定义在_tvp51xx.h中
}
static IntTVP51XX_close(EDC_Handle handle)
{
       return 0;


本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
用户空间访问I2C设备驱动
如何在Gazebo中实现多机器人仿真
Dockerfile完全指南
Dcokerfile 参考
再学dockerfile
详解Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服