PS/2 마우스 / 키보드 프로토콜


출처: http://www.Computer-Engineering.org

저자: Adam Chapweske

마지막 업데이트: 05/09/03

한글화 및 재편집: chhan, 2010-04-16

저작권 정보:

본문의 모든 내용은 아무 명시적, 묵시적 제한없이 있는 그대로 제공한다. 덧붙여, 상업적인 목적의 사용에도 제한을 두지 않는다. 또한 본 문서는 저작권법에 의해 보호되며, 본 문서의 복사 및 배포 시에는 반드시 출처, 저자, 날짜 및 저작권 정보를 포함하여야 한다.

개요:

본 문서는 PS/2 마우스, PS/2 키보드 및 AT 키보드의 물리적, 전기적 인터페이스에 대하여 기술한다. 만일, 명령이나 데이터 패킷 포맷, 또는 키보드나 마우스에 대해 더 많은 정보가 필요하면, 아래 문서를 참조하라:

The PS/2 (AT) Keyboard Interface

The PS/2 Mouse Interface

물리적 인터페이스:

PS/2의 물리적인 커넥터 형태는 다음 두 가지 스타일 중 하나이다: 5-DIN 또는 6-mini-DIN이며 두 커넥터는 전기적으로 같고, 둘 사이의 유일한 차이는 핀의 배치뿐이다. 이것은 간단하게 배선만 바꿈으로써 두 타입간 변환이 가능하다는 것을 의미한다. 컴퓨터와 연결되는 키보드 / 마우스 케이블은 보통 약 6피트 길이이며, 마일러 호일로 둘러싸인 4 – 6 가닥의 26 AWG와이어로 구성된다.

각 커넥터의 핀 아웃은 다음과 같다:

Male

(Plug)
Female

(Socket)
5-pin DIN (AT/XT):
1 - Clock
2 - Data
3 - Not Implemented
4 - Ground
5 - Vcc (+5V)

Male

(Plug)
Female

(Socket)
6-pin Mini-DIN (PS/2):
1 - Data
2 - Not Implemented
3 - Ground
4 - Vcc (+5V)
5 - Clock
6 - Not Implemented

6-pin SDL:
A - Not Implemented
B - Data
C - Ground
D - Clock
E - Vcc (+5V)
F - Not Implemented

전기적 인터페이스:

노트: 본 문서에서 호스트라는 용어는 컴퓨터 또는 키보드/마우스와 연결될 모든 장치를 의미하며, “디바이스는 키보드/마우스를 의미한다.

Vcc / Ground는 키보드/마우스에 전원을 공급한다. 키보드나 마우스는 호스트로부터 275mA이상의 전류를 사용하면 안 되며, 과도 전류 (서지)로부터 포트 및 장치가 보호되도록 고려되어야 한다.

이러한 서지는 키보드/마우스의 "hot-plugging" (컴퓨터의 전원이 켜진 상태에서 키보드/ 마우스를 제거하거나 설치할 경우)에 의해 발생할 수 있으며,

구형의 마더보드에서는 표면 실장형 퓨즈를 키보드나 마우스의 포트에 설치하여 서지로부터 보호했다. 그러나 이 퓨즈가 끊어지면, 기술자가 퓨즈를 교체하기 전에는 이 마더보드는 쓸모가 없었다.

대부분의 최신 마더보드는 자동 리셋되는 “Poly” 퓨즈를 사용해서 이 문제를 해결한다. 그러나 이것은 표준이 없고, 아직도 구형 마더보드가 많이 사용되고 있으므로, PS/2 마우스나 키보드를 “hot-plugging” 하지 않기를 권장한다.

요약: 전원 사양

Vcc = + 4.5 to +5.5V, 최대 허용 전류 = 275mA

데이터와 클럭 라인은 오픈 컬렉터이며, Vcc와 저항으로 풀업되어있다. 오픈 컬렉터는 로우 레벨과 하이 임피던스의 두 가지 상태 중 한가지를 가진다. 로우 상태일 때, 트랜지스터는 접지 레벨로 떨어진다.

하이 임피던스 상태일 때, 회로는 개방되며, 로우나 하이 상태로 드라이브 되지 않는다. 이때, 라인과 Vcc사이에 연결된 풀업저항은 라인을 하이 상태로 풀업시킨다 (만일 라인이 개방되어 로우 상태로 풀 다운시킬 디바이스가 없을 경우).

