高通LCD kernel层代码跟踪分析

LCD相关code所在目录:
        kernel/drvier/video/msm/mdss/ 
软件驱动主要分为三部分:
        MDP 驱动
        DSI 控制器驱动
        FrameBuffer驱动
执行probe 的先后顺序:
       MDP probe →  DSI probe → FB probe

1.MDP probe:对使用的硬件资源进行初始化,同时在fb设备中注册mdp的使用接口

mdss_mdp.c
(rc = mdss_fb_register_mdp_instance(&mdp5);)
接口定义如下:
struct msm_mdp_interface mdp5 = {
.init_fnc = mdss_mdp_overlay_init,
.fb_mem_get_iommu_domain = mdss_fb_mem_get_iommu_domain,
.fb_stride = mdss_mdp_fb_stride,
.check_dsi_status = mdss_check_dsi_ctrl_status,
.get_format_params = mdss_mdp_get_format_params,
};
2.DSI probe:解析模组厂提供的panel的dtsi文件,从文件中获得panel的mode,分辨率,帧率,command数据等。Mdss_dsi_panel.c
3.FB probe:从DSI的数据结构中获取到panel的相关信息,多MDP进行初始化。mdss_fb.c
------------------------------------------------------------------------------------------------------

Dtsi文件里面的参数调用都在 drivers/video/msm/mdss/Mdss_dsi_panel.c 。只是分别在不同的函数里面。主要有:
int mdss_dsi_panel_init
int mdss_panel_parse_dt
int mdss_dsi_panel_timing_from_dt
int mdss_dsi_parse_dcs_cmds
int mdss_panel_parse_bl_settings
 
然后分别跟踪每个函数:

然后分析每个函数里的一些主要函数:
 

static int mdss_panel_parse_dt(struct device_node *np,struct mdss_dsi_ctrl_pdata *ctrl_pdata)的作用:主要是解析设备树,调用参数。将获取到的值保存在mdss_panel_info结构体内。
 


 
 

  转载自  https://blog.csdn.net/u012452964/article/details/74836640

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高通 kernel 代码中,可以使用 `sysfs` 接口或 `procfs` 接口添加 `setprop` 属性。 `setprop` 属性是 `init` 进程用来设置系统属性值的一种方式,可以通过 `getprop` 命令来获取这些属性值。 下面是使用 `sysfs` 接口添加 `setprop` 属性的示例代码: 1. 在设备树中添加属性节点,例如: ``` my_device { compatible = "my_device"; my_prop { my_prop_value = <0>; }; }; ``` 2. 在驱动程序中,使用 `sysfs_create_group()` 函数创建一个属性组,并在属性组中添加自定义属性,在 `store` 函数中设置属性值,例如: ```c static ssize_t my_prop_value_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { unsigned long value; if (kstrtoul(buf, 10, &value)) return -EINVAL; pr_info("Setting my_prop_value to %lu\n", value); // Set the property value using set_property() function set_property("my_prop_value", value); return count; } static DEVICE_ATTR(my_prop_value, 0664, NULL, my_prop_value_store); static struct attribute *my_device_attrs[] = { &dev_attr_my_prop_value.attr, NULL }; static struct attribute_group my_device_attr_group = { .attrs = my_device_attrs, }; static const struct attribute_group *my_device_attr_groups[] = { &my_device_attr_group, NULL }; static int my_device_probe(struct platform_device *pdev) { struct device_node *np = pdev->dev.of_node; struct device *dev = &pdev->dev; int ret; // create sysfs nodes ret = sysfs_create_groups(&dev->kobj, my_device_attr_groups); if (ret) return ret; return 0; } static int my_device_remove(struct platform_device *pdev) { struct device *dev = &pdev->dev; // remove sysfs nodes sysfs_remove_groups(&dev->kobj, my_device_attr_groups); return 0; } static struct of_device_id my_device_match_table[] = { { .compatible = "my_device", }, {}, }; MODULE_DEVICE_TABLE(of, my_device_match_table); static struct platform_driver my_device_driver = { .driver = { .name = "my_device", .owner = THIS_MODULE, .of_match_table = my_device_match_table, }, .probe = my_device_probe, .remove = my_device_remove, }; module_platform_driver(my_device_driver); ``` 这样,当用户写入 `my_prop_value` 属性时,`store` 函数会被调用,并且传递给 `store` 函数的 `buf` 参数是用户写入的属性值,然后 `set_property()` 函数会被调用来设置 `setprop` 属性。 需要注意的是,`setprop` 属性是 `init` 进程使用的,所以必须在系统启动时设置这些属性。如果在驱动程序中设置 `setprop` 属性,只有当驱动程序加载时属性才会被设置,而无法在系统启动后动态设置属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值