luat_lcd.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. #ifndef LUAT_LCD
  2. #define LUAT_LCD
  3. #include "luat_base.h"
  4. #include "luat_spi.h"
  5. #include "u8g2.h"
  6. #define LCD_W 240
  7. #define LCD_H 320
  8. #define LCD_DIRECTION 0
  9. #define LCD_WHITE 0xFFFF
  10. #define LCD_BLACK 0x0000
  11. #ifndef LUAT_LCD_COLOR_DEPTH
  12. #define LUAT_LCD_COLOR_DEPTH 16
  13. #endif
  14. #if (LUAT_LCD_COLOR_DEPTH == 32)
  15. #define luat_color_t uint32_t
  16. #elif (LUAT_LCD_COLOR_DEPTH == 16)
  17. #define luat_color_t uint16_t
  18. #elif (LUAT_LCD_COLOR_DEPTH == 8)
  19. #define luat_color_t uint8_t
  20. #else
  21. #error "no support color depth"
  22. #endif
  23. enum{
  24. LUAT_LCD_HW_ID_0 = 0x20, //专用LCD接口 ID
  25. LUAT_LCD_SPI_DEVICE,
  26. LUAT_LCD_PORT_RGB,
  27. LUAT_LCD_PORT_8080,
  28. LUAT_LCD_PORT_ARM2D,
  29. LUAT_LCD_PORT_DMA2D,
  30. LUAT_LCD_PORT_MAX,
  31. };
  32. struct luat_lcd_opts;
  33. #define LUAT_LCD_DEFAULT_SLEEP 0X10
  34. #define LUAT_LCD_DEFAULT_WAKEUP 0X11
  35. enum{
  36. LUAT_LCD_IM_3_WIRE_9_BIT_INTERFACE_I = 5,
  37. LUAT_LCD_IM_4_WIRE_8_BIT_INTERFACE_I = 6,
  38. LUAT_LCD_IM_3_WIRE_9_BIT_INTERFACE_II = 13,
  39. LUAT_LCD_IM_4_WIRE_8_BIT_INTERFACE_II = 14,
  40. LUAT_LCD_IM_2_DATA_LANE = 16,
  41. };
  42. typedef struct luat_lcd_conf {
  43. uint8_t port;
  44. uint8_t pin_dc;
  45. uint8_t pin_pwr;
  46. uint8_t pin_rst;
  47. int16_t w;
  48. int16_t h;
  49. uint32_t buffer_size;
  50. uint32_t dc_delay_us;
  51. uint8_t xoffset;//偏移
  52. uint8_t yoffset;//偏移
  53. uint8_t auto_flush;
  54. uint8_t direction;//方向
  55. u8g2_t luat_lcd_u8g2 ;
  56. struct luat_lcd_opts* opts;
  57. luat_spi_device_t* lcd_spi_device;
  58. int lcd_spi_ref;
  59. void* userdata;
  60. // buff 相关
  61. luat_color_t* buff;
  62. int buff_ref;
  63. int16_t flush_y_min;
  64. int16_t flush_y_max;
  65. uint8_t is_init_done;
  66. uint8_t interface_mode; // LUAT_LCD_IM_XXX
  67. uint8_t lcd_cs_pin; //注意不用的时候写0xff
  68. } luat_lcd_conf_t;
  69. typedef struct luat_lcd_opts {
  70. const char* name;
  71. uint8_t sleep_cmd;
  72. uint8_t wakeup_cmd;
  73. uint8_t direction0;
  74. uint8_t direction90;
  75. uint8_t direction180;
  76. uint8_t direction270;
  77. uint16_t init_cmds_len;
  78. uint16_t* init_cmds;
  79. int (*init)(luat_lcd_conf_t* conf);
  80. int (*write_cmd_data)(luat_lcd_conf_t* conf,const uint8_t cmd, const uint8_t *data, uint8_t data_len);
  81. int (*read_cmd_data)(luat_lcd_conf_t* conf,const uint8_t cmd, const uint8_t *data, uint8_t data_len, uint8_t dummy_bit);
  82. int (*lcd_draw)(luat_lcd_conf_t* conf, int16_t x1, int16_t y1, int16_t x2, int16_t y2, luat_color_t* color);
  83. } luat_lcd_opts_t;
  84. extern luat_lcd_opts_t lcd_opts_gc9106l;
  85. extern luat_lcd_opts_t lcd_opts_gc9306x;
  86. extern luat_lcd_opts_t lcd_opts_gc9a01;
  87. extern luat_lcd_opts_t lcd_opts_ili9341;
  88. extern luat_lcd_opts_t lcd_opts_ili9486;
  89. extern luat_lcd_opts_t lcd_opts_st7735;
  90. extern luat_lcd_opts_t lcd_opts_st7735s;
  91. extern luat_lcd_opts_t lcd_opts_st7735v;
  92. extern luat_lcd_opts_t lcd_opts_st7789;
  93. extern luat_lcd_opts_t lcd_opts_st7796;
  94. extern luat_lcd_opts_t lcd_opts_nv3037;
  95. static inline luat_color_t color_swap(luat_color_t color) {
  96. luat_color_t tmp = (color >> 8) + ((color & 0xFF) << 8);
  97. return tmp;
  98. }
  99. int lcd_write_cmd(luat_lcd_conf_t* conf,const uint8_t cmd);
  100. int lcd_write_data(luat_lcd_conf_t* conf,const uint8_t data);
  101. void luat_lcd_execute_cmds(luat_lcd_conf_t* conf);
  102. int lcd_write_cmd_data(luat_lcd_conf_t* conf,const uint8_t cmd, const uint8_t *data, uint8_t data_len);
  103. int lcd_read_cmd_data(luat_lcd_conf_t* conf,const uint8_t cmd, const uint8_t *data, uint8_t data_len, uint8_t dummy_bit);
  104. luat_lcd_conf_t* luat_lcd_get_default(void);
  105. const char* luat_lcd_name(luat_lcd_conf_t* conf);
  106. int luat_lcd_init_default(luat_lcd_conf_t* conf);//通用spi设备使用
  107. int luat_lcd_init(luat_lcd_conf_t* conf);
  108. int luat_lcd_close(luat_lcd_conf_t* conf);
  109. int luat_lcd_display_on(luat_lcd_conf_t* conf);
  110. int luat_lcd_display_off(luat_lcd_conf_t* conf);
  111. int luat_lcd_sleep(luat_lcd_conf_t* conf);
  112. int luat_lcd_wakeup(luat_lcd_conf_t* conf);
  113. int luat_lcd_inv_off(luat_lcd_conf_t* conf);
  114. int luat_lcd_inv_on(luat_lcd_conf_t* conf);
  115. int luat_lcd_set_address(luat_lcd_conf_t* conf, int16_t x1, int16_t y1, int16_t x2, int16_t y2);
  116. int luat_lcd_set_color(luat_color_t back, luat_color_t fore);
  117. int luat_lcd_draw(luat_lcd_conf_t* conf, int16_t x1, int16_t y1, int16_t x2, int16_t y2, luat_color_t* color);
  118. int luat_lcd_flush(luat_lcd_conf_t* conf);
  119. int luat_lcd_draw_no_block(luat_lcd_conf_t* conf, int16_t x1, int16_t y1, int16_t x2, int16_t y2, luat_color_t* color, uint8_t last_flush);
  120. int luat_lcd_clear(luat_lcd_conf_t* conf, luat_color_t color);
  121. int luat_lcd_draw_fill(luat_lcd_conf_t* conf, int16_t x1,int16_t y1,int16_t x2,int16_t y2,luat_color_t color);
  122. int luat_lcd_draw_point(luat_lcd_conf_t* conf, int16_t x, int16_t y, luat_color_t color);
  123. int luat_lcd_draw_line(luat_lcd_conf_t* conf, int16_t x1, int16_t y1, int16_t x2, int16_t y2, luat_color_t color);
  124. int luat_lcd_draw_vline(luat_lcd_conf_t* conf, int16_t x, int16_t y,int16_t h, luat_color_t color);
  125. int luat_lcd_draw_hline(luat_lcd_conf_t* conf, int16_t x, int16_t y,int16_t h, luat_color_t color);
  126. int luat_lcd_draw_rectangle(luat_lcd_conf_t* conf, int16_t x1, int16_t y1, int16_t x2, int16_t y2, luat_color_t color);
  127. int luat_lcd_draw_circle(luat_lcd_conf_t* conf, int16_t x0, int16_t y0, uint8_t r, luat_color_t color);
  128. int luat_lcd_set_direction(luat_lcd_conf_t* conf, uint8_t direction);
  129. /*
  130. * csdk适配用
  131. */
  132. void luat_lcd_service_init(uint32_t pro);
  133. void luat_lcd_service_run(void *api, void *data, uint32_t param, uint32_t timeout);
  134. int luat_lcd_service_draw(luat_lcd_conf_t* conf, int16_t x1, int16_t y1, int16_t x2, int16_t y2, luat_color_t *data, uint8_t is_static_buf);
  135. int luat_lcd_service_set_mem_type(uint8_t type);
  136. uint32_t luat_lcd_service_cache_len(void);
  137. void luat_lcd_IF_init(luat_lcd_conf_t* conf);
  138. int luat_lcd_IF_write_cmd_data(luat_lcd_conf_t* conf,const uint8_t cmd, const uint8_t *data, uint8_t data_len);
  139. int luat_lcd_IF_read_cmd_data(luat_lcd_conf_t* conf,const uint8_t cmd, uint8_t *data, uint8_t data_len, uint8_t dummy_bit);
  140. int luat_lcd_IF_draw(luat_lcd_conf_t* conf, int16_t x1, int16_t y1, int16_t x2, int16_t y2, luat_color_t* color);
  141. /**
  142. * @brief luat_lcd_init放到service里跑,避免luat_lcd_init里漫长的delay带来的影响
  143. * @param conf lcd配置
  144. * @return 0无异常,其他失败
  145. */
  146. int luat_lcd_init_in_service(luat_lcd_conf_t* conf);
  147. typedef struct
  148. {
  149. uint16_t top_cut_lines;
  150. uint16_t bottom_cut_lines;
  151. uint16_t left_cut_lines;
  152. uint16_t right_cut_lines;
  153. uint16_t w_scale; //宽度比例缩小,0不缩
  154. uint16_t h_scale; //高度度比例缩小,0不缩
  155. }camera_cut_info_t;
  156. /**
  157. * @brief 摄像头启动预览
  158. * @param camera_info camera配置,里面有lcd配置
  159. * @param cut_info 剪裁配置,可以留空
  160. * @param start_x 起始位置x
  161. * @param start_y 起始位置y
  162. * @return 0无异常,其他失败
  163. */
  164. int luat_lcd_show_camera_in_service(void *camera_info, camera_cut_info_t *cut_info, uint16_t start_x, uint16_t start_y);
  165. /**
  166. * @brief 停止摄像头预览
  167. * @return 0无异常,其他失败
  168. */
  169. int luat_lcd_stop_show_camera(void);
  170. #endif