总结一下写linux设备驱动的过程

来源:互联网 发布:阿里指数怎么看淘宝 编辑:程序博客网 时间:2024/05/01 08:19

我写驱动的事,得从去年开始讲. 话说八个月前,从参加比赛开始,我的工作就是写两个linux下的设备"驱动".当时是什么都不懂的样子,查这个查那个,上网上了不少,还是一片迷茫.只是潜意识里觉得自己做的这个东西还是蛮牛叉的东西,写驱动程序诶! 当然后来发现那个叫"驱动"实在是有点勉强.

描述一下我的实际工作:很简单,就是把两个串口设备(GPS模块和读卡器)连到PC机上,我的程序就是使Linux系统识别、设置并使用这两个设备。在看了越来越多的资料之后,我发现我要做的工作并不多,因为设备是连到串口上的,而Linux系统已经提供了串口读写的函数read()、write(),我的工作是:
1、利用串口读写函数对设备进行设置。
2、利用串口读写函数来获取设备返回的数据。
3、利用串口读写函数向设备发送数据。
这个实在没有多少技术含量,在查看了设备需要的特定指令之后,就可以很快完成工作了。主要的问题还是调试的时候,刚开始串口没有反应,什么信息都没有。一般来说,偏硬件的调试需要特别耐心加细心的检查了,幸好串口不复杂。这个叫驱动有点虚张声势,叫设备驱动程序还是准确的,它是建立在串口驱动之上的,即系统的串口驱动程序提供了串口信息传输的机制,我的GPS设备驱动程序则负责具体的那个GPS模块的控制。就像电信公司在你和我之间搭建好了电话线,而我则利用它来跟你进行具体的对话。后面附上GPS程序的源代码作参考,读卡器的代码稍长,就不拿上来浪费空间了:P

实际上我想在这篇文章里讲的不是串口设备驱动程序的写法,而是Linux设备驱动程序的组织方法。很幸运的,我后来又有机会写一个USB设备驱动程序,所以可以粗浅的比较一下两种驱动实现方法的区别。先看下面附的GPS驱动程序代码,大家在看到main()的时候一定很奇怪,--驱动程序怎么能有main()呢?呵呵,其实这个GPS驱动程序只是一些实现特定功能的函数,说白了,是提供给别人调用的,而这个调用者就是我们比赛时演示的那个应用程序,它通过调用各个GPS驱动函数来实现对GPS设备的控制。而你在源代码里看到的那个main()函数是冒牌的,它只是在调试的时候有用,等所有函数的功能都正确实现了,它也就被删掉了,所有函数都被提供给真正的应用程序,哎,是不是很没地位~~

如前所述,这个GPS驱动程序实际是提供给应用程序的一组函数,应用程序通过它们对设备进行控制,所以它们必须全部放在一起来编译。换句话说,这个应用程序实际是一个集成了串口设备驱动程序的应用程序,能直接通过串口来控制GPS模块,很牛的样子,可惜不标准。大部分驱动程序不是这么样滴,驱动应该是供许多应用程序使用的,当然不可能都在应用程序的源码里嵌入所要使用的设备驱动程序代码,那样就完了,应用程序用打印机,就得自己驱动打印机,用显示器,就得驱动显示器,不是的,驱动程序大都是独立的,它们与应用程序的通讯都要经过操作系统,受操作系统控制。在Linux里,有些通用驱动程序处于内核,其他的驱动程序都是作为模块形式存在的。后来我接触的那个USB设备驱动程序,就是以内核模块形式运行的。它与前面的GPS驱动最大的不同是:那个USB驱动程序是作为模块挂载的,与用户程序之间隔了一层Linux系统内核,而GPS驱动是直接与用户程序在一起的,一起编译,一起执行,不通过内核。

说了那么多,回过头来一看,晕,也没写出什么,不知大家看了有何感想....

原创粉丝点击