生成的工程中,可以在BSP中找到VDMA的驱动代码。
其中的xaxivdma.h是总的头文件,其中定义了各种参数,
xaxivdma_hw.h是硬件相关的定义,定义了各个寄存器的offset,各个bit位的mask,并给出了各个基础宏的alias宏别名,以及各个基础宏拟函数的encapsulation,宏拟函数的再封装,形成宏拟函数别名。
+++++++++++++++++++++++++++++++++++++++++++
xaxivdma_channel.c解析。
1)XAxiVdma_ChannelInit
初始化一个chan。
2)XAxiVdma_ChannelReset
写REG,复位一个chan。
3)XAxiVdma_ChannelResetNotDone
读REG,判断chan是否复位完成。
4)XAxiVdma_ChannelStartParking
读改写REG,使能tail parking。
5)XAxiVdma_ChannelConfig
用XAxiVdma_ChannelSetup结构体来配置XAxiVdma_Channel结构体。
6)XAxiVdma_ChannelSetBufferAddr
设置buffset array的各个基地址。
7)XAxiVdma_ChannelStart
开始一个chan的传输。
+++++++++++++++++++++++++++++++++++++++++
xaxivdma.c解析。
这个文件中的函数,会调用xaxivdma_channel.c中的channel类的函数。
1)XAxiVdma_GetChannel
获取read chan或者write chan的结构体RCB。
2)XAxiVdma_CfgInitialize
利用XAxiVdma_Config结构体这个PDB,初始化一个VDMA的RCB。
3)XAxiVdma_Reset
根据方向,复位VDMA中的一个chan。
4)XAxiVdma_ResetNotDone
根据方向,判断VDMA中的一个chan是否复位完成。
5)XAxiVdma_DmaConfig
根据方向,以及提供的XAxiVdma_DmaSetup的结构体PDB,设置一个chan。
6)XAxiVdma_DmaSetBufferAddr
根据方向,设置一个chan的buffer array。
7)XAxiVdma_DmaStart
根据方向,写REG,刷新VSIZE,启动chan。
8)XAxiVdma_StartWriteFrame
完成config, setbufferaddr,start一系列操作。
9)XAxiVdma_StartReadFrame
完成config, setbufferaddr,start一系列操作。
++++++++++++++++++++++++++++++++++++++++
实际使用中,
通常需要使用
XAxiVdma_CfgInitialize,
XAxiVdma_StartWriteFrame,
XAxiVdma_StartReadFrame,
或者
XAxiVdma_DmaConfig,
XAxiVdma_DmaSetBufferAddr,
XAxiVdma_DmaStart
几个函数。
这里,主要是要填充
XAxiVdma_ChannelSetup这个结构体PDB。
typedef struct {
int VertSizeInput; /**< Vertical size input */
int HoriSizeInput; /**< Horizontal size input */
int Stride; /**< Stride */
int FrameDelay; /**< Frame Delay */
int EnableCircularBuf; /**< Circular Buffer Mode? */
int EnableSync; /**< Gen-Lock Mode? */
int PointNum; /**< Master we synchronize with */
int EnableFrameCounter; /**< Frame Counter Enable */
UINTPTR FrameStoreStartAddr[XAXIVDMA_MAX_FRAMESTORE];
/**< Start Addresses of Frame Store Buffers. */
int FixedFrameStoreAddr;/**< Fixed Frame Store Address index */
int GenLockRepeat; /**< Gen-Lock Repeat? */
u8 EnableVFlip; /**< Vertical Flip state */
}XAxiVdma_ChannelSetup;
填充好之后,就可以使用PDB来配置chan。