4.9 USB
4.9.1 Introduction
유니버셜 시리얼 버스(USB: Universal Serial Bus) 드라이버는 CHIPIDEA USB-HS OTG 컨트롤러에 대한 표준 Linux 드라이버 인터페이스를 구현한다.
USB는 광범위한 PC와 주변 디바이스 상호 연결에 사용할 수 있는 범용 링크를 제공한다. 플러그앤 플레이, 포트 확장과 동일한 타입의 포트를 사용하는 새로운 USB 주변 디바이스를 지원한다.
CHIPIDEA USB 컨트롤러는 EHCI(Enhanced Host Controller Interface)-호환 이다. 이 USB 드라이버에는 아래와 같은 기능이 있다:
- High-speed OTG 코어 지원된다.
- High-speed Host Only 코어 (Host1), high-speed, full-speed 그리고 low-speed 디바이스가 지원된다.
- High-speed Inter-Chip 코어 (Host2 & Host3)
- High-speed Host Only 코어 (OTG2), high-speed, full-speed 그리고 low-speed 디바이스가 지원된다. USB2Pci 브리지는 기본적으로 OTG2에 연결된다. 따라서, 사용자는 이 포트에 다른 USB 디바이스를 연결하지 못할 수 있다.
- High-speed Inter-Chip 코어 (Host2)
- 호스트 모드 - HID (Human Interface Devices), MSC (Mass Storage Class) 지원
- 주변 디바이스 모드 - MSC와 Ethernet과 시리얼 지원을 포함하는 CDC (Communication Devices Class) 드라이버 지원
- 임베디드 DMA 컨트롤러
USB Speed
low-speed : 1.5Mbps
full-speed : 12Mbps
high-speed : 480Mbps
4.9.2 Architectural Overview
USB 호스트 시스템은 하드웨어와 소프트웨어의 여러 레이어로 구성된다.
아래 그림은 USB 2.0을 지원하는 호스트 시스템의 빌딩 블록 레이어에 대한 개념적인 블록 다이어그램을 보여준다.
4.9.3 Hardware Operation
하드웨어 작동에 대한 정보는 EHCI spec.ehci-r10.pdf를 참조한다.
사양은 Enhanced Host Controller Interface for USB 2.0: Specification에서 확인할 수 있다.
4.9.4 Software Operation
Linux OS에는 USB 프로토콜을 구현하는 USB 드라이버가 포함되어 있다. USB 호스트의 경우, 하드웨어 지정 초기화 기능만 구현한다. USB 주변 디바이스의 경우, 가젯 프레임워크를 구현한다. OTG의 경우, ID 동적 스위치 호스트/디바이스 모드가 지원된다. 현재, USB에 대한 런타임 일시 중지가 지원된다. 즉, USB가 사용 중이 아닐 때(호스트 및 주변 디바이스 모드 모두) USB는 저전력 모드로 진입한다.
4.9.5 Source Code Structure
아래 테이블은 drivers/usb의 USB 소스를 설명한다.
Table 46. Chipidea USB Driver Files
File | Description |
---|---|
drivers/usb/chipidea/core.c | Chipidea IP 코어 드라이버 |
drivers/usb/chipidea/udc.c | Chipidea 주변 디바이스 드라이버 |
drivers/usb/chipidea/host.c | Chipidea 호스트 드라이버 |
drivers/usb/chipidea/otg.c | Chipidea OTG 드라이버 |
drivers/usb/chipidea/otg_fsm.c | Chipidea OTG HNP 및 SRP 드라이버 |
drivers/usb/chipidea/ci_hdrc_imx.c | i.MX 글루 레이어 |
drivers/usb/chipidea/usbmisc_imx.c | i.MX SoC 추상화 레이어 |
drivers/usb/phy/phy-mxs-usb.c | i.MX 6 USB 물리적 레이어 |
4.9.6 Menu Configuration Options
메뉴 구성에서 아래 모듈을 활성화한다.
- Device Drivers > [*] USB support > EHCI HCD (USB 2.0) support and ChipIdea Highspeed Dual Role Controller [*] USB Physical Layer drivers --->
- Device Drivers > USB Physical Layer drivers > Freescale MXS USB PHY support
- Device Drivers > USB Gadget Support
- CONFIG_USB - Host 측 USB에 대한 빌드 지원
- CONFIG_USB_EHCI_HCD EHCI HCD (USB 2.0) 지원
Default y - CONFIG_USB_CHIPIDEA - ChipIdea high-speed Dual Role Controller
Default y - CONFIG_USB_CHIPIDEA_UDC - ChipIdea 디바이스 컨트롤러
Default y - CONFIG_USB_CHIPIDEA_HOST - ChipIdea 호스트 컨트롤러
Default y - CONFIG_USB_GADGET - USB Gadget Support
Default y - CONFIG_USB_MXS_PHY - Freescale MXS USB PHY 지원
Default y
4.9.7 USB Wakeup Usage
아래 예는 OTG 포트와 첫 번째 EHCI 디바이스에 대한 것이다.
아래의 설정과 같이 컨트롤러에서 웨이크업 설정 후, VBUS와 ID가 웨이크업 소스가 된다.
echo enabled > /sys/bus/platform/devices/20c9000.usbphy/power/wakeup
echo enabled > /sys/bus/platform/devices/2184000.usb/power/wakeup
echo enabled > /sys/bus/platform/devices/ci_hdrc.0/power/wakeup
아래의 설정과 같이 EHCI 웨이크업 설정 후, 호스트는 원격 웨이크업과 연결/연결 해제 웨이크업 같은 웨이크업 기능을 갖는다.
echo enabled > /sys/bus/usb/devices/usb1/power/wakeup
echo enabled > /sys/bus/usb/devices/1-1/power/wakeup
참고
OTG 모드가 호스트에서 디바이스로 전환되면, EHCI 웨이크업이 삭제되며, 사용자는 시스템이 일시 중지되기 전에 다시 설정해야 한다.
4.9.8 How to Close the USB Child Device Power
아래 코드 문자열은 USB 하위 디바이스 전원을 차단하는 방법을 설명한다:
echo auto > /sys/bus/usb/devices/1-1/power/control
echo auto > /sys/bus/usb/devices/1-1.1/power/control (If there is a hub at USB device)
4.9.9 Changing the Controller Operation Mode
기본 설정을 변경하려면, 아래와 같이 DTS 파일을 수정할 수 있다:
dr_mode = "host" /* Set controller as gadget-only mode */
dr_mode = "peripheral" /* Set controller as host-only mode */
dr_mode = "otg" /* Set controller as otg mode */
4.9.10 Loadable Module Support
modprobe 유틸리티는 모든 모듈 사이에서 종속성을 가지는 모듈을 자동으로 로드한다.
로드 커맨드는 아래와 같다:
modprobe phy_mxs_usb
modprobe ci_hdrc_imx
언로드 커맨드는 아래와 같다:
modprobe -r ci_hdrc_imx
modprobe -r phy_mxs_usb
4.9.11 USB Charger Detection
i.MX SoC에는 USB 충전기를 감지하는 기능은 있지만, 충전 기능은 없다. 사용자는 USB 충전기 유형, 충전 전류와 충전기 존재 여부를 알기 위해 아래 세 라인과 같이 /sys 항목을 사용할 수 있다:
cat /sys/class/power_supply/imx6_usb_charger/type
cat /sys/class/power_supply/imx6_usb_charger/current_max
cat /sys/class/power_supply/imx6_usb_charger/present
현재, i.MX 6 Sabre-SD 보드에서는 USB 충전기를 감지하는 기능을 지원하지 않는다. i.MX 6 Sabre-Auto는 이 기능을 지원한다.
4.9.12 Embeded Host Certification
4.9.12.1 Adding TPL-Support Property
임베디드 호스트 USB 인증을 통과하려면, Targeted Peripheral List(TPL)을 활성화하기 위해 DTS에 "tpl-support"를 추가해야 한다. 예를 들어, i.MX 6UltraLite EVK 보드(imx6ul-14x14-evk.dts)의 Host 포트에서 TPL을 아래와 같이 활성화한다:
&usbotg2 {
dr_mode = "host";
disable-over-current;
tpl-support;
status = "okay";
};
4.9.12.2 VBUS Control
VBUS는 Linux USB 호스트 기능이 준비될 때까지 꺼져 있어야 한다. 예를 들어, i.MX 6UltraLite EVK에서는 핀이 터치 기능과 다중화(multiplex)되어 있기 때문에, VBUS 컨트롤을 위해 GPIO(GPIO1_IO02)를 선택하도록 보드 재작업이 필요하다.
아래와 같이 DTS 파일(imx6ul-14x14-evk.dts)에서 터치 기능을 비활성화한다:
&tsc {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_tsc>;
xnur-gpio = <&gpio1 3 0>;
measure_delay_time = <0xffff>;
pre_charge_time = <0xfff>;
status = "disabled";
};
VBUS GPIO pinctrl과 해당 레귤레이터 노드를 추가한다:
pinctrl_usb_otg2: usbotg2grp {
fsl,pins = <
MX6UL_PAD_GPIO1_IO02__GPIO1_IO02 0xb0
>;
};
reg_usb_otg2_vbus: regulator@2 {
compatible = "regulator-fixed";
reg = <2>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_usb_otg2>;
regulator-name = "usb_otg2_vbus";
regulator-min-microvolt = <5000000>;
regulator-max-microvolt = <5000000>;
gpio = <&gpio1 2 GPIO_ACTIVE_HIGH>;
enable-active-high;
};
&usbotg2 {
vbus-supply = <®_usb_otg2_vbus>;
dr_mode = "host";
disable-over-current;
tpl-support;
status = "okay";
};