다음을 통해 공유


GPIO 컨트롤러 드라이버에 대한 인터럽트 동기화

GPIO 컨트롤러 드라이버는 GPIO_CLX_AcquireInterruptLockGPIO_CLX_ReleaseInterruptLock 메서드를 호출하여 GPIO 프레임워크 확장(GpioClx)에 의해 내부적으로 구현되는 인터럽트 잠금을 획득하고 해제할 수 있습니다. IRQL = PASSIVE_LEVEL 실행되는 드라이버 코드는 이러한 메서드를 호출하여 GpioClx의 ISR(인터럽트 서비스 루틴)과 동기화할 수 있습니다. GpioClx는 GPIO 컨트롤러의 각 핀 뱅크에 별도의 인터럽트 잠금을 바칩니다.

GPIO 컨트롤러의 하드웨어 레지스터가 메모리 매핑된 경우 GpioClx의 ISR은 DIRQL에서 드라이버 구현 이벤트 콜백 함수를 호출합니다. GpioClx는 PASSIVE_LEVEL 콜백 함수의 나머지 부분을 호출합니다. 레지스터 뱅크에 액세스하는 수동 수준 콜백 함수는 인터럽트 잠금을 사용하여 DIRQL에서 실행되고 동일한 레지스터에 액세스하는 콜백 함수와 동기화해야 할 수 있습니다.

예를 들어 수동 수준 CLIENT_EnableInterruptCLIENT_DisableInterrupt 콜백 함수는 DIRQL에서 실행되는 다른 인터럽트 관련 콜백 루틴의 작업에 영향을 주는 하드웨어 설정을 수정합니다. CLIENT_EnableInterruptCLIENT_DisableInterrupt 함수는 일반적으로 은행 인터럽트 잠금을 사용하여 레지스터 액세스를 동기화합니다.

GpioClx는 DIRQL에서 발생하는 인터럽트 관련 및 I/O 관련 콜백을 자동으로 직렬화합니다. GpioClx는 DIRQL에서 콜백 함수를 호출하기 전에 대상 뱅크에 대한 인터럽트 잠금을 획득하고 함수가 반환된 후 잠금을 해제합니다. DIRQL에서 호출된 콜백 함수가 GPIO_CLX_AcquireInterruptLock 호출하여 은행 인터럽트 잠금을 다시 획득하려고 시도하는 것은 오류입니다.

마찬가지로 GpioClx는 PASSIVE_LEVEL 발생하는 콜백을 자동으로 직렬화합니다. GpioClx는 내부적으로 은행당 대기 잠금을 구현합니다. GpioClx는 PASSIVE_LEVEL 콜백 함수를 호출하기 전에 대상 뱅크에 대한 대기 잠금을 획득하고 함수가 반환될 때 잠금을 해제합니다. 메모리 매핑 GPIO 컨트롤러의 경우 GpioClx는 드라이버를 대신하여 은행 대기 잠금을 관리하지만 드라이버가 잠금을 명시적으로 획득하고 해제할 수는 없습니다.

그러나 메모리 매핑이 아닌 GPIO 컨트롤러의 경우 GPIO_CLX_AcquireInterruptLockGPIO_CLX_ReleaseInterruptLock 인터럽트 잠금 대신 대기 잠금을 획득하고 해제합니다. GpioClx는 GPIO 컨트롤러의 각 핀 뱅크에 대해 별도의 대기 잠금을 구현합니다. 레지스터는 메모리 매핑되지 않으므로 I/O 요청을 사용하여 I²C와 같은 직렬 버스를 통해 레지스터에 액세스할 수 있도록 모든 인터럽트 관련 및 I/O 관련 콜백 함수가 PASSIVE_LEVEL 호출됩니다. GpioClx는 이러한 콜백 함수 중 하나를 호출하기 전에 대상 뱅크에 대한 대기 잠금을 획득하고 함수가 반환된 후 잠금을 해제합니다.

메모리 매핑되지 않은 컨트롤러가 GPIO_CLX_AcquireInterruptLock 호출하여 은행 대기 잠금을 다시 획득하려고 시도하는 콜백 함수에 대한 오류입니다. 그러나 콜백 함수 외부의 수동 수준 드라이버 코드는 GPIO_CLX_XxxInterruptLock 메서드를 호출하여 콜백 함수와 동기화할 수 있습니다. GpioClx는 PASSIVE_LEVEL 모든 인터럽트 관련 및 I/O 관련 콜백 함수를 호출하기 때문에 은행 대기 잠금은 메모리 매핑이 아닌 컨트롤러에 대한 은행 인터럽트 잠금을 효과적으로 대신합니다.

