硬汉嵌入式论坛

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

[GUI] 看了NXP官方提供的emWin底层接口驱动,官方做的有点简陋,要优化的地方较多,另外RT是不是没有2D加速功能

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
发表于 2018-5-2 08:52:35 | 显示全部楼层 |阅读模式
这几天我先学习下基本操作,外设搞熟练了才好优化。

另外记得之前的介绍是有2D加速的,看官方手册里面的框图,没有2D加速功能,是简单的DMA通信。如果是DMA的话,跟2D加速还是有很大区别的,最明显的区别是自带DMA是跑不过2D加速的,之前我在F429上专门测试过这个问题,之前测试的结果是2D加速至少要是内部CPU或者自带DMA刷图片的2倍。
QQ截图20180502084540.png

下面官方提供的这个代码有点简陋,没有做任何加速,而且函数GUI_X_GetTime和GUI_X_Delay的实现是有问题的。

  1. /*
  2. * Copyright (c) 2016, Freescale Semiconductor, Inc.
  3. * Copyright 2016-2017 NXP
  4. *
  5. * Redistribution and use in source and binary forms, with or without modification,
  6. * are permitted provided that the following conditions are met:
  7. *
  8. * o Redistributions of source code must retain the above copyright notice, this list
  9. *   of conditions and the following disclaimer.
  10. *
  11. * o Redistributions in binary form must reproduce the above copyright notice, this
  12. *   list of conditions and the following disclaimer in the documentation and/or
  13. *   other materials provided with the distribution.
  14. *
  15. * o Neither the name of the copyright holder nor the names of its
  16. *   contributors may be used to endorse or promote products derived from this
  17. *   software without specific prior written permission.
  18. *
  19. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  20. * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  21. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  22. * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
  23. * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  24. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  25. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
  26. * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  27. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  28. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  29. */

  30. #include "GUI.h"
  31. #include "WM.h"
  32. #include "emwin_support.h"
  33. #include "GUIDRV_Lin.h"

  34. #include "fsl_debug_console.h"
  35. #include "fsl_elcdif.h"
  36. #include "fsl_lpi2c.h"
  37. #include "fsl_ft5406_rt.h"

  38. /*
  39. **      Define everything necessary for different color depths
  40. */
  41. #if LCD_BITS_PER_PIXEL == 8 /* Palette definition for LUT */
  42. static uint32_t lutData[ELCDIF_LUT_ENTRY_NUM];
  43. static const LCD_COLOR _aColors_256[] = {
  44.     0x000000, 0x000033, 0x000066, 0x000099, 0x0000CC, 0x0000FF, 0x003300, 0x003333, 0x003366, 0x003399, 0x0033CC,
  45.     0x0033FF, 0x006600, 0x006633, 0x006666, 0x006699, 0x0066CC, 0x0066FF, 0x009900, 0x009933, 0x009966, 0x009999,
  46.     0x0099CC, 0x0099FF, 0x00CC00, 0x00CC33, 0x00CC66, 0x00CC99, 0x00CCCC, 0x00CCFF, 0x00FF00, 0x00FF33, 0x00FF66,
  47.     0x00FF99, 0x00FFCC, 0x00FFFF, 0x330000, 0x330033, 0x330066, 0x330099, 0x3300CC, 0x3300FF, 0x333300, 0x333333,
  48.     0x333366, 0x333399, 0x3333CC, 0x3333FF, 0x336600, 0x336633, 0x336666, 0x336699, 0x3366CC, 0x3366FF, 0x339900,
  49.     0x339933, 0x339966, 0x339999, 0x3399CC, 0x3399FF, 0x33CC00, 0x33CC33, 0x33CC66, 0x33CC99, 0x33CCCC, 0x33CCFF,
  50.     0x33FF00, 0x33FF33, 0x33FF66, 0x33FF99, 0x33FFCC, 0x33FFFF, 0x660000, 0x660033, 0x660066, 0x660099, 0x6600CC,
  51.     0x6600FF, 0x663300, 0x663333, 0x663366, 0x663399, 0x6633CC, 0x6633FF, 0x666600, 0x666633, 0x666666, 0x666699,
  52.     0x6666CC, 0x6666FF, 0x669900, 0x669933, 0x669966, 0x669999, 0x6699CC, 0x6699FF, 0x66CC00, 0x66CC33, 0x66CC66,
  53.     0x66CC99, 0x66CCCC, 0x66CCFF, 0x66FF00, 0x66FF33, 0x66FF66, 0x66FF99, 0x66FFCC, 0x66FFFF, 0x000000, 0x000000,
  54.     0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
  55.     0x111111, 0x222222, 0x333333, 0x444444, 0x555555, 0x666666, 0x777777, 0x888888, 0x999999, 0xAAAAAA, 0xBBBBBB,
  56.     0xCCCCCC, 0xDDDDDD, 0xEEEEEE, 0xFFFFFF, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
  57.     0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x990000, 0x990033, 0x990066, 0x990099, 0x9900CC, 0x9900FF,
  58.     0x993300, 0x993333, 0x993366, 0x993399, 0x9933CC, 0x9933FF, 0x996600, 0x996633, 0x996666, 0x996699, 0x9966CC,
  59.     0x9966FF, 0x999900, 0x999933, 0x999966, 0x999999, 0x9999CC, 0x9999FF, 0x99CC00, 0x99CC33, 0x99CC66, 0x99CC99,
  60.     0x99CCCC, 0x99CCFF, 0x99FF00, 0x99FF33, 0x99FF66, 0x99FF99, 0x99FFCC, 0x99FFFF, 0xCC0000, 0xCC0033, 0xCC0066,
  61.     0xCC0099, 0xCC00CC, 0xCC00FF, 0xCC3300, 0xCC3333, 0xCC3366, 0xCC3399, 0xCC33CC, 0xCC33FF, 0xCC6600, 0xCC6633,
  62.     0xCC6666, 0xCC6699, 0xCC66CC, 0xCC66FF, 0xCC9900, 0xCC9933, 0xCC9966, 0xCC9999, 0xCC99CC, 0xCC99FF, 0xCCCC00,
  63.     0xCCCC33, 0xCCCC66, 0xCCCC99, 0xCCCCCC, 0xCCCCFF, 0xCCFF00, 0xCCFF33, 0xCCFF66, 0xCCFF99, 0xCCFFCC, 0xCCFFFF,
  64.     0xFF0000, 0xFF0033, 0xFF0066, 0xFF0099, 0xFF00CC, 0xFF00FF, 0xFF3300, 0xFF3333, 0xFF3366, 0xFF3399, 0xFF33CC,
  65.     0xFF33FF, 0xFF6600, 0xFF6633, 0xFF6666, 0xFF6699, 0xFF66CC, 0xFF66FF, 0xFF9900, 0xFF9933, 0xFF9966, 0xFF9999,
  66.     0xFF99CC, 0xFF99FF, 0xFFCC00, 0xFFCC33, 0xFFCC66, 0xFFCC99, 0xFFCCCC, 0xFFCCFF, 0xFFFF00, 0xFFFF33, 0xFFFF66,
  67.     0xFFFF99, 0xFFFFCC, 0xFFFFFF

  68. };
  69. static const LCD_PHYSPALETTE _aPalette_256 = {ARRAY_SIZE(_aColors_256), _aColors_256};
  70. #endif
  71. #if LCD_BITS_PER_PIXEL < 32 /* Buffer definitions for emwin and LCD framebuffer */
  72. AT_NONCACHEABLE_SECTION_ALIGN(uint8_t s_gui_memory[GUI_NUMBYTES * LCD_BYTES_PER_PIXEL], FRAME_BUFFER_ALIGN);
  73. AT_NONCACHEABLE_SECTION_ALIGN(uint8_t s_vram_buffer[VRAM_SIZE * GUI_BUFFERS * LCD_BYTES_PER_PIXEL], FRAME_BUFFER_ALIGN);
  74. #else
  75. uint32_t s_gui_memory[(GUI_NUMBYTES)];
  76. uint32_t s_vram_buffer[VRAM_SIZE * GUI_BUFFERS];
  77. #endif

  78. /* Memory address definitions */
  79. #define GUI_MEMORY_ADDR ((uint32_t)s_gui_memory)
  80. #define VRAM_ADDR ((uint32_t)s_vram_buffer)

  81. static volatile int32_t s_LCDpendingBuffer = -1;

  82. /*******************************************************************************
  83. * Implementation of PortAPI for emWin LCD driver
  84. ******************************************************************************/

  85. /* Enable interrupt. */
  86. void BOARD_EnableLcdInterrupt(void)
  87. {
  88.     EnableIRQ(LCDIF_IRQn);
  89. }

  90. void APP_LCDIF_IRQHandler(void)
  91. {
  92.     uint32_t intStatus;

  93.     intStatus = ELCDIF_GetInterruptStatus(APP_ELCDIF);

  94.     ELCDIF_ClearInterruptStatus(APP_ELCDIF, intStatus);

  95.     if (intStatus & kELCDIF_CurFrameDone)
  96.     {
  97.         if (s_LCDpendingBuffer >= 0)
  98.         {
  99.             /* Send a confirmation that the given buffer is visible */
  100.             GUI_MULTIBUF_Confirm(s_LCDpendingBuffer);
  101.             s_LCDpendingBuffer = -1;
  102.         }
  103.     }
  104. /* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
  105.   exception return operation might vector to incorrect interrupt */
  106. #if defined __CORTEX_M && (__CORTEX_M == 4U)
  107.     __DSB();
  108. #endif
  109. }

  110. void LCDIF_IRQHandler(void)
  111. {
  112.     APP_LCDIF_IRQHandler();
  113. }

  114. void APP_ELCDIF_Init(void)
  115. {
  116.     const elcdif_rgb_mode_config_t config = {
  117.         .panelWidth = APP_IMG_WIDTH,
  118.         .panelHeight = APP_IMG_HEIGHT,
  119.         .hsw = APP_HSW,
  120.         .hfp = APP_HFP,
  121.         .hbp = APP_HBP,
  122.         .vsw = APP_VSW,
  123.         .vfp = APP_VFP,
  124.         .vbp = APP_VBP,
  125.         .polarityFlags = APP_POL_FLAGS,
  126.         .bufferAddr = VRAM_ADDR,
  127.         .pixelFormat = ELCDIF_PIXEL_FORMAT,
  128.         .dataBus = APP_LCDIF_DATA_BUS,
  129.     };
  130.     ELCDIF_RgbModeInit(APP_ELCDIF, &config);

  131. #if (LCD_BITS_PER_PIXEL == 8)
  132.     /* Load the LUT data. */
  133.     ELCDIF_UpdateLut(APP_ELCDIF, kELCDIF_Lut0, 0, lutData, ELCDIF_LUT_ENTRY_NUM);
  134.     ELCDIF_EnableLut(APP_ELCDIF, true);
  135. #endif
  136.     BOARD_EnableLcdInterrupt();
  137.     ELCDIF_EnableInterrupts(APP_ELCDIF, kELCDIF_CurFrameDoneInterruptEnable);
  138.     NVIC_EnableIRQ(LCDIF_IRQn);
  139.     ELCDIF_RgbModeStart(APP_ELCDIF);
  140. }

  141. /*******************************************************************************
  142. * Implementation of communication with the touch controller
  143. ******************************************************************************/

  144. /* Touch driver handle. */
  145. static ft5406_rt_handle_t touchHandle;

  146. static void BOARD_Touch_Init(void)
  147. {
  148.     lpi2c_master_config_t masterConfig = {0};
  149.     /*
  150.     * masterConfig.debugEnable = false;
  151.     * masterConfig.ignoreAck = false;
  152.     * masterConfig.pinConfig = kLPI2C_2PinOpenDrain;
  153.     * masterConfig.baudRate_Hz = 100000U;
  154.     * masterConfig.busIdleTimeout_ns = 0;
  155.     * masterConfig.pinLowTimeout_ns = 0;
  156.     * masterConfig.sdaGlitchFilterWidth_ns = 0;
  157.     * masterConfig.sclGlitchFilterWidth_ns = 0;
  158.     */
  159.     LPI2C_MasterGetDefaultConfig(&masterConfig);

  160.     /* Change the default baudrate configuration */
  161.     masterConfig.baudRate_Hz = BOARD_TOUCH_I2C_BAUDRATE;

  162.     /* Initialize the LPI2C master peripheral */
  163.     LPI2C_MasterInit(BOARD_TOUCH_I2C, &masterConfig, BOARD_TOUCH_I2C_CLOCK_FREQ);

  164.     /* Initialize the touch handle. */
  165.     FT5406_RT_Init(&touchHandle, BOARD_TOUCH_I2C);
  166. }

  167. void BOARD_Touch_Deinit(void)
  168. {
  169.     LPI2C_MasterDeinit(BOARD_TOUCH_I2C);
  170. }

  171. int BOARD_Touch_Poll(void)
  172. {
  173.     touch_event_t touch_event;
  174.     int touch_x;
  175.     int touch_y;
  176.     GUI_PID_STATE pid_state;

  177.     if (kStatus_Success != FT5406_RT_GetSingleTouch(&touchHandle, &touch_event, &touch_x, &touch_y))
  178.     {
  179.         return 0;
  180.     }
  181.     else if (touch_event != kTouch_Reserved)
  182.     {
  183.         pid_state.x = touch_y;
  184.         pid_state.y = touch_x;
  185.         pid_state.Pressed = ((touch_event == kTouch_Down) || (touch_event == kTouch_Contact));
  186.         pid_state.Layer = 0;
  187.         GUI_TOUCH_StoreStateEx(&pid_state);
  188.         return 1;
  189.     }
  190.     return 0;
  191. }

  192. /*******************************************************************************
  193. * Application implemented functions required by emWin library
  194. ******************************************************************************/
  195. void LCD_X_Config(void)
  196. {
  197.     GUI_MULTIBUF_Config(GUI_BUFFERS);
  198.     GUI_DEVICE_CreateAndLink(DISPLAY_DRIVER, COLOR_CONVERSION, 0, 0);
  199.     LCD_SetSizeEx(0, LCD_WIDTH, LCD_HEIGHT);
  200.     LCD_SetVSizeEx(0, LCD_WIDTH, LCD_HEIGHT);
  201.     LCD_SetVRAMAddrEx(0, (void *)VRAM_ADDR);
  202. #if (LCD_BITS_PER_PIXEL == 8)
  203.     LCD_SetLUT(&_aPalette_256);
  204. #endif
  205.     BOARD_Touch_Init();
  206. }

  207. int LCD_X_DisplayDriver(unsigned LayerIndex, unsigned Cmd, void *p)
  208. {
  209.     uint32_t addr;
  210. #if (LCD_BITS_PER_PIXEL == 8)
  211.     uint16_t colorR, colorG, colorB;
  212.     uint32_t color;
  213. #endif
  214.     int result = 0;
  215.     LCD_X_SHOWBUFFER_INFO *pData;
  216.     switch (Cmd)
  217.     {
  218.         case LCD_X_INITCONTROLLER:
  219.         {
  220.             APP_ELCDIF_Init();
  221.             break;
  222.         }
  223.         case LCD_X_SHOWBUFFER:
  224.         {
  225.             pData = (LCD_X_SHOWBUFFER_INFO *)p;
  226.             /* Calculate address of the given buffer */
  227.             addr = VRAM_ADDR + VRAM_SIZE * pData->Index;
  228.             /* Make the given buffer visible */
  229.             ELCDIF_SetNextBufferAddr(APP_ELCDIF, addr);
  230.             //
  231.             // Remember buffer index to be used by ISR
  232.             //
  233.             s_LCDpendingBuffer = pData->Index;
  234.             while (s_LCDpendingBuffer >= 0)
  235.                 ;
  236.             return 0;
  237.         }
  238. #if (LCD_BITS_PER_PIXEL == 8)
  239.         case LCD_X_SETLUTENTRY:
  240.         {
  241.             //
  242.             // Required for setting a lookup table entry which is passed in the 'Pos' and 'Color' element of p
  243.             //
  244.             LCD_X_SETLUTENTRY_INFO *pData;
  245.             pData = (LCD_X_SETLUTENTRY_INFO *)p;
  246.             //
  247.             // Call hardware routine to write a LUT entry to the controller
  248.             //
  249.             color = pData->Color;
  250.             colorB = (color & 0xFF0000) >> 16;
  251.             colorG = (color & 0x00FF00) >> 8;
  252.             colorR = (color & 0x0000FF);
  253.             /* 16-bit bus */
  254.             lutData[pData->Pos] = ((colorR >> 3) << 11) | ((colorG >> 2) << 5) | ((colorB >> 3) << 0);
  255.             return 0;
  256.         }
  257. #endif
  258.         default:
  259.             result = -1;
  260.             break;
  261.     }

  262.     return result;
  263. }

  264. void GUI_X_Config(void)
  265. {
  266.     /* Assign work memory area to emWin */
  267.     GUI_ALLOC_AssignMemory((void *)GUI_MEMORY_ADDR, GUI_NUMBYTES);

  268.     /* Select default font */
  269.     GUI_SetDefaultFont(GUI_FONT_6X8);
  270. }

  271. void GUI_X_Init(void)
  272. {
  273. }

  274. /* Dummy RTOS stub required by emWin */
  275. void GUI_X_InitOS(void)
  276. {
  277. }

  278. /* Dummy RTOS stub required by emWin */
  279. void GUI_X_Lock(void)
  280. {
  281. }

  282. /* Dummy RTOS stub required by emWin */
  283. void GUI_X_Unlock(void)
  284. {
  285. }

  286. /* Dummy RTOS stub required by emWin */
  287. U32 GUI_X_GetTaskId(void)
  288. {
  289.     return 0;
  290. }

  291. void GUI_X_ExecIdle(void)
  292. {
  293. }

  294. GUI_TIMER_TIME GUI_X_GetTime(void)
  295. {
  296.     return 0;
  297. }

  298. void GUI_X_Delay(int Period)
  299. {
  300.     volatile int i;
  301.     for (; Period > 0; Period--)
  302.     {
  303.         for (i = 15000; i > 0; i--)
  304.             ;
  305.     }
  306. }

  307. void *emWin_memcpy(void *pDst, const void *pSrc, long size)
  308. {
  309.     return memcpy(pDst, pSrc, size);
  310. }
