Beispiel #1
0
/// Update a combination key state and Sync LED state.
void kKeyboard::kUpdateCombinationKeyStatusAndLED(BYTE bScanCode)
{
    BYTE bDownScanCode;
    bool bDown;
    bool bLEDStatusChnaged = false;

    // Handle push and release.
    // If the highest bit (Bit 7) is 1, it is release.
    // If not, it is push.
    if (bScanCode & 0x80)
    {
        bDown = false;
        bDownScanCode = bScanCode & 0x7F;
    }
    else
    {
        bDown = true;
        bDownScanCode = bScanCode;
    }
    
    // Search a combination key.
    // If it is Scan Code of shift (42 or 54),
    // update the state of the shift key.
    if ((bDownScanCode == 42) || (bDownScanCode == 54))
    {
        bShiftDown = bDown;
    }
    // If it is Scan Code of CAPS lock (58)
    // update the state of CAPS Lock and change LED state.
    else if ((bDownScanCode == 58) && (bDown == true))
    {
        bCapsLockOn ^= true;
        bLEDStatusChnaged = true;
    }
    // If it is Scan Code of Num lock (69)
    // update the state of Num Lock and change LED state.
    else if ((bDownScanCode == 69) && (bDown == true))
    {
        bNumLockOn ^= true;
        bLEDStatusChnaged = true;
    }
    // If it is Scan Code of Scroll lock (70)
    // update the state of Scroll Lock and change LED state.
    else if ((bDownScanCode == 70) && (bDown == true))
    {
        bScrollLockOn ^= true;
        bLEDStatusChnaged = true;
    }
    
    // If the state of LED is changed,
    // send LED chang command to a keyboard.
    if (bLEDStatusChnaged == true)
    {
        kChangeKeyboardLED(bCapsLockOn, bNumLockOn, bScrollLockOn);
    }
    
    return;
}
Beispiel #2
0
/**
 *  조합 키의 상태를 갱신하고 LED 상태도 동기화 함
 */
