SPB 주변 장치 드라이버 개요

SPB 주변 장치 드라이버는 간단한 SPB(주변 장치 버스)에 연결된 주변 디바이스를 제어합니다. 이 디바이스의 하드웨어 레지스터는 SPB를 통해서만 사용할 수 있습니다. 디바이스에서 읽거나 디바이스에 쓰려면 드라이버가 SPB 컨트롤러에 I/O 요청을 보내야 합니다. 이 컨트롤러만 SPB를 통해 디바이스 간에 데이터 전송을 시작할 수 있습니다.

Windows 8부터 Windows는 간단한 SPB(주변 장치 버스)에서 주변 장치에 대한 드라이버 지원을 제공합니다. I2C 및 SPI와 같은 SPB는 가속도계, GPS 장치 및 배터리 수준 모니터와 같은 저속 센서 장치에 연결하는 데 널리 사용됩니다. 이 개요에서는 SPB 주변 장치 드라이버가 다른 시스템 구성 요소와 협력하여 SPB 연결 주변 디바이스를 제어하는 방법을 설명합니다.

SPB 주변 장치 드라이버는 UMDF(사용자 모드 드라이버 프레임워크) 또는 KMDF(커널 모드 드라이버 프레임워크)를 사용하도록 빌드할 수 있습니다. UMDF 드라이버 개발에 대한 자세한 내용은 UMDF 시작(Getting Started with UMDF)을 참조하세요. KMDF 드라이버 개발에 대한 자세한 내용은 커널 모드 드라이버 프레임워크 시작을 참조 하세요.

디바이스 구성 정보

SPB에 연결된 주변 디바이스의 하드웨어 레지스터는 메모리 매핑되지 않습니다. SPB 컨트롤러를 통해서만 디바이스에 액세스할 수 있으며 SPB를 통해 디바이스 간에 데이터를 직렬로 전송합니다. I/O 작업을 수행하기 위해 SPB 주변 장치 드라이버는 디바이스에 I/O 요청을 보내고 SPB 컨트롤러는 이러한 요청을 완료하는 데 필요한 데이터 전송을 수행합니다. SPB의 주변 디바이스로 보낼 수 있는 I/O 요청에 대한 자세한 내용은 SPB I/O 요청 인터페이스 사용을 참조 하세요.

다음 다이어그램에서는 SPB(이 경우 I2C 버스)가 두 개의 주변 장치를 System on a Chip(SoC) 모듈에 연결하는 하드웨어 구성 예제를 보여 줍니다. 주변 장치는 SoC 모듈 외부에 있으며 모듈의 핀 4개에 연결합니다. SoC 모듈에는 주 프로세서(표시되지 않음)와 I2C컨트롤러 및 GPIO(범용 I/O ) 컨트롤러가 포함되어 있습니다. 프로세서는 I2C 컨트롤러를 사용하여 두 주변 장치와 데이터를 직렬로 전송합니다. 이러한 디바이스의 인터럽트 요청 줄은 인터럽트 입력으로 구성된 두 개의 GPIO 핀에 연결됩니다. 디바이스가 인터럽트 요청에 신호를 보낼 때 GPIO 컨트롤러는 인터럽트를 프로세서에 릴레이합니다.

spb 주변 디바이스에 대한 연결입니다.

이 예제의 GPIO 컨트롤러와 I2C 컨트롤러는 SoC 모듈에 통합되므로 해당 하드웨어 레지스터는 메모리 매핑되며 프로세서에서 직접 액세스할 수 있습니다. 그러나 프로세서는 I2C 컨트롤러를 통해 간접적으로만 두 주변 장치의 하드웨어 레지스터에 액세스할 수 있습니다.

SPB는 PnP(플러그 앤 플레이) 버스가 아니므로 버스에 연결된 새 디바이스를 자동으로 검색하고 구성하는 데 사용할 수 없습니다. SPB 연결 디바이스의 버스 및 인터럽트 연결은 자주 영구적입니다. 슬롯에서 디바이스를 분리할 수 있더라도 이 슬롯은 일반적으로 디바이스 전용입니다. 또한 SPB는 버스의 주변 장치에서 버스 컨트롤러로 인터럽트 요청을 릴레이하기 위한 대역 내 하드웨어 경로를 제공하지 않습니다. 대신 인터럽트용 하드웨어 경로는 버스 컨트롤러와 별개입니다.

