레이블이 Android-AOSP-USB-Gadget인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Android-AOSP-USB-Gadget인 게시물을 표시합니다. 모든 게시물 표시

1/09/2021

Android USB 설정 및 USB Type C

 1. USB Device Tree 설정분석 


USB OTG Device Tree 관련내용 


Chapter 14 Connectivity Subsystem



  • USB 분석이유 
USB Device Tree를 다시 분석하는 이유는 USB Type-C가 지원이 되면서, HW 구조가 변경이 되어 개인적으로 이 부분을 정확히 이해하려고 한다. 
i.MX8QXP의 EVM의 경우 아래와 같이 사용하고 있지만, 현재 OTG1/2만 사용하고자 하면 이 구조를 변경을 해야한다. 
  1. OTG1: OTG 사용   
  2. OTG2/OTG3: USB Type-C  (USB 2.0 과 USB 3.0 동시 필요)

USB 3.0 TypeC 의 경우 Cadence 것을 가져다 쓰며, 아래와 같이 AMBA에서 APB/AXI4로 연결하여 사용되어지고 있다. 
중간에 MUX에 의해 Host or Device 선택되어지면, 이는 OTG에 의해서 결정될 것이다. 
(참고로 USB 2.0 OTG의 경우, 대체적으로 dwc or hdrc )

14.12.2 Functional Description





변경하고자 하는 HW
OTG1 과 OTG2만 USB 2.0 사용할 경우 재미있는 것은 상위 OTG1/2만 사용할 경우 OTG가 잘동작하지 않아 이를 HW로 ID 핀으로 Device or Host 설정을 한 후 사용예정 


$ vi ./vendor/nxp-opensource/kernel_imx/arch/arm64/boot/dts/freescale/imx8-ss-conn.dtsi

/*
    USB OTG일 경우  i.MX series는 /sys file에 ci_hdrc.0 만 생성되며, ci_hdrc.1 은 찾아볼수 없음 
    i.MX8은 i.MX6 다르게, OTG Hardware는 두개지만 내부적 OTG2는 USB3를 위해서으로 분할되어 있음
    
    Device Tree 주소와 같이 보자 
    
  2.2.2 Connectivity Memory Maps
     5B28_0000 : LPCG USB3           (현재 미사용 추측) 
     5B27_0000 : LPCG USB2           (현재 미사용 추측)
     5B16_0000 : USB3_PHY3P0  (OTG3/2) 
     5B12_0000 : USB3         (OTG3/2) 
     5B11_0000 : USB3_CTRL    (OTG3/2) 
     5B10_0000 : USBOH_PHY    (OTG1)
     5B0F_0000 : USBOH_PL301         (현재 미사용 추측)
     5B0D_0000 : USBOH_OTG    (OTG1) 
*/

  https://elixir.bootlin.com/linux/latest/source/Documentation/devicetree/bindings/usb/ci-hdrc-usb2.txt
  
	usbotg1: usb@5b0d0000 {
		compatible = "fsl,imx8qm-usb", "fsl,imx7ulp-usb",
			"fsl,imx27-usb";
		reg = <0x5b0d0000 0x200>;
		interrupt-parent = <&gic>;
		interrupts = <GIC_SPI 267 IRQ_TYPE_LEVEL_HIGH>;
		fsl,usbphy = <&usbphy1>;
		fsl,usbmisc = <&usbmisc1 0>;
		clocks = <&usb2_lpcg 0>;
		ahb-burst-config = <0x0>;
		tx-burst-size-dword = <0x10>;
		rx-burst-size-dword = <0x10>;
		power-domains = <&pd IMX_SC_R_USB_0>;
		status = "disabled";
	};

