luat_lcd.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. #ifndef LUAT_LCD
  2. #define LUAT_LCD
  3. #include "luat_base.h"
  4. #include "luat_spi.h"
  5. #include "u8g2.h"
  6. #define LUAT_LCD_CONF_COUNT (1)
  7. #define LCD_W 240
  8. #define LCD_H 320
  9. #define LCD_DIRECTION 0
  10. #define LCD_WHITE 0xFFFF
  11. #define LCD_BLACK 0x0000
  12. #ifndef LUAT_LCD_COLOR_DEPTH
  13. #define LUAT_LCD_COLOR_DEPTH 16
  14. #endif
  15. #if (LUAT_LCD_COLOR_DEPTH == 32)
  16. #define luat_color_t uint32_t
  17. #elif (LUAT_LCD_COLOR_DEPTH == 16)
  18. #define luat_color_t uint16_t
  19. #elif (LUAT_LCD_COLOR_DEPTH == 8)
  20. #define luat_color_t uint8_t
  21. #else
  22. #error "no support color depth"
  23. #endif
  24. enum{
  25. LUAT_LCD_ROTATE_0 = 0,
  26. LUAT_LCD_ROTATE_90,
  27. LUAT_LCD_ROTATE_180,
  28. LUAT_LCD_ROTATE_270,
  29. };
  30. enum{
  31. LUAT_LCD_HW_ID_0 = 0x20, //专用LCD接口 ID
  32. LUAT_LCD_SPI_DEVICE,
  33. LUAT_LCD_PORT_RGB,
  34. LUAT_LCD_PORT_8080,
  35. LUAT_LCD_PORT_ARM2D,
  36. LUAT_LCD_PORT_DMA2D,
  37. LUAT_LCD_PORT_MAX,
  38. };
  39. struct luat_lcd_opts;
  40. #define LUAT_LCD_DEFAULT_SLEEP 0X10
  41. #define LUAT_LCD_DEFAULT_WAKEUP 0X11
  42. enum{
  43. LUAT_LCD_IM_3_WIRE_9_BIT_INTERFACE_I = 5,
  44. LUAT_LCD_IM_4_WIRE_8_BIT_INTERFACE_I = 6,
  45. LUAT_LCD_IM_3_WIRE_9_BIT_INTERFACE_II = 13,
  46. LUAT_LCD_IM_4_WIRE_8_BIT_INTERFACE_II = 14,
  47. LUAT_LCD_IM_2_DATA_LANE = 16,
  48. LUAT_LCD_IM_QSPI_MODE = 0x20,
  49. LUAT_LCD_IM_8080_MODE = 0x30,
  50. LUAT_LCD_IM_MIPI_MODE = 0x40,
  51. };
  52. enum{
  53. LUAT_LCD_ACC_HW_JPEG = 0x01,
  54. LUAT_LCD_ACC_HW_ALL = 0xFF,
  55. };
  56. typedef struct
  57. {
  58. uint8_t write_4line_cmd; //address 1线 data4线
  59. uint8_t vsync_reg;
  60. uint8_t hsync_cmd;
  61. uint8_t hsync_reg;
  62. uint8_t write_1line_cmd; //cmd 1线 param 1线
  63. uint8_t write_4line_data; //address data都是4线
  64. }luat_lcd_qspi_conf_t;
  65. typedef struct luat_lcd_conf {
  66. uint8_t port;
  67. uint8_t pin_dc;
  68. uint8_t pin_pwr;
  69. uint8_t pin_rst;
  70. uint8_t lcd_cs_pin; //注意不用的时候写0xff
  71. uint8_t is_init_done;
  72. uint8_t interface_mode; // LUAT_LCD_IM_XXX
  73. uint8_t bpp; //颜色bit,默认是RGB565 16bit,预留兼容ARGB888 32bit
  74. uint8_t xoffset;//偏移
  75. uint8_t yoffset;//偏移
  76. uint8_t auto_flush;
  77. uint8_t direction;//方向
  78. uint8_t endianness_swap; // 大小端转换
  79. uint8_t lcd_use_lvgl;
  80. union {
  81. struct {
  82. uint8_t acc_hw_jpeg:1;
  83. uint8_t :7;
  84. };
  85. uint8_t acc_hw;
  86. };
  87. uint8_t reserved;
  88. int16_t w;
  89. int16_t h;
  90. uint16_t hbp;
  91. uint16_t hspw;
  92. uint16_t hfp;
  93. uint16_t vbp;
  94. uint16_t vspw;
  95. uint16_t vfp;
  96. int16_t flush_y_min;
  97. int16_t flush_y_max;
  98. uint32_t buffer_size;
  99. uint32_t dc_delay_us;
  100. uint32_t flush_rate; //刷新率,针对no ram的屏幕起效
  101. uint32_t bus_speed;
  102. luat_color_t* buff;
  103. luat_color_t* buff_ex;
  104. luat_color_t* buff_draw;
  105. struct luat_lcd_opts* opts;
  106. luat_spi_device_t* lcd_spi_device;
  107. int buff_ref;
  108. int lcd_spi_ref;
  109. void* userdata;
  110. u8g2_t luat_lcd_u8g2 ;
  111. } luat_lcd_conf_t;
  112. typedef struct luat_lcd_buff_info {
  113. luat_color_t * buff;
  114. size_t len;
  115. uint32_t width;
  116. uint32_t height;
  117. // size_t offset;
  118. void* userdata;
  119. }luat_lcd_buff_info_t;
  120. typedef struct luat_lcd_opts {
  121. const char* name;
  122. uint8_t sleep_cmd;
  123. uint8_t wakeup_cmd;
  124. uint8_t direction0;
  125. uint8_t direction90;
  126. uint8_t direction180;
  127. uint8_t direction270;
  128. uint8_t rb_swap;
  129. uint8_t no_ram_mode;
  130. uint16_t init_cmds_len;
  131. uint16_t* init_cmds;
  132. int (*user_ctrl_init)(luat_lcd_conf_t* conf);
  133. int (*init)(luat_lcd_conf_t* conf);
  134. int (*write_cmd_data)(luat_lcd_conf_t* conf,const uint8_t cmd, const uint8_t *data, uint8_t data_len);
  135. 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);
  136. int (*lcd_draw)(luat_lcd_conf_t* conf, int16_t x1, int16_t y1, int16_t x2, int16_t y2, luat_color_t* color);
  137. int (*lcd_fill)(luat_lcd_conf_t* conf, int16_t x1, int16_t y1, int16_t x2, int16_t y2, luat_color_t color);
  138. int (*sleep_ctrl)(luat_lcd_conf_t* conf, uint8_t on_off);
  139. int (*reset_ctrl)(luat_lcd_conf_t* conf, uint8_t on_off);
  140. } luat_lcd_opts_t;
  141. extern luat_lcd_opts_t lcd_opts_gc9106l;
  142. extern luat_lcd_opts_t lcd_opts_gc9306x;
  143. extern luat_lcd_opts_t lcd_opts_gc9a01;
  144. extern luat_lcd_opts_t lcd_opts_ili9341;
  145. extern luat_lcd_opts_t lcd_opts_ili9486;
  146. extern luat_lcd_opts_t lcd_opts_st7735;
  147. extern luat_lcd_opts_t lcd_opts_st7735s;
  148. extern luat_lcd_opts_t lcd_opts_st7735v;
  149. extern luat_lcd_opts_t lcd_opts_st7789;
  150. extern luat_lcd_opts_t lcd_opts_st7796;
  151. extern luat_lcd_opts_t lcd_opts_nv3037;
  152. extern luat_lcd_opts_t lcd_opts_h050iwv;
  153. extern luat_lcd_opts_t lcd_opts_jd9261t_inited;
  154. //extern luat_lcd_opts_t lcd_opts_jd9261t;
  155. extern luat_lcd_opts_t lcd_opts_sh8601z;
  156. static inline luat_color_t color_swap(luat_color_t color) {
  157. luat_color_t tmp = (color >> 8) + ((color & 0xFF) << 8);
  158. return tmp;
  159. }
  160. int lcd_write_cmd(luat_lcd_conf_t* conf,const uint8_t cmd);
  161. int lcd_write_data(luat_lcd_conf_t* conf,const uint8_t data);
  162. void luat_lcd_execute_cmds(luat_lcd_conf_t* conf);
  163. int lcd_write_cmd_data(luat_lcd_conf_t* conf,const uint8_t cmd, const uint8_t *data, uint8_t data_len);
  164. 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);
  165. // xxx_default 为luatos内部默认实现,bsp可不使用default实现
  166. int luat_lcd_init_default(luat_lcd_conf_t* conf);
  167. int luat_lcd_setup_buff_default(luat_lcd_conf_t* conf);
  168. int luat_lcd_flush_default(luat_lcd_conf_t* conf);
  169. int luat_lcd_draw_default(luat_lcd_conf_t* conf, int16_t x1, int16_t y1, int16_t x2, int16_t y2, luat_color_t* color);
  170. int lcd_draw_jpeg_default(luat_lcd_conf_t* conf, const char* path, int16_t x, int16_t y);
  171. int lcd_jpeg_decode_default(luat_lcd_conf_t* conf, const char* path, luat_lcd_buff_info_t* buff_info);
  172. // 以下为luatos内部实现通用接口
  173. // 以下为 weak函数 可bsp单独适配硬件加速或其他接口适配等功能,默认指向上方xxx_default函数
  174. int luat_lcd_init(luat_lcd_conf_t* conf);
  175. int luat_lcd_setup_buff(luat_lcd_conf_t* conf);
  176. int luat_lcd_flush(luat_lcd_conf_t* conf);
  177. 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);
  178. int lcd_draw_jpeg(luat_lcd_conf_t* conf, const char* path, int16_t x, int16_t y);
  179. int lcd_jpeg_decode(luat_lcd_conf_t* conf, const char* path, luat_lcd_buff_info_t* buff_info);
  180. // 以下为非 weak 函数
  181. luat_lcd_conf_t* luat_lcd_get_default(void);
  182. const char* luat_lcd_name(luat_lcd_conf_t* conf);
  183. int luat_lcd_close(luat_lcd_conf_t* conf);
  184. int luat_lcd_display_on(luat_lcd_conf_t* conf);
  185. int luat_lcd_display_off(luat_lcd_conf_t* conf);
  186. int luat_lcd_sleep(luat_lcd_conf_t* conf);
  187. int luat_lcd_wakeup(luat_lcd_conf_t* conf);
  188. int luat_lcd_inv_off(luat_lcd_conf_t* conf);
  189. int luat_lcd_inv_on(luat_lcd_conf_t* conf);
  190. int luat_lcd_set_address(luat_lcd_conf_t* conf, int16_t x1, int16_t y1, int16_t x2, int16_t y2);
  191. int luat_lcd_set_color(luat_color_t back, luat_color_t fore);
  192. 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);
  193. int luat_lcd_clear(luat_lcd_conf_t* conf, luat_color_t color);
  194. 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);
  195. int luat_lcd_draw_point(luat_lcd_conf_t* conf, int16_t x, int16_t y, luat_color_t color);
  196. 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);
  197. int luat_lcd_draw_vline(luat_lcd_conf_t* conf, int16_t x, int16_t y,int16_t h, luat_color_t color);
  198. int luat_lcd_draw_hline(luat_lcd_conf_t* conf, int16_t x, int16_t y,int16_t h, luat_color_t color);
  199. 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);
  200. int luat_lcd_draw_circle(luat_lcd_conf_t* conf, int16_t x0, int16_t y0, uint8_t r, luat_color_t color);
  201. int luat_lcd_set_direction(luat_lcd_conf_t* conf, uint8_t direction);
  202. int luat_lcd_set_reset_pin_level(luat_lcd_conf_t* conf, uint8_t level);
  203. /*
  204. * csdk适配用
  205. */
  206. void luat_lcd_service_init(uint32_t pro);
  207. 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);
  208. int luat_lcd_service_set_mem_type(uint8_t type);
  209. uint32_t luat_lcd_service_cache_len(void);
  210. void luat_lcd_IF_init(luat_lcd_conf_t* conf);
  211. int luat_lcd_IF_write_cmd_data(luat_lcd_conf_t* conf,const uint8_t cmd, const uint8_t *data, uint8_t data_len);
  212. 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);
  213. 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);
  214. int luat_lcd_IF_fill(luat_lcd_conf_t* conf, int16_t x1, int16_t y1, int16_t x2, int16_t y2, luat_color_t color);
  215. int luat_lcd_IF_show_camera(luat_lcd_conf_t* conf, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint32_t data_address);
  216. int luat_lcd_IF_sleep(luat_lcd_conf_t* conf, uint8_t on_off);
  217. /**
  218. * @brief luat_lcd_init放到service里跑,避免luat_lcd_init里漫长的delay带来的影响
  219. * @param conf lcd配置
  220. * @return 0无异常,其他失败
  221. */
  222. int luat_lcd_init_in_service(luat_lcd_conf_t* conf);
  223. typedef struct
  224. {
  225. uint16_t top_cut_lines;
  226. uint16_t bottom_cut_lines;
  227. uint16_t left_cut_lines;
  228. uint16_t right_cut_lines;
  229. uint16_t w_scale; //宽度比例缩小,0不缩
  230. uint16_t h_scale; //高度度比例缩小,0不缩
  231. }camera_cut_info_t;
  232. /**
  233. * @brief 摄像头启动预览
  234. * @param camera_info camera配置,里面有lcd配置
  235. * @param cut_info 剪裁配置,可以留空
  236. * @param start_x 起始位置x
  237. * @param start_y 起始位置y
  238. * @return 0无异常,其他失败
  239. */
  240. int luat_lcd_start_show_camera(void *camera_info, camera_cut_info_t *cut_info, uint16_t start_x, uint16_t start_y);
  241. /**
  242. * @brief 摄像头在后台启动预览
  243. * @param camera_info camera配置,里面有lcd配置
  244. * @param cut_info 剪裁配置,可以留空
  245. * @param start_x 起始位置x
  246. * @param start_y 起始位置y
  247. * @return 0无异常,其他失败
  248. */
  249. int luat_lcd_start_show_camera_in_service(void *camera_info, camera_cut_info_t *cut_info, uint16_t start_x, uint16_t start_y);
  250. /**
  251. * @brief 停止摄像头预览
  252. * @param camera_info camera配置,里面有lcd配置
  253. * @return 0无异常,其他失败
  254. */
  255. int luat_lcd_stop_show_camera(void *camera_info);
  256. int luat_lcd_qspi_config(luat_lcd_conf_t* conf, luat_lcd_qspi_conf_t *qspi_config);
  257. int luat_lcd_qspi_auto_flush_on_off(luat_lcd_conf_t* conf, uint8_t on_off);
  258. uint8_t luat_lcd_qspi_is_no_ram(luat_lcd_conf_t* conf);
  259. typedef void (*luat_lcd_api)(void *param, uint32_t param_len);
  260. int luat_lcd_run_api_in_service(luat_lcd_api api, void *param, uint32_t param_len);
  261. int luat_lcd_conf_add(luat_lcd_conf_t* conf);
  262. void luat_lcd_service_debug(void);
  263. #endif