复制代码


回复

使用道具 举报

3

主题

6

回帖

15

积分

新手上路

积分
15
发表于 2018-5-2 08:57:14 | 显示全部楼层
PXP模块可以看看
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
 楼主| 发表于 2018-5-2 08:59:24 | 显示全部楼层
dh0219 发表于 2018-5-2 08:57
PXP模块可以看看

感谢,
看了下,这个东西没有2D加速来的痛快,优化有点麻烦了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
 楼主| 发表于 2018-5-2 09:12:28 | 显示全部楼层
QQ截图20180502090946.png
回复

使用道具 举报

6

主题

87

回帖

105

积分

初级会员

色不异空 空不异色 色即是空 空

积分
105
发表于 2018-5-2 09:14:58 | 显示全部楼层
本帖最后由 fox492 于 2018-5-2 09:22 编辑
i.MX RT1060 跨界处理器已经有2D加速了。面向 GUI 和增强 HMI 的高级多媒体
  • 2D 图形加速引擎
  • 并行摄像头传感器接口
  • LCD 显示屏控制器(高达 WXGA 1366x768)
  • 3x I2S,面向高性能多通道音频

成就他人就是成就自己
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
 楼主| 发表于 2018-5-2 09:23:08 | 显示全部楼层
fox492 发表于 2018-5-2 09:14
给NXP提建议,让他们在下一款产品里加上2D加速

