From patchwork Wed Feb 5 16:49:57 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Anatolij Gustschin X-Patchwork-Id: 1233910 X-Patchwork-Delegate: agust@denx.de Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=denx.de header.i=@denx.de header.a=rsa-sha256 header.s=phobos-20191101 header.b=kRvhiOGk; dkim-atps=neutral Received: from phobos.denx.de (phobos.denx.de [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48CSH10b4Zz9sRQ for ; Thu, 6 Feb 2020 03:50:17 +1100 (AEDT) Received: from h2850616.stratoserver.net (localhost [IPv6:::1]) by phobos.denx.de (Postfix) with ESMTP id 7395A81A8D; Wed, 5 Feb 2020 17:50:06 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: phobos.denx.de; spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=denx.de; s=phobos-20191101; t=1580921406; bh=IsGjW7cKTJkucT8LwXmSK9OhDgeKf+J979etPYRlooc=; h=From:To:Subject:Date:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:Cc:From; b=kRvhiOGk+6ijTlMhiHatMl3YQ2EFjlt/B+wuizHFms5tTqtHp2G/Rmc5xhgL2uP9R cwrd9eTq4BdY+4asmuq5htpJBGh6Dtji4p1LVfEdInUcXuC/0nbMe2XQH8qZL8p9ZW VFm9WJSVK6MM+2G1krgt8O6s6lz91vpLlCf7qV0RbGNp65YNWdHaGNLky36j6mFqXw qWjjpTBarRauKK9V9m9lb8i5E713VrncANKjAVi7zhKrXatKbPNrusvxwVi8+8DIEW prWQLtFBoDqYYjhfBxm3Ox29QvsruSjcWxLfDS7r6aKfUb5UdfanNj7G4ephVQTno7 nLrECtL09y0CA== Received: by phobos.denx.de (Postfix, from userid 109) id 78CBA81B0B; Wed, 5 Feb 2020 17:50:04 +0100 (CET) X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.2 Received: from mail-out.m-online.net (mail-out.m-online.net [212.18.0.9]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by phobos.denx.de (Postfix) with ESMTPS id 0F9178194A for ; Wed, 5 Feb 2020 17:50:00 +0100 (CET) Authentication-Results: phobos.denx.de; dmarc=none (p=none dis=none) header.from=denx.de Authentication-Results: phobos.denx.de; spf=none smtp.mailfrom=agust@denx.de Received: from frontend01.mail.m-online.net (unknown [192.168.8.182]) by mail-out.m-online.net (Postfix) with ESMTP id 48CSGc5Pgjz1qqkm; Wed, 5 Feb 2020 17:50:00 +0100 (CET) Received: from localhost (dynscan1.mnet-online.de [192.168.6.70]) by mail.m-online.net (Postfix) with ESMTP id 48CSGc4s3mz1rJS9; Wed, 5 Feb 2020 17:50:00 +0100 (CET) Received: from mail.mnet-online.de ([192.168.8.182]) by localhost (dynscan1.mail.m-online.net [192.168.6.70]) (amavisd-new, port 10024) with ESMTP id tmSScUMvjnXP; Wed, 5 Feb 2020 17:49:59 +0100 (CET) X-Auth-Info: 730lJ60jh6ivDjwr9V1ARMaJN41a1ITzePMNGjIQTik= Received: from crub.agik.hopto.org (pD95F1BAA.dip0.t-ipconnect.de [217.95.27.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.mnet-online.de (Postfix) with ESMTPSA; Wed, 5 Feb 2020 17:49:59 +0100 (CET) From: Anatolij Gustschin To: u-boot@lists.denx.de Subject: [PATCH 1/3] video: add support for drawing 8bpp bitmap on 32bpp framebuffer Date: Wed, 5 Feb 2020 17:49:57 +0100 Message-Id: <20200205164959.31404-1-agust@denx.de> X-Mailer: git-send-email 2.17.1 X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.26 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: uboot-imx@nxp.com Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" X-Virus-Scanned: clamav-milter 0.101.4 at phobos.denx.de X-Virus-Status: Clean cfb_console driver supported 8bpp bitmap drawing on 24bpp/32bpp displays and some boards used this configuration for drawing the logo. After conversion to DM_VIDEO the logo drawing on such boards doesn't work any more due to missing rendering code in the updated bmp command code for DM_VIDEO. Add 8bpp bitmap support for 32bpp displays. Signed-off-by: Anatolij Gustschin --- drivers/video/video-uclass.c | 6 ++++ drivers/video/video_bmp.c | 62 ++++++++++++++++++++++++------------ include/video.h | 2 +- 3 files changed, 48 insertions(+), 22 deletions(-) diff --git a/drivers/video/video-uclass.c b/drivers/video/video-uclass.c index 12057c8a5b..44380a38d9 100644 --- a/drivers/video/video-uclass.c +++ b/drivers/video/video-uclass.c @@ -228,6 +228,12 @@ static int video_post_probe(struct udevice *dev) struct udevice *cons; int ret; + if (priv->bpix == VIDEO_BPP32) { + priv->cmap = realloc(priv->cmap, 256 * sizeof(uint)); + if (!priv->cmap) + return -ENOMEM; + } + /* Set up the line and display size */ priv->fb = map_sysmem(plat->base, plat->size); if (!priv->line_length) diff --git a/drivers/video/video_bmp.c b/drivers/video/video_bmp.c index 8768228029..79d6c6afa5 100644 --- a/drivers/video/video_bmp.c +++ b/drivers/video/video_bmp.c @@ -172,16 +172,29 @@ static void video_set_cmap(struct udevice *dev, struct bmp_color_table_entry *cte, unsigned colours) { struct video_priv *priv = dev_get_uclass_priv(dev); + u16 *cmap16; + u32 *cmap32; int i; - ushort *cmap = priv->cmap; debug("%s: colours=%d\n", __func__, colours); - for (i = 0; i < colours; ++i) { - *cmap = ((cte->red << 8) & 0xf800) | - ((cte->green << 3) & 0x07e0) | - ((cte->blue >> 3) & 0x001f); - cmap++; - cte++; + if (priv->bpix == VIDEO_BPP16) { + cmap16 = priv->cmap; + for (i = 0; i < colours; ++i) { + *cmap16 = ((cte->red << 8) & 0xf800) | + ((cte->green << 3) & 0x07e0) | + ((cte->blue >> 3) & 0x001f); + cmap16++; + cte++; + } + } else if (priv->bpix == VIDEO_BPP32) { + cmap32 = priv->cmap; + for (i = 0; i < colours; ++i) { + *cmap32 = (cte->red << 16) | + (cte->green << 8) | + cte->blue; + cmap32++; + cte++; + } } } @@ -189,7 +202,8 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y, bool align) { struct video_priv *priv = dev_get_uclass_priv(dev); - ushort *cmap_base = NULL; + u32 *cmap32_base = NULL; + u16 *cmap16_base = NULL; int i, j; uchar *fb; struct bmp_image *bmp = map_sysmem(bmp_image, 0); @@ -227,11 +241,11 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y, } /* - * We support displaying 8bpp and 24bpp BMPs on 16bpp LCDs - * and displaying 24bpp BMPs on 32bpp LCDs + * We support displaying 8bpp and 24bpp BMPs on 16bpp or 32bpp LCDs */ if (bpix != bmp_bpix && !(bmp_bpix == 8 && bpix == 16) && + !(bmp_bpix == 8 && bpix == 32) && !(bmp_bpix == 24 && bpix == 16) && !(bmp_bpix == 24 && bpix == 32)) { printf("Error: %d bit/pixel mode, but BMP has %d bit/pixel\n", @@ -264,36 +278,42 @@ int video_bmp_display(struct udevice *dev, ulong bmp_image, int x, int y, switch (bmp_bpix) { case 1: case 8: { - cmap_base = priv->cmap; #ifdef CONFIG_VIDEO_BMP_RLE8 u32 compression = get_unaligned_le32(&bmp->header.compression); debug("compressed %d %d\n", compression, BMP_BI_RLE8); if (compression == BMP_BI_RLE8) { if (bpix != 16) { /* TODO implement render code for bpix != 16 */ - printf("Error: only support 16 bpix"); + printf("Error: only support 16 bpix\n"); return -EPROTONOSUPPORT; } - video_display_rle8_bitmap(dev, bmp, cmap_base, fb, x, + video_display_rle8_bitmap(dev, bmp, priv->cmap, fb, x, y, width, height); break; } #endif - if (bpix != 16) - byte_width = width; - else + cmap16_base = priv->cmap; + cmap32_base = priv->cmap; + + if (bpix == 16) byte_width = width * 2; + else if (bpix == 32) + byte_width = width * 4; + else + byte_width = width; for (i = 0; i < height; ++i) { WATCHDOG_RESET(); for (j = 0; j < width; j++) { - if (bpix != 16) { - fb_put_byte(&fb, &bmap); - } else { - *(uint16_t *)fb = cmap_base[*bmap]; - bmap++; + if (bpix == 16) { + *(uint16_t *)fb = cmap16_base[*bmap++]; fb += sizeof(uint16_t) / sizeof(*fb); + } else if (bpix == 32) { + *(uint32_t *)fb = cmap32_base[*bmap++]; + fb += 4; + } else { + fb_put_byte(&fb, &bmap); } } bmap += (padded_width - width); diff --git a/include/video.h b/include/video.h index e7c58e86cb..2f3183f873 100644 --- a/include/video.h +++ b/include/video.h @@ -93,7 +93,7 @@ struct video_priv { u32 colour_fg; u32 colour_bg; bool flush_dcache; - ushort *cmap; + void *cmap; u8 fg_col_idx; u8 bg_col_idx; };