vlcd.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. /*
  2. * Copyright (c) 2006-2018, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2020-12-21 stackRyan first version
  9. */
  10. #include <rtdevice.h>
  11. #include <rtthread.h>
  12. #define DBG_TAG VDEVICE_LCD_NAME
  13. #define DBG_LVL DBG_LOG
  14. #include <rtdbg.h>
  15. #ifdef VDEVICE_USING_LCD
  16. #define LCD_USING_RGB565
  17. //#define LCD_USING_RGB888
  18. #define LCD_HEIGHT 240
  19. #define LCD_WIDTH 240
  20. #ifdef LCD_USING_RGB565
  21. #define LCD_BITS_PER_PIXEL 16
  22. #define LCD_PIXEL_FORMAT RTGRAPHIC_PIXEL_FORMAT_RGB565
  23. #endif
  24. #ifdef LCD_USING_RGB888
  25. #define LCD_BITS_PER_PIXEL 24
  26. #define LCD_PIXEL_FORMAT RTGRAPHIC_PIXEL_FORMAT_RGB888
  27. #endif
  28. #define LCD_FRAMEBUFFER_SIZE (LCD_WIDTH * LCD_HEIGHT * LCD_BITS_PER_PIXEL / 8)
  29. static rt_uint8_t lcd_framebuffer[LCD_FRAMEBUFFER_SIZE];
  30. static struct rt_device_graphic_info lcd_info;
  31. static struct rt_device lcd_dev;
  32. static rt_err_t _lcd_init(rt_device_t dev)
  33. {
  34. rt_err_t ret = RT_EOK;
  35. RT_ASSERT(dev != RT_NULL);
  36. /* Todo: init LCD */
  37. LOG_D("lcd_init");
  38. return ret;
  39. }
  40. static rt_err_t _lcd_open(rt_device_t dev, rt_uint16_t oflag)
  41. {
  42. rt_err_t ret = RT_EOK;
  43. RT_ASSERT(dev != RT_NULL);
  44. /* Todo: enable LCD */
  45. LOG_D("lcd_open");
  46. return ret;
  47. }
  48. static rt_err_t _lcd_close(rt_device_t dev)
  49. {
  50. rt_err_t ret = RT_EOK;
  51. RT_ASSERT(dev != RT_NULL);
  52. /* Todo: close LCD */
  53. LOG_D("lcd_close");
  54. return ret;
  55. }
  56. static rt_err_t _lcd_control(rt_device_t dev, int cmd, void *args)
  57. {
  58. rt_err_t ret = RT_EOK;
  59. RT_ASSERT(dev != RT_NULL);
  60. switch (cmd)
  61. {
  62. case RTGRAPHIC_CTRL_RECT_UPDATE:
  63. {
  64. struct rt_device_rect_info *rect_info = (struct rt_device_rect_info *)args;
  65. LOG_D("lcd_control: RTGRAPHIC_CTRL_RECT_UPDATE:");
  66. LOG_D("height: %d", rect_info->height);
  67. LOG_D("width: %d", rect_info->width);
  68. LOG_D("x: %d", rect_info->x);
  69. LOG_D("y: %d", rect_info->y);
  70. /* Todo: update LCD data */
  71. break;
  72. }
  73. case RTGRAPHIC_CTRL_POWERON:
  74. /* Todo: power on */
  75. LOG_D("lcd_control: RTGRAPHIC_CTRL_POWERON");
  76. break;
  77. case RTGRAPHIC_CTRL_POWEROFF:
  78. /* Todo: power off */
  79. LOG_D("lcd_control: RTGRAPHIC_CTRL_POWEROFF");
  80. break;
  81. case RTGRAPHIC_CTRL_GET_INFO:
  82. {
  83. struct rt_device_graphic_info *info = (struct rt_device_graphic_info *)args;
  84. info->pixel_format = lcd_info.pixel_format;
  85. info->bits_per_pixel = lcd_info.bits_per_pixel;
  86. info->width = lcd_info.width;
  87. info->height = lcd_info.height;
  88. info->framebuffer = lcd_info.framebuffer;
  89. LOG_D("lcd_control: RTGRAPHIC_CTRL_GET_INFO:");
  90. LOG_D("pixel_format: %d", info->pixel_format);
  91. LOG_D("bits_per_pixel: %d", info->bits_per_pixel);
  92. LOG_D("width: %d", info->width);
  93. LOG_D("height: %d", info->height);
  94. LOG_D("framebuffer: %d", info->framebuffer);
  95. break;
  96. }
  97. case RTGRAPHIC_CTRL_SET_MODE:
  98. LOG_D("lcd_control: RTGRAPHIC_CTRL_SET_MODE");
  99. break;
  100. default:
  101. break;
  102. }
  103. return ret;
  104. }
  105. #ifdef RT_USING_DEVICE_OPS
  106. const static struct rt_device_ops _lcd_ops =
  107. {
  108. _lcd_init,
  109. _lcd_open,
  110. _lcd_close,
  111. RT_NULL,
  112. RT_NULL,
  113. _lcd_control
  114. };
  115. #endif
  116. int rt_hw_lcd_init(void)
  117. {
  118. rt_err_t ret = RT_EOK;
  119. lcd_info.bits_per_pixel = LCD_BITS_PER_PIXEL;
  120. lcd_info.framebuffer = lcd_framebuffer;
  121. lcd_info.height = LCD_HEIGHT;
  122. lcd_info.width = LCD_WIDTH;
  123. lcd_info.pixel_format = LCD_PIXEL_FORMAT;
  124. lcd_dev.type = RT_Device_Class_Graphic;
  125. lcd_dev.rx_indicate = RT_NULL;
  126. lcd_dev.tx_complete = RT_NULL;
  127. #ifdef RT_USING_DEVICE_OPS
  128. lcd_dev.ops = &_lcd_ops;
  129. #else
  130. lcd_dev.init = _lcd_init;
  131. lcd_dev.open = _lcd_open;
  132. lcd_dev.close = _lcd_close;
  133. lcd_dev.read = RT_NULL;
  134. lcd_dev.write = RT_NULL;
  135. lcd_dev.control = _lcd_control;
  136. #endif
  137. lcd_dev.user_data = (void *)&lcd_info;
  138. ret = rt_device_register(&lcd_dev, VDEVICE_LCD_NAME, RT_DEVICE_FLAG_RDWR);
  139. LOG_D("rt_hw_lcd_init succeed!");
  140. return ret;
  141. }
  142. INIT_DEVICE_EXPORT(rt_hw_lcd_init);
  143. #endif /* VDEVICE_USING_LCD */