1. USB Device Tree 설정분석
USB OTG Device Tree 관련내용
|
Chapter 14 Connectivity Subsystem |
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 )
|
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 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 관련내용
#
# 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들의 상태를 변경가능
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이 현재 생성되지 않음
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은 문제없음)
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
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
$