void UpdateCombinationKeyStatusAndLED( BYTE bScanCode )
{
    BOOL bDown; 
    BYTE bDownScanCode;
    BOOL bLEDStatusChanged = FALSE;
    
    // 눌림 또는 떨어짐 상태처리, 최상위 비트(비트 7)가 1이면 키가 떨어졌음을 의미하고
    // 0이면 떨어졌음을 의미함
    if( bScanCode & 0x80 )
    {
        bDown = FALSE;
        bDownScanCode = bScanCode & 0x7F;
    }
    else
    {
        bDown = TRUE;
        bDownScanCode = bScanCode;
    }
    
    // 조합 키 검색
    // Shift 키의 스캔 코드(42 or 54)이면 Shift 키의 상태 갱신
    if( ( bDownScanCode == 42 ) || ( bDownScanCode == 54 ) )
    {
        gs_stKeyboardManager.bShiftDown = bDown;
    }
    // Caps Lock 키의 스캔 코드(58)이면 Caps Lock의 상태 갱신하고 LED 상태 변경
    else if( ( bDownScanCode == 58 ) && ( bDown == TRUE ) )
    {
        gs_stKeyboardManager.bCapsLockOn ^= TRUE;
        bLEDStatusChanged = TRUE;
    }
    // Num Lock 키의 스캔 코드(69)이면 Num Lock의 상태를 갱신하고 LED 상태 변경
    else if( ( bDownScanCode == 69 ) && ( bDown == TRUE ) )
    {
        gs_stKeyboardManager.bNumLockOn ^= TRUE;
        bLEDStatusChanged = TRUE;
    }
    // Scroll Lock 키의 스캔 코드(70)이면 Scroll Lock의 상태를 갱신하고 LED 상태 변경
    else if( ( bDownScanCode == 70 ) && ( bDown == TRUE ) )
    {
        gs_stKeyboardManager.bScrollLockOn ^= TRUE;
        bLEDStatusChanged = TRUE;
    }
    
    // LED 상태가 변했으면 키보드로 커맨드를 전송하여 LED를 변경
    if( bLEDStatusChanged == TRUE )
    {
        kChangeKeyboardLED( gs_stKeyboardManager.bCapsLockOn, 
            gs_stKeyboardManager.bNumLockOn, gs_stKeyboardManager.bScrollLockOn );
    }
}
Beispiel #3
0
void UpdateCombinationKeyStatusAndLED( BYTE bScanCode )
{
	BOOL bDown;
	BYTE bDownScanCode;
	BOOL bLEDStatusChanged = FALSE;

	if( bScanCode & 0x80 ) // 만약 스캔코드 최상위 비트가 1이라면
	{
		bDown = FALSE;
		bDownScanCode = bScanCode & 0x7F;
	}
	else
	{
		bDown = TRUE;
		bDownScanCode = bScanCode;
	}

	// 조합키 검색
	// SHIFT가 눌렸다면
	if ( (bDownScanCode == 42 ) || ( bDownScanCode == 54 ) )
	{
		gs_stKeyboardManager.bShiftDown = bDown;
	}
	// CapsLock 키면 CapsLock 상태 갱신 및 LED 상태 변경
	else if ( (bDownScanCode == 58 ) && bDown == TRUE )
	{
		gs_stKeyboardManager.bCapsLockOn ^= TRUE;
		bLEDStatusChanged = TRUE;
	}
	// Num Lock이면
	else if ( (bDownScanCode == 69 ) && bDown == TRUE )
	{
		gs_stKeyboardManager.bNumLockOn ^= TRUE;
		bLEDStatusChanged = TRUE;
	}
	else if ( (bDownScanCode == 70 ) && bDown == TRUE )
	{
		gs_stKeyboardManager.bScrollLockOn ^= TRUE;
		bLEDStatusChanged = TRUE;
	}

	// LED 상태 변경 했으면 실제 변경함
	if ( bLEDStatusChanged == TRUE )
	{
		kChangeKeyboardLED( gs_stKeyboardManager.bCapsLockOn, gs_stKeyboardManager.bNumLockOn, gs_stKeyboardManager.bScrollLockOn );
	}

}
Beispiel #4
0
void Main( void )
{
	int iCursorX, iCursorY;
	kPrintString( 45, 10,"Pass" );
	kInitializeConsole( 0, 11);
	kPrintf("Success to enter 64-bit C Kernel\n");
	kPrintf("Console Initialization......................[Pass]\n");
	// 부팅상황
	kGetCursor( &iCursorX, &iCursorY );
	kPrintf("GDT Initialize And Switch For 64bit Mode....[    ]");
	kInitializeGDTTableAndTSS();
	kLoadGDTR( GDTR_STARTADDRESS );
	kSetCursor( 45, iCursorY++);
	kPrintf("Pass\n");

	kPrintf("TSS Segment Load............................[    ]" );
	kLoadTR( GDT_TSSSEGMENT );
	kSetCursor( 45, iCursorY++);
	kPrintf("Pass\n");

	kPrintf("IDT Initialize..............................[    ]" );
	kInitializeIDTTables();
	kLoadIDTR( IDTR_STARTADDRESS );
	kSetCursor( 45, iCursorY++);
	kPrintf("Pass\n");


	kPrintf("Total RAM Size Check........................[    ]" );
	kCheckTotalRAMSize();
	kSetCursor( 45, iCursorY++);
	kPrintf("Pass], Size = %d MB\n", kGetTotalRAMSize());

	kPrintf("TCB Pool And Scheduler Initialize...........[Pass]\n" );
	iCursorY++;
	kInitializeScheduler();

	kPrintf("Dynamic Memory Initialize...................[Pass]\n");
	iCursorY++;
	kInitializeDynamicMemory();

	// 1ms 당 인터럽트 발생
	kInitializePIT( MSTOCOUNT(1), 1 );

	kPrintf("Keyboard Activation.........................[    ]" );
	if( kInitializeKeyboard() == TRUE )
	{
		kSetCursor( 45, iCursorY++);
		kPrintf("Pass\n");
		kChangeKeyboardLED(FALSE, FALSE, FALSE);
	}
	else
	{
		kSetCursor( 45, iCursorY++);
		kPrintf("Fail\n");
		while(1)
		{
			;
		}
	}

	kPrintf("PIC Controller And Interrupt Initialize.....[    ]" );
	kInitializePIC();
	kMaskPICInterrupt( 0 );
	kEnableInterrupt();
	kSetCursor( 45, iCursorY++);
	kPrintf("Pass\n");

	kPrintf("HDD Initialize..............................[    ]" );
	if(kInitializeHDD() == TRUE)
	{
		kSetCursor( 45, iCursorY++);
		kPrintf("Pass\n");
	}
	else
	{
		kSetCursor( 45, iCursorY++);
		kPrintf("Fail\n");
	}
	kPrintf("File System Initialize......................[    ]" );
	if(kInitializeFileSystem() == TRUE)
	{
		kSetCursor( 45, iCursorY++);
		kPrintf("Pass\n");
	}
	else
	{
		kSetCursor( 45, iCursorY++);
		kPrintf("Fail\n");
	}


	kCreateTask( TASK_FLAGS_LOWEST | TASK_FLAGS_IDLE | TASK_FLAGS_SYSTEM | TASK_FLAGS_THREAD , 0, 0, (QWORD) kIdleTask );
	kStartConsoleShell();
}
Beispiel #5
0
/**
 *  아래 함수는 C 언어 커널의 시작 부분임
 */
