학교에서 수업때 배운 내용이지만 다시봐도 새롭다.
쟈료를 가지고 따라가보겠다.
- PS/2 제어 레지스터
PS/2 는 8042 라고 하는 컨트롤러가 제어한다. 이것음 다음과 같은 I/O주소를 갖는다.
PORT READ/Write Function
0x60 Read Read Input Buffer
0x60 Write Write Output Buffer
0x64 Read Read Status Register
0x64 Write Send Command
PS/2 키보드를 제어하기위해 컨트롤러에 명령을 써야 하는데 이때 사용하는 레지스터가 0x64번지 이다.
이번지에 명령을 쓴다. 즉 위의 Send Command 레지스터에 써 넣는다.
- 0xEE : 에코 요청 명령
- 0xED: 키보드에 있는 LED를 끄거나 키기 위한 명령
키보드에 읽을데이터가 있는가 확인할때는 0x64를 읽으면 된다.
PC 에서 키보드 데이터를 써 넣었다면 8042 입장에서는 input 이므로 비트 0번이 1이된다.
데이터를 써 넣기 전에 비트 0번이 1이 아닌가를 확인하고 써 넣어야 한다.
---키보드 응답 또는 전송 데이터 읽기
1) 0x64번지의 읽은 값의 비트1을 읽어 1이 될때까지 기다린다.
2) 0x60번지를 읽으면 키보드에서 전송한 데이터를 읽을 수 있다.
이때 0x64번지를 읽는 과정에서 문제가생겨 무한루프에 빠지지 않도록 다음과 같이 구현한다.
u8 ps2_key_read_data(void)
--명령 전송 및 응답 데이터 읽기
1) 0x64 번지에 명령을 써 넣는다.
2) 0x64 번지를 읽어 비트 0이 0이 될때까지 기다린다.
3) 0x64 번지를 읽어 비트 1이 1이 될때까지 기다린다.
키보드가 명령을 받으면 응답데이터를 보내므로 이 값을 얻기위해서 이다.
4) 0x60 번지를 읽으면 키보드에 전송한 데이터를 읽을 수 있다.
LED를 키려변 1로 셋한다
0비트 : SCROLL LOCK
1비트 : NUM LOCK
2비트 : CAPS LOCK
if(0xFA != ps2_key_exchange_data(0x01)) return 0;
-버퍼 클리어
참고 : B004_다중 소스 모듈과 PS2키보드 - 유영창
'리눅스커널 > Device Driver' 카테고리의 다른 글
[charger] bq2415x (0) | 2017.06.12 |
---|---|
USB 인사이드 muosys.egloos.com (0) | 2016.05.16 |
문자디바이스 드라이버와 file_operations (0) | 2015.05.12 |
IOCTL (0) | 2015.05.12 |
디바이스드라이버기초정리 (0) | 2015.05.11 |