하드웨어 플랫폼 공급업체는 SPB에 연결된 주변 디바이스에 대한 구성 정보를 플랫폼의 ACPI 펌웨어에 저장합니다. 시스템 시작 중에 ACPI 드라이버는 PnP 관리자용 버스에서 디바이스를 열거합니다 . 열거된 각 디바이스에 대해 ACPI는 디바이스의 버스 및 인터럽트 연결에 대한 정보를 제공합니다. PnP 관리자는 이 정보를 리소스 허브라는 데이터 저장소에 저장합니다.

디바이스가 시작되면 PnP 관리자는 디바이스의 드라이버에 리소스 허브가 디바이스에 저장하는 구성 정보를 캡슐화하는 하드웨어 리소스 집합을 제공합니다. 이러한 리소스에는 연결 ID 및 인터럽트 번호가 포함됩니다. 연결 ID는 SPB 컨트롤러, 버스 주소 및 버스 시계 빈도와 같은 버스 연결 정보를 캡슐화합니다. I/O 요청을 디바이스로 보내려면 먼저 드라이버가 연결 ID를 사용하여 디바이스에 대한 논리적 연결을 열어야 합니다. 인터럽트 번호는 드라이버가 ISR(인터럽트 서비스 루틴)을 연결할 수 있는 Windows 인터럽트 리소스입니다. 연결 ID와 인터럽트 번호는 물리적 버스에 대한 플랫폼별 정보를 숨기고 연결을 중단하는 상위 수준 추상화이므로 드라이버를 하드웨어 플랫폼에서 다른 플랫폼으로 쉽게 이식할 수 있습니다.

소프트웨어 및 하드웨어 계층

다음 블록 다이어그램은 SPB의 주변 디바이스를 디바이스를 사용하는 애플리케이션 프로그램에 연결하는 소프트웨어 및 하드웨어 계층을 보여 줍니다. 이 예제의 SPB 주변 장치 드라이버는 UMDF 드라이버입니다. 다이어그램 맨 아래에 있는 주변 장치는 센서 디바이스(예: 가속도계)입니다. 위의 다이어그램에서와 같이 주변 장치는 I2C 버스에 연결되고 GPIO 컨트롤러의 핀을 통해 인터럽트 요청을 신호합니다.

spb 연결 센서 디바이스에 대한 소프트웨어 및 하드웨어 계층

회색으로 표시된 세 블록은 시스템 제공 모듈입니다. Windows 7 부터 센서 클래스 확장 은 UMDF에 대한 센서별 확장으로 사용할 수 있습니다. Windows 8 부터 SPB 프레임워크 확장 (SpbCx) 및 GPIO 프레임워크 확장 (GpioClx)은 각각 SPB 컨트롤러 및 GPIO 컨트롤러와 관련된 함수를 수행하는 KMDF에 대한 확장으로 사용할 수 있습니다.

위의 다이어그램 맨 위에서 애플리케이션은 센서 API 또는 위치 API메서드를 호출하여 센서 디바이스와 통신합니다. 이러한 호출을 통해 애플리케이션은 디바이스에 I/O 요청을 보내고 디바이스에서 이벤트 알림을 받을 수 있습니다. 이러한 API에 대한 자세한 내용은 Windows의 센서 및 위치 플랫폼 소개를 참조 하세요.

애플리케이션이 SPB 주변 장치 드라이버와의 통신이 필요한 메서드를 호출하는 경우 센서 API 또는 위치 API는 I/O 요청을 만들고 SPB 주변 장치 드라이버로 보냅니다. 센서 클래스 확장 모듈은 드라이버가 이러한 I/O 요청을 처리하는 데 도움을 줍니다. 드라이버가 새 I/O 요청을 받으면 드라이버는 즉시 센서 클래스 확장에 요청을 전달하는데, 이 확장은 드라이버가 요청을 처리할 준비가 될 때까지 큐에 대기합니다. 애플리케이션의 I/O 요청에서 주변 디바이스 간에 데이터를 전송해야 하는 경우 SPB 주변 장치 드라이버는 이 전송에 대한 I/O 요청을 만들고 I2C 컨트롤러에 요청을 보냅니다. 이러한 요청은 SpbCx 및 I2C 컨트롤러 드라이버가 공동으로 처리합니다.