void Main( void )
{
    int iCursorX, iCursorY;

    // 콘솔을 먼저 초기화한 후, 다음 작업을 수행
    kInitializeConsole( 0, 10 );    
    kPrintf( "Switch To IA-32e Mode Success~!!\n" );
    kPrintf( "IA-32e C Language Kernel Start..............[Pass]\n" );
    kPrintf( "Initialize Console..........................[Pass]\n" );
    
    // 부팅 상황을 화면에 출력
    kGetCursor( &iCursorX, &iCursorY );
    kPrintf( "GDT Initialize And Switch For IA-32e Mode...[    ]" );
    kInitializeGDTTableAndTSS();
    kLoadGDTR( GDTR_STARTADDRESS );
    kSetCursor( 45, iCursorY++ );
    kPrintf( "Pass\n" );
    
    kPrintf( "TSS Segment Load............................[    ]" );
    kLoadTR( GDT_TSSSEGMENT );
    kSetCursor( 45, iCursorY++ );
    kPrintf( "Pass\n" );
    
    kPrintf( "IDT Initialize..............................[    ]" );
    kInitializeIDTTables();    
    kLoadIDTR( IDTR_STARTADDRESS );
    kSetCursor( 45, iCursorY++ );
    kPrintf( "Pass\n" );
    
    kPrintf( "Total RAM Size Check........................[    ]" );
    kCheckTotalRAMSize();
    kSetCursor( 45, iCursorY++ );
    kPrintf( "Pass], Size = %d MB\n", kGetTotalRAMSize() );
    
    kPrintf( "TCB Pool And Scheduler Initialize...........[Pass]\n" );
    iCursorY++;
    kInitializeScheduler();
    // 1ms당 한번씩 인터럽트가 발생하도록 설정
    kInitializePIT( MSTOCOUNT( 1 ), 1 );
    
    kPrintf( "Keyboard Activate And Queue Initialize......[    ]" );
    // 키보드를 활성화
    if( kInitializeKeyboard() == TRUE )
    {
        kSetCursor( 45, iCursorY++ );
        kPrintf( "Pass\n" );
        kChangeKeyboardLED( FALSE, FALSE, FALSE );
    }
    else
    {
        kSetCursor( 45, iCursorY++ );
        kPrintf( "Fail\n" );
        while( 1 ) ;
    }
    
    kPrintf( "PIC Controller And Interrupt Initialize.....[    ]" );
    // PIC 컨트롤러 초기화 및 모든 인터럽트 활성화
    kInitializePIC();
    kMaskPICInterrupt( 0 );
    kEnableInterrupt();
    kSetCursor( 45, iCursorY++ );
    kPrintf( "Pass\n" );

    // 셸을 시작
    kStartConsoleShell();
}
Beispiel #6
0
Datei: main.c Projekt: cocojk/os
// Bootstrap Processor용 C 언어 커널 엔트리 포인트
void main( void )
{
    int iCursorX, iCursorY;

    // 부트 로더에 있는 BSP 플래그를 읽어서 Application Processor이면
    // 해당 코어용 초기화 함수로 이동
    if(*((BYTE*)BOOTSTRAPPROCESSOR_FLAGADDESS)==0)
    {
        mainForApplicationProcessor();
    }

    // Bootstrap Processor가 부팅을 완료했으므로, 0x7C09에 있는 Bootstrap Processor를
    // 나타내는 플래그를 0으로 설정하여 Application Processor용으로 코드 실행 경로를 변경
    *((BYTE*)BOOTSTRAPPROCESSOR_FLAGADDESS)=0;

    // 콘솔을 먼저 초기화한 후, 다음 작업을 수행
    kInitializeConsole( 0, 10 );
    kPrintf( "Switch To IA-32e Mode Success~!!\n" );
    kPrintf( "IA-32e C Language Kernel Start..............[Pass]\n" );
    kPrintf( "Initialize Console..........................[Pass]\n" );

    // 부팅 상황을 화면에 출력
    kGetCursor( &iCursorX, &iCursorY );
    kPrintf( "GDT Initialize And Switch For IA-32e Mode...[    ]" );
    kInitializeGDTTableAndTSS();
    kLoadGDTR( GDTR_STARTADDRESS );
    kSetCursor( 45, iCursorY++ );
    kPrintf( "Pass\n" );

    kPrintf( "TSS Segment Load............................[    ]" );
    kLoadTR( GDT_TSSSEGMENT );
    kSetCursor( 45, iCursorY++ );
    kPrintf( "Pass\n" );

    kPrintf( "IDT Initialize..............................[    ]" );
    kInitializeIDTTables();
    kLoadIDTR( IDTR_STARTADDRESS );
    kSetCursor( 45, iCursorY++ );
    kPrintf( "Pass\n" );

    kPrintf( "Total RAM Size Check........................[    ]" );
    kCheckTotalRAMSize();
    kSetCursor( 45, iCursorY++ );
    kPrintf( "Pass], Size = %d MB\n", kGetTotalRAMSize() );

    kPrintf("TCB Poll And Scheduler Initialize...........[Pass]\n");
    iCursorY++;
    kInitializeScheduler();

    // 동적 메모리 초기화
    kPrintf("Dynamic Memory Initialize...................[Pass]\n");
    iCursorY++;
    kInitializeDynamicMemory();

    // 1ms당 한 번씩 인터럽트가 발생하도록 설정
    kInitializePIT(MSTOCOUNT(1),1);

    kPrintf( "Keyboard Activate And Queue Initialize......[    ]" );
    // 키보드를 활성화
    if( kInitializeKeyboard() == TRUE )
    {
        kSetCursor( 45, iCursorY++ );
        kPrintf( "Pass\n" );
        kChangeKeyboardLED( FALSE, FALSE, FALSE );
    }
    else
    {
        kSetCursor( 45, iCursorY++ );
        kPrintf( "Fail\n" );
        while( 1 ) ;
    }

    kPrintf( "PIC Controller And Interrupt Initialize.....[    ]" );
    // PIC 컨트롤러 초기화 및 모든 인터럽트 활성화
    kInitializePIC();
    kMaskPICInterrupt( 0 );
    kEnableInterrupt();
    kSetCursor( 45, iCursorY++ );
    kPrintf( "Pass\n" );

    // 파일 시스템을 초기화
    kPrintf("File System Initialize......................[    ]");
    if(kInitializeFileSystem()==TRUE)
    {
        kSetCursor(45,iCursorY++);
        kPrintf("Pass\n");
    }
    else
    {
        kSetCursor(45,iCursorY++);
        kPrintf("Fail\n");
    }

    // 시리얼 포트 초기화
    kPrintf("Serial Port Initialize......................[Pass]\n");
    iCursorY++;
    kInitializeSerialPort();

    // 유후 태스크를 시스템 스레드로 생성하고 셸을 시작
    kCreateTask(TASK_FLAGS_LOWEST | TASK_FLAGS_THREAD | TASK_FLAGS_SYSTEM | TASK_FLAGS_IDLE,0,0,(QWORD)kIdleTask,kGetAPICID());

    // 그래픽 모드가 아니면 콘솔 셸 실행
    if(*(BYTE*)VBE_STARTGRAPHICMODEFLAGADDRESS==0)
    {
        kStartConsoleShell();
    }
    // 그래픽 모드면 그래픽 모드 테스트 함수 실행
    else
    {
        kStartGraphicModeTest();
    }
}
Beispiel #7
0
/**
 *  아래 함수는 C 언어 커널의 시작 부분임
 */
