Chinaunix首页 | 论坛 | 博客
  • 博客访问: 354879
  • 博文数量: 43
  • 博客积分: 1493
  • 博客等级: 上尉
  • 技术积分: 660
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-01 10:57
文章分类

全部博文(43)

文章存档

2015年(1)

2013年(1)

2011年(6)

2010年(13)

2009年(13)

2008年(9)

分类: LINUX

2010-07-17 17:42:44

                             Linux驱动调试概论

.前言

       我在这里向要说的是驱动的调试,也就是说驱动的代码已经由供应商提供,我们只做集成的工作,需要有的一个指导性思想,只针对新手;

OSLinux

 

.思路

       当我们接手一个新的模块或者第一个模块的时候,或许心里会完全没有底,不知道从何入手,这时候怎么办?以下是我的一些基本的想法:

1,  首先要理清这个模块的作用;不同的驱动模块,提供的功能是不太一样的,比如WIFI模块,它的主要作用从功能上说是用来上网,而从程序的角度来说,需要提供一个网络节点,比如像eth0mlan0;比如蓝牙模块,它的作用从功能上说是用来连接其它蓝牙设备,以实现特定的功能,它的本质其实也算一种网络,只不过,这种网络通常只是两个设备之间的连接,所以从程序的角度来说,它也需要提供一个类似于网络节点的东西,比如hci0

2,  理清了功能,我们再来看看驱动的本质;比如:WIFI和蓝牙的本质其实都是传递本机的信息到别的地方,它们的差别在于,WIFI对于传递的目的,并不关心,而蓝牙则需要明确的知道需要传递到哪个设备;而对于像Audio的驱动,它的本质也是传递数据到特定的地方,比如到speaker,比如到headset等;比如像T卡的驱动,它的本质是一个存储设备,也就是说它的驱动就需要提供如何访问它内部的数据的方法;再比如像LCD的驱动,它的本质就是传递数据给屏等等;

3,  对应到实现,我们该怎么做?目前这个阶段,linux下的驱动,通常都已经有开源的了,而且对于特定的硬件设备,一般供应商都会有例子驱动,直接拿过来用就行了;然后很不幸的是,我们发现拿过来的驱动不工作!这就比较头疼了;以下是我总结的三个可能出现问题的点:

A) 设备的初始化,这里是最容易出错的地方,也是通常情况下需要我们自己修改的地方;初始化通常包含:

1,            上电操作,任何设备,没有电,那是不太能正常工作的,除非是机械设备;也就是说,如果我们发现一个设备工作不正常,首先要查的是电源是否已经提供,或者提供是否正确,比如需要的电压是否满足?

2,            Clock的设置,有些设备,比如蓝牙,需要正确的提供时钟,否则工作会不正常;

3,            正确的启动序列,这一般是对于reset引脚,很多设备,需要在reset引脚上进行特殊的操作,比如拉高,或者拉底,或者高底高等等,不同的设备要求的也不一样,这个就必须要根据spec上的规定来;而对于一些复杂的设备,这一步需要更多的工作,比如LCD驱动,它需要把更多的信息告诉屏,而且往往最后发现出问题都是在这步,比如极性设置不对,reset的信号没有按spec规定的做,或者一个关键的enable信号没有使能等等;

 

B) 初始化通常意味着硬件进入了工作的状态,也就是说从硬件的角度来说,已经开始工作了;但这时候你发现你的驱动还没有工作正常,那么你需要检查什么呢?这里涉及到linux系统下面对于设备的管理,简单说,在通常情况下,一个设备对应一个驱动,而驱动的执行依赖于设备以及驱动在同一总线下的注册,并且满足这个总线对于驱动和设备匹配的规则;这句话有点绕,但实际上这个默认的驱动代码都会帮我们做好的,唯一需要我们关注的就是这个设备的注册是否真的已经做了,很多时候会发现,是因为某一个宏导致了设备没有注册,或者我们的驱动依赖的某个设备没有注册,比如wifi依赖于SDIO设备(通常的设计),如果SDIO设备没有注册,那么WIFI驱动是不会工作正常的;检验这一步的方法很简单,只需要判断driverprobe函数有没有执行就可以了,如果执行了,说明设备和驱动都已经注册了;

C) 如果你发现上面两步都已经做了,驱动还是不正常,那么需要确认的是firmware是否下载了;前面已经说了,硬件虽然已经工作正常,但是有可能它需要一定的软件的配合,比如像WIFI,蓝牙,都有可能需要自己的firmware才能工作;

D)  还需要提一下的是,中断信号,很多时候发现驱动无法收到中断,这个通常是GPIO设置不对,或者是这个gpio无法产生中断,或者中断触发的方式不对,或者就压根没有用对gpio,或者就是这个gpio的初始状态就不对,比如你期望的是初始拉高,等待一个下降沿,但是很不幸在启动后这个gpio被别的模块给拉低了,那除了第一次可能的中断外,再也别想后面的中断了;

 

 

 

       

阅读(1670) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~