USB . BOS . Binary Device Object Store
USB 장치의 확장된 기능(Capability)을 호스트에 알리기 위해 사용되는 디스크립터
기존 USB 2.0의 표준 디스크립터(Device, Configuration 등)만으로는 표현하기 어려운 최신 기능들을 정의하기 위해 USB 3.0 사양에서 처음 도입되었으며, 현재는 USB 2.1 이상의 기기에서도 널리 사용
기기 USB 버전이 2.0이면 윈도우에서 BOS 디스크립터 요청안하므로 적용안되며 USB 2.01 (버전 기록시 0x0201 ) 이상이면 BOS 유효.
주요 특징 및 역할
- 기능 확장 프레임워크: 장치가 지원하는 특정 기술(예: USB 2.0 Extension, SuperSpeed 등)에 대한 정보를 담는 일종의 "바구니" 역할.
- LPM(Low Power Mode) 지원: STM32 예제 코드에서 가장 흔히 볼 수 있는 용도로, 장치가 저전력 상태로 전환될 수 있는 능력이 있음을 호스트에 보고.
- WebUSB/Microsoft OS Descriptors: 웹 브라우저에서 직접 USB 기기에 접근하거나, 드라이버 설치 없이 윈도우에서 특정 기능을 인식하게 할 때 필요한 정보를 이 BOS 디스크립터에 포함.
BOS를 통한 Microsoft OS 2.0 Descriptor 활용
윈도우는 장치가 연결될 때 BOS 디스크립터를 확인하여 Microsoft OS Descriptor가 있는지 체크. 이를 통해 드라이버가 로드될 때 특정 레지스트리 값을 생성하도록 유도할 수 있다.
- 방법: BOS 디스크립터 내부에 MS_OS_20_FEATURE_REG_PROPERTY를 정의하여, 장치가 설치될 때 레지스트리에 특정 값을 쓰도록 명시. 예 : USB 기기의 레지스트리 항목중 EnhancedPowerManagementEnabled 를 0으로 설정.
- 한계: 이미 HID 표준 드라이버로 잡혀있는 경우, 윈도우는 표준 HID 가이드라인에 따라 전력 관리 옵션을 강제로 켜버리는 경우 많음.
코드 구조 예시
- BOS 내부에 Microsoft OS 2.0 Platform Capability Descriptor를 추가
- 레지스트리 프로퍼티 정의: 이 디스크립터 안에 DeviceParameters에 EnhancedPowerManagementEnabled 값을 0으로 하면 USB 인식시 적용된다.
// BOS 디스크립터 내부에 MS OS 2.0 기능을 선언
0x1C, 0x10, 0x05, // Descriptor Set Information
0x00, 0x00, 0x03, 0x06, // Windows version (Blue)
// ... 중략 ...
// Registry Property Descriptor
0x00, 0x04, // MS_OS_20_FEATURE_REG_PROPERTY
0x00, 0x07, // Property DataType (REG_DWORD)
0x00, 0x2A, // Name length
'E','n','h','a','n','c','e','d','P','o','w','e','r','M','a','n','a','g','e','m','e','n','t','E','n','a','b','l','e','d',
0x00, 0x04, // Data length (4 bytes)
0x00, 0x00, 0x00, 0x00 // Value (0 = Disable)
비고. 윈도우 운영체제 업데이트시 레지스트리 값을 초기화 시켜버리는 경우가 허다하나, USB 를 다시 연결하면 기기가 의도한대로 레지스트리값이 다시 설정되어 윈도우 운영체제의 불안정성에 대응 가능한 지속가능한 서비스 가능하다. 즉 장치 자체가 설정기 역할을 한다.
BOS 디스크립터 예
#define USB_SIZ_BOS_DESC 0x0C
__ALIGN_BEGIN uint8_t USBD_FS_BOSDesc[USB_SIZ_BOS_DESC] __ALIGN_END =
{
0x05, // bLength. BOS Header 사이즈.
USB_DESC_TYPE_BOS, // bDescriptorType = 0x0F
0x0C,0x00, // 이 배열의 전체 사이즈.
0x01, // bNumDeviceCaps = 1
// Link Power Management .
0x07,
0x10,
0x02, // USB 2.0 Extension
0x00,0x00,0x00,0x00 // 첫바이트 값 설정 0x02(비트1 set) : Link Power Management 지원한다는 의미.
};
위와 같이 설정된 USB 연결하여 Usb Tree Viewer 로 보면 아래처럼 보이며 정상 작동했음을 알 수 있다.

첫 등록 : 2026.04.24
최종 수정 :
단축 주소 : https://igotit.tistory.com/6569
'임베디드.일렉트로닉스' 카테고리의 다른 글
| Zephyr . COBS 라이브러리 (0) | 2026.06.16 |
|---|---|
| WebUSB . 시험 가능 웹 (0) | 2026.05.06 |
| NCS VSCode . 커스텀 보드 추가하기 (0) | 2026.04.11 |
| Zephyr . Workque (워크큐) . (0) | 2026.04.07 |
| BLE . 페어링 . 본딩 . RPA . IRK (0) | 2026.04.06 |
댓글