Chinaunix首页 | 论坛 | 博客
  • 博客访问: 260876
  • 博文数量: 49
  • 博客积分: 1684
  • 博客等级: 上尉
  • 技术积分: 458
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-09 22:45
文章分类

全部博文(49)

文章存档

2023年(1)

2021年(2)

2018年(2)

2017年(7)

2016年(2)

2015年(6)

2014年(13)

2013年(7)

2012年(7)

2011年(1)

2010年(1)

分类: LINUX

2010-10-14 11:37:16

Linux驱动终于可以暂告段落了!

缓口气!

前面一直抱着本书和宋宝华老 师的驱动详解在看,中间过程中也是一直在两本书上翻来翻去,因为看书和动手真的是两回事,书上看明白是很简单的事情,但是真正操练的时候,会发现,原来从 书上看明白的只是一些大道理,书上讲的一些细节或者没看明白,或者没记住,反正到实际操练的时候,肯定还是会有很多事情让你纠结的。

本来上半年一个比赛打算用USB摄像头的,当时急急忙忙的把USB协议过了一遍,后来发现淘宝上有一种接口的CMOS模块比USB摄像头用起来更简单,于是放弃了USB摄像头。在那之前我一直认为USB很神秘、很复杂,很难很难,但是看完书后,发现其实也不是传说中的那么难。后来暑假去深圳,便打算好好搞一下USB驱动。当时主要是考虑做linux端的,但是后来又发现linux里边支持的几种标准USB设备,还涉及到其他一些协议,太复杂了。然后才意识到,想吃透USB也不是简单的事情。当时为这个事情纠结了很长时间,怎么样找一个简单一点、可操作性强一点、又比较典型的东东来实验了?!手头有块BF533的板子,上面有USB hostusb device的芯片,BF533外置的,还有一片N年前买的2410的开发板,还有一个论坛赢得的一块STM32开发板(还没到手,原先以为11之前能到的,到现在还没到手,还要等几天),还有就是一哥们前面在组织USB逻辑分析仪DIY活动用的68013533由于手头的一个仿真机不好使,而且例程里边的代码仅仅有个芯片检测,别的都没有,也没什么好参照的;STM32还没到手,也不知道要等到什么时候;68013问了下那哥们,结果那哥们告诉我host驱动更有意思,不知所云;2410本人以前自己弄了一个基于uboot引导的小程序,可以用于调试,代码写好用uboot downSDRAM里边,然后go过去就可以执行的。想来想去还是这个最合适,于是翻出2410 datasheet开始研究(话说好几个月没摸2410了,生疏了不少啦,嘿嘿)。

闲话扯远了貌似,哈哈,下面言归正传!

USB协议看得差不多的时候,刚好在CU看到本书试读活动,哈哈,好机会岂容错过,赶紧跟帖发了申请,没想到居然把俺抽上了,机缘巧合,俺赶的太巧啦。再扯点题外话,看USB协议是为了打发从北京到深圳火车上的26个多小时里边的一大半时间的无奈之举,没想到效果还不错,要搁学校,我估计1026小时也看不了那么多内容,哈哈。

USB协议,到USB驱动,中间的路其实还很坎坷的。本人接触linux驱动时间也不是太长,之前对linux驱动的架构也不太清晰,基本的字符设备驱动倒是会写。分析完USB协议之后,便想着手linux端驱动的编写,此时有一个问题困惑了俺老长一段时间:USB设备的设备文件怎么生成?设备文件操作该如何处理?为这个问题,我到处想找个合适的USB驱动例子来学习一下,结果发现很多都是用的USB主设备号,就是major = 180,然后增加一个次设备号的做法,我觉得这样不爽,但是又不知道更好的办法是什么,纠结了N天也没找到答案。11前两天,貌似928号吧,同学告诉我收发室有我的挂号信,我当时还纳闷哪儿来的挂号信了,没想到去了一看,《linux那些事之我是USB》来啦。嗨,当时正等这本书嘞,结果花了两天时间把USB COREU盘翻了一遍过来,感觉东西有点多,没理解过来,又翻了一遍,感觉有点意思了,明白了USB host底层如何进行的一些操作,但是还是没找到我要的答案啦:设备文件的事,怎么没讲linux那些事之我是USB设备文件啦?!然后又把驱动详解拿出来看,这才找到答案,然后回头一想,原来只顾看书了,其中的精华根本没提取出来。书中一遍又一遍的在讲解设备和接口的区别(P8P28…),接口才是驱动单元驱动的对象,但是接口本身不是设备,linux里边的设备只有3类,字符,块,网络,其中是不包含接口的,也就是说没有接口的设备驱动(是不是接口驱动更合适?哈哈,无所谓啦,反正也是不存在的东东)这么一说,而USB本身却只是一个接口!!!我们要编写的设备驱动是只能有3种形式,要么是字符设备的驱动,要么是块设备的驱动,要么是网络设备的驱动。我们的USB设备属于哪一种了?哈哈,书中有云:“坦白地说,大多数USB设备都会与inputvideo等子系统关联,并不单单只是作为USB设备而存在。如果US……”(详见P31)这里我就不抄书啦,避避嫌。这才让人恍然大悟。USB接口的设备有该设备本身的属性,USB只是其与系统连接的接口而已,至于其访问方式是字符型,还是块类,这个跟USB接口是没有任何关系滴,只与这个USB接口的设备本身有关。那么对应在系统中的设备文件依然还是像普通字符设备或者块设备一样来创建设备文件以及访问啦。