메모리 매핑되지 않은 컨트롤러에 대한 또 다른 옵션은 컨트롤러 드라이버가 대기 잠금 집합을 구현하는 것입니다. 이러한 대기 잠금을 사용하면 콜백 루틴이 GpioClx에서 구현된 대기 잠금보다 더 세분화된 공유 리소스 잠금 및 잠금 해제를 수행할 수 있습니다.

CLIENT_QueryControllerBasicInformation 콜백 루틴을 호출하는 동안 GPIO 컨트롤러 드라이버는 컨트롤러 레지스터가 메모리 매핑되었는지 여부를 GpioClx에 보고합니다. 자세한 내용은 CLIENT_CONTROLLER_BASIC_INFORMATIONMemoryMappedController 플래그에 대한 설명을 참조하세요.

인터럽트 잠금 및 대기 잠금에 대한 자세한 내용은 프레임워크 잠금 사용을 참조하세요.

다음 표에서는 레지스터가 메모리 매핑되는 경우 PASSIVE_LEVEL 대신 DIRQL에서 호출되는 콜백 함수에 대한 자세한 정보를 제공합니다. 표 뒤에 있는 참고 사항에서는 수동 수준 콜백 함수가 인터럽트 잠금을 사용해야 하는 경우를 설명합니다.

인터럽트 입력으로 구성된 GPIO 핀을 지원하기 위해 GPIO 컨트롤러 드라이버는 이러한 핀을 통해 인터럽트 요청을 관리하는 이벤트 콜백 함수 집합을 구현합니다. 다음 표에서 가운데 열은 GPIO 컨트롤러의 하드웨어 레지스터가 메모리 매핑된 경우 함수가 호출되는 IRQL을 나타냅니다. 맨 오른쪽 열은 레지스터가 메모리 매핑되지 않고 직렬 버스를 통해 액세스해야 하는 경우 함수가 호출되는 IRQL을 나타냅니다.

콜백 함수 메모리 매핑된 경우 IRQL(MemoryMappedController = 1) 직렬로 액세스하는 경우 IRQL(MemoryMappedController = 0)

CLIENT_EnableInterrupt

CLIENT_DisableInterrupt

PASSIVE_LEVEL

(참고 1을 참조하세요.)

PASSIVE_LEVEL

(참고 2를 참조하세요.)

CLIENT_ClearActiveInterrupts

CLIENT_MaskInterrupts

CLIENT_QueryActiveInterrupts

CLIENT_QueryEnabledInterrupts

CLIENT_ReconfigureInterrupt

CLIENT_UnmaskInterrupt

DIRQL

(참고 3을 참조하세요.)

PASSIVE_LEVEL

(참고 4를 참조하세요.)

CLIENT_PreProcessControllerInterrupt

DIRQL

(참고 5를 참조하세요.)

DIRQL

(참고 6을 참조하세요.)

참고 사항

  1. GpioClx는 이 콜백 함수를 호출하기 전에 은행 인터럽트 잠금을 획득하지 않습니다. 콜백 함수는 필요한 경우 은행 인터럽트 잠금을 획득하여 DIRQL에서 실행되는 콜백 함수와 공유되는 레지스터의 액세스를 동기화할 수 있습니다.

  2. GpioClx는 PASSIVE_LEVEL 호출되는 다른 인터럽트 관련 및 I/O 관련 콜백 함수를 사용하여 이 콜백 함수에 대한 호출을 직렬화합니다. 따라서 콜백 함수는 은행 대기 잠금을 획득하려고 시도해서는 안 됩니다.

  3. GpioClx는 이 콜백 함수를 호출하기 전에 은행 인터럽트 잠금을 획득하고 함수가 반환된 후 잠금을 해제합니다. 따라서 콜백 함수는 은행 인터럽트 잠금을 획득하려고 시도해서는 안 됩니다.

  4. GpioClx는 PASSIVE_LEVEL 호출되는 다른 인터럽트 관련 및 I/O 관련 콜백 함수를 사용하여 이 콜백 함수에 대한 호출을 직렬화합니다. 따라서 콜백 함수는 은행 대기 잠금을 획득하려고 시도해서는 안 됩니다.

  5. GpioClx는 이 콜백 함수를 호출하기 전에 은행 인터럽트 잠금을 획득하고 함수가 반환된 후 잠금을 해제합니다. 따라서 콜백 함수는 은행 인터럽트 잠금을 획득하려고 시도해서는 안 됩니다.

  6. GpioClx는 이 콜백 함수를 호출하기 전에 은행 인터럽트 잠금을 획득하지 않습니다. GPIO 컨트롤러 드라이버는 필요할 수 있는 모든 동기화를 제공해야 합니다.

