PS/2 키보드 인터페이스


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

저자: Adam Chapweske

마지막 업데이트: 04/01/03

저작권 정보

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

개요

본 문서는 ATPS/2 키보드와 관련된 하위-레벨 시그널 및 프로토콜, 스캔 코드, 명령 세트,초기화, 호환성 및 기타 정보 등을 포함한 모든 사항을 다루려고 한다. 밀접하게 관련되어 있는PC 키보드 컨트롤러에 대한 정보 또한 포함했다. 키보드 인코더와 관련된 모든 코드 샘플들은 마이크로 칩 사의 PIC 마이크로 컨트롤러의 어셈블리어로, 키보드와 관련된 모든 코드 샘플들은x86 어셈블리어로 작성되었다.

역사

오늘날 사용되고 있는 최고 인기 키보드들은 다음과 같다.

l USB 키보드: 모든 신규 컴퓨터(매킨토시와 IBM/호환)에 지원되는 최신 키보드.

l IBM/호환 키보드: 모든 최신 PC들이 이 장치를 지원하며 AT 키보드나 PS/2 키보드로도 알려짐. 인터페이스 하기에 가장 용의하며 본 문서의 주제이기도 함.

l ADB 키보드: 구 매킨토시 시스템의 Apple Desktop Bus에 연결

IBM은 각각의 주요 데스크 탑 컴퓨터 모델들과 함께 신규 키보드를 출시했다. 초기 IBM PC와 나중에 출시된 IBM XT“XT 키보드라 부르는 장치를 사용했다. 이 키보드는 현재 쓸모가 없으며 최신의 키보드와 상당히 다르기 때문에 XT 키보드는 본문에서 다루고 있지 않다. 이후IBM AT 시스템이 나왔으며 IBM PS/2가 뒤를 이었다. IBM AT 시스템과 IBM PS/2는 오늘날 우리가 사용하는 키보드를 도입했으며 본문의 주제이기도 하다.

AT 키보드와 PS/2 키보드는 매우 비슷한 장치들이지만 PS/2 장치는 더 작은 커넥터를 사용하고 몇몇 추가적인 기능들을 지원했다. 그래도 여전히 PS/2 AT 시스템과 역호환 되었고 몇 가지 기능들이 추가되었다. (소프트웨어 역시 이전 기종과 호환되기를 원했기 때문이다.) IBM의 세 가지 주요 키보드들에 대해 요약하면 다음과 같다.

IBM PC/XT 키보드(1981):

  • 83
  • 5-pin DIN 커넥터
  • 단순한 단방향 시리얼 프로토콜
  • 현재 스캔 코드 세트1(scan code set 1)이라고 칭하는 것을 사용
  • host-to-keyboard 명령어 없음

IBM AT 키보드 (1984) - XT 시스템(1)과 호환되지 않음

  • 84 -101
  • 5-pin DIN 커넥터
  • 양방향 시리얼 프로토콜
  • 현재 스캔 코드 세트2(scan code set 2)이라고 칭하는 것을 사용
  • 8개의 host-to-keyboard 명령어

IBM PS/2 키보드 (1987) - AT 시스템과 호환 가능, XT 시스템(1)과 호환되지 않음

  • 84 - 101
  • 6- mini-DIN 커넥터
  • 양방향 시리얼 프로토콜
  • 선택적인 스캔 코드 세트 3제공(optional scan code set 3)
  • 17개의 host-to-keyboard 명령어

PS/2 키보드는 기존 AT 장치를 확장한 것으로 몇몇 추가적인 host-to-keyboard 명령어를 지원하고 더 작은 커넥터를 특징으로 한다. 이 두 가지가 PS/2 키보드와 AT 키보드의 차이점이다.

오늘날 “AT 키보드“PS/2 키보드는 단지 그 키보드 커넥터 모양의 차이를 뜻하며, 어떤 키보드가 어떤 설정과 명령을 지원하는지 여부는 모두 다를 수 있다. 예를 들어, 내가 지금 사용하고 있는 키보드는 PS/2 스타일의 커넥터를 가지고 있지만, 7가지 명령어는 완전히 지원하고, 2개는 부분적으로, 또 나머지는 단지 “acknowledges” 할 뿐이다. 또한 내 시험용 키보드 역시PS/2-스타일의 커넥터를 가지고 있지만 기존 PS/2의 모든 특징과 명령어 및 (몇몇 추가사항)을 지원한다. 따라서 최신의 컴퓨터들은 표준이 아닌 호환성으로 취급하는 것이 중요하다.일반적이지 않은 기능들을 지원하는 키보드 관련 장치를 계획하고 있다면 이 장치가 몇몇 시스템에는 작동할지 모르지만 다른 시스템에는 안될 수도 있다.

최신 PS/2 (AT) 호환 키보드

  • 제한 없음. (보통 101 ~ 104)
  • 5-핀 또는 6-핀 커넥터; 보통 어댑터가 포함됨
  • 양방향 시리얼 프로토콜
  • 스캔 코드 세트 2 (scan code set 2)만 보장됨
  • 모든 명령어에 응답(acknowledge)하나 모든 명령어에 작동하지 않을 수 있음

각주: 1) XT 키보드는 AT PS/2시스템에서 사용했던 것과 완전히 다른 프로토콜을 사용하며 이로 인해 신규 PC와 호환이 되지 않는다. 하지만 몇몇 키보드 컨트롤러가 XT AT(PS/2)키보드 둘 다 (스위치, 점퍼 및 자동 감지를 통하여)지원했던 과도기가 있었다. 또한 몇몇 키보드들은 두 가지 모두의 타입에서 (역시, 스위치나 자동 감지 기능을 통해) 작업하도록 만들어 졌다. 그런 PC나 키보드도 있지만 어쨌든 XT키보드는 최신의 컴퓨터들과 호환되지 않는다.

