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 드라이버에는 아래와 같은 기능이 있다 :
- 고속의 OTG core 지원
- 고속의 Host Only core (Host1), high-speed, full speed, low 디바이스 지원
- 고속의 Inter-Chip core (Host2 & Host3)
- 고속의 Host Only core (OTG2), high-speed, full speed, low 디바이스 지원. USB2Pci 브리지는 기본으로 OTG2에 연결된다. 따라서 사용자는 이 포트에 다른 USB 디바이스를 연결하지 못할 수 있다.
- 고속의 Inter-Chip core (Host2)
- Host 모드 - HID(Human Interface Devices), MSC(Mass Storage Class) 지원
- Peripheral 모드 - Ethernet과 시리얼 지원을 포함하는, MSC와 CDC(Communication Devices Class) 드라이버 지원
- 내장된 DMA 컨트롤러
4.9.2 Architectural Overview
USB 호스트 시스템은 여러 하드웨어와 소프트웨어 레이어로 구성된다.
아래 그림은 USB 2.0을 지원하는 호스트 시스템에서 구축하는 블록 레이어(building block layer)의 개념적 블록 다이어그램을 보여준다.
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 주변 디바이스의 경우, 가제트(gadget) 프레임워크를 구현한다. OTG의 경우, 호스트/디바이스 모드로 동적 스위칭되는 ID가 지원된다. 현재 USB에 대한 런타임 suspend(일시 중단)가 지원된다. 즉, 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 core 드라이버 |
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 연결(glue) 레이어 |
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) 지원
기본 y - CONFIG_USB_CHIPIDEA - ChipIdea 고속의 Dual Role Controller (호스트나 디바이스, 주변 디바이스 역할)
기본 y - CONFIG_USB_CHIPIDEA_UDC - ChipIdea 디바이스 컨트롤러
기본 y - CONFIG_USB_CHIPIDEA_HOST - ChipIdea 호스트 컨트롤러
기본 y - CONFIG_USB_GADGET - USB Gadget Support
기본 y - CONFIG_USB_MXS_PHY - Freescale MXS USB PHY 지원
기본 y
4.9.7 USB Wakeup Usage
아래 예는 OTG 포트와 첫 번째 EHCI 디바이스에 관한 것이다.
컨트롤러 wakeup 설정, 아래와 같이 설정 후 VBUS와 ID가 wakeup의 소스가 된다.
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 wakeup 설정, 아래와 같이 설정 후 호스트는 remote wakeup과 connect/disconnect wakeup과 같은 wakeup 기능을 갖는다.
echo enabled > /sys/bus/usb/devices/usb1/power/wakeup
echo enabled > /sys/bus/usb/devices/1-1/power/wakeup
참고
OTG 모드가 호스트에서 디바이스로 스위칭되면, EHCI wakeup이 삭제되고 사용자는 시스템이 suspend되기 전에 다시 설정해야 한다.
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 충전기를 감지하는 기능이 있지만, 충전하는 기능은 없다. 사용자는 /sys 항목을 사용하여 아래 세 줄과 같이 USB 충전기 유형, 충전 전류, 충전기 존재 여부를 알 수 있다.
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 인증을 통과하려면, DTS에 "tpl-support"를 추가하여 TPL(Targeted Peripheral List)를 활성화해야 한다. 예를 들어 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에서 핀이 터치 기능으로 멀티플렉스되기 때문에, VBUScontrol용으로 선택된 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";
};