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만 사용하고자 하면 이 구조를 변경을 해야한다.
- OTG1: OTG 사용
- 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 )
변경하고자 하는 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 Register 와 USB 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 = <®_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 관련내용
- Kernel USB Gadget 관련 설정
# # 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이 현재 생성되지 않음
- Android init*.rc 다른 예제
- USB Gadget TEST 방법
- 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 $