2.1 px30驱动移植-DRM驱动框架简介

文章目录

写在前面

主要是介绍一下rk平台px30 移植LCD屏的工作心得

一、DRM基础

在这里插入图片描述

二、DRM相关目录结构

driverfiledoc
Corerockchip_drm_drv.c
Framebufferrockchip_drm_fb.c
GEMrockchip_drm_gem.c
VOProckchip_drm_vop.c ,rockchip_vop_reg.c
LVDSrockchip_lvds.c
RGBrockchip_rgb.c
MIPIdw_mipi_dsi.c,phy_rockchip-inno-mipi-dphy.c
HDMIdw_hdmi-rockchip.c,dw-hdmi.c
INNO HDMIinno_hdmi.c
eDpanalogix_dp-rockchip.c,analogix_dp_core.c,analogix_dp_reg.c,phy-rockchip-dp.c
DPcdn-dp-core.c,cdn-dp-reg.c
Panelpanel-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">&lt;</span><span class="token number">1</span><span class="token operator">&gt;</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">&lt;</span><span class="token operator">&amp;</span>panel_in_rgb<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>
   <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">&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>
                       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>

      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">&lt;</span><span class="token operator">&amp;</span>rgb_out_panel<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>

};
};

四、component

在DRM、ALSA等子系统中,通过超级设备(superdevice)管理多个组件(component)加载顺序,保证所有组件都可正常使用,在drm驱动中,component设备用来表示vop和各显示接口(如:HDMI、MIPI等)

在设备树中定义了如下的显示子系统

