확장 가능한 호스트 컨트롤러 인터페이스

Extensible Host Controller Interface

eXtensible Host Controller Interface(xHCI)는 USB 1.x, 2.0 및 3.x 호환 장치와 인터페이스할 수 있는 USB(Universal Serial Bus)용 호스트 컨트롤러의 레지스터 수준 설명을 정의하는 컴퓨터 인터페이스 사양입니다.이 사양은 USB 3.0 호스트 컨트롤러 사양이라고도 합니다.

xHCI는 기존의 OHCI(Open Host Controller Interface) 및 Universal Host Controller Interface(UHCI) 아키텍처를 가장 크게 개선하여 단일 표준 내에서 광범위한 속도를 처리하고 제한된 전력 리소스(태블릿이나 휴대폰 등)로 모바일 호스트를 보다 효율적으로 관리할 수 있습니다.또, 저속 디바이스와 고속 디바이스의 혼재 서포트를 심플화.

아키텍처 목표

xHCI는 이전 세대의 USB 호스트 컨트롤러 인터페이스 아키텍처(OHCI(Open Host Controller Interface), UHCI(Universal Host Controller Interface) 및 EHCI(Enhanced Host Controller Interface)와는 많은 면에서 크게 다릅니다.xHCI 아키텍처의 주요 목표는 다음과 같습니다.

  • 효율적인 운용 – 레거시 USB 호스트 컨트롤러 아키텍처보다 아이돌 상태의 전력과 퍼포먼스가 우수합니다.
  • 기존 USB 소프트웨어 모델과 완전히 일치하는 디바이스 레벨 프로그래밍 모델
  • 소프트웨어에 표시되는 호스트 컨트롤러 인터페이스를 기본 USB 프로토콜에서 분리합니다.
  • 호스트 메모리 액세스를 최소화하여 USB 디바이스가 아이돌 상태일 때 완전히 배제
  • 일반 데이터 전송을 위해 레지스터 쓰기 제거 및 레지스터 읽기 최소화
  • "Companion Controller" 모델 제거
  • 시스템 리소스가 제한된 상황에서 하드웨어 "페일오버" 모드를 활성화하여 디바이스에 액세스할 수 있지만 최적의 전원/퍼포먼스 포인트는 아닐 수 있습니다.
  • 하드웨어 기능을 시장에 따라 차별화할 수 있는 기능(특정 시장의 타깃 호스트 컨트롤러 전력, 퍼포먼스 및 비용 트레이드오프 등)을 제공합니다.
  • 확장성이 뛰어난 아키텍처를 정의하여 다른 USB 호스트 컨트롤러 인터페이스를 정의할 필요 없이 고대역폭 인터페이스, 광전송 매체 등 새로운 USB 사양 및 기술을 쉽게 이용할 수 있습니다.

아키텍처 상세

모든 속도 지원

OHCI 및 UHCI 컨트롤러는 USB 1 속도 장치(1.5 Mbit/s 및 12 Mbit/s)만 지원하며 EHCI는 USB 2 장치(480 Mbit/s)만 지원합니다.

xHCI 아키텍처는 SuperSpeed(5기가비트/초) 및 미래 속도를 포함한 모든 USB 속도를 단일 드라이버 스택으로 지원하도록 설계되었습니다.

전력 효율

USB는 1995년에 처음 개발되었을 때 PS/2, 시리얼 포트, 패럴렐 포트, 게임 포트 등 PC에 나타나는 커넥터의 확산을 막기 위해 데스크톱 플랫폼을 대상으로 개발되었으며 당시에는 호스트의 소비전력이 중요한 고려사항이 아니었습니다.그 후 모바일 플랫폼은 선택지가 되었고, 배터리는 소비전력을 주요 고려사항으로 삼고 있습니다.레거시 USB 호스트 컨트롤러(OHCI, UHCI 및 EHCI)의 아키텍처는 매우 유사했습니다.즉, USB에서 실행되는 트랜잭션의 "스케줄"은 호스트 메모리에 있는 소프트웨어에 의해 작성되고 호스트 컨트롤러 하드웨어는 USB에서 실행할 트랜잭션과 타이밍을 결정하기 위해 스케줄을 지속적으로 읽어냅니다.ven(데이터가 이동되지 않은 경우)을 클릭합니다.또, 디바이스로부터의 판독의 경우, 읽어낼 데이터가 없는 경우에서도, 디바이스는 스케줄 간격 마다 폴링 됩니다.

  • xHCI는 호스트 메모리 기반 USB 트랜잭션 일정을 제거하여 USB 데이터 이동이 없을 때 호스트 메모리 작업이 전혀 수행되지 않습니다.
  • xHCI에서는 USB 3.0 이후의 디바이스가 데이터를 읽을 수 있을 때 호스트 컨트롤러에 통지할 수 있도록 함으로써 정기적인 디바이스 폴링의 필요성을 줄이고 인터럽트 트랜잭션을 사용하는 USB 2.0 및 1.1 디바이스의 폴링 관리를 CPU 구동 USB 드라이버에서 USB 호스트 컨트롤러로 이동합니다.EHCI, OHCI 및 UHCI 호스트 컨트롤러는 변경할 필요가 없고 디바이스에서 전송해야 하는 인터럽트가 없는 경우 모두 CPU에 의존하여 [1][2][3]컨트롤러의 스케줄을 설정하는 경우 CPU 폴링을 자동으로 처리합니다.인터럽트 트랜잭션을 사용하는 USB 디바이스가 데이터를 송신하는 경우, xHCI 호스트 컨트롤러는 처리를 필요로 하는 USB 인터럽트 트랜잭션이 있음을 CPU에 통지하기 위해 인터럽트를 송신합니다.CPU는 USB 버스의 폴링을 관리할 필요가 없기 때문에 저전력 상태에서 더 많은 시간을 소비할 수 있습니다.
  • xHCI에서는 USB 2 LPM, USB 3 U1 및 U2 상태, HERD, LTM, Function Wake 등 모든 고급 USB 2 및 3 전원 관리 기능을 지원할 필요가 없습니다.다만, 이러한 기능은 xHCI의 장점을 모두 실현하기 위해서 필요합니다.

가상화 지원

레거시 USB 호스트 컨트롤러 아키텍처는 가상화 환경에 적용할 때 몇 가지 심각한 결점이 있습니다.레거시 USB 호스트컨트롤러 인터페이스는 비교적 단순한 하드웨어 데이터 펌프를 정의합니다.여기서 전체적인 버스 관리(대역폭 할당, 주소 할당 등)와 관련된 중요 상태는 호스트컨트롤러 드라이버(HCD)의 소프트웨어에 있습니다.표준 하드웨어 IO 가상화 기술(I/O 인터페이스 레지스터 복제)을 레거시 USB 호스트 컨트롤러 인터페이스에 적용하려고 하면 가상 머신(VM) 간에 관리해야 하는 중요한 상태를 하드웨어에서 사용할 수 없기 때문에 문제가 발생합니다.xHCI 아키텍처는 이 중요 상태의 제어를 하드웨어로 이행하여 VM 전체에서 USB 리소스를 관리할 수 있도록 합니다.xHCI 가상화 기능은 다음 기능도 제공합니다.

  • (버스 토폴로지 내 위치에 관계없이) 각 USB 디바이스를 임의의 VM에 직접 할당
  • VM 간 런타임 통신 최소화
  • 네이티브 USB 디바이스 공유 지원
  • PCIe SR-IOV 지원(단일 루트 I/O 가상화)

심플한 드라이버 아키텍처

EHCI는 OHCI 또는 UHCI 컨트롤러를 "컴패니언 컨트롤러"로 사용합니다.이 컨트롤러에서는 USB 2 디바이스가 EHCI 스택을 통해 관리되며, EHCI의 포트 로직을 통해 저속 또는 풀스피드의 USB 디바이스를 "컴패니언" UHCI 또는 OHCI 컨트롤러의 포트로 라우팅할 수 있습니다.이 경우, EHCI의 포트 로직은 저속 또는 풀스피드의 USB 디바이스는 풀스피드의 UHCI 또는 OHCI 컨트롤러입니다.CI 또는 OHCI 스택예를 들어, 4개의 USB "Standard A" 커넥터를 갖춘 USB 2 PCIe 호스트 컨트롤러 카드는 일반적으로 시스템 소프트웨어에 4포트 EHCI 컨트롤러 1개와 2포트 OHCI 컨트롤러 2개를 제공합니다.고속 USB 디바이스가 4개의 커넥터 중 하나에 연결되어 있는 경우 EHCI 컨트롤러의 4개의 루트 허브 포트 중 하나를 통해 디바이스가 관리됩니다.저속 또는 풀스피드의 USB 디바이스가 커넥터 1 또는2에 접속되어 있는 경우, 관리용 OHCI 컨트롤러의 루트 허브 포토에 라우팅 됩니다.커넥터 3 또는4에 접속되어 있는 저속 및 풀스피드의 USB 디바이스는 다른 OHCI 컨트롤러의 루트 허브 포토에 라우팅 됩니다.EHCI는 고속 USB 디바이스 및 저속 및 풀 스피드 USB 디바이스 그룹에 대해 별도의 호스트 컨트롤러에 의존하기 때문에 EHCI 드라이버와 OHCI/UHCI 드라이버 간의 상호 작용과 의존성이 복잡해집니다.

  • xHCI 아키텍처를 통해 컨트롤러와 별도의 드라이버 스택이 필요하지 않습니다.
  • 드라이버에 의해 이전에 실행되었던 스케줄, 대역폭 관리 및 USB 디바이스 주소 할당 기능을 xHCI 하드웨어에 통합함으로써 xHCI의 소프트웨어 스택이 보다 단순하고 얇아지고 지연 시간이 단축됩니다.

스트림 지원

스트림 지원은 USB 3.0 SuperSpeed 사양에 추가되었습니다.주로 USB를 통한 고성능 스토리지 조작을 가능하게 합니다.일반적으로 USB 엔드포인트와 시스템 메모리의 버퍼 사이에는 1:1의 관계가 있으며 호스트 컨트롤러가 모든 데이터 전송을 담당합니다.스트림은 1 대 다의 "엔드포인트 투 버퍼" 어소시에이션을 제공하고 디바이스가 호스트 컨트롤러에 어떤 버퍼를 이동시킬지 지시하도록 함으로써 이 패러다임을 변경했습니다.USB 스트림엔드포인트와 관련된 USB 데이터 전송은 다른 벌크엔드포인트와 동일하게 xHCI에 의해 스케줄링되지만 전송과 관련된 데이터 버퍼는 디바이스에 의해 결정됩니다.

  • xHCI USB 스트림을 지원하므로 최대 64K의 버퍼를 단일 엔드포인트에 연결할 수 있습니다.
  • xHCI 스트림 프로토콜 지원을 통해 USB 디바이스는 엔드포인트가 예약될 때 xHCI가 전송할 버퍼를 선택할 수 있습니다.

확장성

xHCI 아키텍처는 확장성이 뛰어나 1~255개의 USB 디바이스와 1~255개의 루트 허브 포트를 지원할 수 있도록 설계되었습니다.각 USB 디바이스는 최대 31개의 엔드포인트를 정의할 수 있으므로 255개의 디바이스를 지원하는 xHCI는 총 7,906개의 개별 엔드포인트를 지원해야 합니다.일반적으로 엔드포인트와 관련된 각 메모리 버퍼는 물리 메모리 블록의 큐에 의해 설명되며, 큐는 상태를 정의하기 위해 헤드 포인터, 테일 포인터, 길이 및 기타 레지스터를 필요로 한다.큐 상태를 정의하는 방법은 여러 가지가 있지만 각 큐에 대해 32바이트의 레지스터 공간을 가정할 경우 7,906개의 큐를 지원하려면 거의 256KB의 레지스터 공간이 필요합니다.일반적으로 한 번에 시스템에 접속되는 USB 디바이스는 소수에 불과하며, 평균적으로 USB 디바이스는 3-4개의 엔드포인트를 지원하며, 그 중 일부 엔드포인트만 동시에 활성화됩니다.xHCI는 엔드포인트콘텍스트 데이터 구조로서 시스템메모리의 큐 상태를 유지합니다.콘텍스트는 xHCI에 의해 캐시되어 엔드포인트액티비티의 함수로 「페이징」될 수 있도록 설계되어 있습니다.따라서 벤더는 내부 xHCI Endpoint Context 캐시 공간과 리소스를 지원하는 아키텍처 제한이 아니라 자사 제품에 기대되는 실제 사용 모델에 맞게 확장할 수 있습니다.통상적인 사용 조건에서는 xHCI에 의한 컨텍스트페이징이 발생하지 않도록 내부 캐시 공간을 선택하는 것이 이상적입니다.또, USB 엔드 포인트액티비티는 버스트하는 경향이 있습니다.즉, 임의의 시점에서 다수의 엔드포인트가 데이터를 이동할 준비가 되어 있을 수 있지만, 액티브하게 데이터를 이동하는 것은 서브셋뿐입니다.예를 들어 사용자가 자리를 비우면 마우스의 인터럽트 IN 엔드 포인트에서 몇 시간 동안 데이터가 전송되지 않을 수 있습니다.xHCI 벤더 고유의 알고리즘에 의해 이 상태가 검출되어 다른 엔드포인트가 비지 상태가 되었을 경우 해당 엔드포인트를 페이징 아웃 대상으로 할 수 있습니다.

  • xHCI 아키텍처에서는 지원되는 USB 디바이스, 포트, 인터럽트 벡터 등의 최대값을 크게 설정할 수 있습니다.다만, 실장에서는, 마케팅 요건을 만족시키기 위해서 필요한 수를 정의하기만 하면 됩니다.예를 들어, 벤더는 태블릿 xHCI 구현을 위해 지원하는 USB 디바이스의 수를 16개로 제한할 수 있습니다.
  • 벤더는 xHCI 아키텍처 기능을 활용하여 내부 리소스를 목표 사용 모델에 맞게 확장할 수 있습니다.예를 들어, 사용 편의성 테스트를 통해 태블릿 사용자의 95%가 4개 이상의 USB 장치를 연결하지 않을 것으로 판단되고 각 USB 장치가 일반적으로 4개 이하의 엔드포인트를 정의한 경우, 16개의 엔드포인트 콘텍스트에 대한 내부 캐싱은 엔드포인트 콘텍스트 파지로 인해 시스템 메모리 작업이 발생하지 않도록 보장합니다.ng.

역사

OHCI(Open Host Controller Interface) 사양은 기업 컨소시엄(Compaq, Microsoft 및 National Semiconductor)에 의해 USB 1.0 디바이스를 지원하는 개방형 사양으로 정의되었습니다.Universal Host Controller Interface (UHCI; 유니버설호스트 컨트롤러 인터페이스)는 원래 인텔이 USB 1.0 디바이스를 지원하는 전용 인터페이스로 정의한 사양을 말합니다.UHCI 규격은 결국 공개되었지만, 다른 업계가 OHCI 규격을 채택한 후에야 공개되었습니다.

EHCI 사양은 USB 2.0 디바이스를 지원하기 위해 인텔에 의해 정의되었습니다.EHCI 아키텍처는 UHCI 및 OHCI 컨트롤러를 본떠 설계되었으며, 이를 위해서는 USB 트랜잭션 일정을 메모리에 구축하고 대역폭 및 주소 할당을 관리하기 위한 소프트웨어가 필요했습니다.오픈 버전의 USB 2.0 호스트 컨트롤러 인터페이스를 정의하기 위한 업계의 중복된 노력을 없애기 위해 인텔은 라이센스 비용을 지불하지 않고 EHCI 사양을 업계에 공개했습니다.

EHCI 라이센스 모델은 인텔의 xHCI 사양으로 계속 사용되었지만 업계의 공헌이 크게 확대되었습니다.100개 이상의 회사가 xHCI 규격에 기여했습니다.USB-IF(Implementers Forum)는 또한 다양한 xHCI 구현의 호환성을 극대화하기 위해 일련의 xHCI 컴플라이언스 테스트에 자금을 지원했습니다.

xHCI 1.0 컨트롤러는 2009년 12월부터 출하되고 있습니다.2009년 이후 Linux 커널에는 xHCI [4]드라이버가 포함되어 있지만 오래된 커널의 경우 온라인으로 드라이버를 사용할 수 있습니다.XP, Vista 및 Windows 7 용 Windows 드라이버는, 각각의 xHCI 벤더로부터 입수할 수 있습니다.임베디드 시스템용 xHCI 드라이버는 MCCI, Jungo 및 기타 소프트웨어 벤더에서 구할 수 있습니다.xHCI IP 블록은 SOC 환경에서의 커스터마이징을 위해 여러 벤더의 제품도 받고 있습니다.xHCI 1.1 컨트롤러 및 장치는 2015년부터 출하되기 시작했습니다.

버전 이력

xHCI 사양에서는 "errata" 파일을 사용하여 특정 릴리스에 대한 업데이트 및 설명을 정의합니다.에라타 파일의 변경 내용은 각 릴리스에 누적됩니다.특정 변경에 대한 자세한 내용은 관련 에라타 파일을 참조하십시오.xHCI 에러타 파일에 정의되어 있는 변경의 대부분은 명확화, 문법 또는 철자 수정, 추가 상호 참조 등이며, 드라이버의 실장에 영향을 주지 않습니다.아키텍처로 결정된 변경은 기능 플래그를 사용하여 특정 기능이 xHCI 구현에서 지원되는지 여부를 판단하고 활성화 플래그를 사용하여 기능을 활성화합니다.

프리리스

xHCI 사양은 2010년에 정식 출시되기 전에 다음과 같은 여러 버전을 통해 발전했습니다.

  • xHCI 0.9: 2008년8월 출시
  • USB 0.95: 2008년 12월에 출시.
  • USB 0.96:2009년 8월에 출시.
  • USB 0.96a: 1.0 출시 후보, 2010년 4월에 출시.이 버전을 기반으로 한 첫 번째 출하 장치.

xHCI 1.0

  • xHCI 1.0: 2010년 5월 21일 최초 공개.
    1.5 Mbit/s(저속), 12 Mbit/s( 스피드), 480 Mbit/s(고속), 5 Gbit/s(슈퍼 스피드)의 USB 데이터 레이트를 지정.
  • xHCI 1.0, 에라타 파일 1~4: 2011년 1월 17일 출시.
    대규모 1.0 사용자로부터의 초기 리뷰 피드백, Save-Restore 설명 및 하드웨어 LPM 지원 포함.
  • xHCI 1.0, 에라타 파일 1~6: 2011년 3월 18일 출시.
    명확화
  • xHCI 1.0, 에라타 파일 1~7: 2011년 6월 13일 출시.
    명확화

xHCI 1.1

  • xHCI 1.1: 2013년 12월 21일 출시.10 Gbit/s(SuperSpeed+)의 USB 3.1 데이터 레이트를 지정합니다.여기에는 xHCI 1.0 에라타 파일 1-21이 포함되어 있습니다.컨트롤러가 HCSPARAMS2 기능 레지스터에 더 많은 수의 스크래치패드 버퍼(최대 1023개)를 요구할 수 있습니다.

xHCI 1.2

  • xHCI 1.2: 2019년 5월 날짜.지정된 USB 3.2 데이터 레이트는 10기가비트/초(SuperSpeedPlus Gen1x2) 및 20기가비트/초(SuperSpeedPlus Gen2x2)[5]입니다.

레퍼런스

  1. ^ "UHCI11D.DOC" (PDF). Ftp.netbsd.org. Retrieved 2017-01-09.
  2. ^ "Archived copy" (PDF). Archived from the original (PDF) on 2015-08-10. Retrieved 2014-07-02.{{cite web}}: CS1 maint: 제목으로 아카이브된 복사(링크)
  3. ^ [1][데드링크]
  4. ^ "USB 3.0 in Linux kernel". hvera.wordpress.com. 10 June 2009. Retrieved 2017-02-02.
  5. ^ "Intel Data Center Solutions, IoT, and PC Innovation".

외부 링크