⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i8048kbd.c

📁 IXP425的BSP代码
💻 C
📖 第 1 页 / 共 2 页
字号:
    int		ix;		/* to hold temp variable */    /* initialize all the key board descriptors in the virtual consoles */    for ( ix = 0; ix < N_VIRTUAL_CONSOLES; ix++)	{	pcConDv [ix].ks = &kbdConDv;		/* kbd device descriptor */	}    kbdConDv.curMode = TRUE;	/* default mode is normal */        /* default keyboard is English Enhanced key */        kbdConDv.kbdMode  = ENGLISH_KBD;     kbdConDv.kbdFlags = NORMAL|NUM;		/* Numeric mode on */    kbdConDv.kbdState = 0; 			/* unshift state */    kbdConDv.kbdHook  = (FUNCPTR) kbdHook;	/* hook routine */    kbdConDv.currCon  = PC_CONSOLE;     	/* console tty */        }/********************************************************************************* kbdIntr - interrupt level processing** This routine handles the keyboard interrupts** RETURNS: N/A** NOMANUAL*/void kbdIntr (void)    {    FAST UCHAR	scanCode;	/* to hold the scanCode */    FAST UCHAR	status;		/* to hold the status */    scanCode = sysInByte (DATA_8048);		/* get the scan code */    status = sysInByte (STATUS_8048);		/* get the status    */    sysOutByte (COMMAND_8048, (status | 0x80));	/* send acknowledgment    */    sysOutByte (STATUS_8048, status);		/* restore previous status */    if (scanCode == 0xfa)	{	return;	}    kbdConvChar (scanCode);	/* convert scancode to ASCII character and */				/* announce it to tyIRd    		   */    }/********************************************************************************* kbdConvChar - Convert scan code to character** This routine convert scanCode to ASCII character*/LOCAL void kbdConvChar     (    UCHAR	scanCode	/* scan Code from the keyboard */    )    {    if (scanCode == 0xe0)	{	kbdConDv.kbdFlags |= EXT;	return;	}    /* if high bit of scanCode,set break flag */    if (((scanCode & 0x80) << 2) == BRK)         kbdConDv.kbdFlags |=  BRK;    else       kbdConDv.kbdFlags &= ~BRK;    if ((scanCode == 0xe1) || (kbdConDv.kbdFlags & E1))	{	if (scanCode == 0xe1)	    {	    kbdConDv.kbdFlags ^= BRK; 	/* reset the break flag */	    kbdConDv.kbdFlags ^= E1;  	/* bitwise EXOR with E1 flag */	    }	return;	}    scanCode &= 0x7f;    if ((kbdConDv.kbdFlags & EXT) == EXT)	{	int 	ix;			for (ix = 0; ix < EXTND_SIZE; ix++)	    {	    if (scanCode == enhancedKeys [ix])		{		scanCode = E0_BASE + ix;		ix = -1;		break;		}	    }	kbdConDv.kbdFlags ^= EXT; 	/* reset the extended flag */	if (ix != -1)	    {	    return ; 			/* unknown scancode */	    }	}    /* invoke the respective handler */    (*keyHandler [action [scanCode]]) (scanCode);    }/********************************************************************************* kbdNormal - Normal key** This routine does the normal key processing*/LOCAL void kbdNormal    (    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 ((chr == 0xff) || (chr == 0x00))	    {	    return;	    }	/* if caps lock convert upper to lower */	if (((kbdConDv.kbdFlags & CAPS) == CAPS) && 	    (chr >= 'a' && chr <= 'z'))	    { 	    chr -= 'a' - 'A';	    } 	tyIRd (&(pcConDv [ix].tyDev), chr);	/* give input to buffer */	}    }/********************************************************************************* kbdShift - Shift key operation** This routine sets the shift state of the key board*/LOCAL void kbdShift    (    UCHAR	scanCode	/* scan code recieved */    )    {    if ((kbdConDv.kbdFlags & BRK) == BRK) 	{	kbdConDv.kbdState = AS;	kbdConDv.kbdFlags &= (~SHIFT);	}    else	{	kbdConDv.kbdState = SH;	kbdConDv.kbdFlags |= SHIFT;	}    }/********************************************************************************* kbdCtrl - Control key operation** This routine sets the shift state of key board to control state*/LOCAL void kbdCtrl    (    UCHAR	scanCode	/* scan code recieved */    )    {    if ((kbdConDv.kbdFlags & BRK) == BRK) 	{	kbdConDv.kbdState = AS;	kbdConDv.kbdFlags &= (~CTRL);	}    else	{	kbdConDv.kbdState = CN;	kbdConDv.kbdFlags |= CTRL;	}    }/********************************************************************************* kbdCaps - Capslock key operation** This routine sets the capslock state and the key board flags. */LOCAL void kbdCaps    (    UCHAR	scanCode	/* scan code recieved */    )    {    if ((kbdConDv.kbdFlags & BRK) == NORMAL) 	{	kbdConDv.kbdFlags ^= CAPS;	}    }/********************************************************************************* 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.*/LOCAL void kbdNum    (    UCHAR	scanCode	/* scan code recieved */    )    {    if ((kbdConDv.kbdFlags & BRK) == NORMAL) 	{	kbdConDv.kbdFlags ^= NUM;	kbdConDv.kbdState = (kbdConDv.kbdFlags & NUM) ? AS : NM;	}    }/********************************************************************************* 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.*/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);	}    }/********************************************************************************* 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)*/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*/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);	}    }/******************************************************************************** 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. **/LOCAL void kbdHook    (    int opCode		/* operation to perform */    )    {    switch (opCode)	{	case 0:		/* reinitialize the keyboard state */	      kbdStatInit ();	      break;	case 1:	      break;	default:	      break;	}    }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -