ili9341_ebi.c 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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_set_column(uint16_t StartCol, uint16_t EndCol)
  36. {
  37. ili9341_send_cmd(0x2A);
  38. ili9341_write_data((StartCol >> 8) & 0xFF);
  39. ili9341_write_data(StartCol & 0xFF);
  40. ili9341_write_data((EndCol >> 8) & 0xFF);
  41. ili9341_write_data(EndCol & 0xFF);
  42. }
  43. void ili9341_set_page(uint16_t StartPage, uint16_t EndPage)
  44. {
  45. ili9341_send_cmd(0x2B);
  46. ili9341_write_data((StartPage >> 8) & 0xFF);
  47. ili9341_write_data(StartPage & 0xFF);
  48. ili9341_write_data((EndPage >> 8) & 0xFF);
  49. ili9341_write_data(EndPage & 0xFF);
  50. }
  51. void ili9341_lcd_get_pixel(char *color, int x, int y)
  52. {
  53. rt_uint16_t red = 0;
  54. rt_uint16_t green = 0;
  55. rt_uint16_t blue = 0;
  56. if (x >= XSIZE_PHYS || y >= YSIZE_PHYS)
  57. {
  58. *(rt_uint16_t *)color = 0;
  59. return;
  60. }
  61. ili9341_set_column(x, x);
  62. ili9341_set_page(y, y);
  63. ili9341_send_cmd(0x2E);
  64. ili9341_read_data(); // Dummy
  65. red = ili9341_read_data(); // Red[4:0]@D15~D11
  66. blue = ili9341_read_data(); // Blue[4:0]@D15~D11
  67. green = ili9341_read_data(); // Green[5:0]@D15~D10
  68. //BGR565: B in High byte, R in low byte
  69. //*(rt_uint16_t *)color = (((blue >> 11) << 11) | ((green >> 10) << 5) | (red >> 11));
  70. //RGB565: R in High byte, B in low byte
  71. *(rt_uint16_t *)color = (((red >> 11) << 11) | ((green >> 10) << 5) | (blue >> 11));
  72. }
  73. rt_err_t rt_hw_lcd_ili9341_ebi_init(rt_uint32_t ili9341_base)
  74. {
  75. g_uint32_ili9341_base = ili9341_base;
  76. return RT_EOK;
  77. }
  78. #endif /* if defined(NU_PKG_USING_ILI9341_EBI) */