일반적 설명

키보드는 매트릭스 구조로 구성되어 있으며 키들은 키보드 인코더라 부르는 온 보드 프로세서에 의해 모니터링 된다. 명시한 프로세서는(1) 어떤 키가 눌러지거나 키에서 손이 떼어 졌는지,그리고 올바른 데이터가 호스트로 보내지는지 모니터링 한다. 또한 모든 디바운싱을 처리하며 필요한 경우 데이터를 16바이트 버퍼에 저장한다. 마더보드는 키보드 컨트롤러(2)를 포함하고 있는데 이 컨트롤러는 키보드에서 받은 모든 데이터를 디코딩하고 소프트웨어에서 발생되고 있는 사항들을 알려주는 역할을 한다. 호스트와 키보드간 커뮤니케이션은 IBM 프로토콜을 사용한다.

각주 1) 원래, IBM은 인텔8048을 마이크로 컨트롤러를 키보드 인코더로 사용했다. 현재는 다수의 다른 제조사들에서도 이용할 수 있는 다양한 키보드 인코더 칩들이 있다.

각주 2) 원래, IBM은 인텔8048을 마이크로 컨트롤러를 키보드 컨트롤러로 사용했다. 이는 마더보드 칩 셋에 통합된 호환 가능한 장치들로 대체 되었다. 키보드 컨트롤러에 대해서는 후에 본문에서 다루어 진다.

인터페이스/ 프로토콜

AT PS/2 키보드는 PS/2 마우스와 같은 프로토콜을 사용한다. 이 프로토콜에 대한 자세한 정보를 원하면 The PS2 Mouse_Keyboard Protocol.doc 문서를 참조한다.

스캔 코드

여러분의 키보드 프로세서는 대부분의 시간을 키 매트릭스 스캐닝 또는 모니터링 하는데 사용한다. 만약 프로세서를 통해 어떤 키가 눌러지고 있거나 키에서 손을 떼거나 또는 키를 계속 누른 채로 있는 것이 검출되면 키보드는 한 패킷의 스캔 코드 정보를 컴퓨터로 전송한다. 스캔 코드에는 서로 다른 “make code”“break code”가 있다. 메이크 코드는 키가 눌러지거나 지연되었을 때 전송되며 브레이크 코드는 키에서 손을 떼었을 때 전송된다. 모든 키에는 고유의 메이크 코드와 브레이크 코드가 할당되며, 호스트는 스캔 코드로 어떤 키에 이벤트가 생겼는지 정확히 판단할 수 있다. 모든 키의 메이크와 브레이크 코드 세트는 스캔 코드 세트로 구성되어 있으며1, 2, 3으로 이름 붙여진 세 가지 기준의 스캔 코드 세트들이 있다. 모든 최신 키보드들은 기본값으로 세트 2로 선택되어 있다(1).

그렇다면 각각 키에 대한 스캔 코드가 무엇인지 어떻게 알까? 안타깝게도 이를 계산하기 위한 간단한 공식은 없다. 만약 한 특정한 키에 대한 메이크 코드나 브레이크 코드가 뭔지 알고 싶다면 표에서 찾아봐야 한다. 세 가지 스캔 코드 세트에 있는 모든 메이크 코드와 브레이크 코드에 대한 표를 다음과 같이 구성하였다.

  • Scan Code Set 1오리지널 XT 스캔 코드 세트: 몇몇 최신 키보드들에 의해 지원됨
  • Scan Code Set 2모든 최신 키보드에 대한 디폴트 스캔 코드 세트
  • Scan Code Set 3선택적 PS/2 스캔 코드 세트, 거의 사용되지 않음

각주1) 원래, AT 키보드는 세트 2만을 지원했고, PS/2 키보드는 세트 2에 디폴트 되어 있긴 하지만 3개 세트 모두 지원했다. 가장 최근의 키보드는 PS/2 장치와 같지만 본인은 세트 1, 세트 3, 또는 둘 모두 지원하지 않은 몇몇 경우를 보았다.

하위 레벨 PC 프로그래밍을 해 본적이 있다면 키보드 컨트롤러가 세트 1 스캔 코드를 디폴트로 공급한다는 것을 아마 알지도 모르겠다. 이는 키보드 컨트롤러가 입력되는 모든 스캔 코드를 세트 1으로 변환하기 때문이다. (이는 XT시스템을 위해 작성된 소프트웨어와 호환성을 계속 유지한 데서 생겨난 것이기 때문이다.) 그러나 키보드의 통신 라인으로 전송되는 것은 여전히 세트2 스캔 코드이다.

메이크 코드, 브레이크 코드, 타입매틱 반복

키가 눌러질 때마다 그 키의 메이크 코드가 컴퓨터로 전송된다. 메이크 코드는 키보드 상에 있는 키와 대응되며, 메이크 코드가 그 키에 인쇄된 문자를 직접 의미하지는 않는다.

메이크 코드와 아스키 코드 간에 어떤 명확한 관계가 없다는 말이다. 스캔 코드를 문자나 명령어로 옮기는 것은 호스트에게 달려있다.

대부분의 세트 2 메이크 코드들은 길이가 1바이트 밖에 되지 않지만 메이크 코드의 길이가 2또는 4바이트인 몇몇 확장 키 들이 있다. 이러한 메이크 코드들은 코드의 첫 번째 바이트가E0h이기 때문에 이로써 식별 가능하다.

