지식/USB지식

USB 키보드 통신 파형 분석하기 2편

원원 2024. 9. 16. 19:03

안녕하세요. 1편에서는 기본적인 데이터해석 방법을 알아봤고 2편에서는 키보드의 통신파형을 알아보겠습니다.

키보드를 컴퓨터에 연결하면 장치연결감지,주소할당,장치설명요청 등등 하고  이후에 키보드에게 주기적으로 키를 입력할것이 있는지 물어봅니다. 키보드가 LS인 경우 10ms속도로 물어보고 FS인경우 1ms로 물어봅니다.
이 글에서는 키보드에게 주기적으로 키를 입력할것이 있는지, 어떤식으로 키보드가 입력을 알려주는지, 어떤방식으로 파형을 해석해야하는지 알아보겠습니다.

먼저 키보드를 컴퓨터에 연결하면, 자신이 어떤 장치인지 컴퓨터에게 알려줘야 합니다. 그래야지 키보드가 보내는 신호를 컴퓨터가 해석할 수 있습니다. 장치를 연결하면 장치설명요청(Device Descriptor Request)이 있는데 이때 자신의 VID, PID, MAXPOWER, INTERFACE 등 알려줍니다. 여기서는 자신이 어떤신호인지 알려주는 항목이 INTERFACE 입니다.

Interace Descriptor는 bDescriptorType가 0x04입니다.

bLength: 0x09
bDescriptorType : 0x04
bInterfaceNumber : 0x00
bAlternateSetting : 0x00
bNumEndPoint : 0x01
bInterfaceClass : 0x03
bInterfaceSubClass : 0x01
bInterfaceProtocol : 0x01
iInterface :  0x00

bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol의 값이 의미하는걸 확인해봐야하는데 해당값들은 USB-IF에서 확인을하라고합니다.


Defined Class Codes | USB-IF
위의 사이트에서 0x03는 HID라는 정보를 얻었습니다. bInterfaceSubClass와 bInterfaceProtocol을 확인하기위해서는 HID 문서를 봐야합니다. 

https://www.usb.org/sites/default/files/documents/hid1_11.pdf

bInterfaceClass : 0x03 (HID)

bInterfaceProtocol : 0x01 (Keyboard)

bInterfaceSubClass : 0x01(Boot Interface subclass)


HID의 버전이 1.11인 문서를 참고했는데 해당 버전이라고는 아래의 파형에 나와있습니다. (bcdHID)



이제 HID 1.11버전 문서를 참고해서 컴퓨터와 키보드가 보내는 파형을 해석해보겠습니다.
연결한 키보드는 LS이므로 컴퓨터가 키보드에게 10ms마다 주기적으로 데이터를 요청(폴링)합니다. 키보드는 준비되지 않았을경우 자동으로 NAK 응답을 합니다.


키보드에서 b를 입력한 경우입니다. 통신파형이 많아졌고 이중에 b의 정보가 있습니다.

중간에 8바이트가 있는데 여기에 키 값이 나와있습니다. 이 값을 해석하는 방법을 알아보겠습니다.

0번째 바이트는 Modifier keys이고 1번째 바이트는 Reserved이고 나머지는 Keycode 1~6입니다.
Modifier keys란 CTRL, SHIFT, ALT, GUI키를 의미하고 GUI키는 WIN 키입니다.

이제는 실제 파형을 보지않고 파형을 자동으로 해석해주는 패킷분석기를 사용하겠습니다.

LEFT CTRL을 눌렀을때 위와같이 데이터가 옵니다.

LEFT CTRL + LEFT SHIFT + LEFT ALT + LEFT GUI 키를 눌렀을경우 위와 같이 옵니다.

LEFT CTRL press => LEFT SHIFT press => LEFT ALT press => LEFT GUI press
=> LEFT GUI  release => LEFT ALT release => LEFT SHIFT release => LEFT CTRL release


Keycode는 HID 1.11문서에서는 안나와있고 다른 문서를 참고해야합니다.

https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf

53page에 keycode에 대한 내용이 있습니다.

A를 눌렀을때 04라고 나옵니다. 

A,B를 누르면 04 05가 나옵니다. 키보드에서 손을때면 00이 나옵니다.

A press => B press => B release => A release

keycode가 6바이트이므로 동시에 6개의 키를 누를 수 있고 6KRO (6-Key Roll Over) 라고 부릅니다.
NKRO (N-Key Roll Over)방식은 키를 6개 이상 누를 수 있습니다. (주로 게이밍 키보드에서 사용하는 방식)

NKRO 방식의 키보드에서 A를 눌렀을때입니다.  기본적으로 사용하는 방식과 다르다는것을 알 수 있습니다.


3편에서는 키보드를 usb에 연결했을때 키보드에서 주는 데이터를 알아보겠습니다.

'지식 > USB지식' 카테고리의 다른 글

USB 2.0 SOF 통신파형 알아보기  (0) 2024.05.12
USB2.0 데이터 신호 인코딩  (1) 2024.04.10
USB2.0 기본개념  (0) 2024.03.30