SpbCx는 이 예제의 I2 C 컨트롤러와 같이 SPB 컨트롤러에 대한 I/O 요청의 큐를 관리하는 시스템 제공 구성 요소입니다. I 2C 컨트롤러 드라이버, 컨트롤러에 대 한 하드웨어 공급 업체에 의해 제공 되는, I2C 컨트롤러에서 모든 하드웨어 관련 작업을 관리 합니다. 예를 들어 컨트롤러 드라이버는 컨트롤러의 메모리 매핑 하드웨어 레지스터에 액세스하여 I2C 버스를 통해 주변 디바이스와 데이터 전송을 시작합니다.

주변 장치는 SPB 주변 장치 드라이버 또는 사용자 모드 애플리케이션의 주의가 필요한 하드웨어 이벤트가 발생할 때 인터럽트 요청을 신호합니다. 주변 디바이스의 인터럽트 라인은 인터럽트 요청을 받도록 구성된 GPIO 핀에 연결됩니다. 디바이스가 GPIO 핀에 인터럽트 신호를 보낼 때 GPIO 컨트롤러는 프로세서에 인터럽트를 신호합니다. 이 인터럽트에서 커널의 인터럽트 트랩 처리기는 GpioClx의 ISR을 호출합니다. 이 ISR은 GPIO 컨트롤러 드라이버를 쿼리한 다음 GPIO 컨트롤러의 메모리 매핑된 하드웨어 레지스터에 액세스하여 중단된 GPIO 핀을 식별합니다. 인터럽트 중지를 중지하기 위해 GPIO 컨트롤러 드라이버는 GPIO 핀에서 인터럽트 요청을 지웁니다(인터럽트에서 에지 트리거된 경우)하거나 마스크(레벨 트리거된 경우). 트랩 처리기가 반환될 때 프로세서가 동일한 인터럽트(interrupt)를 다시 수행하지 않도록 인터럽트는 무음이어야 합니다. 수준 트리거 인터럽트인 경우 SPB 주변 장치 드라이버의 ISR은 GPIO 핀을 마스크 해제하기 전에 주변 디바이스의 하드웨어 레지스터에 액세스하여 인터럽트를 지워야 합니다.

커널의 인터럽트 트랩 처리기가 반환되기 전에 SPB 주변 장치 드라이버의 ISR이 IRQL = PASSIVE_LEVEL 실행되도록 예약합니다. Windows 8부터 UMDF 드라이버는 ISR을 드라이버가 추상 Windows 인터럽트 리소스로 수신하는 인터럽트에 연결할 수 있습니다. 자세한 내용은 인터럽트 처리를 참조 하세요. 호출할 ISR을 확인하기 위해 운영 체제는 중단 GPIO 핀에 할당된 가상 인터럽트(Virtual Interrupt)를 조회하고 인터럽트와 연결된 ISR을 찾습니다. 이 가상 인터럽트는 이전 다이어그램에서 보조 인터럽트로 레이블이 지정됩니다. 반면 GPIO 컨트롤러의 하드웨어 인터럽트는 기본 인터럽트로 레이블이 지정됩니다.

SPB 주변 장치 드라이버의 ISR은 수동 수준에서 실행되므로 ISR은 동기 I/O 요청을 사용하여 주변 디바이스의 하드웨어 레지스터에 액세스할 수 있습니다. ISR은 이러한 요청이 완료될 때까지 차단할 수 있습니다. 상대적으로 높은 우선 순위로 실행되는 ISR은 가능한 한 빨리 반환하고 우선 순위가 낮은 작업자 루틴에 대한 인터럽트를 위해 모든 백그라운드 처리를 연기해야 합니다.

보조 인터럽트 응답에서 SPB 주변 장치 드라이버는 센서 클래스 확장에 이벤트를 게시하며, 센서 API 또는 위치 API를 통해 이벤트의 사용자 모드 애플리케이션을 알 수 있습니다.