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

最近因为在做视频处理,所以和解码芯片打交道很多,但因为解码芯片的datasheet很多内容(又是英文的,汗),所以根据DM642的例程总了一些应该配置的东西.

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

 

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

 

结构体定义如下:
typedef struct {
Int cmode; /* capture mode settings */
Int fldOp; /* field & frame operation */

/* bit 8-15 */
Int scale; /* indicate whether to enable 1/2 scaling */
Int resmpl; /* indicate whether to enable choroma */
/* sub-sampling */
Int bpk10Bit; /* 10-bit bit-pack mode */

/* bit 16-23 */
Int hCtRst; /* horizontal counter reset mode */
Int vCtRst; /* vertical counter reset mode */
Int fldDect; /* enable whether to use FID input or field */
/* detection logic based on the timing */
/* relation of hsync and vsync */
Int extCtl; /* enable external timing control */
Int fldInv; /* enable inversion of the detected fid */

Uint16 fldXStrt1; /* field 1 X start */
Uint16 fldYStrt1; /* field 1 Y start */
Uint16 fldXStrt2; /* field 2 X start */
Uint16 fldYStrt2; /* field 2 Y start */
Uint16 fldXStop1; /* field 1 X stop */
Uint16 fldYStop1; /* field 1 Y stop */
Uint16 fldXStop2; /* field 2 X stop */
Uint16 fldYStop2; /* field 2 Y stop */
Uint16 thrld; /* video FIFO threshold */

 

/* frame buffer settings */
Int numFrmBufs; /* number of frame buffers that the driver allocates */
Int alignment; /* frame buffer alignment */
Int mergeFlds; /* indicate to interleave data of the two fields in memory */
/* or just store them seperated */
Int segId; /* memory segment ID, used by MEM_alloc() to allocate */
/* video frame buffer */
/* EDMA priority */
Int edmaPri; /* channel EDMA priority */

Int irqId;
} VPORTCAP_Params;
现在对其中一些关键信息进行注释:
Cmode 为vport数据输入格式的选择,如图所示:

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

Scale和resample的设置(具体操作见spru629 66页):

Int bpk10Bit; /* 10-bit bit-pack mode */
10bit数据打包成64bit数据包的方式,包括:
? VPORTCAP_BPK_10BIT_ZERO_EXTENDED
? VPORTCAP_BPK_10BIT_SIGN_EXTENDED
? VPORTCAP_BPK_10BIT_DENSE

HOUNT=0,VOUNT=1
Xstart~Xstop定义图像的宽度
Ystart~Ystop定义图像的高度
以上4个参数决定了捕获的图像帧的窗口中的位置
Uint16 thrld; /* video FIFO threshold */
指示FIFO的门限值,当捕获的数据达到门限值则出发DMA操作
如下图所示:

Int extCtl; /* enable external timing control */
Int vCtRst; /* vertical counter reset mode */
Exc和vrst定义了图象捕获中垂直计数器的复位点,如下图所示:

Int hCtRst; /* horizontal counter reset mode */
Exc和hrst定义了水平采样计数器的复位点:

当EXC=0,VRST=0:VCOUNT在场消隐开始时复位
当EXC=0,VRST=1:VCOUNT在有效行开始时复位
当EXC=0,HRST=0:HCOUNT在EAV代码结束时复位
当EXC=0,HRST=1:HCOUNT在SAV代码结束时复位
当EXC=1,VRST=0,HRST=0时,VCOUNT和HCOUNT都是在VCTL0控制信号的上升沿进行复位;VRST=1,HRST=1时,VCOUNT和HCOUNT都是VCTL0控制信号的下降沿复位

Int fldDect; 场检测使能定义
FID:FID=0,指场一的开始;FID=1指示场2的开始;使用FID输入判断场的方法适合Y/C图像数据流;

SAA7115_ConfParams EVMDM642_vCapParamsSAA7115 = {
SAA7115_MODE_NTSC720,
SAA7115_MODE_USER,
SAA7115_AFMT_COMPOSITE,
TRUE,
TRUE,
INV,
LIN

E_SZ,
NUM_LINES*2,
TRUE,
};

 

typedef struct {
SAA7115_Mode inMode;
SAA7115_Mode outMode;
SAA7115_AnalogFormat aFmt;
Bool enableBT656Sync;
Bool enableIPortOutput;
I2C_Handle hI2C;

/* optional parameters for inMode == SAA7115_MODE_USER */
Int hSize;
Int vSize;
Bool interlaced;
} SAA7115_ConfParams; (saa7115.h)

SAA7115_Mode的inMode和outMode可以是下面结构体定义的其中之一;

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;

