锋影
e-mail 174176320@qq.com
IMX6Q有4种独立的USB控制器核心:OTG控制核与3个host控制核。
The USB 2.0 Controller Core 0 supports HS/FS/LS operation in Host mode and HS/FS
operation in device mode.
1、OTG CORE管脚初始化流程:
1> 配置VBUS;打开电源,QNX BSP中是通过IIC总线控的,这部分代码暂时没有看明白。
2> 配置USB ID管脚,根据电路图可以看出,我们需要将ENET_RX_ER光脚配置在USB模式,配置如下:
pinmux_set_swmux(SWMUX_ENET_RX_ER, MUX_CTL_MUX_MODE_ALT0);
pinmux_set_padcfg(SWPAD_ENET_RX_ER, MX6X_PAD_SETTINGS_USB);
3> 硬件管脚配置完成之后,就应该初始化OTG controller Core了,这个BSP提供了对应的接口,直接调用即可。
4> OTG Host connects to PHY0 这步暂时不知道是不是必须的,但是根据手册说明,OTG CORE 只能与PHY0对接;如下:
2、USB接口初始化流程:
1> 为外围芯片USB2514BQFN36提供reset信号:配置管脚SD1_CLK为GPIO1模式
2> 初始化host1 controller core,直接调用BSP提供的接口即可。
3> USB Host1 connects to PHY1(和上面OTG一样,只能和PHY1对接)
3、启动USB OTG相关的服务:
在启动脚本build中,找USB相关的信息,可以查看到当前存在有两种模式:device和host模式。
无论处于何种模式下,都需要依赖于io-usb-otg这个服务程序,这个就是usb的管理器,它依据所要加载的动态库来决定当前工作在何种模式下。但是如果要加载一个device的DLL,则必须要在host模式的DLL之前加载。所以在build脚本中,我们先写device模式下的服务。
3.1 device模式下的服务:
a. 开发板作为大容量存储设备来用,此处所用的是该开发板上的内存RAM
- # Step 1 - Create a ram disk
- # This driver no longer formats the RAM disk by default, so the nodinit is no longer supported.
- devb-ram ram capacity=1024000,cache=512k disk name=hd@10
- waitfor /dev/hd10
- fdisk /dev/hd10 add -t 12
- mount -e /dev/hd10
- waitfor /dev/hd10t12
- mkdosfs -F 32 /dev/hd10t12
-
- # Step 2 - Start device stack
- io-usb-otg -d dcd-usbumass-mx6sabrelite-ci ioport=0x02184000,irq=75 -n /dev/io-usb-dcd/io-usb
- waitfor /dev/io-usb-dcd/io-usb 4
- #waitfor /dev/io-usb-dcd/devu-usbumass-omap543x-dwcotg3.so 4
-
-
- # Step 3 - Start Mass Storage function driver and enable USB soft connect
- devu-umass_client-block -l lun=0,devno=1,iface=0,fname=/dev/hd10
- ulink_ctrl -l 1
备注:
step1:主要是用来产生一个ram disk,命令参数可以参看QNX_Neutrino_RTOS_Utilities_Reference.pdf中的devb-ram说明。
step2:上面提到,如果要想使用usb功能就必须要用到io-usb-otg服务(负责管理USB的准备工作),该服务主要用来start device stack。-d后面是usbmass的DLL,也需要写在build脚本用来DLL库中。ioport就是OTG controller core的base addr,irq是该OTG控制核的中断号。-n 指定这个管理器的名称,默认是/dev/usb/io-usb-otg
step3:大容量存储器的驱动功能。
b.开发板USB作为串口来用:
- # Step 1 - Start USB device stack
- io-usb-otg -d dcd-usbser-mx6sabrelite-ci ioport=0x02184000,irq=75 -n /dev/io-usb-dcd/io-usb
- waitfor /dev/io-usb-dcd/io-usb 4
- waitfor /dev/io-usb-dcd/devu-usbser-mx6sabrelite-ci.so 4
-
- # Step 2 - Start USB CDC-ACM function driver and enable USB soft connect
- devc-serusb_dcd -e -v -F -s -d iface_list=0,path=/dev/io-usb-dcd/io-usb
- waitfor /dev/serusb1
- ulink_ctrl -l 1
c.开发板USB作为网口来用:
- # Step 1 - Start USB device stack
- io-usb-otg -d dcd-usbncm-mx6sabrelite-ci ioport=0x02184000,irq=75 -n /dev/io-usb-dcd/io-usb
- waitfor /dev/io-usb-dcd/io-usb 4
- waitfor /dev/io-usb-dcd/devu-usbncm-mx6sabrelite-ci.so 4
-
- # Step 2 - Start USB NCM function driver and enable USB soft connect
- io-pkt-v6-hc -d usbdnet name=usbeth,mac=000304030405,path=/dev/io-usb-dcd/io-usb,protocol=ncm -p tcpip -d **(其他的DLL)
- #control a usb DCD link para: -l :Set the USB link state to disconnected (0) or connected (1).
- ulink_ctrl -l 1
- ifconfig usbeth0 192.168.15.100
3.2 host模式下的服务(目前我们在开发板上只用了HOST1,对应的是PHY2):
- # the USBPHY1 base address is 0x20C9000 the USBPHY2 base address is 0x20CA000
- # controller base address(irq): OTG--0x02184100 (75), host1--0x02184300(72), host2--0x02184500(73), host3--0x02184700 (74)
- # host1 mode ioport is the address of host1 and its irq is 72.
- #step1 启动所依赖的ehci服务,并将由host1管理器管理
- io-usb-otg -d hcd-ehci-mx28 ioport=0x02184300,irq=72,verbose=5
- waitfor /dev/usb/io-usb-otg 4
-
- #step2 : Driver for USB Mass Storage interface, para pnp means plug in-plug out
- display_msg Launching devb-umass...
- devb-umass cam pnp &