메이크 코드가 키가 눌러질 때마다 컴퓨터로 전송되는 것처럼, 브레이크 코드는 키에서 손을 뗄 때마다 전송된다. 모든 키에 자체 고유 메이크 코드가 있는 것처럼 자체 고유의 브레이크 코드도 있다(1). 하지만 다행히도 키의 브레이크 코드를 이해하기 위해 검색 표를 항상 사용할 필요는 없다. 즉 메이크 코드와 브레이크 코드 간에 일정한 규칙이 존재한다. 대부분의 세트 2 브레이크 코드는 2 바이트의 길이이며, 첫 번째 바이트는 F0h, 두 번째 바이트는 그 키에 대한 메이크 코드와 같다. 확장 키의 브레이크 코드는 보통 3바이트 이며 첫 째, 두 번째 바이트는 각각 E0h, F0h이고, 마지막 바이트는 그 키의 메이크 코드와 같다. 예를 들어, 몇몇 키들에 대한 세트 2 메이크 코드와 브레이크 코드는 다음과 같다.

(세트 2)

메이크코드

(세트 2)

브레이크 코드

“A”

1C

F0, 1C

“5”

2E

F0, 2E

“F10”

09

F0, 09

오른쪽 화살표

E0, 74

E0, F0, 74

오른쪽 “Ctrl”

E0, 14

E0, F0, 14

: 문자 G가 워드 프로세서에 나타나려면 어떤 일련의 메이크 코드와 브레이크 코드가 컴퓨터로 전송되어야 할까요? G는 대문자이기 때문에 발생되어야 하는 일련의 이벤트들은 “Shift”키를 누르고, “G” 키를 누른다. 그 후 “G”키에서 손을 뗀 다음 “Shift”키에서도 뗀다.

이러한 이벤트들과 관련된 스캔 코드들은 다음과 같다. "Shift" 키에 대한 메이크 코드(12h), “G”키에 대한 메이크 코드(34h), “G”키에 대한 브레이크 코드(F0h, 34h), "Shift" 키에 대한 브레이크 코드 (F0h,12h). 따라서 컴퓨터로 전송되는 데이터는 12h, 34h, F0h, 34h, F0h, 12h가 될 것이다.

만약 키를 누르면 키의 메이크 코드가 컴퓨터로 전송된다. 만약 키를 누르고 나서 계속 누른 채로 있다면 그 키는 타입매틱이 된다. 타입매틱이란 키에서 손을 떼거나 다른 키를 누를 때까지 키보드가 계속해서 그 키의 메이크 코드를 전송하는 것이다. 이를 확인하기 위해서는 텍스트 에디터를 열고 “A”키를 계속 눌러본다. 처음 키를 누르면 “a”가 화면에 즉시 뜬다. 조금 지나면, A키에서 손을 뗄 때까지 또 다른 “a”가 전체 a줄의 뒤를 뒤따라 뜰 것이다. 여기에는 두 가지 중요한 매개변수들이 있는데 첫 번째와 두 번째 a사이의 타입매틱 지연과 타입매틱 지연 후에 초당 몇 개의 문자가 화면에 나타나는 지를 보여주는 타입매틱 비율이 있다. 타입매틱 지연은0.25초부터 1.00초까지 있으며 타입매틱 비율은 2.0 cps(초당 문자 수)부터 30.0 cps까지 있다. 타입매틱 비율/지연 설정(0xF3) 명령어를 사용하여 타입매틱 비율과 지연을 설정할 수 있다.

타입매틱 데이터는 키보드 내에 버퍼링되지 않는다. 한 개 이상의 키가 계속해서 눌러질 경우에는 눌러진 마지막 키만이 타입매틱 된다. 타입매틱은 다른 키가 계속 눌러져 있다 하더라도 반복된 다음 키에서 손을 떼었을 때 멈춘다.

각주 1)”Pause/Break” 키는 스캔 코드 세트 1, 2에 브레이크 코드가 없다. 이 키가 눌러지면 메이크 코드가 전송되지만, 키에서 손을 떼었을 때는 어떤 것도 발송되지 않는다. 따라서 이 키는 손을 떼었다는 것을 구별할 수 없다.

리셋

전원을 켰을 때, 또는 소프트웨어 리셋(“리셋명령어 참고)에서 키보드는 BAT(Basic Assurance Test, 기초 검사 테스트)라고 하는 자가 진단 테스트를 실시하고 다음과 같은 디폴트 값을 설정한다.

  • 타입매틱 지연 500 ms.
  • 타입매틱 비율 10.9 cps.
  • 스캔 코드 세트2
  • 모든 키를 typematic/make/break로 설정

BAT에 진입하면, 키보드는 3개의 LED 표시기를 인에이블하고, BAT이 완료되면 LED를 끈다.이 때 BAT 완료 코드로 0xAA (BAT성공) 0xFC (에러)를 호스트에 전송한다. BAT완료 코드는 전원이 켜진 후에 500~750 msec 안에 전송되어야 한다.

본인이 테스트해 본 많은 키보드들이 BAT완료 코드가 전송된 이후까지 클럭과 데이터 라인을 무시한다. 따라서 통신 억제 상태(클럭 라인 로우 상태)가 키보드가 BAT 완료 코드를 전송하는 것을 막지 못할 수도 있다.

명령어 셋

호스트가 키보드에게 전송할 수 있는 명령에 대한 몇 가지 중요 사항:

  • 키보드는 명령어를 받을 때 출력 버퍼를 클리어한다.
  • 키보드가 잘못된 명령어나 인자를 받았다면 재전송"(0xFE)으로 응답한다.
  • 명령어를 처리하는 동안 키보드는 어떠한 스캔 코드도 전송해서는 안 된다.
  • 키보드는 인자(명령에 따른) 바이트 수신대기 중, 또 다른 명령어를 받는다면 이전 명령어를 버리고 새로운 명령을 처리해야 한다.