/*
    Datasheet를 보면, OTG Hardware는 2개가 다른 곳에 있으며, 이 것을 OTG1/2 분할 해서 사용해야 할 것같다.  
    구성은 좀 재미있으며, Datasheet를 비교해봐도 i.MX6와 완전다르다 
    
OTG1의 구성을 세부적으로 Datasheet와 같이 분석 
    
  14.10.3.1.1 Configuration, Control and Status Register Set 구성 (5B0D_0000 : USBOH_OTG )  
       - UOG1 (OTG1) : 3개다 동일 offset 이며, 공통 OTG 기능 목적으로 사용되는 것으로 추측 
       - UOG2 (OTG2)
       - UH   (USB Host)
      USB Core RegisterUSB Non Core Register가 구분               
      
  14.10.4 USB Non-Core Memory Map/Register Definition        (5B0D_0000 : USBOH_OTG )
      Non Core Register들로 추가적으로 의존적인 부분이라고 하는데, 공유목적으로 분리사용하는것으로 추측
        - 5b0d0200 : USBNC_OTG1_CTRL1  Non-Core Control
        - 5b0d1200 : USBNC_OTG2_CTRL1         
        - 5b0d2200 : USBNC_UH_CTRL1        
        ** usbmisc 사용    
        
  14.10.5 USB Core Memory Map/Register Definition      (5B0D_0000 : USBOH_OTG )
       USB Core Register들은 USB Core Function Control과 독립적인 기능역할을 해서 분리 
        상위 14.10.3.1.1 Configuration, Control and Status Register Set 과 동일         
*/
  https://elixir.bootlin.com/linux/latest/source/Documentation/devicetree/bindings/usb/usbmisc-imx.txt

	usbmisc1: usbmisc@5b0d0200 {
		#index-cells = <1>;
		compatible = "fsl,imx7ulp-usbmisc", "fsl,imx6q-usbmisc";
		reg = <0x5b0d0200 0x200>;
	};

  https://elixir.bootlin.com/linux/latest/source/Documentation/devicetree/bindings/phy/mxs-usb-phy.txt
  
	usbphy1: usbphy@5b100000 {
		compatible = "fsl,imx8qm-usbphy", "fsl,imx7ulp-usbphy",
			"fsl,imx6ul-usbphy", "fsl,imx23-usbphy";
		reg = <0x5b100000 0x1000>;
		clocks = <&usb2_lpcg 1>;
		power-domains = <&pd IMX_SC_R_USB_0_PHY>;
		status = "disabled";
	};
        
/* 
OTG3/2의 구성분석 
   
    USB OTG2는 내부적으로 보면 USB3.0 OTG Controller 위해 존재하며, 상위 OTG1 과 OTG3 Device Driver 완전 다르다. 
    EVM은 사용 상위 OTG2의 Controller가 14.12.6.33 USB2 Port Status and Control (PORTSC1USB2)  존재하는데, 
    EVM을 보면, USB-C Type에 위해서 사용되며, USB 2.0 Phy(OTG) 와 USB 3.0 Phy 때문에 사용한 것으로 파악  
    
    관련내용 14.12.1.1 Features Reference Manual
    - 전압도 12V 와 5V로 구조로 분리되어 동작 (추후 시간이되면, USB3.0 회로구성을 다시 한번 세부 분석해야겠음)
    - 현재 아래는 USB Type-C 사용할때 3.0 와 2.0을 같이 사용하기 위한 전용 Controller로 생각되며, 
      처음 OTG1/2만 사용할 경우 필요 없을 것이라고 생각했지만, 분석 후 아래의 otg3도 같이 사용할 필요할 것으로 파악. 
*/

	usb3phynop1: usb3-phy {
		compatible = "usb-nop-xceiv";
		clocks = <&usb3_lpcg 4>;
		clock-names = "main_clk";
		power-domains = <&pd IMX_SC_R_USB_2_PHY>;
		status = "disabled";
	};

/*     
OTG3/2의 구성을 세부적으로 Datasheet와 Driver 같이 분석 
   
  14.12.6.1 Core Registers Memory map   (5B12_0000 : USB3       0x5B130000,  0x5B140000)
      USB Core Register들은 USB Core Function Control과 독립적인 기능역할을 해서 분리
        - 5B120058 :  OTGCTRL1     Core Control
        - 5B12005C :  OTGCTRL2
        
        - 5B130480 :  PORTSC1USB2  xhci_regs
        - 5B130490 :  PORTSC1USB3  xhci_regs 
   
  14.12.7.1 Non-Core Registers Memory map (5B11_0000 : USB3_CTRL )     
      Non Core Register들로 추가적으로 의존적인 부분이라고 하는데, 공유목적으로 분리사용하는것으로 추측
  
  https://mjmwired.net/kernel/Documentation/devicetree/bindings/usb/cdns-usb3.txt
  
     ./drivers/usb/cdns3/core.c (현재 상위 USB3 PHY 주소는 아래 정의됨)
        /*
         * Request memory region
         * region-0: nxp wrap registers  : 0x5B110000  none_core_regs           USB3_CTRL 
         * region-1: xHCI                : 0x5B130000  xhci_regs  (core_regs)   USB3 
         * region-2: Peripheral          : 0x5B140000  dev_regs   (core_regs)   USB3 
         * region-3: PHY registers       : 0x5B160000  phy_regs                 USB3_PHY3P0 
         * region-4: OTG registers       : 0x5B120000  otg_regs   (core_regs)   USB3 
         */
         
