hglzw
驱动小牛
驱动小牛
  • 注册日期2001-06-12
  • 最后登录2006-03-03
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1915回复:4

救命!救命!!我的DS产生的usb驱动read时出问题了

楼主#
更多 发布于:2003-02-20 10:59
救命!救命!!我的DS产生的usb驱动出问题了。情况是这样的,驱动能正常工作,而且应用程序可以对USB进行写操作,但进行读时出了问题,即读时死机。我看了看驱动程序的读函数Read(KIrp I) ,在其最后调用函数m_Endpoint1IN.SubmitUrb(I, pUrb, LinkTo(ReadComplete), pCompInfo, 0)死住,请问是不是这儿出了问题?请帮助解决,谢谢。
调试跟踪firmware没有收到这个读的中断
端点2 bulk 方式
读写地址:0x02,0x82;

望大虾解惑

[img]http://www.kinboh.com/images/5130.jpg[/img]
ex3206
驱动牛犊
驱动牛犊
  • 注册日期2002-10-15
  • 最后登录2005-04-25
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2003-05-15 13:19
hi,哥们,你的问题解决了吗,如果已经解决,请帮助我以下,
我采用DS2.6开发,和你的问题一样,请帮助!!

谢谢
hglzw
驱动小牛
驱动小牛
  • 注册日期2001-06-12
  • 最后登录2006-03-03
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-05-16 09:41
这位老兄,你好.关于这个问题,俺给你解释一下...
读(readfile)的时候,在读之前,d11或其他的usb接口芯片的缓冲区应该先有效,就是里面先有东东啦,这样读才能有效,否则系统返回错误,不给读啦。
具体做法:在读之前先通知firmware(典型的,用售主命令如:read_write_register)应用层要读数据,并且告此次读包要读数据的数量,先让它给放上,超过buffer_size,只放buffer_size.使驱购缓冲区有效。这样就能读出东西啦。中断是在这个缓冲区被读完以后才发生,不是一发读命令就产生。当读完后,产生中断,在中断里看看是否上次超出了buffer_size,那么把剩下的再放进去,系统就会在下个读时刻把它读走,然后又产生中断,如此循环,直到这个读包整个完成,应用层的readfile也就返回啦。ok
应用层:
...
deviceiocontrol(read_write_rigerst...);
readfile(...);
.....
驱动:
...
switch(iocontrolcode)
...
case read_write_rigerst:
buildvendorrequest(.....);
brak;
...
firmware:
.....
//over
good luck to you!


 

[img]http://www.kinboh.com/images/5130.jpg[/img]
hglzw
驱动小牛
驱动小牛
  • 注册日期2001-06-12
  • 最后登录2006-03-03
  • 粉丝0
  • 关注0
  • 积分19分
  • 威望2点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-05-16 09:43
如果认为俺回答得好,可适当给俺点分。。。 :D
[img]http://www.kinboh.com/images/5130.jpg[/img]
flyhemcu
驱动牛犊
驱动牛犊
  • 注册日期2003-06-12
  • 最后登录2003-12-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-07-14 17:41
void WriteEndPoint(uint8 endp, uint16 len,uint8* buf)
{
uint16 i;

ISP1581_ENDPT_INDEX = endp;
ISP1581_BUFFER_LENGTH = len;
//SPLIT(ISP1581_BUFFER_LENGTH,0)=SPLIT(len,1);
//SPLIT(ISP1581_BUFFER_LENGTH,1)=SPLIT(len,0);
for(i=0;i<len;i++) //写缓冲区数据,到数目后自动使能。
//DDRA  = 0xFF;
{ ISP1581_DATA_PORT = *(buf++);
ISP1581_CONTROL_FUNCTION |= 0x08;   //使能缓冲区
}

哥们帮我看看,这段固件写代码正确吗,可用户读不到数据呀!
flyhemcu
游客

返回顶部