void __console_init(void *framebuffer,int xstart,int ystart,int xres,int yres,int stride) { unsigned int level; console_data_s *con = &stdcon; _CPU_ISR_Disable(level); con->destbuffer = framebuffer; con->con_xres = xres; con->con_yres = yres; con->con_cols = xres / FONT_XSIZE; con->con_rows = yres / FONT_YSIZE; con->con_stride = con->tgt_stride = stride; con->target_x = xstart; con->target_y = ystart; con->font = console_font_8x16; con->foreground = COLOR_WHITE; con->background = COLOR_BLACK; curr_con = con; __console_clear(); devoptab_list[STD_OUT] = &dotab_stdout; devoptab_list[STD_ERR] = &dotab_stdout; _CPU_ISR_Restore(level); setvbuf(stdout, NULL , _IONBF, 0); }
void __console_init_ex(void *conbuffer,int tgt_xstart,int tgt_ystart,int tgt_stride,int con_xres,int con_yres,int con_stride) { unsigned int level; console_data_s *con = &stdcon; _CPU_ISR_Disable(level); con->destbuffer = conbuffer; con->target_x = tgt_xstart; con->target_y = tgt_ystart; con->con_xres = con_xres; con->con_yres = con_yres; con->tgt_stride = tgt_stride; con->con_stride = con_stride; con->con_cols = con_xres / FONT_XSIZE; con->con_rows = con_yres / FONT_YSIZE; con->cursor_row = 0; con->cursor_col = 0; con->saved_row = 0; con->saved_col = 0; con->font = console_font_8x16; con->foreground = COLOR_WHITE; con->background = COLOR_BLACK; curr_con = con; if(_bg_buffer) { _bg_grab(); con->background = _bg_color; } __console_clear(); fb_change = 1; retrace_cnt = 0; devoptab_list[STD_OUT] = &dotab_stdout; devoptab_list[STD_ERR] = &dotab_stdout; VIDEO_SetPostRetraceCallback(__console_vipostcb); _CPU_ISR_Restore(level); setvbuf(stdout, NULL , _IONBF, 0); setvbuf(stderr, NULL , _IONBF, 0); }
static int __console_parse_escsequence(char *pchr) { char chr; console_data_s *con; int i; int parameters[3]; int para; if(!curr_con) return -1; con = curr_con; /* set default value */ para = 0; parameters[0] = 0; parameters[1] = 0; parameters[2] = 0; /* scan parameters */ i = 0; chr = *pchr; while( (para < 3) && (chr >= '0') && (chr <= '9') ) { while( (chr >= '0') && (chr <= '9') ) { /* parse parameter */ parameters[para] *= 10; parameters[para] += chr - '0'; pchr++; i++; chr = *pchr; } para++; if( *pchr == ';' ) { /* skip parameter delimiter */ pchr++; i++; } chr = *pchr; } /* get final character */ chr = *pchr++; i++; switch(chr) { ///////////////////////////////////////// // Cursor directional movement ///////////////////////////////////////// case 'A': { curr_con->cursor_row -= parameters[0]; if(curr_con->cursor_row < 0) curr_con->cursor_row = 0; break; } case 'B': { curr_con->cursor_row += parameters[0]; if(curr_con->cursor_row >= curr_con->con_rows) curr_con->cursor_row = curr_con->con_rows - 1; break; } case 'C': { curr_con->cursor_col += parameters[0]; if(curr_con->cursor_col >= curr_con->con_cols) curr_con->cursor_col = curr_con->con_cols - 1; break; } case 'D': { curr_con->cursor_col -= parameters[0]; if(curr_con->cursor_col < 0) curr_con->cursor_col = 0; break; } ///////////////////////////////////////// // Cursor position movement ///////////////////////////////////////// case 'H': case 'f': { curr_con->cursor_col = parameters[1]; curr_con->cursor_row = parameters[0]; if(curr_con->cursor_row >= curr_con->con_rows) curr_con->cursor_row = curr_con->con_rows - 1; if(curr_con->cursor_col >= curr_con->con_cols) curr_con->cursor_col = curr_con->con_cols - 1; break; } ///////////////////////////////////////// // Screen clear ///////////////////////////////////////// case 'J': { /* different erase modes not yet supported, just clear all */ __console_clear(); break; } ///////////////////////////////////////// // Line clear ///////////////////////////////////////// case 'K': { break; } ///////////////////////////////////////// // Save cursor position ///////////////////////////////////////// case 's': { con->saved_col = con->cursor_col; con->saved_row = con->cursor_row; break; } ///////////////////////////////////////// // Load cursor position ///////////////////////////////////////// case 'u': con->cursor_col = con->saved_col; con->cursor_row = con->saved_row; break; ///////////////////////////////////////// // SGR Select Graphic Rendition ///////////////////////////////////////// case 'm': { // handle 30-37,39 for foreground color changes if( (parameters[0] >= 30) && (parameters[0] <= 39) ) { parameters[0] -= 30; //39 is the reset code if(parameters[0] == 9){ parameters[0] = 15; } else if(parameters[0] > 7){ parameters[0] = 7; } if(parameters[1] == 1) { // Intensity: Bold makes color bright parameters[0] += 8; } con->foreground = color_table[parameters[0]]; } // handle 40-47 for background color changes else if( (parameters[0] >= 40) && (parameters[0] <= 47) ) { parameters[0] -= 40; if(parameters[1] == 1) { // Intensity: Bold makes color bright parameters[0] += 8; } con->background = color_table[parameters[0]]; } break; } } return(i); }