SAA7115_AnalogFormat aFmt;(saa7115.h)指定编码器的模拟输出模式
typedef enum SAA7115_AnalogFormat {
SAA7115_AFMT_SVIDEO,
SAA7115_AFMT_COMPOSITE
} SAA7115_AnalogFormat;

Bool enableBT656Sync; 把ITU-R BT.656中定义的SAV/EAV代码插入到输出图像数据流
Bool enableIPortOutput; 选择图像数据的输出端口为I-PORT还是X-PORT
Int hSize; & Int vSize; 分别定义图像的水平宽度和垂直高度
Bool interlaced; 指定用户定义的图像采用interlaced模式或者progressive模式

 

 

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

SAA7115_ConfParams EVMDM642_vCapParamsSAA7115 = {
  SAA7115_MODE_PAL720,
  SAA7115_MODE_PAL720,
  SAA7115_AFMT_COMPOSITE,
  TRUE,
  TRUE,
  INV,                   /*handleI2C */
};

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

typedef struct {
    SAA7115_Mode inMode;
    SAA7115_Mode outMode;
    SAA7115_AnalogFormat aFmt;
    Bool enableBT656Sync;
    Bool enableIPortOutput;
    I2C_Handle hI2C;

    /* optional parameters for inMode == SAA7115_MODE_USER  */
    Int hSize;
    Int vSize;
    Bool interlaced;   
} 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 enum SAA7115_AnalogFormat {
    SAA7115_AFMT_SVIDEO,
    SAA7115_AFMT_COMPOSITE
} SAA7115_AnalogFormat;

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

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

(6)hI2C DM642的I2C控制器的句柄

当inMode = SAA7115_MODE_USER时,下面的参数可选

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

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

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

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

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

 

(二).EVMDM642_vDisParamsSAA7105配置

VPORTDIS_Params EVMDM642_vDisParamsChan = {
    VPORT_MODE_BT656_8BIT, /* dmode:3       */
    VPORT_FLDOP_FRAME,     /* fldOp:3       */

    VPORT_SCALING_DISABLE, /* scale:1       */   
    VPORT_RESMPL_DISABLE,  /* resmpl:1      */     
    VPORTDIS_DEFVAL_ENABLE,/* defValEn:1    */
    VPORTDIS_BPK_10BIT_NORMAL, /*bpk10Bit:1 */
   
    VPORTDIS_VCTL1_HSYNC,  /* vctl1Config:2 */
    VPORTDIS_VCTL2_VSYNC,  /* vctl2Config:2 */
    VPORTDIS_VCTL3_FLD,    /* vctl3Config:1 */
    VPORTDIS_EXC_DISABLE,  /* extCtl:3      */
              
    864,                   /* frmHSize */
    625,                   /* frmVSize */

    0,                     /* imgHOffsetFld1 */
    0,                     /* imgVOffsetFld1 */
    LINE_SZ,               /* imgHSizeFld1   */
    NUM_LINES,             /* imgVSizeFld1   */
   
    0,                     /* imgHOffsetFld2 */
    0,                     /* imgVOffsetFld2 */
    LINE_SZ,               /* imgHSizeFld2   */
    NUM_LINES,             /* imgVSizeFld2   */

    720,                   /* hBlnkStart      */                   
    862,                   /* hBlnkStop       */                   
   
    720,                   /* vBlnkXStartFld1 */                   
    624,                   /* vBlnkYStartFld1 */                   
    720,                   /* vBlnkXStopFld1  */                   
    23,                    /* vBlnkYStopFld1  */                   
   
    360,                   /* vBlnkXStartFld2 */                   
    311,                   /* vBlnkYStartFld2 */                   
    360,                   /* vBlnkXStopFld2  */                   
    336,                   /* vBlnkYStopFld2  */                   
   
    720,                   /* xStartFld1 */                        
    1,                     /* yStartFld1 */                        
   
    360,                   /* xStartFld2 */                        
    313,                   /* yStartFld2 */                        

    752,                   /* hSyncStart */                        
    782,                   /* hSyncStop  */                        

    752,                   /* vSyncXStartFld1 */                   
    1,                     /* vSyncYStartFld1 */                   
    752,                   /* vSyncXStopFld1  */                   
    3,                     /* vSyncYStopFld1  */                   

    320,                   /* vSyncXStartFld2 */                   
    313,                   /* vSyncYStartFld2 */                   
    320,                   /* vSyncXStopFld2  */                   
    316,                   /* vSyncYStopFld2  */                   

    16,                    /* yClipLow        */                   
    235,                   /* yClipHigh       */                   
   
    16,                    /* cClipLow        */                   
    240,                   /* cClipHigh       */                   
   
    0x10,
    0x80,
    0x80,                 


    VPORTDIS_RGBX_DISABLE, /* RGB extract disable */
    0,                     /* incPix, for raw mode only */         
    (LINE_SZ>>3),          /*thrld     */

    3,                     /*numFrmBufs*/
    128,                   /*alignment */
    VPORT_FLDS_MERGED,     /*mergeFlds */
    NULL,                  /*segId     */           
    EDMA_OPT_PRI_HIGH,     /*edmaPri   */
    8                      /* irqId    */   
};

