/// 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; }
/** * 조합 키의 상태를 갱신하고 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 ); } }
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 ); } }
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(); }
/** * 아래 함수는 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(); }
// 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(); } }
/** * 아래 함수는 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; } } } } }