다음은 호스트가 키보드에 전송할 수 있는 명령어 목록이다.

  • 0xFF (리셋) – 키보드는 "ack"(0xFA)로 응답한 후 리셋 모드로 진입한다(리셋 섹션 참고).
  • 0xFE (재전송) – 키보드는 마지막으로 전송된 바이트를 재전송한다. 단 마지막으로 전송된 바이트가 "재전송"(0xFE)일 경우는 예외이다. 이런 경우에는 키보드가 마지막non-0xFE 바이트를 재전송한다. 이 명령어는 수신 상태 오류를 표시하기 위해 호스트가 사용한다.

다음의 6가지 명령어들은 키보드가 어떤 모드에 있든 상관없이 전송할 수 있지만, 키보드가 모드 3에 있을 때만 키보드의 동작에 영향을 준다. (, 스캔 코드 세트 3으로 설정될 때)

  • 0xFD (키 타입 메이크 설정) – 특정 키의 브레이크 코드와 타입매틱 반복을 디스에이블한다. 키보드는 "ack"(0xFA)로 응답한 후 키 스캔을 중지하고 (키 스캔을 하고 있었다면), 호스트로부터 전달받은 키 목록을 읽는다. 이 키들은 세트 3 메이크 코드로 명시된다. 키보드는 각각의 메이크 코드에 “ack”로 응답한다. 호스트는 유효하지 않은 세트 3메이크 코드를 전송함으로써 키 목록 전달을 끝낸다(이렇게 하지 않으면 키보드는 전송 종료가 언제인지 알 수가 없을 것이다). 그리고 나서 키보드는 키 스캐닝을 다시 가능하게 한다.
  • 0xFC (키 타입 메이크/브레이크 설정) – 이것이 타입매틱 반복을 불가능하게 한다는 점을 제외하고는 이전 명령과 같다.
  • 0xFB (키 타입 타입매틱 설정) – 이것은 브레이크 코드를 불가능하게 한다는 것을 제외하고 이전 두 개 명령과 같다.
  • 0xFA (모든 키를 타입매틱/메이크/브레이크로 설정) – 키보드는 "ack"(0xFA)로 응답하고, 모든 키를 기본설정으로 설정한다(메이크, 브레이크, 타입매틱 반복으로 스캔코드 생성).
  • 0xF9 (모든 키를 메이크로 설정) – 키보드는 “ack"(0xFA)로 응답한다. 모든 키에 적용되는 것을 제외하고 0xFD와 같다.
  • 0xF8 (모든 키를 메이크/브레이크로 설정) – 키보드는 “ack" (0xFA)로 응답한다.

모든 키에 적용되는 것을 제외하고 0xFC와 같다.

  • 0xF7 (모든 키를 타입매틱으로 설정) – 키보드는 “ack" (0xFA)로 응답한다.

모든 키에 적용되는 것을 제외하고 0Xfb와 같다.

  • 0xF6 (디폴트 설정) – 기본 타입매틱 비율/지연(10.9cps / 500ms), 키 타입(모든 키의 타입매틱/메이크/브레이크), 스캔 코드 세트2 로 설정한다.
  • 0xF5 (디스에이블) – 키보드는 키 스캐닝을 멈추고 디폴트 값을 읽어 들인다.

(“디폴트 설정명령어 참조) 그리고 추가 지시사항을 기다린다.

  • 0xF4 (인에이블) – 이전 명령어를 사용하여 디스에이블한 후 키보드를 다시 인에이블 한다.
  • 0xF3 (타입매틱 비율/지연 설정) – 호스트는 다음과 같은 타입매틱 비율과 지연을 정의하는 하나의 인수 바이트를 같이 전송한다.

타입매틱 비율

비트

0 ~ 4

비율

(cps)

비트

0 ~ 4

비율

(cps)

비트

0 ~ 4

비율

(cps)

비트

0 ~ 4

비율

(cps)

00h

30.0

08h

15.0

10h

7.5

18h

3.7

01h

26.7

09h

13.3

11h

6.7

19h

3.3

02h

24.0

0Ah

12.0

12h

6.0

1Ah

3.0

03h

21.8

0Bh

10.9

13h

5.5

1Bh

2.7

04h

20.7

0Ch

10.0

14h

5.0

1Ch

2.5

05h

18.5

0Dh

9.2

15h

4.6

1Dh

2.3

06h

17.1

0Eh

8.6

16h

4.3

1Eh

2.1

07h

16.0

0Fh

8.0

17h

4.0

1Fh

2.0

타입매틱 지연

비트 5 ~ 6

지연 ()

00b

0.25

01b

0.50

10b

0.75

11b

1.00

  • 0xF2 (ID 얻기) – 키보드는 2바이트의 디바이스ID 0xAB, 0x83를 전송한다. (0xAB가 먼저 전송된 후 0x83이 전송된다.)
  • 0xF0 (스캔 코드 셋 설정) – 키보드는 “ack”로 응답한 후, 호스트에서 온 인수 바이트를 읽는다. 이 인수는 스캔 코드 세트 1, 2, 3에 대해 각각 0x01, 0x02, 0x03이 된다. 키보드는 이 인수 바이트에 “ack”로 응답한다. 만일 인수 바이트가 0x00이면, 키보드는“ack”와 함께 현재의 스캔 코드 세트를 전송한다.
  • 0xEE (에코) – 키보드는 "Echo" (0xEE)로 응답한다.
  • 0xED (세트/리셋 LED) – 호스트는 이 명령 후에 하나의 인수 바이트를 전송하는데, 이것은 키보드의 Num Lock, Caps Lock, Scroll Lock LED 상태를 명시한다. 이 인수 바이트는 다음과 같이 정의된다:

MSB 7

6

5

4

3

2

1

LSB 0

항상 0

항상 0

항상 0

항상 0

항상 0

Caps Lock

