我现在用的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设置的。请指教!
Steven Liu1:
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
Yaoming Qin:
能不能在dts文件里面把usb分两个口描述看看。
albert wang3:
回复 Yaoming Qin:
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); }
Yaoming Qin:
回复 albert wang3:
1. 不建议该usb core的代码,这部分代码我们也没有文档。
2. 我说的就是把usb的节点分成两个节点描述。
binbin wang:
回复 Yaoming Qin:
我们用的是ti-processor-sdk-linux-am335x-evm-01.00.00.00。如何更改设备树让usb0和usb1都工作在host模式。
Jian Zhou:
回复 binbin wang:
和上面提到的修改dts的方法是一样的
binbin wang:
回复 Jian Zhou:
说明下,我们需要用到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了。