fsa506_ebi.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  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. * 2022-2-23 Wayne First version
  10. *
  11. ******************************************************************************/
  12. #include <rtconfig.h>
  13. #if defined(NU_PKG_USING_FSA506_EBI)
  14. #include <lcd_fsa506.h>
  15. #include "drv_pdma.h"
  16. #define FSA506_ADDR_CMD 0x0
  17. #define FSA506_ADDR_DATA 0x0
  18. #define fsa506_write_cmd(Cmd) (*((volatile uint16_t *)(s_u32AccessBase+(FSA506_ADDR_CMD))) = (Cmd))
  19. #define fsa506_write_data(Data) (*((volatile uint16_t *)(s_u32AccessBase+(FSA506_ADDR_DATA))) = (Data))
  20. #define fsa506_read_data() (*((volatile uint16_t *)(s_u32AccessBase+(FSA506_ADDR_DATA))))
  21. static rt_uint32_t s_u32AccessBase = 0;
  22. void fsa506_send_cmd(rt_uint16_t cmd)
  23. {
  24. CLR_RS;
  25. fsa506_write_cmd(cmd);
  26. SET_RS;
  27. }
  28. void fsa506_send_cmd_parameter(rt_uint16_t data)
  29. {
  30. fsa506_write_data(data);
  31. }
  32. void fsa506_send_cmd_done(void)
  33. {
  34. CLR_RS;
  35. fsa506_write_cmd(0x80);
  36. SET_RS;
  37. }
  38. void fsa506_write_reg(rt_uint16_t reg, rt_uint16_t data)
  39. {
  40. fsa506_send_cmd(reg & 0xFF);
  41. fsa506_send_cmd_parameter(data & 0xFF);
  42. fsa506_send_cmd_done();
  43. }
  44. void fsa506_send_pixel_data(rt_uint16_t color)
  45. {
  46. fsa506_write_data(color);
  47. }
  48. void fsa506_send_pixels(rt_uint16_t *pixels, int len)
  49. {
  50. int count = len / sizeof(rt_uint16_t);
  51. if (count < 1024)
  52. {
  53. // CPU feed
  54. int i = 0;
  55. while (i < count)
  56. {
  57. fsa506_send_pixel_data(pixels[i]);
  58. i++;
  59. }
  60. }
  61. else
  62. {
  63. // PDMA-M2M feed
  64. nu_pdma_mempush((void *)(s_u32AccessBase + (FSA506_ADDR_DATA)), (void *)pixels, 16, count);
  65. }
  66. }
  67. void fsa506_set_column(uint16_t StartCol, uint16_t EndCol)
  68. {
  69. fsa506_write_reg(0x0, (StartCol >> 8) & 0xFF);
  70. fsa506_write_reg(0x1, StartCol & 0xFF);
  71. fsa506_write_reg(0x2, (EndCol >> 8) & 0xFF);
  72. fsa506_write_reg(0x3, EndCol & 0xFF);
  73. }
  74. void fsa506_set_page(uint16_t StartPage, uint16_t EndPage)
  75. {
  76. fsa506_write_reg(0x4, (StartPage >> 8) & 0xFF);
  77. fsa506_write_reg(0x5, StartPage & 0xFF);
  78. fsa506_write_reg(0x6, (EndPage >> 8) & 0xFF);
  79. fsa506_write_reg(0x7, EndPage & 0xFF);
  80. }
  81. void fsa506_lcd_get_pixel(char *color, int x, int y)
  82. {
  83. //Not supported.
  84. return;
  85. }
  86. rt_err_t rt_hw_lcd_fsa506_ebi_init(rt_uint32_t fsa506_base)
  87. {
  88. s_u32AccessBase = fsa506_base;
  89. return RT_EOK;
  90. }
  91. #endif /* if defined(NU_PKG_USING_FSA506_EBI) */