학교에서 수업때 배운 내용이지만 다시봐도 새롭다.

쟈료를 가지고 따라가보겠다.

 

- 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

+ Recent posts