*/

	usbotg3: usb3@5b110000 {
		compatible = "Cadence,usb3";
		reg = <0x5B110000 0x10000>,
			<0x5B130000 0x10000>,
			<0x5B140000 0x10000>,
			<0x5B160000 0x40000>,
			<0x5B120000 0x10000>;
		interrupt-parent = <&gic>;
		interrupts = <GIC_SPI 271 IRQ_TYPE_LEVEL_HIGH>;
		clocks = <&usb3_lpcg 1>,
			 <&usb3_lpcg 0>,
			 <&usb3_lpcg 5>,
			 <&usb3_lpcg 2>,
			 <&usb3_lpcg 3>;
		clock-names = "usb3_lpm_clk", "usb3_bus_clk", "usb3_aclk",
			"usb3_ipg_clk", "usb3_core_pclk";
		assigned-clocks = <&clk IMX_SC_R_USB_2 IMX_SC_PM_CLK_PER>,
				  <&clk IMX_SC_R_USB_2 IMX_SC_PM_CLK_MISC>,
				  <&clk IMX_SC_R_USB_2 IMX_SC_PM_CLK_MST_BUS>;
		assigned-clock-rates = <125000000>, <12000000>, <250000000>;
		power-domains = <&pd IMX_SC_R_USB_2>;
		cdns3,usbphy = <&usb3phynop1>;
		status = "disabled";
	};


  • USB Type C 연결구조 및 USB PD 구조 
USB Type C의 경우 아래와 같이 USB2.0 (Unshielded) 과 USB3.0 (Shielded,CBTU02043) 으로 나뉘어진다. 
USB PD(Power Delivery)는 아래의 PTN5150A에 의해서 CC(Configuration Channel) 설정되며, 내부에 Current도 설정가능하므로 추후 다시 한번 살펴보자. 




OTG1/2관련내용 
Device Tree 요약하면 OTG1 설정 과 OTG3 설정(OTG2가 포함) 두개를 다 사용시 자동적으로 OTG1/2를 Switch된다고하며, OTG3를 써야 OTG2도 동작가능


OTG3 관련내용 CDNS-USB3 사용 

$ vi ./vendor/nxp-opensource/kernel_imx/arch/arm64/boot/dts/freescale/imx8x-mek.dtsi
//상위 설정에서 disable 된 것을 okay 재정의하고, USB OTG1,3 관련 세부설정 

&usbphy1 {
	status = "okay";
};

&usbotg1 {
	vbus-supply = <&reg_usb_otg1_vbus>;
	srp-disable;
	hnp-disable;
	adp-disable;
	power-active-high;
	disable-over-current;
	status = "okay";
};

&usb3phynop1 {
	status = "okay";
};

/*
  ptn5110으로 12V/5V 로 USB PD가 지원되는 것으로 보이며, USB Type C (USB3.0) 일 경우 필요 
*/

&usbotg3 {
	dr_mode = "otg";
	extcon = <&ptn5110>;
	status = "okay";
};


  • USB PD(Power Delivery) 구조 
20V 와 5V Switch로 인하여 CC1/CC2 결정과 내부 Current 결정 


PTN5110/PTN5150A (상위 그림참조) 
CC(Configuration Channel) Logic 이라고하며, 두개의 CC1/CC2를 제공 
USB PD를 위해서 12V 와 5V 선택가능한것으로 보이며, 각 Current도 조절가능 각각의 12V/5V Switch는 별도필요

반드시 참조 

기타용어 
  • OCP (Over Current Protection)
  • OPP (Over Power Protection)
  • OVP (Over Voltage Protection)
  • SCP (Short Circuit Protection)
  • OTP (Over Temperature Protection)
  • BOP (Brown Out Protection)


1.1 Kernel Config 분석방법 

Android에서 제공하는 Kernel Config 옵션이 많이 부족한것 같아 관련부분을 점검해보기로 하고, 아래와 같이 Android Config를 설정한 후 
ARM용으로 menuconfig를 실행하여 설정을 비교하기로 하였으며, menuconfig에서 빠진 내용들을 확인했다. 

