fb_support.c

来自「eCos操作系统源码」· C语言 代码 · 共 681 行 · 第 1/2 页

C
681
字号
    }}static voidlcd_scroll(void){    int row, col;    cyg_uint8 *c1, *c2;    // First scroll up the virtual screen    for (row = (screen_start+1);  row < screen_height;  row++) {        c1 = &screen[row-1][0];        c2 = &screen[row][0];        for (col = 0;  col < screen_width;  col++) {            *c1++ = *c2++;        }    }     c1 = &screen[screen_height-1][0];    for (col = 0;  col < screen_width;  col++) {        *c1++ = 0x20;    }    lcd_refresh();}// Draw one character at the current positionvoidlcd_putc(cyg_int8 c){    if (cursor_enable) {        lcd_drawc(screen[curY][curX], curX-screen_pan, curY);    }    switch (c) {    case '\r':        curX = 0;        break;    case '\n':        curY++;        break;    case '\b':        curX--;        if (curX < 0) {            curY--;            if (curY < 0) curY = 0;            curX = screen_width-1;        }        break;    default:        if (((cyg_uint8)c < FIRST_CHAR) || ((cyg_uint8)c > LAST_CHAR)) c = '.';        screen[curY][curX] = c;        lcd_drawc(c, curX-screen_pan, curY);        curX++;        if (curX == screen_width) {            curY++;            curX = 0;        }    }     if (curY >= screen_height) {        lcd_scroll();        curY = (screen_height-1);    }    if (cursor_enable) {        lcd_drawc(CURSOR_ON, curX-screen_pan, curY);    }}voidlcd_setbg(int red, int green, int blue){    bg = RGB_RED(red) | RGB_GREEN(green) | RGB_BLUE(blue);}voidlcd_setfg(int red, int green, int blue){    fg = RGB_RED(red) | RGB_GREEN(green) | RGB_BLUE(blue);}static int  _timeout = 500;static int_hexdigit(char c){    if ((c >= '0') && (c <= '9')) {        return c - '0';    } else    if ((c >= 'A') && (c <= 'F')) {        return (c - 'A') + 0x0A;    } else    if ((c >= 'a') && (c <= 'f')) {        return (c - 'a') + 0x0a;    }}static int_hex(char *cp){    return (_hexdigit(*cp)<<4) | _hexdigit(*(cp+1));}static unsigned shortparse_color(char *cp){    int red, green, blue;    while (*cp && (*cp != 'c')) cp++;    if (cp) {        cp += 2;        if (*cp == '#') {            red = _hex(cp+1);            green = _hex(cp+3);            blue = _hex(cp+5);#ifdef USE_RGB565            return RGB_RED(red>>3) | RGB_GREEN(green>>2) | RGB_BLUE(blue>>3);#else            return RGB_RED(red>>3) | RGB_GREEN(green>>3) | RGB_BLUE(blue>>3);#endif        } else {            // Should be "None"            return 0xFFFF;        }    } else {        return 0xFFFF;    }}#ifndef CYGINT_ISO_STDIO_FORMATTED_IOstatic intget_int(char **_cp){    char *cp = *_cp;    char c;    int val = 0;        while ((c = *cp++) && (c != ' ')) {        if ((c >= '0') && (c <= '9')) {            val = val * 10 + (c - '0');        } else {            return -1;        }    }    *_cp = cp;    return val;}#endifintshow_xpm(char *xpm[], int screen_pos){    int i, row, col, offset;    char *cp;    int nrows, ncols, nclrs;    unsigned short colors[256];  // Mapped by character index    cp = xpm[0];#ifdef CYGINT_ISO_STDIO_FORMATTED_IO    if (sscanf(cp, "%d %d %d", &ncols, &nrows, &nclrs) != 3) {#else    if (((ncols = get_int(&cp)) < 0) ||        ((nrows = get_int(&cp)) < 0) ||        ((nclrs = get_int(&cp)) < 0)) {#endif        diag_printf("Can't parse XPM data, sorry\n");        return 0;    }    // printf("%d rows, %d cols, %d colors\n", nrows, ncols, nclrs);    for (i = 0;  i < 256;  i++) {        colors[i] = 0x0000;    }    for (i = 0;  i < nclrs;  i++) {        cp = xpm[i+1];        colors[(unsigned int)*cp] = parse_color(&cp[1]);        // printf("Color[%c] = %x\n", *cp, colors[(unsigned int)*cp]);    }#ifdef LOGO_AT_TOP    offset = screen_pos;#else    offset = screen_pos-nrows;#endif    for (row = 0;  row < nrows;  row++) {                    cp = xpm[nclrs+1+row];                for (col = 0;  col < ncols;  col++) {            set_pixel(row+offset, col, colors[(unsigned int)*cp++]);        }    }#ifdef LOGO_AT_TOP    screen_start = (nrows + (FONT_HEIGHT-1))/FONT_HEIGHT;    return offset+nrows;#else        screen_height = offset / FONT_HEIGHT;    return offset;#endif}void fb_init(int depth){    int cable = dcfb_cable_check();    unsigned long **parm_list[4] = {        dc_parm_vga, dc_parm_vga, dc_parm_interlace, dc_parm_composite,    };    unsigned long **dc_parms = parm_list[cable];    unsigned long a, d, *p;      switch(depth) {    default:    case 16:        p = dc_parms[0];        break;    case 32:        p = dc_parms[1];        break;    }      HAL_WRITE_UINT32(RESETREG, 0);    HAL_WRITE_UINT32(BORDERRGB, 0);    while(1) {        a = *p++; d = *p++;        if (!a) break;        HAL_WRITE_UINT32(a, d);    }    lcd_clear();}static cyg_boollcd_comm_getc_nonblock(void* __ch_data, cyg_uint8* ch){    return false;}static cyg_uint8lcd_comm_getc(void* __ch_data){    cyg_uint8 ch;    while (!lcd_comm_getc_nonblock(__ch_data, &ch)) ;    return ch;}static voidlcd_comm_putc(void* __ch_data, cyg_uint8 c){    lcd_putc(c);}static voidlcd_comm_write(void* __ch_data, const cyg_uint8* __buf, cyg_uint32 __len){}static voidlcd_comm_read(void* __ch_data, cyg_uint8* __buf, cyg_uint32 __len){}static cyg_boollcd_comm_getc_timeout(void* __ch_data, cyg_uint8* ch){    int delay_count;    cyg_bool res;    delay_count = _timeout * 10; // delay in .1 ms steps    for(;;) {        res = lcd_comm_getc_nonblock(__ch_data, ch);        if (res || 0 == delay_count--)            break;        CYGACC_CALL_IF_DELAY_US(100);    }    return res;}static intlcd_comm_control(void *__ch_data, __comm_control_cmd_t __func, ...){    int ret = 0;    switch (__func) {    case __COMMCTL_SET_TIMEOUT:    {        va_list ap;        va_start(ap, __func);        ret = _timeout;        _timeout = va_arg(ap, cyg_uint32);        va_end(ap);	break;    }    case __COMMCTL_FLUSH_OUTPUT:	break;    default:        break;    }    return ret;}static intlcd_comm_isr(void *__ch_data, int* __ctrlc,            CYG_ADDRWORD __vector, CYG_ADDRWORD __data){    return 0;}void fb_comm_init(void){    static int init = 0;      if (!init) {        hal_virtual_comm_table_t* comm;        int cur = CYGACC_CALL_IF_SET_CONSOLE_COMM(CYGNUM_CALL_IF_SET_COMM_ID_QUERY_CURRENT);            // Setup procs in the vector table        CYGACC_CALL_IF_SET_CONSOLE_COMM(1);        comm = CYGACC_CALL_IF_CONSOLE_PROCS();        //CYGACC_COMM_IF_CH_DATA_SET(*comm, chan);        CYGACC_COMM_IF_WRITE_SET(*comm, lcd_comm_write);        CYGACC_COMM_IF_READ_SET(*comm, lcd_comm_read);        CYGACC_COMM_IF_PUTC_SET(*comm, lcd_comm_putc);        CYGACC_COMM_IF_GETC_SET(*comm, lcd_comm_getc);        CYGACC_COMM_IF_CONTROL_SET(*comm, lcd_comm_control);        CYGACC_COMM_IF_DBG_ISR_SET(*comm, lcd_comm_isr);        CYGACC_COMM_IF_GETC_TIMEOUT_SET(*comm, lcd_comm_getc_timeout);            // Restore original console        CYGACC_CALL_IF_SET_CONSOLE_COMM(cur);                init = 1;    }}//-----------------------------------------------------------------------------// End of fb_support.c

⌨️ 快捷键说明

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