Num Lock

Scroll Lock

l Scroll Lock – Scroll Lock LED 꺼짐 0 / 켜짐 1

l Num Lock – Num Lock LED 꺼짐 0 / 켜짐 1

l Caps Lock – Caps Lock LED 꺼짐 0 / 켜짐 1

* 오리지널 PS/2 키보드에서만 사용 가능.

i8042 키보드 컨트롤러

지금까지 본문 내용의 요점은 모두 하드웨어의 관점에서 내용이 다루어졌다. 하지만 호스트PC를 위한 키보드 관련 로우 레벨 소프트웨어를 작성한다고 할 때, 직접 키보드와 통신하지 않을 것이다. 대신 키보드 컨트롤러가 키보드와 주변장치버스간 인터페이스를 제공할 것이다. 이 컨트롤러는 신호 변환, 해독, 스캔 코드와 명령어 처리뿐만 아니라 모든 신호레벨과 프로토콜의 세부사항 등을 처리한다.

인텔 8042/호환 마이크로컨트롤러는 PC의 키보드 컨트롤러로 사용된다. 최신의 컴퓨터에서 이러한 마이크로컨트롤러는 마더보드의 칩셋 안에 포함되어 있는데 이 칩셋은 다수의 컨트롤러들을 하나의 패키지로 통합시킨다. 그렇지만 이것이 수행하는 기능은 여전히 동일하며, 키보드 컨트롤러는 아직도 흔히 8042라고 부른다.

마더보드에 따라 키보드 컨트롤러는 "AT-호환" 모드나 "PS/2-호환" 모드라는 2가지 모드 중 한 가지로 작동될 수 있다. 후자는 PS/2 마우스를 마더보드가 지원할 때 사용된다. 이 경우라면, 8042는 키보드 컨트롤러와 마우스 컨트롤러로 기능한다. 키보드 컨트롤러는 키보드 포트 연결 방식에 따라 어떤 모드를 사용하고 있는지를 자동으로 알아낸다.

8042는 다음과 같은 레지스터들을 포함한다.

  • 1바이트 입력 버퍼- 키보드로부터 수신된 바이트 포함; 읽기 전용
  • 1바이트 출력 버퍼- 키보드로 전송할 바이트 포함; 쓰기 전용
  • 1바이트 상태 레지스터- 8개의 상태 플래그; 읽기 전용
  • 1바이트 컨트롤 레지스터 - 7개의 컨트롤 플래그; 읽기/쓰기

처음 세 개의 레지스터들(입력, 출력, 상태)은 포트 0x60 0x64을 통해 직접 접근이 가능하다. 마지막 레지스터(컨트롤)읽기 명령 바이트명령을 사용하여 읽고, "쓰기 명령 바이트"명령을 사용하여 쓴다. 다음 표는 주변장치 포트들이 8042를 인터페이스 하는데 사용되는 방법을 보여준다.

포트

읽기 / 쓰기

기능

0x60

읽기

입력 버퍼 읽기

0x60

쓰기

출력 버퍼 쓰기

0x64

읽기

상태 레지스터 읽기

0x64

쓰기

명령 전송

포트 0x64에 쓰는 것은 레지스터에 쓰지 않고, 8042가 번역하도록 명령어를 전송한다. 명령어가 매개변수를 포함하면 이 매개변수는 포트 0x60으로 전송된다. 마찬가지로 명령어에 의해 수신된 어떤 결과도 포트 0x60로 부터 읽을 수 있다.

8042에 대해 설명할 때 본인은 종종 8042의 물리적 I/O 핀을 참고하는데, 이것은 아래와 같이 규정된다.

AT-호환 모드

포트 1 (입력 포트)

포트 2 (출력 포트)

포트 3 (테스트 포트)

명칭

기능

명칭

기능

명칭

기능

0

P10

정의되지 않음

0

P20

시스템 리셋

1: 정상

0: 리셋

0

T0

키보드 클럭

(입력)

1

P11

정의되지 않음

1

P21

게이트A20

1

T1

키보드 데이터

(입력)

2

P12

정의되지 않음

2

P22

정의되지 않음

2

--

정의되지 않음

3

P13

정의되지 않음

3

P23

정의되지 않음

3

--

정의되지 않음

4

P14

외부 램

1: 인에이블

0: 디스에이블

4

P24

입력 버퍼 꽉참

4

--

정의되지 않음

5

P15

Manufacturing setting

1: 인에이블

0: 디스에이블

5

P25

출력 버퍼 비었음

5

--

정의되지 않음

6

P16

디스플레이 타입

1: 컬러

0: 단색

6

P26

키보드 클럭

1: 클럭 풀다운

0: 하이임피던스

6

--

정의되지 않음

7

P17

키보드 금지

1: 키보드 가능

0: 키보드 금지

7

P27

키보드 데이터

1: 데이터 풀다운

0: 하이임피던스

7

--

정의되지 않음

PS/2-호환 모드

포트 1 (입력 포트)

포트 2 (출력 포트)

포트 3 (테스트 포트)

명칭

기능

명칭

기능

명칭

기능

0

P10

키보드 데이터

(입력)

0

P20

시스템 리셋

1: 정상

0: 리셋

0

T0

키보드 클럭

(입력)

1

P11

마우스 데이터

(입력)

1

P21

게이트A20

1

T1

키보드 데이터

(입력)

2

P12

정의되지 않음

2

P22

마우스 데이터:

1: 풀다운

0: 하이임피던스

2

--

정의되지 않음

3

P13

정의되지 않음

3

P23

마우스 클럭:

1: 풀다운

0: 하이임피던스

3

--

정의되지 않음

4

P14

외부 램

1: 인에이블

0: 디스에이블

4

P24

키보드 IBF인터럽트:

