참고 사이트 : https://docs.microsoft.com/ko-kr/windows-hardware/drivers/hid/hid-over-i2c-guide
Microsoft는 장치가 I²C(Inter-Integrated Circuit) 버스를 통해 통신할 수 있도록 하는 새로운 HID 미니포트 드라이버를 만들었습니다.
새로운 HID 미니포트 솔루션은 USB 및 Bluetooth를 넘어 HID 프로토콜을 확장하여 I²C 장치를 지원합니다.
I²C는 간단하지만 효율적인 프로토콜이며 전화 및 임베디드 플랫폼에서 10년 이상 사용되어 왔습니다.
이 프로토콜은 HIDI2C.sys라는 기본 제공 KMDF 드라이버에 의해 Windows 8에서 지원됩니다.
인박스 드라이버에서 HID를 통한 I²C 지원이 결합되어 하드웨어 제조업체는 드라이버를 만들 필요 없이 Windows에서 장치를 빠르게 실행할 수 있습니다.
여러 ACPI 리소스가 있는 시스템에서 올바른 동작을 보장하려면 다음 두 리소스가 먼저 나타나야 합니다.
- HID I²C connection
- Device interrupt
현재 HID I²C 드라이버는 SPB(Simple Peripheral Bus) 및 GPIO를 지원하는 SoC 시스템을 대상으로 합니다. 앞으로 Microsoft는 비 SoC 시스템에서 이 드라이버를 지원할 수 있습니다. HID I²C 드라이버는 모든 HID 클라이언트를 지원하도록 최적화되어 있습니다. HID I²C 드라이버를 사용하면 장치 및 시스템 제조업체가 키보드, 터치패드, 터치 스크린, 센서 등과 같은 일반적인 장치 유형을 지원하기 위해 개발해야 하는 총 드라이버 수를 줄일 수 있습니다. HID I²C 드라이버는 Windows의 모든 클라이언트 SKU에서 사용할 수 있으며 WinPE에 포함되어 있습니다.
HID I²C 드라이버 스택은 Microsoft에서 제공하는 기존 및 새로운 구성 요소와 I²C 실리콘 제조업체에서 제공하는 구성 요소로 구성됩니다. 다음 그림은 스택과 이러한 구성 요소를 보여줍니다.
저전력의 단순한 버스가 운영 체제와 효과적으로 통신할 수 있는 인터페이스를 제공합니다.
이 인터페이스를 SPB(Simple Peripheral Bus)라고 하며 I²C(Inter-Integrated Circuit) 및 SPI(Serial Peripheral Interface)와 같은 버스를 지원합니다.
SPB에 대한 자세한 내용은 Simple Peripheral Buses 항목을 참조하십시오.
I²C를 통한 HID에 대한 프로토콜 사양 버전 1.0을 구현하는 KMDF 기반 HID 미니포트 드라이버를 제공합니다.
이 드라이버의 이름은 HIDI2C.sys입니다.
Windows는 ACPI(고급 구성 및 전원 인터페이스)에 의해 노출되는 호환 가능한 ID 일치를 기반으로 이 드라이버를 로드합니다.
드라이버는 HID IOCTL을 사용하는 앱이 HID IOCTL 및 API 세트를 활용하는 소프트웨어에 대한 응용 프로그램 수준 호환성을 보장합니다.
장치는 주의가 필요하거나 데이터가 있을 때 호스트를 어설션합니다. 그러나 어설션이 발생하기 전에 GPIO 연결이 있어야 합니다.
참고 HIDI2C.sys 장치 드라이버는 I²C 버스만 지원합니다. Windows 8에서는 SPI, SMBUS 또는 기타 저전력 버스를 지원하지 않습니다.
The I²C Controller Driver
I²C 컨트롤러 드라이버는 SPB(Serial Peripheral Bus) IOCTL 인터페이스를 노출하여 읽기 및 쓰기 작업을 수행합니다. 이 드라이버는 실제 컨트롤러 내장 기능(예: I²C)을 제공합니다. SPB 클래스 확장은 컨트롤러 드라이버를 대신하여 리소스 허브와의 모든 상호 작용을 처리하고 동시 대상을 관리하는 데 필요한 대기열을 구현합니다.
The GPIO Controller Driver
GPIO(범용 입/출력) 컨트롤러는 GPIO를 통해 장치에서 인터럽트를 전달합니다. 이것은 종종 GPIO 핀을 사용하여 Windows에 새 데이터 또는 기타 이벤트를 알리는 간단한 하위 구성 요소입니다. GPIO는 또한 I²C 채널 이외의 접근 방식으로 장치를 제어할 수 있습니다.
Plug and play support for I2C
이 문서에서는 I²C 전송을 통해 HID를 지원하는 장치에 대한 플러그 앤 플레이 지원에 대해 설명합니다.
Driver Loading
Windows는 하드웨어 식별자와 INF 간의 호환 가능한 식별자 일치를 기반으로 HID I²C 클래스 드라이버를 로드합니다.
식별자는 고급 구성 및 전원 인터페이스(ACPI)에 의해 생성됩니다.
하드웨어 식별자는 ACPI의 I²C 장치 노드에 대해 생성됩니다. 모든 HID I²C 호환 장치는 고유한 하드웨어 식별자 외에도 호환성 식별자를 노출해야 합니다.
ACPI 5.0 사양에는 HID 클래스 장치에 대한 지원이 포함됩니다. HID I²C에 대한 ACPI 정의는 다음과 같습니다.
모든 HID I²C 장치는 다음 필수 필드를 제공해야 합니다.
- Compatible ID
- Hardware ID
- Hardware Revision
- Current Resource Settings
- Device Specific Method
추가 정보는 고급 구성 및 전원 인터페이스(ACPI) 5.0 사양을 참조하십시오.
다음은 임의의 HID I²C 장치에 대한 하드웨어 ID 및 호환 ID의 예를 제공합니다. 이러한 세부 정보는 "공급업체별" 클래스의 최상위 컬렉션이 있는 HID로 자체 보고하는 샘플 장치를 기반으로 합니다.
ACPI(고급 구성 및 전원 인터페이스)는 HID I²C 전송 드라이버를 로드하기 위해 다음 하드웨어 ID 및 호환 가능한 ID를 생성합니다.
Hardware Identifiers: Compatible Identifiers
ACPI\Vid_xxxx&Pid_yyyy&Rev_zzzz;: ACPI\PNP0C50
ACPI\Vid_xxxxPid_yyyy;:
ACPI\xxxxyyyy;:
Device enumeration sequence
HID I²C 장치 드라이버(HIDI2C.Sys)가 로드되면 I²C 버스를 통해 장치와 통신하기 시작합니다. 드라이버가 수행하는 첫 번째 작업은 장치 열거 시퀀스입니다.
다음 목록은 열거 순서를 제공합니다. 이 목록의 순서는 향후 Windows 버전에서 변경될 수 있습니다.
- Retrieve ACPI Source Language (ASL) code for HID I²C DEVICE from System BIOS.
- Retrieve HID Descriptor from the Device.
- Write HID Descriptor Address
- Read HID Descriptor
- Issue a SET_POWER to the Device.
- Write SET_POWER Command
- Issue a RESET (Host Initiated Reset) to the Device.
- Write RESET Command
- Device asserts GPIO interrupt
- Read value (0x00 0x00) from input register
- Retrieve report descriptor from the device.
- Write report descriptor address
- Read report descriptor
HOST가 DEVICE로 1-5단계를 성공적으로 완료하지 못하면 HIDI²C 드라이버가 코드 10의 오류 값과 함께 로드될 수 있습니다. 이러한 명령에는 재시도 논리가 내장되어 있지 않습니다.
참고: I²C에서 시간을 최적화하기 위해 4단계와 5단계를 병렬로 수행할 수 있습니다. 보고서 설명자는 (a) 정적이고 (b) 상당히 길기 때문에 Windows 8은 4에서 장치의 응답을 기다리는 동안 5에 대한 요청을 발행할 수 있습니다.
Supported HID I²C commands
HIDI2C.SYS driver supports the following commands:
HID power management over the I2C
Power management and optimization
Windows 8에는 Always On, Always Connected라는 새로운 전원 모델이 도입되었습니다. 이 모델을 사용하면 슬레이트와 PC를 전력 및 성능에 최적화할 수 있습니다. 동시에 Windows 8은 PC를 사용하지 않는 상황에서의 전력 소비에 대해 고도로 최적화되어 있습니다. 예를 들어, 의도적으로 또는 사용자 활동이 없는 결과로 화면이 꺼졌을 때 전력을 절약합니다.
HID 장치는 Windows의 기본 장치 클래스이므로 이 새로운 전원 모델을 준수해야 합니다.
Connected standby
다음은 연결된 대기 전원 상태에서 장치가 작동하는 방식에 대한 간략한 요약입니다.
Supporting connected standby in HID I²C Devices
I²C 버스의 장치는 고급 구성 및 전원 인터페이스(ACPI)에 의해 열거됩니다. HID-I²C 프로토콜 사양의 일부로 HIDI²C 장치의 전원 관리는 SET_POWER 명령으로 지원됩니다. 이 명령은 장치가 저전력 모드로 전환되거나 전환되도록 지시합니다.
인박스 HIDI²C 미니포트 드라이버는 HIDClass의 D-IRP를 따라 전달됩니다. 이를 통해 ACPI는 차례로 장치의 전원을 관리할 수 있습니다.
Troubleshooting common errors
이 문서에서는 하드웨어 공급업체와 드라이버 개발자가 I²C 펌웨어 또는 드라이버 소프트웨어를 디버깅할 때 발생할 수 있는 일반적인 문제를 다룹니다.
HIDI²C Driver Does not Load
I²C 컨트롤러 드라이버가 로드되었지만 장치가 Windows 장치 관리자에 나타나지 않으면 다음을 참조하십시오.
위의 문제는 일반적으로 호스트 또는 장치에 대해 잘못된 ACPI 소스 언어(ASL) 코드가 있는 경우에 발생합니다. 문제가 INF 일치 실패로 인한 것인지 확인하려면 setupapi.dev.log 파일을 참조하십시오. 문제가 불일치로 인한 것임을 나타내는 또 다른 지표는 Windows 장치 관리자의 오류 코드 10입니다.
이 문제를 해결하려면 다음을 확인하십시오.
- The _CID value must be PNP0C50.
- The I²C controller and device characteristics in the BIOS must be accurate.
- The HID descriptor address (for the device) in the BIOS must be accurate.
- The GPIO Interrupt must be correctly identified and marked as Exclusive, Level, ActiveLow.
자세한 내용은 HID I2C 프로토콜 사양의 섹션 13을 참조하십시오.
Invalid report descriptor
호스트가 장치에서 올바른 보고서 설명자를 검색하지 못한 경우 다음 사항에 해당하는지 확인하십시오.
보고서 설명자가 검색되기 전에 열거 시퀀스 실행이 완료되어야 합니다.
HID 설명자의 바이트 오프셋 4와 6은 유효해야 합니다. (길이에 특히 주의하십시오.)
장치에서 올바른 보고서 설명자가 검색된 것이 확인되었지만 여전히 관련 문제가 있는 것으로 보이면 다음 사항에 해당하는지 확인하십시오.
wReportDescLength 필드가 정확합니다.
HID 보고서의 형식이 올바르게 지정되었습니다. (이를 확인하려면 USB와 같은 대체 버스를 테스트하십시오.)