摘 要: 为了实现USB 摄像头在ARM平台Linux系统下的应用,通过对Linux系统中摄像头程序和驱动模块的分析,开发出一款ARM平台Linux 系统下USB摄像头的通用驱动程序,解决了由于硬件设备不同而导致的与内核驱动不兼容的问题。简要介绍了USB摄像头驱动的基本框架和开发流程,最后选定5款USB摄像头测试了所开发的驱动程序的有效性和通用性.
关键词 ARM9; Linux系统; USB摄像头; 驱动程序; 通用性
0引言
Linux操作系统是一款性能优良、多用户、多任务的操作系统[1],因其具有功能强大、稳定性高、代码开源且成本低等优势使其迅速跻身于主流嵌入式开发平台[2][3],然而嵌入式设备种类繁多和性能各异的特点又增加了产品驱动程序设计的复杂性,使得驱动设备和驱动程序之间有着一一对应的局限性。针对该局限性本文开发出了一款应用于普通USB摄像头的驱动程序,打破了摄像头设备和驱动程序之间一对一的局限性,解决了由于硬件设备不同而导致的与内核驱动不兼容的问题.
1驱动设备与驱动模块
设备的驱动程序控制操作系统和硬件之间的交互,是Linux内核的重要组成部分[4]。驱动程序通过向用户提供硬件的标准化接口,使得应用程序开发时不需要过多的关注硬件设备的细节,为用户程序的开发带来了极大的便利。
Linux系统的运行状态为三层结构,第一层为用户层即应用程序层,第二层供内核运行使用称为内核层,第三层是设备驱动层即驱动程序层[5][6]。由于Linux内核与驱动的紧密性,所以用户层想要访问或者控制某个硬件设备都要通过驱动层才能得以实现。
在Linux系统中设备一般分为三类:字符设备、块设备和网络设备[7]。其中最常用的是字符设备,本文所介绍的通用USB摄像头驱动程序也是字符型设备驱动程序。Linux系统访问设备的过程和访问文件的过程类似,打开设备调用open()函数,关闭设备则调用close()函数。在Linux系统下,设备文件的设备号有主次之分,主设备号指明对应的设备驱动,次设备号则用于区分设备驱动下的独立设备[8]。而这些设备号在驱动程序启动之前需要先在内核中进行注册,只有当该设备号在内核里面注册之后才能对其进行占用[9]。
驱动模块,顾名思义就是把驱动程序模块化。程序从编写到编译通过再到正常运行一般要经过以下几个过程:代码的编写制作、把编写好的代码用编译器编译生成目标文件、由链接器把目标对象链接起来形成可执行的文件形式[10]。而模块化则省去链接目标对象文件这一步,虽然模块的程序因为没有链接不能独立的运行,但是它可以直接装载进内核,等到用完后又可以直接从内核中卸载出来。这样不仅使内核的功能更加强大,而且还有益于程序的改进与修改。
作者:曾明如