打印

AT91SAM9260裸机USB驱动的问题!!!

[复制链接]
4207|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bluelazio|  楼主 | 2011-11-17 11:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AT91SAM9260裸机USB驱动对U盘进行操作。采用OHCI协议,目前可以识别并操作一部分U盘,但是挑U盘特别厉害。打算改进下。经过反复测试和比对,发现U盘可以挂载,但是读取U盘信息时出现问题。
if (pED->Type == ED_TYPE_CONTROL)
{   
     ohci->HcCommandStatus |= OHCI_CS_CLF; //CLF
} else if (pED->Type == ED_TYPE_BULK) {  
  ohci->HcCommandStatus |= OHCI_CS_BLF; //BLF
}
如果是可以操作的U盘,运行完ohci->HcCommandStatus |= OHCI_CS_BLF; 后,phED->TailP=0,phED->HeadP=0。
如果不可操作的U盘,运行后phED->TailP=0,phED->HeadP!=0,此时系统将进入while死循环,当phED->HeadP=0时退出循环。查看OHCI协议了解到phED->TailP与phED->HeadP不等时,表示当前链表包含一个待处理的TD。查看了所有的TD相关程序,也没有找到问题。哪位高手遇到过这个问题,给点意见。

相关帖子

沙发
bluelazio|  楼主 | 2011-11-18 10:00 | 只看该作者
昨天发现两个U盘DI的数据帧不同,能用的是dCBWSignature值是0x53425355   ,不能用的是eb 58 90 4d9058eb,而0x53425355是UFI指令集规定的标准值。

使用特权

评论回复
板凳
bluelazio|  楼主 | 2011-11-18 10:17 | 只看该作者
是dCSWSignature的值

使用特权

评论回复
地板
bluelazio|  楼主 | 2011-12-8 16:21 | 只看该作者
还没人解答吗??有人帮顶也行啊

使用特权

评论回复
5
鬼鬼一哈| | 2011-12-11 16:20 | 只看该作者
本帖最后由 鬼鬼一哈 于 2011-12-13 08:39 编辑

我也在弄,有问题请教。我是在枚举阶段,描述符出来的数据不全,不知道为什么。

使用特权

评论回复
6
bluelazio|  楼主 | 2011-12-13 14:35 | 只看该作者
执行ohci->HcCommandStatus |= OHCI_CS_CLF; //CLF
后,hc处理端点描述符上的TD(传输描述符),但是执行后,TD的HeadP第0位为1,说明处理TD时错误,可能是哪里的无问题呢。代码如下:
           pTDout = ohci_create_td(2, 5, 0, 1, (unsigned int)pSetup, 8, 0, 0, 0);
        if (!pTDout) {
                //unlock_ohci();
                return -1;
        }
        ohci_add_td(pED, pTDout);
        // create IN transaction
        pTDin = ohci_create_td(3, 5, ED_IN, 1, (unsigned int)pIn, len, 0, 0, 0);
        if (!pTDin) {
                //unlock_ohci();
                return -1;
        }
        ohci_add_td(pED, pTDin);

               
         //create EMTY transaction
        pTDempty = ohci_create_td(2, 5, 0, 1, 0, 0, 0, 0, 0);
        if (!pTDempty) {
                //unlock_ohci();
                return -1;       
        }
        ohci_add_td(pED, pTDempty);


PS_UHP_TD ohci_create_td(unsigned int td_type,
                                                 unsigned int del_int,
                                                 unsigned int direction,
                                                 unsigned int rounding,
                                                 unsigned int cbp,
                                                 unsigned int buf_len,
                                                 unsigned int next_td,
                                                 unsigned int cb,
                                                 unsigned int arg) {
        PS_UHP_TD pTD = NULL;
        OHCI_PS_UHP_TD pUTD ;
       
        if (cur_td_num > MAX_TDS) {
                OHCI_DBG("UH ERROR: MAX TD\r\n");
                return NULL;
        }
       
        pTD = (PS_UHP_TD)malloc(sizeof(UHP_TD));
        if(!pTD) {
                OHCI_DBG("UH ERROR: Not enough memory\r\n");
                return NULL;
        }
        memset(pTD, 0, sizeof(UHP_TD));
       
        pUTD = (OHCI_PS_UHP_TD)aligned_malloc(sizeof(OHCI_S_UHP_TD), 16);
        if(!pUTD) {
                OHCI_DBG("UH ERROR: Not enough memory\r\n");
                return NULL;
        }
        memset(pUTD, 0, sizeof(OHCI_S_UHP_TD));
       
        pTD->Buf_Len = buf_len;
        pTD->CBP = cbp;
        pTD->Data_Toggle = td_type;
        pTD->DelayInterrupt = del_int;
        pTD->Direction = direction;
        pTD->NextTD = 0;
        pTD->Rounding = rounding;
        pTD->TDAddress = (unsigned int) pUTD;
        pTD->callback = cb;
        pTD->arg = arg;
       
        ll_CreateGenTd(
        pTD->TDAddress,
        pTD->Data_Toggle,
        pTD->DelayInterrupt,
        pTD->Direction,
        pTD->Rounding,
        pTD->CBP,
        0,
        pTD->Buf_Len);

        cur_td_num++;
        return pTD;
}

void ohci_add_td(PS_UHP_ED pED, PS_UHP_TD pTD) {
        OHCI_PS_UHP_TD psTD;
        OHCI_PS_UHP_ED phED;
       
        phED = pED->phED;
       
        if (!phED) return;
       
        if (!pTD) {
                OHCI_DBG("UH ERROR: Invalid TD\r\n");
                return;
        }
       
        if (cur_td_num > MAX_TDS) {
                OHCI_DBG("UH ERROR: MAX TD\r\n");
                return;
        }
                       
        if(!phED->HeadP) {
                phED->HeadP = (((unsigned int) pTD->TDAddress) & 0xFFFFFFF0);
        } else {
                psTD = (OHCI_PS_UHP_TD)phED->HeadP;
                for (;psTD->NextTD;psTD = (OHCI_PS_UHP_TD)psTD->NextTD);
                psTD->NextTD = pTD->TDAddress;
        }
       
        phED->TailP = (((unsigned int) pTD->TDAddress) & 0xFFFFFFF0);
}

使用特权

评论回复
7
guiguiyiha| | 2011-12-14 16:38 | 只看该作者
程序打个包传上来看看,我也在弄,就是枚举的描述符数据收不全。。host裸机

使用特权

评论回复
8
zou_sky| | 2011-12-15 19:18 | 只看该作者
1# bluelazio


楼主,是不是可以直接对U盘进行读写操作的啊,(指定某一地址写数据)
不需要文件系统??

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

15

帖子

1

粉丝