SerCx2 System-DMA-Transmit 트랜잭션
일부 직렬 컨트롤러 드라이버는 시스템 DMA 컨트롤러를 사용하는 전송 트랜잭션에 대한 지원을 구현합니다. 이러한 지원은 선택 사항이지만 긴 데이터 전송에 프로그래밍된 I/O(I/O)를 사용해야 하는 기본 프로세서를 완화하여 성능을 향상시킬 수 있습니다. SerCx2는 시스템 DMA 컨트롤러를 설정하고 직렬 컨트롤러 드라이버를 대신하여 필요한 DMA 전송을 시작하여 시스템 DMA 전송 트랜잭션을 수행합니다.
직렬 컨트롤러 드라이버가 시스템 DMA 전송 개체를 만들 때 드라이버는 SerCx2가 시스템 DMA 전송 트랜잭션에 대한 시스템 DMA 어댑터를 설정하는 데 사용할 매개 변수를 제공합니다.
트랜잭션을 시작하기 전에 직렬 컨트롤러 드라이버에는 트랜잭션에 필요할 수 있는 직렬 컨트롤러 하드웨어 또는 DMA 어댑터의 특수 설정을 수행할 수 있는 옵션이 있습니다. 트랜잭션이 완료되면 드라이버는 전송 FIFO를 드레이닝하고 필요한 경우 직렬 컨트롤러 하드웨어 상태를 클린 옵션이 있습니다.
system-DMA-transmit 개체 만들기
SerCx2가 직렬 컨트롤러 드라이버의 EvtSerCx2SystemDmaTransmitXxx** 함수를 호출하려면 먼저 드라이버가 SerCx2SystemDmaTransmitCreate 메서드를 호출하여 이러한 함수를 SerCx2에 등록해야 합니다. 이 메서드는 입력 매개 변수로 드라이버의 EvtSerCx2SystemDmaTransmit Xxx** 함수에 대한포인터를 포함하는 SERCX2_SYSTEM_DMA_TRANSMIT_CONFIG 구조체에 대한 포인터를 허용합니다.
옵션으로 드라이버는 다음 함수 중 어느 것 또는 전부를 구현할 수 있습니다.
- EvtSerCx2SystemDmaTransmitInitializeTransaction
- EvtSerCx2SystemDmaTransmitCleanupTransaction
- EvtSerCx2SystemDmaTransmitConfigureDmaChannel
옵션으로 드라이버는 다음 함수를 구현할 수 있습니다.
- EvtSerCx2SystemDmaTransmitDrainFifo
- EvtSerCx2SystemDmaTransmitCancelDrainFifo
- EvtSerCx2SystemDmaTransmitPurgeFifo
앞의 목록에서 함수를 구현하는 드라이버는 세 가지 모두를 구현해야 합니다.
SerCx2SystemDmaTransmitCreate 메서드는 시스템 DMA 전송 개체를 만들고 호출 드라이버에 이 개체에 SERCX2SYSTEMDMATRANSMIT 핸들을 제공합니다. 드라이버의 EvtSerCx2SystemDmaTransmitXxx** 함수는 모두 이 핸들을 첫 번째 매개 변수로 사용합니다. 다음 SerCx2 메서드는 이 핸들을 첫 번째 매개 변수로 사용합니다.
- SerCx2SystemDmaTransmitDrainFifoComplete
- SerCx2SystemDmaTransmitPurgeFifoComplete
- SerCx2SystemDmaTransmitInitializeTransactionComplete
- SerCx2SystemDmaTransmitCleanupTransactionComplete
- SerCx2SystemDmaTransmitGetDmaEnabler
하드웨어 초기화 및 클린
일부 직렬 컨트롤러 드라이버는 시스템 DMA 전송 트랜잭션을 시작할 때 직렬 컨트롤러 하드웨어를 초기화하거나 트랜잭션이 끝날 때 직렬 컨트롤러의 하드웨어 상태를 클린 수 있습니다.
드라이버가 EvtSerCx2SystemDmaTransmitInitializeTransaction 이벤트 콜백 함수를 구현하는 경우 SerCx2는 트랜잭션에서 첫 번째 DMA 전송을 시작하기 전에 이 함수를 호출하여 직렬 컨트롤러를 초기화합니다. 구현된 경우 EvtSerCx2SystemDmaTransmitInitializeTransaction 함수는 SerCx2SystemDmaTransmitInitializeTransactionComplete 메서드를 호출하여 드라이버가 직렬 컨트롤러 초기화를 완료할 때 SerCx2에 알려야 합니다.
드라이버가 EvtSerCx2SystemDmaTransmitCleanupTransaction 이벤트 콜백 함수를 구현하는 경우 SerCx2는 트랜잭션에서 최종 DMA 전송이 끝난 후 하드웨어 상태를 클린 위해 이 함수를 호출합니다. 구현된 경우 EvtSerCx2SystemDmaTransmitInitializeTransaction 함수는 SerCx2SystemDmaTransmitCleanupTransactionComplete 메서드를 호출하여 드라이버가 직렬 컨트롤러 정리를 완료할 때 SerCx2에 알려야 합니다.
시스템 DMA 전송 트랜잭션이 시작될 때 시스템 DMA 컨트롤러의 특수 구성을 수행해야 하는 직렬 컨트롤러 드라이버는 EvtSerCx2SystemDmaTransmitConfigureDmaChannel 이벤트 콜백 함수를 구현해야 합니다. 이 함수는 SerCx2SystemDmaTransmitGetDmaEnabler 메서드를 호출하여 트랜잭션에 사용되는 시스템 DMA 어댑터에 대한 DMA 사용자를 가져올 수 있습니다. SerCx2는 트랜잭션에서 첫 번째 DMA 전송을 시작하기 전에 이 함수를 호출합니다. DMA 사용자에 대한 자세한 내용은 DMA 트랜잭션 사용을 참조하세요.
전송 FIFO 드레이닝 및 제거
시스템 DMA 전송 트랜잭션을 지원하는 직렬 컨트롤러 드라이버는 드라이버가 전송 FIFO가 비워질 때를 감지할 수 있는 경우 EvtSerCx2SystemDmaTransmitDrainFifo 이벤트 콜백 함수를 구현해야 합니다. 구현된 경우 SerCx2는 시스템 DMA 전송 트랜잭션의 마지막 데이터 바이트가 전송 FIFO에 기록된 후 이 함수를 호출합니다. 이 호출 중에 EvtSerCx2SystemDmaTransmitDrainFifo 함수는 일반적으로 전송 FIFO가 비워질 때 트리거되는 인터럽트를 사용하도록 설정한 다음 인터럽트를 기다리지 않고 반환합니다. FIFO가 비워지면 드라이버는 SerCx2SystemDmaTransmitDrainFifoComplete 메서드를 호출하여 SerCx2에 알립니다. 이 알림을 받은 후에만 SerCx2는 시스템 DMA 전송 트랜잭션과 연결된 보류 중인 쓰기(IRP_MJ_WRITE) 요청을 완료합니다.
직렬 컨트롤러 드라이버가 EvtSerCx2SystemDmaTransmitDrainFifo 함수를 구현하지 않는 경우 SerCx2는 전송 FIFO가 비워진 것을 먼저 확인하지 않고 보류 중인 쓰기 요청을 완료해야 합니다. FIFO에 기록된 데이터가 상당한 지연 없이 전송된다는 보장은 없습니다. 쓰기 요청이 완료된 후 FIFO에 남아 있는 모든 데이터는 전송되기 전에 손실될 수 있습니다. 성공적으로 완료된 쓰기 요청에서 이러한 예기치 않은 데이터 손실은 요청을 보낸 주변 드라이버에 대한 안정성 문제를 일으킬 수 있습니다.
EvtSerCx2SystemDmaTransmitDrainFifo 함수를 구현하는 드라이버는 EvtSerCx2SystemDmaTransmitCancelDrainFifo 및 EvtSerCx2SystemDmaTransmitPurgeFifo 이벤트 콜백 함수도 구현해야 합니다.
EvtSerCx2SystemDmaTransmitCancelDrainFifo 함수를 사용하면 SerCx2가 완료되기 전에 진행 중인 FIFO 드레이닝 작업을 취소할 수 있습니다. 쓰기 요청이 취소되거나 직렬 컨트롤러가 D0 디바이스 전원 상태를 종료하여 저전력 상태로 진입하려는 경우 SerCx2에서 이 작업을 취소할 수 있습니다. EvtSerCx2SystemDmaTransmitCancelDrainFifo 함수가 FIFO 드레이닝 작업을 성공적으로 취소하면 이 함수는 TRUE를 반환합니다. TRUE의 반환 값은 EvtSerCx2SystemDmaTransmitDrainFifo 함수가 먼저 SerCx2SystemDmaTransmitDrainFifoComplete를 호출하지 않고 반환되도록 보장합니다. FALSE의 반환 값은 EvtSerCx2SystemDmaTransmitDrainFifo 함수가 를 호출했거나 SerCx2SystemDmaTransmitDrainFifoComplete를 호출했음을 나타냅니다.
시스템 DMA 전송 트랜잭션과 연결된 쓰기 요청이 취소되거나 완료되기 전에 시간이 초과되면 SerCx2는 EvtSerCx2SystemDmaTransmitPurgeFifo 함수를 호출하여 구현된 경우 전송 FIFO로 남아 있을 수 있는 미사용 데이터를 삭제합니다. FIFO가 제거되면 EvtSerCx2SystemDmaTransmitPurgeFifo 함수는 SerCx2SystemDmaTransmitPurgeFifoComplete 메서드를 호출하여 SerCx2에 알립니다. 이 알림을 받은 후에만 SerCx2는 새 I/O 트랜잭션을 시작합니다.