&display_subsystem {
	status = "disabled";
	ports = <&vopb_out>, <&vopl_out>;
	logo-memory-region = <&drm_logo>;
	route {
		route_lvds: route-lvds {
			status = "disabled";
			logo,uboot = "logo.bmp";
			logo,kernel = "logo_kernel.bmp";
			logo,mode = "center";
			charge_logo,mode = "center";
			connect = <&vopb_out_lvds>;
		};
	route_dsi<span class="token operator">:</span> route<span class="token operator">-</span>dsi <span class="token punctuation">{<!-- --></span>
		status <span class="token operator">=</span> <span class="token string">"disabled"</span><span class="token punctuation">;</span>
		logo<span class="token punctuation">,</span>uboot <span class="token operator">=</span> <span class="token string">"logo.bmp"</span><span class="token punctuation">;</span>
		logo<span class="token punctuation">,</span>kernel <span class="token operator">=</span> <span class="token string">"logo_kernel.bmp"</span><span class="token punctuation">;</span>
		logo<span class="token punctuation">,</span>mode <span class="token operator">=</span> <span class="token string">"center"</span><span class="token punctuation">;</span>
		charge_logo<span class="token punctuation">,</span>mode <span class="token operator">=</span> <span class="token string">"center"</span><span class="token punctuation">;</span>
		connect <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token operator">&amp;</span>vopb_out_dsi<span class="token operator">&gt;</span><span class="token punctuation">;</span>
	<span class="token punctuation">}</span><span class="token punctuation">;</span>

	route_rgb<span class="token operator">:</span> route<span class="token operator">-</span>rgb <span class="token punctuation">{<!-- --></span>
		status <span class="token operator">=</span> <span class="token string">"disabled"</span><span class="token punctuation">;</span>
		logo<span class="token punctuation">,</span>uboot <span class="token operator">=</span> <span class="token string">"logo.bmp"</span><span class="token punctuation">;</span>
		logo<span class="token punctuation">,</span>kernel <span class="token operator">=</span> <span class="token string">"logo_kernel.bmp"</span><span class="token punctuation">;</span>
		logo<span class="token punctuation">,</span>mode <span class="token operator">=</span> <span class="token string">"center"</span><span class="token punctuation">;</span>
		charge_logo<span class="token punctuation">,</span>mode <span class="token operator">=</span> <span class="token string">"center"</span><span class="token punctuation">;</span>
		connect <span class="token operator">=</span> <span class="token operator">&lt;</span><span class="token operator">&amp;</span>vopb_out_rgb<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>

};

其中添加vop组件

struct platform_driver vop_platform_driver = {
    .probe = vop_probe,
    .remove = vop_remove,
    .driver = {
        .name = "rockchip-vop",
        .owner = THIS_MODULE,
        .of_match_table = of_match_ptr(vop_driver_dt_match),
    },
};
//探测函数 添加组件
static int vop_probe(struct platform_device *pdev)
{
    struct device *dev = &pdev->dev;
<span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>dev<span class="token operator">-&gt;</span>of_node<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">"can't find vop devices\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">//添加组件</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">&amp;</span>vop_component_ops<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

添加rgb组件

static const struct of_device_id rockchip_rgb_dt_ids[] = {
    { .compatible = "rockchip,px30-rgb", .data = &px30_rgb_funcs },
    { .compatible = "rockchip,rk1808-rgb", .data = &rk1808_rgb_funcs },
    { .compatible = "rockchip,rk3066-rgb", },
    { .compatible = "rockchip,rk3128-rgb", },
    { .compatible = "rockchip,rk3288-rgb", .data = &rk3288_rgb_funcs },
    { .compatible = "rockchip,rk3308-rgb", },
    { .compatible = "rockchip,rk3368-rgb", },
    { .compatible = "rockchip,rv1108-rgb", },
    {}
};
MODULE_DEVICE_TABLE(of, rockchip_rgb_dt_ids);

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">&amp;</span>pdev<span class="token operator">-&gt;</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">-&gt;</span>dev <span class="token operator">=</span> dev<span class="token punctuation">;</span>
rgb<span class="token operator">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</span>parent <span class="token operator">&amp;&amp;</span> dev<span class="token operator">-&gt;</span>parent<span class="token operator">-&gt;</span>of_node<span class="token punctuation">)</span> <span class="token punctuation">{<!-- --></span>
    rgb<span class="token operator">-&gt;</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">-&gt;</span>parent<span class="token operator">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</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">&amp;</span>rockchip_rgb_component_ops<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

其实核心函数为

static const struct of_device_id rockchip_drm_dt_ids[] = {
    { .compatible = "rockchip,display-subsystem", },
    { /* sentinel */ },
};
MODULE_DEVICE_TABLE(of, rockchip_drm_dt_ids);

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">-&gt;</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">-&gt;</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">-&gt;</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">-&gt;</span>parent<span class="token operator">-&gt;</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">&amp;</span>match<span class="token punctuation">,</span> compare_of<span class="token punctuation">,</span> port<span class="token operator">-&gt;</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">-&gt;</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">&amp;</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">&amp;&amp;</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">&amp;</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">&amp;</span>rockchip_drm_ops<span class="token punctuation">,</span> match<span class="token punctuation">)</span><span class="token punctuation">;</span>

}

component_master_add_with_match的函数调用栈为

rockchip_drm_platform_probe
  component_master_add_with_match
    try_to_bring_up_master
      find_components
      /* Found all components */
      rockchip_drm_bind //ret = master->ops->bind(master->dev);
        component_bind_all
          component->ops->bind //循环bind了所有组件

其实 也就是这张图
在这里插入图片描述

Linux DRM(Direct Rendering Manager)提供了一个通用的框架,用于开发LCD驱动程序。下面是Linux DRM LCD驱动框架的一般概述: 1. DRM核心框架Linux内核中的DRM核心框架提供了与图形和显示相关的基本功能,如模式设置、缓冲管理和DMA传输等。它还提供了与用户空间交互的接口,允许应用程序通过DRM设备节点与LCD驱动程序通信。 2. CRTC(Cathode Ray Tube Controller):CRTC是DRM框架中的一个重要组件,负责控制LCD的时序和显示参数。在LCD驱动程序中,您可以通过配置CRTC来设置分辨率、刷新率和时序参数等。 3. Encoder和Connector:Encoder和Connector是DRM框架中用于连接CRTC和显示设备(如LCD)的中间组件。Encoder负责将CRTC中的图像数据编码为特定格式,并将其发送到Connector上。Connector则负责与显示设备进行物理连接,并将编码后的图像数据传输到显示设备。 4. Plane:Plane是DRM框架中用于管理图像平面(如主显示平面、叠加平面等)的组件。它允许您在LCD上叠加多个图像或进行其他图像处理操作。 5. Framebuffer和Gem:Framebuffer是DRM框架中用于管理显存的组件,用于存储和管理显示数据。Gem(Graphics Execution Manager)是DRM框架中的内存管理器,用于分配和管理显存。您可以通过Framebuffer和Gem来设置和操作LCD的显示数据。 6. KMS(Kernel Mode Setting):KMS是DRM框架中的一项功能,它允许用户空间应用程序通过DRM接口来设置和管理显示模式。通过KMS,应用程序可以动态地更改分辨率、刷新率和旋转等显示参数。 以上是Linux DRM LCD驱动框架的一般概述。在编写LCD驱动程序时,您需要理解DRM框架的相关概念和组件,并根据LCD设备的特性和规格来配置和操作这些组件。具体的实现细节可能因您使用的硬件平台和LCD控制器而有所不同。建议您参考Linux内核文档、示例代码和相关社区资源,以获取更具体和针对性的指导。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值