This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

am3358 usb功能异常

Other Parts Discussed in Thread: AM3358

我现在用的am3358,linux内核版本3.8.13 ,标准版是beaglebone black

首先我做了2次其他实验:
    1、我只将usb0端口设置成host模式,能够发现usb0端口下的设备。

           此时我修改了am33xx.dtsi文件中,关于usb_otg_hs部分的

usb_otg_hs: usb@47400000 {
            compatible = "ti,musb-am33xx";
            reg = <0x47400000 0x1000    /* usbss */
                   0x47401000 0x800        /* musb instance 0 */
                   0x47401800 0x800>;    /* musb instance 1 */
            interrupts = <17        /* usbss */
                      18        /* musb instance 0 */
                      19>;        /* musb instance 1 */
                      
            multipoint = <1>;
            num-eps = <16>;
            ram-bits = <12>;
            port0-mode = <1>;
       /*     port1-mode = <1>; */
            power = <250>;
            ti,hwmods = "usb_otg_hs";
            status = "disabled";
        };


    2、我只将usb1端口设置成host模式,能够发现usb1端口下的设备。

    此时我修改了am33xx.dtsi文件中,关于usb_otg_hs部分的

usb_otg_hs: usb@47400000 {
            compatible = "ti,musb-am33xx";
            reg = <0x47400000 0x1000    /* usbss */
                   0x47401000 0x800        /* musb instance 0 */
                   0x47401800 0x800>;    /* musb instance 1 */
            interrupts = <17        /* usbss */
                      18        /* musb instance 0 */
                      19>;        /* musb instance 1 */
                      
            multipoint = <1>;
            num-eps = <16>;
            ram-bits = <12>;
       /*     port0-mode = <1>; */
           port1-mode = <1>; 
            power = <250>;
            ti,hwmods = "usb_otg_hs";
            status = "disabled";
        };


     3、目前我把cpu的usb控制器的两个端口均设置成host模式,此时只能发现usb0下的设备,usb1的设备发现不到,这是我遇到的问题。

    此时我修改了am33xx.dtsi文件中,关于usb_otg_hs部分的

usb_otg_hs: usb@47400000 {
            compatible = "ti,musb-am33xx";
            reg = <0x47400000 0x1000    /* usbss */
                   0x47401000 0x800        /* musb instance 0 */
                   0x47401800 0x800>;    /* musb instance 1 */
            interrupts = <17        /* usbss */
                      18        /* musb instance 0 */
                      19>;        /* musb instance 1 */
                      
            multipoint = <1>;
            num-eps = <16>;
            ram-bits = <12>;
            port0-mode = <1>;
            port1-mode = <1>;
            power = <250>;
            ti,hwmods = "usb_otg_hs";
            status = "disabled";
        };

       更改host模式是通过设备树中的port0-mode和port1-mode设置的。请指教!

  • kernel 3.8这个是个中间版本,TI发布的Linux SDK release,只有kernel3.2,和3.12两个版本,对于BBB的支持也是在这两个版本上做支持,所以建议你看一下是否Linux SDK7.0(kernel3.12)也会出现这个问题,如果有的话,请反馈给我们。

    下载地址:http://software-dl.ti.com/sitara_linux/esd/AM335xSDK/latest/index_FDS.html

  • 能不能在dts文件里面把usb分两个口描述看看。

  • Thanks!       

            我在musb_core.c文件的 musb_init_controller 函数中,

     加了一句musb_writeb(musb->mregs, MUSB_DEVCTL,0x01); 就可以了。不知道这样设置会不会有其他问题呢。

           您说可以分开来设置,这个我不太会可以给一个例子么?

    代码片段:

        if (plat->mode == MUSB_HOST) {    /* host mode */
            printk("musb_init_controller host\n");
            del_timer(&musb->otg_timer);

            MUSB_HST_MODE(musb);
            musb->xceiv->otg->default_a = 1;
            musb->xceiv->state = OTG_STATE_A_WAIT_VRISE;

            status = usb_add_hcd(hcd, 0, 0);

            hcd->self.uses_pio_for_control = 1;
            musb_writeb(musb->mregs, MUSB_DEVCTL,0x01);
            dev_dbg(musb->controller, "%s mode, status %d, devctl %02x %c\n",
                "HOST", status,
                musb_readb(musb->mregs, MUSB_DEVCTL),
                (musb_readb(musb->mregs, MUSB_DEVCTL)
                    & MUSB_DEVCTL_BDEVICE
                    ? 'B' : 'A'));
            printk("%s mode, status %d, devctl %02x %c\n",
                "HOST", status,
                musb_readb(musb->mregs, MUSB_DEVCTL),
                (musb_readb(musb->mregs, MUSB_DEVCTL)
                    & MUSB_DEVCTL_BDEVICE
                    ? 'B' : 'A'));
            printk("musb init MUSB_DEVCTL %d \n",MUSB_DEVCTL);
            
        }

  • 1. 不建议该usb core的代码,这部分代码我们也没有文档。

    2. 我说的就是把usb的节点分成两个节点描述。

  • 我们用的是ti-processor-sdk-linux-am335x-evm-01.00.00.00。如何更改设备树让usb0和usb1都工作在host模式。

  • 和上面提到的修改dts的方法是一样的

  • 说明下,我们需要用到USB0和USB1。并且都要作为host模式。USB0_DRVVBUS控制电源芯片使USB0_VBUS和USB1_VBUS同时上电。但是发现修改dtb将usb0:usb@47401000中的dr_mode 改为host 。usb1:usb@47401800中的dr_mode也改为host,其它的都没有修改,这个时候usb0和usb1都不是处于otg模式了吧但是内核启动的时候却没有启动任何一个usb。测了USB0_DRVVBUS引脚发现它处于低电平状态,也就是没有使能电源。是不是因为什么错误使得AM335X 拉低USB0_DRVVBUS了。