适配雷鸟JD9985 LCD,添加背光控制 2218/1 2218/head 2220/target/1
authorpenglei <1624952103@qq.com>
Wed, 10 Sep 2025 08:04:03 +0000 (16:04 +0800)
committerpenglei <1624952103@qq.com>
Wed, 10 Sep 2025 08:04:03 +0000 (16:04 +0800)
code/sdk/application/brandy/brandy_standard/thread_pri_init.c
code/sdk/application/wearable/ln/service/power_manager/src/actions/display_action.c
code/sdk/application/wearable/ohos_startup/ohosfwk_startup.c
code/sdk/build/config/target_config/brandy/config.py
code/sdk/drivers/boards/brandy_evb/board_config/board_leiniao.h
code/sdk/drivers/boards/brandy_evb/product/product_evb4_standard.h
code/sdk/drivers/drivers/driver/lcd/lcd_config.c
code/sdk/drivers/drivers/driver/lcd/soc_lcd_api.h
code/sdk/zhihui/utils/custom_utils.c
code/sdk/zhihui/utils/custom_utils.h

index 826fe0a..8eb0f4c 100644 (file)
@@ -31,6 +31,7 @@
 #include "nandflash_config.h"\r
 #include "yaffs_nand_drv.h"\r
 #endif\r
+#ifndef BOARD_LEINIAO\r
 #if defined(TPTYPE_TMA525B)\r
 #include "tma525b_drv1.h"\r
 #elif defined(TPTYPE_ZTW523)\r
@@ -42,6 +43,7 @@
 #else\r
 #include "ztw523_touch1.h"\r
 #endif\r
+#endif\r
 #include "thread_pri_init.h"\r
 #if DSP_EXIST == YES\r
 #include "soc_uapi_audio_sys.h"\r
