文/林福德
数字高清电视系统中Linux驱动的基本结构及应用
文/林福德
数字高清电视保留了对传统的模拟信号进行抽样、量化和编码后转换成的二进制数字式信号,也支持对目前主流数字媒体设备的数字信号处理,同时也向互联网应用、人机交互、智能家居和客户定制等方向发展,基于Linux系统的电视方案中Linux驱动发挥着重要的作用。文章首先对Linux驱动进行了介绍,然后对Linux驱动的基本结构进行了分析,最后对Linux驱动的使用方法进行了探讨,为相关人员提供借鉴。
数字高清电视系统 Linux驱动 驱动设备加载
在Linux系统中设备驱动程序是硬件设备的控制代码,基于Linux的数字高清电视系统中如果没有Linux驱动,那么就无法保证运行系统的功能。文章重点对数字高清电视系统中Linux驱动的基本结构和使用方法进行分析和探讨。
Linux是一种利用POSIX操作的系统,有着BSD和SYSV两种特征。相比其它系统,Linux具有连接用户多、拥有多种平台及有虚拟内存等优势,再加上其源代码经常不关闭,用户在使用时可以根据不同的需求选择操作系统,进而能够很好地满足用户各种需求。另外,由于Linux是一款免费软件,系统所花费成本相对较低,而且可以根据用户需求进行剪裁,所以相比于其他系统有着很好的实用性及稳定性,在软件开发时越来越多的人通过Linux平台进行开发研究。
Linux系统主要分为下面几种:字符设备以及网络设备等。不同的模块与不同的设备相互对应,同时也可以将模块分为不同的模块。但是这种分类不是十分严格。
(1)字符设备是一种可以同字节流一样进行访问的设备,利用相应的程序来完成。字符设备驱动程序可以在不同设备中随意使用打开、关闭、读取和编辑等系统调用。字符终端(/dev/console)和串口(/dev/ttys0以及类似设备)就可以较好的显示成流抽象索。在进行访问时可以利用文件系统节点(比如/dev/tty1和/dev/mtd0等),以 fl ash的mtd设备为例操作单元小到字节,分区只须擦除一次就可以顺序写数据直至所有空间都写满才需要重新擦除后再写,所以小数据操作时只要管理算法得当就能很大程度上提高设备的使用寿命;常用的文件在进行访问时,指针可以随意移动,字符设备进行访问时遵守一定的次序,指针不能进行移动;有的设备性能与其具有一定的相似性,在进行访问时指针也能够随意移动,就像帧抓取器在访问时指针可以随意移动。
图1:将模块存入内核
(2)模块设备与字符设备相同,模块设备在进行访问时是利用/dev目录来进行访问。模块设备(就像磁盘)可以承载一些系统。在许多Unix系统运行过程中,模块设备都是以整数形式存在的,但是每个设备之间也有着差异性。
Linux可以使程序进行读写时像字符设备一样,可以一次性传送多种字符,所以模块设备与字符设备的不同之处就是数据管理的方式,即设备所连接的接口不同。与字符设备相同,模块设备在进行访问时也需要通过节点,用户使用时会明显发现它们间的不同之处,以flash的mtdblock设备为例操作的最小单元是block,写每个block之前都必须先擦除原有数据,较大数据量的操作时在速度上比字符设备会有很大的优势。模块设备不仅能给内核提供接口,还能够向模块设备提供接口,但是在dev目录中打开是不能发现这些接口的。除此之外模块设备如果不支持挂装文件系统,就不能进行相应操作。
(3)在进行网络访问时都需要通过一个接口,即能够与其它主机进行数据共享的设备。一般将硬件来作为接口,也可以是一个软件设备,就像回环接口一样。网络接口的运行需要通过系统驱动来完成,以此来保证数据间的传递,完全不用了解数据传递的运行原理。最后Telnet以FTP连接都由一个设备来进行,但是只能看到数据包,由于使用的设备都不是面向流的设备,所以把运行接口应用到不同的设备(比如/dev/tty1)不容易。
Linux是通过模块的形式进行连接的设备,即每个模块都有着自己的程序,设备驱动程序应当给Linux的中心或者所属系统提供一个程序。
设备驱动在运行的过程中经常需要用到函数init_module(),这个函数负责设备的初始化运行。其有着很重要的作用就是在系统中进行注册,在注册的过程中经常会用到register_ chrdev()以及register_blkdev()。注册完成后,这个设备就会得到自己的设备号,而且还与文件产生了联系。这跟PCI、USB设备进行注册的时候有些差异。设备驱动在进行删除时会将数据回收,然后会在系统中注销相应的账号,字符设备调用unregister_chrdev()、模块设备调用unregister_blkdev()。调用insmod进行模块的使用过程中设备会自动通过初始化函数保存数据,调用rmmod删除这个模块时会自动通过注销函数来进行设备的卸载,除此之外用户还可以通过lsmod命令来获取已经加载过的模块数据。系统对数据的获取就是设备具体的操作过程,就像open、read、write、ioctl等设备的使用过程。图1是设备模块的挂接、删除和数据保存的具体流程。
(1)设备驱动就是利用函数:open()、close()、read()、write()、ioctl()的过程来进行的。在进行操作的时候,open会启动模块,模块开始运行,close是关闭这个模块,这整个操作都是在read、write之中进行的,而且ioctl会对整个模块进行一定的调整。所以在设备系统的操作过程中起到了很大的作用,fops进行注册的方式如下:
以上表明, fi le_ fops对设备的运行有着一定的影响。由这些数据可以得出,基本完成了设备的开、关、读、写和控制功能。通过程序对文件进行读取的时候,最重要的操作就是通过系统来调用函数,将这个过程作为数据进行传递,通过这种方式来连接驱动与核心。
Linux驱动程序利用函数运行,自动配置和初始化子程序能够检测设备是否能够正常运行。要是设备没有异常,就会对整个系统进行初始化运行。而这个程序只会在初始化操作时才会运行。
(2)根据I/O发出的指令而运行的子程序,又叫做程序的上半部分。这些程序在执行命令的过程中,系统依然会认定其与系统调用处于同一个进程。只是用户进行了不同的操作,创造了用户操作的环境,所以对在进行此项操作时通常会运行相应的函数。
(3)结束子程序运行状态,通常又称为驱动的下半部分。在进行系统调用时无法直接调用设备驱动程序的子程序,只能利用Linux系统来结束子程序的运行,然后通过系统来对中断服务子程序进行调用。中断的情况会出现在所有运行的程序中,所以当中断服务程序被调用时,不要通过任意一个程序来调用,也就是不能对正在运行程序的函数进行调用。由于设备驱动程序一般只能通过同一种设备的驱动程序进行调用,因此在进行此操作的时候,经常会使用同一个参数。
综上所述,数字高清电视系统是数字进程的一个主要产物,集中体现了计算机、多媒体、加解扰算法、熟悉压缩编码、通信技术、加解密算法的发展水平。在数字高清电视系统中Linux驱动作为数字高清电视广播的主流接收端,在数字电视普及和发展过程中发挥着重要作用。本文通过对数字高清电视系统中Linux驱动的基本结构和使用方法进行研究,可以使程序的开发更加简单,提高产品的可移植性和开放性,保证了数字高清电视系统的扩展性。
[1]范质坚.Linux在嵌入式系统中的应用[J].计算机与现代化,2000(06):22-25.
[2]夏一民,罗军,邓胜兰.实时Linux操作系统初探[J].计算机应用研究,2001(01):45-48.
[3]刘云新,张尧学.一个基于Linux的嵌入式实时操作系统[J].计算机工程与应用,2001(07):64-66+85.
作者单位 广东九联科技股份有限公司 广东省惠州市516025
林福德(1985-),男,广东省梅州市人。大学本科学历。工程师,从事软件开发工作。