阅读:1022回复:2
高分请教usb问题
我现在使用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-06 12:12
你的这个问题可能跟linux的驱动有关,或者中断设置有关!你查查吧!
|
|
板凳#
发布于:2003-06-06 14:47
但是我采用轮询的时候为什么也会出现相似的问题呀?我的驱动架构这样的:
int usb_init(void){ int err; err=usb_probe(); if(err){ printk(\"Failed to register the USB Driver!\\n\"); } return err; } void usb_cleanup(void){ printk(\"USB Driver is unloaded!\\n\"); MOD_DEC_USE_COUNT; } module_init(usb_init); module_exit(usb_cleanup); 我在usb_probe()中先进行初始化,然后注册中断(采用中断方式),如果不采用中断的话,在初始化完后,就开始不停的查询中断源寄存器(这个寄存器的相应位置位后发出中断信号,没有使用中断时,也会置位),照说应该不会有什么问题的呀? 大概是哪个地方出现了问题? |
|
|