여기서 풀업 저항의 값은 그다지 중요하지 않으며 1 ~ 10 kOhm 정도면 적당하다. 보통 저항 값이 커지면 소비전력이 감소하고, 저항값이 작아지면 응답시간(rise time)이 빨라진다. 일반적인 오픈 컬렉터 인터페이스는 아래와 같다:


그림1: 일반적인 오픈 컬렉터 인터페이스.

데이터와 클럭은 마이크로컨트롤러의 A B 핀으로 읽는다. 두 라인 모두 +5V로 풀업 되어있지만, C D핀이 로직 하이 상태가 된다면 라인은 로우 상태로 풀다운 될 것 이다. 결과적으로 데이터 라인은 반전되어 D와 같아지고, 클럭 라인은 C와 같아진다.


통신: 일반사항 설명

PS/2 마우스와 키보드는 양방향 동기 직렬 프로토콜로 구현된다. 두 라인 모두 하이상태 (오픈 컬렉터)일 때 통신 버스는 대기 상태가 되며, 마우스나 키보드로 데이터 전송을 할 수 있는 상태이다. 호스트는 통신 버스를 통하여 통신 상태를 제어할 수 있으며, 클럭 라인을 로우 상태로 떨어뜨리면 통신은 차단된다.

클럭 신호는 디바이스에서 생성한다. 만일 호스트에서 데이터를 전송하기를 원한다면,

우선 클럭을 로우로 떨어뜨려 디바이스로부터의 통신을 억제해야 한다. 그 다음 호스트는 클럭을 하이 상태로 되돌리고, 데이터 라인을 로우로 떨어뜨린다.

이 동작이 호스트의 전송 요청이며, 디바이스가 클럭 펄스 생성을 시작하는 신호가 된다.

요약: 버스 상태

데이터 = 하이, 클럭 = 하이: 대기 상태.

데이터 = 하이, 클럭 = 로우: 통신 차단.

데이터 = 로우, 클럭 = 하이: 호스트 전송 요청.

모든 데이터는 한번에 한 바이트가 전송되며, 각 바이트는 11 ~ 12 비트로 이루어진 프레임에 포함되어 전송된다. 프레임을 구성하는 비트는 다음과 같다:

l 1개의 시작 비트, 항상 ‘0’ 이다.

l 8개의 데이터 비트, 최하위 비트부터 전송된다.

l 1개의 패리티 비트 (홀수 패리티).

l 1개의 정지 비트, 항상 ‘1’ 이다.

l 1개의 승인(acknowledge) 비트 (host-to-device간 통신시)

패리티 비트는 데이터 비트에 1이 짝수 개이면 ‘1’ 로 셋트되고, 데이터 비트에 1이 홀수 개이면‘0’으로 리셋된다. 이와 같이 데이터 비트들의 ‘1’의 개수에 패리티 비트를 추가하여 ‘1’의 개수가 항상 홀수개가 되도록 한다. 패리티 비트는 통신 에러 검출용으로 사용된다.

키보드/마우스는 이 비트를 체크하여, 오류가 있다면 유효하지 않은 명령을 수신한 것으로 판단할 수 있다.

데이터를 디바이스에서 호스트로 전송 시 클럭 신호의 하강 에지에서 읽는다; 데이터를 호스트에서 디바이스로 전송 시 클럭 신호의 상승 에지에서 읽는다.

클럭 주파수는 반드시 10 ~ 16.7 kHz 범위 이내여야 한다. 이것은 클럭의 하이 레벨의 구간이30 ~ 50 마이크로 초이고, 로우 레벨도 30 ~ 50 마이크로 초 이내 임을 의미한다.

만일 당신이 키보드, 마우스 또는 호스트 쪽 에뮬레이터를 설계한다면, 당신은 패킷에서 데이터를 추출하고 가공해야 할 것이다. , 클럭이 변환된 후 안정화 시간 고려하면 15 ~ 25 마이크로 초 정도에 데이터를 추출하고 가공해야 한다는 이야기다.

정리하면, 키보드/마우스는 클럭 시그널을 생성하고, 호스트는 통신을 제어할 수 있는 권한을 가진다. 통신에서 타이밍은 매우 중요한 요소가 된다.

통신: Device-to-Host

