相关文章

步进电机驱动程序设计——Linux驱动程序概述

随着嵌进式技术的飞速发展,基于嵌进式系统的新一代产业控制器也日益增多。同以往的控制器不同,新的仪器大多以32位嵌进式处理器为核心,并且安装有嵌进式操纵系统,从而大幅度进步了处理能力,方便了设计开发。在各种嵌进式操纵系统中,嵌进式Linux是免费的自由软件,其构建的系统本钱较低,而且Linux是单内核的操纵系统,并可按要求进行任意剪裁,因此越来越多的研究职员开始在用Linux平台来开发自己的产品[1]。

嵌进式开发过程中,经常需要为特定设备开发驱动程序。这些驱动程序的编写和编译与PC上的Linux驱动开发相比存在明显的差异,需要考虑的因素更多,实现过程更为复杂。本文以SAMSUNG公司S3C2410X CPU为例,探讨如作甚使用嵌进式Linux的产业控制器开发字符设备驱动程序来驱动步进电动机。

在Linux中,几乎所有的内容都是文件,对设备驱动的访问也是以文件操纵的方式实现的。Linux系统支持3种类型的硬件设备:字符设备、块设备和网络设备,这些设备的驱动程序是系统内核的重要组成部分。对用户程序而言,操纵系统隐躲了设备的具体细节,把设备映射为一个设备文件,用户程序可以对设备文件进行open、CLOSE、read、write等操纵。这些操纵和驱动程序是通过STruct file_operations这一数据结构关联起来的,编写设备驱动程序的主要工作就是编写子函数填充file_operations的各个字段。

其一,驱动与内核接口层,它实现驱动模块在Linux内核的注册加载与卸除工作。主要任务就是在模块加载时向内核注册驱动,以及实现虚拟文件系统的设备操纵接口。对于采用中断的设备,此部分还包括中断处理函数的注册与注销。

其二,硬件设备接口层,这部分主要描述驱动程序与设备的交互。它主要包括硬件探测和初始化以及设备的读写访问和设备控制操纵。硬件探测主要是在驱动注册加载时监测设备是否存在,设备初始化主要是检测到设备后对它进行初始化操纵。设备的读写操纵主要完成从设备接受数据和将数据发送给设备的操纵。硬件设备接口层还需要包括一些设备的控制操纵,设定设备的工作参数。

对于驱动程序与内核接口层,Linux提供了标准的进口点函数init_module();在通过模块化的设计方法设计驱动程序时,使用insmod加载核心模块时会调用本函数,通知内核对驱动程序进行注册。模块的卸除工作与加载工作类似,通过rmmod卸载模块时,调用cleanup_module()取消驱动程序的注册。