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

📄 pcmb_screen.c

📁 eCos操作系统源码
💻 C
📖 第 1 页 / 共 2 页
字号:
	};static int KBIndexTab[8] = { 0, 1, 2, 2, 3, 3, 3, 3 };//-----------------------------------------------------------------------------static void KeyboardInit(	void){    KBFlags = 0;	} /* KeyboardInit *///-----------------------------------------------------------------------------static CYG_BYTE KeyboardAscii(	CYG_BYTE	scancode){    CYG_BYTE ascii = 0xFF;    // Start by handling all shift/ctl keys:    switch( scancode )    {    case 0x53:  // delete        if (KBFlags & KBCtrl && KBFlags & KBAlt)        {            CYGACC_CALL_IF_RESET();        }        break;    case 0xe0:        KBFlags |= KBExtend;        return 0xFF;    case 0xfa:        KBFlags |= KBAck;        return 0xFF;    case 0xfe:        KBFlags |= KBResend;        return 0xFF;    case LSHIFT:        KBFlags |= KBShiftL;        return 0xFF;    case LSHIFT | BREAK:        KBFlags &= ~KBShiftL;        return 0xFF;    case RSHIFT:        KBFlags |= KBShiftR;        return 0xFF;    case RSHIFT | BREAK:        KBFlags &= ~KBShiftR;        return 0xFF;    case CTRL:        if( KBFlags & KBExtend )        {            KBFlags |= KBCtrlR;            KBFlags &= ~KBExtend;        }        else	KBFlags |= KBCtrlL;        return 0xFF;    case CTRL | BREAK:        if( KBFlags & KBExtend )        {            KBFlags &= ~KBCtrlR;            KBFlags &= ~KBExtend;        }        else	KBFlags &= ~KBCtrlL;        return 0xFF;    case ALT:        if( KBFlags & KBExtend )        {            KBFlags |= KBAltR;            KBFlags &= ~KBExtend;        }        else	KBFlags |= KBAltL;        return 0xFF;    case ALT | BREAK:        if( KBFlags & KBExtend )        {            KBFlags &= ~KBAltR;            KBFlags &= ~KBExtend;        }        else	KBFlags &= ~KBAltL;        return 0xFF;    case CAPS:        KBFlags ^= KBCapsLock;    case CAPS | BREAK:        return 0xFF;    case NUMS:        KBFlags ^= KBNumLock;    case NUMS | BREAK:        return 0xFF;    }    // Clear Extend flag if set    KBFlags &= ~KBExtend;    // Ignore all other BREAK codes    if( scancode & 0x80 ) return 0xFF;    // Here the scancode is for something we can turn    // into an ASCII value    ascii = KBScanTable[scancode & 0x7F][KBIndexTab[KBFlags & KBIndex]];    return ascii;} /* KeyboardAscii *///-----------------------------------------------------------------------------static int KeyboardTest(	void){    // If there is a pending character, return True    if( KBPending != 0xFF ) return true;    // If there is something waiting at the port, get it    for(;;)     {        CYG_BYTE stat, code;        CYG_BYTE c;                HAL_READ_UINT8( KBSTATPORT, stat );        if( (stat & 0x01) == 0 )            break;        HAL_READ_UINT8( KBDATAPORT, code );        // Translate to ASCII        c = KeyboardAscii(code);		        // if it is a real ASCII char, save it and        // return True.        if( c != 0xFF )        {            KBPending = c;            return true;        }    }    // Otherwise return False    return false;	} /* KeyboardTest *///=============================================================================// Basic IO functionsstatic voidcyg_hal_plf_screen_init_channel(void* __ch_data){    KeyboardInit();        XPos	= 0;    YPos	= 0;    ClearScreen();    MoveCursor();}voidcyg_hal_plf_screen_putc(void *__ch_data, char ch){    CYGARC_HAL_SAVE_GP();	switch( ch )	{	case '\n':		NewLine();		return;	case '\r':		XPos = 0;		MoveCursor();		return;	case '\b':		if( XPos == 0 ) return;		XPos--;		MoveCursor();		return;	case '\t':		do		{			DisplayChar(' ');		} while( (XPos % 8) != 0 );		return;	case 0x0c:		ClearScreen();		XPos = YPos = 0;		MoveCursor();		return;			case 1:		ScrollUp(1);		XPos = 0;		YPos = ScreenLength-1;		return;	case 2:		ScrollDown(1);		XPos = 0;		YPos = 0;		return;				default:		DisplayChar(ch);		return;	}    CYGARC_HAL_RESTORE_GP();}static cyg_boolcyg_hal_plf_screen_getc_nonblock(void* __ch_data, cyg_uint8* ch){    if( !KeyboardTest() )        return false;    *ch = KBPending;    KBPending = 0xFF;    return true;}cyg_uint8cyg_hal_plf_screen_getc(void* __ch_data){    cyg_uint8 ch;    CYGARC_HAL_SAVE_GP();    while(!cyg_hal_plf_screen_getc_nonblock(__ch_data, &ch));    CYGARC_HAL_RESTORE_GP();    return ch;}//=============================================================================// Call IF support#if defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG) \    || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES)static voidcyg_hal_plf_screen_write(void* __ch_data, const cyg_uint8* __buf,                          cyg_uint32 __len){    CYGARC_HAL_SAVE_GP();    while(__len-- > 0)        cyg_hal_plf_screen_putc(__ch_data, *__buf++);    CYGARC_HAL_RESTORE_GP();}static voidcyg_hal_plf_screen_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len){    CYGARC_HAL_SAVE_GP();    while(__len-- > 0)        *__buf++ = cyg_hal_plf_screen_getc(__ch_data);    CYGARC_HAL_RESTORE_GP();}cyg_boolcyg_hal_plf_screen_getc_timeout(void* __ch_data, cyg_uint8* ch){    int delay_count;    channel_data_t* chan = (channel_data_t*)__ch_data;    cyg_bool res;    CYGARC_HAL_SAVE_GP();    delay_count = chan->msec_timeout * 10; // delay in .1 ms steps    for(;;) {        res = cyg_hal_plf_screen_getc_nonblock(__ch_data, ch);        if (res || 0 == delay_count--)            break;                CYGACC_CALL_IF_DELAY_US(100);    }    CYGARC_HAL_RESTORE_GP();    return res;}static intcyg_hal_plf_screen_control(void *__ch_data, __comm_control_cmd_t __func, ...){    static int irq_state = 0;    channel_data_t* chan = (channel_data_t*)__ch_data;    int ret = 0;    CYGARC_HAL_SAVE_GP();    switch (__func) {    case __COMMCTL_IRQ_ENABLE:        irq_state = 1;        HAL_INTERRUPT_UNMASK(chan->isr_vector);        break;    case __COMMCTL_IRQ_DISABLE:        ret = irq_state;        irq_state = 0;        HAL_INTERRUPT_MASK(chan->isr_vector);        break;    case __COMMCTL_DBG_ISR_VECTOR:        ret = chan->isr_vector;        break;    case __COMMCTL_SET_TIMEOUT:    {        va_list ap;        va_start(ap, __func);        ret = chan->msec_timeout;        chan->msec_timeout = va_arg(ap, cyg_uint32);        va_end(ap);    }            default:        break;    }    CYGARC_HAL_RESTORE_GP();    return ret;}static intcyg_hal_plf_screen_isr(void *__ch_data, int* __ctrlc,                        CYG_ADDRWORD __vector, CYG_ADDRWORD __data){    int res = 0;    channel_data_t* chan = (channel_data_t*)__ch_data;    char c;    CYGARC_HAL_SAVE_GP();    cyg_drv_interrupt_acknowledge(chan->isr_vector);    *__ctrlc = 0;    if ( KeyboardTest() ) {        c = KBPending;        KBPending = 0xFF;        if( cyg_hal_is_break( &c , 1 ) )            *__ctrlc = 1;        res = CYG_ISR_HANDLED;    }    CYGARC_HAL_RESTORE_GP();    return res;}void cyg_hal_plf_screen_init(void){    hal_virtual_comm_table_t* comm;    int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);    // Disable interrupts.    HAL_INTERRUPT_MASK(pc_ser_channels[PCMB_PORT_INDEX].isr_vector);    // Init channels    cyg_hal_plf_screen_init_channel(&pc_ser_channels[PCMB_PORT_INDEX]);    // Setup procs in the vector table    // Set channel 2    CYGACC_CALL_IF_SET_CONSOLE_COMM(PCMB_PORT_INDEX);    comm = CYGACC_CALL_IF_CONSOLE_PROCS();    CYGACC_COMM_IF_CH_DATA_SET(*comm, &pc_ser_channels[PCMB_PORT_INDEX]);    CYGACC_COMM_IF_WRITE_SET(*comm, cyg_hal_plf_screen_write);    CYGACC_COMM_IF_READ_SET(*comm, cyg_hal_plf_screen_read);    CYGACC_COMM_IF_PUTC_SET(*comm, cyg_hal_plf_screen_putc);    CYGACC_COMM_IF_GETC_SET(*comm, cyg_hal_plf_screen_getc);    CYGACC_COMM_IF_CONTROL_SET(*comm, cyg_hal_plf_screen_control);    CYGACC_COMM_IF_DBG_ISR_SET(*comm, cyg_hal_plf_screen_isr);    CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, cyg_hal_plf_screen_getc_timeout);    // Restore original console    CYGACC_CALL_IF_SET_CONSOLE_COMM(cur);}#endif //  defined(CYGSEM_HAL_VIRTUAL_VECTOR_DIAG)       // || defined(CYGPRI_HAL_IMPLEMENTS_IF_SERVICES)//-----------------------------------------------------------------------------#endif // CYGINT_HAL_I386_PCMB_SCREEN_SUPPORT//-----------------------------------------------------------------------------// End of pcmb_screen.c

⌨️ 快捷键说明

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