是的,跑GUI比较拖系统带宽的,会影响实时性任务的执行。

看i.MX6系列的加速,把这个整上就爽了。

QQ截图20180502091849.png
回复

使用道具 举报

6

主题

87

回帖

105

积分

初级会员

色不异空 空不异色 色即是空 空

积分
105
发表于 2018-5-2 09:32:13 | 显示全部楼层
eric2013 发表于 2018-5-2 09:23
是的,跑GUI比较拖系统带宽的,会影响实时性任务的执行。

看i.MX6系列的加速,把这个整上就 ...

i.MX RT1060 已经加上2D加速了
成就他人就是成就自己
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
 楼主| 发表于 2018-5-2 09:48:11 | 显示全部楼层
fox492 发表于 2018-5-2 09:32
i.MX RT1060 已经加上2D加速了

谢谢,那看来要等到今年年底了
QQ截图20180502094655.png
回复

使用道具 举报

5

主题

196

回帖

211

积分

高级会员

积分
211
发表于 2018-5-2 14:15:28 | 显示全部楼层
本帖最后由 alexyzhov 于 2018-5-2 14:35 编辑
eric2013 发表于 2018-5-2 09:48
谢谢,那看来要等到今年年底了

仔细看看的话,其实1052的介绍也写了这句话。。

