• 关于解码芯片SAA7115及7105的配置 ,FVID与微驱动


      

    最近因为在做视频处理,所以和解码芯片打交道很多,根据DM642的例程总了一些应该配置的东西.

    :以下的配置均是指AV信号输入,PAL制式输出的条件

    ()关于SAA7115(基于TI的驱动)

    结构体定义如下:(vportcap.h

    typedef struct {
    
    Int cmode;
    Int fldOp;
    Int scale;
    Int resmpl;
    Int bpk10Bit;
    Int hCtRst;
    Int vCtRst;
    Int fldDect;
    Int extCtl;
    Int fldInv;
     
    Uint16 fldXStrt1;
    Uint16 fldYStrt1;
    Uint16 fldXStrt2;
    Uint16 fldYStrt2;
    Uint16 fldXStop1;
    Uint16 fldYStop1;
    Uint16 fldXStop2;
    Uint16 fldYStop2;
    Uint16 thrld;
    
    Int numFrmBufs;
    Int alignment;
    Int mergeFlds;
    Int segId;
    Int edmaPri;
    Int irqId;
    }VPORTCAP_Params;

    现在对其中一些关键信息进行注释:

    Cmodevport数据输入格式的选择,如下所示:

    VPORT_MODE_BT656_8BIT
    VPORT_MODE_BT656_10BIT
    VPORT_MODE_RAW_8BIT
    VPORT_MODE_RAW_10BIT
    VPORT_MODE_YC_8BIT
    VPORT_MODE_YC_10BIT
    VPORT_MODE_RAW_16BIT
    VPORT_MODE_RAW_20BIT

    Int fldOp:帧和场的操作模式,在vport.h中定义,参考选择如下:

    VPORT_FLDOP_FLD1

    VPORT_FLDOP_FLD2

    VPORT_FLDOP_FRAME

    VPORT_FLDOP_PROGRESSIVE

     

    Scaleresample的设置(具体操作见spru629 66页):

     

    Intbpk10Bit;

    10bit数据打包成64bit数据包的方式,包括:

    VPORTCAP_BPK_10BIT_ZERO_EXTENDED

    VPORTCAP_BPK_10BIT_SIGN_EXTENDED

    VPORTCAP_BPK_10BIT_DENSE

    HOUNT=0VOUNT=1

    XstartXstop定义图像的宽度

    YstartYstop定义图像的高度

    以上4个参数决定了捕获的图像帧的窗口中的位置

    Uint16thrld;

    指示FIFO的门限值,当捕获的数据达到门限值则出发DMA操作

     

    IntextCtl;

    IntvCtRst;

    ExcvCtrst定义了图象捕获中垂直计数器的复位点 

    InthCtRst;

    ExchCtrst定义了水平采样计数器的复位点:

    EXC0VRST=0VCOUNT在场消隐开始时复位

    EXC0VRST=1VCOUNT在有效行开始时复位

    EXC0HRST=0HCOUNTEAV代码结束时复位

    EXC0HRST=1HCOUNTSAV代码结束时复位

    EXC1VRST=0HRST=0时,VCOUNTHCOUNT都是在VCTL0控制信号的上升沿进行复位;VRST=1HRST=1时,VCOUNTHCOUNT都是VCTL0控制信号的下降沿复位

     

    Int fldDect;场检测使能定义

    FIDFID=0,指场一的开始;FID1指示场2的开始;使用FID输入判断场的方法适合Y/C图像数据流;

     //////////////////////////////////////////////////////////
    
     (saa7115.h)
    typedef struct {          
    SAA7115_ModeinMode;
    SAA7115_ModeoutMode;
    SAA7115_AnalogFormataFmt;
    
    BoolenableBT656Sync;
    BoolenableIPortOutput;
    
    I2C_Handle hI2C;
    
    Int hSize;
    Int vSize;
    Bool interlaced;
    } SAA7115_ConfParams; 
    
    
    SAA7115_ConfParamsEVMDM642_vCapParamsSAA7115 = {
    SAA7115_MODE_NTSC720,          
    SAA7115_MODE_USER,
    SAA7115_AFMT_COMPOSITE,
    TRUE,
    TRUE,
    INV,
    LIN
    E_SZ,
    NUM_LINES*2,
    TRUE,
    };

    SAA7115_ModeinModeoutMode可以是下面结构体定义的其中之一;

    typedef enumSAA7115_Mode{
    
    SAA7115_MODE_NTSC640,
    SAA7115_MODE_NTSC720,
    SAA7115_MODE_PAL720,
    SAA7115_MODE_PAL768,
    SAA7115_MODE_CIF,
    SAA7115_MODE_QCIF,
    SAA7115_MODE_SQCIF,
    SAA7115_MODE_SIF
    SAA7115_MODE_USER
    }SAA7115_Mode;

     SAA7115_AnalogFormat aFmt;(saa7115.h)指定编码器的模拟输出模式

    typedef enumSAA7115_AnalogFormat {
    
    SAA7115_AFMT_SVIDEO,
    SAA7115_AFMT_COMPOSITE
    }SAA7115_AnalogFormat;

    Bool enableBT656Sync;ITU-RBT.656中定义的SAV/EAV代码插入到输出图像数据流

    BoolenableIPortOutput; 选择图像数据的输出端口为I-PORT还是X-PORT

    Int hSize; &Int vSize; 分别定义图像的水平宽度和垂直高度

    Bool interlaced;指定用户定义的图像采用interlaced(隔行扫描)模式或者progressive(逐行扫描)模式

     

    TI的例程里有一个结构体,里面有对7115需要配置的项目

    //(evmdm642_vcapparamsPAL.c)
    
    SAA7115_ConfParamsEVMDM642_vCapParamsSAA7115 = {
     SAA7115_MODE_PAL720,
     SAA7115_MODE_PAL720,
     SAA7115_AFMT_COMPOSITE,
     TRUE,
     TRUE,
     INV,                  
    
    };

    这个结构体的原形在头文件saa7115.h中定义

    typedef struct {
    
       SAA7115_Mode inMode;
       SAA7115_Mode outMode;
       SAA7115_AnalogFormat aFmt;
        BoolenableBT656Sync;
        BoolenableIPortOutput;
       I2C_Handle hI2C;
    
        InthSize;
        IntvSize;
        Boolinterlaced;   
    
    }SAA7115_ConfParams;

    (1)inMode定义为视频输出格式(saa7115.h中定义)

     

    typedef enum SAA7115_Mode{
    
       SAA7115_MODE_NTSC640,
       SAA7115_MODE_NTSC720,
       SAA7115_MODE_PAL720,
       SAA7115_MODE_PAL768,
       SAA7115_MODE_CIF,
       SAA7115_MODE_QCIF,
       SAA7115_MODE_SQCIF,
       SAA7115_MODE_SIF,    
       SAA7115_MODE_USER
    
    }SAA7115_Mode;

    (2)outMode定义为输出视频格式,值同上

    (3) aFmt 定义为视频输出设备的模拟信号格式(值在saa7105.h)中定义

    typedef enumSAA7115_AnalogFormat {
    
       SAA7115_AFMT_SVIDEO,
       SAA7115_AFMT_COMPOSITE
    
    }SAA7115_AnalogFormat;

    (4)enableBT656Sync定义为在输出视频数据流中允许插入ITU-RBT.656定义的SAV/EAV

    (5)enableIPortOutput:I-PORT口代替X-PORT口输出视频流

    (6)hI2CDM642I2C控制器的句柄

    inMode =SAA7115_MODE_USER,下面的参数可选

    (7)hSize 用户定义图画水平大小

    (8)vSize用户自定义图画垂直大小

    (9)interlaced定义用户图像是隔行扫描还是逐行扫描模式

    由上面我们可以看出,一般在PAL制式采集视频时,需要配置的东西主要是:

    输入输出模式、是否有同步信号、使能数据输出口

     

    (二).EVMDM642_vDisParamsSAA7105配置

    (evmdm642_vdisparamsPAL.c) 

    VPORTDIS_ParamsEVMDM642_vDisParamsChan = {

       VPORT_MODE_BT656_8BIT,

       VPORT_FLDOP_FRAME,    

     

       VPORT_SCALING_DISABLE,   

       VPORT_RESMPL_DISABLE,      

       VPORTDIS_DEFVAL_ENABLE,

       VPORTDIS_BPK_10BIT_NORMAL,

       

       VPORTDIS_VCTL1_HSYNC, 

       VPORTDIS_VCTL2_VSYNC, 

       VPORTDIS_VCTL3_FLD,   

       VPORTDIS_EXC_DISABLE, 

                  

       864,                  

       625,                  

     

       0,                    

       0,                    

       LINE_SZ,              

       NUM_LINES,            

       

       0,                    

       0,                    

       LINE_SZ,              

       NUM_LINES,            

     

       720,                                     

       862,                                     

       

       720,                                     

       624,                                     

       720,                                     

       23,                                      

       

       360,                                     

       311,                                     

       360,                                     

       336,                                     

       

       720,                                          

       1,                                            

       

       360,                                          

       313,                                          

     

       752,                                          

       782,                                          

     

       752,                                     

       1,                                       

       752,                                     

       3,                                       

     

       320,                                     

       313,                                     

       320,                                     

       316,                                     

     

       16,                                      

       235,                                     

       

       16,                                      

       240,                                     

       

       0x10,

       0x80,

       0x80,                 

     

       VPORTDIS_RGBX_DISABLE,

       0,                             

       (LINE_SZ>>3),         

     

       3,                    

       128,                  

       VPORT_FLDS_MERGED,    

       NULL,                            

       EDMA_OPT_PRI_HIGH,    

       8                        

    };

     

    Display1

     

    EVMDM642_vDisParamsChan 参数说明

     

    1.dmode

    当前值:VPORT_MODE_BT656_8BIT,

    作用:co-sited luma andchroma data multiplexed into a single data stream

     

     

    因当前位数为8bitVDOUT9~ VDOUT2脚输出8位数据

    1BT.656 Output Sequence

     

    2:模式选择

    2.fldOpfield and frame operation mode.

    当前值:VPORT_FLDOP_FRAME

    类似于如下

     

    3. Scale: horizontal 2xscaling enable

    当前值:VPORT_SCALING_DISABLE,不允许缩放。

     

    4defValEn:

    default value output enable.Enable output of default value in the non-blanking period outsidethe image window

    在非空白时段图像输出是否指定为默认值,默认值配置见下面9段。

    当前值:VPORTDIS_DEFVAL_ENABLE

     

    5. Resmpl

    VPORT_RESMPL_DISABLE

    chroma horizontal 4:2:0 to4:2:2 re-sampling disable.

     

    6.bpk10Bit

    VPORTDIS_BPK_10BIT_NORMAL,

    Fifo填充模式,普通模式,一字填充210bit

     

    7.vctl1Config: vctl2Config:vctl3Config:vctl1~vctl3引脚的输出选择

    其中vctl1:vctl2都有以下四种选择;

    VPORTDIS_VCTL2_VSYNC

    VPORTDIS_VCTL2_VBLNK

    VPORTDIS_VCTL2_CSYNC

    VPORTDIS_VCTL2_FLD

    vctl3有以下2种选择

    VPORTDIS_VCTL3_CBLNK

    VPORTDIS_VCTL3_FLD

    在此程序中:VPORTDIS_VCTL1_HSYNC,

    Vctl

     

    1脚选择输出为水平同步信号

    VPORTDIS_VCTL2_VSYNC,

    Vctl2脚输出选择为垂直同步信号

    VPORTDIS_VCTL3_FLD,

    Vctl3脚输出选择为场信号,标志当前场序号(field1field 2

     

    8.帧及图像等相关数据,已在下图中标识

     

    9.指定Y,CB,CR分量的默认值:

    Y0x10,

    CB 0x80,

    CR 0x80,

     

    10. rgbX 仅在rawmode连续输出24/30-bit RGB模式中使用,是否执行3/4 fifo解包。本程序与其无关。指定为VPORTDIS_RGBX_DISABLE

     

    11.incPix:仅在raw mode中使用。

     

    12.thrld:fifo中数据达到此值,将触发edma事件。此处为360/8=45双字。

     

    13. numFrmBufs

    driver分配的buffer个数,本程序为3个。

     

    14. Alignment:

    Buffer的字对齐,此处为128字节对齐,即buffer的开始地址为128的倍数。

     

    15mergeFlds:指定场1和场2 buffer是否在存储器中分开存放。

    VPORT_FLDS_MERGED,此处不分开放置。

     

    16.SegId:指定driverbuffer分配到的位置,初始值为null,后在初始化函数thrDisplayInit中指定为EXTERNALHEAP,由dsp/biosmem模块分配可知EXTERNALHEAP是外部存储器中的堆。

     

    17.edma传输的优先级,可指定为高或低。指定为高EDMA_OPT_PRI_HIGH

     

    18.edma 中断号id,为8,默认值。

     

     

    SAA7105_ConfParamsEVMDM642_vDisParamsSAA7105 = {

    SAA7105_AFMT_SVIDEO,

    SAA7105_MODE_NTSC720,

    SAA7105_IFMT_YCBCR422_INTERLACED,

    TRUE,

    FALSE,

    INV

    };

    SAA7105_AFMT_SVIDEO,模拟输出的格式

    可选格式有:

    typedef enumSAA7105_AnalogFormat {

    SAA7105_AFMT_SVIDEO =0,

    SAA7105_AFMT_RGB =1,

    SAA7105_AFMT_YPBPR =1,

    SAA7105_AFMT_COMPOSITE =2

    }SAA7105_AnalogFormat;

     

    SAA7105_MODE_NTSC720,视屏模式,可选模式有

    typedef enum

    {

    SAA7105_MODE_NTSC720,

    SAA7105_MODE_PAL720,

    SAA7105_MODE_QVGA,

    SAA7105_MODE_VGA,

    SAA7105_MODE_SVGA,

    SAA7105_MODE_XGA,

    SAA7105_MODE_HD480P60F,

    SAA7105_MODE_HD720P24F,

    SAA7105_MODE_HD720P60F,

    SAA7105_MODE_HD1080I30F

    }SAA7105_Mode;

     

    SAA7105_IFMT_YCBCR422_INTERLACED,7105的输入格式,为ycbcr422格式。可选格式有

    typedef enumSAA7105_InputFormat {

    SAA7105_IFMT_RGB24_YCBCR444,

    SAA7105_IFMT_RGB555,

    SAA7105_IFMT_RGB565,

    SAA7105_IFMT_YCBCR422_NONEINTERLACED,

    SAA7105_IFMT_YCBCR422_INTERLACED

    }SAA7105_InputFormat;

     

    20.TRUE:指定7105为从模式

     

    21.FALSE:是否使用SAV/EAV code使能内置的同步

    INV暂时不指定。在初始化函数中指定。

     

    Display2

    1. 初始化工作:

    EVMDM642_vDisParamsChan.segId = EXTERNALHEAP;

    EVMDM642_vDisParamsSAA7105.hI2C =EVMDM642_I2C_hI2C;

    指定将用来分配视频帧缓冲区的存储段ID设置为EXTERNALHEAP

    I2c句柄指定为EVMDM642_I2C_hI2C

    disChan =FVID_create("/VP2DISPLAY", IOM_OUTPUT,

    &status,(Ptr)&EVMDM642_vDisParamsChan, NULL);

    建立FVID通道并初始化该通道;FVID即是GIO的一种封装,FVID通道即GIO通道。详见附录。

    若成功建立,该函数返回fvid通道句柄,若不成功,返回NULL

    参数意义:

    "/VP2DISPLAY":字符串表示device driver的名字,该device driverDSP/BIOS中定义。

    IOM_OUTPUT指定设备的打开模式为输出。

    status:该参量是application送给mini-driver的一个状态指针,mini-driver来返回状态的;

    EVMDM642_vDisParamsChan:是用来初始化FVID channel的具体参数,是用结构体的形式打包,并将指向该结构体的指针传送给mini-driver来进行处理,结构体中参数的具体含义已在display文档中介绍过。

    NULL:为FVID_Attrs结构参数,为空,表FVID_alloc,FVID_free,FVID_exchangecalls为非block形式,无论成功与否,立刻返回,详见附录。

    FVID_control(disChan,VPORT_CMD_EDC_BASE+EDC_CONFIG,(Ptr)&EVMDM642_vDisParamsSAA7105)

    应用程序发送一个控制命令给mini-driver,将由mini-driver做相应的响应,在这里将完成对saa7105寄存器的初始化;dischan为指定的fvid通道,由上FVID_create函数返回。VPORT_CMD_EDC_BASE+EDC_CONFIG为相应cmd命令,EVMDM642_vDisParamsSAA7105为一结构体,包含的是配置SAA7105的具体参数信息,该结构体成员已在display文档中介绍,此不再重叙。这里将该结构体的指针传送给mini-drivermini-driver将通过i2c总线用其配置7105;该函数将导致mdcontrol函数的调用。

     

    (三)Fvidgio的封装

    fvid.h中我们可以清晰的看出fvid即为gio的一种扩展封装。

    #define FVID_alloc(gioChan,bufp)

    GIO_submit(gioChan,FVID_ALLOC, bufp, NULL, NULL)

    ……………………………………………

     

    .Fvid的属性结构

    typedef struct FVID_Attrs{

    Uns timeout;

    } FVID_Attrs;

    Fvid的属性,指定fvid函数(即相当于gio相关函数)等待时间。若函数不能立即返回将会导致进程被挂起。若果指定为非0, FVID_alloc, FVID_free and FVID_exchange只能在 DSP/BIOS task(TSK)使用。因swihwi不可能因此挂起。

     

    Fvid信息

    typedef struct FVID_Frame{

    QUE_ElemqueElement;

    union {

    FVID_Iframe iFrm;

    FVID_Pframe pFrm;

    FVID_RawIFrameriFrm;

    FVID_RawPFramerpFrm;

    } frame;

    } FVID_Frame;

    typedef structFVID_Iframe{

    Char* y1;

    Char* cb1;

    Char* cr1;

    Char* y2;

    Char* cb2;

    Char* cr2;

    }FVID_Iframe;

     

    typedef struct FVID_Pframe{

    Char* y;

    Char* cb;

    Char* cr;

    } FVID_Pframe;

    typedef structFVID_RawIFrame{

    Char* buf1;

    Char* buf2;

    } FVID_RawIFrame;

    typedef structFVID_RawPFrame{

    Char* buf;

    } FVID_RawPFrame;

    QUE_Elem为该gio使用的队列,第二个成员为一指向缓冲区的指针。为联合体,即实例化结构对象第二个成员为指向该种联合体成员之一。该程序为iframe

     

    .Classdrivermini-driver模型结构

     

    在类/微型驱动模型中,类驱动通常用于完成多线程IO请求的序列化功能和同步功能,同时对设备实例进行管理。在包括视频系统IO和异步IO的典型实时系统中,只有少数的类驱动需要表示出外部设备的类型。

    类驱动通过每个外部设备独有的微型驱动对设备进行操作。微型驱动通过控制外设的寄存器、内存和中断资源对外部设备实现控制。微型驱动程序必须将特定的外部设备有效地表示给类驱动。例如:视频显示设备存在一些不同的帧存,应用软件会根据不同的IO操作进行帧存的分配,此时微型驱动必须映射视频显存,使得类驱动可以对不连续的内存(分别存放RGBYUV分量)设计特定的IO请求。

    类/微型驱动模型允许发送由开发者定义数据结构的IO请求包给微型驱动来控制外部设备,此分层结构使设备驱动的复用能力得到加强,并且丰富了发送给微型驱动的I0请求包的结构。

    上层的应用程序不直接控制微型驱动,而是使用一个或一个以上的类驱动对其进行控制。每一个类驱动在应用程序代码中表现为一个API[3]函数并且通过微型驱动的接口IOM与微型驱动进行通信。类驱动使用DSPBIOS中的API函数实现诸如同步等的系统服务。

    类驱动通过标准的微型驱动接口调用微型驱动控制硬件设备。到目前为止DSPBIOS共定义了三种类驱动:流输入输出管理模块(SIO)、管道管理模块(PIP)和通用输入输出模块(GIO)。在PIPSIO类驱动中,调用的API函数已经存在于DSPBIOSPIPSIO模块中。这些API函数需将参数传给相应的适配模块(adapter),才能与微型驱动交换数据。而在GIO类驱动中,调用的API函数则直接与微型驱动通信(需在CCS22以上)

    每一个微型驱动都为类驱动和DSPBIOS设备驱动管理提供了标准接口。微型驱动采用芯片支持库管理外围设备的寄存器、内存和中断资源。

    GIO模块

    GIO模块在提供必要的同步读/写API函数及其扩展函数的同时,将代码和使用数据缓存的大小尽量简化。应用程序可以调用GIOAPI函数直接与微型驱动的IOM交换数据,这些API函数使得GIO成为了类驱动。

    当调用GIO_create创建一个外部设备的通道实例时,GIO在通道实例中增加了状态和IO请求状态结构、IOM数据包(IOM_Packets)及一个GIO数据对象。GIO创建的通道实例的数据结构如下:

    typedef stmctGIO_Obj{

    IOM_Fxns*fxns/* 函数表指针*

    Uns mode/* 创建模式 *

    Unstimeout/* 超时时间 *

    IOM_PacketsyncPacket/* 同步时使用的IOM_Packet*

    QUE_ObjfreeList/* 异步IO队列*

    PtrsyncObj/* 同步对象地址 *

    PtrmdChan/* 通道实例地址 *

    }GIO_Obj*GIO_Handle

    函数表指针是应用程序和微型驱动函数表(fxns)的接口;创建模式包括:输入(IOM_INPUT)、输出(IOM_OUTPUT)和双向(IOM_NOUT)IOM Packet在类驱动和微型驱动间的异步操作时使用;同步对象地址指向特定通道的同步信号;通道实例地址指向微型驱动创建的通道实例。

    类/微型驱动模型中的微型驱动直接控制外部设备。只要微型驱动创建了规定的函数,应用程序就可以方便地通过DIO适配模块、PIO适配模块或()GIO类驱动调用。这些规定的函数包括:通道绑定函数(md—BindDev)、通道创建/删除函数(mdCreateChanmd—DeleteChan)IO请求发送函数(mdSubmitChan)、中断服务函数(ISRs)和设备控制函数(mdControlChan)。这些规定的函数将放入微型驱动的函数接口表(IOM_Fxns)中的相应位置,供应用程序通过适配模块或GIO类驱动调用。函数接口表的结构如下:

    typedef structIOM_Fxns

    {

    IOM_TmdBindDevmdBindDev

    IOM—TmdUnBindDevmdUnBindDev

    IOM—TmdControlChanmdControlChan

    IOM_TmdCreateChanmdCreateChan

    IOM_TmdDeleteChanmdDeleteChan

    IOM_TmdSubmitChanmdSubmitChan

    }IOM_Fxns

    在设备初始化使dsp/bios将调用用户自定义设备初始化程序后调用mdbinddev函数。Mdcontrolchan为回应sio_strl,pio_ctrl,gio_ctrl函数时调用,若class drive

    r超时,则一个cmdiom_chan_timedout的命令将发给mdcontrolchan函数。

    同理mdsubmitchan回应sio_submit,pio_submit,gio_submit。。。。。。

     

  • 相关阅读:
    [置顶] Android自定义控件大全
    与机房收费系统图的初步情结
    队列用链表实现(建立,插入新元素,删除元素,读取元素,全部删除,全部读出,判断是否为空,清空)
    数据结构 练习 16-动态规划
    windows和linux在建筑python集成开发环境IDE
    圆角盒演习(1)
    tortoise svn无法识别subversion check向下代码来解决
    CSS+DIV+JQuery实际的视频汇总
    【Android开发经验】Android举UI设计经验
    程序猿什么样的角色代表了这个号码?你想过这个问题?
  • 原文地址:https://www.cnblogs.com/eaglediao/p/7136534.html
Copyright © 2020-2023  润新知