1.806驱动添加获取唤醒源功能,驱动编译进内核

2.lcd驱动增加背光渐亮功能,解耦驱动
This commit is contained in:
2025-04-28 17:58:56 +08:00
parent 17f1d2754e
commit 0833611b03
7 changed files with 169 additions and 52 deletions

View File

@@ -66,32 +66,16 @@ static struct disp_lcd_private_data *lcd_private;
static int panel_timing_init(int disp, int lcd_index,
struct disp_panel_para *panel_info, struct disp_video_timings *timmings);
#if defined(CONFIG_DISP2_HAS_SUPPORT_FRONT_WKSRCBL) && defined(CONFIG_DISP2_HAS_SUPPORT_BACK_WKSRCBL)
#error "you can't define both front and back board at the same time"
#endif
#if defined(CONFIG_DISP2_HAS_SUPPORT_FRONT_WKSRCBL) || defined(CONFIG_DISP2_HAS_SUPPORT_BACK_WKSRCBL)
#include <linux/io.h>
#include <linux/timer.h>
#ifdef CONFIG_DISP2_HAS_SUPPORT_FRONT_WKSRCBL
#define STARTUP_DURATION_TIME 600 // 软件定时器很不准确,要设置对应时间需要实际测试
#endif
#ifdef CONFIG_DISP2_HAS_SUPPORT_BACK_WKSRCBL
// #define STARTUP_DURATION_TIME 600
#endif
#define STARTUP_PERIOD 20 // ms
#define STARTUP_START_PWM_VALUE 20 // 起始pwm值
#define STARTUP_EMD_PWD_VALUE 250 // MAX
/*
start up的pwm数值变化
—— 250(MAX)
/
STARTUP_START_PWM_VALUE _/
*/
#ifndef CONFIG_MEM_OPERATION
#define WEIGHT_ADDR 0x4304B000 // 权重加载的内存地址处
#define M_PAGE_SIZE (4 * 1024) // 内存对齐应该是4K
#endif
typedef enum {
HAS_APP_WAKEUP_SOURCE_NONE,
@@ -104,21 +88,55 @@ typedef enum {
HAS_APP_WAKEUP_SOURCE_NFC, // NFC
} has_app_wakeup_source_e; // 前板唤醒源
#endif
#ifdef CONFIG_DISP2_HAS_SUPPORT_BACK_WKSRCBL
#define STARTUP_DURATION_TIME 480
#define WAIT_WAKEUP_SRC_TIMEOUT 800
#define WAIT_FOR_WAKEUP_SRC 0
#define START_BACK_LIGHT 1
#define NOT_START_BACK_LIGHT 0xFF
typedef enum {
HAS_APP_WAKEUP_SOURCE_NONE_BACK,
HAS_APP_WAKEUP_SOURCE_TOUCH, // 触摸
HAS_APP_WAKEUP_SOURCE_STREAM, // 推拉流
HAS_APP_WAKEUP_SOURCE_DOORBELL, // 门铃
HAS_APP_WAKEUP_SOURCE_PEEPHOLE, // 猫眼
HAS_APP_WAKEUP_SOURCE_INVALID, // 无效
} has_app_wakeup_source_back_e; // 后板唤醒源
static atomic_t g_wakeup_start = ATOMIC_INIT(WAIT_FOR_WAKEUP_SRC);
#endif
#define STARTUP_PERIOD 20 // ms
#define STARTUP_START_PWM_VALUE 20 // 起始pwm值
#define STARTUP_EMD_PWD_VALUE 250 // MAX
/*
start up的pwm数值变化
—— 250(MAX)
/
STARTUP_START_PWM_VALUE _/
*/
typedef struct
{
struct timer_list timer;
spinlock_t bl_lock;
unsigned char exit_flag ;
unsigned char timer_flag ;
#if defined(CONFIG_DISP2_HAS_SUPPORT_BACK_WKSRCBL)
unsigned long start_jiffies;
#endif
} has_startup_bl_t;
static has_startup_bl_t startup_bl = {
.exit_flag = 0,
.timer_flag = 0,
.timer.data = 0,
.bl_lock = __SPIN_LOCK_UNLOCKED(startup_bl.bl_lock),
};
#if defined(CONFIG_MEM_OPERATION)
#if defined(CONFIG_DISP2_HAS_SUPPORT_FRONT_WKSRCBL)
extern unsigned char mem_get_wakeup_source(void);
#endif
@@ -1266,19 +1284,28 @@ static s32 disp_lcd_pwm_disable(struct disp_device *lcd)
#endif
#if defined(CONFIG_DISP2_HAS_SUPPORT_FRONT_WKSRCBL) || defined(CONFIG_DISP2_HAS_SUPPORT_BACK_WKSRCBL)
static s32 disp_lcd_clear_startup_bl(void)
{
if (startup_bl.timer_flag)
#if defined(CONFIG_DISP2_HAS_SUPPORT_BACK_WKSRCBL)
void disp_backlight_control(unsigned char wakeup_src) {
if ((wakeup_src == HAS_APP_WAKEUP_SOURCE_TOUCH) || (wakeup_src == HAS_APP_WAKEUP_SOURCE_DOORBELL)
|| (wakeup_src == HAS_APP_WAKEUP_SOURCE_PEEPHOLE))
{
unsigned long flags;
spin_lock_irqsave(&startup_bl.bl_lock, flags);
startup_bl.exit_flag = 1;
spin_unlock_irqrestore(&startup_bl.bl_lock, flags);
atomic_set(&g_wakeup_start, START_BACK_LIGHT);
}
else
{
startup_bl.exit_flag = 1;
atomic_set(&g_wakeup_start, NOT_START_BACK_LIGHT);
}
}
EXPORT_SYMBOL(disp_backlight_control);
#endif
static s32 disp_lcd_clear_startup_bl(void)
{
unsigned long flags;
spin_lock_irqsave(&startup_bl.bl_lock, flags); // wait for the light be setting gracefully
startup_bl.exit_flag = 1;
spin_unlock_irqrestore(&startup_bl.bl_lock, flags);
return 0;
}
@@ -1286,6 +1313,9 @@ static void disp_lcd_backlight_increase(unsigned long data)
{
static u32 cur_bl = STARTUP_START_PWM_VALUE;
unsigned long flags;
#if defined(CONFIG_DISP2_HAS_SUPPORT_BACK_WKSRCBL)
unsigned int start_flag;
#endif
if (data == 0)
{
// pr_emerg("wrong with data\n");
@@ -1299,8 +1329,37 @@ static void disp_lcd_backlight_increase(unsigned long data)
del_timer(&startup_bl.timer);
return;
}
#if defined(CONFIG_DISP2_HAS_SUPPORT_BACK_WKSRCBL)
start_flag = atomic_read(&g_wakeup_start);
if (start_flag == WAIT_FOR_WAKEUP_SRC) /* 等唤醒源 */
{
spin_unlock_irqrestore(&startup_bl.bl_lock, flags);
if (time_after(jiffies, startup_bl.start_jiffies + msecs_to_jiffies(WAIT_WAKEUP_SRC_TIMEOUT)))
{
del_timer(&startup_bl.timer); /* 超时,不亮屏 */
}
else
{
mod_timer(&startup_bl.timer, jiffies + msecs_to_jiffies(STARTUP_PERIOD));
}
return;
}
else if (start_flag == START_BACK_LIGHT) /* 执行 */
{
disp_lcd_set_bright((struct disp_device *)data, cur_bl);
spin_unlock_irqrestore(&startup_bl.bl_lock, flags);
}
else if (start_flag == NOT_START_BACK_LIGHT) /* 不执行 */
{
spin_unlock_irqrestore(&startup_bl.bl_lock, flags);
del_timer(&startup_bl.timer);
return;
}
#endif
#if defined(CONFIG_DISP2_HAS_SUPPORT_FRONT_WKSRCBL)
disp_lcd_set_bright((struct disp_device *)data, cur_bl);
spin_unlock_irqrestore(&startup_bl.bl_lock, flags);
#endif
cur_bl += ((STARTUP_EMD_PWD_VALUE - STARTUP_START_PWM_VALUE) / (STARTUP_DURATION_TIME / STARTUP_PERIOD));
if (cur_bl >= STARTUP_EMD_PWD_VALUE)
@@ -1320,10 +1379,7 @@ static s32 disp_lcd_backlight_enable(struct disp_device *lcd)
struct disp_lcd_private_data *lcdp = disp_lcd_get_priv(lcd);
unsigned long flags;
#if defined(CONFIG_DISP2_HAS_SUPPORT_FRONT_WKSRCBL) || defined(CONFIG_DISP2_HAS_SUPPORT_BACK_WKSRCBL)
#ifndef CONFIG_MEM_OPERATION
void __iomem *vaddr = NULL;
#endif
#if defined(CONFIG_DISP2_HAS_SUPPORT_FRONT_WKSRCBL)
unsigned char wakeupsource = 0;
#endif
if ((lcd == NULL) || (lcdp == NULL)) {
@@ -1363,25 +1419,18 @@ static s32 disp_lcd_backlight_enable(struct disp_device *lcd)
disp_sys_gpio_request(gpio_info, 1);
}
#if defined(CONFIG_DISP2_HAS_SUPPORT_FRONT_WKSRCBL) || defined(CONFIG_DISP2_HAS_SUPPORT_BACK_WKSRCBL)
#if defined(CONFIG_MEM_OPERATION)
#if defined(CONFIG_DISP2_HAS_SUPPORT_FRONT_WKSRCBL)
wakeupsource = mem_get_wakeup_source();
#else
vaddr = memremap(WEIGHT_ADDR, M_PAGE_SIZE, MEMREMAP_WB);
if (vaddr)
{
wakeupsource = readb(vaddr);
memunmap(vaddr);
}
#endif
if ((wakeupsource != HAS_APP_WAKEUP_SOURCE_BACK_PANEL) && (wakeupsource != HAS_APP_WAKEUP_SOURCE_NONE))
#endif
{
init_timer(&startup_bl.timer);
startup_bl.timer.function = disp_lcd_backlight_increase;
startup_bl.timer.expires = jiffies + 1;
startup_bl.timer.data = (unsigned long)lcd;
spin_lock_init(&startup_bl.bl_lock);
startup_bl.timer_flag = 1;
#if defined(CONFIG_DISP2_HAS_SUPPORT_BACK_WKSRCBL)
startup_bl.start_jiffies = jiffies;
#endif
add_timer(&startup_bl.timer);
}
#else