新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于嵌入式ARM Linux步进电机驱动程序的设计

基于嵌入式ARM Linux步进电机驱动程序的设计

作者:时间:2010-09-28来源:网络收藏

2 驱动系统
内核结构体系可分为:应用程序、库函数、操作系统(内核)、。在操作系统中,是操作系统内核与硬件设备的直接接口,屏蔽了硬件的细节,驱动程序是内核的一部分,它具有以下功能:
对设备初始化和释放:比如向内核注册这个程序,这样应用程序传入文件名时,内核才能找到相应的驱动程序。
对设备进行管理,包括实时参数设置以及提供对设备的操作接口。
读取应用程序传送给设备文件的数据并回送给应用程序请求的数据。
检测是处理设备出现的错误。
如图3所示,应用程序通过系统的调用实现与内核通信。由于Linux中将设备当做文件处理,所以对设备进行操作的调用和对文件操作的操作类似,主要包括open()、read()、write()、ioctl()、close()等接口函数。应用程序发出系统调用命令后,会从用户态转到内核态,通过内核将openO等的系统调用转换成对物理设备的操作。在Linux中通过分层实现对物理设备的调用,这样使得内核的结构清晰,提高了模块化的独立性。

5c.JPG


2.1 Linux设备驱动程序的框架
Linux系统设备分成三种基本类型:字符设备、块设备、网络设备。每个模块通常实现其中某一种:字符模块、块模块或网络模块。
设备驱动整体可分以下两部分:
(1)硬件设备接口层。这部分主要描述驱动程序与设备的交互。
(2)驱动与内核接口层,它实现驱动模块在Linux内核的注册加载与卸除工作。
对于驱动程序与内核接口层,Linux提供了标准的入口点函数init_functionO;在通过模块化的方法驱动程序时,使用insmod加载核心模块时会调用本函数,通知内核对驱动程序进行注册。模块的卸除工作与加载工作类似,通过rmmod卸载模块时,调用cleanup_funct-ion0取消驱动程序的注册。
2.2 GPIO的驱动开发
GPIO(General Purpose Input Output)的驱动可以归类为Linux设备驱动的字符设备驱动,以下是开发它的一些具体步骤。
2.2.1 开发步骤
(1)模块化驱动程序
写字符设备的驱动程序时,也要遵守模块化编程的一般规范。设备模块在用户空间的初始化和终止:
Init_mnodule()向内核注册模块提供数据结构、局部和全局变量。
Cleanup_module()取消所有init_module在内核中的注册。
(2)设备模块在内核空间的内存申请和释放
kmalloc()函数分配一段内存,这样就实现了Chrdevs向量表中指向设备驱动程序名称的指针。使用kfree释放内存。
(3)字符设备主设备号和次设备号的分配
主设备号标志设备对应的驱动程序,内核利用主设备号将设备与相应的驱动程序对应起来。主设备号的取值范围是O~255,如果不善加规划,则容易造成主设备号的冲突。
次设备号由驱动程序使用,内核的其他部分并不使用它,仅将它传递给驱动程序。
(4)设备模块在内核空间的注册与注销
字符设备的注册有两种方法,一种是常用注册方法,通过系统函数registel_chrdev()将设备加入到系统设备列表中;另一种是devfs技术,通过系统函数devfs-regisrer()实现设备的注册。注销与注册相反,分别调用unregister_chrdev()函数和devfs_unregister()函数。
(5)设备模块在内核空间提供系统调用的函数设备驱动程序在注册成功以后,用户可以通过访问设备特殊文件(一般情况在/dev目录下)实现系统调用。
GPIO驱动程序只需要一个file operations数据结构体就可以了。
2.2.2 驱动开发
要写实际的驱动,就必需了解相关的硬件资源。比如:用到的寄存器、物理地址、中断等。在这里,它用到如下硬件资源,如表2所示。

5d.JPG

linux操作系统文章专题:linux操作系统详解(linux不再难懂)
双控开关相关文章:双控开关原理


评论


相关推荐

技术专区

关闭