/** * 키보드 LED의 ON/OFF를 변경 */ BOOL kChangeKeyboardLED( BOOL bCapsLockOn, BOOL bNumLockOn, BOOL bScrollLockOn ) { int i, j; BOOL bPreviousInterrupt; BOOL bResult; BYTE bData; // 인터럽트 불가 bPreviousInterrupt = kSetInterruptFlag( FALSE ); // 키보드에 LED 변경 커맨드 전송하고 커맨드가 처리될 때까지 대기 for( i = 0 ; i < 0xFFFF ; i++ ) { // 출력 버퍼(포트 0x60)가 비었으면 커맨드 전송 가능 if( kIsInputBufferFull() == FALSE ) { break; } } // 출력 버퍼(포트 0x60)로 LED 상태 변경 커맨드(0xED) 전송 kOutPortByte( 0x60, 0xED ); for( i = 0 ; i < 0xFFFF ; i++ ) { // 입력 버퍼(포트 0x60)가 비어있으면 키보드가 커맨드를 가져간 것임 if( kIsInputBufferFull() == FALSE ) { break; } } // ACK가 올때까지 대기함 bResult = kWaitForACKAndPutOtherScanCode(); if( bResult == FALSE ) { // 이전 인터럽트 상태 복원 kSetInterruptFlag( bPreviousInterrupt ); return FALSE; } // LED 변경 값을 키보드로 전송하고 데이터가 처리가 완료될 때까지 대기 kOutPortByte( 0x60, ( bCapsLockOn << 2 ) | ( bNumLockOn << 1 ) | bScrollLockOn ); for( i = 0 ; i < 0xFFFF ; i++ ) { // 입력 버퍼(포트 0x60)가 비어있으면 키보드가 LED 데이터를 가져간 것임 if( kIsInputBufferFull() == FALSE ) { break; } } // ACK가 올 때까지 대기함 bResult = kWaitForACKAndPutOtherScanCode(); // 이전 인터럽트 상태 복원 kSetInterruptFlag( bPreviousInterrupt ); return bResult; }
BOOL kChangeKeyboardLED( BOOL bCapsLockOn, BOOL bNumLockOn, BOOL bScrollLockOn ) { int i, j; BOOL bPreviousInterrupt; BOOL bResult; BYTE bData; // 인터럽트 불가 bPreviousInterrupt = kSetInterruptFlag( FALSE ); for( i = 0 ; i < 0xFFFF ; i++ ) { if( kIsInputBufferFull() == FALSE ) // 입력버퍼가 빌때까지 기다림 { break; } } // 출력 버퍼에 LED 상태 변경 한다는 커맨드 전송(0xED) kOutPortByte(0x60, 0xED); for( i = 0 ; i < 0xFFFF ; i++ ) { if(kIsInputBufferFull() == FALSE) // 입력 버퍼가 빌때까지 기다림 break; } // ACK를 기다림 bResult = kWaitForACKAndPutOtherScanCode(); if( bResult == FALSE ) { kSetInterruptFlag( bPreviousInterrupt ); return FALSE; } if ( j>= 100 ) // 일정 시간 이상 ACK가 안옴 return FALSE; // 2비트 , 1비트, 0비트에 따라 온을 시켜줌 kOutPortByte( 0x60, (bCapsLockOn << 2) | (bNumLockOn << 1) | bScrollLockOn ); for( i = 0 ; i < 0xFFFF ; i++ ) { if(kIsInputBufferFull() == FALSE) { break; } } bResult = kWaitForACKAndPutOtherScanCode(); kSetInterruptFlag(bPreviousInterrupt); return bResult; }
/** * 키보드를 활성화 함 */ BOOL kActivateKeyboard( void ) { int i, j; BOOL bPreviousInterrupt; BOOL bResult; // 인터럽트 불가 bPreviousInterrupt = kSetInterruptFlag( FALSE ); // 컨트롤 레지스터(포트 0x64)에 키보드 활성화 커맨드(0xAE)를 전달하여 키보드 디바이스 활성화 kOutPortByte( 0x64, 0xAE ); // 입력 버퍼(포트 0x60)가 빌 때까지 기다렸다가 키보드에 활성화 커맨드를 전송 // 0xFFFF만큼 루프를 수행할 시간이면 충분히 커맨드가 전송될 수 있음 // 0xFFFF 루프를 수행한 이후에도 입력 버퍼(포트 0x60)가 비지 않으면 무시하고 전송 for( i = 0 ; i < 0xFFFF ; i++ ) { // 입력 버퍼(포트 0x60)가 비어있으면 키보드 커맨드 전송 가능 if( kIsInputBufferFull() == FALSE ) { break; } } // 입력 버퍼(포트 0x60)로 키보드 활성화(0xF4) 커맨드를 전달하여 키보드로 전송 kOutPortByte( 0x60, 0xF4 ); // ACK가 올 때까지 대기함 bResult = kWaitForACKAndPutOtherScanCode(); // 이전 인터럽트 상태 복원 kSetInterruptFlag( bPreviousInterrupt ); return bResult; }
BOOL kActivateKeyboard(void) { int i; int j; BOOL bPreviousInterrupt; BOOL bResult; // 인터럽트 막아놓고 원래의 상태를 저장 bPreviousInterrupt = kSetInterruptFlag( FALSE ); kOutPortByte(0x64, 0xAE); // 0x64(컨트롤(쓰기)레지스터에 0xAE 신호 발송 (키보드 디바이스 활성화) ) for( i = 0 ; i < 0xFFFF ; i++ ) { if (!kIsInputBufferFull()) // inputbuffer가 비었으면 키보드 활성화(디바이스X) 신호 보낼것 { break; } } kOutPortByte(0x60, 0xF4); // 0x60에 0xF4 전송 (입력버퍼로 키보드 활성화 키 전송) // ACK가 올때까지 기다림 bResult = kWaitForACKAndPutOtherScanCode(); // 이전 인터럽트 상태 복원 kSetInterruptFlag(bPreviousInterrupt); return bResult; }