eLCDIF是从IMX系列搬下来的外设,性能不可能太差。楼主发的框图上面其实有一段话:

eLCDIF在总线上可以单独作为主机,无需CPU介入,也不经过DMA,是自己作为总线主机,直接将frame buffer搬运到LCD上。
而硬汉提到的dma则是为了方便使用"smart display",也就是从液晶中回读像素点时用的。

一个是发(单独的数据链路,不经过DMA。LCDIF自己控制读取/刷写),一个是读(挂载在AXI master上的DMA interface,方便使用DMA触发链回读LCD数据),不一样的。

eLCDIF+PXP实现的功能大致和DMA2D类似(独立的高速数据链路,和简单的图像预处理管线)。




eLCDIF

eLCDIF
lcdif2.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
 楼主| 发表于 2018-5-2 14:21:43 | 显示全部楼层
alexyzhov 发表于 2018-5-2 14:15
仔细看看的话,其实1052的介绍也写了这句话。。

eLCDIF是从IMX系列搬下来的外设,性能不可能太差。楼 ...

你后半部分理解稍有偏差

从frame buffer到LCD这本来就是不需要CPU介入的,他这个是LCD控制器自动完成的。

而2D加速是加速的多个显存块的复制粘贴(这个对emWin加速非常重要),颜色填充,alpha混合,多图层混合,各种颜色格式互转等
回复