주지한 것처럼 데이터와 클럭 라인은 오픈 컬렉터이다. 각 라인에는 풀업 저항이 설치되어 있으므로 대기 상태에서 버스는 하이 상태가 된다.

키보드 또는 마우스에서 데이터의 전송을 원할 때는, 우선 클럭 라인을 체크하여 로직 하이 레벨인지 확인한다. 만일 하이 상태가 아니면, 호스트가 통신을 차단하고 있는 것이며, 디바이스는 호스트가 차단을 해제할 때까지 전송할 데이터를 버퍼에 저장 해 놓아야 한다. 또한 클럭 라인은 디바이스가 데이터 전송을 시작하기 전에 최소 50 마이크로 초 동안 하이 레벨을 유지하여야 한다.

이전 섹션에서 언급한 바와 같이, 키보드나 마우스는 11비트 프레임의 시리얼 프로토콜을 사용한다. 이 비트는 다음과 같다:

l 1개의 시작 비트, 항상 ‘0’이다.

l 8개의 데이터 비트, 최하위 비트부터 전송된다.

l 1개의 패리티 비트 (홀수 패리티)

l 1개의 정지 비트, 항상 ‘1’이다.

키보드 / 마우스는 클럭이 하이 레벨일 때 데이터 라인에 비트를 쓴다. 이것을 클럭이 로우 레벨일 때 호스트에서 읽는다. 그림 2, 3에 이것을 나타내었다.

그림 2: Device-to-host 통신. 클럭이 하이 일 때 데이터 라인의 상태가 변화하며, 클럭이 로우 레벨 일 때, 데이터가 유효하다.


그림 3: 키보드에서 컴퓨터로 전송되는 “Q” (15h)의 코드를 스코프로 스캔 한 것이다.

채널 A가 클럭 신호; 채널 B는 데이터 신호.

---

클럭 주파수는 10 ~ 16.7 kHz 이다.

데이터 변환 구간의 클럭 펄스 상승 에지의 시간은 최소 5 마이크로 초는 되어야 한다.

데이터 변환 시점부터 클럭 펄스의 하강 에지까지의 시간은 최소 5마이크로 초에서 25 마이크로 초 이내여야 한다.

호스트는 클럭 라인을 최소 100마이크로 초 이상 로우 레벨로 떨어뜨림으로써 언제든지 통신을 차단할 수 있다. 만일 전송 중 11번째의 클럭 펄스가 나오기 전에 통신이 차단된다면, 디바이스는 반드시 전송을 중단시키고, 호스트가 클럭을 풀어줄 때 현재의 “chunk” 데이터의 재전송을 준비한다.

여기서 “chunk” 데이터는 make code, break code, device ID, mouse movement packet 등이 될 수 있다.

예를 들어, 만일 키보드가 두 바이트의 break code 중 두 번째 바이트를 전송하는 중에 인터럽트가 걸리면, break code의 전송 중지된 바이트만이 아니라 두 바이트 모두 재전송이 필요하다.

만일 호스트가, 첫 번째 하이에서 로우로 클럭이 변화하기 전, 또는 마지막 클럭 펄스의 하강에지 후에, 클럭을 로우로 떨어뜨리면(통신을 차단시키면) 키보드/마우스는 어떤 데이터이든 재전송을 할 필요가 없다.

그러나, 이 상태에서 전송이 필요한 새로운 데이터가 발생하면, 이것은 호스트가 통신을 재개할 때까지 버퍼에 저장되어야 한다. 키보드는 이러한 목적으로 16바이트의 버퍼를 가진다. 만일16바이트 이상의 키 입력이 발생한다면, 초과된 키 입력은 무시될 것이다.

또한 마우스는 가장 최신의 현재 무브먼트 패킷만 전송을 위해 저장한다.

통신: Host-to-Device

Host-to-Device 간 통신에서는 전송 패킷의 형태가 조금 다르다.

앞에서 주지한 것처럼, 클럭신호는 항상 PS/2 디바이스에서 생성한다.

만일 호스트가 데이터를 전송하기를 희망한다면,

다음과 같이 클럭 및 데이터 라인을 전송요청(Request-to-send)” 상태로 만들어주어야 한다:

l 클럭을 최소 100마이크로 초 간 로우 레벨로 만들어 통신을 차단시킨다.

l 이후 클럭을 하이로, 데이터를 로우로 떨어뜨려 전송요청 상태로 만든다.

