硬汉嵌入式论坛

 找回密码
 立即注册
查看: 6358|回复: 10
收起左侧

[其它] H7 DMA2D R2M模式不支持L8颜色啊

[复制链接]

11

主题

26

回帖

59

积分

初级会员

积分
59
发表于 2021-5-24 15:46:54 | 显示全部楼层 |阅读模式
现在用L8颜色做UI设计,发现dma2d R2M不支持L8颜色的输出,只能软件绘制了嘛

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2021-5-25 08:44:13 | 显示全部楼层
支持。
回复

使用道具 举报

11

主题

26

回帖

59

积分

初级会员

积分
59
 楼主| 发表于 2021-5-25 09:26:56 | 显示全部楼层
DMA2D.png 而且DMA2D OCOLR也没有L8输出格式啊

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2021-5-25 09:52:41 | 显示全部楼层
solarjjl 发表于 2021-5-25 09:26
而且DMA2D OCOLR也没有L8输出格式啊

不是这么玩,是借助24/32bit的 CLUT颜色表
回复

使用道具 举报

6

主题

20

回帖

38

积分

新手上路

积分
38
发表于 2022-1-4 23:52:56 | 显示全部楼层
eric2013 发表于 2021-5-25 09:52
不是这么玩,是借助24/32bit的 CLUT颜色表

硬汉有这方面的例程么,最近在研究L8的DMA2D,多谢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2022-1-5 08:05:42 | 显示全部楼层
xiaojianxia 发表于 2022-1-4 23:52
硬汉有这方面的例程么,最近在研究L8的DMA2D,多谢

这个没做例程。
回复

使用道具 举报

13

主题

192

回帖

231

积分

高级会员

积分
231
发表于 2022-1-5 09:08:16 | 显示全部楼层
我的理解是,DMA2D支持L8颜色输入,可以通过CLUT表转换成需要的RGB565,RGB888等颜色,但是不能从L8输入到L8输出。
本质上需要L8的话,一个是你存储芯片空间和RAM空间都不太够,所以需要L8格式来减少这部分的需求。但是DMA2D只支持L8的输入,
也就是只能减少存储空间,RAM其实省不了。一开始我们也以为支持L8,后来发现不行,使用L8的时候没有用DMA2D。
回复

使用道具 举报

6

主题

20

回帖

38

积分

新手上路

积分
38
发表于 2022-1-5 09:24:37 | 显示全部楼层
zhang0352505 发表于 2022-1-5 09:08
我的理解是,DMA2D支持L8颜色输入,可以通过CLUT表转换成需要的RGB565,RGB888等颜色,但是不能从L8输入到L ...

谢谢分享~~准备不使用dma2d了,多谢~~~
回复

使用道具 举报

2

主题

26

回帖

32

积分

新手上路

积分
32
发表于 2022-3-4 15:39:38 | 显示全部楼层
zhang0352505 发表于 2022-1-5 09:08
我的理解是,DMA2D支持L8颜色输入,可以通过CLUT表转换成需要的RGB565,RGB888等颜色,但是不能从L8输入到L ...

toughgfx 是支持dma2d L8的。好像底层搞了些特殊操作。分辨率800*480,实现时是400*480。我套着用了下,但用不对路。
回复

使用道具 举报

13

主题

192

回帖

231

积分

高级会员

积分
231
发表于 2022-3-4 19:07:23 | 显示全部楼层
本帖最后由 zhang0352505 于 2022-3-5 09:25 编辑
cheng.hl@qq.com 发表于 2022-3-4 15:39
toughgfx 是支持dma2d L8的。好像底层搞了些特殊操作。分辨率800*480,实现时是400*480。我套着用了下, ...

给你贴一下TouchGFX的源码吧,这两个函数是TouchGFX4.18生成的函数,在它的结构中,把DMA做成了一个类。
inline uint32_t STM32H7DMA::getChromARTInputFormat(Bitmap::BitmapFormat format)
{
    // Default color mode set to ARGB8888
    uint32_t dma2dColorMode = DMA2D_INPUT_ARGB8888;

    switch (format)
    {
    case Bitmap::ARGB8888: /* DMA2D input mode set to 32bit ARGB */
        dma2dColorMode = DMA2D_INPUT_ARGB8888;
        break;
    case Bitmap::RGB888: /* DMA2D input mode set to 24bit RGB */
        dma2dColorMode = DMA2D_INPUT_RGB888;
        break;
    case Bitmap::RGB565: /* DMA2D input mode set to 16bit RGB */
        dma2dColorMode = DMA2D_INPUT_RGB565;
        break;
    case Bitmap::ARGB2222: /* Fall through */
    case Bitmap::ABGR2222: /* Fall through */
    case Bitmap::RGBA2222: /* Fall through */
    case Bitmap::BGRA2222: /* Fall through */
    case Bitmap:: L8:       /* DMA2D input mode set to 8bit Color Look up table*/
        dma2dColorMode = DMA2D_INPUT_L8;
        break;
    case Bitmap::BW:     /* Fall through */
    case Bitmap::BW_RLE: /* Fall through */
    case Bitmap::GRAY4:  /* Fall through */
    case Bitmap::GRAY2:  /* Fall through */
    default:             /* Unsupported input format for DMA2D */
        assert(0 && "Unsupported Format!");
        break;
    }

    return dma2dColorMode;
}

inline uint32_t STM32H7DMA::getChromARTOutputFormat(Bitmap::BitmapFormat format)
{
    // Default color mode set to ARGB8888
    uint32_t dma2dColorMode = DMA2D_OUTPUT_ARGB8888;

    switch (format)
    {
    case Bitmap::ARGB8888: /* DMA2D output mode set to 32bit ARGB */
        dma2dColorMode = DMA2D_OUTPUT_ARGB8888;
        break;
    case Bitmap::RGB888:   /* Fall through */
    case Bitmap::ARGB2222: /* Fall through */
    case Bitmap::ABGR2222: /* Fall through */
    case Bitmap::RGBA2222: /* Fall through */
    case Bitmap::BGRA2222: /* DMA2D output mode set to 24bit RGB */
        dma2dColorMode = DMA2D_OUTPUT_RGB888;
        break;
    case Bitmap::RGB565: /* DMA2D output mode set to 16bit RGB */
        dma2dColorMode = DMA2D_OUTPUT_RGB565;
        break;
    case Bitmap:: L8:     /* Fall through */
    case Bitmap::BW:     /* Fall through */
    case Bitmap::BW_RLE: /* Fall through */
    case Bitmap::GRAY4:  /* Fall through */
    case Bitmap::GRAY2:  /* Fall through */
    default:             /* Unsupported output format for DMA2D */
        assert(0 && "Unsupported Format!");
        break;
    }

    return dma2dColorMode;
}


从这里你就能看出来,它只支持L8的输入,不支持L8的输出。这是DMA2D自身 决定的,跟Touch的框架没关系
回复

使用道具 举报

2

主题

26

回帖

32

积分

新手上路

积分
32
发表于 2022-3-8 15:29:54 | 显示全部楼层
zhang0352505 发表于 2022-3-4 19:07
给你贴一下TouchGFX的源码吧,这两个函数是TouchGFX4.18生成的函数,在它的结构中,把DMA做成了一个类。
...

所以DMA2D应该配置的2byte输入,2byte输出,不转格式。LTDC一字节输出,DMA2D只是实现M2M搬运
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-5 20:46 , Processed in 0.514199 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表