다음을 통해 공유


SerCx2 System-DMA-Receive 트랜잭션

일부 직렬 컨트롤러 드라이버는 시스템 DMA 컨트롤러를 사용하는 수신 트랜잭션에 대한 지원을 구현합니다. 이러한 지원은 선택 사항이지만 긴 데이터 전송에 프로그래밍된 I/O(I/O)를 사용해야 하는 기본 프로세서를 완화하여 성능을 향상시킬 수 있습니다. SerCx2는 시스템 DMA 컨트롤러를 설정하고 직렬 컨트롤러 드라이버를 대신하여 필요한 DMA 전송을 시작하여 시스템 DMA 수신 트랜잭션을 수행합니다.

직렬 컨트롤러 드라이버가 시스템 DMA 수신 개체를 만들 때 드라이버는 SerCx2가 시스템 DMA 수신 트랜잭션에 대한 시스템 DMA 어댑터를 설정하는 데 사용할 매개 변수를 제공합니다.

시스템 DMA 수신 트랜잭션이 시작되기 전에 직렬 컨트롤러 드라이버에는 트랜잭션에 필요할 수 있는 직렬 컨트롤러 하드웨어 또는 DMA 어댑터의 특수 설정을 수행할 수 있는 옵션이 있습니다. 트랜잭션이 완료된 후 드라이버는 필요한 경우 필요할 수 있는 직렬 컨트롤러 하드웨어 상태의 클린 수행할 수 있습니다.

system-DMA-receive 개체 만들기

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

옵션으로 드라이버는 다음 함수를 모두 구현할 수 있습니다.

옵션으로 드라이버는 다음 두 함수를 구현할 수 있습니다.

앞의 목록에서 두 함수 중 하나를 구현하는 드라이버는 둘 다 구현해야 합니다.

SerCx2SystemDmaReceiveCreate 메서드는 시스템 DMA 수신 개체를 만들고 호출 드라이버에 이 개체에 대한 SERCX2SYSTEMDMARECEIVE 핸들을 제공합니다. 드라이버의 EvtSerCx2SystemDmaReceiveXxx** 함수는 모두 이 핸들을 첫 번째 매개 변수로 사용합니다. 다음 SerCx2 메서드는 이 핸들을 첫 번째 매개 변수로 사용합니다.

하드웨어 초기화 및 클린

일부 직렬 컨트롤러 드라이버는 시스템 DMA 수신 트랜잭션을 시작할 때 직렬 컨트롤러 하드웨어를 초기화하거나 트랜잭션이 끝날 때 직렬 컨트롤러의 하드웨어 상태를 클린 수 있습니다.

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

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

시스템 DMA 수신 트랜잭션을 시작할 때 시스템 DMA 컨트롤러의 특수 구성을 수행해야 하는 직렬 컨트롤러 드라이버는 EvtSerCx2SystemDmaReceiveConfigureDmaChannel 이벤트 콜백 함수를 구현해야 합니다. 이 함수는 SerCx2SystemDmaReceiveGetDmaEnabler 메서드를 호출하여 트랜잭션에 사용되는 시스템 DMA 어댑터에 대한 DMA 인에이블러를 가져올 수 있습니다. SerCx2는 트랜잭션에서 첫 번째 DMA 전송을 시작하기 전에 이 함수를 호출합니다. DMA 사용 설정에 대한 자세한 내용은 DMA 트랜잭션 사용을 참조하세요.

새 데이터 알림

옵션으로 직렬 컨트롤러 드라이버는 EvtSerCx2SystemDmaReceiveEnableNewDataNotification 이벤트 콜백 함수를 구현할 수 있습니다. 구현된 경우 SerCx2는 이 함수를 사용하여 시스템 DMA 수신 트랜잭션으로 처리되는 읽기 요청을 처리하는 동안 간격 제한 시간을 효율적으로 관리합니다.