1: IRQ 1허가

0: IRQ 1비허가

4

--

정의되지 않음

5

P15

Manufacturing setting

1: 인에이블

0: 디스에이블

5

P25

마우스 IBF인터럽트:

1: IRQ 12허가

0: IRQ 12비허가

5

--

정의되지 않음

6

P16

디스플레이 타입

1: 컬러

0: 단색

6

P26

키보드 클럭

1: 풀다운

0: 하이임피던스

6

--

정의되지 않음

7

P17

키보드 금지

1: 키보드 가능

0: 키보드 금지

7

P27

키보드 데이터

1: 풀다운

0: 하이임피던스

7

--

정의되지 않음

(노트: 키보드 컨트롤러 데이터시트를 볼 때 혼동 될 수 있다 입력 버퍼를 출력 버퍼로 부를 것이고 반대로도 부를 것이다. 이는 컨트롤러용 펌웨어를 작성하는 사람의 관점에서는 일리가 있지만 컨트롤러를 인터페이스 하는데 익숙해진 사람에게는 문제가 될 수 있다. 본 문서에서는,나는 단지 입력 버퍼는 키보드로부터의 입력을 의미하는 것으로, 출력버퍼는 키보드로 전송된 출력을 의미하는 것으로 정의한다.)

상태 레지스터:

8042의 상태 레지스터 플래그들은 포트 0x64로부터 읽을 수 있다. 플래그는 에러 정보, 상태정보를 포함하고 데이터가 입력 및 출력 버퍼에 존재하는지 여부를 나타내며, 다음과 같이 명시된다:

MSB 7

6

5

4

3

2

1

LSB 0

AT-호환 모드

PERR

RxTO

TxTO

INH

A2

SYS

IBF

OBF

PS/2 호환 모드

PERR

TO

MOBF

INH

A2

SYS

IBF

OBF

l OBF (출력 버퍼Full) - 출력 버퍼 상태를 나타낸다.

0: 출력 버퍼 비었음 - 포트 0x60에 써도 무방함.

1: 출력 버퍼 가득 참 - 포트 0x60에 쓰지 마시오.

l IBF (입력 버퍼Full) – 입력 버퍼 상태를 나타낸다.

0: 입력 버퍼 비었음 - 포트 0x60에 새로운 입력 없음

1: 입력 버퍼 가득 참 - 포트 0x60에 새로운 입력 있음.

l SYS (시스템 플래그) – 전원이 켜졌을 때나 소프트웨어의 리셋 시 상태를 나타낸다.

0: Power-up value – 시스템이 파워 온 리셋에 있음.

1: BAT 코드 수신 시스템이 이미 초기화 되었음

l A2 (어드레스 라인 A2) – 키보드 컨트롤러에 의해 내부적으로 사용됨

0: A2 = 0 - 포트 0x60이 마지막으로 작성됨

1: A2 = 1 - 포트 0x64가 마지막으로 작성됨

l INH (금지 플래그) – 키보드 통신이 금지되었는지 여부를 나타냄.

0: 키보드 클럭 = 0 – 키보드 금지됨

1: 키보드 클럭 = 1 – 키보드 금지되지 않음

l TxTO (송신 타임아웃) – 키보드가 입력을 수락하고 있지 않음을 나타냄 (키보드가 플러그인 되지 않았을 수 있음).

0: 에러 없음 키보드가 쓰여진 마지막 바이트 수락함.

1: 타임아웃 에러 키보드가 전송요청한 지 15m내에 클럭신호를 생성하지 않음.

l RxTO (수신 타임아웃) – 키보드가 명령어에 응답하지 않았음을 나타냄(키보드가 고장일 가능성 있음)

0: 에러 없음 키보드가 마지막 바이트에 응답함.

1: 타임아웃 에러 - 키보드가 명령 수신한 후 20ms내에 클럭신호를 생성하지 않음.

l PERR (패리티 오류) – 키보드 통신 에러를 나타냄(노이즈가 있거나 접촉 불량일 가능성 있음)

0: 에러 없음 홀수 패리티 수신 및 올바른 명령어 응답 수신

1: 패리티 오류 짝수 패리티 수신, 또는 명령어 응답으로 0xFE 수신

l MOBF (마우스 출력 버퍼Full) – PS/2 마우스는 제외하고, OBF와 같다.

0: 출력 버퍼 비었음 보조 장치의 출력 버퍼에 써도 무방함

1: 출력 버퍼 꽉 참 포트 보조장치의 출력 버퍼에 쓰지 마시오.

l TO (일반 타임아웃) – 명령어 쓰기, 또는 응답하는 동안 타임아웃 되었음을 나타냄 (TxTO + RxTO와 동일)

0: 에러 없음 키보드가 마지막 명령어를 수신하고 응답함

1: 타임아웃 없음 자세한 사항은 TxTO RxTO 참고

[예를 들어 나의 PC에서, 8042의 상태 레지스터 정상 값은 14h = 00010100b이다. 이는 키보드 통신이 금지되지 않았음을 나타내고, 8042는 자가 진단(BAT)을 완료했음을 나타낸다.상태 레지스터는 포트 64h ("IN AL, 64h")로부터 읽음으로써 얻을 수 있다]

키보드 입력 읽기:

8042가 키보드에서 유효한 스캔 코드를 수신할 때, 코드는 세트 1과 동등한 상태로 전환된다.전환된 스캔 코드는 입력 버퍼에 저장되며, IBF (입력 버퍼Full) 플래그가 셋트되고 IRQ 1이 발생된다. 더불어, 어떤 바이트가 키보드로부터 수신될 때 8042는 추가 수신을 금한다(클럭을 로우로 떨어뜨려서). 따라서 다른 스캔 코드는 입력 버퍼가 비워질 때까지 수신되지 않을 것이다.