void Main( void )
{
    char vcTemp[ 2 ] = { 0, };
    BYTE bTemp;
    int i = 0;
    KEYDATA stData;

    kPrintString( 0, 10, "Switch To IA-32e Mode Success~!!" );
    kPrintString( 0, 11, "IA-32e C Language Kernel Start..............[Pass]" );

    kPrintString( 0, 12, "GDT Initialize And Switch For IA-32e Mode...[    ]" );
    kInitializeGDTTableAndTSS();
    kLoadGDTR( GDTR_STARTADDRESS );
    kPrintString( 45, 12, "Pass" );

    kPrintString( 0, 13, "TSS Segment Load............................[    ]" );
    kLoadTR( GDT_TSSSEGMENT );
    kPrintString( 45, 13, "Pass" );

    kPrintString( 0, 14, "IDT Initialize..............................[    ]" );
    kInitializeIDTTables();
    kLoadIDTR( IDTR_STARTADDRESS );
    kPrintString( 45, 14, "Pass" );

    kPrintString( 0, 15, "Keyboard Activate And Queue Initialize......[    ]" );
    // 키보드를 활성화
    if( kInitializeKeyboard() == TRUE )
    {
        kPrintString( 45, 15, "Pass" );
        kChangeKeyboardLED( FALSE, FALSE, FALSE );
    }
    else
    {
        kPrintString( 45, 15, "Fail" );
        while( 1 ) ;
    }

    kPrintString( 0, 16, "PIC Controller And Interrupt Initialize.....[    ]" );
    // PIC 컨트롤러 초기화 및 모든 인터럽트 활성화
    kInitializePIC();
    kMaskPICInterrupt( 0 );
    kEnableInterrupt();
    kPrintString( 45, 16, "Pass" );

    while( 1 )
    {
        // 키 큐에 데이터가 있으면 키를 처리함
        if( kGetKeyFromKeyQueue( &stData ) == TRUE )
        {
            // 키가 눌러졌으면 키의 ASCII 코드 값을 화면에 출력
            if( stData.bFlags & KEY_FLAGS_DOWN )
            {
                // 키 데이터의 ACII 코드 값을 저장
                vcTemp[ 0 ] = stData.bASCIICode;
                kPrintString( i++, 17, vcTemp );

                // 0이 입력되면 변수를 0으로 나누어 Divide Error 예외(벡터 0번)을
                // 발생시킴
                if( vcTemp[ 0 ] == '0' )
                {
                    // 아래 코드를 수행하면 Divide Error 예외가 발생하여
                    // 커널의 임시 핸들러가 수행됨
                    bTemp = bTemp / 0;
                }
            }
        }
    }
}