版本:T5_TUYAOS-3.12.12
问题1:颜色顺序通过驱动只能调整为RBG或者BRG,不知道为什么绿色值总是在最后,修改CONFIG_LV_COLOR_16_SWAP=y也没能解决,请问是要改什么配置或者什么初始化参数吗?
问题2:使用ai_toy例子配合自己的屏幕,滚动时严重闪屏。
请问需要改什么位置的或者什么参数?
LVGL测试代码
Code: Select all
/**
* @file tuya_app_main.c
* @author www.tuya.com
* @brief tuya_app_main module is used to
* @version 0.1
* @date 2022-10-28
*
* @copyright Copyright (c) tuya.inc 2022
*
*/
#include <stdlib.h>
#include "tuya_cloud_types.h"
#include "tuya_cloud_com_defs.h"
#include "tal_system.h"
#include "tal_log.h"
#include "tal_thread.h"
#include "tal_time_service.h"
#include "tkl_display.h"
#include "tkl_lvgl.h"
#include "lvgl/lvgl.h"
#include "tkl_thread.h"
#define LCD_IC_NAME "jd9853"
#define LCD_WIDTH 240
#define LCD_HEIGHT 296
STATIC TKL_THREAD_HANDLE sg_display_thrd_hdl = NULL;
STATIC THREAD_HANDLE ty_app_thread = NULL;
STATIC VOID_T __cpu0_recv_cb(UCHAR_T *buf, UINT_T len, VOID_T *args)
{
// struct ipc_msg_s *send_msg = (struct ipc_msg_s *)buf;
// bk_printf("---> cpu0 ipc recv data cmd:0x%02x \r\n", send_msg->buf[0]);
}
void tuya_board_lcd_init(TKL_DISP_INFO_S *lcd)
{
lcd->ll_ctrl.power_ctrl_pin = TUYA_GPIO_NUM_MAX; // no lcd ldo
lcd->ll_ctrl.power_active_level = TUYA_GPIO_LEVEL_HIGH;
lcd->ll_ctrl.rgb_mode = TKL_DISP_PIXEL_FMT_RGB565;
lcd->ll_ctrl.bl.io = TUYA_GPIO_NUM_47;
lcd->ll_ctrl.bl.mode = TKL_DISP_BL_GPIO;
lcd->ll_ctrl.bl.active_level = TUYA_GPIO_LEVEL_HIGH;
lcd->ll_ctrl.dc_pin = TUYA_GPIO_NUM_17;
lcd->ll_ctrl.dc_cmd_level = TUYA_GPIO_LEVEL_LOW;
// lcd->ll_ctrl.spi.clk = TUYA_GPIO_NUM_14;
// lcd->ll_ctrl.spi.csx = TUYA_GPIO_NUM_19;
// lcd->ll_ctrl.spi.sda = TUYA_GPIO_NUM_16;
// lcd->ll_ctrl.spi.rst_mode = TKL_DISP_GPIO_RESET;
// lcd->ll_ctrl.spi.rst = TUYA_GPIO_NUM_MAX;
lcd->ll_ctrl.tp.tp_i2c_clk = TUYA_GPIO_NUM_MAX;
lcd->ll_ctrl.tp.tp_i2c_sda = TUYA_GPIO_NUM_MAX;
lcd->ll_ctrl.tp.tp_rst = TUYA_GPIO_NUM_MAX;
lcd->ll_ctrl.tp.tp_intr = TUYA_GPIO_NUM_MAX;
lcd->ll_ctrl.rst_pin = TUYA_GPIO_NUM_18;
lcd->ll_ctrl.rst_active_level = TUYA_GPIO_LEVEL_LOW;
lcd->ll_ctrl.spi_using_qspi=FALSE;
}
STATIC VOID_T tuya_app_thread(VOID_T *arg)
{
TY_INIT_PARAMS_S init_param = {0};
init_param.init_db = TRUE;
strcpy(init_param.sys_env, TARGET_PLATFORM);
tuya_iot_init_params(NULL, &init_param);
tal_log_set_manage_attr(TAL_LOG_LEVEL_DEBUG);
/*测试开始 */
TKL_DISP_DEVICE_S sg_lvgl_lcd;
TKL_DISP_INFO_S sg_lvgl_info;
TAL_PR_DEBUG("test start!");
memset(&sg_lvgl_lcd, 0, sizeof(TKL_DISP_DEVICE_S));
memset(&sg_lvgl_info, 0, sizeof(TKL_DISP_INFO_S));
sg_lvgl_info.width = LCD_WIDTH;
sg_lvgl_info.height = LCD_HEIGHT;
sg_lvgl_info.fps = 20;
sg_lvgl_info.rotation = TKL_DISP_ROTATION_0;
// sg_lvgl_info.format = TKL_DISP_PIXEL_FMT_RGB565;
sg_lvgl_info.ll_ctrl.enable_lcd_pipeline = 1; // lvgl : 1, dvp:0
snprintf(sg_lvgl_info.ll_ctrl.ic_name, IC_NAME_LENGTH, "%s", LCD_IC_NAME);//"ili9488"
sg_lvgl_lcd.device_info = &sg_lvgl_info;
TAL_PR_DEBUG("============lcd init!");
tuya_board_lcd_init(&sg_lvgl_info);
sg_lvgl_info.ll_ctrl.type = TUYA_LCD_TYPE_SPI;
TAL_PR_DEBUG("============display init!");
tkl_disp_init(&sg_lvgl_lcd, NULL);
TKL_LVGL_CFG_T lv_cfg = {
.recv_cb = __cpu0_recv_cb,
.recv_arg = NULL,
};
TAL_PR_DEBUG("============lvgl_init!");
tkl_lvgl_init(&sg_lvgl_info, &lv_cfg);
TAL_PR_DEBUG("============lvgl start!");
tkl_lvgl_start();
TAL_PR_DEBUG("============set bl!");
tkl_disp_set_brightness(NULL, 100);
while(1)
{
TAL_PR_DEBUG("============display init done!");
tal_system_sleep(1000);
}
/*测试结束 */
tal_thread_delete(ty_app_thread);
ty_app_thread = NULL;
}
VOID_T tuya_app_main(VOID)
{
#if defined(ENABLE_EXT_RAM) && (ENABLE_EXT_RAM == 1)
extern VOID_T tkl_system_psram_malloc_force_set(BOOL_T enable);
tkl_system_psram_malloc_force_set(TRUE);
#endif
THREAD_CFG_T thrd_param = {10240, 4, "tuya_app_main"};
tal_thread_create_and_start(&ty_app_thread, NULL, NULL, tuya_app_thread, NULL, &thrd_param);
}
#if defined(ENABLE_EXT_RAM) && (ENABLE_EXT_RAM == 1)
void tuya_gui_pause(void)
{
//! TODO:
}
void tuya_gui_resume(void)
{
//! TODO:
}
STATIC VOID_T __cpu1_recv_cb(UCHAR_T *buf, UINT_T len, VOID_T *args)
{
}
STATIC VOID_T __lv_draw()
{
lv_obj_t* screen = lv_obj_create(lv_scr_act());
lv_obj_set_size(screen,LCD_WIDTH,LCD_HEIGHT);
lv_obj_set_style_pad_all(screen, 0, 0);
lv_obj_set_style_bg_color(screen, lv_color_hex(0xFFFFFF), 0);
lv_obj_t* lab1=lv_label_create(screen);
lv_label_set_text(lab1,"hello world");
lv_obj_set_pos(lab1,10,100);
lv_obj_t* obj = lv_obj_create(screen);
lv_obj_set_size(obj,20,20);
lv_obj_set_style_bg_color(obj,lv_color_hex(0xFF0000),0);
lv_obj_set_pos(obj,100,100);
lv_obj_t* obj2 = lv_obj_create(screen);
lv_obj_set_size(obj2,20,20);
lv_obj_set_style_bg_color(obj2,lv_color_hex(0x00FF00),0);
lv_obj_set_pos(obj2,120,100);
lv_obj_t* obj3 = lv_obj_create(screen);
lv_obj_set_size(obj3,20,20);
lv_obj_set_style_bg_color(obj3,lv_color_hex(0x0000FF),0);
lv_obj_set_pos(obj3,140,100);
}
STATIC VOID_T __tuya_ai_display_thread(VOID_T *arg)
{
// TY_DISPLAY_MSG_T disp_msg;
// OPERATE_RET rt = OPRT_OK;
__lv_draw();
for (;;) {
// rt = tkl_queue_fetch(disp_msg_queue, &disp_msg, TKL_QUEUE_WAIT_FROEVER);
lv_vendor_disp_lock();
// tuya_ui_app(&disp_msg);
lv_vendor_disp_unlock();
// if (disp_msg.data && disp_msg.len) {
// tkl_system_psram_free(disp_msg.data);
// }
}
}
VOID_T tuya_gui_main(VOID_T)
{
TKL_DISP_INFO_S info;
info.width = LCD_WIDTH;
info.height = LCD_HEIGHT;
// info.format = TKL_DISP_PIXEL_FMT_RGB565;
info.fps = 20;
info.rotation = TKL_DISP_ROTATION_0;
snprintf(info.ll_ctrl.ic_name, IC_NAME_LENGTH, "%s", LCD_IC_NAME);
TKL_LVGL_CFG_T lv_cfg = {
.recv_cb = __cpu1_recv_cb,
.recv_arg = NULL,
};
tkl_lvgl_init(&info, &lv_cfg);
if (NULL == sg_display_thrd_hdl) {
tkl_thread_create_in_psram(&sg_display_thrd_hdl, "ai_display", 1024*6, 4, __tuya_ai_display_thread, NULL);
}
}
#endif
屏幕驱动代码
Code: Select all
// Copyright 2020-2021 Beken
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include <common/bk_include.h>
#include <driver/lcd_types.h>
#define __WIDTH 240
#define __HEIGHT 296
static const lcd_qspi_init_cmd_t jd9853_init_cmds[] =
{
{0xDF,{0x98,0x53},2},
{0xDE,{0x00},1},
{0xB2,{0x25},1},
{0xB7,{0x00,0x21,0x00,0x49},4},
{0xBB,{0x4F,0x1A,0x55,0x73,0x6F,0xF0},6},
{0xC0,{0x44,0xA4},2},
{0xC1,{0x12},1},
{0xC3,{0x7D,0x07,0x14,0x06,0xC8,0x71,0x6C,0x77},8},
{0xC4,{0x00,0x00,0x94,0x79,0x25,0x0A,0x16,0x79,0x25,0x0A,0x16,0x82},12},
{0xC8,{0x3F,0x34,0x2B,0x20,0x2A,0x2C,0x24,0x24,0x21,0x22,0x20,0x15,0x10,0x0B,0x06,0x00,0x3F,0x34,0x2B,0x20,0x2A,0x2C,0x24,0x24,0x21,0x22,0x20,0x15,0x10,0x0B,0x06,0x00},32},
{0xD0,{0x04,0x06,0x6B,0x0F,0x00},5},
{0xD7,{0x00,0x30},2},
{0xE6,{0x14},1},
{0xDE,{0x01},1},
{0xB7,{0x03,0x13,0xEF,0x35,0x35},5},
{0xC1,{0x14,0x15,0xC0},3},
{0xC2,{0x06,0x3A},2},
{0xC4,{0x72,0x12},2},
{0xBE,{0x00},1},
{0xDE,{0x00},1},
{0x35,{0x00},1},
{0x3A,{0x05},1},
{0x36,{0x08},1},
{0x2A,{0x00,0x00,0x00,0xEF},4},
{0x2B,{0x00,0x00,0x01,0x27},4},
{0x11,{0x00},0},
{0x00,{0x64}, 0xFF}, // sleep
{0x29,{0x00},0}
};
static const lcd_spi_t lcd_spi_jd9853_config =
{
.clk = LCD_QSPI_30M,
.init_cmd = jd9853_init_cmds,
.device_init_cmd_len = sizeof(jd9853_init_cmds) / sizeof (lcd_qspi_init_cmd_t),
};
const lcd_device_t lcd_device_jd9853 =
{
.id = LCD_DEVICE_JD9853,
.name = "jd9853",
.type = LCD_TYPE_SPI,
.ppi = (__WIDTH<<16)|__HEIGHT,
.spi = &lcd_spi_jd9853_config,
.init = NULL,
.lcd_off = NULL,
};