📄 i8042kbd.c
字号:
*
* kbdNum - Numerlock set key operation
*
* This routine sets the numeric lock state of the key board.
* The keyboard state is numeric by default. If the numeric lock is off
* then this routine initializes the keyboard state to non numeric state.
*
* RETURNS: N/A
*/
LOCAL void kbdNum
(
UCHAR scanCode /* scan code recieved */
)
{
if ((kbdConDv.kbdFlags & BRK) == NORMAL)
{
kbdConDv.kbdFlags ^= NUM;
kbdConDv.kbdState = (kbdConDv.kbdFlags & NUM) ? AS : NM;
kbdLedSet (); /* set the relevant key board led */
}
}
/******************************************************************************
*
* kbdStp - Scroll lock set key operation
*
* This routine sets the scroll lock state of the key board.
* This routine outputs 0x13 if ^S is pressed or 0x11 if ^Q is pressed.
*
* RETURNS: N/A
*/
LOCAL void kbdStp
(
UCHAR scanCode /* scan code recieved */
)
{
FAST int ix = kbdConDv.currCon; /* to hold the console no. */
if ((kbdConDv.kbdFlags & BRK) == NORMAL)
{
kbdConDv.kbdFlags ^= STP;
(kbdConDv.kbdFlags & STP) ? tyIRd (&(pcConDv [ix].tyDev),0x13) :
tyIRd (&(pcConDv [ix].tyDev),0x11);
kbdLedSet (); /* set the relevant key board led */
}
}
/******************************************************************************
*
* kbdExt - Extended key board operation
*
* This routine processes the extended scan code operations
* and ouputs an escape sequence. ESC [ <chr> . The character is for example
* one of the following. (A, B, C, D, F, L, P)
*
* RETURNS: N/A
*/
LOCAL void kbdExt
(
UCHAR scanCode /* scan code recieved */
)
{
FAST UCHAR chr;
FAST int ix = kbdConDv.currCon; /* to hold the console no. */
if ((kbdConDv.kbdFlags & BRK) == NORMAL)
{
chr = keyMap [kbdConDv.kbdMode][kbdConDv.kbdState][scanCode];
tyIRd (&pcConDv [ix].tyDev, 0x1b); /* escape character */
kbdConDv.curMode ? tyIRd (&pcConDv [ix].tyDev, '[') :
tyIRd (&pcConDv [ix].tyDev, 'O');
tyIRd (&pcConDv [ix].tyDev, chr);
}
}
/******************************************************************************
*
* kbdEs - Non Numeric key board operation
*
* This routine processes the non numeric scan code operations
*
* RETURNS: N/A
*/
LOCAL void kbdEs
(
UCHAR scanCode /* scan code recieved */
)
{
FAST UCHAR chr;
FAST int ix = kbdConDv.currCon; /* to hold the console no. */
if ((kbdConDv.kbdFlags & BRK) == NORMAL)
{
chr = keyMap [kbdConDv.kbdMode][kbdConDv.kbdState][scanCode];
if ((kbdConDv.kbdFlags & NUM) == NORMAL)
{
tyIRd (&pcConDv [ix].tyDev, 0x1b); /* escape character */
tyIRd (&pcConDv [ix].tyDev, 'O');
}
tyIRd (&pcConDv [ix].tyDev, chr);
}
}
/******************************************************************************
*
* kbdLedSet - Keybord LED Set
*
* This routine Keyboad LED control on kbdConDv.kbdFlags numeric, caps and
* stps
*
* RETURNS: N/A
*/
LOCAL void kbdLedSet (void)
{
int ix;
UCHAR stat = 0;
/* bits 0 1 2 for scroll numlock & capslock */
stat = (UCHAR) (kbdConDv.kbdFlags & 0x07);
if (oldLedStat == stat)
return;
oldLedStat = stat;
for (ix=0; ix<WAIT_MAX; ix++) /* wait for input buf empty */
if ((sysInByte (STATUS_8042) & 0x02) == 0)
break;
sysOutByte (DATA_8042, 0xed); /* SET LEDS command */
for (ix=0; ix<WAIT_MAX; ix++) /* wait for input buf empty */
if ((sysInByte (STATUS_8042) & 0x02) == 0)
break;
sysOutByte (DATA_8042, stat); /* set LEDs */
}
/******************************************************************************
*
* kbdHook - key board function called from an external routine
*
* This function does the respective key board operation according to the
* opCode. The user can extend this function to perform any key board
* operation called as a hook from any external function for eg
* from the vga driver.
*
* RETURNS: N/A
*/
LOCAL void kbdHook
(
int opCode /* operation to perform */
)
{
switch (opCode)
{
case 0:
kbdStatInit ();
break;
case 1:
kbdLedSet ();
break;
default:
break;
}
}
/******************************************************************************
*
* kbdRead - read data from the key board.
*
* Read data from the key board.
*
* RETURNS: OK or ERROR if timed out
*/
LOCAL STATUS kbdRead
(
char *pData
)
{
kbdTimeout = FALSE;
wdStart (kbdWdid, (sysClkRateGet() * kbdWdsec), (FUNCPTR)kbdWdog, 0);
while (((sysInByte (STATUS_8042) & 0x01) == 0) && !kbdTimeout)
;
wdCancel (kbdWdid);
taskDelay (sysClkRateGet () >> 4);
*pData = sysInByte (DATA_8042);
return (kbdTimeout ? ERROR : OK);
}
/******************************************************************************
*
* kbdWrite - write data to the key board.
*
* Write data to the key board.
*
* RETURNS: OK or ERROR if timed out
*/
LOCAL STATUS kbdWrite
(
char data
)
{
kbdTimeout = FALSE;
wdStart (kbdWdid, (sysClkRateGet() * kbdWdsec), (FUNCPTR)kbdWdog, 0);
while ((sysInByte (STATUS_8042) & 0x02) && !kbdTimeout)
;
wdCancel (kbdWdid);
sysOutByte (DATA_8042, data);
return (kbdTimeout ? ERROR : OK);
}
/******************************************************************************
*
* kbdCommand - write command to the key board.
*
* Write command to the key board.
*
* RETURNS: OK or ERROR if timed out
*/
LOCAL STATUS kbdCommand
(
char command
)
{
kbdTimeout = FALSE;
wdStart (kbdWdid, (sysClkRateGet() * kbdWdsec), (FUNCPTR)kbdWdog, 0);
while ((sysInByte (STATUS_8042) & 0x02) && !kbdTimeout)
;
sysOutByte (COMMAND_8042, command);
while ((sysInByte (STATUS_8042) & 0x02) && !kbdTimeout)
;
wdCancel (kbdWdid);
return (kbdTimeout ? ERROR : OK);
}
/******************************************************************************
*
* kbdReset - reset a keyboard
*
* This routine resets the keyboard.
*
* RETURNS: N/A
*/
void kbdReset (void)
{
int ix;
for (ix=0; ix<WAIT_MAX; ix++) /* wait for input buf empty */
if ((sysInByte (STATUS_8042) & 0x02) == 0)
break;
sysOutByte (DATA_8042, 0xff);
taskDelay (sysClkRateGet () >> 4);
for (ix=0; ix<WAIT_MAX; ix++) /* wait for input buf empty */
if ((sysInByte (STATUS_8042) & 0x02) == 0)
break;
sysOutByte (DATA_8042, 0x60);
for (ix=0; ix<WAIT_MAX; ix++) /* wait for input buf empty */
if ((sysInByte (STATUS_8042) & 0x02) == 0)
break;
sysOutByte (DATA_8042, 0x45);
for (ix=0; ix<WAIT_MAX; ix++) /* wait for input buf empty */
if ((sysInByte (STATUS_8042) & 0x02) == 0)
break;
sysOutByte (COMMAND_8042, 0xae);
for (ix=0; ix<WAIT_MAX; ix++) /* wait for input buf empty */
if ((sysInByte (STATUS_8042) & 0x02) == 0)
break;
}
/******************************************************************************
*
* kbdWdog - KBD driver watchdog handler.
*
* KBD driver watchdog handler.
*
* RETURNS: N/A
*/
LOCAL void kbdWdog
(
void
)
{
kbdTimeout = TRUE;
kbdTimeoutCnt++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -