Пример #1
0
/**
 *  ACK를 기다림
 *      ACK가 아닌 다른 스캔 코드는 변환해서 큐에 삽입
 */
BOOL kWaitForACKAndPutOtherScanCode( void )
{
    int i, j;
    BYTE bData;
    BOOL bResult = FALSE;
    
    // ACK가 오기 전에 키보드 출력 버퍼(포트 0x60)에 키 데이터가 저장되어 있을 수 있으므로
    // 키보드에서 전달된 데이터를 최대 100개까지 수신하여 ACK를 확인
    for( j = 0 ; j < 100 ; j++ )
    {
        // 0xFFFF만큼 루프를 수행할 시간이면 충분히 커맨드의 응답이 올 수 있음
        // 0xFFFF 루프를 수행한 이후에도 출력 버퍼(포트 0x60)가 차 있지 않으면 무시하고 읽음
        for( i = 0 ; i < 0xFFFF ; i++ )
        {
            // 출력 버퍼(포트 0x60)가 차있으면 데이터를 읽을 수 있음
            if( kIsOutputBufferFull() == TRUE )
            {
                break;
            }
        }    
        // 출력 버퍼(포트 0x60)에서 읽은 데이터가 ACK(0xFA)이면 성공
        bData = kInPortByte( 0x60 );
        if( bData == 0xFA )
        {
            bResult = TRUE;
            break;
        }
        // ACK(0xFA)가 아니면 키보드 큐에 삽입
        else
        {
            kConvertScanCodeAndPutQueue( bData );
        }        
    }
    return bResult;
}
Пример #2
0
// 키보드 인터럽트 핸들러
void kKeyboardHandler(int iVectorNumber) {
	char vcBuffer[] = "[INT:  , ]";
	static int g_iKeyboardInterruptCount = 0;
	BYTE bTemp;

	//============================================================
	// Interrupt 발생 메시지 출력
	// Interrupt Vector 출력
	vcBuffer[5] = '0' + iVectorNumber / 10;
	vcBuffer[6] = '0' + iVectorNumber % 10;
	// Interrupt 발생 횟수 출력
	vcBuffer[8] = '0' + g_iKeyboardInterruptCount;
	g_iKeyboardInterruptCount = (g_iKeyboardInterruptCount + 1) % 10;
	kPrintString(0, 0, vcBuffer);
	//============================================================

	// 키보드 컨트롤러에서 데이터를 읽어서 ASCII로 변환하여 큐에 삽입
	if(kIsOutputBufferFull() == TRUE) {
		bTemp = kGetKeyboardScanCode();
		kConvertScanCodeAndPutQueue(bTemp);
	}

	// Send EOI.
	kSendEOIToPIC(iVectorNumber - PIC_IRQSTARTVECTOR);
}
Пример #3
0
/**
 *  키보드 인터럽트의 핸들러
 */
void kKeyboardHandler( int iVectorNumber )
{
    char vcBuffer[] = "[INT:  , ]";
    static int g_iKeyboardInterruptCount = 0;
    BYTE bTemp;

    //=========================================================================
    // 인터럽트가 발생했음을 알리려고 메시지를 출력하는 부분
    // 인터럽트 벡터를 화면 왼쪽 위에 2자리 정수로 출력
    vcBuffer[ 5 ] = '0' + iVectorNumber / 10;
    vcBuffer[ 6 ] = '0' + iVectorNumber % 10;
    // 발생한 횟수 출력
    vcBuffer[ 8 ] = '0' + g_iKeyboardInterruptCount;
    g_iKeyboardInterruptCount = ( g_iKeyboardInterruptCount + 1 ) % 10;
    kPrintStringXY( 0, 0, vcBuffer );
    //=========================================================================

    // 키보드 컨트롤러에서 데이터를 읽어서 ASCII로 변환하여 큐에 삽입
    if( kIsOutputBufferFull() == TRUE )
    {
        bTemp = kGetKeyboardScanCode();
        kConvertScanCodeAndPutQueue( bTemp );
    }

    // EOI 전송
    kSendEOIToPIC( iVectorNumber - PIC_IRQSTARTVECTOR );
}
Пример #4
0
BOOL kWaitForACKAndPutOtherScanCode( void )
{
	int i, j;
	BYTE bData;
	BOOL bResult = FALSE;

	// 100번 꺼내본다. (이전에 들어온 키보드 신호때문에)
	for( j = 0 ; j < 100 ; j++ )
	{
		// 올때까지 0xFFFF번 실행
		for( i = 0 ; i < 0xFFFF ; i++ )
		{
			if( kIsOutputBufferFull() ) // outputbuffer에 ACK 신호가 있으면 데이터 읽어내야 함
			{
				break;
			}
		}
		bData = kInPortByte(0x60);

		if( bData == 0xFA )
		{
			bResult = TRUE;
			break;
		}
		else
		{
			kConvertScanCodeAndPutQueue( bData );
		}
	}
	return bResult;
}
Пример #5
0
/**
 *  마우스 인터럽트의 핸들러
 */
void kMouseHandler( int iVectorNumber )
{
    char vcBuffer[] = "[INT:  , ]";
    static int g_iMouseInterruptCount = 0;
    BYTE bTemp;
    int iIRQ;
    
    //=========================================================================
    // 인터럽트가 발생했음을 알리려고 메시지를 출력하는 부분
    // 인터럽트 벡터를 화면 왼쪽 위에 2자리 정수로 출력
    vcBuffer[ 5 ] = '0' + iVectorNumber / 10;
    vcBuffer[ 6 ] = '0' + iVectorNumber % 10;
    // 발생한 횟수 출력
    vcBuffer[ 8 ] = '0' + g_iMouseInterruptCount;
    g_iMouseInterruptCount = ( g_iMouseInterruptCount + 1 ) % 10;
    kPrintStringXY( 0, 0, vcBuffer );
    //=========================================================================

    // 출력 버퍼(포트 0x60)에 수신된 데이터가 있는지 여부를 확인하여 읽은 데이터를 
    // 키 큐 또는 마우스 큐에 삽입
    if( kIsOutputBufferFull() == TRUE )
    {
        // 마우스 데이터가 아니면 키 큐에 삽입
        if( kIsMouseDataInOutputBuffer() == FALSE )
        {
            // 출력 버퍼(포트 0x60)에서 키 스캔 코드를 읽는 용도의 함수지만 키보드와 마우스
            // 데이터는 출력 버퍼를 공통으로 사용하므로 마우스 데이터를 읽는데도 사용 가능
            bTemp = kGetKeyboardScanCode();
            // 키 큐에 삽입
            kConvertScanCodeAndPutQueue( bTemp );
        }
        // 마우스 데이터이면 마우스 큐에 삽입
        else
        {
            // 출력 버퍼(포트 0x60)에서 키 스캔 코드를 읽는 용도의 함수지만 키보드와 마우스
            // 데이터는 출력 버퍼를 공통으로 사용하므로 마우스 데이터를 읽는데도 사용 가능
            bTemp = kGetKeyboardScanCode();
            // 마우스 큐에 삽입
            kAccumulateMouseDataAndPutQueue( bTemp );
        } 
    }
    
    // 인터럽트 벡터에서 IRQ 번호 추출
    iIRQ = iVectorNumber - PIC_IRQSTARTVECTOR;

    // EOI 전송
    kSendEOI( iIRQ );
    
    // 인터럽트 발생 횟수를 업데이트
    kIncreaseInterruptCount( iIRQ );
    
    // 부하 분산(Load Balancing) 처리
    kProcessLoadBalancing( iIRQ );
}