다음을 통해 공유


SerCx2 I/O 트랜잭션 개요

SerCx2는 하나 이상의 I/O 트랜잭션을 직렬 컨트롤러 드라이버에 발급하여 클라이언트의 읽기 또는 쓰기 요청을 처리합니다. 이 드라이버는 각 트랜잭션을 요청의 직렬 컨트롤러와 데이터 버퍼 간에 데이터를 전송하는 자체 포함 I/O 작업으로 처리합니다.

SoC(System on a Chip) 통합 회로에는 동일한 인쇄 회로 보드에 납땜된 다른 통합 회로와 고속 직렬 통신을 가능하게 하는 직렬 컨트롤러(또는 UART)가 자주 포함됩니다. 이러한 SoC의 프로세서는 프로그래밍된 I/O(PIO)를 사용하여 이러한 직렬 컨트롤러의 메모리 매핑 데이터 레지스터 간에 데이터를 직접 전송할 수 있습니다. 또한 이러한 SoC는 일반적으로 직렬 컨트롤러와 메모리 간에 데이터를 이동하는 고급 DMA 하드웨어를 제공합니다.

PIO는 짧은 데이터 전송에 충분할 수 있지만 높은 데이터 속도로 더 긴 전송에 PIO를 사용하면 프로세서에 너무 큰 부담이 됩니다. DMA는 프로세서에서 이러한 전송을 오프로드하는 데 필요합니다.

I/O 트랜잭션 유형

SerCx2는 다음과 같은 세 가지 일반적인 유형의 I/O 트랜잭션을 정의합니다.

  • Pio
  • 시스템 DMA
  • 사용자 지정

모든 직렬 컨트롤러 드라이버는 PIO를 사용하여 데이터를 전송하는 I/O 트랜잭션을 지원해야 합니다. 직렬 컨트롤러 드라이버는 직렬 컨트롤러 및 관련 하드웨어의 기능에 따라 시스템 DMA 또는 사용자 지정 데이터 전송 메커니즘을 사용하는 I/O 트랜잭션을 지원할 수도 있습니다. 드라이버는 시스템 DMA 트랜잭션 또는 사용자 지정 트랜잭션을 지원할 수 있지만 둘 다 지원할 수는 없습니다.

직렬 컨트롤러 하드웨어에서 지원하는 각 유형의 I/O 트랜잭션에 대해 직렬 컨트롤러 드라이버는 SerCx2에 지원 패키지를 등록합니다. 이 패키지는 관련 하드웨어 기능을 설명하고 SerCx2가 이 유형의 I/O 트랜잭션을 시작하고 제어하기 위해 호출하는 드라이버 구현 이벤트 콜백 함수 집합을 포함합니다.

직렬 컨트롤러가 다른 디바이스와 공유할 수 있는 시스템 DMA 컨트롤러를 사용할 수 있는 경우 직렬 컨트롤러 드라이버는 시스템 DMA 트랜잭션을 지원할 수 있습니다. 이러한 트랜잭션의 경우 SerCx2는 시스템 DMA 컨트롤러를 설정하고 DMA 전송을 시작합니다. 직렬 컨트롤러 드라이버는 시스템 DMA 트랜잭션 중에 비교적 적은 작업을 수행합니다.

직렬 컨트롤러에 데이터를 전송하기 위한 몇 가지 사용자 지정 하드웨어 메커니즘이 있는 경우 직렬 컨트롤러 드라이버는 이 메커니즘을 사용하는 사용자 지정 트랜잭션을 지원할 수 있습니다. 예를 들어 직렬 컨트롤러 하드웨어에 버스 master 기본 제공 DMA 기능이 있는 경우 직렬 컨트롤러 드라이버는 사용자 지정 트랜잭션을 지원하여 SerCx2에서 이 기능을 사용할 수 있도록 할 수 있습니다.

사용자 지정 트랜잭션은 지원할 수 있는 데이터 전송 메커니즘 유형 측면에서 유연합니다. 그러나 이러한 트랜잭션은 PIO 트랜잭션 또는 시스템 DMA 트랜잭션보다 구현하기가 더 어렵습니다. 사용자 지정 트랜잭션을 지원하려면 직렬 컨트롤러 드라이버는 일반적으로 데이터를 전송하는 데 사용되는 하드웨어를 설정하고 초기화해야 합니다. 또한 연결된 사용자 지정 수신 또는 사용자 지정 전송 트랜잭션이 완료되기 전에 보류 중인 읽기 또는 쓰기 요청이 취소된 경우 드라이버는 트랜잭션을 종료하고 요청을 완료해야 합니다.

