dsi_set_cmdq 用法

编辑框1有如下内容 
B9 FF 83 79 
B1 44 18 18 31 51 90 D0 EE 
通过按钮转换为如下格式,输出到编辑框2里 
a[0] = 00043902; //这个参数里面的4为第一行内容的个数 
a[1] = 7983FFB9; //第一行内容,倒序输出 
dsi_set_cmdq(&a, 2, 1); //括号里的数字2是a[]的个数

a[0] = 00093902; //这个参数里面的09为第二行内容的个数 
a[1] = 181844B1; //第二行内容,倒序输出,4个一组,超出4个换行 
a[2] = D0905131; 
a[3] = 000000EE;//不足4个的用00补齐 
dsi_set_cmdq(&data_array, 4, 1); //括号里的数字4是a[]的个数

READ 
static unsigned int lcm_esd_check(void) 


#ifndef BUILD_LK  

char buffer[3];

int array[4];

array[0] = 0x00013700;

dsi_set_cmdq(array, 1, 1);

read_reg_v2(0x53, buffer, 1);

if(buffer[0] != 0x24)
{
    printk("[LCM ERROR] [0x53]=0x%02x\n", buffer[0]);
    return TRUE;
}
else
{
    printk("[LCM NORMAL] [0x53]=0x%02x\n", buffer[0]);
    return FALSE;
}

#else

   return FALSE;
