ili9341_ebi.c 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. /**************************************************************************//**
  2. *
  3. * @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Change Logs:
  8. * Date Author Notes
  9. * 2020-1-16 Wayne First version
  10. *
  11. ******************************************************************************/
  12. #include <rtconfig.h>
  13. #if defined(NU_PKG_USING_ILI9341_EBI)
  14. #include <lcd_ili9341.h>
  15. #include "drv_pdma.h"
  16. #define ILI9341_ADDR_CMD 0x0
  17. #define ILI9341_ADDR_DATA 0x0030000
  18. #define ili9341_reg_write(u32RegAddr) (*((volatile unsigned short *)(g_uint32_ili9341_base+(ILI9341_ADDR_CMD))) = (u32RegAddr))
  19. #define ili9341_read_data() (*((volatile unsigned short *)(g_uint32_ili9341_base+(ILI9341_ADDR_DATA))))
  20. #define ili9341_write_data(u32Data) (*((volatile unsigned short *)(g_uint32_ili9341_base+(ILI9341_ADDR_DATA))) = (u32Data))
  21. static rt_uint32_t g_uint32_ili9341_base = 0;
  22. void ili9341_send_cmd(rt_uint8_t cmd)
  23. {
  24. CLR_RS;
  25. ili9341_reg_write(cmd);
  26. SET_RS;
  27. }
  28. void ili9341_send_cmd_parameter(rt_uint8_t data)
  29. {
  30. ili9341_write_data(data);
  31. }
  32. void ili9341_send_pixel_data(rt_uint16_t color)
  33. {
  34. ili9341_write_data(color);
  35. }
  36. void ili9341_send_pixels(rt_uint16_t *pixels, int len)
  37. {
  38. int count = len / sizeof(rt_uint16_t);
  39. if (count < 1024)
  40. {
  41. // CPU feed
  42. int i = 0;
  43. while (i < count)
  44. {
  45. ili9341_write_data(pixels[i]);
  46. i++;
  47. }
  48. }
  49. else
  50. {
  51. // PDMA-M2M feed
  52. nu_pdma_mempush((void *)(g_uint32_ili9341_base + (ILI9341_ADDR_DATA)), (void *)pixels, 16, count);
  53. }
  54. }
  55. void ili9341_set_column(uint16_t StartCol, uint16_t EndCol)
  56. {
  57. ili9341_send_cmd(0x2A);
  58. ili9341_write_data((StartCol >> 8) & 0xFF);
  59. ili9341_write_data(StartCol & 0xFF);
  60. ili9341_write_data((EndCol >> 8) & 0xFF);
  61. ili9341_write_data(EndCol & 0xFF);
  62. }
  63. void ili9341_set_page(uint16_t StartPage, uint16_t EndPage)
  64. {
  65. ili9341_send_cmd(0x2B);
  66. ili9341_write_data((StartPage >> 8) & 0xFF);
  67. ili9341_write_data(StartPage & 0xFF);
  68. ili9341_write_data((EndPage >> 8) & 0xFF);
  69. ili9341_write_data(EndPage & 0xFF);
  70. }
  71. void ili9341_lcd_get_pixel(char *color, int x, int y)
  72. {
  73. rt_uint16_t red = 0;
  74. rt_uint16_t green = 0;
  75. rt_uint16_t blue = 0;
  76. if (x >= XSIZE_PHYS || y >= YSIZE_PHYS)
  77. {
  78. *(rt_uint16_t *)color = 0;
  79. return;
  80. }
  81. ili9341_set_column(x, x);
  82. ili9341_set_page(y, y);
  83. ili9341_send_cmd(0x2E);
  84. ili9341_read_data(); // Dummy
  85. red = ili9341_read_data(); // Red[4:0]@D15~D11
  86. blue = ili9341_read_data(); // Blue[4:0]@D15~D11
  87. green = ili9341_read_data(); // Green[5:0]@D15~D10
  88. //BGR565: B in High byte, R in low byte
  89. //*(rt_uint16_t *)color = (((blue >> 11) << 11) | ((green >> 10) << 5) | (red >> 11));
  90. //RGB565: R in High byte, B in low byte
  91. *(rt_uint16_t *)color = (((red >> 11) << 11) | ((green >> 10) << 5) | (blue >> 11));
  92. }
  93. rt_err_t rt_hw_lcd_ili9341_ebi_init(rt_uint32_t ili9341_base)
  94. {
  95. g_uint32_ili9341_base = ili9341_base;
  96. return RT_EOK;
  97. }
  98. #endif /* if defined(NU_PKG_USING_ILI9341_EBI) */