각 I/O 트랜잭션은 비교적 간단한 작업입니다. I/O 트랜잭션은 직렬 컨트롤러에서 데이터를 읽거나 컨트롤러에 데이터를 쓰고 읽기 및 쓰기를 혼합하지 않습니다. I/O 트랜잭션은 단일 전송 모드(PIO, 시스템 DMA 또는 사용자 지정)를 사용하며 전송 모드를 혼합하지 않습니다.

SerCx2는 PIO 또는 DMA를 사용하여 읽기 또는 쓰기 요청을 충족할지 여부를 지능적으로 결정할 수 있습니다. 예를 들어 SerCx2는 직렬 컨트롤러 드라이버에 매우 짧은 읽기 또는 쓰기 요청을 PIO 트랜잭션으로 표시하도록 선택할 수 있습니다. 또는 SerCx2는 직렬 컨트롤러에 더 긴 읽기 또는 쓰기 요청을 DMA 트랜잭션으로 표시할 수 있습니다.

읽기 또는 쓰기 요청을 여러 트랜잭션으로 분리

일부 시스템 DMA 컨트롤러에는 SerCx2가 더 긴 읽기 또는 쓰기 요청을 두 개 이상의 I/O 트랜잭션으로 중단해야 하는 제한 사항이 있을 수 있습니다. 예를 들어 시스템 DMA 컨트롤러에서 메모리의 바이트 경계에서도 DMA 전송을 시작하고 종료해야 하지만 읽기 요청의 데이터 버퍼가 홀수 바이트 경계에서 시작되고 끝나는 경우 SerCx2는 PIO를 사용하여 첫 번째 및 마지막 바이트를 버퍼로 전송하고 시스템 DMA를 사용하여 첫 번째 바이트와 마지막 바이트 간에 모든 데이터를 전송할 수 있습니다. 이 예제에서 SerCx2는 다음과 같은 세 가지 I/O 트랜잭션을 표시된 순서대로 직렬 컨트롤러 드라이버에 발급합니다.

  1. 첫 번째 바이트에 대한 PIO 수신 트랜잭션입니다.
  2. 사이 바이트에 대한 시스템 DMA 수신 트랜잭션입니다.
  3. 마지막 바이트에 대한 PIO 수신 트랜잭션입니다.

마찬가지로 사용자 지정 데이터 전송 메커니즘이 메모리의 임의의 바이트 경계에서 사용자 지정 전송 트랜잭션을 시작하고 종료할 수 있지만 쓰기 요청의 버퍼 크기가 사용자 지정 전송 트랜잭션의 최대 전송 길이를 초과하는 경우 SerCx2는 쓰기 요청을 두 개 이상의 사용자 지정 전송 트랜잭션으로 분할하며, 각 트랜잭션은 최대 전송 길이를 초과하지 않습니다.

SerCx2에서 읽기 또는 쓰기 요청을 둘 이상의 I/O 트랜잭션으로 분할해야 하는 경우 직렬 컨트롤러 드라이버는 이러한 트랜잭션의 관계를 서로 및 요청과 안전하게 무시할 수 있습니다. SerCx2는 트랜잭션을 직렬화하여 데이터가 올바른 순서로 수신되거나 전송되도록 합니다.

직렬 컨트롤러 드라이버가 시스템 DMA 트랜잭션 또는 사용자 지정 트랜잭션을 지원하기 위해 콜백 함수 집합을 등록하는 경우 드라이버는 이러한 트랜잭션을 수행할 하드웨어의 기능을 설명하는 매개 변수 값을 제공합니다. 예를 들어 시스템 DMA 트랜잭션의 경우 매개 변수에는 맞춤 요구 사항과 시스템 DMA 컨트롤러가 지원하는 최소 및 최대 전송 길이가 포함됩니다. SerCx2는 이러한 매개 변수를 사용하여 읽기 또는 쓰기 요청을 PIO 트랜잭션 또는 시스템 DMA 트랜잭션으로 처리할지 여부와 요청을 둘 이상의 I/O 트랜잭션으로 분할할지 여부를 결정합니다.

그러나 직렬 컨트롤러 드라이버가 SerCx2에 제공하는 매개 변수로 적절하게 설명할 수 없는 특수 하드웨어 기능이 직렬 컨트롤러에 있을 수 있습니다. 따라서 드라이버는 읽기 또는 쓰기 요청을 하나 이상의 I/O 트랜잭션으로 분할하는 방법에 대해 SerCx2보다 더 나은 결정을 내릴 수 있도록 하는 하드웨어 종속 정보에 액세스할 수 있습니다. 옵션으로 이러한 드라이버는 EvtSerCx2SelectNextReceiveTransactionTypeEvtSerCx2SelectNextTransmitTransactionType 이벤트 콜백 함수를 구현할 수 있습니다. SerCx2는 이러한 함수가 구현된 경우 호출하여 드라이버가 읽기 또는 쓰기 요청을 충족하는 데 사용할 I/O 트랜잭션을 결정할 수 있도록 합니다.