2.2 px30驱动移植 - LCD屏驱动讲解(encode + panel )

文章目录

一、 写在前面

整理一下px30移植时,panel-simple.c的调用堆栈逻辑,这一块主要是涉及到panel-simple.c 和 rockchip_rgb.c的逻辑调用 ,其中panel-simple.c 主要是实现读取设备树中设置并且提供设置函数,rockchip_rgb.c 的初始化会调用到panel-simple.c中提供的相应底层初始化设备。

二、pannel时序设置

三、设备树中的设置

panel {
		compatible = "simple-panel";
		backlight = <&backlight>;
		//电源
		power-supply = <&vcc_lcd>;
		#gpio的使能引脚0_A2 默认高电平
		enable-gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>;
		// prepare-delay-ms = <120>;
		// enable-delay-ms = <120>;
		// disable-delay-ms = <120>;
		// unprepare-delay-ms = <120>;
		bus-format = <MEDIA_BUS_FMT_RBG888_1X24>;
	width<span class="token operator">-</span>mm <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">108</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>
	height<span class="token operator">-</span>mm <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">64</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>

	display<span class="token operator">-</span>timings <span class="token punctuation">{<!-- --></span>
		native<span class="token operator">-</span>mode <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token operator">&amp;</span>timing0<span class="token operator">&gt;</span><span class="token punctuation">;</span>

		timing0<span class="token operator">:</span> timing0 <span class="token punctuation">{<!-- --></span>
		    <span class="token comment">//时序信息,需要根据芯片手册去修改</span>
			clock<span class="token operator">-</span>frequency <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">33300000</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>
			hactive <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">800</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>
			vactive <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">480</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>
			hback<span class="token operator">-</span>porch <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">36</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>
			hfront<span class="token operator">-</span>porch <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">210</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>
			vback<span class="token operator">-</span>porch <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">13</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>
			vfront<span class="token operator">-</span>porch <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">22</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>
			hsync<span class="token operator">-</span>len <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">10</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>
			vsync<span class="token operator">-</span>len <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">10</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>
			hsync<span class="token operator">-</span>active <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">0</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>
			vsync<span class="token operator">-</span>active <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">0</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>
			de<span class="token operator">-</span>active <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">1</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>
			pixelclk<span class="token operator">-</span>active <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token number">1</span><span class="token operator">&gt;</span><span class="token punctuation">;</span>
		<span class="token punctuation">}</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span><span class="token punctuation">;</span>

四、pane调用逻辑

分析一下panel-simple.c

static const struct of_device_id platform_of_match[] = {
	{
		.compatible = "simple-panel",
		.data = NULL,
	},
    ...
    , {
		/* sentinel */
	}
};
MODULE_DEVICE_TABLE(of, platform_of_match);
//初始化panel
static int panel_simple_platform_probe(struct platform_device *pdev)
{
	const struct of_device_id *id;
id <span class="token operator">=</span> <span class="token function">of_match_node</span><span class="token punctuation">(</span>platform_of_match<span class="token punctuation">,</span> pdev<span class="token operator">-&gt;</span>dev<span class="token punctuation">.</span>of_node<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>id<span class="token punctuation">)</span>
	<span class="token keyword">return</span> <span class="token operator">-</span>ENODEV<span class="token punctuation">;</span>

<span class="token keyword">return</span> <span class="token function">panel_simple_probe</span><span class="token punctuation">(</span><span class="token operator">&amp;</span>pdev<span class="token operator">-&gt;</span>dev<span class="token punctuation">,</span> id<span class="token operator">-&gt;</span>data<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

static const struct drm_panel_funcs panel_simple_funcs = {
	.loader_protect = panel_simple_loader_protect,//屏使能准备
	.disable = panel_simple_disable, //屏关闭
	.unprepare = panel_simple_unprepare,//为屏关闭做准备工作
	.prepare = panel_simple_prepare,//为屏打开做准备工作
	.enable = panel_simple_enable,//屏使能
	.get_modes = panel_simple_get_modes,//获取显示分辨率
	.get_timings = panel_simple_get_timings,
};
panel_simple_probe
  panel_simple_get_cmds
    drm_panel_init(&panel->base);
	panel->base.dev = dev;
	panel->base.funcs = &panel_simple_funcs;//提供panel操作函数
	err = drm_panel_add(&panel->base);
	

看一下如何取得设备树中的时序信息的

panel_simple_get_modes
  panel_simple_of_get_native_mode
  	of_get_drm_display_mode
  		of_get_videomode
  			of_get_display_timings
  				of_parse_display_timing
  					ret |= parse_timing_property(np, "hback-porch", &dt->hback_porch);
					ret |= parse_timing_property(np, "hfront-porch", &dt->hfront_porch);
					ret |= parse_timing_property(np, "hactive", &dt->hactive);
					ret |= parse_timing_property(np, "hsync-len", &dt->hsync_len);
					ret |= parse_timing_property(np, "vback-porch", &dt->vback_porch);
					ret |= parse_timing_property(np, "vfront-porch", &dt->vfront_porch);
					ret |= parse_timing_property(np, "vactive", &dt->vactive);
					ret |= parse_timing_property(np, "vsync-len", &dt->vsync_len);
					ret |= parse_timing_property(np, "clock-frequency", &dt->pixelclock);
					of_property_read_u32(np, "vsync-active", &val)
					of_property_read_u32(np, "hsync-active", &val)
					of_property_read_u32(np, "de-active", &val)
					
        
         

五、rgb调用逻辑

struct drm_encoder_helper_funcs rockchip_rgb_encoder_helper_funcs = {
	.enable = rockchip_rgb_encoder_enable,
	.disable = rockchip_rgb_encoder_disable,
	.atomic_check = rockchip_rgb_encoder_atomic_check,
	.loader_protect = rockchip_rgb_encoder_loader_protect,
};

struct drm_connector_helper_funcs rockchip_rgb_connector_helper_funcs = {
	.get_modes = rockchip_rgb_connector_get_modes,
	.best_encoder = rockchip_rgb_connector_best_encoder,
};

rockchip_rgb_probe
	component_add(dev, &rockchip_rgb_component_ops)
		rockchip_rgb_bind
			drm_encoder_helper_add(encoder, &rockchip_rgb_encoder_helper_funcs);
			if (rgb->panel) {
				drm_connector_helper_add(connector,&rockchip_rgb_connector_helper_funcs);
			}

六、硬件设置代码

后续更新

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值