$ export ARCH=arm64
//$ export CROSS_COMPILE=aarch64-linux-gnu-
//$ export AARCH64_GCC_CROSS_COMPILE=/opt/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-
//$ export AARCH32_GCC_CROSS_COMPILE=/opt/gcc-arm-8.3-2019.03-x86_64-arm-eabi/bin/arm-eabi-
$ make imx_v8_android_defconfig      //이 설정 값 기반으로 .config을 새로 생성 
$ make menuconfig

$ cp .config org_cofig
$ make menuconfig
$ diff .config org_cofig // 비교 후 수정사항을 상위 defconfig에 추가 

$ vi out/target/product/mek_8q/obj/KERNEL_OBJ/.config
$ diff .config out/target/product/mek_8q/obj/KERNEL_OBJ/.config

$ make mrproper  // 내가 설정한 부분 전체 삭제



1.2 Kernel Config 설정 및 확인 


USB OTG 이해 및 USB Gadget의 KERNEL CONFIG 관련내용 



#
# USB Imaging devices
#
# CONFIG_USB_MDC800 is not set
# CONFIG_USB_MICROTEK is not set
# CONFIG_USBIP_CORE is not set
CONFIG_USB_CDNS3=y
CONFIG_USB_CDNS3_GADGET=y
CONFIG_USB_CDNS3_HOST=y
CONFIG_USB_MUSB_HDRC=y
# CONFIG_USB_MUSB_HOST is not set
# CONFIG_USB_MUSB_GADGET is not set
CONFIG_USB_MUSB_DUAL_ROLE=y
......
CONFIG_USB_LIBCOMPOSITE=y
CONFIG_USB_F_ACM=y
CONFIG_USB_F_SS_LB=y
CONFIG_USB_U_SERIAL=y
CONFIG_USB_U_ETHER=y
CONFIG_USB_U_AUDIO=y
CONFIG_USB_F_SERIAL=y
CONFIG_USB_F_OBEX=y
CONFIG_USB_F_NCM=y
CONFIG_USB_F_ECM=y
CONFIG_USB_F_EEM=y
CONFIG_USB_F_SUBSET=y
CONFIG_USB_F_RNDIS=y
CONFIG_USB_F_MASS_STORAGE=y
CONFIG_USB_F_FS=y
CONFIG_USB_F_UAC1=y
CONFIG_USB_F_UAC1_LEGACY=y
CONFIG_USB_F_UAC2=y
CONFIG_USB_F_UVC=y
CONFIG_USB_F_MIDI=y
CONFIG_USB_F_HID=y
CONFIG_USB_F_ACC=y
CONFIG_USB_F_AUDIO_SRC=y
CONFIG_USB_CONFIGFS=y
CONFIG_USB_CONFIGFS_UEVENT=y
CONFIG_USB_CONFIGFS_SERIAL=y
CONFIG_USB_CONFIGFS_ACM=y
CONFIG_USB_CONFIGFS_OBEX=y
CONFIG_USB_CONFIGFS_NCM=y
CONFIG_USB_CONFIGFS_ECM=y
CONFIG_USB_CONFIGFS_ECM_SUBSET=y
CONFIG_USB_CONFIGFS_RNDIS=y
CONFIG_USB_CONFIGFS_EEM=y
CONFIG_USB_CONFIGFS_MASS_STORAGE=y
CONFIG_USB_CONFIGFS_F_LB_SS=y
CONFIG_USB_CONFIGFS_F_FS=y
CONFIG_USB_CONFIGFS_F_ACC=y
CONFIG_USB_CONFIGFS_F_AUDIO_SRC=y
CONFIG_USB_CONFIGFS_F_UAC1=y
CONFIG_USB_CONFIGFS_F_UAC1_LEGACY=y
CONFIG_USB_CONFIGFS_F_UAC2=y
CONFIG_USB_CONFIGFS_F_MIDI=y
CONFIG_USB_CONFIGFS_F_HID=y
CONFIG_USB_CONFIGFS_F_UVC=y
# CONFIG_USB_CONFIGFS_F_PRINTER is not set
CONFIG_USB_ZERO=m
# CONFIG_USB_ZERO_HNPTEST is not set
CONFIG_USB_AUDIO=m
# CONFIG_GADGET_UAC1 is not set
CONFIG_USB_ETH=m
CONFIG_USB_ETH_RNDIS=y
# CONFIG_USB_ETH_EEM is not set
# CONFIG_USB_G_NCM is not set
# CONFIG_USB_GADGETFS is not set            //필요할 것이라고 생각했는데, 판단미스 
# CONFIG_USB_FUNCTIONFS is not set          //필요할 것이라고 생각했는데, 판단미스
CONFIG_USB_MASS_STORAGE=m
CONFIG_USB_G_SERIAL=m
# CONFIG_USB_MIDI_GADGET is not set
# CONFIG_USB_G_PRINTER is not set
# CONFIG_USB_CDC_COMPOSITE is not set
# CONFIG_USB_G_ACM_MS is not set
# CONFIG_USB_G_MULTI is not set
# CONFIG_USB_G_HID is not set
# CONFIG_USB_G_DBGP is not set
# CONFIG_USB_G_WEBCAM is not set
# CONFIG_USB_RAW_GADGET is not set
# CONFIG_TYPEC is not set
CONFIG_USB_ROLE_SWITCH=y


