SerCx2 PIO-Transmit 트랜잭션
SerCx2를 사용하려면 모든 직렬 컨트롤러 드라이버가 프로그래밍된 I/O(PIO)를 사용하는 전송 트랜잭션에 대한 지원을 구현해야 합니다. PIO 전송 트랜잭션을 시작하기 위해 SerCx2는 드라이버의 EvtSerCx2PioTransmitWriteBuffer 이벤트 콜백 함수를 호출하고 쓰기 버퍼를 매개 변수로 제공합니다.
이 호출 중에 EvtSerCx2PioTransmitWriteBuffer 함수는 쓰기 버퍼에서 직렬 컨트롤러 하드웨어의 전송 FIFO로 데이터를 전송합니다. 이 데이터 전송은 쓰기 버퍼가 비어 있거나 전송 FIFO가 더 많은 데이터를 즉시 수락할 수 없을 때까지 계속됩니다. 전송이 종료되면 함수는 쓰기 버퍼에서 FIFO로 성공적으로 전송된 바이트 수를 반환합니다.
PIO 전송 개체 만들기
SerCx2가 직렬 컨트롤러 드라이버의 EvtSerCx2PioTransmitXxx** 함수를 호출하려면 먼저 드라이버가 SerCx2PioTransmitCreate 메서드를 호출하여 이러한 함수를 SerCx2에 등록해야 합니다. 이 메서드는 입력 매개 변수로 드라이버의 EvtSerCx2PioTransmitXxx** 함수에 대한 포인터를 포함하는 SERCX2_PIO_TRANSMIT_CONFIG 구조체에 대한 포인터를 허용합니다.
드라이버는 다음 세 가지 함수를 모두 구현해야 합니다.
- EvtSerCx2PioTransmitWriteBuffer
- EvtSerCx2PioTransmitEnableReadyNotification
- EvtSerCx2PioTransmitCancelReadyNotification
옵션으로 드라이버는 다음 함수 중 하나 또는 둘 다를 구현할 수 있습니다.
옵션으로 드라이버는 다음 세 가지 함수를 구현할 수 있습니다.
드라이버가 앞의 목록에서 함수를 구현하는 경우 세 가지 모두를 구현해야 합니다.
SerCx2PioTransmitCreate 메서드는 PIO 전송 개체를 만들고 호출 드라이버에 이 개체에 SERCX2PIOTRANSMIT 핸들을 제공합니다. 드라이버의 EvtSerCx2PioTransmitXxx** 함수는 모두 이 핸들을 첫 번째 매개 변수로 사용합니다. 다음 SerCx2 메서드는 이 핸들을 첫 번째 매개 변수로 사용합니다.
- SerCx2PioTransmitReady
- SerCx2PioTransmitInitializeTransactionComplete
- SerCx2PioTransmitCleanupTransactionComplete
- SerCx2PioTransmitDrainFifoComplete
- SerCx2PioTransmitPurgeFifoComplete
하드웨어 초기화 및 클린
일부 직렬 컨트롤러 드라이버는 PIO 전송 트랜잭션을 시작할 때 직렬 컨트롤러 하드웨어를 초기화하거나 트랜잭션이 끝날 때 직렬 컨트롤러의 하드웨어 상태를 클린 수 있습니다.
드라이버가 EvtSerCx2PioTransmitInitializeTransaction 이벤트 콜백 함수를 구현하는 경우 SerCx2는 이 함수를 호출하여 트랜잭션을 시작하는 EvtSerCx2PioTransmitWriteBuffer 호출 전에 직렬 컨트롤러를 초기화합니다. 구현된 경우 EvtSerCx2PioTransmitInitializeTransaction 함수는 SerCx2PioTransmitInitializeTransactionComplete 메서드를 호출하여 드라이버가 직렬 컨트롤러 초기화를 완료할 때 SerCx2에 알려야 합니다.
드라이버가 EvtSerCx2PioTransmitCleanupTransaction 이벤트 콜백 함수를 구현하는 경우 SerCx2는 트랜잭션에서 마지막 EvtSerCx2PioTransmitWriteBuffer 호출 후 하드웨어 상태를 클린 위해 이 함수를 호출합니다. 구현된 경우 EvtSerCx2PioTransmitInitializeTransaction 함수는 SerCx2PioTransmitCleanupTransactionComplete 메서드를 호출하여 드라이버가 직렬 컨트롤러 정리를 완료할 때 SerCx2에 알려야 합니다.
전송 FIFO 드레이닝 및 제거
드라이버가 전송 FIFO가 비워질 때를 감지할 수 있는 경우 직렬 컨트롤러 드라이버는 EvtSerCx2PioTransmitDrainFifo 이벤트 콜백 함수를 구현해야 합니다. 구현된 경우 SerCx2는 PIO 전송 트랜잭션의 마지막 데이터 바이트가 전송 FIFO에 기록된 후 이 함수를 호출합니다. 이 호출 중에 EvtSerCx2PioTransmitDrainFifo 함수는 일반적으로 전송 FIFO가 비워질 때 인터럽트를 트리거한 다음 기다리지 않고 반환할 수 있도록 합니다. FIFO가 비워지면 드라이버는 SerCx2PioTransmitDrainFifoComplete 메서드를 호출하여 SerCx2에 알립니다. 이 알림을 받은 후에만 SerCx2는 PIO 전송 트랜잭션과 연결된 보류 중인 쓰기(IRP_MJ_WRITE) 요청을 완료합니다.
직렬 컨트롤러 드라이버가 EvtSerCx2PioTransmitDrainFifo 함수를 구현하지 않는 경우 SerCx2는 전송 FIFO가 비워진 것을 먼저 확인하지 않고 보류 중인 쓰기 요청을 완료해야 합니다. FIFO에 기록된 데이터가 상당한 지연 없이 전송된다는 보장은 없습니다. 쓰기 요청이 완료된 후 FIFO에 남아 있는 모든 데이터는 전송되기 전에 손실될 수 있습니다. 성공적으로 완료된 쓰기 요청에서 이러한 예기치 않은 데이터 손실은 요청을 보낸 주변 장치 드라이버에 대한 안정성 문제를 일으킬 수 있습니다.
EvtSerCx2PioTransmitDrainFifo 함수를 구현하는 드라이버는 EvtSerCx2PioTransmitCancelDrainFifo 및 EvtSerCx2PioTransmitPurgeFifo 이벤트 콜백 함수도 구현해야 합니다.
EvtSerCx2PioTransmitCancelDrainFifo 함수를 사용하면 SerCx2가 완료되기 전에 진행 중인 FIFO 드레이닝 작업을 취소할 수 있습니다. 쓰기 요청 시간이 초과되거나 취소된 경우 SerCx2에서 이 작업을 취소할 수 있습니다. EvtSerCx2PioTransmitCancelDrainFifo 함수가 FIFO 드레이닝 작업을 성공적으로 취소하면 이 함수는 TRUE를 반환합니다. TRUE의 반환 값은 직렬 컨트롤러 드라이버가 호출되지 않았으며 SerCx2PioTransmitDrainFifoComplete를 호출하지 않도록 보장합니다. FALSE의 반환 값은 EvtSerCx2PioTransmitDrainFifo 함수가 SerCx2PioTransmitDrainFifoComplete를 호출했거나 곧 호출할 것임을 나타냅니다.
PIO 전송 트랜잭션과 연결된 쓰기 요청이 취소되거나 완료되기 전에 시간이 초과되면 SerCx2는 EvtSerCx2PioTransmitPurgeFifo 함수를 호출하여 구현된 경우 전송 FIFO로 남아 있을 수 있는 전송되지 않은 데이터를 삭제합니다. SerCx2는 이 함수에서 가져오는 정보를 사용하여 주변 장치 드라이버에 쓰기 요청에 의해 주변 디바이스로 성공적으로 전송된 데이터의 바이트 수를 정확하게 알려줍니다.
준비 알림
전송 FIFO가 더 많은 데이터를 즉시 수락할 수 없기 때문에 EvtSerCx2PioTransmitWriteBuffer 호출이 종료되면 SerCx2는 나중에 FIFO가 더 많은 데이터를 수락할 준비가 될 때까지 PIO 수신 트랜잭션을 완료할 때까지 기다려야 합니다. 이 경우 SerCx2는 EvtSerCx2PioTransmitEnableReadyNotification 이벤트 콜백 함수를 호출하여 직렬 컨트롤러 드라이버가 준비 알림을 보낼 수 있도록 합니다. 이 알림을 사용하도록 설정하면 직렬 컨트롤러 드라이버는 SerCx2PioTransmitReady 메서드를 호출하여 드라이버가 전송 FIFO가 더 많은 데이터를 수락할 준비가 되었음을 감지하면 SerCx2에 알립니다. 이 알림에 대한 응답으로 SerCx2는 EvtSerCx2PioTransmitWriteBuffer 함수를 호출하여 FIFO에 더 많은 데이터를 씁니다.
쓰기 요청 시간이 초과되거나 취소될 때 준비 알림이 활성화되면 SerCx2는 EvtSerCx2PioTransmitCancelReadyNotification 이벤트 콜백 함수를 호출하여 보류 중인 알림을 취소합니다. 이 함수가 보류 중인 알림을 성공적으로 취소하면 TRUE가 반환됩니다. TRUE의 반환 값은 직렬 컨트롤러 드라이버가 SerCx2PioTransmitReady를 호출하지 않도록 보장합니다. FALSE의 반환 값은 EvtSerCx2PioTransmitDrainFifo 함수가 SerCx2PioTransmitReady를 호출했거나 호출했음을 나타냅니다.