在开发嵌入式产品的时候,有时因为干扰而遇到严重的USB兼容性问题时,我们需要将USB速度从high-speed降到full-speed,在保证数据的可靠性的前提下进行测试。
本文以i.MX6为例,讲述怎么配置使其USB Host Controller和USB Device Controller工作在full-speed。
PORTSC寄存器
关于PORTSC
寄存器的定义,可以从EHCI SPEC
上找到,也可以从芯片的datasheet上查找到。下面的定义主要是参照i.MX6。
其中BIT24
的定义如下
将其设置为1,那么端口将强制运行在full-speed上。
另外,这个寄存器USB Host Controller和USB Device Controller都可以使用,并且该寄存器是标准的EHCI规定的。详见ehci-specification-for-usb.pdf
配置USB Host工作在full-speed
有寄存器上的依据,接下来就可以配置USB Host工作在full-speed上了。
1 | diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c |
ehci_run()
函数会在ehci-hcd驱动
加载的时候去执行,此时将port_status
寄存器的bit24
写入1,那么就可以将其端口设置在full-speed。至于有几个端口,可以读出HCSPARAMS寄存器
中N_PORTS
的值。
配置USB Device工作在full-speed
配置USB Device工作在full-speed下,也同样是要配置PORTSC寄存器
。配置的地方在udc控制器驱动
里面。比如i.MX6的配置在drivers/usb/gadget/udc/fsl_udc_core.c
中的.udc_start
或者.pullup
所指定的函数。
1 | static const struct usb_gadget_ops fsl_gadget_ops = { |
修改后如下:
1 | diff --git a/drivers/usb/gadget/udc/fsl_udc_core.c b/drivers/usb/gadget/udc/fsl_udc_core.c |