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

📄 i8042.c

📁 F:worksip2440a board可启动u-boot-like.tar.gz F:worksip2440a board可启动u-boot-like.tar.gz
💻 C
📖 第 1 页 / 共 2 页
字号:
    for (try = 0; try < KBD_RESET_TRIES; try++)    {	if (kbd_reset() == 0)	{	    kbd_mapping   = keymap;	    kbd_flags     = NORMAL;	    kbd_state     = 0;	    kbd_led_set();	    return 0;	    }    }    return -1;}/******************************************************************************* * * i8042_tstc - test if keyboard input is available *              option: cursor blinking if called in a loop */int i8042_tstc (void){    unsigned char scan_code = 0;#ifdef CONFIG_CONSOLE_CURSOR    if (--blinkCount == 0)    {	cursor_state ^= 1;	console_cursor (cursor_state);	blinkCount = CFG_CONSOLE_BLINK_COUNT;	udelay (10);    }#endif    if ((in8 (I8042_STATUS_REG) & 0x01) == 0)	return 0;    else    {	scan_code = in8 (I8042_DATA_REG);	if (scan_code == 0xfa)	    return 0;	kbd_conv_char(scan_code);	if (kbd_input != -1)	    return 1;    }    return 0;}/******************************************************************************* * * i8042_getc - wait till keyboard input is available *              option: turn on/off cursor while waiting */int i8042_getc (void){    int ret_chr;    unsigned char scan_code;    while (kbd_input == -1)    {	while ((in8 (I8042_STATUS_REG) & 0x01) == 0)	{#ifdef CONFIG_CONSOLE_CURSOR	    if (--blinkCount==0)	    {		cursor_state ^= 1;		console_cursor (cursor_state);		blinkCount = CFG_CONSOLE_BLINK_COUNT;	    }	    udelay (10);#endif	}	scan_code = in8 (I8042_DATA_REG);	if (scan_code != 0xfa)	kbd_conv_char (scan_code);    }    ret_chr = kbd_input;    kbd_input = -1;    return ret_chr;}/******************************************************************************/static void kbd_conv_char (unsigned char scan_code){    if (scan_code == 0xe0)    {	kbd_flags |= EXT;	return;    }    /* if high bit of scan_code, set break flag */    if (scan_code & 0x80)	kbd_flags |=  BRK;    else	kbd_flags &= ~BRK;    if ((scan_code == 0xe1) || (kbd_flags & E1))    {	if (scan_code == 0xe1)	{	    kbd_flags ^= BRK;     /* reset the break flag */	    kbd_flags ^= E1;      /* bitwise EXOR with E1 flag */	}	return;    }    scan_code &= 0x7f;    if (kbd_flags & EXT)    {	int i;	kbd_flags ^= EXT;	for (i=0; ext_key_map[i]; i++)	{	    if (ext_key_map[i] == scan_code)	    {		scan_code = 0x80 + i;		break;	    }	}	/* not found ? */	if (!ext_key_map[i])	    return;    }    switch (kbd_fct_map [scan_code])    {    case AS:  kbd_normal (scan_code);	break;    case SH:  kbd_shift (scan_code);	break;    case CN:  kbd_ctrl (scan_code);	break;    case NM:  kbd_num (scan_code);	break;    case CP:  kbd_caps (scan_code);	break;    case ST:  kbd_scroll (scan_code);	break;    case AK:  kbd_alt (scan_code);	break;    }    return;}/******************************************************************************/static void kbd_normal (unsigned char scan_code){    unsigned char chr;    if ((kbd_flags & BRK) == NORMAL)    {       chr = kbd_key_map [kbd_mapping][kbd_state][scan_code];       if ((chr == 0xff) || (chr == 0x00))	{	    return;	}	/* if caps lock convert upper to lower */	if (((kbd_flags & CAPS) == CAPS) && (chr >= 'a' && chr <= 'z'))       {	   chr -= 'a' - 'A';       }       kbd_input = chr;    }}/******************************************************************************/static void kbd_shift (unsigned char scan_code){    if ((kbd_flags & BRK) == BRK)    {	kbd_state = AS;	kbd_flags &= (~SHIFT);    }    else    {       kbd_state = SH;       kbd_flags |= SHIFT;    }}/******************************************************************************/static void kbd_ctrl (unsigned char scan_code){    if ((kbd_flags & BRK) == BRK)    {       kbd_state = AS;       kbd_flags &= (~CTRL);    }    else    {       kbd_state = CN;       kbd_flags |= CTRL;    }}/******************************************************************************/static void kbd_caps (unsigned char scan_code){    if ((kbd_flags & BRK) == NORMAL)    {       kbd_flags ^= CAPS;       kbd_led_set ();            /* update keyboard LED */    }}/******************************************************************************/static void kbd_num (unsigned char scan_code){    if ((kbd_flags & BRK) == NORMAL)    {       kbd_flags ^= NUM;       kbd_state = (kbd_flags & NUM) ? AS : NM;       kbd_led_set ();            /* update keyboard LED */    }}/******************************************************************************/static void kbd_scroll (unsigned char scan_code){    if ((kbd_flags & BRK) == NORMAL)    {	kbd_flags ^= STP;	kbd_led_set ();            /* update keyboard LED */	if (kbd_flags & STP)	    kbd_input = 0x13;	else	    kbd_input = 0x11;    }}/******************************************************************************/static void kbd_alt (unsigned char scan_code){    if ((kbd_flags & BRK) == BRK)    {	kbd_state = AS;	kbd_flags &= (~ALT);    }    else    {	kbd_state = AK;	kbd_flags &= ALT;    }}/******************************************************************************/static void kbd_led_set (void){    kbd_input_empty();    out8 (I8042_DATA_REG, 0xed);        /* SET LED command */    kbd_input_empty();    out8 (I8042_DATA_REG, (kbd_flags & 0x7));    /* LED bits only */}/******************************************************************************/static int kbd_input_empty (void){    int kbdTimeout = KBD_TIMEOUT;    /* wait for input buf empty */    while ((in8 (I8042_STATUS_REG) & 0x02) && kbdTimeout--)	udelay(1000);    return kbdTimeout;}/******************************************************************************/static int kbd_reset (void){    if (kbd_input_empty() == 0)	return -1;    out8 (I8042_DATA_REG, 0xff);    udelay(250000);    if (kbd_input_empty() == 0)	return -1;    out8 (I8042_DATA_REG, 0x60);    if (kbd_input_empty() == 0)	return -1;    out8 (I8042_DATA_REG, 0x45);    if (kbd_input_empty() == 0)	return -1;    out8 (I8042_COMMAND_REG, 0xae);    if (kbd_input_empty() == 0)	return -1;    return 0;}#endif /* CONFIG_I8042_KBD */

⌨️ 快捷键说明

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