#endif
}
8 case DSI_SET_BL: 13829 { 13830 struct mtk_dsi *dsi = 13831 container_of(comp, struct mtk_dsi, ddp_comp); 13832 if(!is_bdg_supported()) { 13833 #ifdef OPLUS_FEATURE_DISPLAY 13834 bool need_fliter_backlight = false; 13835 struct drm_crtc *crtc = &(comp->mtk_crtc->base); 13836 int bl_lv = *(int *)params; 13837 oplus_display_brightness = *(int *)params; 13838 panel_ext = mtk_dsi_get_panel_ext(comp); 13839 if(!crtc) { 13840 DDPINFO("Invalid drm crtc param\n"); 13841 } 13842 if (oplus_ofp_is_supported()) { 13843 need_fliter_backlight = oplus_ofp_backlight_filter(crtc, handle, *(int *)params); 13844 } 13845 /*LCD AOD no need fliter backlight*/ 13846 if (panel_ext->params->doze_disable_backlight_flag_enable) 13847 need_fliter_backlight = false; 13848 13849 if (silence_mode) { 13850 DDPINFO("silence_mode is %d, set backlight to 0\n", silence_mode); 13851 silence_flag = 1; 13852 bl_lv = 0; 13853 } else { 13854 silence_flag = 0; 13855 } 13856 if (panel_ext && panel_ext->funcs 13857 && panel_ext->funcs->oplus_set_backlight_cmdq && !need_fliter_backlight) { 13858 panel_ext->funcs->oplus_set_backlight_cmdq(dsi, 13859 mtk_dsi_cmdq_pack_gce, handle, bl_lv); 13860 } else if (panel_ext && panel_ext->funcs 13861 && panel_ext->funcs->set_backlight_cmdq && !need_fliter_backlight) { 13862 panel_ext->funcs->set_backlight_cmdq(dsi, 13863 mipi_dsi_dcs_write_gce, handle, bl_lv); 13864 } 13865 #ifdef OPLUS_FEATURE_DISPLAY_APOLLO 13866 if (!(oplus_apollo_unsupported())) { 13867 apollo_notify_aal_backlight(dsi,bl_lv); 13868 } 13869 #endif 13870 #else 13871 panel_ext = mtk_dsi_get_panel_ext(comp); 13872 if (panel_ext && panel_ext->funcs 13873 && panel_ext->funcs->set_backlight_cmdq) 13874 panel_ext->funcs->set_backlight_cmdq(dsi, 13875 mipi_dsi_dcs_write_gce, 13876 handle, *(int *)params); 13877 #endif 13878 } else{ 13879 printk("set backlight with mipi_dsi_6382_ddic"); 13880 int bl = *(int *) params; 13881 panel_ext = mtk_dsi_get_panel_ext(comp); 13882 if (silence_mode) { 13883 silence_flag = 1; 13884 bl = 0; 13885 printk("%s silence_mode is %ld, set backlight to 0\n",__func__, silence_mode); 13886 } else { 13887 silence_flag = 0; 13888 } 13889 if (dsi->mode_flags & MIPI_DSI_MODE_VIDEO) { 13890 DDPMSG("%s:6382 setbacklight by cmd cmd backlight = %d\n", __func__, bl); 13891 cmdq_pkt_wfe(handle, 13892 comp->mtk_crtc->gce_obj.event[EVENT_CMD_EOF]); 13893 mtk_dsi_stop_vdo_mode(dsi, handle); 13894 if (panel_ext && panel_ext->funcs 13895 && panel_ext->funcs->set_backlight_cmdq){ 13896 panel_ext->funcs->set_backlight_cmdq(dsi, 13897 mipi_dsi_6382_ddic, 13898 handle, bl); 13899 } 13900 mtk_dsi_start_vdo_mode(comp, handle); 13901 mtk_disp_mutex_trigger(comp->mtk_crtc->mutex[0], handle); 13902 mtk_dsi_trigger(comp, handle); 13903 } 13904 } 13905 } 13906 break;
最新发布
04-03
<think>嗯,用户给了一段代码,看起来是关于设置背光的功能。这段代码属于MTK DSI驱动的一部分,可能是在处理显示背光调节的逻辑。首先,我需要理解代码的结构和功能。 代码开头是case DSI_SET_BL,应该是处理设置背光的命令。接下来定义了一个mtk_dsi结构体指针,通过container_of获取到包含ddp_comp的结构体实例。然后有一个条件判断!is_bdg_supported(),这里可能是在检查是否支持某种桥接模式。 在条件成立的分支里,首先看到OPLUS_FEATURE_DISPLAY的宏定义,说明这部分是OPLUS的定制代码。这里定义了一些变量,比如need_fliter_backlight,用来判断是否需要过滤背光。接着获取drm_crtc和背光等级bl_lv,保存到oplus_display_brightness。然后通过mtk_dsi_get_panel_ext获取panel_ext,可能用于操作面板相关的函数。 接下来检查crtc是否存在,不存在则打印日志。然后检查是否支持OFP(可能是OPLUS的某个显示功能),如果需要过滤背光,就调用oplus_ofp_backlight_filter函数。然后判断是否在AOD模式下,如果是,就不需要过滤背光。 之后处理静默模式,如果开启静默模式,背光设为0,并设置标志位。否则,恢复标志位。然后根据panel_ext中的函数指针,调用不同的背光设置函数,比如oplus_set_backlight_cmdqset_backlight_cmdq,并传递参数。这里还看到OPLUS_FEATURE_DISPLAY_APOLLO的宏,可能用于通知其他模块背光变化。 在else分支,即支持桥接模式的情况下,打印信息,获取背光参数,同样处理静默模式。如果处于视频模式,则停止视频模式,设置背光,再重新启动视频模式,并触发相关硬件事件,确保背光更新生效。 用户可能希望了解这段代码的作用,或者遇到相关问题需要调试。比如背光设置不正常,静默模式无效,或者桥接模式下的问题。需要关注日志输出、宏定义是否启用、函数指针是否正确初始化,以及硬件操作是否正确。另外,不同厂商的定制代码可能存在兼容性问题,需要检查条件编译部分是否正确适配当前平台。</think>这是一个显示驱动中设置背光(Backlight)的代码片段,属于MTK平台DSI显示子系统的一部分。以下是分步骤解析: 1. **功能入口**: - `case DSI_SET_BL` 表示这是处理背光设置的case分支 - 通过 `container_of` 获取包含 `ddp_comp` 的 `mtk_dsi` 主结构体 2. **桥接模式判断**: - `is_bdg_supported()` 判断是否支持桥接模式(可能指MIPI桥接芯片) - 分两种场景处理: * **非桥接模式**: - 涉及OPLUS定制功能(`OPLUS_FEATURE_DISPLAY`) - 处理静默模式下的背光置零 - 检查AOD息屏状态是否需要过滤背光 - 通过 `panel_ext->funcs` 调用厂商特定的背光设置接口 * **桥接模式**: - 使用 `mipi_dsi_6382_ddic` 特殊处理 - 视频模式下需要先停止VDO模式再设置背光 - 通过 `mtk_dsi_stop_vdo_mode`/`mtk_dsi_start_vdo_mode` 确保时序正确 3. **关键逻辑**: ```c if (silence_mode) { // 静默模式处理 bl_lv = 0; silence_flag = 1; } ``` ```c mtk_dsi_stop_vdo_mode(dsi, handle); // 桥接模式下视频模式控制 panel_ext->funcs->set_backlight_cmdq(...); mtk_dsi_start_vdo_mode(comp, handle); ``` 4. **特殊功能**: - `oplus_ofp_backlight_filter()`:OPLUS光学指纹相关背光过滤 - `apollo_notify_aal_backlight()`:亮度同步通知机制 - `doze_disable_backlight_flag_enable`:AOD息屏显示标志 **可能涉及的调试场景**: 1. 背光无法调节时: - 检查 `panel_ext->funcs` 是否正确初始化 - 验证 `silence_mode` 标志位状态 - 确认桥接模式判断逻辑是否正确 2. 视频模式闪烁: - 检查 `mtk_dsi_stop_vdo_mode`/`start_vdo_mode` 时序 - 验证EOF事件(`EVENT_CMD_EOF`)同步 3. 厂商定制问题: - OPLUS/Apollo相关宏定义的启用状态 - 背光指令格式差异(`mipi_dsi_dcs_write_gce` vs `mipi_dsi_6382_ddic`) 建议结合以下日志分析: ```c DDPMSG("%s:6382 setbacklight by cmd cmd backlight = %d\n", __func__, bl); printk("set backlight with mipi_dsi_6382_ddic"); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值