lcd.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "hal.h"
  2. #include "lcd/lcd.h"
  3. #include "lcd-info.h"
  4. #ifdef CONFIG_PLAT_AG101P_16MB
  5. #define LCD_BASE 0x00e10000
  6. #else
  7. #define LCD_BASE 0x90600000
  8. #endif
  9. #define LCD_TIME0_OFFSET 0x00
  10. #define LCD_TIME1_OFFSET 0x04
  11. #define LCD_TIME2_OFFSET 0x08
  12. #define LCD_BASE_OFFSET 0x10
  13. #define LCD_INT_EN_OFFSET 0x18
  14. #define LCD_CTRL_OFFSET 0x1C
  15. #define LCD_INT_CLR_OFFSET 0x20
  16. #define LCD_INT_MSK_OFFSET 0x24
  17. static pixel_t _drv_lcd_fb[ LCD_PANEL_WIDTH * LCD_PANEL_HEIGHT] __attribute__((aligned (64)));
  18. static pixel_t _drv_lcd_bg[ LCD_PANEL_WIDTH * LCD_PANEL_HEIGHT] __attribute__((aligned (64)));
  19. static pixel_t *drv_lcd_fb = _drv_lcd_fb;
  20. static pixel_t *drv_lcd_bg = _drv_lcd_bg;
  21. extern void nds32_dcache_flush();
  22. void drv_lcd_flip(void)
  23. {
  24. pixel_t *tmp = drv_lcd_fb;
  25. drv_lcd_fb = drv_lcd_bg;
  26. drv_lcd_bg = tmp;
  27. OUT32(LCD_BASE + LCD_BASE_OFFSET, drv_lcd_fb);
  28. }
  29. pixel_t *drv_lcd_get_fb(void)
  30. {
  31. return drv_lcd_fb;
  32. }
  33. pixel_t *drv_lcd_get_bg(void)
  34. {
  35. return drv_lcd_bg;
  36. }
  37. void drv_lcd_get_param(int *width, int *height, int *bpp)
  38. {
  39. if (width)
  40. *width = LCD_PANEL_WIDTH;
  41. if (height)
  42. *height = LCD_PANEL_HEIGHT;
  43. if (bpp)
  44. *bpp = LCD_PANEL_BPP;
  45. }
  46. void drv_lcd_fill_bg(void)
  47. {
  48. pixel_t *base = drv_lcd_bg;
  49. int i, j;
  50. for (i = j = 0; j < LCD_PANEL_HEIGHT; j++) {
  51. for (i = 0; i < LCD_PANEL_WIDTH; i++) {
  52. #if defined(CONFIG_COLOR_DEPTH16)
  53. if (i == 0 || i == (LCD_PANEL_WIDTH - 1) || j == 0 || j == (LCD_PANEL_HEIGHT - 1))
  54. *base++ = 0xFFFFu;
  55. else
  56. *base++ = 0x0000u;
  57. #elif defined(CONFIG_COLOR_DEPTH24)
  58. if (i == 0 || i == (LCD_PANEL_WIDTH - 1) || j == 0 || j == (LCD_PANEL_HEIGHT - 1))
  59. *base++ = 0x00FFFFFFu;
  60. else
  61. *base++ = 0x00000000u;
  62. #else
  63. #error "COLOR DEPTH not supported!"
  64. #endif
  65. }
  66. }
  67. }
  68. void drv_lcd_draw_bg(void)
  69. {
  70. pixel_t *src = drv_lcd_bg;
  71. pixel_t *dst = drv_lcd_fb;
  72. int i = 0;
  73. while (i++ < LCD_PANEL_WIDTH * LCD_PANEL_HEIGHT)
  74. *dst++ = *src++;
  75. }
  76. static void _drv_lcd_init(void)
  77. {
  78. OUT32(LCD_BASE + LCD_TIME0_OFFSET, LCD_TIME0);
  79. OUT32(LCD_BASE + LCD_TIME1_OFFSET, LCD_TIME1);
  80. OUT32(LCD_BASE + LCD_TIME2_OFFSET, LCD_TIME2);
  81. OUT32(LCD_BASE + LCD_CTRL_OFFSET, LCD_CTRL);
  82. OUT32(LCD_BASE + LCD_BASE_OFFSET, drv_lcd_fb);
  83. }
  84. void drv_lcd_draw_rect(int x, int w, int y, int h, int r, int g, int b)
  85. {
  86. pixel_t *base = drv_lcd_fb;
  87. int i, j;
  88. for (i = y; i < y + h; i++)
  89. for (j = x; j < x + w; j++)
  90. #if defined(CONFIG_COLOR_DEPTH16)
  91. base[ i * LCD_PANEL_WIDTH + j] = (pixel_t)(((r >> 3) << 11) | ((g >> 2) << 5) | ((b >> 3) << 0));
  92. #elif defined(CONFIG_COLOR_DEPTH24)
  93. base[ i * LCD_PANEL_WIDTH + j] = (pixel_t)((r << 16) | (g << 8) | b);
  94. #endif
  95. nds32_dcache_flush(); /* undefine CONFIG_CPU_DCACHE_WRITETHROUGH ,flush DCACHE for lcd screen */
  96. }
  97. void drv_lcd_erase_rect(int x, int w, int y, int h)
  98. {
  99. pixel_t *base = drv_lcd_fb;
  100. int i, j;
  101. for (i = y; i < y + h; i++)
  102. for (j = x; j < x + w; j++)
  103. base[ i * LCD_PANEL_WIDTH + j] = drv_lcd_bg[ i * LCD_PANEL_WIDTH + j];
  104. }
  105. void draw_blk(int x, int y, int sz, int border, int r, int g, int b)
  106. {
  107. drv_lcd_draw_rect(x, sz, y, sz, r, g, b);
  108. drv_lcd_draw_rect(x + border, sz - 2 * border, y + border, sz - 2 * border, r ^ 0xff, g ^ 0xff, b ^ 0xff);
  109. }
  110. int drv_lcd_init(void)
  111. {
  112. _drv_lcd_init();
  113. drv_lcd_fill_bg();
  114. drv_lcd_draw_bg();
  115. drv_lcd_flip();
  116. return 0;
  117. }