1*72cded9eSSimon Glass /* 2*72cded9eSSimon Glass * Copyright (c) 2015 Google, Inc 3*72cded9eSSimon Glass * (C) Copyright 2001-2015 4*72cded9eSSimon Glass * DENX Software Engineering -- wd@denx.de 5*72cded9eSSimon Glass * Compulab Ltd - http://compulab.co.il/ 6*72cded9eSSimon Glass * Bernecker & Rainer Industrieelektronik GmbH - http://www.br-automation.com 7*72cded9eSSimon Glass * 8*72cded9eSSimon Glass * SPDX-License-Identifier: GPL-2.0+ 9*72cded9eSSimon Glass */ 10*72cded9eSSimon Glass 11*72cded9eSSimon Glass #include <common.h> 12*72cded9eSSimon Glass #include <dm.h> 13*72cded9eSSimon Glass #include <video.h> 14*72cded9eSSimon Glass #include <video_console.h> 15*72cded9eSSimon Glass #include <video_font.h> /* Get font data, width and height */ 16*72cded9eSSimon Glass 17*72cded9eSSimon Glass static int console_normal_set_row(struct udevice *dev, uint row, int clr) 18*72cded9eSSimon Glass { 19*72cded9eSSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); 20*72cded9eSSimon Glass void *line; 21*72cded9eSSimon Glass int pixels = VIDEO_FONT_HEIGHT * vid_priv->line_length; 22*72cded9eSSimon Glass int i; 23*72cded9eSSimon Glass 24*72cded9eSSimon Glass line = vid_priv->fb + row * VIDEO_FONT_HEIGHT * vid_priv->line_length; 25*72cded9eSSimon Glass switch (vid_priv->bpix) { 26*72cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP8 27*72cded9eSSimon Glass case VIDEO_BPP8: { 28*72cded9eSSimon Glass uint8_t *dst = line; 29*72cded9eSSimon Glass 30*72cded9eSSimon Glass for (i = 0; i < pixels; i++) 31*72cded9eSSimon Glass *dst++ = clr; 32*72cded9eSSimon Glass break; 33*72cded9eSSimon Glass } 34*72cded9eSSimon Glass #endif 35*72cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP16 36*72cded9eSSimon Glass case VIDEO_BPP16: { 37*72cded9eSSimon Glass uint16_t *dst = line; 38*72cded9eSSimon Glass 39*72cded9eSSimon Glass for (i = 0; i < pixels; i++) 40*72cded9eSSimon Glass *dst++ = clr; 41*72cded9eSSimon Glass break; 42*72cded9eSSimon Glass } 43*72cded9eSSimon Glass #endif 44*72cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP32 45*72cded9eSSimon Glass case VIDEO_BPP32: { 46*72cded9eSSimon Glass uint32_t *dst = line; 47*72cded9eSSimon Glass 48*72cded9eSSimon Glass for (i = 0; i < pixels; i++) 49*72cded9eSSimon Glass *dst++ = clr; 50*72cded9eSSimon Glass break; 51*72cded9eSSimon Glass } 52*72cded9eSSimon Glass #endif 53*72cded9eSSimon Glass default: 54*72cded9eSSimon Glass return -ENOSYS; 55*72cded9eSSimon Glass } 56*72cded9eSSimon Glass 57*72cded9eSSimon Glass return 0; 58*72cded9eSSimon Glass } 59*72cded9eSSimon Glass 60*72cded9eSSimon Glass static int console_normal_move_rows(struct udevice *dev, uint rowdst, 61*72cded9eSSimon Glass uint rowsrc, uint count) 62*72cded9eSSimon Glass { 63*72cded9eSSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(dev->parent); 64*72cded9eSSimon Glass void *dst; 65*72cded9eSSimon Glass void *src; 66*72cded9eSSimon Glass 67*72cded9eSSimon Glass dst = vid_priv->fb + rowdst * VIDEO_FONT_HEIGHT * vid_priv->line_length; 68*72cded9eSSimon Glass src = vid_priv->fb + rowsrc * VIDEO_FONT_HEIGHT * vid_priv->line_length; 69*72cded9eSSimon Glass memmove(dst, src, VIDEO_FONT_HEIGHT * vid_priv->line_length * count); 70*72cded9eSSimon Glass 71*72cded9eSSimon Glass return 0; 72*72cded9eSSimon Glass } 73*72cded9eSSimon Glass 74*72cded9eSSimon Glass static int console_normal_putc_xy(struct udevice *dev, uint x, uint y, char ch) 75*72cded9eSSimon Glass { 76*72cded9eSSimon Glass struct udevice *vid = dev->parent; 77*72cded9eSSimon Glass struct video_priv *vid_priv = dev_get_uclass_priv(vid); 78*72cded9eSSimon Glass int i, row; 79*72cded9eSSimon Glass void *line = vid_priv->fb + y * vid_priv->line_length + 80*72cded9eSSimon Glass x * VNBYTES(vid_priv->bpix); 81*72cded9eSSimon Glass 82*72cded9eSSimon Glass for (row = 0; row < VIDEO_FONT_HEIGHT; row++) { 83*72cded9eSSimon Glass uchar bits = video_fontdata[ch * VIDEO_FONT_HEIGHT + row]; 84*72cded9eSSimon Glass 85*72cded9eSSimon Glass switch (vid_priv->bpix) { 86*72cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP8 87*72cded9eSSimon Glass case VIDEO_BPP8: { 88*72cded9eSSimon Glass uint8_t *dst = line; 89*72cded9eSSimon Glass 90*72cded9eSSimon Glass for (i = 0; i < VIDEO_FONT_WIDTH; i++) { 91*72cded9eSSimon Glass *dst++ = (bits & 0x80) ? vid_priv->colour_fg 92*72cded9eSSimon Glass : vid_priv->colour_bg; 93*72cded9eSSimon Glass bits <<= 1; 94*72cded9eSSimon Glass } 95*72cded9eSSimon Glass break; 96*72cded9eSSimon Glass } 97*72cded9eSSimon Glass #endif 98*72cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP16 99*72cded9eSSimon Glass case VIDEO_BPP16: { 100*72cded9eSSimon Glass uint16_t *dst = line; 101*72cded9eSSimon Glass 102*72cded9eSSimon Glass for (i = 0; i < VIDEO_FONT_WIDTH; i++) { 103*72cded9eSSimon Glass *dst++ = (bits & 0x80) ? vid_priv->colour_fg 104*72cded9eSSimon Glass : vid_priv->colour_bg; 105*72cded9eSSimon Glass bits <<= 1; 106*72cded9eSSimon Glass } 107*72cded9eSSimon Glass break; 108*72cded9eSSimon Glass } 109*72cded9eSSimon Glass #endif 110*72cded9eSSimon Glass #ifdef CONFIG_VIDEO_BPP32 111*72cded9eSSimon Glass case VIDEO_BPP32: { 112*72cded9eSSimon Glass uint32_t *dst = line; 113*72cded9eSSimon Glass 114*72cded9eSSimon Glass for (i = 0; i < VIDEO_FONT_WIDTH; i++) { 115*72cded9eSSimon Glass *dst++ = (bits & 0x80) ? vid_priv->colour_fg 116*72cded9eSSimon Glass : vid_priv->colour_bg; 117*72cded9eSSimon Glass bits <<= 1; 118*72cded9eSSimon Glass } 119*72cded9eSSimon Glass break; 120*72cded9eSSimon Glass } 121*72cded9eSSimon Glass #endif 122*72cded9eSSimon Glass default: 123*72cded9eSSimon Glass return -ENOSYS; 124*72cded9eSSimon Glass } 125*72cded9eSSimon Glass line += vid_priv->line_length; 126*72cded9eSSimon Glass } 127*72cded9eSSimon Glass 128*72cded9eSSimon Glass return 0; 129*72cded9eSSimon Glass } 130*72cded9eSSimon Glass 131*72cded9eSSimon Glass struct vidconsole_ops console_normal_ops = { 132*72cded9eSSimon Glass .putc_xy = console_normal_putc_xy, 133*72cded9eSSimon Glass .move_rows = console_normal_move_rows, 134*72cded9eSSimon Glass .set_row = console_normal_set_row, 135*72cded9eSSimon Glass }; 136*72cded9eSSimon Glass 137*72cded9eSSimon Glass U_BOOT_DRIVER(vidconsole_normal) = { 138*72cded9eSSimon Glass .name = "vidconsole0", 139*72cded9eSSimon Glass .id = UCLASS_VIDEO_CONSOLE, 140*72cded9eSSimon Glass .ops = &console_normal_ops, 141*72cded9eSSimon Glass }; 142