首页 理论教育ARM嵌入式系统应用:GPIO驱动编写实例

ARM嵌入式系统应用:GPIO驱动编写实例

【摘要】:GPIO属于字符设备,其驱动可以归类为Linux设备驱动的字符设备驱动。编写一个程序gpio_led.c,实现对实验箱CVT_A8上连接在GPIO端口的LED驱动程序,使得实验箱上的发光二极管轮流点亮,既常见的流水灯。既然是这样,则编写设备驱动程序的主要工作就是编写子函数,并填充file_operations的各个域。函数分别为device ioctl并在模块初始化函数dev init中调用misc register函数进行注册ioctl操作函数实现。模块退出操作模块退出,必须删除设备驱动程序并释放占用的资源,使用unregister_chrdev删除设备驱动程序。

GPIO属于字符设备,其驱动可以归类为Linux设备驱动的字符设备驱动。故本章节将编写一个简单的字符设备驱动程序。虽然它的功能很简单,但是通过它可以了解Linux的设备驱动程序的工作原理。编写一个程序gpio_led.c,实现对实验箱CVT_A8上连接在GPIO端口的LED驱动程序,使得实验箱上的发光二极管轮流点亮,既常见的流水灯。它主要包含如下三个部分。

(1)模块初始化

由于用户进程是通过设备文件同硬件打交道,对设备文件的操作方式不外乎就是一些系统调用,如open,read,write,close,注意,不是fopen,fread,但是如何把系统调用和驱动程序关联起来呢?这需要了解一个非常关键的数据结构。

这个结构的每一个成员的名字都对应着一个系统调用。用户进程利用系统调用在对设备文件进行诸如read/write操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。这是linux的设备驱动程序工作的基本原理。既然是这样,则编写设备驱动程序的主要工作就是编写子函数,并填充file_operations的各个域。如下所示,gpioleds_ioc实现了ioctl的文件操作,其处理函数分别为device_ioctl。并在模块初始化函数dev_init中调用misc_register函数进行注册。

函数分别为device ioctl并在模块初始化函数dev init中调用misc register函数进行注册(www.chuimin.cn)

ioctl操作函数实现。

(2)模块退出操作

模块退出,必须删除设备驱动程序并释放占用的资源,使用unregister_chrdev删除设备驱动程序。代码如下所示。