ili9341_ebi.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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. #define ILI9341_ADDR_CMD 0x0
  16. #define ILI9341_ADDR_DATA 0x0030000
  17. #define ili9341_reg_write(u32RegAddr) (*((volatile unsigned short *)(g_uint32_ili9341_base+(ILI9341_ADDR_CMD))) = (u32RegAddr))
  18. #define ili9341_read_data() (*((volatile unsigned short *)(g_uint32_ili9341_base+(ILI9341_ADDR_DATA))))
  19. #define ili9341_write_data(u32Data) (*((volatile unsigned short *)(g_uint32_ili9341_base+(ILI9341_ADDR_DATA))) = (u32Data))
  20. static rt_uint32_t g_uint32_ili9341_base = 0;
  21. void ili9341_send_cmd(rt_uint8_t cmd)
  22. {
  23. CLR_RS;
  24. ili9341_reg_write(cmd);
  25. SET_RS;
  26. }
  27. void ili9341_send_cmd_parameter(rt_uint8_t data)
  28. {
  29. ili9341_write_data(data);
  30. }
  31. void ili9341_send_pixel_data(rt_uint16_t color)
  32. {
  33. ili9341_write_data(color);
  34. }
  35. void ili9341_send_pixels(rt_uint16_t *pixels, int len)
  36. {
  37. int i = 0;
  38. int size = len / sizeof(rt_uint16_t);
  39. while (i < size)
  40. ili9341_write_data(pixels[i]);
  41. }
  42. void ili9341_set_column(uint16_t StartCol, uint16_t EndCol)
  43. {
  44. ili9341_send_cmd(0x2A);
  45. ili9341_write_data((StartCol >> 8) & 0xFF);
  46. ili9341_write_data(StartCol & 0xFF);
  47. ili9341_write_data((EndCol >> 8) & 0xFF);
  48. ili9341_write_data(EndCol & 0xFF);
  49. }
  50. void ili9341_set_page(uint16_t StartPage, uint16_t EndPage)
  51. {
  52. ili9341_send_cmd(0x2B);
  53. ili9341_write_data((StartPage >> 8) & 0xFF);
  54. ili9341_write_data(StartPage & 0xFF);
  55. ili9341_write_data((EndPage >> 8) & 0xFF);
  56. ili9341_write_data(EndPage & 0xFF);
  57. }
  58. void ili9341_lcd_get_pixel(char *color, int x, int y)
  59. {
  60. rt_uint16_t red = 0;
  61. rt_uint16_t green = 0;
  62. rt_uint16_t blue = 0;
  63. if (x >= XSIZE_PHYS || y >= YSIZE_PHYS)
  64. {
  65. *(rt_uint16_t *)color = 0;
  66. return;
  67. }
  68. ili9341_set_column(x, x);
  69. ili9341_set_page(y, y);
  70. ili9341_send_cmd(0x2E);
  71. ili9341_read_data(); // Dummy
  72. red = ili9341_read_data(); // Red[4:0]@D15~D11
  73. blue = ili9341_read_data(); // Blue[4:0]@D15~D11
  74. green = ili9341_read_data(); // Green[5:0]@D15~D10
  75. //BGR565: B in High byte, R in low byte
  76. //*(rt_uint16_t *)color = (((blue >> 11) << 11) | ((green >> 10) << 5) | (red >> 11));
  77. //RGB565: R in High byte, B in low byte
  78. *(rt_uint16_t *)color = (((red >> 11) << 11) | ((green >> 10) << 5) | (blue >> 11));
  79. }
  80. rt_err_t rt_hw_lcd_ili9341_ebi_init(rt_uint32_t ili9341_base)
  81. {
  82. g_uint32_ili9341_base = ili9341_base;
  83. return RT_EOK;
  84. }
  85. #endif /* if defined(NU_PKG_USING_ILI9341_EBI) */