文章目录
写在前面
主要是介绍一下rk平台px30 移植LCD屏的工作心得
一、DRM基础
二、DRM相关目录结构
driver | file | doc |
---|---|---|
Core | rockchip_drm_drv.c | |
Framebufferrock | chip_drm_fb.c | |
GEM | rockchip_drm_gem.c | |
VOP | rockchip_drm_vop.c ,rockchip_vop_reg.c | |
LVDS | rockchip_lvds.c | |
RGB | rockchip_rgb.c | |
MIPI | dw_mipi_dsi.c,phy_rockchip-inno-mipi-dphy.c | |
HDMI | dw_hdmi-rockchip.c,dw-hdmi.c | |
INNO HDMI | inno_hdmi.c | |
eDp | analogix_dp-rockchip.c,analogix_dp_core.c,analogix_dp_reg.c,phy-rockchip-dp.c | |
DP | cdn-dp-core.c,cdn-dp-reg.c | |
Panel | panel-simple.c |
三、设备树
绑定路径如下
//数据传递流程如下:
vop(相当于显示控制器) --> dis/vlds/edp/rgb(相当于encoder) --> panel(相当于显示器)
//分析2代的配置,数据流向
vopb_out_rgb -> rgb_in_vopb -> rgb_out_panel -> panel_in_rgb
//phy
&video_phy {
status = "okay";
};
//vop 配置
&display_subsystem {
status = “okay”;
};
&rgb_in_vopb {
status = “okay”;
};
&rgb_in_vopl {
status = “disabled”;
};
&route_rgb {
connect = <&vopb_out_rgb>;
//这块使能了,相当于使能了vopb_out_rgb输出
status = “okay”;
};
//总结:以上配置相当于配置了vop -> vopb -> vopb_out_rgb
//配置encoder
&rgb {
//1.这块使能相当于使能了encoder
status = “okay”;
ports <span class="token punctuation">{<!-- --></span>
port@<span class="token number">1</span> <span class="token punctuation">{<!-- --></span>
reg <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">1</span><span class="token operator">></span><span class="token punctuation">;</span>
rgb_out_panel<span class="token operator">:</span> endpoint <span class="token punctuation">{<!-- --></span>
<span class="token comment">//2.这块定义了连接的panel,即显示器</span>
remote<span class="token operator">-</span>endpoint <span class="token operator">=</span> <span class="token operator"><</span><span class="token operator">&</span>panel_in_rgb<span class="token operator">></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>
<span class="token punctuation">}</span><span class="token punctuation">;</span>
};
//配置panel,在panel中设置与液晶屏相关内容,例如分辨率、时钟,时序等各参数
panel {
compatible = “simple-panel”;
backlight = <&backlight>;
power-supply = <&vcc_lcd>;
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"><</span><span class="token number">108</span><span class="token operator">></span><span class="token punctuation">;</span>
height<span class="token operator">-</span>mm <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">64</span><span class="token operator">></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"><</span><span class="token operator">&</span>timing0<span class="token operator">></span><span class="token punctuation">;</span>
timing0<span class="token operator">:</span> timing0 <span class="token punctuation">{<!-- --></span>
clock<span class="token operator">-</span>frequency <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">33300000</span><span class="token operator">></span><span class="token punctuation">;</span>
hactive <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">800</span><span class="token operator">></span><span class="token punctuation">;</span>
vactive <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">480</span><span class="token operator">></span><span class="token punctuation">;</span>
hback<span class="token operator">-</span>porch <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">36</span><span class="token operator">></span><span class="token punctuation">;</span>
hfront<span class="token operator">-</span>porch <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">210</span><span class="token operator">></span><span class="token punctuation">;</span>
vback<span class="token operator">-</span>porch <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">13</span><span class="token operator">></span><span class="token punctuation">;</span>
vfront<span class="token operator">-</span>porch <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">22</span><span class="token operator">></span><span class="token punctuation">;</span>
hsync<span class="token operator">-</span>len <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">10</span><span class="token operator">></span><span class="token punctuation">;</span>
vsync<span class="token operator">-</span>len <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">10</span><span class="token operator">></span><span class="token punctuation">;</span>
hsync<span class="token operator">-</span>active <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">0</span><span class="token operator">></span><span class="token punctuation">;</span>
vsync<span class="token operator">-</span>active <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">0</span><span class="token operator">></span><span class="token punctuation">;</span>
de<span class="token operator">-</span>active <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">1</span><span class="token operator">></span><span class="token punctuation">;</span>
pixelclk<span class="token operator">-</span>active <span class="token operator">=</span> <span class="token operator"><</span><span class="token number">1</span><span class="token operator">></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>
port <span class="token punctuation">{<!-- --></span>
panel_in_rgb<span class="token operator">:</span> endpoint <span class="token punctuation">{<!-- --></span>
remote<span class="token operator">-</span>endpoint <span class="token operator">=</span> <span class="token operator"><</span><span class="token operator">&</span>rgb_out_panel<span class="token operator">></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>
};
};
};
}
static struct platform_driver rockchip_rgb_driver = {
.probe = rockchip_rgb_probe,
.remove = rockchip_rgb_remove,
.driver = {
.name = “rockchip-rgb”,
.of_match_table = of_match_ptr(rockchip_rgb_dt_ids),
},
};
//探测函数 添加组件
static int rockchip_rgb_probe(struct platform_device pdev)
{
struct device dev = &pdev->dev;
struct rockchip_rgb *rgb;
int ret;
rgb <span class="token operator">=</span> <span class="token function">devm_kzalloc</span><span class="token punctuation">(</span><span class="token operator">&</span>pdev<span class="token operator">-></span>dev<span class="token punctuation">,</span> <span class="token keyword">sizeof</span><span class="token punctuation">(</span><span class="token operator">*</span>rgb<span class="token punctuation">)</span><span class="token punctuation">,</span> GFP_KERNEL<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>rgb<span class="token punctuation">)</span>
<span class="token keyword">return</span> <span class="token operator">-</span>ENOMEM<span class="token punctuation">;</span>
rgb<span class="token operator">-></span>dev <span class="token operator">=</span> dev<span class="token punctuation">;</span>
rgb<span class="token operator">-></span>funcs <span class="token operator">=</span> <span class="token function">of_device_get_match_data</span><span class="token punctuation">(</span>dev<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">platform_set_drvdata</span><span class="token punctuation">(</span>pdev<span class="token punctuation">,</span> rgb<span class="token punctuation">)</span><span class="token punctuation">;</span>
rgb<span class="token operator">-></span>data_sync <span class="token operator">=</span> <span class="token function">of_property_read_bool</span><span class="token punctuation">(</span>dev<span class="token operator">-></span>of_node<span class="token punctuation">,</span>
<span class="token string">"rockchip,data-sync"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>dev<span class="token operator">-></span>parent <span class="token operator">&&</span> dev<span class="token operator">-></span>parent<span class="token operator">-></span>of_node<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
rgb<span class="token operator">-></span>grf <span class="token operator">=</span> <span class="token function">syscon_node_to_regmap</span><span class="token punctuation">(</span>dev<span class="token operator">-></span>parent<span class="token operator">-></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 function">IS_ERR</span><span class="token punctuation">(</span>rgb<span class="token operator">-></span>grf<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
ret <span class="token operator">=</span> <span class="token function">PTR_ERR</span><span class="token punctuation">(</span>rgb<span class="token operator">-></span>grf<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">dev_err</span><span class="token punctuation">(</span>dev<span class="token punctuation">,</span> <span class="token string">"Unable to get grf: %d\n"</span><span class="token punctuation">,</span> ret<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> ret<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
rgb<span class="token operator">-></span>phy <span class="token operator">=</span> <span class="token function">devm_phy_optional_get</span><span class="token punctuation">(</span>dev<span class="token punctuation">,</span> <span class="token string">"phy"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token function">IS_ERR</span><span class="token punctuation">(</span>rgb<span class="token operator">-></span>phy<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
ret <span class="token operator">=</span> <span class="token function">PTR_ERR</span><span class="token punctuation">(</span>rgb<span class="token operator">-></span>phy<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">dev_err</span><span class="token punctuation">(</span>dev<span class="token punctuation">,</span> <span class="token string">"failed to get phy: %d\n"</span><span class="token punctuation">,</span> ret<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> ret<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token comment">//添加组件</span>
<span class="token keyword">return</span> <span class="token function">component_add</span><span class="token punctuation">(</span>dev<span class="token punctuation">,</span> <span class="token operator">&</span>rockchip_rgb_component_ops<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
static struct platform_driver rockchip_drm_platform_driver = {
.probe = rockchip_drm_platform_probe,
.remove = rockchip_drm_platform_remove,
.shutdown = rockchip_drm_platform_shutdown,
.driver = {
.name = “rockchip-drm”,
.of_match_table = rockchip_drm_dt_ids,
.pm = &rockchip_drm_pm_ops,
},
};
static int rockchip_drm_platform_probe(struct platform_device pdev)
{
struct device dev = &pdev->dev;
struct component_match match = NULL;
struct device_node np = dev->of_node;
struct device_node *port;
int i;
<span class="token function">DRM_INFO</span><span class="token punctuation">(</span><span class="token string">"Rockchip DRM driver version: %s\n"</span><span class="token punctuation">,</span> DRIVER_VERSION<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>np<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 comment">/*
* Bind the crtc ports first, so that
* drm_of_find_possible_crtcs called from encoder .bind callbacks
* works as expected.
*/</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token keyword">struct</span> <span class="token class-name">device_node</span> <span class="token operator">*</span>iommu<span class="token punctuation">;</span>
port <span class="token operator">=</span> <span class="token function">of_parse_phandle</span><span class="token punctuation">(</span>np<span class="token punctuation">,</span> <span class="token string">"ports"</span><span class="token punctuation">,</span> i<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>port<span class="token punctuation">)</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">of_device_is_available</span><span class="token punctuation">(</span>port<span class="token operator">-></span>parent<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">of_node_put</span><span class="token punctuation">(</span>port<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">continue</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
iommu <span class="token operator">=</span> <span class="token function">of_parse_phandle</span><span class="token punctuation">(</span>port<span class="token operator">-></span>parent<span class="token punctuation">,</span> <span class="token string">"iommus"</span><span class="token punctuation">,</span> <span class="token number">0</span><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>iommu <span class="token operator">||</span> <span class="token operator">!</span><span class="token function">of_device_is_available</span><span class="token punctuation">(</span>iommu<span class="token operator">-></span>parent<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">dev_dbg</span><span class="token punctuation">(</span>dev<span class="token punctuation">,</span> <span class="token string">"no iommu attached for %s, using non-iommu buffers\n"</span><span class="token punctuation">,</span>
port<span class="token operator">-></span>parent<span class="token operator">-></span>full_name<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token comment">/*
* if there is a crtc not support iommu, force set all
* crtc use non-iommu buffer.
*/</span>
is_support_iommu <span class="token operator">=</span> false<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">component_match_add</span><span class="token punctuation">(</span>dev<span class="token punctuation">,</span> <span class="token operator">&</span>match<span class="token punctuation">,</span> compare_of<span class="token punctuation">,</span> port<span class="token operator">-></span>parent<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">of_node_put</span><span class="token punctuation">(</span>port<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>i <span class="token operator">==</span> <span class="token number">0</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">dev_err</span><span class="token punctuation">(</span>dev<span class="token punctuation">,</span> <span class="token string">"missing 'ports' property\n"</span><span class="token punctuation">)</span><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 punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>match<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">dev_err</span><span class="token punctuation">(</span>dev<span class="token punctuation">,</span> <span class="token string">"No available vop found for display-subsystem.\n"</span><span class="token punctuation">)</span><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 punctuation">}</span>
<span class="token comment">/*
* For each bound crtc, bind the encoders attached to its
* remote endpoint.
*/</span>
<span class="token keyword">for</span> <span class="token punctuation">(</span>i <span class="token operator">=</span> <span class="token number">0</span><span class="token punctuation">;</span><span class="token punctuation">;</span> i<span class="token operator">++</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
port <span class="token operator">=</span> <span class="token function">of_parse_phandle</span><span class="token punctuation">(</span>np<span class="token punctuation">,</span> <span class="token string">"ports"</span><span class="token punctuation">,</span> i<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>port<span class="token punctuation">)</span>
<span class="token keyword">break</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span><span class="token function">of_device_is_available</span><span class="token punctuation">(</span>port<span class="token operator">-></span>parent<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">of_node_put</span><span class="token punctuation">(</span>port<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">continue</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token function">rockchip_add_endpoints</span><span class="token punctuation">(</span>dev<span class="token punctuation">,</span> <span class="token operator">&</span>match<span class="token punctuation">,</span> port<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">of_node_put</span><span class="token punctuation">(</span>port<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
port <span class="token operator">=</span> <span class="token function">of_parse_phandle</span><span class="token punctuation">(</span>np<span class="token punctuation">,</span> <span class="token string">"backlight"</span><span class="token punctuation">,</span> <span class="token number">0</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>port <span class="token operator">&&</span> <span class="token function">of_device_is_available</span><span class="token punctuation">(</span>port<span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
<span class="token function">component_match_add</span><span class="token punctuation">(</span>dev<span class="token punctuation">,</span> <span class="token operator">&</span>match<span class="token punctuation">,</span> compare_of<span class="token punctuation">,</span> port<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token function">of_node_put</span><span class="token punctuation">(</span>port<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">return</span> <span class="token function">component_master_add_with_match</span><span class="token punctuation">(</span>dev<span class="token punctuation">,</span> <span class="token operator">&</span>rockchip_drm_ops<span class="token punctuation">,</span> match<span class="token punctuation">)</span><span class="token punctuation">;</span>
}
其实 也就是这张图