2. Android init.usb.rc (USB Gadget 수정)  


Android init.rc 문법 

Android에서는 init.rc 문법기반으로 Gadget ConfigFS 기반로 쉽게 USB Gadget들의 상태를 변경가능

  • USB Gadget(Device) 모드 설정 
Chip Vendor init.usb.rc 설정으로 실제 저장되는 곳은 /vendor/etc/init/hw/init.freescale.usb.rc 
$ vi ./device/fsl/imx8q/mek_8q/init.usb.rc
on early-boot
# USG Config FS을 이용하여 직접 init.rc에서 Gadget을 설정가능 
    mount configfs none /config
    mkdir /config/usb_gadget/g1 0770
    mkdir /config/usb_gadget/g1/strings/0x409 0770
    write /config/usb_gadget/g1/bcdUSB 0x0200
    write /config/usb_gadget/g1/idVendor 0x18d1
    write /config/usb_gadget/g1/bcdDevice 0x0440
    write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno}
    write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer}
    write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model}
    mkdir /config/usb_gadget/g1/functions/mass_storage.0
    mkdir /config/usb_gadget/g1/functions/accessory.gs2
    mkdir /config/usb_gadget/g1/functions/audio_source.gs3
    mkdir /config/usb_gadget/g1/functions/rndis.gs4
    mkdir /config/usb_gadget/g1/functions/midi.gs5
    mkdir /config/usb_gadget/g1/functions/ffs.adb
    mkdir /config/usb_gadget/g1/functions/ffs.mtp
    mkdir /config/usb_gadget/g1/functions/ffs.ptp
    mkdir /config/usb_gadget/g1/configs/b.1 0770
    mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770
    write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1
    write /config/usb_gadget/g1/os_desc/qw_sign "MSFT100"
# USB adb  설정 
    mkdir /dev/usb-ffs 0775 shell shell
    mkdir /dev/usb-ffs/adb 0770 shell shell
    mount functionfs adb /dev/usb-ffs/adb rmode=0770,fmode=0660,uid=2000,gid=2000
# USB mtp/ptp device 설정         
    mkdir /dev/usb-ffs/mtp 0770 mtp mtp
    mkdir /dev/usb-ffs/ptp 0770 mtp mtp
    mount functionfs mtp /dev/usb-ffs/mtp rmode=0770,fmode=0660,uid=1024,gid=1024,no_disconnect=1
    mount functionfs ptp /dev/usb-ffs/ptp rmode=0770,fmode=0660,uid=1024,gid=1024,no_disconnect=1
#
# USB Android property 설정 
#   
   setprop sys.usb.mtp.device_type 3  
  
  # vendor.usb.config 설정하며, USB OTG의 주소 ( Device Tree에서 반드시 확인)   
  # ls /sys/class/udc/ 로 확인가능  
  # otg3 는 현재 Device Tree에서 별도의 Driver로 사용하며, USB3 용  (*hdrc* 가 아님)
  # gadget-cdns3 or 5b110000.usb3 (otg3)
    #setprop vendor.usb.config "5b110000.usb3"  
  #   
  # vendor.usb.config 설정하며, USB OTG의 주소 ( Device Tree에서 반드시 확인)   
  # ls /sys/class/udc/ 로 확인가능  
  # ci_hdrc.0 or 5b0d0000.usb (otg1 ,OTG1/2로 동시사용가능)
  #          
    setprop vendor.usb.config "5b0d0000.usb"
     or
    setprop vendor.usb.config "ci_hdrc.0"      