Display1

EVMDM642_vDisParamsChan 参数说明

1.dmode:
当前值:VPORT_MODE_BT656_8BIT,
作用:co-sited luma and chroma data multiplexed into a single data stream


因当前位数为8bit,VDOUT9~ VDOUT2脚输出8位数据
图1:BT.656 Output Sequence

图2:模式选择
2.fldOp:field and frame operation mode.
当前值:VPORT_FLDOP_FRAME
类似于如下

3. Scale: horizontal 2x scaling enable。
当前值:VPORT_SCALING_DISABLE,不允许缩放。

4.defValEn:
default value output enable. Enable output of default value in the non-blanking period outside the image window。
在非空白时段图像输出是否指定为默认值,默认值配置见下面9段。
当前值:VPORTDIS_DEFVAL_ENABLE

5. Resmpl:
VPORT_RESMPL_DISABLE
chroma horizontal 4:2:0 to 4:2:2 re-sampling disable.

6. bpk10Bit:
VPORTDIS_BPK_10BIT_NORMAL, /*bpk10Bit:1 */
Fifo填充模式,普通模式,一字填充2个10bit

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, /* vctl1Config:2 */
Vctl

1脚选择输出为水平同步信号
VPORTDIS_VCTL2_VSYNC, /* vctl2Config:2 */
Vctl2脚输出选择为垂直同步信号
VPORTDIS_VCTL3_FLD, /* vctl3Config:1 */
Vctl3脚输出选择为场信号,标志当前场序号(field1或field 2)

 

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

9.指定Y,CB,CR分量的默认值:
Y为 0x10,
CB 0x80,
CR 0x80,

10. rgbX 仅在raw mode连续输出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的倍数。

15,mergeFlds:指定场1和场2 buffer是否在存储器中分开存放。
VPORT_FLDS_MERGED,此处不分开放置。

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

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

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


SAA7105_ConfParams EVMDM642_vDisParamsSAA7105 = {
SAA7105_AFMT_SVIDEO,
SAA7105_MODE_NTSC720,
SAA7105_IFMT_YCBCR422_INTERLACED,
TRUE,
FALSE,
INV
};
SAA7105_AFMT_SVIDEO,模拟输出的格式
可选格式有:
typedef enum SAA7105_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 enum SAA7105_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 driver在DSP/BIOS中定义。
IOM_OUTPUT指定设备的打开模式为输出。
status:该参量是application送给mini-driver的一个状态指针,由mini-driver来返回状态的;
EVMDM642_vDisParamsChan:是用来初始化FVID channel的具体参数,是用结构体的形式打包,并将指向该结构体的指针传送给mini-driver来进行处理,结构体中参数的具体含义已在display文档中介绍过。
NULL:为FVID_Attrs结构参数,为空,表FVID_alloc,FVID_free,FVID_exchange calls为非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-driver,mini-driver将通过i2c总线用其配置7105;该函数将导致mdcontrol函数的调用。

 

 

(三)
Fvid对gio的封装
从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)使用。因swi和hwi不可能因此挂起。

Fvid信息
typedef struct FVID_Frame {
QUE_Elem queElement; /* for queuing */
union {
FVID_Iframe iFrm; /* y/c frame buffer */
FVID_Pframe pFrm; /* y/c frame buffer */
FVID_RawIFrame riFrm; /* raw frame buffer */
FVID_RawPFrame rpFrm; /* raw frame buffer */
} frame;
} FVID_Frame;
typedef struct FVID_Iframe{
Char* y1;
Char* cb1;
Char* cr1;
Char* y2;
Char* cb2;
Char* cr2;
}FVID_Iframe;

/* progressive frame */
typedef struct FVID_Pframe {
Char* y;
Char* cb;
Char* cr;
} FVID_Pframe;
typedef struct FVID_RawIFrame{
Char* buf1;
Char* buf2;
} FVID_RawIFrame;
typedef struct FVID_RawPFrame{
Char* buf;
} FVID_RawPFrame;
QUE_Elem为该gio使用的队列,第二个成员为一指向缓冲区的指针。为联合体,即实例化结构对象第二个成员为指向该种联合体成员之一。该程序为iframe。

 

 

.Class driver/mini-driver模型结构

