Linux中LonWorks现场总线设备驱动设计

http://tech.ddvip.com   2007年03月12日    社区交流

本文详细介绍Linux中LonWorks现场总线设备驱动设计

  ●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指针来访问相应的数据并进行处理了。这样核心驱动模块部分的程序就完成了。

作者:刘 广 石婷婷    责编:豆豆技术应用

正在加载评论...