flycat0101
驱动小牛
驱动小牛
  • 注册日期2002-06-24
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1023回复:2

高分请教usb问题

楼主#
更多 发布于:2003-06-06 11:46
我现在使用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。
现在我想请教各位大侠,我的这些问题的症结在哪儿?
是不是该提高系统的时钟频率?
我思,故我在
NewTech
驱动大牛
驱动大牛
  • 注册日期2002-10-02
  • 最后登录2010-03-27
  • 粉丝0
  • 关注0
  • 积分16分
  • 威望263点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-06-06 12:12
你的这个问题可能跟linux的驱动有关,或者中断设置有关!你查查吧!
flycat0101
驱动小牛
驱动小牛
  • 注册日期2002-06-24
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望22点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于: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()中先进行初始化,然后注册中断(采用中断方式),如果不采用中断的话,在初始化完后,就开始不停的查询中断源寄存器(这个寄存器的相应位置位后发出中断信号,没有使用中断时,也会置位),照说应该不会有什么问题的呀?

大概是哪个地方出现了问题?
我思,故我在
游客

返回顶部