SPB-Connected 주변 장치에 대한 연결 ID

드라이버가 간단한 SPB(주변 버스 )에서 주변 디바이스에 I/O 요청을 보내려면 먼저 드라이버가 디바이스에 대한 논리적 연결을 열어야 합니다. 이 연결을 통해 드라이버는 읽기 및 쓰기 요청을 보내 디바이스와 데이터를 전송할 수 있습니다. 또한 드라이버는 디바이스에 I/O 컨트롤(IOCTL) 요청을 보내 SPB 관련 작업을 수행할 수 있습니다.

시스템 시작 시 PnP(플러그 앤 플레이) 관리자는 PnP 디바이스와 PnP가 아닌 디바이스를 모두 열거합니다. SPB에 고정된 연결이 있는 비 PnP 주변 디바이스의 경우 PnP 관리자는 하드웨어 플랫폼의 ACPI 펌웨어를 쿼리하여 디바이스에 액세스하는 방법을 설명하는 연결 매개 변수 집합을 가져옵니다. 이러한 연결 매개 변수는 디바이스가 연결된 버스에 대한 SPB 컨트롤러를 식별하고, 컨트롤러가 디바이스와 통신하는 데 필요한 버스 주소 및 버스 클록 빈도와 같은 기타 정보를 포함합니다.

PnP 관리자는 SPB 연결 주변 디바이스의 연결 매개 변수에 연결 ID라고 하는 식별자를 할당합니다. PnP 관리자는 이 ID와 연결 매개 변수를 리소스 허브라는 시스템 데이터 저장소에 함께 저장합니다. (리소스 허브는 PnP 관리자가 SPB에 연결된 주변 디바이스에 대한 구성 정보를 저장하는 내부 데이터 저장소입니다.) 연결 ID는 드라이버가 명시적으로 제공할 필요가 없도록 이러한 매개 변수를 캡슐화합니다.

SPB 연결 주변 장치용 드라이버는 드라이버가 할당한 하드웨어 리소스의 일부로 디바이스에 대한 연결 ID를 받습니다. 주변 디바이스의 드라이버가 시스템 함수를 호출하여 디바이스에 대한 연결을 열면 드라이버가 리소스 허브에서 디바이스의 연결 매개 변수를 검색하는 데 사용하는 연결 ID를 제공합니다.

드라이버 개발자는 UMDF( 사용자 모드 드라이버 프레임워크 ) 또는 KMDF( 커널 모드 드라이버 프레임워크 )를 사용하여 SPB 연결 주변 장치용 드라이버를 빌드할 수 있습니다. UMDF 드라이버는 프레임워크가 드라이버의 IPnpCallbackHardware2::OnPrepareHardware 메서드를 호출할 때 해당 리소스(연결 ID 포함)를 받습니다. KMDF 드라이버는 EvtDevicePrepareHardware 콜백 중에 하드웨어 리소스를 받습니다.

UMDF 주변 장치 드라이버가 리소스 목록에서 연결 ID를 수신할 수 있도록 하려면 드라이버를 설치하는 INF 파일에 WDF 관련 DDInstall 섹션에 다음 지시문을 포함해야 합니다.

UmdfDirectHardwareAccess = AllowDirectHardwareAccess 이 지시문에 대한 자세한 내용은 INF 파일에서 WDF 지시문 지정을 참조하세요. 이 지시문을 사용하는 INX 파일(해당 INF 파일을 빌드하는 데 사용)의 예제는 SpbAccelerometer 드라이버 샘플을 참조하세요.

드라이버가 리소스로 수신하는 연결 ID는 64비트 정수이지만, 드라이버는 이 ID를 리소스 허브에서 연결 매개 변수를 검색하는 데 사용할 수 있는 디바이스 경로 이름에 통합해야 합니다. 디바이스 경로 이름을 만들기 위해 드라이버는 Reshub.h 헤더 파일에 선언된 RESOURCE_HUB_CREATE_PATH_FROM_ID 함수를 호출합니다.

SPB 연결 주변 디바이스에 대한 논리적 연결을 열려면 UMDF 드라이버가 IWDFRemoteTarget::OpenFileByName 메서드를 호출하고 KMDF 드라이버는 WdfIoTargetOpen 메서드를 호출합니다. 두 방법 중 하나를 사용하려면 디바이스 경로 이름을 입력 매개 변수로 사용해야 합니다.

연결 ID를 사용하여 SPB 연결 주변 디바이스에 대한 논리적 연결을 여는 UMDF 및 KMDF 코드 예제는 다음 topics 참조하세요.

Kernel-Mode SPB 주변 드라이버 사용자 모드 애플리케이션용 User-Mode SPB 주변 드라이버 하드웨어 리소스용 하드웨어 리소스는 SPB에 연결된 주변 디바이스에 대한 논리적 연결을 열 수 없으며 이러한 디바이스에 직접 I/O 요청을 보낼 수 없습니다.

한 번에 하나의 드라이버만 SPB에 연결된 주변 디바이스에 대한 열린 논리 연결을 보유할 수 있습니다. 다른 드라이버가 동일한 디바이스에 대한 두 번째 연결을 열려는 시도가 실패합니다.