硬汉嵌入式论坛

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

请教下,关于使用dma2d的复制功能有几个参数没有搞明白 ?

[复制链接]

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
发表于 2018-1-8 21:37:21 | 显示全部楼层 |阅读模式
本帖最后由 hpdell 于 2018-1-8 23:18 编辑

请教下,关于使用dma2d的复制功能有几个参数没有搞明白 ?



/*
*********************************************************************************************************
*    函 数 名: _DMA_Copy
*    功能说明: 通过DMA2D从前景层复制指定区域的颜色数据到目标区域
*    形    参:
*             pSrc          颜色数据源地址
*             pDst          颜色数据目的地址
*             xSize         要复制区域的X轴大小,即每行像素数
*             ySize         要复制区域的Y轴大小,即行数
*             OffLineSrc    前景层图像的行偏移
*             OffLineDst    输出的行偏移
*    返 回 值: 无
*********************************************************************************************************
*/
static void _DMA_Copy(void * pSrc, void * pDst, int xSize, int ySize, int OffLineSrc, int OffLineDst) {

  DMA2D->CR      = 0x00000000UL | (1 << 9);         // Control Register (Memory to memory and TCIE)
  DMA2D->FGMAR   = (U32)pSrc;                       // Foreground Memory Address Register (Source address)
  DMA2D->OMAR    = (U32)pDst;                       // Output Memory Address Register (Destination address)
  DMA2D->FGOR    = OffLineSrc;                      // Foreground Offset Register (Source line offset)
  DMA2D->OOR     = OffLineDst;                      // Output Offset Register (Destination line offset)
  DMA2D->FGPFCCR = DMA2D_INPUT_RGB565;                     //  这个地方是设置图片的输出格式类型 ?????? 是DMA2D_OUTPUT_RGB565 或者是 DMA2D_INPUT_RGB565
                                                                             //也就是设置为输出还是输入 ??
  DMA2D->NLR     = (U32)(xSize << 16) | (U16)ySize; // Number of Line Register (Size configuration of area to be transfered)
  DMA2D->CR     |= 1;                               // Start operation
  //
  // Wait until transfer is done
  //
  while (DMA2D->CR & DMA2D_CR_START) {
    //__WFI();                                        // Sleep until next interrupt
  }
}

关于下面两个参数的设置 请教下:
OffLineSrc
OffLineDst

比如我有一个分辨率为 800*600的屏,需要复制的图形的分辨率是 480宽度*320高度

我的坐标设置为 x=50,   y=20, 那么下面的两个参数的值该如何计算得来啊 ????
OffLineSrc
OffLineDst

解码16bit的图片,图片分辨率 = 480*272
解码程序如下:
uint16_t *ptr;
u8  *bmp_buffer_out;   // 使用dma2d解码时的数据暂存地址
  bmp_buffer_out = (uint8_t *)mymalloc(SRAMEX,  BMP_Handle->width * BMP_Handle->height * 3);    // 因为输出是按照16bit存储的
  ptr = (uint16_t *)bmp_buffer_out;
程序解码后按照 rgb565格式保存数据

dec.png



解码后使用dma2d显示的图片效果如下:
33333.png
解码 后的显示图片貌似有一部分成了黑色 ????,

-------------------------------------------------------------------------
原始图片如下:
4444.png






dec.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2018-1-9 00:58:22 | 显示全部楼层
计算方法看我们emWin教程配套例子底层函数_LCD_DrawBitmap16bpp
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
 楼主| 发表于 2018-1-9 10:07:24 | 显示全部楼层
eric2013 发表于 2018-1-9 00:58
计算方法看我们emWin教程配套例子底层函数_LCD_DrawBitmap16bpp

你好,这个 貌似没有看懂啊 ,查找最终的调用,貌似都是使用的函数指针的形式调用的,

BytesPerLine  这个参数表示的每行的总字节数还是整幅图片的字节数啊 ??


/*
*********************************************************************************************************
*        函 数 名: _LCD_DrawBitmap16bpp
*        功能说明: 16bpp位图绘制
*        形    参: --
*        返 回 值: 无
*********************************************************************************************************
*/
static void _LCD_DrawBitmap16bpp(int LayerIndex, int x, int y, U16 const * p, int xSize, int ySize, int BytesPerLine) {
  U32 BufferSize, AddrDst;
  int OffLineSrc, OffLineDst;

  BufferSize = _GetBufferSize(LayerIndex);
  AddrDst = _aAddr[LayerIndex] + BufferSize * _aBufferIndex[LayerIndex] + (y * _axSize[LayerIndex] + x) * _aBytesPerPixels[LayerIndex];

  OffLineSrc = (BytesPerLine / 2) - xSize;         // 还有这个地方为何需要 /2  ??????????????   
  OffLineDst = _axSize[LayerIndex] - xSize;
  _DMA_Copy(LayerIndex, (void *)p, (void *)AddrDst, xSize, ySize, OffLineSrc, OffLineDst);
}

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107122
QQ
发表于 2018-1-10 01:35:00 | 显示全部楼层
hpdell 发表于 2018-1-9 10:07
你好,这个 貌似没有看懂啊 ,查找最终的调用,貌似都是使用的函数指针的形式调用的,

BytesPerLine   ...

这个是点阵位置,比如是800*480分辨率,就是在长度800里面的偏移位置
回复

使用道具 举报

610

主题

3063

回帖

4913

积分

至尊会员

积分
4913
 楼主| 发表于 2018-1-10 10:52:12 | 显示全部楼层
eric2013 发表于 2018-1-10 01:35
这个是点阵位置,比如是800*480分辨率,就是在长度800里面的偏移位置

ok,我再捣鼓捣鼓看看
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 07:45 , Processed in 0.170913 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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