데이터 I/O 핀으로 구성된 GPIO 핀을 지원하기 위해 GPIO 컨트롤러 드라이버는 이러한 핀을 통해 I/O 작업을 관리하는 이벤트 콜백 함수 집합을 구현합니다. 다음 표에서 가운데 열은 GPIO 컨트롤러의 하드웨어 레지스터가 메모리 매핑된 경우 함수가 호출되는 IRQL을 나타냅니다. 맨 오른쪽 열은 레지스터가 메모리 매핑되지 않고 직렬 버스를 통해 액세스해야 하는 경우 함수가 호출되는 IRQL을 나타냅니다.

콜백 함수 메모리 매핑된 경우 IRQL(MemoryMappedController = 1) 직렬로 액세스하는 경우 IRQL(MemoryMappedController = 0)

CLIENT_ConnectIoPins

CLIENT_DisconnectIoPins

PASSIVE_LEVEL

(참고 1을 참조하세요.)

PASSIVE_LEVEL

(참고 2를 참조하세요.)

CLIENT_ReadGpioPins

CLIENT_ReadGpioPinsUsingMask

CLIENT_WriteGpioPins

CLIENT_WriteGpioPinsUsingMask

DIRQL

(참고 3을 참조하세요.)

PASSIVE_LEVEL

(참고 4를 참조하세요.)

참고 사항

  1. GpioClx는 이 콜백 함수를 호출하기 전에 은행 인터럽트 잠금을 획득하지 않습니다. 콜백 함수는 필요한 경우 인터럽트 잠금을 획득하여 DIRQL에서 실행되는 콜백 함수와 공유되는 레지스터의 액세스를 동기화할 수 있습니다.

  2. GpioClx는 PASSIVE_LEVEL 호출되는 다른 인터럽트 관련 및 I/O 관련 콜백 함수를 사용하여 이 콜백 함수에 대한 호출을 직렬화합니다. 따라서 콜백 함수는 은행 대기 잠금을 획득하려고 시도해서는 안 됩니다.

  3. GpioClx는 이 콜백 함수를 호출하기 전에 은행 인터럽트 잠금을 획득하고 함수가 반환된 후 잠금을 해제합니다. 따라서 콜백 함수는 은행 인터럽트 잠금을 획득하려고 시도해서는 안 됩니다.

  4. GpioClx는 PASSIVE_LEVEL 호출되는 다른 인터럽트 관련 및 I/O 관련 콜백 함수를 사용하여 이 콜백 함수에 대한 호출을 직렬화합니다. 따라서 콜백 함수는 은행 대기 잠금을 획득하려고 시도해서는 안 됩니다.

GPIO 컨트롤러를 설정하여 I/O 및 인터럽트 작업을 수행하기 위해 GPIO 컨트롤러 드라이버는 컨트롤러를 초기화하는 이벤트 콜백 함수 집합을 구현합니다. 다음 표에서 가운데 열은 GPIO 컨트롤러의 하드웨어 레지스터가 메모리 매핑된 경우 함수가 호출되는 IRQL을 나타냅니다. 맨 오른쪽 열은 레지스터가 메모리 매핑되지 않고 직렬 버스를 통해 액세스해야 하는 경우 함수가 호출되는 IRQL을 나타냅니다.

콜백 함수 메모리 매핑된 경우 IRQL(MemoryMappedController = 1) IRQL에 직렬로 액세스하는 경우(MemoryMappedController = 0)

CLIENT_PrepareController

CLIENT_ReleaseController

CLIENT_StartController

CLIENT_StopController

CLIENT_QueryControllerBasicInformation

CLIENT_QuerySetControllerInformation

PASSIVE_LEVEL

(참고 1을 참조하세요.)

PASSIVE_LEVEL

(참고 2를 참조하세요.)

