Dozingfiretruck 7 mesi fa
parent
commit
8a2eb4a0d5
2 ha cambiato i file con 72 aggiunte e 20 eliminazioni
  1. 28 16
      components/lcd/luat_lcd.h
  2. 44 4
      components/lcd/luat_lib_lcd.c

+ 28 - 16
components/lcd/luat_lcd.h

@@ -62,6 +62,11 @@ enum{
 	LUAT_LCD_IM_8080_MODE = 0x30,
 };
 
+enum{
+	LUAT_LCD_ACC_HW_JPEG = 0x01,
+    LUAT_LCD_ACC_HW_ALL = 0xFF,
+};
+
 typedef struct
 {
 	uint8_t write_4line_cmd;  //address 1线 data4线
@@ -77,38 +82,45 @@ typedef struct luat_lcd_conf {
     uint8_t pin_dc;
     uint8_t pin_pwr;
     uint8_t pin_rst;
-    int16_t w;
-    int16_t h;
-    uint32_t buffer_size;
-    uint32_t dc_delay_us;
+    uint8_t lcd_cs_pin;		//注意不用的时候写0xff
+    uint8_t is_init_done;
+    uint8_t interface_mode;	// LUAT_LCD_IM_XXX
+    uint8_t bpp;			//颜色bit,默认是RGB565 16bit,预留兼容ARGB888 32bit
     uint8_t xoffset;//偏移
     uint8_t yoffset;//偏移
     uint8_t auto_flush;
     uint8_t direction;//方向
-    // buff 相关
-    int buff_ref;
-    int16_t flush_y_min;
-    int16_t flush_y_max;
-    uint8_t is_init_done;
-    uint8_t interface_mode;	// LUAT_LCD_IM_XXX
-    uint8_t lcd_cs_pin;		//注意不用的时候写0xff
-    uint8_t bpp;			//颜色bit,默认是RGB565 16bit,预留兼容ARGB888 32bit
-    uint32_t flush_rate;	//刷新率,针对no ram的屏幕起效
-    uint32_t bus_speed;
+    uint8_t endianness_swap;	// 大小端转换
+    uint8_t lcd_use_lvgl;
+    union {
+        struct {
+            uint8_t acc_hw_jpeg:1;
+            uint8_t :7;
+        };
+        uint8_t acc_hw;
+    };
+    uint8_t reserved;
+    int16_t w;
+    int16_t h;
     uint16_t hbp;
     uint16_t hspw;
     uint16_t hfp;
     uint16_t vbp;
     uint16_t vspw;
     uint16_t vfp;
+    int16_t flush_y_min;
+    int16_t flush_y_max;
+    uint32_t buffer_size;
+    uint32_t dc_delay_us;
+    uint32_t flush_rate;	//刷新率,针对no ram的屏幕起效
+    uint32_t bus_speed;
     luat_color_t* buff;
     luat_color_t* buff_ex;
     luat_color_t* buff_draw;
     struct luat_lcd_opts* opts;
     luat_spi_device_t* lcd_spi_device;
+    int buff_ref;
     int lcd_spi_ref;
-    int lcd_use_lvgl;
-    int endianness_swap;
     void* userdata;
     u8g2_t luat_lcd_u8g2 ;
 } luat_lcd_conf_t;

+ 44 - 4
components/lcd/luat_lib_lcd.c

@@ -142,6 +142,7 @@ static int l_lcd_init(lua_State* L) {
     }
 #endif
     memset(conf, 0, sizeof(luat_lcd_conf_t)); // 填充0,保证无脏数据
+    conf->acc_hw = 0xFF;
     conf->bpp = 16;
     conf->lcd_cs_pin = LUAT_GPIO_NONE;
     conf->pin_dc = LUAT_GPIO_NONE;
@@ -1864,8 +1865,7 @@ lcd.qspi(0xde, 0xde, nil, 0x61, 0xde, 0x60)
 -- CO5300驱动ic所需的qspi配置
 lcd.qspi(0x02, 0x32, 0x12)
 */
-static int l_lcd_qspi_config(lua_State* L)
-{
+static int l_lcd_qspi_config(lua_State* L){
 	luat_lcd_qspi_conf_t qspi_config = {0};
 	qspi_config.write_1line_cmd = luaL_optinteger(L, 1, 0x02);
 	qspi_config.write_4line_cmd = luaL_optinteger(L, 2, 0x32);
@@ -1882,8 +1882,7 @@ static int l_lcd_qspi_config(lua_State* L)
 @api lcd.user_done()
 @return nil
 */
-static int l_lcd_user_ctrl_done(lua_State* L)
-{
+static int l_lcd_user_ctrl_done(lua_State* L){
 	lcd_dft_conf->is_init_done = 1;
 	if (LUAT_LCD_IM_QSPI_MODE == lcd_dft_conf->interface_mode) {
 		if (luat_lcd_qspi_is_no_ram(lcd_dft_conf)) {
@@ -1893,6 +1892,40 @@ static int l_lcd_user_ctrl_done(lua_State* L)
 	return 0;
 }
 
+/*
+开启/关闭硬件加速(lcd.init后默认开启所有支持的硬件加速,当使用存在问题时可使用此接口进行开关指定的硬件加速)
+@api lcd.setAcchw(type,enable)
+@number type 支持的类型, 可选,默认全部类型 目前支持 lcd.ACC_HW_JPEG lcd.ACC_HW_ALL
+@bool enable 开关, 可选 默认关闭 ture开启 false关闭
+@return nil
+@usage
+    lcd.setAcchw(lcd.ACC_HW_JPEG,false) -- 关闭硬件加速的jpeg解码功能
+    lcd.setAcchw(lcd.ACC_HW_ALL,false) -- 关闭所有硬件加速
+*/
+static int l_lcd_set_acc_hw(lua_State* L){
+    luat_lcd_conf_t * conf = lcd_dft_conf;
+    uint8_t type = luaL_optinteger(L, 1, LUAT_LCD_ACC_HW_ALL);
+    uint8_t enable = 0;
+    if (lua_isboolean(L, 2)) {
+        enable = lua_toboolean(L, 2);
+    }
+    if (type == LUAT_LCD_ACC_HW_ALL){
+        if (enable){
+            conf->acc_hw = LUAT_LCD_ACC_HW_ALL;
+        }else{
+            conf->acc_hw = 0;
+        }
+    }else if(type == LUAT_LCD_ACC_HW_JPEG){
+        if (enable){
+            conf->acc_hw = 1;
+        }else{
+            conf->acc_hw = 0;
+        }
+    }
+	return 0;
+}
+
+
 #include "rotable2.h"
 static const rotable_Reg_t reg_lcd[] =
 {
@@ -1927,6 +1960,7 @@ static const rotable_Reg_t reg_lcd[] =
     { "rgb565",     ROREG_FUNC(l_lcd_rgb565)},
 	{ "qspi",		ROREG_FUNC(l_lcd_qspi_config)},
 	{ "user_done",		ROREG_FUNC(l_lcd_user_ctrl_done)},
+    { "setAcchw",    ROREG_FUNC(l_lcd_set_acc_hw)},
 #ifdef LUAT_USE_UFONT
     { "drawUTF8",   ROREG_FUNC(l_lcd_draw_utf8)},
 #endif
@@ -2077,6 +2111,12 @@ static const rotable_Reg_t reg_lcd[] =
 	{ "QSPI_MODE",                ROREG_INT(LUAT_LCD_IM_QSPI_MODE)},
 	//@const 8080_MODE 8080模式
 	{ "8080_MODE",                ROREG_INT(LUAT_LCD_IM_8080_MODE)},
+
+    //@const ACC_HW_JPEG JPEG硬件加速
+    {"ACC_HW_JPEG", ROREG_INT(LUAT_LCD_ACC_HW_JPEG)},
+    //@const ACC_HW_ALL 所有硬件加速
+    {"ACC_HW_ALL", ROREG_INT(LUAT_LCD_ACC_HW_ALL)},
+
 	{NULL, ROREG_INT(0)}
 };