VIVADO SDK中驱动VDMA(standaloneOS)

生成的工程中,可以在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。

おすすめ

転載: blog.csdn.net/weixin_42418557/article/details/120285949