dm8148 HDVPSS 整理
1)hdvpss貌似提供了一些接口API用来配置DM816x的寄存器,但是又把各种板卡类型至于其中,甚至连视频解码芯片驱动都放在里边了,感觉限制非常大,用户要怎么根据自己的板卡使用这些东西,如果是增加新的芯片驱动,会涉及很多更改,遇到这种情况,用户该怎么开放呢?
回答:关于问题1这里有历史的原因在里面,最早的时候AD的驱动都是在M3上执行的就是你现在在hdvpss驱动中看到的AD的驱动,这样架构的问题就是修改需要了解M3的代码,对于大家来说难度增加了.为了解决这个问题DVR RDK后续将AD的驱动移到A8,这样就可以不需要了解M3就可以进行开发了,对于capturelink可以直接定义相应的格式,保证与AD接口对等即可.
2)hdvpss 编译出来的文件到底是什么东西,怎么在应用程序中怎么使用呢?应为在Makefile没有看到,或许有,但是没有找到,makefile里确实有编译hdvpss的,但是应为不清楚软件架构,不明白编译hdvpss有什么用?
回答:
HDVPSS是视频处理子系统(Video Process Sub-System),针对芯片中集成的VPSS硬件协处理器,编译出来的是VPSS的驱动库,供RDK层调用其接口以实现视频数据在VPSS协处理器中的处理,比如采集、缩放、显示。所以可以理解为RDK和硬件协处理器之间的驱动层。
3)看了下dvr_rdk\mcfw\src_bios6\links_m3vpss代码,好像也是使用hdvpss 接口(FVID2_)是不是说这部分就是在hdvpss运行的驱动呢?用户如果对Vport配置需要修改,只需要修改这部分代码,而无需去更改ti_tools\hdvpss\hdvpss_01_00_01_37_patched\packages下的代码呢?
答复:可以这么理解,调用了FVID2接口的部分就是在HDVPSS运行的。不建议客户自己修改hdvpss目录下的任何文件,可以向TI技术支持提出你们具体的需求,大部分应该可以通过RDK配置实现。如果是HDVPSS驱动中还不支持的功能,TI会在后续版本中添加。
4)关于dvr_rdk\mcfw\src_bios6\links_m3vpss编译后出来的是什么文件呢,最后也是通过fw_load.out加载么?
答复:编译出来的是在HDVPSS媒体控制器(m3)中运行的firmware,是通过fw_load.out加载的,可以看load.sh脚本获得更详细信息。
5)dvr_rdk_fw_m3vpss.xem3 是怎么生成的呢,里面大体实现了一些什么功能?
答复: 里面主要包含了RDK中vpss link 层的代码以及HDVPSS驱动,在RDK中可以看到在links_m3vpss目录下的功能都是在这里实现的。
6)基于hdvpss 接口(FVID2_)编写的代码怎么调试呢?
答复:Rules.make里面把dvr_rdk_fw_m3vpss.xem3编译成debug模式,通过仿真器可以调试。
7)HDVCIP2是什么? IVAHD 是什么?
hdvcip:high definition video and image coProcessor;
8)iss和hdvpss (High Definition Video Processing Subsystem)区别?
答复:用cameralink的话,就是调用iss的东西,cameralink是和ISS相关的,capturelink是和VPSS相关的,这是我的理解;
iss是直接接摄像头,vpss需要转换芯片像TVP5158等才能和摄像头相连;
iss:imaging sub-system
hdvpss: high definition video processing subsystem;
TVP5158是什么?视频解码芯片;
9)FVID2 是什么?
FVID2 are the set of APIs or framework specifically designed for the video class of devices.
10)FVID2 API
10.1)FVID2_init
Int32 FVID2_init(Ptr args);
Int32 FVID2_deInit(Ptr args);
10.2)FVID2_create
FVID2_Handle FVID2_create(UInt32 drvId,UInt32 instanceId,Ptr createArgs,Ptr createStatusArgs,const FVID2_CbParams *cbParams);
10.3) FVID2_start
Int32 FVID2_start(FVID2_Handle handle, Ptr cmdArgs)
10.4) FVID2_stop
Int32 FVID2_stop(FVID2_Handle handle, Ptr cmdArgs)
10.5) FVID2_dequeue
Int32 FVID2_dequeue(FVID2_Handle handle,FVID2_FrameList *frameList,UInt32 streamId,UInt32 timeout);
10.6) FVID2_queue
Int32 FVID2_queue(FVID2_Handle handle,FVID2_FrameList *frameList,UInt32 streamId);
10.7) FVID2_control
Int32 FVID2_control(FVID2_Handle handle,UInt32 cmd,Ptr cmdArgs,Ptr cmdStatusArgs);
10.8) FVID2_delete
Int32 FVID2_delete ( FVID2_Handle handle, Ptr deleteArgs)
10.9) FVID2_setFormat
Int32 FVID2_setFormat(FVID2_Handle handle, FVID2_Format *fmt)
10.10)FVID2_getFormat
Int32 FVID2_getFormat(FVID2_Handle handle, FVID2_Format *fmt)
10.11)FVID2 ProcessFrames
Int32 FVID2_processFrames ( FVID2_Handle handle, FVID2_ProcessList * processList)
10.12)FVID2_getProcessedFrames
Int32 FVID2_getProcessedFrames(FVID2_Handle handle,FVID2_ProcessList *processList,UInt32 timeout)
10.13)FVID2_getStandardInfo
Int32 FVID2_getStandardInfo(FVID2_StandardInfo *stdInfo)
callback:
A user callback can be registered during driver create which is then called by the driver whenever data is available at
any of the channels, streams associated with the driver. User would typicall set a semaphore to wake up a task. The
woken up task will then call dequeue API to get the newly captured frames. Dequeue should be called for every
stream associated with the driver to get the captured frames, since the callback just indicates there is data but the data
could be in any of the streams that are valid for the driver instance.
FVID2_CbParams
FVID2_Format
FVID2_SliceInfo
FVID2_Frame
FVID2 FrameList
FVID2_ProcessList