使用道具 举报

5

主题

196

回帖

211

积分

高级会员

积分
211
发表于 2018-5-2 14:31:30 | 显示全部楼层
eric2013 发表于 2018-5-2 14:21
你后半部分理解稍有偏差

从frame buffer到LCD这本来就是不需要CPU介入的,他这个是LCD控制 ...

缩放,旋转,颜色格式互转,这部分在RT上是PXP完成的。至于多个块的复制粘贴,填充,我想结合eDMA应该不难完成。eDMA的弹性非常大,可以完成很多匪夷所思的触发链。

当然,这个用起来就很复杂了,远比STM32复杂。。
我不知道H7有没有赶上,但eDMA性能和弹性至少比F7和之前产品的DMA强一代以上。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
 楼主| 发表于 2018-5-2 15:04:06 | 显示全部楼层
alexyzhov 发表于 2018-5-2 14:31
缩放,旋转,颜色格式互转,这部分在RT上是PXP完成的。至于多个块的复制粘贴,填充,我想结合eDMA应该不 ...

非常感谢讨论这个话题

是的,现在只能通过DMA做了,相比直接CPU操作没有速度提升,但是一定程度可以降低系统带宽。

ps:H7的DMA比较强,比之前的都强很多,有四路,MDMA,DMA1,DMA2和BDMA,可以多种触发源链接。即使是TCM也是可以做DMA的。
回复

