阅读:1057回复:2
高分请教驱动出现的问题
我现在使用TI的OMAP芯片(arm9+DSP55X,集成有usb控制器)开发USB设备驱动,操作系统是linux2.4.14,运行在arm9下。我在使用CCS编写程序已经可以在arm9下运行我的usb设备固件程序(能和usb host正确的通信,host也能识别我的usb mass storage),此时arm时钟是120MHz,外设时钟是60MHz(30MHz,15Mhz都能正确运行)。现在我把固件程序改写为linux下的驱动程序(只有形式有所改变,其余的代码都没有修改),出现了问题(arm时钟120MHz,外设时钟60MHz):
1。使用中断方式 当运行程序后,插入usb电缆,比轮询方式多产生了两次状态改变中断,同时在进入最后一次状态中断时,发现host已经向设备发来的一个setup包(我的setup位和DS_CHG位都已经置位,本该只有一个ds_chg置位的),setup中断应该在ds_chg中断之后,当然数据也就不能发给host了。 2。采用轮询方式 不停查询我的中断源寄存器,当host发送第一个命令(取得设备描述符),setup位置位了,我进入处理程序,将要求的数据写入FIFO,使能FIFO。在下一个IN token时数据发给host,然后host发回一个ACK进行确认,相应的EP0TX置位,数据发完,此时我要使能接收FIFO。然后host发来一个空数据包,EP0RX置位,在这里准备下一个传输。这是正确地执行过程,可是我的程序在执行完setup后,再查询时发现EP0TX和EP0RX都置位了,从而导致处理混乱 两种方式的差别是:中断方式在状态改变和第一个setup中断出现在一起(我的猜测是ds_chg中断发生时,在进入中断程序的过程中,setup中断也发生了,因而在ds_chg的中断处理程序中发现有两位置位)。采用查询的方式好一点,在setup中断发生后,我的数据能够写入fifo,只是接着的EP0TX和EP0RX出现在一起(从程序处理看是这样,其实应该是EP0TX在前,EP0RX在后,时间间隔可能很短),所以我的第一个数据能构发给host。 现在我想请教各位大侠,我的这些问题的症结在哪儿? 是不是该提高系统的时钟频率? |
|
|
沙发#
发布于:2003-06-07 15:15
我觉得你应该用中断延时调用。
|
|
|
板凳#
发布于:2003-06-09 10:12
如果用中断延时调用的话,因为USB有严格的时间限制
后面就会还有别的数据发来,也就会再产生别的中断位置位的情况吧 |
|
|