# Kernel의 libcomposite 관련부분 미사용     
    write /sys/module/libcomposite/parameters/disable_l1_for_hs "y"
# 최종 adb    
    symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1

on boot
    setprop sys.usb.configfs 2
    #jhlee (추가후 RNDIS Window 10 존재하나, Window 10에서 미인식 )
    #setprop sys.usb.controller "ci_hdrc.0"
    #setprop sys.usb.config rndis,adb
    #setprop sys.usb.configfs 1    
    #setprop sys.usb.configfs 2

  • Android system/core의 init*.rc 내용 
Android에서제공하는 property 상태에 따라 USB Gadget 설정이 변경되며, 이를 확인 
$ vi system/core/rootdir/init.usb.configfs.rc
  https://android.googlesource.com/platform/system/core/+/master/rootdir/init.usb.configfs.rc
  
//sys.usb.config=adb && property:sys.usb.configfs=0 값에 따라 변경   
$ vi system/core/rootdir/init.usb.rc 
  https://android.googlesource.com/platform/system/core/+/master/rootdir/init.usb.rc

현재 /sys/class/android_usb/android0/enable를 이용하여 방법은 이용을 해보지 못했는데, 
/sys/class/android_usb/android0은 존재하지만, 내부에 enable이 현재 생성되지 않음 



  • USB Gadget TEST 방법 
  https://www.kernel.org/doc/html/latest/usb/gadget-testing.html


  • USB Gadget RNDIS 설정시 ip route 와 iptable 설정 


2.1 Android USB Gadget 설정확인 


  • USB Gadget ConfigFS 관련부분 확인 
Android Board에서 Gadget ConfigFS와 설정된 기능 
$ ls -l /config/usb_gadget/g1/
total 0
-rw-r--r--  1 root root 4096 2021-01-05 07:12 UDC
-rw-r--r--  1 root root 4096 1970-01-01 00:00 bDeviceClass
-rw-r--r--  1 root root 4096 1970-01-01 00:00 bDeviceProtocol
-rw-r--r--  1 root root 4096 1970-01-01 00:00 bDeviceSubClass
-rw-r--r--  1 root root 4096 2021-01-01 07:26 bMaxPacketSize0
-rw-r--r--  1 root root 4096 1970-01-01 00:00 bcdDevice
-rw-r--r--  1 root root 4096 1970-01-01 00:00 bcdUSB
drwxr-xr-x  3 root root    0 1970-01-01 00:00 configs
-rw-r--r--  1 root root 4096 2021-01-01 07:26 driver_match_existing_only
drwxr-xr-x 10 root root    0 2021-01-01 05:16 functions
-rw-r--r--  1 root root 4096 1970-01-01 00:00 idProduct
-rw-r--r--  1 root root 4096 1970-01-01 00:00 idVendor
drwxr-xr-x  2 root root    0 1970-01-01 00:00 os_desc
drwxr-xr-x  3 root root    0 1970-01-01 00:00 strings

//상위 RNDIS 설정된 부분이 나오지 않아 Kernel Config 수정  
$ ls /config/usb_gadget/g1/functions/  
accessory.gs2    ffs.adb ffs.ptp        midi.gs5
audio_source.gs3 ffs.mtp mass_storage.0

//KERNEL CONFIG 추가설정
CONFIG_USB_NET_DRIVERS=y
CONFIG_USB_ETH_RNDIS=y

//Kernel Config 수정 후 USB Gadget RNDIS 확인 
$ ls /config/usb_gadget/g1/functions/ 
accessory.gs2    ffs.adb ffs.ptp        midi.gs5
audio_source.gs3 ffs.mtp mass_storage.0 rndis.gs4 

$ ls /sys/module/libcomposite  //현재 미존재하지만, RNDIS 동작확인 


Window 10 RNDIS 미인식문제 (Window 7은 문제없음)

  • Android Property 관련사항 확인 
getprop를 이용하여 현재 설정된 값들을 확인하고 강제로 변경하여 테스트 
$ getprop | grep usb
[init.svc.usb-hal-1-1]: [running]
[init.svc.usbd]: [stopped]
[persist.sys.usb.config]: [adb]
[ro.audio.usb.period_us]: [20000]
[ro.boottime.usb-hal-1-1]: [13786733000]
[ro.boottime.usbd]: [14657327000]
[sys.usb.config]: [adb]
[sys.usb.configfs]: [2]
[sys.usb.controller]: [ci_hdrc.0]
[sys.usb.ffs.ready]: [1]
[sys.usb.mtp.device_type]: [3]
[vendor.usb.config]: [ci_hdrc.0]

