다음을 통해 공유


SerCx2 Custom-Transmit 트랜잭션

일부 직렬 컨트롤러 하드웨어는 직렬 컨트롤러에 데이터를 쓰기 위한 PIO 또는 시스템 DMA 이외의 데이터 전송 메커니즘을 구현할 수 있습니다. 직렬 컨트롤러 드라이버는 사용자 지정 전송 트랜잭션을 지원하여 SerCx2에서 이 데이터 전송 메커니즘을 사용할 수 있도록 할 수 있습니다.

사용자 지정 전송 트랜잭션을 시작하기 위해 SerCx2는 드라이버의 EvtSerCx2CustomTransmitTransactionStart 이벤트 콜백 함수를 호출하고 쓰기(IRP_MJ_WRITE) 요청 및 트랜잭션에 대한 쓰기 버퍼에 대한 설명을 매개 변수로 제공합니다. 이 호출에서 함수는 트랜잭션을 시작하고 를 반환합니다. 그런 다음, 드라이버는 트랜잭션을 완료하고 쓰기 요청을 완료해야 합니다.

사용자 지정 전송 개체 만들기

SerCx2가 직렬 컨트롤러 드라이버의 EvtSerCx2CustomTransmitTransactionXxx** 함수를 호출하려면 먼저 드라이버가 SerCx2CustomTransmitTransactionCreate 메서드를 호출하여 이러한 함수를 SerCx2에 등록해야 합니다. 이 메서드는 입력 매개 변수로서 드라이버의 EvtSerCx2CustomTransmitTransactionXxx** 함수에 대한 포인터를 포함하는 SERCX2_CUSTOM_TRANSMIT_TRANSACTION_CONFIG 구조체에 대한 포인터를 허용합니다.

드라이버는 다음 함수를 구현해야 합니다.

옵션으로 드라이버는 다음 함수 중 하나 또는 둘 다를 구현할 수 있습니다.

SerCx2CustomTransmitTransactionCreate 메서드는 사용자 지정 전송 개체를 만들고 호출 드라이버에 이 개체에 대한 SERCX2CUSTOMTRANSMITTRANSACTION 핸들을 제공합니다. 드라이버의 EvtSerCx2CustomTransmitTransactionXxx** 함수는 모두 이 핸들을 첫 번째 매개 변수로 사용합니다. 다음 SerCx2 메서드는 이 핸들을 첫 번째 매개 변수로 사용합니다.

하드웨어 초기화 및 클린

일부 직렬 컨트롤러 드라이버는 사용자 지정 전송 트랜잭션을 시작할 때 직렬 컨트롤러 하드웨어를 초기화하거나 트랜잭션이 끝날 때 직렬 컨트롤러의 하드웨어 상태를 클린 수 있습니다.

드라이버가 EvtSerCx2CustomTransmitTransactionInitialize 이벤트 콜백 함수를 구현하는 경우 SerCx2는 트랜잭션을 시작하기 전에 이 함수를 호출하여 직렬 컨트롤러를 초기화합니다. 구현된 경우 EvtSerCx2CustomTransmitTransactionInitialize 함수는 SerCx2CustomTransmitTransactionInitializeComplete 메서드를 호출하여 드라이버가 직렬 컨트롤러 초기화를 완료할 때 SerCx2에 알려야 합니다.

드라이버가 EvtSerCx2CustomTransmitTransactionCleanup 이벤트 콜백 함수를 구현하는 경우 SerCx2는 이 함수를 호출하여 트랜잭션이 종료된 후 하드웨어 상태를 클린. 구현된 경우 EvtSerCx2CustomTransmitTransactionInitialize 함수 는 SerCx2CustomTransmitTransactionCleanupComplete 메서드를 호출하여 드라이버가 직렬 컨트롤러 정리를 완료할 때 SerCx2에 알려야 합니다.

요청 개체에 액세스

사용자 지정 전송 트랜잭션을 시작하기 위해 SerCx2는 드라이버의 EvtSerCx2CustomTransmitTransactionStart 함수를 호출하고 연결된 쓰기 요청(WDFREQUEST 개체 핸들에 캡슐화됨)을 이 함수에 매개 변수로 전달합니다. 드라이버는 트랜잭션이 완료되면 WdfRequestComplete 와 같은 메서드를 호출하여 이 요청을 완료해야 합니다. 요청을 즉시 완료할 수 없는 한 EvtSerCx2CustomTransmitTransactionStart 함수가 반환되기 전에 드라이버는 WdfRequestMarkCancelableEx 와 같은 메서드를 호출하여 요청을 취소 가능으로 표시해야 합니다.

직렬 컨트롤러 드라이버는 쓰기 요청의 데이터 버퍼에 액세스하기 위해 WdfRequestRetrieveInputBuffer 와 같은 메서드를 사용하면 안됩니다. 대신 드라이버는 EvtSerCx2CustomTransmitTransactionStart 함수에 전달된 Mdl, OffsetLength 매개 변수 값을 사용하여 이 버퍼에 액세스해야 합니다.

사용자 지정 전송 트랜잭션 중에 드라이버는 요청 개체에 연결된 컨텍스트에서 트랜잭션에 대한 정보를 저장해야 할 수 있습니다. 이 경우 드라이버의 EvtDriverDeviceAdd 이벤트 콜백 함수는 WdfDeviceInitSetRequestAttributes 메서드를 호출하여 요청 개체에 사용할 특성을 설정할 수 있습니다. 이러한 특성에는 요청 컨텍스트에 사용할 이름 및 할당 크기가 포함됩니다. 이 호출에 지정된 요청 특성은 드라이버가 SerCx2InitializeDevice 메서드 호출에서 지정하는 요청 특성과 일치해야 합니다. 이러한 특성은 드라이버가 SerCx2InitializeDevice에 전달하는 SERCX2_CONFIG 구조체의 RequestAttributes 멤버에 지정됩니다. 자세한 내용은 SERCX2_CONFIG 참조하세요.

직렬 컨트롤러 드라이버가 사용자 지정 전송 트랜잭션을 시작할 때 수신하는 쓰기 요청의 경우 드라이버 프레임워크에서 할당한 요청 컨텍스트는 초기화되지 않습니다. 드라이버는 모범 사례로 RtlZeroMemory 루틴을 호출하여 이 요청 컨텍스트를 모든 0으로 초기화해야 합니다.