使用道具 举报

5

主题

196

回帖

211

积分

高级会员

积分
211
发表于 2018-5-2 15:09:44 | 显示全部楼层
eric2013 发表于 2018-5-2 15:04
非常感谢讨论这个话题

是的,现在只能通过DMA做了,相比直接CPU操作没有速度提升,但是一定 ...

那H7算是终于赶上fsl的eDMA了。DMAMUX,多触发源,通道链接,scatter-gather都是fsl玩剩好多年的东西
回复

使用道具 举报

56

主题

905

回帖

1073

积分

至尊会员

积分
1073
发表于 2018-5-2 22:12:06 | 显示全部楼层
问个低级的问题。 有一个tft-lcd , 是不是接上电源 连上F7就可以直接驱动了?
另外这种铁框的如何固定在面板上呢?

https://www.winstar.com.tw/zh-cn ... isplay/3_9-lcd.html
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107128
QQ
 楼主| 发表于 2018-5-3 11:04:23 | 显示全部楼层
roguebear 发表于 2018-5-2 22:12
问个低级的问题。 有一个tft-lcd , 是不是接上电源 连上F7就可以直接驱动了?
另外这种铁框的如何固定在 ...

有背光就可以了。

铁框后面有卡槽,可以往PCB上面卡。
回复

使用道具 举报

56

主题

905

回帖

1073

积分

至尊会员

积分
1073
发表于 2018-5-3 22:40:28 | 显示全部楼层
eric2013 发表于 2018-5-3 11:04
有背光就可以了。

铁框后面有卡槽,可以往PCB上面卡。

明白了。。还得再搞一个板子后面。
回复

使用道具 举报

2

主题

9

回帖

15

积分

新手上路

积分
15
发表于 2021-1-12 14:19:44 | 显示全部楼层
硬汉哥,最近玩LCD,但是帧率到50的时候,LCD显示就会异常,出现横移,7寸显示屏1024*600,而且,大点速度好慢,只有100多w,请问是什么问题?sdram的带宽不够吗?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 23:52 , Processed in 0.219127 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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