【问题标题】:Monochromatic (1bpp) simple framebuffer (simplefb.c) format/depth单色 (1bpp) 简单帧缓冲区 (simplefb.c) 格式/深度
【发布时间】:2021-07-27 12:57:48
【问题描述】:

我成功地使用了具有每像素 16 位编码 (r5g6b5) 设置的简单帧缓冲区驱动程序 (https://github.com/torvalds/linux/blob/fcadab740480e0e0e9fa9bd272acd409884d431a/drivers/video/fbdev/simplefb.c)。现在,我想对使用每像素 1 位深度的较小单色显示器使用类似的方法。根据源代码,简单的帧缓冲似乎不支持这种操作模式。是否可以按照下面建议的方式将此模式(“y1”)添加到 SIMPLEFB_FORMATS 定义(https://github.com/torvalds/linux/blob/fcadab740480e0e0e9fa9bd272acd409884d431a/include/linux/platform_data/simplefb.h)中?然后在devicetree中使用这个模式?

#define SIMPLEFB_FORMATS \{ \ 
 { "r5g6b5", 16, {11, 5}, {5, 6}, {0, 5}, {0, 0}, DRM_FORMAT_RGB565 }, \
 ....
 { "y1", 1, {0, 1}, {0, 0}, {0, 0}, {0, 0}, DRM_FORMAT_MONO }, \
}

这个问题有什么通用的解决方案吗?我需要在给定的物理地址上分配一个帧缓冲区,每像素深度为 1 位...

提前致谢, 迈克

【问题讨论】:

  • 下面是什么硬件?
  • 这可能不像扩展SIMPLEFB_FORMATS那么简单,因为simplefb_fix.visual会得到错误的值FB_VISUAL_TRUECOLOR。需要对simplefb_probe() 进行一些更改才能将info->fix.visual 设置为正确的值。
  • 下面的硬件是一个定制的 FPGA IP 块。实际的帧缓冲内存是映射到 Linux 内存空间的 FPGA Block RAM。

标签: linux linux-device-driver display framebuffer monochrome


【解决方案1】:

我以这种方式在简单的帧缓冲区中实现了 1bpp:

diff --git a/drivers/video/fbdev/simplefb.c b/drivers/video/fbdev/simplefb.c
index 533a047d07a2..9c654ff10ab7 100644
--- a/drivers/video/fbdev/simplefb.c
+++ b/drivers/video/fbdev/simplefb.c
@@ -25,7 +25,8 @@
 #include <linux/parser.h>
 #include <linux/regulator/consumer.h>
 
-static const struct fb_fix_screeninfo simplefb_fix = {
+// removed const
+static struct fb_fix_screeninfo simplefb_fix = {
        .id             = "simple",
        .type           = FB_TYPE_PACKED_PIXELS,
        .visual         = FB_VISUAL_TRUECOLOR,
@@ -432,6 +433,10 @@ static int simplefb_probe(struct platform_device *pdev)
 
        par = info->par;
 
+       if (params.format->bits_per_pixel == 1) {
+         simplefb_fix.visual = FB_VISUAL_MONO01;
+       }
+
        info->fix = simplefb_fix;
        info->fix.smem_start = mem->start;
        info->fix.smem_len = resource_size(mem);
@@ -480,10 +485,10 @@ static int simplefb_probe(struct platform_device *pdev)
        dev_info(&pdev->dev, "framebuffer at 0x%lx, 0x%x bytes, mapped to 0x%p\n",
                             info->fix.smem_start, info->fix.smem_len,
                             info->screen_base);
-       dev_info(&pdev->dev, "format=%s, mode=%dx%dx%d, linelength=%d\n",
+       dev_info(&pdev->dev, "format=%s, mode=%dx%dx%d, linelength=%d, visual=%d\n",
                             params.format->name,
                             info->var.xres, info->var.yres,
-                            info->var.bits_per_pixel, info->fix.line_length);
+                            info->var.bits_per_pixel, info->fix.line_length, simplefb_fix.visual);
 
        ret = register_framebuffer(info);
        if (ret < 0) {
diff --git a/include/linux/platform_data/simplefb.h b/include/linux/platform_data/simplefb.h
index ca8337695c2a..77714fc5f789 100644
--- a/include/linux/platform_data/simplefb.h
+++ b/include/linux/platform_data/simplefb.h
@@ -24,6 +24,7 @@
        { "a8b8g8r8", 32, {0, 8}, {8, 8}, {16, 8}, {24, 8}, DRM_FORMAT_ABGR8888 }, \
        { "x2r10g10b10", 32, {20, 10}, {10, 10}, {0, 10}, {0, 0}, DRM_FORMAT_XRGB2101010 }, \
        { "a2r10g10b10", 32, {20, 10}, {10, 10}, {0, 10}, {30, 2}, DRM_FORMAT_ARGB2101010 }, \
+       { "r1", 1, {0, 1}, {0, 0}, {0, 0}, {0, 0}, 0 }, \
 }
 
 /*

然后设备树记录以这种方式查找 256x128 单色显示:

fb0: framebuffer@43c40000 {
                compatible = "simple-framebuffer";
                reg = <0x43c40000 (32 * 16)>;
                width = <256>;
                height = <128>;
                stride = <32>;
                format = "r1";
                status = "okay";
            };

【讨论】:

    猜你喜欢
    • 2020-07-13
    • 2018-05-12
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2011-10-09
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多