직렬 컨트롤러에서 받은 두 개의 연속 바이트 사이의 간격이 클라이언트에서 지정한 최대 시간을 초과하는 경우 간격 제한 시간이 발생합니다. 주변 장치 드라이버가 SerCx2에 읽기 요청을 보낸 후에는 직렬로 연결된 주변 장치에서 하나 이상의 데이터를 수신할 때까지 간격 제한 시간이 발생할 수 없습니다. 읽기 요청이 도착하고 주변 장치에서 데이터의 첫 번째 바이트를 수신하는 시간 사이의 시간은 첫 번째 바이트가 수신된 후 읽기 요청에 대한 나머지 데이터를 수신하는 데 필요한 시간보다 훨씬 길 수 있습니다. 자세한 내용은 SERIAL_TIMEOUTS.

SerCx2는 구현된 경우 EvtSerCx2SystemDmaReceiveEnableNewDataNotification 함수를 호출하여 새 데이터 알림을 사용하도록 설정합니다. 이 알림을 사용하도록 설정하고 직렬 컨트롤러가 주변 장치에서 하나 이상의 새 데이터를 받거나 수신 FIFO에 데이터가 이미 있는 경우 직렬 컨트롤러 드라이버는 SerCx2SystemDmaReceiveNewDataNotification 메서드를 호출하여 SerCx2에 알려야 합니다.

가능한 간격 제한 시간을 감지하기 위해 SerCx2는 시스템 DMA 어댑터의 ReadDmaCounter 루틴을 주기적으로 호출하여 이전 간격 동안 데이터가 수신되었는지 여부를 검사. SerCx2에서 데이터의 첫 번째 바이트 수신을 검색하는 방법은 직렬 컨트롤러 드라이버가 EvtSerCx2SystemDmaReceiveEnableNewDataNotification 함수를 구현하는지 여부에 따라 달라집니다. 이 함수가 구현되면 SerCx2는 함수를 호출하여 새 데이터 알림을 사용하도록 설정하고, 데이터의 첫 번째 바이트가 수신되면 드라이버에 의해 알림을 받습니다. 그렇지 않으면 SerCx2는 주기적으로 ReadDmaCounter 를 호출하여 첫 번째 바이트의 수신을 감지하고 이러한 호출을 위해 프로세서를 주기적으로 절전 모드 해제해야 할 수 있습니다. 따라서 EvtSerCx2SystemDmaReceiveEnableNewDataNotification 함수를 구현하는 드라이버는 프로세서의 절전 모드 해제를 자주 요구하지 않음으로써 전력 소비를 줄일 수 있습니다.

참고 SerCx2는 시스템 DMA 어댑터의 ReadDmaCounter 루틴을 사용하여 시스템 DMA 수신 트랜잭션 및 시스템 DMA 전송 트랜잭션 중 시간 초과를 모니터링합니다. HAL(하드웨어 추상화 계층)은 직렬 컨트롤러와 데이터를 전송하는 데 사용되는 시스템 DMA 컨트롤러에 대한 완전한 기능의 ReadDmaCounter 루틴을 구현해야 합니다.

시스템 DMA 수신 트랜잭션에 대한 새 데이터 알림을 지원하는 직렬 컨트롤러 드라이버는 SerCx2가 활성화된 새 데이터 알림을 취소할 수 있도록 EvtSerCx2SystemDmaReceiveCancelNewDataNotification 이벤트 콜백 함수를 구현해야 합니다. 보류 중인 읽기 요청이 취소되거나 총 시간 초과가 발생할 때 새 데이터 알림을 사용하는 경우 SerCx2는 EvtSerCx2SystemDmaReceiveCancelNewDataNotification 함수를 호출하여 알림을 취소합니다. 이 함수가 보류 중인 알림을 성공적으로 취소하면 TRUE가 반환됩니다. TRUE의 반환 값은 직렬 컨트롤러 드라이버가 SerCx2SystemDmaReceiveNewDataNotification을 호출하지 않도록 보장합니다. FALSE의 반환 값은 드라이버가 SerCx2SystemDmaReceiveNewDataNotification을 호출했거나 곧 호출할 것임을 나타냅니다. 총 시간 제한에 대한 자세한 내용은 SERIAL_TIMEOUTS 참조하세요.