LonWorks现场总线设备驱动设计与实现
(3) 模块初始化与模块卸载
本文引用地址://m.amcfsurvey.com/article/83666.htm●LonWorks现场总线网卡驱动模块初始化,通过对init_module的实现来完成以下几个任务。以字符设备类型向系统注册LonWorks现场总线设备卡,同时动态获得其设备号。通过调用下面这个函数int register_ chrdev(unsigned int major, const char*name, struct file_operations *fops)来实现。这里我们使major参数为0,这样系统就会动态的分配并返回主设备号。name参数是用于标识设备的字符串。file_ operatons传入的是如前所述的lmdev_fops。然后,向系统申请LonWorks现场总线网卡的I/O端口地址。我们根据该卡上的跳线得到的I/O地址,调用系统提供的宏:check_region(start,n)//检查端口地址范围start到start+n-1是否可用,是则返回0,否则返回1。request_region(start,n,name)//用于申请通过以上函数检查的地址范围。接下来,做一些必要的系统日志,根据各种条件用printk向系统日志缓冲区写入不同级别的信息。最后,控制对内核资源提供的符号表输出的符号信息(即在可加载模块机制部分提到的模块要注册的服务)。这里使用EX- PORT_NO_SYMBOLS使得该模块不输出任何符号信息。
●LonWorks现场总线网卡模块卸载需要完成以下几个任务:
调用release_region(start,n)宏释放模块初始化时申请的I/O端口资源。
调用int unregister_chrdev(unsigned int major, const char*name);
向系统注销该字符设备,本程序中major参数即前面注册时动态获得的主设备号,name与注册时提供的name字符串相同。调用printk函数,做一些必要的系统日志。
(4) 对file operations结构中入口点的实现
●open和release入口点。
这两个入口点在本模块中被赋予的就是前面在介绍file_operations结构时给出的lmdev_open和lmdev_ close函数指针,它们主要通过调用MOD_INC_USE_COUNT及MOD_DEC_USE _COUNT来进行模块计数。用计数来对LonWorks现场总线设备驱动模块是否正在被使用进行控制,防止模块正在使用时被意外卸载而导致核心对设备操作出现异常。
●对read/write入口点的实现
这个入口点在本模块中被赋予的就是前面在介绍file_operations结构时给出的lmdev_read函数指针,它是对设备操作的核心部分,根据前面描述的算法,它实现了如下几个功能:
用inb_p宏,访问硬件的状态和数据端口,以读取相应的状态和数据信息。
调用long_sleep_on_timeout(wait_queue_head_t *q, long timeout)函数把当前进程加入时钟等待队列q中,使它等待timeout时间。根据LonWorks现场总线卡的工作方式来看,这样做可以减少轮询时间,大大的提高了效率。
Linux分为核心空间和用户空间,用户空间的代码不能直接访问核心空间,故需调用Linux核心提供的copy_to_user(to,from,n)宏,把数据从内核空间地址from拷贝到用户空间地址to中。这样,系统调用返回后,用户空间的代码就可以通过to指针来访问相应的数据并进行处理了。这样核心驱动模块部分的程序就完成了。
(5) 编译内核模块
在程序完成后,用gcc编译成目标文件(不链接,生成*.o文件),要做到这一点只需在gcc命令行里加上-c参数。另外,还要加上-D_ KERNEL_ -DMODULE参数。上述程序可以这么编译。
root# gcc -c -D-KERNEL_-DMODULE -Wall -02 lmdev.c。其中参数-Wall的功能是打印附加的警告信息。由于头文件中的函数都是声明为inline的,还必须给编译器指定-O选项。gcc只有打开优化选项后才能扩展内嵌函数,不过它能同时接受-g和-O选项,这样就可以调试那些内嵌函数的代码了。优化参数-O有三个级别:Ol, 02, 03,它们的优化程度不同,优化效果03大于02大于Ol。
编译好模块后的如何加载模块,在前面已经有所描述,这里就不再叙述了。
3.4 应用程序开发
在对以上模块编译并加载后,Linux根据用户可用mknod命令,利用动态分配的主设备号(该设备号在用户空间可以从/proc/devices文件中用设备名获得)建立相应的设备文件,并对它设置恰当读写权限后,就可以在我们的应用程序中,使用Linux的文件系统调用通过这个设备文件来操作LonWorks现场总线卡了。这样做不仅使得应用程序编程风格更加统一,代码更具鲁棒性,应用系统更加安全更易于维护。而且可在核心级来保证关键部分的实时响应,从而降低了用户程序开发的难度。
下面是我们为这个驱动开发的测试程序的一些实验结果,测试项目为:
通过智能控制器检测LonWorks现场总线网络节点分布状况。测试结果如图4所示:
图4 LonWorks现场总线网络节点检测结果
结果分析:智能控制器分别检测出1#LonWorks现场总线通道6号节点有一个开关量前端(LM1202),2#LonWorks现场总线通道11号节点有一模拟量前端(LM1101)。智能控制器检测结果与实际LonWorks现场总线网络节点分布一致,这说明LonWorks现场总线设备驱动程序正确运行。到此,LonWorks现场总线设备驱动开发完成。
4 结束语
本文在研究了基于嵌入式Linux平台的驱动程序开发机制后,研究实现了嵌入式Linux环境下的LonWorks现场总线网卡的设备驱动。应用实现结果表明,该设备驱动运转正常、性能可靠。这一研究课题的成功的解决对于拓宽LonWorks现场总线应用领域具有借鉴和推广意义。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
评论