lv_port_disp.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2021-10-18 Meco Man The first version
  9. */
  10. #include <lvgl.h>
  11. #include <board.h>
  12. #include <drv_lcd.h>
  13. // #define MY_DISP_HOR_RES LCD_W
  14. // #define DISP_BUFFER_LINES 70
  15. /*A static or global variable to store the buffers*/
  16. static lv_disp_draw_buf_t disp_buf;
  17. /*Descriptor of a display driver*/
  18. static lv_disp_drv_t disp_drv;
  19. /*Static or global buffer(s). The second buffer is optional*/
  20. #if defined ( __ICCARM__ ) /*!< IAR Compiler */
  21. #pragma location=0x68000000
  22. lv_color_t buf_1[LCD_H * LCD_W];
  23. #elif defined ( __CC_ARM ) /* MDK ARM Compiler */
  24. __attribute__((at(0x68000000))) lv_color_t buf_1[LCD_H * LCD_W];
  25. #elif defined ( __clang__ ) /* MDK ARM Compiler v6 */
  26. __attribute__((section(".ARM.__at_0x68000000"))) lv_color_t buf_1[LCD_H * LCD_W];
  27. #elif defined ( __GNUC__ ) /* GNU Compiler */
  28. lv_color_t buf_1[LCD_H * LCD_W] __attribute__((section(".MCUlcdgrambysram")));
  29. #ifdef RT_USING_MEMHEAP_AS_HEAP
  30. #error "You should modify this logic, such as use 'rt_malloc' to create lvgl buf"
  31. #endif
  32. #endif
  33. /*Flush the content of the internal buffer the specific area on the display
  34. *You can use DMA or any hardware acceleration to do this operation in the background but
  35. *'lv_disp_flush_ready()' has to be called when finished.*/
  36. static void disp_flush(lv_disp_drv_t * disp_drv, const lv_area_t * area, lv_color_t * color_p)
  37. {
  38. /* color_p is a buffer pointer; the buffer is provided by LVGL */
  39. lcd_fill_array(area->x1, area->y1, area->x2, area->y2, color_p);
  40. /*IMPORTANT!!!
  41. *Inform the graphics library that you are ready with the flushing*/
  42. lv_disp_flush_ready(disp_drv);
  43. }
  44. void lv_port_disp_init(void)
  45. {
  46. /*Initialize `disp_buf` with the buffer(s). With only one buffer use NULL instead buf_2 */
  47. lv_disp_draw_buf_init(&disp_buf, buf_1, NULL, LCD_H * LCD_W);
  48. lv_disp_drv_init(&disp_drv); /*Basic initialization*/
  49. /*Set the resolution of the display*/
  50. disp_drv.hor_res = LCD_W;
  51. disp_drv.ver_res = LCD_H;
  52. /*Set a display buffer*/
  53. disp_drv.draw_buf = &disp_buf;
  54. /*Used to copy the buffer's content to the display*/
  55. disp_drv.flush_cb = disp_flush;
  56. /*Finally register the driver*/
  57. lv_disp_drv_register(&disp_drv);
  58. }