인터럽트가 유효하다면, IRQ 1은 키보드 드라이버를 활성화 할 것이고, 인터럽트 벡터 0x09를 가리킬 것이다. 드라이버는 포트 0x60으로부터 스캔 코드를 읽으면, IRQ 1은 비활성화되고IBF플래그는 리셋될 것이다. 스캔 코드는 특수 키 조합과 함께 드라이버에 의해 처리되며, 키보드 입력을 위해 할당된 시스템의 RAM의 영역이 업데이트된다.

만약 인터럽트 벡터0x09로 처리되기를 원하지 않는다면, 입력용 키보드 컨트롤러를 폴링할 수 있는데 이를 위해서는 8042인터럽트를 디스에이블하고 IBF 플래그를 폴링하면 된다. 이 플래그는 입력된 데이터가 입력 버퍼에 있을 때 셋트(1)되고, 데이터가 입력 버퍼에서 읽혔을 때 클리어(0)된다. 입력 버퍼를 읽는 것은 포트0x60로부터 읽는 것이고, IBF 플래그는 포트0x641번 비트이다. 다음의 어셈블리 코드는 이것을 설명한다.

kbRead:

WaitLoop: in al, 64h ; Read Status byte

and al, 10b ; Test IBF flag (Status<1>)

jz WaitLoop ; Wait for IBF = 1

in al, 60h ; Read input buffer

키보드에 쓰기:

8042 출력 버퍼에(포트 0x60) 데이터를 쓰면, 컨트롤러는 OBF(출력 버퍼 Full) 플래그를 셋트하고 데이터를 처리한다. 8042는 이 데이터를 키보드에 전송하고 응답을 기다릴 것이다. 키보드가 주어진 시간 내에 응답을 수락하거나 생성하지 않는다면 해당 타임아웃 플래그가 설정될 것이다(자세한 내용은 상태 레지스터 정의 참조). 틀린 패리티 비트가 수신되면 8042"재전송" (0xFE) 명령어를 키보드로 전송할 것이다. 키보드가 계속해서 잘못된 바이트를 전송하면 패리티 에러 플래그가 상태 레지스터에 셋트된다. 에러가 없을 때는 응답 바이트가 입력 버퍼에 저장되고 IBF(입력 버퍼 Full)플래그가 셋트된 후, 키보드 드라이버에 신호를 보내면서 IRQ 1이 활성화된다.

다음의 어셈블리 코드는 출력 버퍼에 데이터를 쓰는 방법을 보여준다(출력 버퍼에 쓴 이후 int 9h을 사용하거나 키보드의 응답을 얻기 위해서 포트 64h를 폴링해야 한다는 것을 명심한다).

kbWrite:

WaitLoop: in al, 64h ; Read Status byte

and al, 01b ; Test OBF flag (Status<0>)

jnz WaitLoop ; Wait for OBF = 0

out 60h, cl ; Write data to output buffer

키보드 컨트롤러 명령:

명령어는 포트 0x64에 쓰는 것으로 키보드 컨트롤러로 전송된다. 명령어 매개변수는 명령어가 전송된 후 포트 0x60에 쓴다. 결과(응답)는 포트 0x60으로 수신된다. 항상 OBF(출력 버퍼Full)플래그를 8042에 명령어나 매개변수를 쓰기 전에 검사한다.

  • 0x20 (읽기 명령 바이트) - 명령 바이트 반환. (아래 쓰기 명령 바이트참고).
  • 0x60 (쓰기 명령 바이트) – 명령 바이트의 매개변수 저장. 명령 바이트는 다음과 같이 정의됨:

MSB 7

6

5

4

3

2

1

LSB 0

AT-호환 모드

-

XLAT

PC

_EN

OVR

SYS

-

INT

PS/2 호환 모드

-

XLAT

_EN2

_EN

-

SYS

INT2

INT

    • INT(입력 버퍼 full 인터럽트) – 셋트하면, 입력 버퍼에서 데이터가 이용 가능할 때 IRQ 1가 발생됨.

0: IBF 인터럽트 비허가 입력을 읽기 위해서 IBF를 폴링해야 함.

1: IBF 인터럽트 허가 - 소프트웨어int 0x09에 있는 키보드 드라이버가

입력을 처리.

    • SYS(시스템 플래그) – 수동으로 상태 레지스터에서 SYS 플래그를 셋트 하거나 클리어하는데 사용됨.

0: power-on 파워 온 테스트/초기화를 수행하도록 한다.

1: BAT 코드 수신 – warm boot 테스트/초기화를 수행하도록 한다.

    • OVR(오버라이드 금지) – 구형 마더보드에 있는 키보드의 금지스위치를 오버라이드 함.

0: Inhibit switch enabled - P17이 하이일 때 키보드가 금지됨

1: Inhibit switch disabled - P17 = high라 하더라도 키보드가 금지안 됨

    • _EN(Disable keyboard) – 키보드 인터페이스 디스에이블/인에이블

0: Enable - 키보드 인터페이스 인에이블 됨

1: Disable – 모든 키보드 통신이 디스에이블 됨

    • PC (PC Mode) - ???Enables keyboard interface somehow???

0: Disable - ???

1: Enable - ???

    • XLAT (스캔 코드 변환) – 세트 1 스캔 코드로 변환 허가/비허가

0: 변환 비허가 키보드에서 읽은 대로 데이터가 입력버퍼에 저장됨.

1: 변환 허가 입력버퍼에 저장되기 전 세트 1 스캔 코드로 변환됨.

    • INT2(마우스 입력 버퍼 풀 인터럽트) – 설정 시, 마우스 데이터가 유효할 때 IRQ 12가 발생됨.

0: 보조 IBF 인터럽트 디제이블 -

