swordgun
驱动牛犊
驱动牛犊
  • 注册日期2004-10-25
  • 最后登录2005-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2167回复:12

SL811HS枚举设备的超时问题?

楼主#
更多 发布于:2004-10-25 22:54
各位大侠,我使用SL811HS做主机,在运行编写的驱动程序时,老是出现总线超时的错误。具体是这样的:我对设备枚举时先由主机发送setup包,包的内容是80,06,0100,0000,0012,发送之后EP0Status(0x03)的值就变为0x04,即发生了time-out,我这时读了一下EP0Counter(0x04)的值是0x08,也就是说要发送的8个字节一个都没有发出!是不是我的硬件有问题呢?但对SL811HS的读写都是正常的呀。十分焦急,希望各位大侠赐教,多谢了!
wn163
驱动牛犊
驱动牛犊
  • 注册日期2008-02-26
  • 最后登录2008-02-27
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-02-27 08:31
setup包的最后部分一定要0012吗?LINUX里面应该是0x40啊!这个很重要吗?
我也碰到了TIMEOUT的问题,是在SETUP后紧接着的IN PACKET后出现的。请大侠给小弟共享一下经验吧!!!
zhoncai
驱动牛犊
驱动牛犊
  • 注册日期2005-06-25
  • 最后登录2007-09-09
  • 粉丝0
  • 关注0
  • 积分155分
  • 威望17点
  • 贡献值0点
  • 好评度15点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2007-01-22 17:16
在linux的sl811-hcd.c文件中的setup:
static void setup_packet(
    struct sl811        *sl811,
    struct sl811h_ep    *ep,
    struct urb        *urb,
    u8            bank,
    u8            control
)
{
    u8            addr;
    u8            len;
    void __iomem        *data_reg;

    addr = SL811HS_PACKET_BUF(bank == 0);
    len = sizeof(struct usb_ctrlrequest);
    data_reg = sl811->data_reg;
    sl811_write_buf(sl811, addr, urb->setup_packet, len);

    /* autoincrementing */
    sl811_write(sl811, bank + SL11H_BUFADDRREG, addr);
    writeb(len, data_reg);
    writeb(SL_SETUP /* | ep->epnum */, data_reg);
    writeb(usb_pipedevice(urb->pipe), data_reg);

    /* always OUT/data0 */ ;
    sl811_write(sl811, bank + SL11H_HOSTCTLREG,
            control | SL11H_HCTLMASK_OUT);
    ep->length = 0;
    PACKET("SETUP qh%p\n", ep);
}
其中SL11H_HCTLMASK_OUT = 0x04;
猜测是只的数据阶段的传输方向.
minhead
驱动牛犊
驱动牛犊
  • 注册日期2003-05-15
  • 最后登录2006-05-28
  • 粉丝0
  • 关注0
  • 积分98分
  • 威望14点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-08-03 12:52
那为什么用0x27呢?我也不懂啊,
希望以后大家将解决后的方法也说出来或者对一个问题的正确理解!这样别人遇到此问题了,也知道什么原因了!:)
swordgun
驱动牛犊
驱动牛犊
  • 注册日期2004-10-25
  • 最后登录2005-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-10-28 16:00
终于读到设备描述符了,命令果然应该写为0x27!!感谢hongshanger
和frank666的指点。开始时我的U盘不行,用0x27也总是超时,后来换了个才好的。
swordgun
驱动牛犊
驱动牛犊
  • 注册日期2004-10-25
  • 最后登录2005-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-10-28 15:50
为什么大家都说CMD要写成0x27呢?难道芯片文档上说EP0Control的D2位置‘1’代表transmit to host是错误的?
frank666
驱动牛犊
驱动牛犊
  • 注册日期2002-12-17
  • 最后登录2007-08-02
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-10-28 14:59
//------------------------------------------------
// Arming of USB data transfer for the first pkt
//------------------------------------------------
// PID + EP address
SL811Write(EP0Status, ((endpoint&0x0F)|pid));

// USB address
SL811Write(EP0Counter, usbaddr);

// buffer address, start with "data0"
SL811Write(EP0Address, data0);

// data transfer length
SL811Write(EP0XferLen, xferLen);

// clear interrupt status
SL811Write(IntStatus, INT_CLEAR);

// Enable ARM and USB transfer start here
SL811Write(EP0Control, cmd); //cmd = 0x27
swordgun
驱动牛犊
驱动牛犊
  • 注册日期2004-10-25
  • 最后登录2005-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-10-28 14:07
不行呀,改成0x27之后一样超时,真是郁闷死了!
swordgun
驱动牛犊
驱动牛犊
  • 注册日期2004-10-25
  • 最后登录2005-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-10-28 13:24
EP0Status的D2位(Direction)置1时不是数据从设备到主机吗?我现在是发送SETUP应该是从主机到设备吧,怎么会写成0x27呢?我先试试吧,多谢了!
hongshanger
驱动小牛
驱动小牛
  • 注册日期2004-07-19
  • 最后登录2006-04-06
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-10-28 11:03
EPOControL状态字应该写27H的吧,你试试看,还有,SETUP包的最后一个应该是1200的吧,不过这个根据你的程序看了,你先试试好了。
新手上路,各位大侠莫不理睬
swordgun
驱动牛犊
驱动牛犊
  • 注册日期2004-10-25
  • 最后登录2005-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-10-27 21:37
请问hongshanger,能不能测一下你的48M的晶振的波峰、波谷值给我做个参照呀,十分感谢了!
swordgun
驱动牛犊
驱动牛犊
  • 注册日期2004-10-25
  • 最后登录2005-01-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-10-27 16:33
我开始用的是12M的,后来改用了48M的有源晶振,还是一样的结果。发送时我对EPOControl(0x00)写的命令字是0x03,有没有写错呢?还有就是我的48M的晶振是正弦波,波峰是2.2V,波谷是1.4V,跟我以前用过的晶振相比似乎振幅太小了,是不是这里有问题呢?请大侠多多指教,多谢!
hongshanger
驱动小牛
驱动小牛
  • 注册日期2004-07-19
  • 最后登录2006-04-06
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度6点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-10-27 15:18
你在SL811外部用的晶振是有源的还是无源的?改成有源的试试,我以前碰到过
新手上路,各位大侠莫不理睬
游客

返回顶部