172cded9eSSimon Glass /* 272cded9eSSimon Glass * Copyright (c) 2015 Google, Inc 372cded9eSSimon Glass * (C) Copyright 2001-2015 472cded9eSSimon Glass * DENX Software Engineering -- wd@denx.de 572cded9eSSimon Glass * Compulab Ltd - http://compulab.co.il/ 672cded9eSSimon Glass * Bernecker & Rainer Industrieelektronik GmbH - http://www.br-automation.com 772cded9eSSimon Glass * 872cded9eSSimon Glass * SPDX-License-Identifier: GPL-2.0+ 972cded9eSSimon Glass */ 1072cded9eSSimon Glass 1172cded9eSSimon Glass #include <common.h> 1272cded9eSSimon Glass #include <dm.h> 1372cded9eSSimon Glass #include <video.h> 1472cded9eSSimon Glass #include <video_console.h> 1572cded9eSSimon Glass #include <video_font.h> /* Get font data, width and height */ 1672cded9eSSimon Glass 1772cded9eSSimon Glass static int console_normal_set_row(struct udevice *dev, uint row, int clr) 1872cded9eSSimon Glass { 1972cded9eSSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); 2072cded9eSSimon Glass void *line; 21*7682736cSeric.gao@rock-chips.com int pixels = VIDEO_FONT_HEIGHT * vid_priv->xsize; 2272cded9eSSimon Glass int i; 2372cded9eSSimon Glass 2472cded9eSSimon Glass line = vid_priv->fb + row * VIDEO_FONT_HEIGHT * vid_priv->line_length; 2572cded9eSSimon Glass switch (vid_priv->bpix) { 2672cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP8 2772cded9eSSimon Glass case VIDEO_BPP8: { 2872cded9eSSimon Glass uint8_t *dst = line; 2972cded9eSSimon Glass 3072cded9eSSimon Glass for (i = 0; i < pixels; i++) 3172cded9eSSimon Glass *dst++ = clr; 3272cded9eSSimon Glass break; 3372cded9eSSimon Glass } 3472cded9eSSimon Glass #endif 3572cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP16 3672cded9eSSimon Glass case VIDEO_BPP16: { 3772cded9eSSimon Glass uint16_t *dst = line; 3872cded9eSSimon Glass 3972cded9eSSimon Glass for (i = 0; i < pixels; i++) 4072cded9eSSimon Glass *dst++ = clr; 4172cded9eSSimon Glass break; 4272cded9eSSimon Glass } 4372cded9eSSimon Glass #endif 4472cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP32 4572cded9eSSimon Glass case VIDEO_BPP32: { 4672cded9eSSimon Glass uint32_t *dst = line; 4772cded9eSSimon Glass 4872cded9eSSimon Glass for (i = 0; i < pixels; i++) 4972cded9eSSimon Glass *dst++ = clr; 5072cded9eSSimon Glass break; 5172cded9eSSimon Glass } 5272cded9eSSimon Glass #endif 5372cded9eSSimon Glass default: 5472cded9eSSimon Glass return -ENOSYS; 5572cded9eSSimon Glass } 5672cded9eSSimon Glass 5772cded9eSSimon Glass return 0; 5872cded9eSSimon Glass } 5972cded9eSSimon Glass 6072cded9eSSimon Glass static int console_normal_move_rows(struct udevice *dev, uint rowdst, 6172cded9eSSimon Glass uint rowsrc, uint count) 6272cded9eSSimon Glass { 6372cded9eSSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); 6472cded9eSSimon Glass void *dst; 6572cded9eSSimon Glass void *src; 6672cded9eSSimon Glass 6772cded9eSSimon Glass dst = vid_priv->fb + rowdst * VIDEO_FONT_HEIGHT * vid_priv->line_length; 6872cded9eSSimon Glass src = vid_priv->fb + rowsrc * VIDEO_FONT_HEIGHT * vid_priv->line_length; 6972cded9eSSimon Glass memmove(dst, src, VIDEO_FONT_HEIGHT * vid_priv->line_length * count); 7072cded9eSSimon Glass 7172cded9eSSimon Glass return 0; 7272cded9eSSimon Glass } 7372cded9eSSimon Glass 74f2661786SSimon Glass static int console_normal_putc_xy(struct udevice *dev, uint x_frac, uint y, 75f2661786SSimon Glass char ch) 7672cded9eSSimon Glass { 77f2661786SSimon Glass struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); 7872cded9eSSimon Glass struct udevice *vid = dev->parent; 7972cded9eSSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(vid); 8072cded9eSSimon Glass int i, row; 8172cded9eSSimon Glass void *line = vid_priv->fb + y * vid_priv->line_length + 82f2661786SSimon Glass VID_TO_PIXEL(x_frac) * VNBYTES(vid_priv->bpix); 83f2661786SSimon Glass 84f2661786SSimon Glass if (x_frac + VID_TO_POS(vc_priv->x_charsize) > vc_priv->xsize_frac) 85f2661786SSimon Glass return -EAGAIN; 8672cded9eSSimon Glass 8772cded9eSSimon Glass for (row = 0; row < VIDEO_FONT_HEIGHT; row++) { 8872cded9eSSimon Glass uchar bits = video_fontdata[ch * VIDEO_FONT_HEIGHT + row]; 8972cded9eSSimon Glass 9072cded9eSSimon Glass switch (vid_priv->bpix) { 9172cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP8 9272cded9eSSimon Glass case VIDEO_BPP8: { 9372cded9eSSimon Glass uint8_t *dst = line; 9472cded9eSSimon Glass 9572cded9eSSimon Glass for (i = 0; i < VIDEO_FONT_WIDTH; i++) { 9672cded9eSSimon Glass *dst++ = (bits & 0x80) ? vid_priv->colour_fg 9772cded9eSSimon Glass : vid_priv->colour_bg; 9872cded9eSSimon Glass bits <<= 1; 9972cded9eSSimon Glass } 10072cded9eSSimon Glass break; 10172cded9eSSimon Glass } 10272cded9eSSimon Glass #endif 10372cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP16 10472cded9eSSimon Glass case VIDEO_BPP16: { 10572cded9eSSimon Glass uint16_t *dst = line; 10672cded9eSSimon Glass 10772cded9eSSimon Glass for (i = 0; i < VIDEO_FONT_WIDTH; i++) { 10872cded9eSSimon Glass *dst++ = (bits & 0x80) ? vid_priv->colour_fg 10972cded9eSSimon Glass : vid_priv->colour_bg; 11072cded9eSSimon Glass bits <<= 1; 11172cded9eSSimon Glass } 11272cded9eSSimon Glass break; 11372cded9eSSimon Glass } 11472cded9eSSimon Glass #endif 11572cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP32 11672cded9eSSimon Glass case VIDEO_BPP32: { 11772cded9eSSimon Glass uint32_t *dst = line; 11872cded9eSSimon Glass 11972cded9eSSimon Glass for (i = 0; i < VIDEO_FONT_WIDTH; i++) { 12072cded9eSSimon Glass *dst++ = (bits & 0x80) ? vid_priv->colour_fg 12172cded9eSSimon Glass : vid_priv->colour_bg; 12272cded9eSSimon Glass bits <<= 1; 12372cded9eSSimon Glass } 12472cded9eSSimon Glass break; 12572cded9eSSimon Glass } 12672cded9eSSimon Glass #endif 12772cded9eSSimon Glass default: 12872cded9eSSimon Glass return -ENOSYS; 12972cded9eSSimon Glass } 13072cded9eSSimon Glass line += vid_priv->line_length; 13172cded9eSSimon Glass } 13272cded9eSSimon Glass 133f2661786SSimon Glass return VID_TO_POS(VIDEO_FONT_WIDTH); 134f2661786SSimon Glass } 135f2661786SSimon Glass 136f2661786SSimon Glass static int console_normal_probe(struct udevice *dev) 137f2661786SSimon Glass { 138f2661786SSimon Glass struct vidconsole_priv *vc_priv = dev_get_uclass_priv(dev); 139f2661786SSimon Glass struct udevice *vid_dev = dev->parent; 140f2661786SSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(vid_dev); 141f2661786SSimon Glass 142f2661786SSimon Glass vc_priv->x_charsize = VIDEO_FONT_WIDTH; 143f2661786SSimon Glass vc_priv->y_charsize = VIDEO_FONT_HEIGHT; 144f2661786SSimon Glass vc_priv->cols = vid_priv->xsize / VIDEO_FONT_WIDTH; 145f2661786SSimon Glass vc_priv->rows = vid_priv->ysize / VIDEO_FONT_HEIGHT; 146f2661786SSimon Glass 14772cded9eSSimon Glass return 0; 14872cded9eSSimon Glass } 14972cded9eSSimon Glass 15072cded9eSSimon Glass struct vidconsole_ops console_normal_ops = { 15172cded9eSSimon Glass .putc_xy = console_normal_putc_xy, 15272cded9eSSimon Glass .move_rows = console_normal_move_rows, 15372cded9eSSimon Glass .set_row = console_normal_set_row, 15472cded9eSSimon Glass }; 15572cded9eSSimon Glass 15672cded9eSSimon Glass U_BOOT_DRIVER(vidconsole_normal) = { 15772cded9eSSimon Glass .name = "vidconsole0", 15872cded9eSSimon Glass .id = UCLASS_VIDEO_CONSOLE, 15972cded9eSSimon Glass .ops = &console_normal_ops, 160f2661786SSimon Glass .probe = console_normal_probe, 16172cded9eSSimon Glass }; 162