이 전송요청을 디바이스는 10 밀리 초 이내에 검사해야 한다.

디바이스가 전송요청을 감지하면, 디바이스는 클럭 신호 발생을 시작하며, 8개의 데이터와 1개의 정지 비트를 받을 준비를 한다.

호스트는 클럭 라인이 로우일 때, 데이터 라인을 변화시키고, 디바이스는 클럭이 하이 레벨일 때 데이터를 읽을 수 있다. 이것은 device-to-host 간 통신과 반대된다.

정지 비트를 수신한 후, 디바이스는 호스트에게 마지막 클럭 펄스에서 데이터 라인을 로우로 만들어 수신 바이트에 대한 acknowledge 비트를 송신해야 한다.

만일 호스트가 11번째 클럭 펄스 이후에도 데이터 라인을 릴리이즈하지 않는다면, 디바이스는 데이터 라인이 릴리이즈 될 때까지 클럭 펄스 생성을 계속 할 것이다.

(디바이스는 에러를 생성할 것이다)

호스트는 11번째 클럭 펄스 이전(acknowledge 비트)에 전송을 중단(클럭을 최소 100 마이크로 초간 로우로 떨어뜨려서) 할 수 있다.

이러한 과정을 이해하기 쉽게 단계별로 설명하면 다음과 같다:

1. 클럭을 최소 100 마이크로 초 동안 로우 레벨로 유지한다.

2. 데이터 라인을 로우 레벨로 만든다.

3. 클럭을 릴리이즈한다(하이레벨).

4. 디바이스가 클럭을 로우레벨로 만들 때까지 대기.

5. 첫 번째 전송할 비트 값에 따라 데이터 라인을 셋 / 리셋 시킨다.

6. 디바이스가 클럭을 하이레벨로 만들 때까지 대기.

7. 디바이스가 클럭을 로우레벨로 만들 때까지 대기.

8. 나머지 7개 데이터 비트와 패리티 비트가 전송될 때까지 5 ~ 7 스텝 반복.

9. 데이터 라인을 릴리이즈한다(하이레벨).

10. 디바이스가 데이터 라인을 로우레벨로 만들 때까지 대기.

11. 디바이스가 클럭을 로우레벨로 만들 때까지 대기.

12. 디바이스가 데이터와 클럭을 릴리이즈 할 때까지 대기.

그림 4는 이 과정을 파형으로 보여주며, 그림 5는 호스트와 디바이스로부터 생성된 파형을 구분하여 보여준다.

“Ack” 비트를 위한 타이밍의 변화에 주목하라 클럭 라인이 하이가 되었을 때 데이터 라인의 변화가 발생하였다. (앞선 11비트들은 모두 로우상태에서 변화하였다)

그림 4: Host-to-Device 통신

그림 5: 좀 더 디테일 한 host-to-device 통신

그림 5에서, 호스트 쪽 타이밍 도를 (a) (b) 두 부분으로 나누었을 때, (a)는 호스트가 전송 초기화를 위해 클럭을 로우레벨로 떨어뜨린 후 디바이스가 클럭 펄스 생성을 시작할 때까지의 시간으로, 반드시 15 ms 보다 작아야 한다. (b)는 패킷을 전송하기 위한 시간으로, 반드시2ms 보다 작아야 한다. 만일 둘 중에 어떤 하나라도 시간 제한 조건이 충족되지 않는다면, 호스트는 에러를 발생시킬 것이다.

“ack”가 수신된 직후, 호스트는 (수신된) 데이터를 처리하는 동안 클럭을 로우레벨로 떨어뜨림으로써 통신을 차단시켜 놓을 수 있다.

그러나 만일 호스트가 보낸 명령이 응답이 필요한 명령이라면, 그 응답을 위해 호스트는 클럭 라인을 릴리이즈해야 하며, (명령 후)늦어도 20ms 안에 그 응답이 반드시 수신되어야 한다. 그렇지 않으면 오류가 발생할 것이다.

'Old category > 비밀의방' 카테고리의 다른 글

ps2 키보드 스캔  (0) 2011.10.16
PS/2 마우스  (0) 2011.10.15
PS/2 키보드  (0) 2011.10.15
시리얼통신 (synchronous)  (0) 2011.10.15
시리얼통신 (unsynchronous)  (0) 2011.10.15

+ Recent posts