”在Linux kernel中当使用中断共享机制时,在中断发生后会有两次调用中断处理函数,而每次调用所传递的void* dev_id 是不同的,中断处理函数会据此判断是否是自己的中断“
这句话应该是不对的,当中断发生后会调用曾经在这条中断线上注册的所有中断,而到底让哪个中断处理函数去执行,的确是由中断处理函数自己去做出判断的,但是判断的依据不是这个dev_id参数,而是由中断处理函数检查自己的控制寄存器看看是不是真的是因为自己的控制器发生了状态变化而导致了本次中断发生。举个例子,假如有个两个spi控制器共用一个对外的中断线,这两个spi控制器的驱动会分别各自在这个中断线上注册一次(当然注册的时候要标记为IRQF_SHARED)。那么,当这个中断发生后,会调用我们注册的这两个中断处理函数各一次。那到底是那个spi控制器发出了这个中断呢?当然,真正发出中断的那个控制器一定和没有发出中断的那个控制器是可以通过读取类似状态寄存器来加以区别。所以,真正的处理过程应该是这样的:在每个中断处理函数中都会读取该spi自己的状态寄存器用以确定是不是自己发出了中断,如果不是自己的则这个中断处理函数立刻返回(return IRQ_NONE),如果是自己的,那就继续处理啦。。。处理完后返回 IRQ_HANDLED。
需要注意的一点是,只要有一个中断处理函数返回了IRQ_HANDLED,那么就意味着针对这个中断的处理完全结束了,其他的共享中断的处理函数也就不需要调用了!也就是说当一个中断处理函数发现这不是自己发生的中断后一定要返回IRQ_NONE,这样,别的共享该中断的处理函数才会有机会被执行!
/******************************************************************************************************************/
it7626电容品在保持手指接触的时候起中断引脚会连续发出脉冲式中断,这就是所谓的中断+轮询方式。
应该这么来理解:
轮询方式:这就和中断没什么关系了,以固定的周期不停的读取电容屏的控制器状态,酌情处理即可。
单独的中断方式:无接触时电容屏的中断引脚保持高电平,当手指触摸时,中断引脚被拉低,直到接触离开后中断引脚才被拉起。(此时驱动应该使用低电平触发中断调用)
中断+轮询方式:当手指持续接触时,中断引脚表现为脉冲式波形,即中断引脚以某种规律被不停的拉低一个时间,而后又释放。(此时驱动应该使用上升或者下降沿触发中断调用)
后两种凡事的区别我还需要仔细研究一下下,好像以前思考过,可是因为没有笔记,就忘了,,,悲剧啊。以后要随时有想法随时记录下来!
顺便记录一下:对于it7260电容屏的中断周期统计:
单手指接触时中断脉冲发生周期大约10ms
双手指接触时中断脉冲发生周期大约15ms
三手指接触时中断脉冲发生周期大约20ms
/******************************************************************************************************************/
最近这几天调试spi1控制器,发现数据总是无法测到,因为前面调试spi0控制器的时候比较顺利,也能测得波形,也学到了一些东西。只要我使用单步调试,通过修改spi控制器的某些寄存器,其他相关寄存器也会同步发生变化,这就证明控制器本身是正常工作的(这也验证了一个另外一个东西,那就是所有的控制器,只不过是一堆逻辑,维护着一堆状态机,一堆状态机适时地修改着一堆寄存器而已。嗯,听起来不难,其实这只是从软件的角度看而已,实际上,这些东西的核心技术都不是中国人的。。。。所以那些个控制器什么的是相当难做好的!)
通过对现在这个spi1的寄存器的判断,已经可以认定,其控制器内部已经在正常工作了。只是波形出不来。因此我可以怀疑一下是不是该spi所连接的几个gpio管脚配置有问题。毕竟这几个gpio是属于复用的gpio,检测一下gpio的配置,发现这几个gpio是可以配置为普通gpio功能而且配置为输出的话,还可以拉高拉低的。为什么在我的代码里配置成第三功能(spiclk、spidi、spido等)就是没有什么反应呢?
折腾了几天,还让硬件方面模拟了一下,人家得到的结果却是完全好的。我还是没想出来问题的所在。
最后和硬件方面一个资深的头头交流,他问我,是不是VDDNFS没有配置。这个是什么供电呢?我检查了下,这个还真的没有配置相关位。配置了以后波形就出来了。和王永同学交流了一下,我又学到了新的东西,原来这个就是我所使用的那一组gpio的供电。。没有电,它当然不动了。。。。原来gpio也是需要供电的的。。。以前真的没有考虑这些问题。可是为什么我曾经还能拉高拉低这几个gpio呢?。。。这就是我最悲剧的一点,原来我拉高拉低的时候用的代码和现在用的根本就不一样,所以那是两次完全不同的配置!也许在那一次能拉高拉低的测试中,有别的地方已经把这一组gpio的供电给配置好了。。。所以,得到的经验就是,既然是测试,就一定要确保你的配置是唯一的,不能随便抓一个东西来跑!测试一定要用同一个代码去测,这样你才能定位到问题!
/******************************************************************************************************************/
昨天犯了个比较傻的错误,今天早上终于搞明白了。描述下:
spi0和spi1的调试都通过了,驱动完成了,上板子调试一下,看看结果,哎,还不错,分别测试都有波形。奇怪的是数据信号都很好,只是时钟怎么幅度那么小啊,才500mv。也不知道当时是怎么想的,突然就想,我在spi0工作的时候去测测spi1对应引脚,看看是什么状况,当然应该什么也测不到才对!我靠!让我震惊的是竟然测到了波形,而且还是那样,数据信号很好,时钟信号波形很小。这个问题让我很震惊,这玩意要是真的有这么大问题,我的责任可就大的去了!因为这样的严重问题应该在测试早期就能发现的!NND。
下意识的去仔细检查了下电路板,发现板子上的BP模块可以通过拨码开关选择使用spi0或者spi1。而我竟然把两组开关都拨到了开启状态,这就相当于将spi0和spi1给短路了,这当然会导致当某一个spi控制器工作的时候两边的引脚上都能测到波形了,至于时钟信号为什么在这种情况下变的那么小,可能是由于BP模块的什么地方给拉低了吧,这个就不深究了。总之问题找到了,虽然是个傻傻的问题!呵呵,长经验就好了!
/******************************************************************************************************************/
spi1使用了三个CS片选引脚!spi0使用了一个片选引脚,故猜测spi控制器应该有相关的寄存器位可以选择到底当前使用那个引脚作为片选引脚,标准的pl022 datasheet中没有对片选的说明,咨询硬件设计方后得知当前这个pl022使用偏移量0x28寄存器用于选择片选引脚。猜中了!测试也通过了!不错!
cd /proc/sys/kernel
echo "9 9 9 9 " >printk
dmesg