5设备驱动程序开发
5.1 Linux设备驱动程序开发步骤
Linux系统设备分为字符设备、块设备和网络设备3种。其设备驱动的开发主要包括:
a)在驱动程序源文件中定义file_opera-tions结构,并编写出设备需要的各个操作函数,对于设备不需要的操作函数用NULL初始化,这些操作函数将被注册到内核中。
b)定义一个初始化函数,在Linux初始化时会调用此函数。此函数包含:初始化驱动程序要用到的硬件寄存器;初始化与设备相关的参数;注册设备;注册设备使用的中断和函数;其他一些初始化工作。
c)对于驱动程序的使用,可以进行静态编译,也可以进行动态编译。静态编译是指将设备驱动程序添加到内核中,动态编译是指将设备驱动程序编译成驱动模块。
本嵌入式系统主要用于视频处理,涉及到的外设主要是显示设备和输入设备。这里采用的显示设备是LCD,而输入设备是通过USB接口与系统相连的。
5.2 LCD显示驱动程序开发
LCD的设备驱动程序属于字符设备的驱动,应按照字符设备的规则编写。在Linux下进行LCD显示用Framebuffer技术,这是提取图形的设备,是用户进入图形界面很好的接口。Linux内核根据硬件描述抽象出Framebuffer设备,供用户态的进程直接进行写屏。可以将 Framebuffer看成是显示内存的一个映像,将其映射到进程地址空间之后,就可以直接进行读写操作,写操作立即反应在屏幕上。 Framebuffer的设备文件一般存放在/dev这个目录下,对此设备文件进行操作即可实现图像的显示。
LCD显示驱动程序主要包括:
a)LCD驱动的文件结构:包括打开设备文件、设备文件其它操作、关闭设备文件等;
b)LCD的打开:LCD设备以读写的方式打开;
c)LCD设备的硬件初始化:包括注册LCD设备、卸载LCD设备等;
d)LCD相关结构的设置:以获取显存起始地址、分别率、色深等;
e)映射内存区的操作:包括初始化显存清零等,将摄像头采集到的图像数据读至显存处,以显示图像;
f)LCD控制输出:包括得到命令、画水平线、画垂直线、画圆等;
g)LCD的关闭。
将上面的内容用程序实现,进行动态编译。通过后,将LCD驱动模块进行移植加载,一个完整的LCD驱动就开发完毕了。
5.3 USB驱动程序开发
与LCD设备不同,USB既不属于字符设备,也不属于块设备,而是一个新的设备类别,设计框架和流程如下:首先,提供一个“.o”的驱动模块文件,且在一开始就加载运行。USB驱动就会根据其类型向系统注册。注册成功后,系统会反馈一个主设备号,这个主设备号就是其唯一标识。USB驱动就是根据主设备号创建一个放置在/dev目录下的设备文件。要访问此硬件,可用open、read和write等命令访问相应的设备文件,驱动就会接收到相应的 read或write函数,根据模块中相对应的函数进行操作。驱动流程见图6。
USB驱动的具体设计过程如下:
a)USB驱动的注册。USB驱动程序在注册时会发送一个命令给函数register_chrdev,通常在驱动程序的初始化函数中。当USB 设备插入时,为了使linux-hotplug(Linux中USB等设备热插拔支持)系统自动装载驱动程序,需创建 MODULE_DEVICE_TABLE,在此过程中需将USB的主设备号传递给相应的函数。
b)USB设备的打开。打开设备是通过调用file_operations结构中的函数open()来完成的。其主要完成的任务是:检查设备相关错误,如果是第一次打开,则初始化硬件设备;识别次设备号;使用计数增1。
c)USB设备的释放。释放设备是通过调用file_operations结构中的函数release()来完成的。它的作用正好与open()相反,通常要完成这样的工作:使用计数减1,如果使用计算为0,则关闭设备。
d)USB设备的控制信息与数据读写。USB设备驱动程序可以通过文件操作结构中的函数向应用程序提供对硬件进行控制的接口,同时读写操作也要通过此函数来完成。
e)USB驱动的注销。当从系统卸载驱动程序时,需要注销USB设备,这样必须编写一个注销函数unregister_chrdev。
6结束语
本文基于TMS320DM*6平台实现了Linux移植,包括创建交叉编译环境、BootLoader的设计、Linux内核移植以及LCD、 USB设备驱动程序开发,为实时视频处理应用开发创建了一个良好的嵌入式平台,在此平台上可进一步进行应用程序、GUI及视频处理算法开发与测试。