微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于MPEG-4的嵌入式多媒体监控系统中压缩/解压卡的设计与实现

基于MPEG-4的嵌入式多媒体监控系统中压缩/解压卡的设计与实现

时间:10-15 来源:无忧电子开发网 点击:

SM_VW2PC 的格式如表2 所示。ACK/NACK的含义是:如果SM_PC2VW 中Int Flag 为1 ,且命令CMD 成功执行,则为ACK;如果SM-PC2VW 中Int Flag 为1 ,且执行命令CMD 失败,则为NACK,并将错误码保存在Return Code 字段。

在发送其它命令之前必须先发送打开命令,此时,Device Handle 字段为0 ,Parameters 字段为打开类型( TSMUX , PSMUX , TSDEMUX 或PSDE-MUX) 。如果该命令成功执行, 则会在SM_VW2PC 的Device Handle字段返回所分配的Device Handle ;在SM_VW2PC 的Parameters字段返回辅助参数区的首地址(下面简称为X) 。辅助参数区由firmware 在encoder SDRAM 中动态分配,用于传递跟命令相关的参数。在结束使用共享内存区后,必须发送关闭命令以释放辅助参数区。

3. 1. 2 信号灯
由于共享存储区是临界资源,所以必须提供一种机制保证VW2010 和host 互斥地使用它们。为此,VW2010 分别给SM_PC2VW 和SM_VW2PC 提供了两个硬件信号灯, 由寄存器REG_INT1 和REG_INT2 的最低位实现。VW2010 为信号灯定义了两种操作: 写操作:向REG_INT1 或REG_INT2 的最低位写入1 ,释放共享存储区。读操作:返回REG _INT1 或REG_INT2 的最低位的值,同时清该位为0 。

3. 1. 3 host 到VW2010 的中断
host 通过向VW2010发中断的方式通知VW2010 从共享存储区读取主机命令。VW2010用寄存器REG_DHIU5实现host 到VW2010 的中断。REG_DHIU5 的最低四位用于保存中断计数,第五位为中断屏蔽位。host 向REG_DHIU5 每写一次, 中断计数加1 ; VW2010 每读REG_DHIU5 一次,中断计数减1 。只要中断计数不为0 ,则VW2010 内部的中断请求信号一直保持有效。

3. 2 VW2010 数据读写和IOCTL 方法(method) 的实现
数据读写和IOCTL 的实现依赖于上述的共享存储区机制,在下面的讨论中,我们假设已经通过打开命令(CMD = 4) 从firmware 获取了DeviceHandle 和辅助参数区(首地址为X) 。

3. 2. 1 数据读写方法的实现
VW2010 采用DMA 方式实现与应用空间的数据交换。读/ 写命令用于建立从VW2010 到host 的DMA 通道并启动数据传输,它并不等待数据传输完成, 而是让DMA 传输在后台运行, 当DMA 传输结束后,VW2010 会中断主机。

当应用程序要读写数据时,它首先会分配一些缓冲区用于保存读写数据。这些缓冲区可以用首地址和长度标识,如可以用(Address ,Len) 代表首地址为Address、长度为Len的缓冲区。在发送读/写数据命令时,SM_PC2VW 的Parameters 字段为X ,辅助参数区的内容为应用空间数据缓冲区的信息,其格式即为上述的首地址和缓冲长度标识对(Address ,Len) 。VW2010 根据这些缓冲区信息建立到应用空间的DMA 通道。读数据方法的程序流程图如图2 所示,其中,左边是系统调用部分的流程图,右边则是中断服务部分的流程图。

图2  读数据方法流程图

3. 2. 2 IOCTL 方法的实现
VW2010 定义了许多IOCTL 码用于控制VW2010 芯片,各个IOCTL 码的参数各不相同.需要注意的是此处的IOCTL 码不同于Driver API中的IOCTL 码。该命令与读写数据命令的主要区别在于其命令辅助参数存储区的格式不同,而控制流程类似,限于篇幅,不再赘述。

4  实验与测试

为了测试压缩/ 解压卡和设备驱动程序的性能,作者在Linux Redhat7. 3下编写了测试程序。测试中,分别让VW2010 芯片工作在以下几种模式:手动录像模式、定时录像模式和动态侦测录像模式。结果都能稳定工作。

5  总结

本文详细介绍了基于VW2010 芯片的MPEG-4压缩/ 解压卡的设计方法, 包括硬件设计和Linux 下的设备驱动程序的设计,并在实际中进行了全面的测试。VW2010功能强大,编解码高效且外围电路简单,具有重要的实际应用价值。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top