소프트웨어 정의 배터리
참고 항목
일부 정보는 상업적으로 출시되기 전에 실질적으로 수정될 수 있는 시험판 제품과 관련이 있습니다. Microsoft는 여기에 제공된 정보에 대해 어떠한 명시적, 또는 묵시적인 보증을 하지 않습니다.
소개
이 항목의 목표는 SDB(소프트웨어 정의 배터리)를 도입하고, Windows SDB 아키텍처를 설명하고, 이 기능에 대한 Windows API 및 DDI 계약을 자세히 설명하는 것입니다.
이 항목은 가상의 두 배터리 시스템에 대한 단순 연령 분산 SDB 알고리즘을 도입하여 시작합니다. 그 다음에는 SDB 알고리즘을 구현하는 데 필요한 아키텍처 레이아웃 및 API 계약이 뒤따릅니다.
명명법
BattC - 배터리 클래스 드라이버
CAD - CAD(충전 중재 드라이버)는 USB 레거시, USB Type-C 및 무선 충전 소스 간에 전력을 중재하는 Microsoft 드라이버입니다.
콜드 스와핑 가능 배터리 - 정전 또는 총 정전 위험 없이 시스템에서 제거할 수 없는 배터리
주기 수 - ACPI 사양에 설명된 대로 배터리로 인해 발생한 전체 충전 방전 주기의 수
핫 스왑 가능 배터리 - 시스템이 작동 중일 때 브라운아웃 위험 없이 안전하게 제거할 수 있는 배터리
HPMI - 하드웨어 Power Manager 인터페이스
비 핫 스왑 가능 배터리 - 시스템에 설치된 하나 이상의 콜드 스와핑 가능 및 비스왑 가능 배터리
교환할 수 없는 배터리 - 최종 사용자가 설계하지 않고 제거해야 하는 배터리
SDB 개요
소프트웨어 정의 배터리에 대한 MSR 연구 논문은 다음에서 https://www.microsoft.com/research/wp-content/uploads/2016/02/multibattery_sosp2015.pdf찾을 수 있습니다.
이 항목에서는 이 문서에서 설명하는 선택 아이디어를 재연하고 랩톱 및 기타 모바일 장치에서 소프트웨어 기반 배터리 사용 기간 분산 기능을 제품화하는 보기를 제공합니다.
두 개의 배터리 시스템을 상상해 보십시오. 하나의 배터리가 SOC 옆에 위치한 이동식이 아닌 배터리인 경우 이 내부 배터리를 호출해 보겠습니다. 다른 배터리는 이동식 키보드 옆에 위치한 핫 스왑 가능 배터리입니다. 이 외부 배터리를 호출해 보겠습니다.
다중 배터리 시스템
키보드는 일정 기간 동안 분리되어 있으므로 두 배터리가 다르게 사용되도록 합니다. 이렇게 하면 SDB 단순 연령 분산 알고리즘을 사용하여 배터리를 균형 조정하고 시스템 사용 기간을 연장하는 범위를 만듭니다.
단순 연령 분산 SDB 알고리즘
이 알고리즘은 배터리 사용 기간의 균형을 맞추기 위해 시도하기 때문에 단순 연령 분산이라고 합니다. 간단한 연령 분산 알고리즘을 사용하면 시스템이 최소로 숙성된 배터리를 방전하는 것을 선호합니다. 주기 수가 적은 배터리는 전력을 보유할 수 있는 용량이 높을 뿐만 아니라 일반적으로 전력 전달에 더 효율적입니다. 따라서 시스템이 배터리에서 유지할 수 있는 시간을 연장합니다.
단순 연령 분산 SDB 알고리즘
간단한 연령 분산 알고리즘의 핵심 개념은 위의 순서도에서 의사 결정 상자(2)에 표시된 대로 배터리 주기 수가 최소인 배터리를 사용하는 것입니다. 이 예제의 가상 시스템을 사용하면 내부 또는 외부 배터리를 단독으로 사용할 수 있습니다. 그러나 모든 시스템에서는 그렇지 않을 수 있습니다. 다른 시스템은 유연하지 않거나 배터리 사용에 전기적 제약이 있을 수 있습니다. 이러한 경우 알고리즘은 연령 분산을 가장 잘 시도할 것으로 예상합니다. 예를 들어 다음을 고려해 보세요.
외부 배터리에서만 전원을 유지할 수 없는 시스템입니다(외부 배터리가 보조 전원만 사용하도록 설계되었기 때문일 수 있음). 이 시스템은 위의 순서도에서 프로세스 블록(A)의 내부 및 외부 배터리를 동시에 방전하여 간단한 연령 분산 알고리즘을 구현할 수 있습니다.
외부 배터리가 존재할 때마다 외부 배터리를 사용해야 하는 시스템(이동식 키보드 전원 유지와 관련된 추가 전원 그리기 때문일 수 있음) 이 시스템은 위의 순서도에서 내부 및 외부 배터리를 프로세스 블록(B)에서 동시에 방전하여 간단한 노후 분산 알고리즘을 구현할 수 있습니다.
간단한 연령 분산 알고리즘은 시스템을 실행하기 위해 내부 및 외부 배터리에 충분한 충전이 있는 경우에만 사용할 수 있습니다. 의사 결정 상자 (1)는 위의 순서도에서 검사 이 조건을 나타냅니다. 예를 들어 외부 배터리에 충전이 없으면 (다시 가상 시스템으로 돌아가기) 배터리를 균형 조정하는 데 사용할 수 있는 범위가 없으며 의사 결정 상자(1)는 "NO" 분기를 발생시킵니다.
OEM은 내부 또는 외부 배터리의 전원이 꺼진 경우 외에 간단한 연령 분산 알고리즘이 적용되지 않을 때 제약 조건 및 조건을 자유롭게 선택할 수 있습니다. 예를 들어 OEM은 다음과 같은 경우 연령 분산을 수행하지 않도록 선택할 수 있습니다.
- SOC/프로세서가 고성능 모드에서 실행되고 있습니다.
- 시스템이 열적으로 불안정합니다.
위에서 설명한 하나 이상의 조건으로 인해 단순 연령 분산 알고리즘을 사용하지 않는 경우 논리는 위의 순서도에서 프로세스 상자(3)에 표시된 대로 OEM의 독점 배터리 사용 정책으로 다시 되돌리기. 프로세스 상자(3)는 SDB가 지원되지 않는 경우 OEM이 적용했을 논리입니다.
핫 스왑 가능 배터리에 사용할 SDB 알고리즘 조정
간단한 연령 분산 SDB 알고리즘은 가장 건강한 배터리를 사용하려고 시도하지만, 이 전략은 장기 배터리 수명을 개선하기 위해 잘 작동하지만 다음 시나리오에 설명된 대로 시스템의 단기 유용성에 심각한 영향을 미칠 수 있습니다.
위에서 설명한 두 배터리 시스템에서는 다음 상황을 고려합니다.
사용자는 내부 및 외부 배터리의 충전이 모두 소진될 때까지 시스템을 충분히 오래 사용해야 합니다.
외부 배터리는 내부 배터리에 비해 더 숙성되었습니다.
이 시스템에서 간단한 연령 분산 알고리즘을 실행하면 먼저 내부 배터리에 저장된 충전량을 고갈하려고 시도합니다(위에 나열된 조건 #1 및 #2에 따라). 사용자가 잠시 후 외부 배터리를 분리하기로 결정하면 내부 배터리가 사용되므로 외부 배터리가 분리되면 사용할 수 있는 배터리 용량이 크게 감소하기 때문에 사용자 환경이 저하됩니다.
비 SDB 시스템에서 이 문제는 일반적으로 발생하지 않습니다. 대부분의 경우 내부 배터리를 사용하기 전에 외부 배터리가 고갈되기 때문입니다.
따라서 위의 시나리오가 발생할 가능성이 있는 경우 단순 연령 분산 알고리즘을 선택적으로 사용하지 않도록 설정하는 것이 좋습니다.
요약하자면, 사용자가 외부 배터리가 제거된 상태에서 오랫동안 시스템을 사용해야 할 때마다 SDB 알고리즘을 사용하지 않도록 설정하고 OEM 배터리 사용 정책(일반적으로 외부 배터리를 먼저 사용하는 것을 선호)을 사용하는 되돌리기 최적입니다.
Windows는 배터리 가용성을 계산하고 "핫 스왑 가능 배터리 유지" 힌트를 생성합니다. 다음 흐름 다이어그램의 의사 결정 상자(X)에 표시된 대로 SDB 알고리즘에서 이 힌트를 사용하는 경우
핫 스왑 가능 배터리에 맞게 조정된 간단한 연령 분산 SDB 알고리즘
펌웨어에서 SDB 알고리즘 구현
이 섹션에서는 시스템 펌웨어에 구현된 전체 배터리 방전 제어 논리를 보여 줍니다. 이는 위에서 설명한 배터리 사용 기간 분산 논리를 기반으로 하여 기존 Y(Y) 블록에 표시된 다중 배터리 방전 논리를 통합하는 방법을 보여 줍니다.
이는 OEM에서 SDB 알고리즘을 구현하는 방법에 대한 처방이 아니라 SDB 동작을 설명하는 데 사용되는 이 섹션에 설명된 단순하고 가상적인 다중 배터리 디바이스에 대한 포괄적인 예입니다.
단순 연령 분산 SDB 알고리즘의 전체 펌웨어 구현
Power Stack 아키텍처
이 섹션에서는 전원 스택에 참여하는 모든 구성 요소의 구성 요소 레이아웃과 서로의 상대 관계에 대해 설명합니다.
배터리 미니포트
배터리 미니포트 인터페이스는 동일하게 기본.
SDB 인터페이스는 ACPI/CmBatt 메커니즘을 사용하거나 전용 미니포트를 개발하려는 OEM의 욕구에 영향을 주거나 영향을 미치지 않습니다.
Windows는 모든 IOCTL_BATTERY_SET_INFORMATION 명령을 시스템에 열거된 모든 배터리 디바이스에 전달합니다.
HPMI
HPMI(하드웨어 Power Manager 인터페이스)는 파워 스택에 도입된 새로운 구성 요소입니다.
HPMI는 OEM/디바이스 제조업체가 개발하고 소유한 드라이버입니다.
HPMI는 기본 하드웨어 구성 및 상태에 대해 잘 알고 있으며 시스템 펌웨어에 액세스할 수 있습니다.
SDB 기능을 구현하기 위해 HPMI 드라이버는 다음을 수행합니다.
- Windows에 등록합니다.
- SDB 지원을 보급합니다.
- Windows에서 제공하는 SDB 컨트롤 매개 변수를 사용합니다.
앞으로 HPMI 인터페이스를 구현하려면 SDB를 지원하는 다중 배터리 시스템이 필요합니다. HPMI API 프로토콜은 여러 배터리 시스템을 구현하기 위한 새로운 표준입니다.
향후 HPMI가 다른 충전, 방전 및 충전 관리 기능을 지원하도록 업데이트될 예정입니다.
드라이버 특성
HPMI 드라이버의 인스턴스는 시스템에 둘 이상 없어야 합니다. HPMI는 사용자 모드 또는 커널 모드 드라이버로 구현될 수 있습니다.
설치
HPMI는 ACPI 디바이스로 명시되거나 OEM의 재량에 따라 다른 OEM 서비스/드라이버 중 하나에 의해 루트 열거될 수 있습니다.
SDB 알고리즘 구현
다음 다이어그램에서는 펌웨어 구성 요소가 이미 대량의 배터리 제어 논리를 호스트하는 경우 SDB 알고리즘을 구현하는 방법에 대한 두 가지 예를 보여 줍니다.
HPMI에서 SDB 알고리즘 구현
HPMI는 SDB 알고리즘을 구현하도록 선택할 수 있습니다. 이렇게 하려면 HPMI가 충전/방전 힌트를 펌웨어에 전달해야 합니다.
SDB 알고리즘을 구현하는 펌웨어
또는 HPMI는 위의 그림과 같이 전달자 역할을 하며 단순히 Windows 배터리 사용률 힌트를 SDB 알고리즘이 구현되는 펌웨어로 전달할 수 있습니다. 이 모델은 다음과 같은 이유로 사용하는 것이 좋습니다.
SDB 알고리즘을 구현하는 데 필요한 정보를 쉽게 사용할 수 있습니다. HPMI에 이 정보를 전달할 필요가 없습니다.
SDB 알고리즘은 다중 배터리 시스템에서 이미 구현된 방전 논리에 대한 확장입니다.
SDB 알고리즘 구현 방법을 보여 주는 전체 흐름 차트 모델은 펌웨어에서 SDB 알고리즘 구현에 표시됩니다.
인터페이스 정의
HPMI 디바이스에 대한 새 디바이스 인터페이스 클래스 GUID가 도입되었습니다. HPMI 디바이스는 디바이스 인터페이스 클래스를 구현하는 것으로 자신을 식별해야 합니다. 자세한 내용은 WDK에서 디바이스 인터페이스 사용을 참조하세요.
Windows는 HPMI 디바이스를 쿼리하고 구성하는 데 디바이스 도착 알림을 사용합니다.
//
// HPMI Device Interface Class.
//
// {DEDAE202-1D20-4C40-A6F3-1897E319D54F}
DEFINE_GUID(GUID_DEVINTERFACE_HPMI,
0xdedae202, 0x1d20, 0x4c40, 0xa6, 0xf3, 0x18, 0x97, 0xe3, 0x19, 0xd5, 0x4f);
HPMI는 여러 동시 IOCTL 호출을 처리할 수 있어야 합니다.
디바이스 인덱스가 0으로 설정되어야 합니다.
기능 검색
IOCTL_HPMI_QUERY_CAPABILITIES HPMI에서 지원하는 기능을 검색하는 데 사용됩니다. IOCTL_HPMI_QUERY_CAPABILITIES 필수 IOCTL입니다.
Windows는 새 HPMI 드라이버 인스턴스가 검색된 후 이 IOCL을 HPMI에 한 번 발급합니다.
//
// Query command sent to HPMI to query features supported by HPMI and Windows
// services requested by HPMI.
//
// This IOCTL may be issued multiple times, HPMI must respond with same
// information in HPMI_QUERY_CAPABILITIES_RESPONSE, as a response to all
// subsequent IOCTL calls.
//
#define IOCTL_HPMI_QUERY_CAPABILITIES
CTL_CODE(FILE_DEVICE_BATTERY, 0x200,
METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
//
// IOCTL_HPMI_QUERY_CAPABILITIES - Command.
//
typedef struct _HPMI_QUERY_CAPABILITIES {
//
// Set to HPMI_QUERY_CAPABILITIES_VERSION_1.
//
ULONG Version;
} HPMI_QUERY_CAPABILITIES, *PHPMI_QUERY_CAPABILITIES;
#define HPMI_QUERY_CAPABILITIES_VERSION_1
(1)
#define HPMI_QUERY_CAPABILITIES_SIZEOF_VERSION_1
sizeof(HPMI_QUERY_CAPABILITIES)
//
// IOCTL_HPMI_QUERY_CAPABILITIES - Response.
//
#define HPMI_REQUEST_SERVICE_NONE
(0x00000000) // No Windows services is requested.
#define HPMI_REQUEST_SERVICE_BATTERY_UTILIZATION_HINTS
(0x00000001) // Battery utilization hints requested from Windows.
#define HPMI_CAPABILITY_NOT_SUPPORTED
(0x00000000) // HPMI supports no capabilities.
#define HPMI_CAPABILITY_SDB_OEM_SIMPLE_AGE_BALANCING
(0x00000001) // OEM device specific age balancing SDB support
typedef struct _HPMI_QUERY_CAPABILITIES_RESPONSE {
//
// Set to HPMI_QUERY_CAPABILITIES_RESPONSE_VERSION_1.
//
ULONG Version;
//
명령 형식
Windows는 HPMI_QUERY_CAPABILITIES 이 IOCTL을 발급합니다.
버전이 HPMI_QUERY_CAPABILITIES_VERSION_1 설정됩니다.
응답 형식
HPMI는 STATUS_SUCCESS 코드를 반환해야 합니다.
HPMI는 HPMI_QUERY_CAPABILITIES_RESPONSE 구조체에서 다음 값을 설정하여 응답합니다.
- 버전이 HPMI_QUERY_CAPABILITIES_RESPONSE_VERSION_1
- RequestService는 HPMI 드라이버가 IOCTL_HPMI_BATTERY_UTILIZATION_HINT 받을 수 있도록 HPMI_REQUEST_SERVICE_BATTERY_UTILIZATION_HINTS 설정됩니다.
- SdbCapabilities는 배터리 사용 기간 분산 지원을 나타내기 위해 HPMI_CAPABILITY_SDB_OEM_SIMPLE_AGE_BALANCING 설정됩니다.
배터리 사용률
Windows는 가장 업데이트된 배터리 사용률 힌트를 제공하기 위해 HPMI에 IOCTL_HPMI_BATTERY_UTILIZATION_HINT 발급합니다. IOCTL_HPMI_BATTERY_UTILIZATION_HINT 필수 IOCTL입니다.
HPMI는 내부 배터리를 절약하기 위해 핫 스왑 가능 배터리와 함께 사용하기 위해 적응 SDB 알고리즘에 설명된 대로 PreserveNonHotSwappableBatteries 힌트를 활용할 수 있습니다.
//
// Set command sent to HPMI to provide battery utilization hints.
//
// This IOCTL may be issued multiple times if HPMI requests
// HPMI_REQUEST_SERVICE_BATTERY_UTILIZATION_HINTS service.
//
#define IOCTL_HPMI_BATTERY_UTILIZATION_HINT
CTL_CODE(FILE_DEVICE_BATTERY, 0x201,
METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)
//
// Boolean type value.
//
typedef enum _HPMI_HINT_BOOL {
// No data is available.
HpmiBoolUnavailable = 0,
// Condition is asserted to be false.
HpmiBoolFalse,
// Condition is asserted to be true.
HpmiBoolTrue,
// Value not used.
HpmiBoolMax
} HPMI_HINT_BOOL, *PHPMI_HINT_BOOL;
//
// IOCTL_HPMI_BATTERY_UTILIZATION_HINT - Command.
//
typedef struct _HPMI_BATTERY_UTILIZATION_HINT {
//
// Set to HPMI_BATTERY_UTILIZATION_HINT_VERSION_1.
//
ULONG Version;
//
// This hint indicates if the OEM Battery Manager should attempt to save as
// much charge as possible in the non-hot swappable batteries (i.e. the
// batteries are generally referred to as "internal batteries", these
// batteries cannot be removed while system is operational).
//
// Interpretation of values:
// - HpmiBoolUnavailable:
// Battery utilization hint is unavailable at the moment.
// - HpmiBoolFalse:
// It is not necessary to preserve charge in the internal batteries
// at the moment.
// - HpmiBoolTrue:
// Every attempt should be made to save as much charge as possible in
// the internal batteries.
//
HPMI_HINT_BOOL PreserveNonHotSwappableBatteries;
} HPMI_BATTERY_UTILIZATION_HINT, *PHPMI_BATTERY_UTILIZATION_HINT;
#define HPMI_BATTERY_UTILIZATION_HINT_VERSION_1
(1)
#define HPMI_BATTERY_UTILIZATION_HINT_SIZEOF_VERSION_1
sizeof(HPMI_BATTERY_UTILIZATION_HINT)
명령 형식
Windows는 HPMI_BATTERY_UTILIZATION_HINT 이 IOCTL을 발급합니다. 버전은 HPMI_BATTERY_UTILIZATION_HINT_VERSION_1 설정됩니다.
PreserveNonHotSwappableBatteries는 다음 값 중 하나로 설정됩니다.
- HpmiBoolUnavailable: 배터리 사용량 힌트를 제공할 수 없는 경우를 설정합니다. 이에 대한 응답으로 HPMI/Fimware는 일반적으로 사실상 방전 정책을 사용해야 합니다.
- HpmiBoolFalse: Windows에서 배터리 사용 시간 분산이 발생할 수 있는 적절한 시간을 결정할 때 설정합니다.
- HpmiBoolTrue: Windows에서 내부 배터리에 저장된 에너지를 절약해야 한다고 결정할 때 설정합니다.
응답 형식
HPMI는 STATUS_SUCCESS 코드를 반환해야 합니다.
응답에 데이터가 반환되지 않습니다.
샘플 인터페이스 계약
여기에 설명된 인터페이스 정의에 대한 전체(샘플) API 계약은 HMPI.h 를 참조하세요.
참고 항목
이 문서의 내용은 예고 없이 변경될 수 있습니다.