참고 사항

  1. GpioClx가 이러한 콜백 함수를 호출하는 경우 은행 인터럽트 잠금을 사용할 수 없습니다. 따라서 이러한 콜백 함수는 은행 인터럽트 잠금을 획득하려고 시도해서는 안 됩니다.

  2. 이러한 콜백 함수가 호출되면 GpioClx 은행 대기 잠금을 사용할 수 없습니다. 따라서 드라이버는 이러한 콜백 함수와 동기화하기 위해 은행 대기 잠금을 획득하려고 시도해서는 안 됩니다.

GPIO 컨트롤러가 디바이스 전원 상태를 변경할 수 있도록 GPIO 컨트롤러 드라이버는 이러한 변경 중에 하드웨어 설정을 저장하고 복원하는 이벤트 콜백 함수 집합을 구현합니다. 다음 표에서 가운데 열은 GPIO 컨트롤러의 하드웨어 레지스터가 메모리 매핑된 경우 함수가 호출되는 IRQL을 나타냅니다. 맨 오른쪽 열은 레지스터가 메모리 매핑되지 않고 직렬 버스를 통해 액세스해야 하는 경우 함수가 호출되는 IRQL을 나타냅니다.

콜백 함수 메모리 매핑된 경우 IRQL(MemoryMappedController = 1) IRQL에 직렬로 액세스하는 경우(MemoryMappedController = 0)

CLIENT_RestoreBankHardwareContext

CLIENT_SaveBankHardwareContext

DIRQL 또는 HIGH_LEVEL

(참고 사항을 참조하세요.)

지원되지 않습니다.

참고 사항

  • 정기적인 F 상태 전환의 경우: 저장/복원 콜백 함수는 DIRQL에서 GpioClx가 보유한 뱅크 인터럽트 잠금으로 호출됩니다. 따라서 두 콜백 함수 모두 은행 인터럽트 잠금을 획득하려고 시도해서는 안 됩니다.
  • 중요한 F 상태 전환의 경우: 저장/복원 콜백은 GPIO 상태를 저장하고 복원하기 위해 PEP(전원 엔진 플러그 인)를 호출할 때 호출됩니다. 저장/복원 콜백 함수는 플랫폼 심층 유휴 전환 시퀀스에서 늦게 발생하는 유휴 상태로 전환할 마지막 프로세서의 컨텍스트에서 HIGH_LEVEL 호출됩니다. 따라서 두 콜백 함수 모두 은행 인터럽트 잠금을 획득하려고 시도해서는 안 됩니다.

F-상태에 대한 자세한 내용은 구성 요소 수준 전원 관리를 참조하세요. PEP에 대한 자세한 내용은 PoFxPowerControl을 참조하세요.

기타 콜백 함수

GPIO 컨트롤러가 컨트롤러별 작업을 지원할 수 있도록 GPIO 컨트롤러 드라이버는 CLIENT_ControllerSpecificFunction 이벤트 콜백 함수를 구현합니다. 다음 표에서 가운데 열은 GPIO 컨트롤러의 하드웨어 레지스터가 메모리 매핑된 경우 함수가 호출되는 IRQL을 나타냅니다. 맨 오른쪽 열은 레지스터가 메모리 매핑되지 않고 직렬 버스를 통해 액세스해야 하는 경우 함수가 호출되는 IRQL을 나타냅니다.

콜백 함수 메모리 매핑된 경우 IRQL(MemoryMappedController = 1) IRQL에 직렬로 액세스하는 경우(MemoryMappedController = 0)

CLIENT_ControllerSpecificFunction

PASSIVE_LEVEL

(참고 1을 참조하세요.)

PASSIVE_LEVEL

(참고 2를 참조하세요.)

참고 사항

  1. GpioClx는 이 콜백 함수를 호출하기 전에 은행 인터럽트 잠금을 획득하지 않습니다. 콜백 함수는 필요한 경우 은행 인터럽트 잠금을 획득하여 DIRQL에서 실행되는 콜백 함수와 공유되는 레지스터의 액세스를 동기화할 수 있습니다.

  2. GpioClx는 PASSIVE_LEVEL 호출되는 다른 인터럽트 관련 및 I/O 관련 콜백 함수를 사용하여 이 콜백 함수에 대한 호출을 직렬화합니다. 따라서 콜백 함수는 은행 대기 잠금을 획득하려고 시도해서는 안 됩니다.