<Android> MTK LCM DSI MIPI 读写

本文介绍了一种在HelioX20平台上的MIPILCM读写操作方法,详细解释了mtk_dsi_write_regs和mtk_dsi_read_regs函数的实现,包括其参数意义及返回值。

LCM中的MIPI读写

我的环境是: Helio X20, kernel 3.18

kernel-3.18\drivers\misc\mediatek\video\mt6797\videox\primary_display.c:

void DSI_set_cmdq_V2_Wrapper_DSI0(unsigned cmd, unsigned char count, unsigned char *para_list, unsigned char force_update);
#define read_reg_v2(cmd, buffer, buffer_size) DSI_dcs_read_lcm_reg_v2(DISP_MODULE_DSI0, NULL, cmd, buffer, buffer_size)
#define dsi_set_cmdq_V2(cmd, size, data) DSI_set_cmdq_V2_Wrapper_DSI0(cmd, size, data, 1)

/* 
 * mtk_dsi_write_regs: mipi write registers
 * @cmd: operate command
 * @data: data buffer to write, can be null
 * @size: data buffer size, can be 0
 * 
 * Return: 0 success, otherwise fail
 */
int mtk_dsi_write_regs(char cmd, char *data, int size)
{
	dsi_set_cmdq_V2(cmd, size, data);
	return 0;
}

/* 
 * mtk_dsi_read_regs: mipi read registers
 * @cmd: operate command
 * @buffer: buffer to save return values, cannot be null
 * @size: buffer size, cannot be 0
 * 
 * Return: 0 success, otherwise fail
 */
int mtk_dsi_read_regs(char cmd, char *buffer, int size)
{
	int ret = 0;

	_primary_path_lock(__func__);
	if (pgc->state == DISP_SLEPT) {
		pr_err("[mtk]primary display path is slept?? -- skip esd check\n");
		_primary_path_unlock(__func__);
		goto done;
	}
	/* 1: stop path */
	_cmdq_stop_trigger_loop();
	if (dpmgr_path_is_busy(pgc->dpmgr_handle))
		pr_debug("[mtk]wait frame done ret:%d\n", ret);

	dpmgr_path_stop(pgc->dpmgr_handle, CMDQ_DISABLE);
	if (dpmgr_path_is_busy(pgc->dpmgr_handle))
		DISPCHECK("[ESD]wait frame done ret:%d\n", ret);

	dpmgr_path_reset(pgc->dpmgr_handle, CMDQ_DISABLE);

	ret = read_reg_v2(cmd, buffer, size);
	if (ret != size) {
		ret = -EIO;
	} else {
		ret = 0;
	}

	dpmgr_path_start(pgc->dpmgr_handle, CMDQ_DISABLE);
	if (primary_display_is_video_mode()) {
		/* for video mode, we need to force trigger here */
		/* for cmd mode, just set DPREC_EVENT_CMDQ_SET_EVENT_ALLOW when trigger loop start */
		dpmgr_path_trigger(pgc->dpmgr_handle, NULL, CMDQ_DISABLE);
	}
	_cmdq_start_trigger_loop();
	/* when we stop trigger loop
	 * if no other thread is running, cmdq may disable its clock
	 * all cmdq event will be cleared after suspend */
	cmdqCoreSetEvent(CMDQ_EVENT_DISP_WDMA0_EOF);
	
	_primary_path_unlock(__func__);

done:
	return ret;
}