@@ -155,6 +157,7 @@ store_class g_store_init_select = STORE_CLASS_NAND;
 #if defined(ENABLE_UIKIT) || defined(ENABLE_LVGL)\r
 static void sample_gfx_init(void)\r
 {\r
+#ifndef BOARD_LEINIAO\r
 #if defined(TPTYPE_TMA525B)\r
     tma525b_host_init_sample();\r
 #elif defined(TPTYPE_ZTW523)\r
@@ -165,6 +168,7 @@ static void sample_gfx_init(void)
     cst86xx_host_init_sample();\r
 #else\r
     ztw523_host_init_sample();\r
+#endif\r
 #endif\r
     uapi_lcd_init();\r
     uapi_vau_module_init();\r
index 3e2c29d..399376d 100644 (file)
@@ -29,6 +29,9 @@
 #include "touch_screen_def.h"\r
 #include "time.h"\r
 #include "tcxo.h"\r
+#if defined(CUSTOM_UTILS) && defined(BOARD_LEINIAO)\r
+#include "custom_utils.h"\r
+#endif\r
 /* GBL_CTL_M中SOFT_RST_4寄存器 */\r
 #define DISPLAY_LOGIC_CRG_RESET 0x570000c0\r
 /**\r
@@ -150,6 +153,9 @@ static uint32_t action_display_lcd_on()
             POWER_DISPLAY_PRINT_ERR(0, "drv vau resume error ret=%x\r\n", ret);\r
             return ERRCODE_FAIL;\r
         }\r
+#if defined(CUSTOM_UTILS) && defined(BOARD_LEINIAO)\r
+        uapi_lcd_backlight_on(1);\r
+#endif\r
         ret = uapi_lcd_init();\r
         if (ret != 0 && ret != EXT_ERR_MIPI_ALREADY_INIT) {\r
             POWER_DISPLAY_PRINT_ERR(0, "LCD init error ret=%x\r\n", ret);\r
@@ -160,7 +166,9 @@ static uint32_t action_display_lcd_on()
     NotifyScreenOn(); // Instruct the uikit to start the display operation.\r
 #endif\r
     if ((g_pms_lcd_on_first_flag == false) && (g_pms_dpu_ready == false)) {\r
+#ifndef BOARD_LEINIAO\r
         touch_screen_resume(); // open touch\r
+#endif\r
     }\r
 #ifdef CONFIG_CLDO1PD_SUPPORT\r
     pmu_control_cldo1_sleep_bypass(TURN_ON);\r
@@ -193,7 +201,12 @@ static uint32_t action_display_lcd_off()
 #endif\r
 \r
     osDelay(100);        // Wait 100ms for the uikit to complete display.\r
+#ifndef BOARD_LEINIAO\r
     touch_screen_suspend(); // close touch\r
+#endif\r
+#if defined(CUSTOM_UTILS) && defined(BOARD_LEINIAO)\r
+    uapi_lcd_backlight_off();\r
+#endif\r
     ext_errno ret = drv_vau_suspend(NULL);\r
     if (ret != 0) {\r
         POWER_DISPLAY_PRINT_ERR(0, "drv vau suspend error ret=%x\r\n", ret);\r
index d1f181e..b313663 100644 (file)
@@ -85,13 +85,13 @@ void ohos_startup()
         return;\r
     }\r
     \r
-\r
+#ifndef BOARD_LEINIAO\r
 #ifdef ENABLE_UIKIT\r
     boot_animation_init();\r
 #endif\r
 wait_animation_stop();\r
 boot_animation_init_deinit();\r
-\r
+#endif\r
 #if defined(CONFIG_OTA_UPDATE_SUPPORT) && defined(ENABLE_UIKIT)\r
     //如果在升级状态,则不进入系统\r
  if  (upg_check_upgrade_need_upgrade()) return ;\r
index 9dae88d..5a0ca3d 100644 (file)
@@ -1097,7 +1097,7 @@ target = {
             'VIB_USE_PWM',
             'CONFIG_PWM_SUPPORT',
             # 'ACC_LIS2DOC',
-            # 'ENABLE_CUSTOM_I2C',
+            'ENABLE_CUSTOM_I2C',
             #'ENABLE_VIBRATOR',
             # 'ENCODER_SUPPORT',
             # 'SUPPORT_SPO2_NOTIFICATION',
index 3b16cc2..c8c6297 100644 (file)
@@ -287,7 +287,8 @@ const hal_gpio_config_t g_gpio_function_config[PIN_MAX_NUMBER] = {
     {   S_AGPIO_R9, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
     {   S_AGPIO_L20, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
 #endif
-
+    //开机开启背光
+    {   S_AGPIO_L16, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
 //默认关闭马达
     {   S_AGPIO_R2, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
 //默认开启 EXT LDO V3.0 V1.8
index 6919b26..590897f 100644 (file)
 #if defined(BOARD_U8)
 #define RESOLUTION_WIDTH                  410//466//454
 #define RESOLUTION_HEIGHT                 502//466//454
+#elif defined (BOARD_LEINIAO)
+#define RESOLUTION_WIDTH                  360
+#define RESOLUTION_HEIGHT                 360
 #else
 #define RESOLUTION_WIDTH                  466//454
 #define RESOLUTION_HEIGHT                 466//454
index 1d7dad9..589e47b 100644 (file)
@@ -11,6 +11,7 @@
 \r
 #define LCD_EDO_502X410_SCREEN_ID  0xFFFF //CH13613\r
 #define LCD_EDO_466X466_SCREEN_ID  0x1133\r
+#define LCD_JD_360X360_SCREEN_ID   0x5598\r
 #define LCD_EDO_454X454_SCREEN_ID  0xf00\r
 #define LCD_BOE_454X454_SCREEN_ID  0x500\r
 #define LCD_SH_240X296_SCREEN_ID   0x101\r
@@ -89,6 +90,25 @@ const combo_dev_cfg_t g_panel_466x466_60_config = {
     .pixel_clk = 20000,       // 20000KHz\r
 };\r
 \r
+const combo_dev_cfg_t g_panel_360x360_60_config = {\r
+    .devno = 0,\r
+    .lane_id = {0, -1},\r
+    .out_mode = OUT_MODE_DSI_CMD,\r
+    .out_format = OUT_FORMAT_RGB_24BIT,\r
+    .sync_info = {\r
+        .hsa_pixels   = 8,   // hsa 10 pixels\r
+        .hbp_pixels   = 40,   // hbp 10 pixels\r
+        .hact_pixels  = 360,  // hact 454 pixels\r
+        .hfp_pixels   = 40,   // hfp 10 pixels\r
+        .vsa_lines    = 2,    // vsa 4 lines\r
+        .vbp_lines    = 14,   // vbp 12 lines\r
+        .vact_lines   = 360,  // vact 454 lines\r
+        .vfp_lines    = 16,   // vfp 10 lines\r
+    },\r
+    .phy_data_rate = 480,     // 480Mbps\r
+    .pixel_clk = 20000,       // 20000KHz\r
+};\r
+\r
 const combo_dev_cfg_t g_panel_454x454_60_config = {\r
     .devno = 0,\r
     .lane_id = {0, -1},\r
@@ -135,12 +155,6 @@ const combo_dev_cfg_t g_panel_194x368_qspi_config = {
     },\r
 };\r
 \r
-/* display off sequence for common lcd */\r
-const lcd_cmd_sequ g_common_cmd_display_off[] = {\r
-    {1, 2, {0xfe, 0x00}, 0},   /* select default cmd page */\r
-    {1, 1, {0x28}, 0},         /* display off */\r
-    {1, 1, {0x10}, 120},       /* sleep in */\r
-};\r
 \r
 const lcd_cmd_sequ g_common_466x466_cmd_display_off[] = {\r
 #if defined(BOARD_W9) || defined(BOARD_N9)\r
@@ -155,6 +169,68 @@ const lcd_cmd_sequ g_common_466x466_cmd_display_off[] = {
     {1, 2, {0x4f, 0x01}, 0},   /* ��deepstandby ״̬ */\r
 #endif\r
 };\r
+\r
+#ifdef BOARD_LEINIAO\r
+\r
+/* display off sequence for common lcd */\r
+const lcd_cmd_sequ g_common_cmd_display_off[] = {\r
+    {1, 2, {0xde, 0x00}, 0},   /* select default cmd page */\r
+    {1, 1, {0x28}, 0},         /* display off */\r
+    {1, 1, {0x10}, 120},       /* sleep in */\r
+};\r
+\r
+/* sleep in sequence for common lcd */\r
+const lcd_cmd_sequ g_common_cmd_sleep_in[] = {\r
+    {1, 2, {0xde, 0x00}, 0},   /* select default cmd page */\r
+    {1, 1, {0x28}, 0},         /* display off */\r
+    {1, 1, {0x10}, 120},       /* sleep in */\r
+};\r
+\r
+/* sleep in sequence for common lcd */\r
+const lcd_cmd_sequ g_common_cmd_sleep_out[] = {\r
+    {1, 2, {0xde, 0x00}, 0},   /* select default cmd page */\r
+    {1, 1, {0x11}, 120},       /* sleep out */\r
+    {1, 1, {0x29}, 0},         /* display on */\r
+};\r
+\r
+/* idle in sequence for EDO and BOE 454*454 lcd */\r
+lcd_cmd_sequ g_common_cmd_idle_in[] = {\r
+    {1, 2, {0xde, 0x00}, 0},\r
+    {1, 1, {0x39}, 0},\r
+};\r
+\r
+/* idle out sequence for EDO and BOE 454*454 lcd */\r
+const lcd_cmd_sequ g_common_cmd_idle_out[] = {\r
+    {1, 2, {0xde, 0x00}, 0},\r
+    {1, 1, {0x38}, 0},\r
+};\r
+\r
+/* te on sequence for EDO and BOE 454*454 lcd */\r
+const lcd_cmd_sequ g_common_cmd_te_on[] = {\r
+    {1, 2, {0xde, 0x00}, 0},\r
+    {1, 1, {0x35}, 0},\r
+};\r
+\r
+/* te off sequence for EDO and BOE 454*454 lcd */\r
+const lcd_cmd_sequ g_common_cmd_te_off[] = {\r
+    {1, 2, {0xde, 0x00}, 0},\r
+    {1, 1, {0x34}, 0},\r
+};\r
+\r
+/* set brightness sequence for EDO and BOE 454*454 lcd */\r
+lcd_cmd_sequ g_common_cmd_brightness[] = {\r
+    {1, 2, {0xde, 0x00}, 0},\r
+    {1, 2, {0x51, 0xff}, 0},\r
+};\r
+#else\r
+\r
+/* display off sequence for common lcd */\r
+const lcd_cmd_sequ g_common_cmd_display_off[] = {\r
+    {1, 2, {0xfe, 0x00}, 0},   /* select default cmd page */\r
+    {1, 1, {0x28}, 0},         /* display off */\r
+    {1, 1, {0x10}, 120},       /* sleep in */\r
+};\r
+\r
 /* sleep in sequence for common lcd */\r
 const lcd_cmd_sequ g_common_cmd_sleep_in[] = {\r
     {1, 2, {0xfe, 0x00}, 0},   /* select default cmd page */\r
@@ -198,7 +274,7 @@ lcd_cmd_sequ g_common_cmd_brightness[] = {
     {1, 2, {0xfe, 0x00}, 0},\r
     {1, 2, {0x51, 0xff}, 0},\r
 };\r
-\r
+#endif\r
 /* init sequence for ST7367 360*480 lcd */\r
 const lcd_cmd_sequ g_st7367_360x480_screen_init_on[] = {\r
     {1, 2, {0xF0, 0xC3}, 0},\r
@@ -340,6 +416,62 @@ const lcd_cmd_sequ g_boe_194x368_screen_init_on[] = {
     {0, 1, {0x39}, 0},\r
 };\r
 \r
+\r
+const lcd_cmd_sequ g_jd_360x360_screen_init_on[] = {\r
+    {1, 2, {0xDE, 0x00}, 0},\r
+    {1, 3, {0xDF, 0x98, 0x55}, 0},\r
+    {1, 3, {0xCE, 0x0D, 0x00}, 0},\r
+    // {1, 2, {0xC2, 0x38}, 0},\r
+    {1, 2, {0xB2, 0x30}, 0},\r
+    {1, 5, {0xB7, 0x01, 0x35, 0x01, 0x5D}, 0},\r
+    {1, 7, {0xBB, 0x1B, 0x64, 0xE3, 0x34, 0x3E, 0xF3}, 0},\r
+    {1, 5, {0xBC, 0x00, 0x18, 0xF3, 0xC0}, 0},\r
+    {1, 3, {0xC0, 0x22, 0xC1}, 0},\r
+    {1, 12, {0xC3, 0x00, 0x02, 0x2A, 0x0B, 0x08, 0x47, 0x08, 0x04, 0x62, 0x30, 0x30}, 0},\r
+    {1, 12, {0xC4, 0x40, 0x00, 0xAD, 0x68, 0x43, 0x07, 0x04, 0x16, 0x43, 0x07, 0x04}, 0},\r
+    {1, 33, {0xC8, 0x3F, 0x2E, 0x24, 0x1F, 0x20, 0x21, 0x1D, 0x1D, 0x1D, 0x1C, 0x19, 0x0E, 0x0B, 0x07, 0x03, 0x02, 0x3F, 0x2E, 0x24, 0x1F, 0x20, 0x21, 0x1D, 0x1D, 0x1D, 0x1C, 0x19, 0x0E, 0x0B, 0x07, 0x03, 0x02}, 0},\r
+    {1, 3, {0xD3, 0x28, 0x13}, 0},\r
+    {1, 3, {0xD7, 0x18, 0x31}, 0},\r
+    {1, 7, {0xD9, 0x00, 0x00, 0xFF, 0x00, 0xF0, 0x00}, 0},\r
+    {1, 2, {0xDE, 0x01}, 0},\r
+    {1, 9, {0xB7, 0x13, 0xE7, 0x64, 0x39, 0x06, 0x36, 0x19, 0x1C}, 0},\r
+    {1, 2, {0xBE, 0x00}, 0},\r
+    {1, 5, {0xC1, 0x04, 0x4A, 0x90, 0x08}, 0},\r
+    {1, 5, {0xC2, 0x00, 0x16, 0xDA, 0xE7}, 0},\r
+    {1, 3, {0xC4, 0x72, 0x12}, 0},\r
+    {1, 7, {0xC7, 0x00, 0x00, 0x09, 0x3D, 0x09, 0x3D}, 0},\r
+    {1, 7, {0xC8, 0x00, 0x00, 0x0B, 0x3D, 0x16, 0x39}, 0},\r
+    {1, 6, {0xC9, 0x00, 0x0A, 0x08, 0x06, 0x04}, 0},\r
+    {1, 6, {0xCA, 0x1E, 0x1F, 0x10, 0x17, 0x18}, 0},\r
+    {1, 6, {0xCB, 0x01, 0x0B, 0x09, 0x07, 0x05}, 0},\r
+    {1, 6, {0xCC, 0x1E, 0x1F, 0x11, 0x17, 0x18}, 0},\r
+    {1, 6, {0xCD, 0x31, 0x25, 0x27, 0x29, 0x2B}, 0},\r
+    {1, 6, {0xCE, 0x3F, 0x3E, 0x21, 0x37, 0x38}, 0},\r
+    {1, 6, {0xCF, 0x30, 0x24, 0x26, 0x28, 0x2A}, 0},\r
+    {1, 6, {0xD0, 0x3F, 0x3E, 0x20, 0x37, 0x38}, 0},\r
+    {1, 6, {0xD1, 0x06, 0x30, 0xA5, 0xDB, 0x30}, 0},\r
+    {1, 7, {0xD3, 0x3B, 0x08, 0x00, 0x00, 0x00, 0x00}, 0},\r
+    {1, 7, {0xD4, 0x67, 0x00, 0x00, 0x01, 0x00, 0x01}, 0},\r
+    {1, 8, {0xD5, 0x10, 0x10, 0x07, 0x07, 0x0F, 0x94, 0x26}, 0},\r
+    {1, 4, {0xD6, 0x00, 0x00, 0x40}, 0},\r
+    {1, 4, {0xD7, 0x01, 0x84, 0x20}, 0},\r
+    {1, 2, {0xDE, 0x02}, 0},\r
+    {1, 2, {0xB6, 0x1C}, 0},\r
+    {1, 2, {0xDE, 0x00}, 0},\r
+    {1, 2, {0x4D, 0x00}, 0},\r
+    {1, 2, {0x4E, 0x00}, 0},\r
+    {1, 2, {0x4F, 0x00}, 0},\r
+    {1, 2, {0x4C, 0x01}, 10},\r
+    {1, 2, {0x4C, 0x00}, 0},\r
+    {1, 5, {0x2A, 0x00, 0x00, 0x01, 0x68}, 0},\r
+    {1, 5, {0x2B, 0x00, 0x00, 0x01, 0x68}, 0},\r
+    {1, 2, {0x35, 0x00}, 0},\r
+    {1, 2, {0x36, 0x00}, 0},\r
+    /* {1, 2, {0x3A, 0x55}, 0}, */\r
+    {1, 1, {0x11}, 120},\r
+    {1, 1, {0x29}, 10},\r
+};\r
+\r
 const lcd_cmds_sequ g_display_off_cmds = {\r
     .cmd = g_common_cmd_display_off,\r
     .cmd_cnt = array_size(g_common_cmd_display_off),\r
@@ -389,6 +521,11 @@ const lcd_cmds_sequ g_edo_466x466_screen_init_on_cmds = {
     .cmd_cnt = array_size(g_edo_466x466_screen_init_on),\r
 };\r
 \r
+const lcd_cmds_sequ g_jd_360x360_screen_init_on_cmds = {\r
+    .cmd = g_jd_360x360_screen_init_on,\r
+    .cmd_cnt = array_size(g_jd_360x360_screen_init_on),\r
+};\r
+\r
 const lcd_cmds_sequ g_edo_454x454_screen_init_on_cmds = {\r
     .cmd = g_edo_454x454_screen_init_on,\r
     .cmd_cnt = array_size(g_edo_454x454_screen_init_on),\r
@@ -478,6 +615,25 @@ const lcd_drv_cfg g_lcd_driver_ops[] = {
         .lcd_id_info.reg_addr = 0x04,\r
         .lcd_id_info.read_len = 3,\r
     },\r
+    {\r
+        .bus_type             = BUS_DISPLAY_MIPI,\r
+        .bus_cfg              = &g_panel_360x360_60_config,\r
+        .x_start              = 0,\r
+        .y_start              = 0,\r
+        .fps                  = 60,\r
+        .lcd_id               = LCD_JD_360X360_SCREEN_ID,\r
+        .display_on_cmds      = &g_jd_360x360_screen_init_on_cmds,\r
+        .display_off_cmds     = &g_display_off_cmds,\r
+        .enter_idle_cmds      = &g_idle_in_cmds,\r
+        .exit_idle_cmds       = &g_idle_out_cmds,\r
+        .te_on_cmds           = &g_te_on_cmds,\r
+        .te_off_cmds          = &g_te_off_cmds,\r
+        .set_brightnes_cmds   = &g_brightness_cmds,\r
+        .sleep_in_cmds        = &g_sleep_in_cmds,\r
+        .sleep_out_cmds       = &g_sleep_out_cmds,\r
+        .lcd_id_info.reg_addr = 0x04,\r
+        .lcd_id_info.read_len = 3,\r
+    },\r
     {\r
         .bus_type             = BUS_DISPLAY_MIPI,\r
         .bus_cfg              = &g_panel_454x454_60_config,\r
index d080983..b321122 100644 (file)
@@ -18,7 +18,7 @@
 extern "C" {\r
 #endif\r
 \r
-#define MAX_DATA_LENGTH 15\r
+#define MAX_DATA_LENGTH 50\r
 \r
 typedef enum {\r
     LCD_DISPLAY_OFF,     /* LCD关闭显示 */\r
index 988c9ee..a728ee0 100644 (file)
@@ -4330,4 +4330,50 @@ void uapi_get_lcd_id(uint32_t *id)
             *id = (uint32_t)lcd_cfg->lcd_id;
         }
     }
-}
\ No newline at end of file
+}
+
+#define LCD_BACKLIGHT_PWM_PIN       S_AGPIO_L16    /* 背光PWM引脚 */
+
+void uapi_lcd_backlight_off(void)
+{
+    uapi_pin_set_mode(LCD_BACKLIGHT_PWM_PIN, HAL_PIO_FUNC_GPIO);
+    uapi_gpio_set_dir(LCD_BACKLIGHT_PWM_PIN, GPIO_DIRECTION_OUTPUT);
+    uapi_gpio_set_val(LCD_BACKLIGHT_PWM_PIN, GPIO_LEVEL_LOW);
+
+    PRINT("uapi_lcd_backlight_off\r\n");
+}
+
+void uapi_lcd_backlight_on(uint8_t brightness)
+{
+    uint8_t fall_edge_cnt = 0;
+    if (brightness <= 11)      fall_edge_cnt = 7;
+    else if (brightness <= 24) fall_edge_cnt = 6;
+    else if (brightness <= 37) fall_edge_cnt = 5;
+    else if (brightness <= 49) fall_edge_cnt = 4;
+    else if (brightness <= 61) fall_edge_cnt = 3;
+    else if (brightness <= 74) fall_edge_cnt = 2;
+    else if (brightness <= 87) fall_edge_cnt = 1;
+    else                    fall_edge_cnt = 0;
+
+    uapi_pin_set_mode(S_AGPIO_L16, HAL_PIO_FUNC_GPIO);
+    uapi_gpio_set_dir(S_AGPIO_L16, GPIO_DIRECTION_OUTPUT);
+    uapi_gpio_set_val(S_AGPIO_L16, GPIO_LEVEL_LOW);
+
+    uapi_tcxo_delay_us(180);
+
+    for (uint8_t i = 0; i < fall_edge_cnt; i++) 
+    {
+        uapi_gpio_set_val(S_AGPIO_L16, GPIO_LEVEL_HIGH);
+        uapi_tcxo_delay_us(1);
+
+        uapi_gpio_set_val(S_AGPIO_L16, GPIO_LEVEL_LOW);
+        uapi_tcxo_delay_us(1);
+    }
+
+    uapi_gpio_set_val(S_AGPIO_L16, GPIO_LEVEL_HIGH);
+
+    uapi_tcxo_delay_us(30);
+
+    printf("Brightness: %u%% → Fall Edge: %u → LED Current: %.1fmA\n",
+        brightness, fall_edge_cnt, 20.0 - (2.5 * fall_edge_cnt));
+}
index c5c1f89..2a6ae7d 100644 (file)
@@ -440,6 +440,9 @@ void uapi_cat1_add_cat1_vote(void);
 
 void uapi_get_lcd_id(uint32_t *id);
 
+void uapi_lcd_backlight_on(uint8_t brightness);
+void uapi_lcd_backlight_off(void);
+
 #include "custom_utilscpp.h"