//상위의 init.usb.configfs.rc 중 adbd stop  
$ setprop sys.usb.configfs 1
$ setprop sys.usb.config none
$ setprop sys.usb.configfs 2

//상위의 init.usb.rc 중 rndis,adb 이용을 위해서 강제 기능 테스트 
$ setprop sys.usb.configfs 1
$ setprop sys.usb.config rndis,adb
$ setprop sys.usb.configfs 2

//상위의 init.usb.rc 중 midi,adb 이용을 위해서 강제 기능 테스트 
$ setprop sys.usb.configfs 1
$ setprop sys.usb.config midi,adb
$ setprop sys.usb.configfs 2

//상위와 같이 직접 변경하면 아래와 같이 Error 발생하여, init.usb.rc 반영하기로 결정   
init: processing action (sys.usb.config=rndis,adb && sys.usb.configfs=1) from (/init.usb.configfs.rc:131)
init: processing action (sys.usb.config=rndis,adb && sys.usb.configfs=1 && sys.usb.ffs.ready=1) from (/init.usb.configfs.rc:134)
init: Command 'write /config/usb_gadget/g1/UDC ${sys.usb.controller}' action=sys.usb.config=rndis,adb && sys.usb.configfs=1 && sys.usb.ffs.ready=1 (/init.usb.configfs.rc:139) took 0ms and failed: Unable to write to file '/config/usb_gadget/g1/UDC': Unable to write file contents: Device or resource busy

  • Android i.MX USB 관련사항 점검
i.MX8QXP 와 i.MX6를 비교를 하면 차이나며, 관련부분을 좀 더 분석해야할 것으로 생각됨
// OTG1 관련부분의 hdrc가 1개 확인
$ su
# find /sys -name  *hdrc*     
/sys/class/udc/ci_hdrc.0
/sys/devices/platform/bus@5b000000/5b0d0000.usb/ci_hdrc.0
/sys/devices/platform/bus@5b000000/5b0d0000.usb/ci_hdrc.0/udc/ci_hdrc.0
/sys/bus/platform/devices/ci_hdrc.0
/sys/bus/platform/drivers/musb-hdrc
/sys/bus/platform/drivers/ci_hdrc
/sys/bus/platform/drivers/ci_hdrc/ci_hdrc.0
/sys/bus/pci/drivers/ci_hdrc_pci
/sys/module/musb_hdrc

// OTG3,2 cdns 관련부분확인 
# find /sys -name  *cdn*
/sys/devices/platform/bus@5b000000/5b110000.usb3/xhci-cdns3
/sys/bus/platform/drivers/cdns-mhdp-imx
/sys/bus/platform/drivers/sdhci-cdns
/sys/bus/platform/drivers/cdns-usb3
/sys/bus/platform/drivers/imx-cdnhdmi
/sys/firmware/devicetree/base/bus@5b000000/usb3@5b110000/cdns3,usbphy
/sys/module/cdns3

# lsusb -t
Bus 001 Device 001: ID 1d6b:0002
Bus 001 Device 003: ID 0525:a4a1
Bus 002 Device 001: ID 1d6b:0003

// USB Host에 연결된 Device 확인 (lsusb의 옵션이 제대로 안됨) 
# ls /sys/bus/usb/devices/  
1-0:1.0 1-1 1-1:1.0 1-1:1.1 2-0:1.0 usb1 usb2

# cat /sys/bus/usb/devices/1-1/idProduct
a4a1

# cat /sys/bus/usb/devices/usb1/uevent //usb1이 OTG1 일것이라고 생각했는데, OTG3 이 Host 역할 
MAJOR=189
MINOR=0
DEVNAME=bus/usb/001/001
DEVTYPE=usb_device
DRIVER=usb
OF_NAME=usb3
OF_FULLNAME=/bus@5b000000/usb3@5b110000
OF_COMPATIBLE_0=Cadence,usb3
OF_COMPATIBLE_N=1
PRODUCT=1d6b/2/504
TYPE=9/0/1
BUSNUM=001
DEVNUM=001

# exit
$