LonWorks现场总线设备驱动设计与实现
作者:刘 广 石婷婷
1 引言
新设备及新的接口规范等的不断出现,使得操作系统的设备驱动部分的开发工作层出不穷。我们在基于嵌入式Linux智能控制器的开发中,首先遇到了LonWorks现场总线设备的驱动程序问题。于是我们对Linux的驱动程序实现机制进行了深入研究,并开发了LonWorks现场总线设备的驱动程序。
2 关于LonWorks现场总线
现场总线是一种工业数据总线,是连接智能现场设备和自动化系统的高可靠的数字式、双向传输的通信技术,可方便地构成全数字化的分布式现场控制网络。对于防护工程这种工程轴线长、监控测点分散的系统,特别适合采用现场总线技术构成工程的分布式智能化控制系统。
在各种现场总线中,LonWorks总线技术以其在技术先进性、可靠性、开放性、拓扑结构灵活性等方面独特的优势,为集散式监控系统提供了很强的实现手段。使其特别适合于建筑的楼宇自动化系统。根据防护工程是一种特殊的地下建筑工程以及其布局特点,特别适合采用LonWorks现场总线技术实现其内部设备的自动化监控。
网络接口卡是主计算机与LonWorks网络的接口,使计算机能够完成与LonWorks节点之间的数据交换。在我们设计的智能控制器中,采用专门的嵌入式LonWorks现场总线接口卡作为嵌入式CPU与Lon- Works现场总线网络之间的接口设备。
2.1 LonWorks现场总线网卡的原理
了解LonWorks现场总线卡的工作原理,对编写驱动程序是必要的,故我们首先给出其工作原理,并对此作一些必要的解释。图1是嵌入式LonWorks网卡的硬件电路方框图。
图1 ISA网卡的硬件电路方框图
过去实现微控制器与ISA总线的接口一般使用8155、8255,电路复杂,调试困难,在本网卡的设计中,使用可编程逻辑阵列(CPLD)来实现与ISA总线的接口逻辑,只用一个芯片就完成了所有功能,大大简化了网卡的电路。
2.2 LonWorks现场总线网卡的工作过程
计算机与微控制器之间数据交换接口的应用程序框图如图2、3所示。在程序框图中,主要实现了计算机与微控制器之间读写数据、置标志位和清除标志位的功能。CPLD内部实现了存储数据和标志位的寄存器。
图2 主机写数据程序框图
图3 从机接收数据程序框图
3 LonWorks现场总线网卡设备驱动实现
我们在Linux平台上开发和设计了LonWorks现场总线网卡的软件。软件部分由应用程序和设备驱动程序两部分构成,这里首先主要讨论的是设备驱动程序部分。在Linux平台上实现对硬件的驱动支持可以有两种方式:一种是直接在用户空间来实现;另一种是使用Linux内核中提供的机制来实现。考虑到用户空间驱动程序的局限性,比如为了访问特权指令(I/O指令)必须做一些影响系统安全的设置等等,我们在开发中采用了第二种方式。
3.1 Linux的可加载模块机制
Linux内核提供了两种机制来开发设备驱动程序:一种是直接把驱动程序链接到内核中:另一种则是通过称为Linux可加载模块的机制来开发可动态加载和卸载的驱动模块。而第一种方式可以在后一种方式成功后,采用与内核一起提供的配置工具和接口来完成。所以,我们只研究可加载模块机制。
Linux作为单核结构其效率比较高,但是系统灵活性不足,为了平衡这两者的关系,它提供了可动态加载机制。利用这种机制我们可以开发Linux内核模块,并且可以动态的对它加载和卸载。Linux下的设备驱动程序一般都支持这种方式,且模块被加载到内核后,它就可以任意的利用核心提供的各种资源和服务了。为了让模块利用核心提供的资源,Linux内核维护了一张所有内核资源的符号表(在接下来的部分我们称它为内核资源符号表),用于在模块载入时解决对相应资源的引用问题。
并且,Linux允许模块的堆栈操作,由此一个模块可以使用其他模块所提供的资源。也就是说:一个模块对另一个模块的资源的使用与其对内核资源的使用非常相似,不同的只是这些服务的资源从属于另一个模块而已。每当一个模块被加载Linux就会有一个修改内核资源符号表的过程,将该模块所提供的服务和资源加入进去,这样另一个模块载入时,如果需要就可以引用这个模块的资源了。而卸载一个模块时,就要知道当前模块是否正在被使用。如果没有被使用,在卸载时要能够通知该模块它将被卸载,以便由它自己释放已被它占用的系统资源。然后,Linux还要从内核资源符号表中删除所有该模块提供的资源和服务。
从上面的原理分析可知,内核模块编写时应该具有两个主要的接口函数:init_module()用于在模块加载时由加载模块的工具调用,以便于注册一些必要的服务和申请一些资源。cleanup_module()用于在模块卸载时由删除模块的工具来调用,清除掉由init_module()所做的工作,从而使内核模块可以安全的卸载。其中对init_module()调用的一种工具是在根用户执行insmod命令来加载模块时执行。而对于cleanup_module()的调用是在根用户使用rmmod命令来卸载模块时执行。
- LONWORKS智能家居系统设计方案(07-08)
- 嵌入式向产业上游迈进(01-06)
- 基于ARM的嵌入式网络收音机的设计(01-15)
- 基于多媒体处理器VG2的智能家居控制器设计(02-21)
- 诺基亚将在更多产品采用Linux操作系统(04-21)
- 手机的操作系统(05-12)