<think>嗯,用户想在RK3568开发板上运行安卓13系统,使用5.10内核,通过寄存器调光控制MIPI屏幕,并且实现双屏同步显示。首先,我需要确认用户的需求点。用户提到不要用PWM调光,而是寄存器调光,这可能涉及到直接操作寄存器来控制背光,而不是通过PWM信号。另外,双屏同步显示需要两个屏幕同时工作,可能需要在设备树中配置两路DSI,并且确保时序同步。 接下来,我需要参考用户提供的引用内容。引用1和2提到RK3568的MIPI屏幕配置,需要初始化CMD,硬件引脚如LCD_RST、LCD_EN,以及背光控制。但用户现在想用寄存器调光,可能这些初始化命令需要包含背光控制的寄存器设置。引用3提到RK3588的DSI配置,虽然芯片不同,但可能有类似的配置结构,比如路由设置和双通道显示。 首先,寄存器调光通常需要向屏幕的寄存器发送特定的命令来调整亮度,这通常通过MIPI DSI的命令模式传输。因此,在设备树中需要配置正确的命令模式,并确保驱动支持发送这些命令。可能需要修改dts文件中的backlight相关部分,将PWM改为寄存器控制,或者添加自定义的背光控制节点。 然后是双屏同步显示的问题。RK3568有两路DSI,可能需要配置两个DSI节点,并确保它们的时序参数一致,比如clock频率、hfp、hbp等。同步显示可能还需要在显示控制器的路由设置中将两个DSI通道连接到同一个VP(Video Port),这样视频流可以同时输出到两个屏幕。引用3中的route_dsi0和route_dsi1配置可能是一个参考,虽然芯片不同,但概念类似。 接下来需要检查驱动文件,用户提到了dw-mipi-dsi2-rockchip.c和dw-mipi-dsi-rockchip.c。可能需要在这两个驱动中添加对寄存器调光的支持,比如在背光控制函数中替换PWM操作为发送DSI命令。同时,双屏显示可能需要确保两个DSI控制器都正确初始化和配置,并且使用相同的时序参数。 可能的步骤包括: 1. 设备树配置双DSI节点,设置正确的引脚控制、时钟,以及同步的时序参数。 2. 在背光控制部分,替换PWM配置,添加寄存器调光的命令,比如通过dsi命令包发送背光寄存器值。 3. 修改驱动代码,支持通过寄存器设置背光,可能需要添加新的函数或修改现有的背光控制逻辑。 4. 配置显示路由,将两个DSI接口连接到同一个视频源,确保同步输出。 需要确认内核版本是否支持这些配置,安卓13的内核可能有不同的驱动结构,需要查阅对应的内核文档或已有的驱动实现。此外,屏幕的初始化CMD必须包含背光控制的寄存器设置,这部分需要屏幕厂商提供具体的命令序列。 可能遇到的问题包括:寄存器调光的具体命令格式、双屏时序同步的精确配置、驱动兼容性问题等。调试时可能需要通过示波器检查信号,或者查看内核日志确认DSI命令是否正确发送。 最后,生成相关问题时需要考虑用户可能的后续疑问,比如如何验证寄存器调光是否生效,双屏不同步时的调试方法,以及如何获取屏幕的初始化命令等。</think>根据RK3568 MIPI屏幕开发特性和寄存器调光需求,配置步骤如下: ### 一、寄存器调光配置关键点 1. **背光控制模式选择** 需在设备树中将`pwm-backlight`改为寄存器控制模式,配置示例如下: ```dts backlight { compatible = "register-backlight"; reg = <0x00 0xFF9A0000 0x00 0x100>; // 背光控制寄存器地址 brightness-levels = <0 255>; default-brightness-level = <128>; }; ``` 2. **DSI驱动层修改** 在`dw-mipi-dsi-rockchip.c`中增加寄存器写入接口: ```c static void rk_mipi_dsi_write_reg(struct dw_mipi_dsi *dsi, u8 reg, u8 val) { dsi_write(dsi, DSI_GEN_PLD_DATA, val); dsi_write(dsi, DSI_GEN_HDR, (reg << 8) | DSI_GEN_HDR_DATA_TYPE_DCS_SHORT_WRITE_1); mipi_dsi_dcs_write(dsi, ...); // 具体寄存器操作指令 } ``` ### 二、双屏同步显示配置 1. **设备树双通道配置** ```dts &dsi0 { status = "okay"; ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; dsi0_in_vp2: endpoint { remote-endpoint = <&vp2_out_dsi0>; }; }; }; }; &dsi1 { status = "okay"; ports { port@0 { reg = <0>; dsi1_in_vp2: endpoint { remote-endpoint = <&vp2_out_dsi1>; }; }; }; }; &vp2 { vp2_out_dsi0: endpoint@0 { reg = <0>; remote-endpoint = <&dsi0_in_vp2>; }; vp2_out_dsi1: endpoint@1 { reg = <1>; remote-endpoint = <&dsi1_in_vp2>; }; }; ``` 2. **时序同步参数** 需确保两路DSI的`timing`参数完全一致: ```dts display-timings { timing0 { clock-frequency = <148500000>; hactive = <1920>; vactive = <1080>; hfront-porch = <88>; hback-porch = <148>; hsync-len = <44>; vfront-porch = <4>; vback-porch = <36>; vsync-len = <5>; }; }; ``` ### 三、屏幕初始化配置 需在设备树中加载厂商提供的初始化命令序列: ```dts panel@0 { compatible = "vendor,panel-id"; init-commands = [ 39 00 04 B9 83 10 2E // 背光控制寄存器初始化 15 00 02 B1 7C 15 00 02 B2 22 ]; }; ``` ### 四、验证方法 1. 使用`io -4 0xFF9A0000`读取寄存器当前值 2. 通过`dmesg | grep "DWC_MIPI_DSI"`查看驱动加载状态 3. 使用逻辑分析仪捕捉DSI1/DSI2的CLK信号同步性 **注意事项**: - 需确保供电时序符合屏幕规格书要求[^2] - 双屏同步需严格匹配PHY时钟相位[^3] - 寄存器调光需配合屏幕IC的DCS命令集
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值