实现一个嵌入式Linux设备驱动程序的大致流程如下:
- 查看原理图,理解相应设备的工作原理。
- 定义主设备号。主设备号唯一标识了设备类型,即驱动程序类型。
- 编写驱动程序初始化函数和退出函数,实现驱动的注册和卸载。驱动程序的初始化在init()中完成,包括对硬件初始化,中断函数,向内核注册驱动程序等等。在关闭设备时需要有清除函数,在exit()函数中通过调用unregister函数实现。
- 设计所要实现的函数。Linux操作系统将所有的设备都看成文件,以操作文件的方式访问设备。应用程序不能直接操作硬件,使用统一的接口函数调用硬件驱动程序,如open,close,read,write等函数。
- 设备的中断和轮询处理。对于不支持中断的设备,读写时需要轮询设备状态,以及是否需要继续进行数据传输。如果设备支持中断,在使用中断前要先请求一个中断通道(或者IRQ中断),并在使用后释放它。通过request_irq()函数来注册中断,free_irq()函数来释放。
- 调试驱动程序:方法一般有两种:1)编译该驱动程序到内核中;2)通过模块方式加载,也就是利用insmod 加载驱动模块。第一种方式需要的时间比较久,不利于多次调试,调试我们还是比较常用第二种方式,方便快捷。
系统调用时操作系统内核和应用程序之间的接口,设备驱动程序是操作系统内核和机器硬件之间的接口。设备驱动程序为应用程序屏蔽了硬件的细节,这样在应用程序看来,硬件设备只是一个设备文件,应用程序可以像操作普通文件一样对硬件设备进行操作。设备驱动程序是内核的一部分,他完成以下功能:
1)对设备初始化和释放
2)把数据从内核传送到硬件和从硬件读取数据
3)读取应用程序传送给设备文件的数据和回送应用程序请求的数据
4)检测和处理设备出现的错误