1: 보조 IBF 인터럽트 인에이블 -

    • _EN2(디스에이블 마우스) – 마우스 인터페이스 디스에이블/인에이블 함.

0: 인에이블 - 보조 PS/2 장치 인터페이스 인에이블 됨

1: 디스에이블 - 보조 PS/2 장치 인터페이스 디스에이블 됨

  • 0x90-0x9F(출력포트에 쓰기) – 명령어의 하위 니블을 출력 포트의 하위 니블에 써넣는다(출력 포트 정의 참조).
  • 0xA1(버전넘버 얻기) – 펌웨어 버전 넘버 반환
  • 0xA4(패스워드 얻기) – 패스워드가 있으면 0xFA반환, 없으면 0xF1 반환
  • 0xA5(패스워드 설정) – 널로 종료되는 문자열의 스캔 코드를 명령어의 매개변수로 전송함으로써 신규 패스워드 설정
  • 0xA6(패스워드 검사) – 키보드 입력을 현재 패스워드와 비교.
  • 0xA7(디스에이블 마우스 인터페이스) - PS/2 모드 전용. "디스에이블 키보드 인터페이스" (0xAD) 명령어와 같다.
  • 0xA8(인에이블 마우스 인터페이스) - PS/2 모드 전용. "인에이블 키보드 인터페이스"(0xAE) 명령어와 같다.
  • 0xA9(마우스 인터페이스 테스트) – 문제 없으면 0x00반환, 클럭 라인이 stuck low0x01, stuck high0x02, 데이터 라인이 stuck low0x03, 데이터 라인이 stuck low 0x04 반환.
  • 0xAA(컨트롤러 자가 진단) – 문제없으면 0x55 반환
  • 0xAB(키보드 인터페이스 테스트) - 문제없으면 0x00 반환, 클럭 라인이 stuck low0x01, 클럭 라인이 stuck high0x02, 데이터 라인이 stuck low0x03, 데이터 라인이 stuck low0x04 반환.
  • 0xAD(디스에이블 키보드 인터페이스) - 명령 바이트의 bit 4를 셋트하고 키보드와의 모든 커뮤니케이션 디스에이블.
  • 0xAE(인에이블 키보드 인터페이스) - 명령 바이트의 bit 4를 클리어하고 키보드와의 통신 재 인에이블.
  • 0xAF(버전 얻기)
  • 0xC0(입력 포트 읽기) – 입력 포트 값 반환(입력 포트 정의 참고).
  • 0xC1(입력 포트 LSn 복사) - PS/2 모드 전용. 입력 포트의 하위 니블을 상태 레지스터에 복사(입력 포트 정의 참고).
  • 0xC2(입력 포트MSn 복사) - PS/2 모든 전용. 입력 포트의 상위 니블을 상태 레지스터에 복사(입력 포트 정의 참고).
  • 0xD0(출력 포트 읽기) – 출력 포트의 값을 반환(출력 포트 정의 참고).
  • 0xD1(출력 포트 쓰기) – 출력 포트의 매개변수 쓰기(출력 포트 정의 참고).
  • 0xD2(키보드 버퍼 쓰기) – 키보드에서 수신된 것처럼 매개변수를 입력 버퍼에 쓴다.
  • 0xD3(마우스 버퍼 쓰기) – 마우스에서 수신된 것처럼 매개변수를 입력 버퍼에 쓴다.
  • 0xD4(마우스 장치 쓰기) – 매개변수를 보조 PS/2 장치에 전송
  • 0xE0(테스트 포트 읽기) – 테스트 포트 값 반환(테스트 포트 정의 참고).
  • 0xF0-0xFF(출력 포트 펄스 신호 출력) – 명령어의 하위 니블을 출력포트의 하위 니블로 펄스 신호 출력(출력 포트 정의 참조)

초기화:

다음은 컴퓨터 전원을 켤 때, 컴퓨터와 키보드 간 통신이다. 내가 알기로는 처음 세 개의 명령어는 키보드 컨트롤러에 의해 초기화 되었고, (Num lock LED을 인에이블하는) 다음 명령어는BIOS에 의해 전송된 후 나머지 명령어는 나의 OS(Win98SE)로부터 전송되었다. 이런 결과들은 나의 컴퓨터에 특정된 것이지만, 시작 시에 무슨 일이 발생하는 지에 대한 일반적인 절차를 알 수 있을 것이다.

키보드: AA (자가 진단 통과됨; 키보드 컨트롤러 init)

호스트: ED (/리셋 상태 표시기)

키보드: FA (Acknowledge)

호스트: 00 (모든 LED )

키보드: FA (Acknowledge)

호스트: F2 (ID 읽음)

키보드: FA (Acknowledge)

키보드: AB (ID의 첫째 바이트)

호스트: ED (/리셋 상태 표시기; BIOS init)

키보드: FA (Acknowledge)

호스트: 02 (Num Lock LED )

키보드: FA (Acknowledge)

호스트: F3 (타입매틱 비율/지연 설치; Windows init)

키보드: FA (Acknowledge)

호스트: 20 (500 ms / 30.0 reports/sec)

키보드: FA (Acknowledge)

호스트: F4 (인에이블)

키보드: FA (Acknowledge)

호스트: F3 (타입매틱 비율/지연 설치)

키보드: FA (Acknowledge)

호스트: 00 (250 ms / 30.0 reports/sec)

키보드: FA (Acknowledge)

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

PS/2 마우스 키보드 프로토콜  (0) 2011.10.15
PS/2 마우스  (0) 2011.10.15
시리얼통신 (synchronous)  (0) 2011.10.15
시리얼통신 (unsynchronous)  (0) 2011.10.15
USART (RS232)  (0) 2011.10.15

+ Recent posts