到这里肯定有人会疑惑,那设备本身是字符或者块类型的,又如何与USB联系了?我要说的是,USB相对于这些设备本身来说,就像花姑娘的小外套。花姑娘不管穿什么外套,都改不了她是花姑娘的本质,不可能因为穿着马甲是花姑娘,而改穿风衣后就成老爷们啦。所以了,我们要做的就是给这些USB接口的字符设备或者块设备的驱动在字符设备或块设备驱动本身再加个小外套,至于这个小外套,哪件合适了?哈哈,当然是usb_driver这个外套最合她那妖娆的身段啦。

同时,这里可以联系一下设备模型。对了,说到设备模型,本书也觉得是值得大家赞许之作。里边讲设备模型讲的太形象、太生动啦,不仅讲了设备模型的原理,而且通过联系USB设备,引申出设备模型的应用,让人茅塞顿开。本人之前看了LDD3里边讲关于设备模型的章节,看了34遍也没弄清楚到底是怎么回事,曾经一度怀疑自己是否适合玩linux驱动。那里边也讲kobject等等的东西,而本书也讲这些,只是本书还有点睛之作,见P25,把busdriver的联系以及device,讲的非常浅显,不论懂不懂linux驱动架构,这几句话都是一看就明白,再结合代码里边的包含关系一看,感慨的仅仅会是:“哦,原来设备模型是这么回事呀!”其实可不是这样么?usb core会用bus_register()首先注册一条USB总线,然后所有的设备都将通过hub挂到该总线上来(假设硬件系统只有一个usb host)。至于在linux里边如何编写驱动来让设备工作,那关系可以用比较简单的话来概括,首先要有USB设备的两个ID,然后得有usb_driver,还得有probedisconnect,有了这些,USB接口的设备中的USB接口就可以在插入系统时,让系统知道他来了。然后usb core会生成一个usb_device(貌似是usb_interface。这个还没弄清楚到底怎么回事,还得再翻翻书,如果有误,欢迎指正),然后根据其ID,来查找usb bus上的usb_driver中的id_tables,看到底哪个驱动是专门为这个设备准备的。如果ID匹配上了,系统就讲他们绑定,然后便可以通过设备文件来来操作时机硬件了。至于硬件到底怎么操作,那得看通过USB总线传输的数据,USB设备和host都是拿来如何处理,在USB设备驱动中,我们其实只要将数据按协议规定写入和读出即可,至于数据到底怎么用,那是应用程序以及设备中的固件层上面的应用程序的事情啦,驱动就不必操太多的心了,只要不把设备本身的数据格式搞乱就OK

这本书内容虽然多,但是确实都是精华,字字珠玑不敢说,但是里边的经典字句确实随处可见。通过此书,我们不仅仅能发现驱动编写并非难事,更能看出著书者的深厚功底,无论技术,还是文字运用。能把别人花很长时间看不明白的东西,写的言简意赅,确实值得赞赏和推崇。

这是本人近一个多月来做USB驱动的一些心得,也算是对于此书的一个简短的读书笔记,虽然闲话扯的有点多。这本书后面我还会再认认真真的研读的,因为到目前为止,还没把这本书的价值全部榨取干净。


阅读(1875) | 评论(1) | 转发(0) |
0

上一篇:没有了

下一篇:Linux下FTP的配置文件的参数详解

给主人留下些什么吧!~~

chinaunix网友2010-10-14 17:24:32

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com