在类/微型驱动模型中,类驱动通常用于完成多线程I/O请求的序列化功能和同步功能,同时对设备实例进行管理。在包括视频系统I/O和异步I/O的典型实时系统中,只有少数的类驱动需要表示出外部设备的类型。
类驱动通过每个外部设备独有的微型驱动对设备进行操作。微型驱动通过控制外设的寄存器、内存和中断资源对外部设备实现控制。微型驱动程序必须将特定的外部设备有效地表示给类驱动。例如:视频显示设备存在一些不同的帧存,应用软件会根据不同的I/O操作进行帧存的分配,此时微型驱动必须映射视频显存,使得类驱动可以对不连续的内存(分别存放RGB或YUV分量)设计特定的I/O请求。
类/微型驱动模型允许发送由开发者定义数据结构的I/O请求包给微型驱动来控制外部设备,此分层结构使设备驱动的复用能力得到加强,并且丰富了发送给微型驱动的I/0请求包的结构。
上层的应用程序不直接控制微型驱动,而是使用一个或一个以上的类驱动对其进行控制。每一个类驱动在应用程序代码中表现为一个API[3]函数并且通过微型驱动的接口IOM与微型驱动进行通信。类驱动使用DSP/BIOS中的API函数实现诸如同步等的系统服务。
类驱动通过标准的微型驱动接口调用微型驱动控制硬件设备。到目前为止DSP/BIOS共定义了三种类驱动:流输入输出管理模块(SIO)、管道管理模块(PIP)和通用输入输出模块(GIO)。在PIP和SIO类驱动中,调用的API函数已经存在于DSP/BIOS的PIP和SIO模块中。这些API函数需将参数传给相应的适配模块(adapter),才能与微型驱动交换数据。而在GIO类驱动中,调用的API函数则直接与微型驱动通信(需在CCS2.2以上)。
每一个微型驱动都为类驱动和DSP/BIOS设备驱动管理提供了标准接口。微型驱动采用芯片支持库管理外围设备的寄存器、内存和中断资源。
GIO模块
GIO模块在提供必要的同步读/写API函数及其扩展函数的同时,将代码和使用数据缓存的大小尽量简化。应用程序可以调用GIO的API函数直接与微型驱动的IOM交换数据,这些API函数使得GIO成为了类驱动。
当调用GIO_create创建一个外部设备的通道实例时,GIO在通道实例中增加了状态和I/O请求状态结构、IOM数据包(IOM_Packets)及一个GIO数据对象。GIO创建的通道实例的数据结构如下:
typedef stmct GIO_Obj{
IOM_Fxns *fxns; /* 函数表指针*/
Uns mode; /* 创建模式 */
Uns timeout; /* 超时时间 */
IOM_Packet syncPacket;/* 同步时使用的IOM_Packet */
QUE_Obj freeList; /* 异步I/O队列 */
Ptr syncObj; /* 同步对象地址 */
Ptr mdChan; /* 通道实例地址 */
}GIO_Obj,*GIO_Handle;
函数表指针是应用程序和微型驱动函数表(fxns)的接口;创建模式包括:输入(IOM_INPUT)、输出(IOM_OUTPUT)和双向(IOM_NOUT);IOM Packet在类驱动和微型驱动间的异步操作时使用;同步对象地址指向特定通道的同步信号;通道实例地址指向微型驱动创建的通道实例。
类/微型驱动模型中的微型驱动直接控制外部设备。只要微型驱动创建了规定的函数,应用程序就可以方便地通过DIO适配模块、PIO适配模块或(和)GIO类驱动调用。这些规定的函数包括:通道绑定函数(md—BindDev)、通道创建/删除函数(mdCreateChan/md—DeleteChan)、I/O请求发送函数(mdSubmitChan)、中断服务函数(ISRs)和设备控制函数(mdControlChan)。这些规定的函数将放入微型驱动的函数接口表(IOM_Fxns)中的相应位置,供应用程序通过适配模块或GIO类驱动调用。函数接口表的结构如下:
typedef struct IOM_Fxns
{
IOM_TmdBindDev mdBindDev;
IOM—TmdUnBindDev mdUnBindDev;
IOM—TmdControlChan mdControlChan;
IOM_TmdCreateChan mdCreateChan;
IOM_TmdDeleteChan mdDeleteChan;
IOM_TmdSubmitChan mdSubmitChan;
}IOM_Fxns;
在设备初始化使dsp/bios将调用用户自定义设备初始化程序后调用mdbinddev函数。Mdcontrolchan为回应sio_strl,pio_ctrl,gio_ctrl函数时调用,若class drive
r超时,则一个cmd为iom_chan_timedout的命令将发给mdcontrolchan函数。
同理mdsubmitchan回应sio_submit,pio_submit,gio_submit。。。。。。

你可能感兴趣的:(struct,api,buffer,Exchange,output,alignment)