USB Interrupt endpoint bInterval 디버깅
USB interrupt endpoint는 키보드, 마우스, 게임 컨트롤러, 센서, 터치 패널, 바코드 스캐너, UPS 장치, 그리고 많은 커스텀 HID 도구에서 쓰입니다.
USB interrupt endpoint는 키보드, 마우스, 게임 컨트롤러, 센서, 터치 패널, 바코드 스캐너, UPS 장치, 그리고 많은 커스텀 HID 도구에서 쓰입니다. 입력이 늦게 느껴지거나 report가 기대한 주기로 도착하지 않을 때 사용자는 "USB bInterval", "HID polling rate", "USB interrupt endpoint latency", "missed input reports", "USB device 125Hz 250Hz 1000Hz", "bInterval full speed high speed" 같은 표현을 검색합니다.
Bus Scope가 유용한 이유는 polling 동작이 endpoint descriptor와 실제 버스 타이밍으로 결정되기 때문입니다. 운영체제 UI에는 "device connected"만 보일 수 있지만, 캡처에는 host가 실제로 어떤 interval로 polling하는지가 드러납니다.
bInterval의 의미
interrupt endpoint descriptor에는 bInterval이 포함됩니다. 이 값은 polling interval을 설명하지만, 해석 방식은 speed와 endpoint type에 따라 달라집니다.
중요한 차이는 다음과 같습니다.
- Low-speed 및 full-speed interrupt endpoint는 millisecond frame 기반 interval을 사용합니다.
- High-speed interrupt endpoint는 microframe 기반의 다른 encoding을 사용합니다.
- Host controller scheduling과 hub topology가 관측되는 타이밍에 영향을 줄 수 있습니다.
- 애플리케이션의 read 타이밍은 USB bus polling과 같지 않습니다.
엔지니어가 애플리케이션 callback만 보면 실제 endpoint schedule을 놓칠 수 있습니다.
흔한 증상
Polling interval 문제는 보통 다음처럼 나타납니다.
- 마우스나 컨트롤러가 느리게 반응하는 것처럼 느껴집니다.
- HID input report가 1 ms가 아니라 8 ms마다 도착합니다.
- 장치가 1000 Hz를 광고하지만 실제로는 125 Hz처럼 동작합니다.
- 센서 데이터가 burst 형태로 몰려옵니다.
- 바코드 스캐너가 빠른 scan을 놓칩니다.
- 터치 패널이 resume 이후 지연되는 것처럼 보입니다.
- firmware가 host polling보다 빠르게 report를 보냅니다.
- High-speed mode로 바뀌면서 report 타이밍이 예상과 달라집니다.
이 문제들은 latency나 responsiveness 문제처럼 보이지만, 근본 증거는 USB descriptor와 packet timing에 있습니다.
Full-speed와 High-speed 해석 차이
같은 숫자의 bInterval도 speed에 따라 실제 타이밍 의미가 달라질 수 있습니다. bInterval=8인 full-speed HID endpoint는 같은 byte 값을 가진 high-speed endpoint와 같은 scheduling model이 아닙니다.
디버깅할 때는 다음을 캡처해야 합니다.
- 실제 negotiated speed.
- Endpoint descriptor.
- Endpoint address.
- Transfer type.
bInterval.- 관측된 IN token 또는 transfer cadence.
- Report payload timing.
Bus Scope는 descriptor 값과 관측된 타이밍을 함께 보여줘야 합니다.
firmware overproduction 확인
일부 firmware는 host가 polling하는 속도보다 더 빠르게 input report를 생성합니다. 이런 report는 host가 보기 전에 overwrite, coalesce, drop될 수 있습니다.
증상:
- 장치 내부 log에는 event가 남아 있습니다.
- Host가 받는 report 수가 더 적습니다.
- 빠른 button press가 누락됩니다.
- 움직임이 smoothing되거나 늦게 보입니다.
- burst 이후의 report에는 최신 상태만 들어 있습니다.
이것은 USB packet-loss 문제가 아닙니다. firmware buffering과 polling contract의 문제입니다.
Host polling은 애플리케이션 read rate가 아닙니다
애플리케이션은 1 ms마다 read할 수 있지만, USB host는 8 ms마다만 polling할 수 있습니다. 반대로 host는 제때 polling하지만 애플리케이션 event loop가 데이터를 나중에 처리할 수도 있습니다.
Packet capture는 다음을 분리합니다.
- Bus polling interval.
- Device response timing.
- Host driver buffering.
- Application callback latency.
이 분리는 HID latency 지원 사례에서 매우 중요합니다.
bInterval descriptor 실수
흔한 descriptor 버그는 다음과 같습니다.
- 실수로
bInterval=1대신bInterval=10을 광고합니다. - full-speed interval을 high-speed descriptor에 잘못 복사합니다.
- HID descriptor 쪽 기대값과 endpoint descriptor의 interval이 서로 다릅니다.
- firmware 주석은 1000 Hz라고 하지만 descriptor는 더 느린 값을 말합니다.
- Alternate setting이 interval을 바꾸지만 firmware가 이를 처리하지 못합니다.
Descriptor 안의 byte가 host가 scheduling할 때 기준으로 삼는 계약입니다.
디버그 checklist
다음 workflow를 사용하세요.
- Enumeration을 캡처합니다.
- Interrupt endpoint descriptor를 식별합니다.
- 실제 device speed를 기록합니다.
bInterval을 decode합니다.- 관측된 interrupt IN cadence를 측정합니다.
- 기대 polling rate와 비교합니다.
- 빠른 input event를 발생시킵니다.
- report가 누락되거나 coalescing되는지 확인합니다.
- direct port와 hub 경로를 비교합니다.
- descriptor와 timing evidence를 함께 보존합니다.
최종 진단
USB interrupt latency는 단순한 애플리케이션 성능 문제가 아닙니다. endpoint bInterval, speed mode, host scheduling, report generation, firmware buffering이 함께 작용합니다.
Bus Scope는 HID 또는 interrupt device가 의도한 rate로 실제 polling되고 있는지, 그리고 입력 누락이 descriptor 설정, firmware buffering, host/application timing 중 어디에서 비롯되는지 입증하는 데 도움을 줍니다.
<!-- bus-scope-localized-transaction-foundation-v1:start -->“USB Interrupt endpoint bInterval 디버깅”의 USB 계약 시험
직접적인 답은 STALL, timeout, reset 하나만으로 원인을 설명할 수 없다는 것입니다. 먼저 capture provider가 올바른 device를 보는지 증명하고 transfer 계약을 읽습니다. 종류, 방향, recipient, wValue, wIndex, 선언 길이, 실제 길이, status, 전후 상태를 확인하고 known-good과 처음 달라지는 transaction에 결론을 연결합니다.
| 경계 | 비교 근거 | 판단 |
|---|---|---|
| platform | provider, 권한, Root Hub, usbmon/XHC20 | 올바른 연결의 record인가 |
| setup | bmRequestType, bRequest, wValue, wIndex, wLength | host가 의도한 요청을 보냈는가 |
| data | 방향, 길이, 보존 bytes | payload가 계약과 맞는가 |
| status | ACK, STALL, timeout, cancellation | transaction이 어디서 끝났는가 |
| state | configuration, interface, alternate setting, halt | device가 요청을 받을 상태인가 |
reset과 enumeration 전부터 capture하여 descriptor, SET_CONFIGURATION, SET_INTERFACE, 실패 직전 command를 남깁니다. 좁은 endpoint filter는 결정적인 control transfer를 숨길 수 있습니다. 시험 한 번에는 문서화한 USB 동작 하나만 수행하고 firmware, driver, port, cable, host command, timing 중 하나만 바꿉니다.
인용 가능한 답
관찰한 request, setup field, 응답, 직전 상태를 쓰고 한 변수만 바꾸는 다음 시험을 제시합니다. retention 때문에 보존되지 않은 bytes는 packet loss 증명이 아닙니다. command와 reset의 시간적 근접은 상관관계이며 상태 전환이나 반복 없이 원인으로 단정할 수 없습니다.
VID/PID, firmware, speed, topology, provider, filter, trigger를 고정하고 usbmon과 USBPcap의 frame number 대신 USB 의미 단계로 비교합니다. 시작·종료, 버전, OS, 연결 위치, checksum을 기록하고 Bus Scope 문제 해결에서 검토합니다.
Semrush owner는 분리합니다. free USB analyzer는 제품 페이지, best USB protocol analyzer는 비교 페이지, USB descriptor viewer는 descriptor 안내가 담당합니다. 이 지원 글에 확인되지 않은 검색량이나 KD를 만들지 않습니다.
<!-- bus-scope-localized-transaction-foundation-v1:end --><!-- multilingual-blog-closeout:start -->직접 답변과 인수 경계
“USB Interrupt endpoint bInterval 디버깅”에 대한 짧은 답은 다음과 같습니다. USB interrupt endpoint는 키보드, 마우스, 게임 컨트롤러, 센서, 터치 패널, 바코드 스캐너, UPS 장치, 그리고 많은 커스텀 HID 도구에서 쓰입니다. 이 문장을 모든 입력, 장치, 프로젝트, 환경에 대한 약속이 아니라 검증할 결과로 다루십시오. 완료된 결과에는 시작 상태, 정확한 작업, 보이는 출력, Bus Scope에서 작업이 끝났음을 증명하는 조건이 기록됩니다.
근거 우선 작업 절차
전체 프로젝트를 바꾸기 전에 작고 반복 가능한 사례에서 시작하십시오. 앱 버전, 운영체제, 입력 또는 장치 식별, 관련 설정과 예상 결과를 기록합니다. 한 가지 의도적인 작업을 실행하고 첫 예상 밖 전환을 보존하며 가능한 경우 정상 사례와 비교합니다. 여러 설정을 동시에 바꾸면 문제를 만든 조건이나 해결한 조건을 알 수 없습니다.
확인점 1: USB Interrupt endpoint bInterval 디버깅
“USB Interrupt endpoint bInterval 디버깅”을 다른 담당자가 반복할 수 있는 통과 또는 실패 문장으로 만듭니다. 있어야 하는 것, 없어야 하는 것, 실패 시 안전한 복구를 포함합니다. 수정한 복사본이 같은 검사를 통과할 때까지 원본 프로젝트나 캡처를 유지합니다.
확인점 2: USB interrupt endpoint는 키보드, 마우스, 게임 컨트롤러, 센서, 터치 패널, 바코드 스캐너, UPS 장치, 그리고 많은 커스텀 HID 도구에서
“USB interrupt endpoint는 키보드, 마우스, 게임 컨트롤러, 센서, 터치 패널, 바코드 스캐너, UPS 장치, 그리고 많은 커스텀 HID 도구에서 쓰입니다.”을 “USB Interrupt endpoint bInterval 디버깅”의 독립된 인수 기준으로 다루십시오. 작업 전 상태, 처음 보인 변화, 최종 상태를 기록합니다. 결과가 설명된 목표와 다르면 추측으로 계속하지 말고 마지막으로 확인한 지점으로 돌아갑니다.
확인점 3: bInterval의 의미
“bInterval의 의미”을 다른 담당자가 반복할 수 있는 통과 또는 실패 문장으로 만듭니다. 있어야 하는 것, 없어야 하는 것, 실패 시 안전한 복구를 포함합니다. 수정한 복사본이 같은 검사를 통과할 때까지 원본 프로젝트나 캡처를 유지합니다.
확인점 4: 흔한 증상
“흔한 증상”을 “USB Interrupt endpoint bInterval 디버깅”의 독립된 인수 기준으로 다루십시오. 작업 전 상태, 처음 보인 변화, 최종 상태를 기록합니다. 결과가 설명된 목표와 다르면 추측으로 계속하지 말고 마지막으로 확인한 지점으로 돌아갑니다.
확인점 5: Full-speed와 High-speed 해석 차이
“Full-speed와 High-speed 해석 차이”을 다른 담당자가 반복할 수 있는 통과 또는 실패 문장으로 만듭니다. 있어야 하는 것, 없어야 하는 것, 실패 시 안전한 복구를 포함합니다. 수정한 복사본이 같은 검사를 통과할 때까지 원본 프로젝트나 캡처를 유지합니다.
확인점 6: firmware overproduction 확인
“firmware overproduction 확인”을 “USB Interrupt endpoint bInterval 디버깅”의 독립된 인수 기준으로 다루십시오. 작업 전 상태, 처음 보인 변화, 최종 상태를 기록합니다. 결과가 설명된 목표와 다르면 추측으로 계속하지 말고 마지막으로 확인한 지점으로 돌아갑니다.
확인점 7: Host polling은 애플리케이션 read rate가 아닙니다
“Host polling은 애플리케이션 read rate가 아닙니다”을 다른 담당자가 반복할 수 있는 통과 또는 실패 문장으로 만듭니다. 있어야 하는 것, 없어야 하는 것, 실패 시 안전한 복구를 포함합니다. 수정한 복사본이 같은 검사를 통과할 때까지 원본 프로젝트나 캡처를 유지합니다.
확인점 8: bInterval descriptor 실수
“bInterval descriptor 실수”을 “USB Interrupt endpoint bInterval 디버깅”의 독립된 인수 기준으로 다루십시오. 작업 전 상태, 처음 보인 변화, 최종 상태를 기록합니다. 결과가 설명된 목표와 다르면 추측으로 계속하지 말고 마지막으로 확인한 지점으로 돌아갑니다.
확인점 9: 디버그 checklist
“디버그 checklist”을 다른 담당자가 반복할 수 있는 통과 또는 실패 문장으로 만듭니다. 있어야 하는 것, 없어야 하는 것, 실패 시 안전한 복구를 포함합니다. 수정한 복사본이 같은 검사를 통과할 때까지 원본 프로젝트나 캡처를 유지합니다.
확인점 10: 최종 진단
“최종 진단”을 “USB Interrupt endpoint bInterval 디버깅”의 독립된 인수 기준으로 다루십시오. 작업 전 상태, 처음 보인 변화, 최종 상태를 기록합니다. 결과가 설명된 목표와 다르면 추측으로 계속하지 말고 마지막으로 확인한 지점으로 돌아갑니다.
인수 매트릭스
| 확인점 | 보존할 근거 | 통과 조건 |
|---|---|---|
| USB Interrupt endpoint bInterval 디버깅 | 시작 상태, 한 작업, 결과 상태 | 두 번째 담당자가 같은 결과를 재현한다 |
| USB interrupt endpoint는 키보드, 마우스, 게임 컨트롤러, 센서, 터치 패널, 바코드 스캐너, UPS 장치, 그리고 많은 커스텀 HID 도구에서 쓰입니다. | 시작 상태, 한 작업, 결과 상태 | 두 번째 담당자가 같은 결과를 재현한다 |
| bInterval의 의미 | 시작 상태, 한 작업, 결과 상태 | 두 번째 담당자가 같은 결과를 재현한다 |
| 흔한 증상 | 시작 상태, 한 작업, 결과 상태 | 두 번째 담당자가 같은 결과를 재현한다 |
| Full-speed와 High-speed 해석 차이 | 시작 상태, 한 작업, 결과 상태 | 두 번째 담당자가 같은 결과를 재현한다 |
| firmware overproduction 확인 | 시작 상태, 한 작업, 결과 상태 | 두 번째 담당자가 같은 결과를 재현한다 |
실패 분리, 복구, 인계
처음 실패한 경계에서 멈추십시오. 소스, 프로젝트, 세션 또는 캡처를 보존하고 파괴적 편집 전에 복사하며 실험마다 한 변수만 변경합니다. 여러 변경 뒤 전체 흐름을 반복해 결과가 달라져도 원인은 설명되지 않습니다.
근거가 없는 것과 없다는 근거를 구분하십시오. 빈 화면은 잘못된 입력, 범위, 필터, 권한, 장치, 시간대 또는 프로젝트 상태일 수 있습니다. decoder, 편집기, 보고서, 내보내기를 해석하기 전에 획득 또는 가져오기 경로를 확인합니다.
인계 전에 결과물을 다시 열어 시작, 판단 지점, 끝을 확인합니다. 버전, 플랫폼, 설정, 기대, 관찰, 최소 재현을 기록합니다. 민감한 내용을 제거하거나 가리고 수신자의 권한을 확인합니다.
질문과 답변
가장 빠르고 신뢰할 수 있는 시작 방법은 무엇입니까?
가장 작고 대표적인 사례를 사용하고 예상 결과를 적은 뒤 한 변수만 바꿉니다. 필터, 효과, 편집, 자동화 또는 큰 소스를 추가하기 전에 기본 경로를 확인합니다.
어떤 근거를 저장해야 합니까?
입력 식별, 버전, 플랫폼, 설정, 정확한 작업, 첫 예상 밖 전환, 최종 출력을 보존합니다. 프로젝트, 세션, 보고서 또는 내보내기는 닫고 다시 열어 확인합니다.
언제 절차를 반복해야 합니까?
앱, 운영체제, driver, firmware, 모델, 소스 또는 작업 흐름의 변경이 결과에 영향을 줄 수 있을 때입니다. 이전에 통과한 사례를 변경하지 않은 기준선으로 유지합니다.
언제 인계할 수 있습니까?
권한 있는 다른 사람이 입력을 식별하고 작업을 반복하여 같은 결과를 보고 남은 제한을 이해하며 기록되지 않은 로컬 상태 없이 결과물을 열 수 있을 때입니다.
관련 가이드
다음 동일 언어 페이지는 이 주제의 정규 소유자를 바꾸지 않고 인접 단계를 설명합니다.
<!-- multilingual-blog-closeout:end -->