时间:2024-05-04
龙 芬
(咸宁职业技术学院 工学院,湖北 咸宁 437100)
适用于嵌入式系统的DTV Linux设备框架构建
龙 芬
(咸宁职业技术学院 工学院,湖北 咸宁 437100)
构建了一种用于支持和控制DTV硬件的Linux设备驱动架构。之前LinuxTV由于用于PC TV卡而被广泛认可,但在发布Linux DVB API V3时,却没有面向嵌入式系统应用的计划。通过改善和代替Linux DVB,开发出具有简化内核驱动定义良好的APIs层次化软件体系。
DVB;LinuxTV;Linux DVB API;嵌入式Linux
在数字视频广播早期,STBs和iDTV的主要功能是接收、选择和显示数字视频,这些基本功能那时就出现了互动服务,如局部互动(请求视频)、连接其它消费服务及访问Internet[1]。软件必须灵活适应TV服务,并能支持各种新的多媒体格式。为了适应硬件平台较短的生命周期,软件体系必须确保新的硬件平台推出时最少能适应现有软件。然而,即使已经被确立为TV市场中领先的嵌入式操作系统,Linux内核仍然不能对一个数字TV系统功能完全支持。数字TV设备的内核支持仅限于LinuxTV工程,但它主要侧重于基于PC的系统,而不是嵌入式TV平台。
本文对DTV linux设备框架进行了改进,并命名为嵌入式LinuxTV(LTVe)。LTVe框架在LinuxTV工程基础上进行了扩展,使其更适用于嵌入式Linux平台,支持PC DVB扩展卡,专用于机顶盒(STB)芯片组和集成数字电视(IDTV)。
1.1 设备类型
Linux设备依据其功能可划分为几类,这些分类关系到设备如何与上层Linux文件系统和其它内核模块集成。像大多数UNIX系统一样,字符设备有许多功能调用,执行像read()、write()、ioctl()等操作[2]。根据这一机制,LTVe让单个硬件块以字符设备的形式访问,图1为典型SOC电视系统设备映射图。
图1 典型SOC电视系统的设备映射
LTVe设备类型如表1所示。在大多数TV系统中,一般通过硬件块来定义。硬件支持的数据流方式都可以选择合适的硬件功能块。
表1 LTVe 设备类型
通常情况下,poll()和select()的系统调用一般发生在字符设备标志信息有效时,且将触发应用程序[3-4]。实际上,由于没有生成事件序列,这种方法效率非常低。为了实现DTV系统事件队列,允许源和类型事件过滤,引入了特殊设备。同理,为克服用户驱动程序太复杂,引入了驱动桥。该设备作为一种内核接口类型,是导出用户空间DTV设备驱动框架的主要部分。
1.2 设备控件
对每一功能都定义了一套控件组。一般有两个主要控件组:一个用于通用设备,另一个指定给补充设备。
1.2.1 连接
连接指通过传递源设备进行定义的源同步类型文件描述符。这些控件用来定义一个设备如何互相连接,以及如何同步数据流。每个连接遵循 “单输入-多输出”规则。因此,每次只能有一个输入设备。
1.2.2 数据访问
数据访问是指访问用户应用程序的数据处理接口。为了获得流设备数据,应用程序必须使用read()调用,或内存设备的mmap()调用以及直接访问数据。后一种方法优化了数据的访问,因为没有将数据额外复制到应用程序缓冲区。为了从之前的mmap()区域访问数据,应用程序需要执行3个步骤:①从定位数据的设备获得信息;②读数据;③释放读出的数据。
1.2.3 内存输入
由于类型输入可让应用程序写数据流到设备,因此在重放多媒体内容时可以对硬件进行加速。一般应用中,运行时可配置双缓冲区作为解码器输入,因为只有部分缓冲区能用来发送数据给给定设备。为了考虑这些硬件上的局限,嵌入式内存接口主要依赖于底层硬件模块,由作为设备源的内存输入激活。由于用户内存和任意硬件缓冲区的自由配置需要一个解码设备输入的硬件平台,为了支持这种系统,内存设备类型定义为直接的连接源,分配到其它设备中。
1.2.4 实时控制
控制接口主要用于配置和安装硬件设备正常运行,一般能控制所有设备活动。实时控制能启动、停止或暂停设备,同时控制运行状态,且DTV设备框架能获得当前设备状态或状态变化情况。
LTVe设备框架由硬件接口和内核编程接口两部分组成。DTV软件体系框架如图2所示。
2.1 LTVe核
该组件使用Linux设备驱动模型和字符设备给用户空间。它执行系统初始化,对每个框架内的设备进行注册,以及将一部分用户空间转换成LTVe驱动接口[5]。LTV设备作为字符设备应用于 /dev/dvb/adapterN/tree中。
图2 DTV软件体系框架
基于Linux的DTV系统中,大部分软件栈和模块是从PC系统继承和吸收过来的。因此,应用程序同时运行不太多,这和之前有较大不同。RTOS被编译成单一的TV应用程序系统[6]。LTVe利用SysFS接口从系统shell配置框架,在运行应用程序上独立控制设备活动。对每一个LTVe,都会创建注册属性列表的SysFS节点。使用这个接口,可以监视特定设备的运行状态。
2.2 LTVe管理器
这个组件的创建和控制行为包含在框架里。为了统一LTVe设备行为,定义了一些基本原则:每个设备在写使用权限时可以同时有限次打开,但对每个设备来说,只能设置一个输入数据源,且输入源只能是其它LTVe设备。
LTVe管理模块实现了对通用逻辑数据流的定义。数据通路通过源设备至目标设备的源文件描述符来创建。LTVe管理将通过文件描述符进行检查,仅在被识别为LTVe框架时对数据通路进行定义。在初始化连接前,为了确保正确的初始状态,LTVe帮助设备释放之前的数据源,此过程中设备处于非激活状态。
每当要建立数据通路时,LTVe管理会先调用生产设备的set_feed,如果连通可行则执行查询请求。set_input调用被执行,设备驱动会为输入接口选择一个合适的配置。
2.3 LTVe驱动器
该模块为LTVe驱动开发定义了内核编程接口。图3描述了LTVe内部结构之间的相互连接,并描述了不同设备类型如何与LTVe通讯。
图3 LTVe驱动系统
2.4 LTVe桥
LTVe桥是为现有LTVe驱动编程接口的插件[7]。它是一个通用设备节点,模拟被LTVe驱动钩子转换的注册设备类型,ioctl调用被定义为 /bridge设备,每个LTVe驱动钩子匹配ioctl调用。数据流通过申请mmap()调用内部硬件缓冲区。桥设备的注册处理将产生两个设备节点:①dev/dvb/adapterN/bridge 作为用户通讯接口的通用节点; ②dev/dvb/adapterN/xxxM LTVe设备节点,这里xxx以合适的设备类型代替(如video2)。
当需要在用户空间运行监听时,LTVe监听/bridge设备通过桥接口重构内核调用,且以共享库形式实现。这种机制确保了系统能够成功通讯,实现LTVe桥驱动的数据流动。
本文提出的DTV驱动框架(LTVe)已成功移植到基于300MHz MIPS32内核的商业SoC数字电视产品线的ICs中,目前LTVe框架电视应用程序可通过第三方商业DVB和MHEG支持的DVB软件库来开发,这表明LTVe框架是可行的。
为开发数字电视驱动和应用程序接口,本文提出了Linux DVB设备框架软件架构。本架构优点在于在驱动开发中完全脱离Linux内核,并且对不同硬件平台有统一的DVB功能表现形式。采用Linux TV能极大缩短设计和开发时间,减少开发成本。
[1] 徐俭.数字电视接收机顶盒浅析[J].有线电视技术,2003(3):152-156.
[2] 李丛.基于Linux的嵌入式操作系统的研究与实现[D].北京:北京化工大学,2008.
[3] 田棣.嵌入式Linux下机顶盒驱动程序的开发[D].天津:天津大学,2004.
[4] 王拯.数字电视机顶盒关键模块设计与实现[D].武汉:华中科技大学,2009.
[5] 刘洪涛.基于嵌入式Linux的IPTV机顶盒设计实现与关键技术研究[D].西安:西安电子科技大学,2007.
[6] 胡炜.数字机顶盒Linux平台软件的设计与实现[D].上海:上海交通大学,2006.
[7] SAN PIL MOON,JOO WOON KIM,KUK-HO BAE,et al.Embeded Linux implementation on a commercial digital TV system[J].Consumer Electronics,2003,49(4):155-159.
(责任编辑:杜能钢)
龙芬(1984-),女,湖南祁东人,咸宁职业技术学院工学院讲师,研究方向为自动测试系统。
10.11907/rjdk.162622
TP319
A
1672-7800(2017)003-0091-03
我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自各大过期杂志,内容仅供学习参考,不准确地方联系删除处理!