QNX USB device与host模式下驱动脚本详解

调试usb host模式驱动的步骤:

查看原理图,usb host模式下的管脚配置:html



红框里面的是host模式,蓝框里面是OTG模式。

 IMX6Q有4种独立的USB控制器核心:OTG控制核与3个host控制核。tcp

The USB 2.0 Controller Core 0 supports HS/FS/LS operation in Host mode and HS/FS
operation in device mode.

一、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对接;以下:




二、USB接口初始化流程:
     1> 为外围芯片USB2514BQFN36提供reset信号:配置管脚SD1_CLK为GPIO1模式
     2> 初始化host1 controller core,直接调用BSP提供的接口便可。
     3>  USB Host1 connects to PHY1(和上面OTG同样,只能和PHY1对接)


三、启动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

                备注:ui

               step1:主要是用来产生一个ram disk,命令参数能够参看QNX_Neutrino_RTOS_Utilities_Reference.pdf中的devb-ram说明。spa

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 &