driver.c 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. * File : driver.c
  3. * This file is part of RTGUI in RT-Thread RTOS
  4. * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
  5. *
  6. * The license and distribution terms for this file may be
  7. * found in the file LICENSE in this distribution or at
  8. * http://www.rt-thread.org/license/LICENSE
  9. *
  10. * Change Logs:
  11. * Date Author Notes
  12. * 2009-10-04 Bernard first version
  13. */
  14. #include <rtthread.h>
  15. #include <rtgui/driver.h>
  16. struct rtgui_graphic_driver _driver;
  17. extern const struct rtgui_graphic_driver_ops *rtgui_pixel_device_get_ops(int pixel_format);
  18. extern const struct rtgui_graphic_driver_ops *rtgui_framebuffer_get_ops(int pixel_format);
  19. /* get default driver */
  20. struct rtgui_graphic_driver *rtgui_graphic_driver_get_default()
  21. {
  22. return &_driver;
  23. }
  24. RTM_EXPORT(rtgui_graphic_driver_get_default);
  25. void rtgui_graphic_driver_get_rect(const struct rtgui_graphic_driver *driver, rtgui_rect_t *rect)
  26. {
  27. RT_ASSERT(rect != RT_NULL);
  28. RT_ASSERT(driver != RT_NULL);
  29. rect->x1 = rect->y1 = 0;
  30. rect->x2 = driver->width;
  31. rect->y2 = driver->height;
  32. }
  33. RTM_EXPORT(rtgui_graphic_driver_get_rect);
  34. rt_err_t rtgui_graphic_set_device(rt_device_t device)
  35. {
  36. rt_err_t result;
  37. struct rt_device_graphic_info info;
  38. struct rtgui_graphic_ext_ops *ext_ops;
  39. /* get framebuffer address */
  40. result = rt_device_control(device, RTGRAPHIC_CTRL_GET_INFO, &info);
  41. if (result != RT_EOK)
  42. {
  43. /* get device information failed */
  44. return -RT_ERROR;
  45. }
  46. /* initialize framebuffer driver */
  47. _driver.device = device;
  48. _driver.pixel_format = info.pixel_format;
  49. _driver.bits_per_pixel = info.bits_per_pixel;
  50. _driver.width = info.width;
  51. _driver.height = info.height;
  52. _driver.pitch = _driver.width * _driver.bits_per_pixel / 8;
  53. _driver.framebuffer = info.framebuffer;
  54. /* get graphic extension operations */
  55. result = rt_device_control(device, RTGRAPHIC_CTRL_GET_EXT, &ext_ops);
  56. if (result == RT_EOK)
  57. {
  58. _driver.ext_ops = ext_ops;
  59. }
  60. if (info.framebuffer != RT_NULL)
  61. {
  62. /* is a frame buffer device */
  63. _driver.ops = rtgui_framebuffer_get_ops(_driver.pixel_format);
  64. }
  65. else
  66. {
  67. /* is a pixel device */
  68. _driver.ops = rtgui_pixel_device_get_ops(_driver.pixel_format);
  69. }
  70. #ifdef RTGUI_USING_HW_CURSOR
  71. /* set default cursor image */
  72. rtgui_cursor_set_image(RTGUI_CURSOR_ARROW);
  73. #endif
  74. return RT_EOK;
  75. }
  76. RTM_EXPORT(rtgui_graphic_set_device);
  77. /* screen update */
  78. void rtgui_graphic_driver_screen_update(const struct rtgui_graphic_driver *driver, rtgui_rect_t *rect)
  79. {
  80. struct rt_device_rect_info rect_info;
  81. rect_info.x = rect->x1;
  82. rect_info.y = rect->y1;
  83. rect_info.width = rect->x2 - rect->x1;
  84. rect_info.height = rect->y2 - rect->y1;
  85. rt_device_control(driver->device, RTGRAPHIC_CTRL_RECT_UPDATE, &rect_info);
  86. }
  87. RTM_EXPORT(rtgui_graphic_driver_screen_update);
  88. /* get video frame buffer */
  89. rt_uint8_t *rtgui_graphic_driver_get_framebuffer(const struct rtgui_graphic_driver *driver)
  90. {
  91. return (rt_uint8_t *)driver->framebuffer;
  92. }
  93. RTM_EXPORT(rtgui_graphic_driver_get_framebuffer);
  94. rt_uint8_t *rtgui_graphic_driver_get_default_framebuffer(void)
  95. {
  96. return rtgui_graphic_driver_get_framebuffer(&_driver);
  97. }
  98. RTM_EXPORT(rtgui_graphic_driver_get_default_framebuffer);
  99. #ifdef RTGUI_USING_HW_CURSOR
  100. void rtgui_cursor_set_position(rt_uint16_t x, rt_uint16_t y)
  101. {
  102. rt_uint32_t value;
  103. if (_driver.device != RT_NULL)
  104. {
  105. value = (x << 16 | y);
  106. rt_device_control(_driver.device, RT_DEVICE_CTRL_CURSOR_SET_POSITION, &value);
  107. }
  108. }
  109. void rtgui_cursor_set_image(enum rtgui_cursor_type type)
  110. {
  111. rt_uint32_t value;
  112. if (_driver.device != RT_NULL)
  113. {
  114. value = type;
  115. rt_device_control(_driver.device, RT_DEVICE_CTRL_CURSOR_SET_TYPE, &value);
  116. }
  117. };
  118. #endif